o
    *j'                     @   s  d Z ddlZddlZddlZddlmZmZmZ ddlZ	ddl
mZ dZi dg dg dg d	g d
g dgdg dg dgdg dg dgdg dgdg dg d	g dgdg dg d	g dgdg dg dg dgdg dg dgdg dg dgdg dg d	g dg dgdg dg d g d!gd"g dg dgd#g dg d	gd$g d%gd&g d'gg dg dgg dg dgg dgd(Zg d)g d*g d+g d+g d,g d-g d-g d)g d+g d+g d+g d*g d-g d+g d+g d,g d,g d+g d+g d,gZg d)g d)g d)g d.g d)g d)g d/g d)g d)g d)g d)g d)g d)g d.g d)g d)g d)g d)g d.g d)g d)gZi dg d0g d1g d2g d3g d4gdg d5g d1g d6g d7g d8g d9g d:g d;g d<g d=g d>gdg d?g d1g d2g d@g dAg dBg dCg dDgdg dEg d1g dFg dGg dHg dIg dJg dKgdg dLg d1g dMg dNg dOg dPgdg dQg d1g dRg dSg dHg dTg dUg dVg dWg	dg dXg d1g d2g dYg d8g dZg d[g d\g d]g	dg d^g d1g d_g dHgdg d`g d1g dag dbg dcg ddg deg dfg dgg dhg
dg dig d1g djg dkg dlg dmg dng dogdg dpg d1g d6g dqg drg dsg dtg dugdg dvg d1g dRg dwg dHg dxg dyg dzg d{g	dg d|g d1g dag d}g dOg d~g dg dgd"g dg d1g dg dg dHg dg dg dg dg dg dgd#g dg d1g dg dg dg dg dgd$g dg d1g d6g dg dHg dgd&g dg d1g dg dg d8g dg dgg dg d1g dg dg d4g dg dg dg dg dg dg dg dg dgg dg d1g dg dg dlg dg dg dg dg dg dg dgg dg d1g djg dg dlg dg dgd(Zi dg ddg ddg ddg ddg ddg ddg ddg ddg ddg ddg ddg ddg dd"g dd#g dd$g dd&g d¢g dâg dĢg dŢd(Zddiddiddd̜ddd̜d͜ZdddddҜZedg dԢZedg d֢Zejdd׍ddل ZddgZddgZddgZddgZg dZdd eeD Ze eZ!i dg ddg ddg ddg ddg ddg ddg ddg ddg ddg ddg ddg ddg dd"g dd#g dd$g dd&g dg dg dg dg ddZ"g dZ#dd ee#D Z$e e#Z%e%Z&e#dg Z'dd ee'D Z(	d^d e)dee)e*f de+de	j,fddZ-i ddddddd	dd
ddddddddddddddddddd"dd#dd$dd&ddddZ.dd e./ D Z0dZ1dd e#D e1g Z2dd ee2D Z3i ddd d!d
d"d	d!dd#dd$dd%dd&dd'd(d)dd*dd+dd,dd-d.d)dd/dd0d1d2d3d"d4d5d)d6d#d7d8
Z4i ddd"d
d!d	d#dd$dd%dd&dd'dd*dd+dd,dd-dd/dd0dd1dd2dd3dd9d:d;dd<d=Z5e#dd<g Z6e7d>d? e8e e6D Z9de	j,fd@dAZ:e: Z;dBe*de	j,fdCdDZ<e<d"Z=e<d!Z>dEd e#D Z?edFdG e?e)dHZ?e	@dId e?D Z?eAeBZCe/ D ]$\ZDZEeeED ]\ZFZGeeGD ]\ZHZIeCeDeIf JeFeHf qqqeKeCZCdJdK ZLe	jMd7dLge	jNdMZOe	jMd7dLge	jPdMZQe	jMg dNe	jPdMZRe	jMd7d1ge	jNdMZSe	jMd7d1ge	jPdMZTe	jMg dOe	jPdMZUe	jMg dPe	jPdMZVdQdR ZWeW  	S	2d_dTdUZXdVdW ZYeY \ZZZ[ZTdXdY Z\e\ Z]dZd[ Z^e^ Z_d\d] Z`e` ZadS (`  zConstants used in AlphaFold.    N)ListMappingTuple)tree_mapgj@ZALAZARG)NCACBCG)r   r   r	   CD)r   r	   r
   NE)r	   r
   r   CZZASN)r   r   r	   OD1ASPZCYS)r   r   r   SGZGLN)r   r	   r
   OE1GLUZGLYZHIS)r   r   r	   ND1ZILE)r   r   r   CG1)r   r   r   CD1ZLEU)r   r   r	   r   ZLYS)r   r	   r
   CE)r	   r
   r   NZZMET)r   r   r	   SD)r   r	   r   r   PHEZPROZSER)r   r   r   OGZTHR)r   r   r   OG1)TRPTYRVAL)        r   r   r   )      ?r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   )+?r   )r   r   )r   r   r   )Cr   )"~j?       r$   )r   r   )!rhS㥛gHzG)O   )Mb?ˡE?r   )r   r   )S㥛n?r$   )r"   r   )ffffff?r$   r$   )r   r   )r+   L7A`gMbX)r'   r(   )x&1?r*   r   )r	      )gʡE?=
ףp=?r$   )r
      )g?5^I?g9v?r   )r      )gsh|??ʡE?r$   )NH1   )g|?5^?g rh@r   )NH2r6   )g9v @gK?r$   )r   r6   )gK7A?grh|?r$   )r   r   )x&r4   r   )r   r   )gˡEgv/g333333)r'   r(   )      ?r*   r   )r	   r0   )g㥛 ?Mb?r   )ND2r2   )`"?g5^IgMbP?)r   r2   )gK7A?gl?r   )r   r   )r    r,   r$   )r"   r   );On?r   r$   )r   r   )Er.   S)r'   r(   )r/   r*   r$   )r	   r0   )r<   g|?5^?r$   )r   r2   )gQ?~jt?r   )OD2r2   )gl?gV-~jth)r   r   )NbX9r,   r$   )r"   r   )Mb?r   r   )r   r   )gS㥛#~j1Zd)r'   r(   )r9   r*   r$   )r   r0   )gK?g r?r   )r   r   )r>   -?r$   )r"   r   )r#   r   r   )r   r   )r    g!rhZd;O)r	   r0   )Gz?g}?5^I?r   )r
   r2   )gbX9?r:   r$   )NE2r3   )r<   g/$MbP)r   r3   )g}?5^I?g(\?r   )r   r   )gL7A`rG   r   )r   r   )r>   gˡErH   )r	   r0   )rI   gʡE?r   )r
   r2   )333333?g'1Z?r   )r   r3   )Cl?gQ?r$   )OE2r3   )g+?gDlrK   )r   r   )gMg1Zd?r   )r"   r   )gʡE?r$   r$   )r   r   )gw/(\?r   )r"   r   )r-   r   r   )r   r   )r    r.   r?   )r'   r(   )r9   5^I?r   )r	   r0   )rL   Q?r$   )CD2r2   )g r?gtVg~jth?)r   r2   )g+?g(\?r$   )CE1r2   )g=
ףp= @gZd;?gMb`?)rJ   r2   )g)\(@gmݿgMbp?)r   r   )gZd;O߿+?r$   )r"   r   )r=   r$   r$   )r   r   )r8   K7A` rh)r'   r(   )r)   r*   r$   )r   r0   )gJ+?gˡE?r$   )CG2r0   )HzG?gQgv/)r   r2   )+?K7A?r   )r   r   )gp=
ףr!   r   )r   r   )rC   rE   gCl)r'   r(   )r9   rP   r$   )r	   r0   )gV-?gV-?r   )r   r2   )g(\?gzG?r$   )rR   r2   )gQ?r&   333333?)r   r   )r>   r,   r$   )r   r   )r+   r.   r?   )r	   r0   )rY   r1   r   )r
   r2   )gS?gy&1?r   )r   r3   )gQ?g-?r   )r   r6   )g|?5^?gx&1?r   )r   r   )y&1m?r$   )r   r   )#~jEg\(\)r	   r0   )gV-?rZ   r$   )r   r2   )g"~?gQ?r   )r   r3   )g{Gz?g~jt?r$   )r   r   )~jtr!   r   )r"   r   )rD   r   r$   )r   r   )r    r_   rF   )r	   r0   )rM   gx&1?r   )r   r2   )g㥛 ?Q?r$   )rR   r2   )gd;O?gA`"r   )rS   r2   )g7A` @g^I+?r$   )CE2r2   )gbX9 @K7r$   )r   r2   )g'1Z@rB   rK   )r   r   )g&1gV-?r$   )r"   r   )r=   r$   r   )r   r   )gFxgZd;Og㥛 )r'   r(   )gZd;?guV?r   )r	   r0   )g r?gQ?r   )r
   r2   )gI+?gbX9?r   )r   r   )r%   rO   r$   )r   r   )r`   gw/gK7A`)r   r0   )gjt?g333333?r   )r   r   )g%Cr]   r   )r"   r   )r#   r   r$   )r   r   )gPnrU   gq=
