o
    RŀgV                     @   s>  d Z ddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddl	mZ ddlmZ ddlm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*d+d,d-d.d/d0d1d2d3d4d5d6ZdGd8d9Zd:d; ZdHd=d>Zd?d@ ZdAdB ZdCdD ZG dEdF dFeZdS )Ia  Calculation of residue depth using command line tool MSMS.

This module uses Michel Sanner's MSMS program for the surface calculation.
See: http://mgltools.scripps.edu/packages/MSMS

Residue depth is the average distance of the atoms of a residue from
the solvent accessible surface.

Residue Depth::

    from Bio.PDB.ResidueDepth import ResidueDepth
    from Bio.PDB.PDBParser import PDBParser
    parser = PDBParser()
    structure = parser.get_structure("1a8o", "Tests/PDB/1A8O.pdb")
    model = structure[0]
    rd = ResidueDepth(model)
    print(rd['A',(' ', 152, ' ')])

Direct MSMS interface, typical use::

    from Bio.PDB.ResidueDepth import get_surface
    surface = get_surface(model)

The surface is a NumPy array with all the surface vertices.

Distance to surface::

    from Bio.PDB.ResidueDepth import min_dist
    coord = (1.113, 35.393,  9.268)
    dist = min_dist(coord, surface)

where coord is the coord of an atom within the volume bound by
the surface (ie. atom depth).

To calculate the residue depth (average atom depth of the atoms
in a residue)::

    from Bio.PDB.ResidueDepth import residue_depth
    chain = model['A']
    res152 = chain[152]
    rd = residue_depth(res152, surface)

    N)BiopythonWarning)	PDBParser)	Selection)AbstractPropertyMap)is_aa   )g=
ףp=?ffffff?r      )gQ?r   皙?      )ffffff?p=
ף?g333333?   )r   r   ?   )r   r          @   )gp=
ף?ףp=
?r      	   
   )gq=
ףp?r   r      )r   r   g(\?   )p=
ף?r   g?   )r   r   r      )r   r   r      )Gz?333333?r      )r           g      ?   )g      @      @r#   )r   Q?r$   )      ?r   r   )Q?r   r   )g333333??r'   )g(\?ףp=
?r(   ){Gz?r)   r)   )r   r   r!   )(\?ףp=
?r+   )g(\?r
   r
   )r&   r+   r+   )r*   r%   r%   )r&   333333@r,   )      @r-   r-   )ffffff?r.   r.   )gffffff?r   r   )                                          &   unitedc                 C   s  |dkrd}n|dkrd}nt d|d| jj}| jjd }| j}| j}|dks.|d	kr4td
 | S |dkrB|dkrBtd | S |dkrP|dkrPtd | S |dkr^|dkr^td | S |dkrl|dkrltd | S |dkrvtd | S |dkrtd | S |dkrtd | S |dkrtd | S |dkrtd | S |dkr|dkrtd | S |dkr|dv rtd | S |dkrtd | S |dkr|d v rtd | S |dkr|d!krtd | S |dkrtd | S |d"kr|dkrtd# | S |dkr|d$krtd | S |d%kr|dkrtd | S |d%kr(|d&v r(td | S |d%kr8|d'kr8td | S |d%krI|d(rItd) | S |d*krY|d+krYtd | S |d*kri|d,kritd) | S |d*krz|d-rztd# | S |d.kr|d/rtd# | S |d0kr|d+rtd | S |d0kr|d,krtd# | S |d0kr|d1rtd# | S |d2v r|d3krtd | S |d4v r|d5rtd | S |d6kr|d3krtd7 | S |d8kr|d9rtd# | S |d:v r|dkrtd | S |d"kr|d;krtd | S |d"kr/|d<kr/td) | S |d=v r@|d>r@td# | S |d?v rP|d@v rPtdA | S |dBv r`|dCkr`tdD | S |dEv rp|dFv rptd | S |dGv r|dHv rtd | S |dIv r|dHv rtdD | S |dJv r|dKrtd | S |dLkr|dMkrtd | S |dLkr|dNkrtd | S |dLkr|dOv rtd | S |d!kr|drtd | S |dPkr|dQv rtd | S |dPkr|dRv rtdS | S |dTkr|dUkrtd | S |dTkr"|dVkr"td | S |dWkr3|dXr3tdA | S |dYkrC|dZv rCtd | S |d[krS|d\v rStd | S |d[krd|d]rdtd# | S |d^krt|d_krttd | S |d`kr|dakrtd | S |d`kr|dNkrtd | S |dbkr|dckrtdA | S |dbkr|ddv rtd | S |dbkr|dekrtd | S |dbkr|dfv rtdA | S |dgkr|dhv rtdA | S |dgkr|d'krtd | S |dgkr|dikrtd | S |djkr|dkv rtd | S |dkrtd | S |dlv r6|dmr6|dnr6tdo | S |dlv rM|dprM|dnrMtd | S |dqkr]|drkr]td | S |dskrm|dtv rmtdo | S |dukr}|dvv r}td | S |dukr|dmkrtdo | S |dukr|dwv rtdA | S |dukr|dxv rtdD | S |dukr|dyv rtd | S |dukr|dzv rtd | S |dukr|d{krtd | S |d|kr|d}v rtdD | S |d~kr|dv rtd | S |d~kr|dkrtd | S |d~kr|dkrtd | S |d~kr-|dkr-td | S |d~kr=|dv r=td | S |dv rM|dpkrMtd | S |dv r]|dv r]td# | S |dkrm|dv rmtd# | S |dkr}|dkr}td | S |dkr|dv rtd | S |dkr|dv rtd | S |dkr|dkrtdD | S |dkr|dkrtd | S |dv r|dv rtd | S |dkr|dv rtd | S |dkr|dv rtd | S |dkr|dv rtd | S |dkr|dkrtdD | S |dkr|dv rtdA | S |dkr-|dv r-td | S |dkr>|dr>td | S |dkrO|drOtd | S |dkr`|dr`td# | S |dkrp|dv rptd# | S |dv r|dkrtd# | S |dv r|dkrtd | S |dkr|dkrtd | S |dkr|dkrtd | S |dv r|drtd | S |dkrtd | S |dkrtd | S |dkrtd | S |dmkrtd | S |dkrtd | S |dkrtd | S |dkrtd | S |dkrtd | S |dkr$td | S |dkr/td# | S |dr;td# | S |dprGtd | S |drStd | S |dr_tdA | S |drktd | S |drwtd | S |drtdS | S |dv rtd | S |drtd | S |dv r|drtd | S |dv r|drtd | S |dv r|drtd | S |dv r|drtd | S |dv r|drtd
 | S t	
