o
    ߥi'                     @   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@ALAARG)NCACBCG)r	   r
   r   CD)r
   r   r   NE)r   r   r   CZASN)r	   r
   r   OD1ASPCYS)r   r	   r
   SGGLN)r
   r   r   OE1GLUGLYHIS)r	   r
   r   ND1ILE)r   r	   r
   CG1)r	   r
   r   CD1LEU)r	   r
   r   r   LYS)r
   r   r   CE)r   r   r   NZMET)r	   r
   r   SD)r
   r   r"   r   PHEPROSER)r   r	   r
   OG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?       r2   )r
   r   )!rhS㥛gHzG)O   )Mb?ˡE?r,   )r   r   )S㥛n?r2   )r0   r   )ffffff?r2   r2   )r
   r   )r9   L7A`gMbX)r5   r6   )x&1?r8   r,   )r      )gʡE?=
ףp=?r2   )r      )g?5^I?g9v?r,   )r      )gsh|??ʡE?r2   )NH1   )g|?5^?g rh@r,   )NH2rD   )g9v @gK?r2   )r   rD   )gK7A?grh|?r2   )r   r   )x&rB   r,   )r
   r   )gˡEgv/g333333)r5   r6   )      ?r8   r,   )r   r>   )g㥛 ?Mb?r,   )ND2r@   )`"?g5^IgMbP?)r   r@   )gK7A?gl?r,   )r   r   )r.   r:   r2   )r0   r   );On?r,   r2   )r
   r   )Er<   S)r5   r6   )r=   r8   r2   )r   r>   )rJ   g|?5^?r2   )r   r@   )gQ?~jt?r,   )OD2r@   )gl?gV-~jth)r   r   )NbX9r:   r2   )r0   r   )Mb?r,   r,   )r
   r   )gS㥛#~j1Zd)r5   r6   )rG   r8   r2   )r   r>   )gK?g r?r,   )r   r   )rL   -?r2   )r0   r   )r1   r,   r,   )r
   r   )r.   g!rhZd;O)r   r>   )Gz?g}?5^I?r,   )r   r@   )gbX9?rH   r2   )NE2rA   )rJ   g/$MbP)r   rA   )g}?5^I?g(\?r,   )r   r   )gL7A`rU   r,   )r
   r   )rL   gˡErV   )r   r>   )rW   gʡE?r,   )r   r@   )333333?g'1Z?r,   )r   rA   )Cl?gQ?r2   )OE2rA   )g+?gDlrY   )r   r   )gMg1Zd?r,   )r0   r   )gʡE?r2   r2   )r   r   )gw/(\?r,   )r0   r   )r;   r,   r,   )r
   r   )r.   r<   rM   )r5   r6   )rG   5^I?r,   )r   r>   )rZ   Q?r2   )CD2r@   )g r?gtVg~jth?)r   r@   )g+?g(\?r2   )CE1r@   )g=
ףp= @gZd;?gMb`?)rX   r@   )g)\(@gmݿgMbp?)r   r   )gZd;O߿+?r2   )r0   r   )rK   r2   r2   )r
   r   )rF   K7A` rh)r5   r6   )r7   r8   r2   )r   r>   )gJ+?gˡE?r2   )CG2r>   )HzG?gQgv/)r   r@   )+?K7A?r,   )r   r   )gp=
ףr/   r,   )r
   r   )rQ   rS   gCl)r5   r6   )rG   r^   r2   )r   r>   )gV-?gV-?r,   )r   r@   )g(\?gzG?r2   )r`   r@   )gQ?r4   333333?)r   r   )rL   r:   r2   )r
   r   )r9   r<   rM   )r   r>   )rg   r?   r,   )r   r@   )gS?gy&1?r,   )r   rA   )gQ?g-?r,   )r    rD   )g|?5^?gx&1?r,   )r   r   )y&1m?r2   )r
   r   )#~jEg\(\)r   r>   )gV-?rh   r2   )r"   r@   )g"~?gQ?r,   )r   rA   )g{Gz?g~jt?r2   )r   r   )~jtr/   r,   )r0   r   )rR   r,   r2   )r
   r   )r.   rm   rT   )r   r>   )r[   gx&1?r,   )r   r@   )g㥛 ?Q?r2   )r`   r@   )gd;O?gA`"r,   )ra   r@   )g7A` @g^I+?r2   )CE2r@   )gbX9 @K7r2   )r   r@   )g'1Z@rP   rY   )r   r   )g&1gV-?r2   )r0   r   )rK   r2   r,   )r
   r   )gFxgZd;Og㥛 )r5   r6   )gZd;?guV?r,   )r   r>   )g r?gQ?r,   )r   r@   )gI+?gbX9?r,   )r   r   )r3   r]   r2   )r
   r   )rn   gw/gK7A`)r&   r>   )gjt?g333333?r,   )r   r   )g%Crk   r,   )r0   r   )r1   r,   r2   )r
   r   )gPnrc   gq=
ףp)re   r>   )g?g`"gS)r(   r>   )gh|?5?gS?r,   )r   r   )rj   r/   r,   )r0   r   )r;   r2   r,   )r
   r   )rl   rm   rT   )r   r>   )grh|?r_   r2   )r   r@   )g|?5^?rN   r,   )r`   r@   )gS?g|?5^{Gzt)rp   r@   )grh|@gV-y&1|)CE3r@   )gCl?g=
ףp=rs   )NE1r@   )gQ@gGz?gMbp)CH2r@   )gMbX9@gQg9v)CZ2r@   )g$C
@g㥛 I+)CZ3r@   )gq=
ףp?g&1rx   )r   r   )rQ   r:   r,   )r0   r   )rR   r2   r2   )r
   r   )rQ   rm   rd   )r   r>   )r[   g&1?r2   )r   r@   )gx?ro   r2   )r`   r@   )g7A`?gvrY   )ra   r@   )gB`" @ri   Mb`)rp   r@   )gE @rq   rP   )OHr@   )gy&1@rz   rr   )r   r@   )gS@rY   rP   )r   r   )gV-߿rb   r2   )r
   r   )guVgq=