ףp)rW   r0   )g?g`"gS)r   r0   )gh|?5?gS?r   )r   r   )r\   r!   r   )r"   r   )r-   r$   r   )r   r   )r^   r_   rF   )r	   r0   )grh|?rQ   r$   )r   r2   )g|?5^?r@   r   )rR   r2   )gS?g|?5^{Gzt)rb   r2   )grh|@gV-y&1|)CE3r2   )gCl?g=
ףp=re   )NE1r2   )gQ@gGz?gMbp)CH2r2   )gMbX9@gQg9v)CZ2r2   )g$C
@g㥛 I+)CZ3r2   )gq=
ףp?g&1rj   )r   r   )rC   r,   r   )r"   r   )rD   r$   r$   )r   r   )rC   r_   rV   )r	   r0   )rM   g&1?r$   )r   r2   )gx?ra   r$   )rR   r2   )g7A`?gvrK   )rS   r2   )gB`" @r[   Mb`)rb   r2   )gE @rc   rB   )OHr2   )gy&1@rl   rd   )r   r2   )gS@rK   rB   )r   r   )gV-߿rT   r$   )r   r   )guVgq=
ףprV   )r   r0   )rX   gw/?r$   )rW   r0   )guV?r_   gsh|??)r"   r   r   r   r'   )r"   r   r   r	   r
   r   r   r   r'   r5   r7   )r"   r   r   r	   r   r'   r   rA   )r"   r   r   r	   r   r;   r'   r   )r"   r   r   r   r'   r   )	r"   r   r   r	   r
   r   r'   r   rN   )	r"   r   r   r	   r
   r   rJ   r'   r   )r"   r   r   r'   )