| d| dt dS )a&  Translate an atom object to an atomic radius defined in MSMS (PRIVATE).

    Uses information from the parent residue and the atom object to define
    the atom type.

    Returns the radius (float) according to the selected type:
     - explicit (reads hydrogens)
     - united (default)

    explicitr   r>   r	   zRadius type (z0) not understood. Must be 'explicit' or 'united'r   HDr   WO CAr/   CDr3   ACEr   Nr   r   Cr   Pr   CBALA>   ILETHRVALr   CG>   ASNASPASXHIDHIEHIPHISLEUPHETRPTYRHISLHISNrX   GLNr   CH3ARG>   NERECZ)NHRHr   rQ   OD1ND2ADrR   )ODEDrS   )ri   rh   >   CYMCYSCYXSG>   rl   METLPCUHr   GLU)OEEE>   r^   rr   GLXOE1NE2>   r^   ru   AE>   rT   rU   rV   rW   r\   >   CD2CE1r   >   rT   rU   rW   r\   ND1r   >   rT   rV   >   r{   RD1>   rU   rV   rW   >   rw   RE2>   rT   r\   >   rT   rV   rW   r\   )rh   rx   rM   CG1CG2>   rF   CD1LYS>   rF   CErP   >   KZNZr   ro   SDr   rY   )rF   r   rc   PRO>   rF   rP   CSO>   SESEGri   SEROGrN   OG1rZ   r   >   ry   CE2NE1>   CE3CH2CZ2CZ3r[   >   r   ry   rz   r   OHrO   >   r~   r   >   FS3FS4FE)1234567r2   Sr   OXOFEO>   FE1FE2HEM>   O1O2>   CABCACCBBCBCCHACHBCHCCHD>   N AN BN CN DNANBNCND>   C1AC1BC1CC1DC2AC2BC2CC2DC3AC3BC3CC3DC4AC4BC4CC4DCGACGD>   CMACMBCMCCMDOH2AZI>   N1N2N3MPD>   C1C5C6C2C3C4>   O7O8>   SO4SUL>   PHOPO4r   r   >   r   r   O3O4zPC P1>   r   r   >   r   r   r   r   BIGBALr"   >   DOTPOIr4   FMN>   r   N5N10>   r   r   C7C8C10r   C5AC9A>   r   r   r   >   r   C9>   C7MC8M)r   r   r   r   r   )r   r   r   O5>   OP1OP2OP3>   ALKMYROT1C01r   C16r   C14CUr1   ZNr0   MNr8   r6   MGr7   COr9   r   r:   YBr<   r   OXT)OTEA)rH   RK>   PAPBPCPD>   AMXAPUFADNAD:z not in radii library.r)   )