ףprd   )r   r>   )rf   gw/?r2   )re   r>   )guV?rm   gsh|??)r0   r	   r
   r   r5   )r0   r	   r
   r   r   r   r   r   r5   rC   rE   )r0   r	   r
   r   r   r5   r   rO   )r0   r	   r
   r   r   rI   r5   r   )r0   r	   r
   r   r5   r   )	r0   r	   r
   r   r   r   r5   r   r\   )	r0   r	   r
   r   r   r   rX   r5   r   )r0   r	   r   r5   )
r0   r	   r
   r   r`   ra   r   r   rX   r5   )r0   r	   r
   r   re   r   r   r5   )r0   r	   r
   r   r   r`   r   r5   )	r0   r	   r
   r   r   r   r   r    r5   )r0   r	   r
   r   r   r   r5   r"   )r0   r	   r
   r   r   r`   ra   rp   r   r   r5   )r0   r	   r
   r   r   r   r5   )r0   r	   r
   r   r5   r&   )r0   r	   r
   re   r   r5   r(   )r0   r	   r
   r   r   r`   rp   rt   rw   ry   rv   r   ru   r5   )r0   r	   r
   r   r   r`   ra   rp   r   r   r5   r{   )r0   r	   r
   r   re   r   r5   r   rO   r   r\   r`   rp   )r   ra   )r   r   r#   r*   g333333?g?gRQ?g?)r0   r   r5   SBond)
atom1_name
atom2_namelengthstddev	BondAngle)r~   r   	atom3name	angle_radr   )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.r   )joinsorted)r~   r    r   l/home/ubuntu/.local/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appendr}   floatr   nppiitemsr~   r   r   r   sqrtr   cossinr   )stereo_chemical_props_pathfstereo_chemical_props
lines_iterresidue_bondslinebondresnamer   r   atom1atom2residue_bond_anglesangle_degreestddev_degreeatom3r   residue_virtual_bondsbond_angles
bond_cachebbabond1bond2gammadl_outer	dl_dgammadl_db1dl_db2r   r   r   load_stereo_chemical_props  s   

r   g$C?g~jt?gy&1?gMb?gJ{/LgPs?g-ܿgU؟?)%r   r	   r0   r
   r5   r   r   re   r&   r(   r   r   r   r`   r   rI   r   rO   r"   r   ra   rp   rt   r   ru   rX   r   r\   rv   rC   rE   r{   r   rw   ry   r    OXTc                 C      i | ]\}}||qS r   r   ).0i	atom_typer   r   r   
<dictcomp>=      r   )r   r	   r0   r5   r
    r   r   r   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   r   r   rC   rE   r   r   r   )r   r	   r0   r5   r
   r   r   rI   r   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   rO   r   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   r   r   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   r   rX   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   r   r\   r   r   r   r   r   )r   r	   r0   r5   r   r   r   r   r   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   r`   ra   rX   r   r   r   r   )r   r	   r0   r5   r
   r   re   r   r   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   r`   r   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   r   r    r   r   r   r   r   )r   r	   r0   r5   r
   r   r"   r   r   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   r`   ra   rp   r   r   r   r   )r   r	   r0   r5   r
   r   r   r   r   r   r   r   r   r   )r   r	   r0   r5   r
   r&   r   r   r   r   r   r   r   r   )r   r	   r0   r5   r
   r(   re   r   r   r   r   r   r   r   )r   r	   r0   r5   r
   r   r   r`   ru   rp   rt   rw   ry   rv   )r   r	   r0   r5   r
   r   r   r`   ra   rp   r   r{   r   r   )r   r	   r0   r5   r
   r   re   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   Dr0   QEGHILKMFPr|   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dtyper   z#Invalid character in the sequence: )maxvaluesr   setlistrange