r"   r   r   r	   rR   rS   r   r   rJ   r'   )r"   r   r   r   rW   r   r   r'   )r"   r   r   r	   r   rR   r   r'   )	r"   r   r   r	   r
   r   r   r   r'   )r"   r   r   r	   r   r   r'   r   )r"   r   r   r	   r   rR   rS   rb   r   r   r'   )r"   r   r   r	   r
   r   r'   )r"   r   r   r   r'   r   )r"   r   r   rW   r   r'   r   )r"   r   r   r	   r   rR   rb   rf   ri   rk   rh   r   rg   r'   )r"   r   r   r	   r   rR   rS   rb   r   r   r'   rm   )r"   r   r   r   rW   r   r'   r   rA   r   rN   rR   rb   )r   rS   )r   r   r   r   g333333?g?gRQ?g?)r"   r   r'   SBond)
atom1_name
atom2_namelengthstddev	BondAngle)rp   rq   	atom3name	angle_radrs   )maxsizec               
   C   s  t jt jt jtd} t| ddd}| }W d   n1 s%w   Y  t|	 }i }t
| |D ]1}| dkrB n(| \}}}}	|d\}
}||vrYg ||< || t|
|t|t|	 q8g |d< i }t
| t
| |D ]=}| dkr n4| \}}}}|d\}
}}||vrg ||< || t|
||t|d tj t|d tj  qzg |d< d	d
 }i }| D ]\}}i }|| D ]}||||j|j< qg ||< |D ]}|||j|j }|||j|j }|j}t|jd |jd  d|j |j t|  }d| }d|j |j t| | }d|j d|j t|  | }d|j d|j t|  | }t||j d ||j d  ||j d  }	|| t|j|j||	 qq|||fS )a  Load stereo_chemical_props.txt into a nice structure.

    Load literature values for bond lengths and bond angles and translate
    bond angles into the length of the opposite edge of the triangle
    ("residue_virtual_bonds").

    Returns:
        residue_bonds: Dict that maps resname -> list of Bond tuples.
        residue_virtual_bonds: Dict that maps resname -> list of Bond tuples.
        residue_bond_angles: Dict that maps resname -> list of BondAngle tuples.
    zstereo_chemical_props.txtrtzutf-8)encodingN-UNKg     f@c                 S   s   d t| |gS )zUnique key to lookup bonds.rz   )joinsorted)rp   rq    r~   y/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/science/unifold/data/residue_constants.pymake_bond_key  s   z1load_stereo_chemical_props.<locals>.make_bond_key   g      ?)ospathr|   dirnameabspath__file__openreaditer