ValueErrorparentresnameidnameelement_atomic_radii
startswithendswithwarningswarnr   )atomrtypetypekeyr  het_atmat_nameat_elem r   H/var/www/html/myenv/lib/python3.10/site-packages/Bio/PDB/ResidueDepth.py_get_atom_radiusl   s:  

















r"  c                 C   sv   t | *}g }|D ]}| }t|dkrq	dd |dd D }|| q	W d   n1 s1w   Y  t|S )z2Read the vertex list into a NumPy array (PRIVATE).r   c                 S   s   g | ]}t |qS r   )float).0xr   r   r!  
<listcomp>  s    z&_read_vertex_array.<locals>.<listcomp>r   r   N)opensplitlenappendnparray)filenamefpvertex_listlineslvlr   r   r!  _read_vertex_array  s   

	r3  msmsc                 C   s<  t | d}tjddj}t|d.}|D ]#}|j\}}}t|dd}	||dd|dd|dd|	d	d
 qW d   n1 sCw   Y  tjddj}
tjddj}|d | }|||
f }t	j
|dd |
d }|
d }tj|s~td| t|}||
|||fD ]}zt| W q ty   Y qw |S )a3  Represent molecular surface as a vertex list array.

    Return a NumPy array that represents the vertex list of the
    molecular surface.

    Arguments:
     - model - BioPython PDB model object (used to get atoms for input model)
     - MSMS - msms executable (used as argument to subprocess.call)

    r  F)deletewr>   )r  z6.3f	z1.2f
Nz# -probe_radius 1.5 -if %s -of %s > T)shellz.facez.vertz/Failed to generate surface file using command:
)r   unfold_entitiestempfileNamedTemporaryFiler  r'  coordr"  write
subprocesscallospathisfileRuntimeErrorr3  removeOSError)modelMSMS	atom_listxyz_tmppdb_to_xyzrr  r%  yzradiussurface_tmpmsms_tmpmake_surface	face_filesurface_filesurfacefnr   r   r!  get_surface  s8   ,rV  c                 C   s&   ||  }t || d}t t|S )z2Return minimum distance between coord and surface.r   )r+  sumsqrtmin)r=  rT  dd2r   r   r!  min_dist,  s   r\  c                 C   s<   |   }t|}d}|D ]}| }|t|| }q|| S )zResidue depth as average depth of all its atoms.

    Return average distance to surface for all atoms in a residue,
    ie. the residue depth.
    r   )get_unpacked_listr)  	get_coordr\  )residuerT  rI  lengthrZ  r  r=  r   r   r!  residue_depth3  s   ra  c                 C   s(   |  dsdS | d }| }t||S )zReturn CA depth.rE   N)has_idr^  r\  )r_  rT  car=  r   r   r!  ca_depthB  s
   

rd  c                   @   s   e Zd ZdZdddZdS )ResidueDepthz0Calculate residue and CA depth for all residues.Nc                 C   s   |du rd}i }g }g }t |d}t||d}|D ]=}t|s!qt||}	t||}
| }|  }|	|
f|||f< |||	|
ff |||f |	|j	d< |
|j	d< qt
| ||| dS )zInitialize the class.Nr4  r  )rH  EXP_RD	EXP_RD_CA)r   r:  rV  r   ra  rd  get_id
get_parentr*  xtrar   __init__)selfrG  	msms_exec
depth_dict
depth_list
depth_keysresidue_listrT  r_  rdca_rdres_idchain_idr   r   r!  rk  N  s(   


zResidueDepth.__init__)N)__name__
__module____qualname____doc__rk  r   r   r   r!  re  K  s    re  )r>   )r4  )ry  rA  r?  r;  r  numpyr+  Bior   Bio.PDBr   r   Bio.PDB.AbstractPropertyMapr   Bio.PDB.Polypeptider   r  r"  r3  rV  r\  ra  rd  re  r   r   r   r!  <module>   s   ,	

)   
0	