ValueErrorr   zeroslenint32	enumerateisalphaisupperget)r   r   r   num_entriesone_hot_arraa_indexaa_typeaa_idr   r   r   sequence_to_onehot  s$   
r   r   r   r   r   r0   r   r   r   r   r   r   r   r   r   r   r|   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   r6   r>   r@   rA   rD   J      	   
      r5                              )
r   r|   r   Ur   r   r   r   Zr   r   r   r   r   )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_letterrestype_name
atom_names	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>r>   r   axis)r   r   r   )chi_angles_atomsr   extendr   r  r   r   eyer  r   r   stack	transpose)	r   chi_angles_indexone_hotsr   r   indicesr   res3one_hotr   r#  r   chi_angle_atom{  s   
r1  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    r5  )	leaf_typec                 C   s&   g | ]}|g d gdt |   qS )r   r   r   r   r>   )r   )r   	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   linalgnormdotcrossr*  r+  concatenate)exeytranslationex_normalizedey_normalizedeznormmr   r   r   _make_rigid_transformation_4x4  s   
rE  %   r   )r  rF  r6   )r  r  r6   )r  r  r>   r>   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>r>   r   r   r	   )r-   r,   r,   )r>  r?  r@  r   r0   r6   c                       g | ]} | qS r   r   r   rH  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_framerE  rG  chi_angles_maskr'  r   )r   r  r   atomname	group_idxatom_positionatomtype	atom14idxmatbase_atom_namesbase_atom_positionschi_idxaxis_end_atom_nameaxis_end_atom_positionr   rM  r   _make_rigid_group_constants  s   
rd        ?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_boundr   )r   r   float32r   r   r  r   rS  van_der_waals_radiusr  r~   r   r   r   )overlap_tolerancebond_length_tolerance_factorrestype_atom14_bond_lower_boundrestype_atom14_bond_upper_boundrestype_atom14_bond_stddevr   r   rI  r   r  r   	atom_list	atom1_idxr~   atom1_radius	atom2_idxr   atom2_radiuslowerupperr   r   r   r   make_atom14_dists_bounds  s   rv  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   r3  rL  r   r   r   r   U  s    z5_make_atom14_and_atom37_constants.<locals>.<listcomp>c                 S   r   r   r   )r   r   rH  r   r   r   r   W  r   z5_make_atom14_and_atom37_constants.<locals>.<dictcomp>c                    s    g | ]}| v r | nd qS rw  r   rL  atom_name_to_idx14r   r   r   X  s    c                 S   s   g | ]}|rd ndqS )r-   r,   r   rL  r   r   r   r   ]  s    r   r  rF  r,   r   )
r  rS  r   r   r   r!  r   rG  r   rh  )restype_atom14_to_atom37restype_atom37_to_atom14rU  r   r  r   rx  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)  r}  r   r   r   r   |  r2  z+_make_renaming_matrices.<locals>.<dictcomp>r  )r  r  r-   c                    rK  r   r   )r   r   all_matricesr   r   r     r   )
r  residue_atom_renaming_swapsr   r   arangerS  r  r   r   r*  )	restype_3r   swapcorrespondencessource_atom_swaptarget_atom_swapsource_indextarget_indexrenaming_matrixr  correspondencerenaming_matricesr   r  r   _make_renaming_matricesu  s.   



r  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   r  r   restype_orderrestype_3to1rS  r  )restype_atom14_is_ambiguousr   r  
atom_name1
atom_name2r   	atom_idx1	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   r3  )r   atomr   r   r   r     r   z(get_chi_atom_indices.<locals>.<listcomp>r>   r7  )r  r   r'  r   r   r   )chi_atom_indicesresidue_nameresidue_chi_anglesatom_indices	chi_anglerI  r   r   r   get_chi_atom_indices  s   	r  )F)re  r  )b__doc__collections	functoolsr   typingr   r   r   numpyr   unicore.utilsr   ca_car'  rX  chi_pi_periodicrO  r  r  ri  
namedtupler}   r   	lru_cacher   between_res_bond_length_c_n"between_res_bond_length_stddev_c_nbetween_res_cos_angles_c_n_cabetween_res_cos_angles_ca_c_nr!  r   r  r   r  rS  r  r  r  unk_restype_indexrestypes_with_xrestype_order_with_xstrintboolndarrayr   r   r   r  unk_restyperesnamesresname_to_idxHHBLITS_AA_TO_IDr  r  tupler    MAP_HHBLITS_AATYPE_TO_OUR_AATYPEr  STANDARD_ATOM_MASKr1  chi_atom_1_one_hotchi_atom_2_one_hotchi_angles_atom_indicesrG  defaultdictr   chi_groups_for_atomres_namechi_angle_atoms_for_reschi_group_i	chi_groupatom_ir  r   dictrE  r   int_rP  rh  rQ  rR  rT  rU  rV  rW  rd  rv  r|  rz  r{  r  r  r  r  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$