splitlinesnextstripsplitappendro   floatrt   nppiitemsrp   rq   ru   rv   sqrtrr   cossinrs   )Zstereo_chemical_props_pathfZstereo_chemical_propsZ
lines_iterresidue_bondslineZbondresnamerr   rs   Zatom1Zatom2Zresidue_bond_anglesZangle_degreeZstddev_degreeZatom3r   residue_virtual_bondsZbond_anglesZ
bond_cachebbaZbond1Zbond2gammaZdl_outerZ	dl_dgammaZdl_db1Zdl_db2r~   r~   r   load_stereo_chemical_props  s   

r   g$C?g~jt?gy&1?gMb?gJ{/LgPs?g-ܿgU؟?)%r   r   r"   r   r'   r	   r   rW   r   r   r   r
   r   rR   r   r;   r   rA   r   r   rS   rb   rf   r   rg   rJ   r   rN   rh   r5   r7   rm   r   ri   rk   r   ZOXTc                 C      i | ]\}}||qS r~   r~   ).0i	atom_typer~   r~   r   
<dictcomp>=      r   )r   r   r"   r'   r    r   r   r   r   r   r   r   r   )r   r   r"   r'   r   r	   r
   r   r   r5   r7   r   r   r   )r   r   r"   r'   r   r	   r   r;   r   r   r   r   r   r   )r   r   r"   r'   r   r	   r   rA   r   r   r   r   r   r   )r   r   r"   r'   r   r   r   r   r   r   r   r   r   r   )r   r   r"   r'   r   r	   r
   r   rJ   r   r   r   r   r   )r   r   r"   r'   r   r	   r
   r   rN   r   r   r   r   r   )r   r   r"   r'   r   r   r   r   r   r   r   r   r   r   )r   r   r"   r'   r   r	   r   rR   rS   rJ   r   r   r   r   )r   r   r"   r'   r   r   rW   r   r   r   r   r   r   r   )r   r   r"   r'   r   r	   r   rR   r   r   r   r   r   r   )r   r   r"   r'   r   r	   r
   r   r   r   r   r   r   r   )r   r   r"   r'   r   r	   r   r   r   r   r   r   r   r   )r   r   r"   r'   r   r	   r   rR   rS   rb   r   r   r   r   )r   r   r"   r'   r   r	   r
   r   r   r   r   r   r   r   )r   r   r"   r'   r   r   r   r   r   r   r   r   r   r   )r   r   r"   r'   r   r   rW   r   r   r   r   r   r   r   )r   r   r"   r'   r   r	   r   rR   rg   rb   rf   ri   rk   rh   )r   r   r"   r'   r   r	   r   rR   rS   rb   r   rm   r   r   )r   r   r"   r'   r   r   rW   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r{   )ARr   Dr"   QEGHILKMFPrn   TWYVc                 C   r   r~   r~   r   r   restyper~   r~   r   r     r   Xc                 C   r   r~   r~   r   r~   r~   r   r     s    Fsequencemappingmap_unknown_to_xreturnc                 C   s   t | d }tt| tt|kr tdt|  tjt	| |ftj
d}t| D ](\}}|rN| rG| rG|||d }ntd| || }d|||f< q0|S )a  Maps the given sequence into a one-hot encoded matrix.

    Args:
        sequence: An amino acid sequence.
        mapping: A dictionary mapping amino acids to integers.
        map_unknown_to_x: If True, any amino acid that is not in the mapping will be
            mapped to the unknown amino acid 'X'. If the mapping doesn't contain
            amino acid 'X', an error will be thrown. If False, any amino acid not in
            the mapping will throw an error.

    Returns:
        A numpy array of shape (seq_len, num_unique_aas) with one-hot encoding of
        the sequence.

    Raises:
        ValueError: If the mapping doesn't contain values from 0 to
            num_unique_aas - 1 without any gaps.
       zQThe mapping must have values from 0 to num_unique_aas-1 without any gaps. Got: %sZdtyper   z#Invalid character in the sequence: )maxvaluesr}   setlistrange
ValueErrorr   zeroslenint32	enumerateisalphaisupperget)r   r   r   Znum_entriesZone_hot_arrZaa_indexZaa_typeZaa_idr~   r~   r   sequence_to_onehot  s$   
r   r   r   r   r   r"   r   r   r   r   r   r   r   r   r   r   rn   r   r   r   r   )r   r   r   c                 C   r   r~   r~   )r   kvr~   r~   r   r     r   r{   c                 C      g | ]}t | qS r~   restype_1to3r   rr~   r~   r   
<listcomp>!      r   c                 C   r   r~   r~   )r   r   r   r~   r~   r   r   "  r   Br   r   r(   r0   r2   r3   r6   J      	   
      r'                              )
r   rn   r   Ur   r   r   r   Zrz   r   r   r   rz   )r   r   r   r   r   c                 c   s    | ]
}t t| V  qd S N)restypes_with_x_and_gapindexID_TO_HHBLITS_AA)r   r   r~   r~   r   	<genexpr>d  s
    
r   c                  C   s\   t jtd tgt jd} ttD ]\}}t| }t| }|D ]}t	| }d| ||f< qq| S )z3Returns [num_res_types, num_atom_types] mask array.r   r   )
r   r   restype_numatom_type_numr   r   restypesr   residue_atoms
atom_order)maskr   restype_letterZrestype_name
atom_namesZ	atom_namer   r~   r~   r   _make_standard_atom_maski  s   r   
atom_indexc           	         s   i }g }t  D ]\}} fdd|D }|dgdt|   |||< qtD ]}t| }tt||  }|	| q(|	t
dtg tj|dd}t|g d}|S )z:Define chi-angle rigid groups via one-hot representations.c                    s   g | ]	}t |  qS r~   )
atom_typesr   )r   sr   r~   r   r     s    z"chi_angle_atom.<locals>.<listcomp>r0   r   Zaxis)r   r   r   )chi_angles_atomsr   extendr   r   r   r   eyer   r   r   stack	transpose)	r   Zchi_angles_indexZone_hotsr   r   indicesr   Zres3Zone_hotr~   r   r   chi_angle_atom{  s   
r  c                 C   s   g | ]}t t|  qS r~   )r   r   r   r~   r~   r   r         c                 C   s   t |  S r   r   )nr~   r~   r   <lambda>  s    r  )Z	leaf_typec                 C   s&   g | ]}|g d gdt |   qS )r   r   r   r   r0   )r   )r   Z	chi_atomsr~   r~   r   r     s    c                 C   sr   | t j|  }|t |||  }|t j| }t ||}t ||||g }t j|g dggdd}|S )zBCreate a rigid 4x4 transformation matrix from two axes and transl.)r   r   r   r   r   r   )r   ZlinalgZnormdotcrossr   r  Zconcatenate)exeytranslationZex_normalizedZey_normalizedZeznormmr~   r~   r   _make_rigid_transformation_4x4  s   
r  %   r   )r   r  r(   )r   r   r(   )r   r   r0   r0   c               	      s\  t tD ]G\} }t| }t| D ]:\}}}t| }|t| |f< dt| |f< |t| |ddf< t| 	|}|t
| |f< dt| |f< |t| |ddf< qqt tD ]\} }t| }dd t| D  tdt| dddddf< tdt| dddddf< t d  d  tg d	 d d
}|t| dddddf< t d  d   d  d   d d
}|t| dddddf< t|  d rt| d }	 fdd|	D }
t|
d |
d  |
d |
d  |
d d
}|t| dddddf< tddD ]/}t|  | r*t| | d } | }t|tg d|d
}|t| d| ddddf< qqPdS )zFill the arrays above.r   Nc                 S   s   i | ]\}}}|t |qS r~   )r   array)r   name_posr~   r~   r   r     s    
z/_make_rigid_group_constants.<locals>.<dictcomp>r0   r   r   r   )r   r   r   )r  r  r  r   r"   r(   c                       g | ]} | qS r~   r~   r   r  Zatom_positionsr~   r   r     s    z/_make_rigid_group_constants.<locals>.<listcomp>)g      r   r   )r   r   r   rigid_group_atom_positionsr   restype_atom37_to_rigid_grouprestype_atom37_mask$restype_atom37_rigid_group_positionsrestype_name_to_atom14_namesr   restype_atom14_to_rigid_grouprestype_atom14_mask$restype_atom14_rigid_group_positionsr   r   !restype_rigid_group_default_framer  r  chi_angles_maskr   r   )r   r   r   ZatomnameZ	group_idxZatom_positionZatomtypeZ	atom14idxZmatZbase_atom_namesZbase_atom_positionsZchi_idxZaxis_end_atom_nameZaxis_end_atom_positionr~   r  r   _make_rigid_group_constants  s   
r"        ?c                 C   s  t g dt j}t g dt j}t g dt j}t \}}}ttD ]\}}	t|	 }
t|
 }t|D ]G\}}|s<q5t|d  }t|D ]5\}}|rP||krQqFt|d  }|| |  }d}|||||f< |||||f< |||||f< |||||f< qFq5||
 ||
  D ]J}|	|j
}|	|j}|j||j  }|j||j  }|||||f< |||||f< |||||f< |||||f< |j||||f< |j||||f< qq%|||dS )z>compute upper and lower bounds for bonds to assess violations.)r   r   r   r   g    _B)lower_boundupper_boundrs   )r   r   float32r   r   r   r   r  van_der_waals_radiusr   rp   rq   rr   rs   )Zoverlap_toleranceZbond_length_tolerance_factorZrestype_atom14_bond_lower_boundZrestype_atom14_bond_upper_boundZrestype_atom14_bond_stddevr   r   r  r   r   r   Z	atom_listZ	atom1_idxrp   Zatom1_radiusZ	atom2_idxrq   Zatom2_radiuslowerupperr   r~   r~   r   make_atom14_dists_bounds  s   r*  c                     s   g } g }g }t D ]1}tt|  }| dd |D  dd t|D  | fddtD  |dd |D  q| dgd  |dgd	  |d
gd  tj| tjd} tj|tjd}tj|tj	d}| ||fS )Nc                 S   s   g | ]
}|r
t | nd qS r   r  r  r~   r~   r   r   U  s    z5_make_atom14_and_atom37_constants.<locals>.<listcomp>c                 S   r   r~   r~   )r   r   r  r~   r~   r   r   W  r   z5_make_atom14_and_atom37_constants.<locals>.<dictcomp>c                    s    g | ]}| v r | nd qS r+  r~   r  Zatom_name_to_idx14r~   r   r   X  s    c                 S   s   g | ]}|rd ndqS )r   r   r~   r  r~   r~   r   r   ]  s    r   r   r  r   r   )
r   r  r   r   r   r   r   r  r   r&  )restype_atom14_to_atom37restype_atom37_to_atom14r  rx   r   r~   r,  r   !_make_atom14_and_atom37_constantsN  s4   



r/  c                     s   dd t D } | dg7 } dd | D  t D ]@\}}td}| D ].\}}t| |}t| |}|||< |||< td}t|D ]
\}	}
d||	|
f< qGq$| |< qt	 fd	d| D }|S )
Nc                 S   r   r~   r   r   resr~   r~   r   r   x  r   z+_make_renaming_matrices.<locals>.<listcomp>r{   c                 S   s   i | ]}|t d qS )r   )r   r   r0  r~   r~   r   r   |  r  z+_make_renaming_matrices.<locals>.<dictcomp>r   )r   r   r   c                    r  r~   r~   )r   r   Zall_matricesr~   r   r     r   )
r   residue_atom_renaming_swapsr   r   Zaranger  r   r   r   r   )Z	restype_3r   swapZcorrespondencesZsource_atom_swapZtarget_atom_swapZsource_indexZtarget_indexZrenaming_matrixr   Zcorrespondencerenaming_matricesr~   r2  r   _make_renaming_matricesu  s.   



r6  c                  C   sr   t d} t D ]-\}}| D ]$\}}tt|  }t| |}t| |}d| ||f< d| ||f< qq	| S )N)r   r   r   )r   r   r3  r   restype_orderrestype_3to1r  r   )restype_atom14_is_ambiguousr   r4  Z
atom_name1Z
atom_name2r   Z	atom_idx1Z	atom_idx2r~   r~   r   _make_atom14_is_ambiguous  s   
r:  c                  C   s   g } t D ]2}t| }t| }g }|D ]}|dd |D  qtdt| D ]	}|g d q'| | q| g dgd  | S )aj  Returns atom indices needed to compute chi angles for all residue types.

    Returns:
      A tensor of shape [residue_types=21, chis=4, atoms=4]. The residue types are
      in the order specified in restypes + unknown residue type
      at the end. For chi angles which are not defined on the residue, the
      positions indices are by default set to 0.
    c                 S   r   r~   r  )r   atomr~   r~   r   r     r   z(get_chi_atom_indices.<locals>.<listcomp>r0   r  )r   r   r   r   r   r   )chi_atom_indicesZresidue_nameZresidue_chi_anglesZatom_indicesZ	chi_angler  r~   r~   r   get_chi_atom_indices  s   	r=  )F)r#  r   )b__doc__collections	functoolsr   typingr   r   r   numpyr   Zunicore.utilsr   Zca_car   r!  Zchi_pi_periodicr  r   r3  r'  
namedtuplero   rt   	lru_cacher   Zbetween_res_bond_length_c_nZ"between_res_bond_length_stddev_c_nZbetween_res_cos_angles_c_n_caZbetween_res_cos_angles_ca_c_nr   r   r   r   r   r  r   r7  r   Zunk_restype_indexZrestypes_with_xZrestype_order_with_xstrintboolZndarrayr   r   r   r8  Zunk_restypeZresnamesZresname_to_idxZHHBLITS_AA_TO_IDr   r   tupler   Z MAP_HHBLITS_AATYPE_TO_OUR_AATYPEr   ZSTANDARD_ATOM_MASKr  Zchi_atom_1_one_hotZchi_atom_2_one_hotZchi_angles_atom_indicesr  defaultdictr   Zchi_groups_for_atomZres_nameZchi_angle_atoms_for_resZchi_group_iZ	chi_groupZatom_ir;  r   dictr  r   int_r  r&  r  r  r  r  r  r   r"  r*  r/  r-  r.  r6  r5  r:  r9  r=  r<  r~   r~   r~   r   <module>   s*  	

 %&
'
()1$)1<GMYcmx       "  ,  U	
/

^',.024DEFHq

,	

		

	





N8$
