
:>"^6                 @   s]  d  Z  d d l m 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 m Z d d d d d d	  Z d
 d   Z d d   Z Gd d   d e  Z Gd d   d e  Z e d k rYd d l Z d d l m Z e   Z e j d e j d  Z e d Z e e e j d  Z x e D] Z e e  qEWd S)an  Interface for the program NACCESS.

See: http://wolf.bms.umist.ac.uk/naccess/
Atomic Solvent Accessible Area Calculations

errors likely to occur with the binary:
default values are often due to low default settings in accall.pars
- e.g. max cubes error: change in accall.pars and recompile binary

use naccess -y, naccess -h or naccess -w to include HETATM records
    )print_functionN)PDBIO)AbstractResiduePropertyMapAbstractAtomPropertyMapnaccessz/tmp/c             C   s  t  j d |  } t  j d d | \ } } t j |  | re t j j |  } t j | |  n) t	   }	 |	 j
 |  j    |	 j |  t j   }
 t j |  | | g } | r | j d | g  | r | j d | g  t j | d d d t j d t j } | j   \ } } t j |
  | d	 d  d } | d	 d  d } | j   rlt j |  t j j |  st j j |  rt d   t |   } | j   } Wd	 QRXt |   } | j   } Wd	 QRX| | f S)zRun naccess for a pdb file.dirz.pdbz-pz-zuniversal_newlinesTstdoutstderrN   z.rsaz.asaz+NACCESS did not execute or finish properly.r   )tempfilemkdtempmkstemposclosepathabspathshutilcopyr   Zset_structureZ
get_parentsavegetcwdchdirextend
subprocessPopenPIPEcommunicatestripwarningswarnexists	Exceptionopen	readlines)modelpdb_fileZ
probe_sizeZz_slicer   	temp_pathtmp_pathhandleZtmp_pdb_filewriterZold_dircommandpouterrZrsa_fileZasa_filerfrsa_dataafZasa_data r2   4/tmp/pip-build-ww9dw3qa/biopython/Bio/PDB/NACCESS.pyrun_naccess$   s>    	!&r4   c             C   se  i  } xX|  D]P} | j  d  r | d d  } | d } t | d d   } | d } d | | f } d | d	 t | d
 d   d t | d d   d t | d d   d t | d d   d t | d d   d t | d d   d t | d d   d t | d d    d! t | d" d#   d$ t | d% d&   i | | | f <q W| S)'z6Process the .rsa output file: residue level SASA data.ZRESr         	       res_nameZall_atoms_abs      Zall_atoms_rel      Zside_chain_abs   #   Zside_chain_rel$   )   Zmain_chain_abs*   0   Zmain_chain_rel1   6   Znon_polar_abs7   =   Znon_polar_rel>   C   Zall_polar_absD   J   Zall_polar_relK   P   )
startswithintfloat)r0   Znaccess_rel_dictliner:   chain_idresseqicoderes_idr2   r2   r3   process_rsa_data]   s(    

*rW   c             C   s   i  } x |  D] } | d d  } | j    } | d } t | d d   } | d } d | | f } | | | f }	 | d d  }
 |
 | |	 <q W| S)	z5Process the .asa output file: atomic level SASA data.   r;      r<      r9   rF   rI   )r   rP   )r0   naccess_atom_dictrR   Zfull_atom_idatom_idZchainidrT   rU   rV   idasar2   r2   r3   process_asa_dataw   s    

r_   c               @   s+   e  Z d  Z d Z d d d d d  Z d S)NACCESSz0Define NACCESS class for residue properties map.Nr   z/tmpc             C   s  t  | | d | d | \ } } t |  } i  } g  }	 g  }
 x | D] } | j   } x | D] } | j   } | | f | k r_ | | | f } | d } | | j   k s t  | | | | f <|	 j | | f  |
 j | | f  | | j d <q_ q_ WqF Wt j |  | |	 |
  d S)zInitialize the class.r   r'   r:   EXP_NACCESSN)	r4   rW   get_idZget_resnameAssertionErrorappendxtrar   __init__)selfr%   r&   naccess_binarytmp_directoryres_dataatm_dataZnaccess_dictproperty_dictproperty_keysproperty_listchainrS   resrV   itemr:   r2   r2   r3   rf      s*    
zNACCESS.__init__)__name__
__module____qualname____doc__rf   r2   r2   r2   r3   r`      s   r`   c               @   s+   e  Z d  Z d Z d d d d d  Z d S)NACCESS_atomicz4Define NACCESS atomic class for atom properties map.Nr   z/tmpc             C   s  t  | | d | d | \ } } t |  |  _ i  } g  } g  }	 x | D] }
 |
 j   } x |
 D] } | j   } x| | D]t } | j   } | | | f } | |  j k r{ |  j | } | | | <| j |  |	 j | | f  | | j d <q{ Wqb WqI Wt j |  | | |	  d S)zInitialize the class.r   r'   ra   N)r4   r_   r[   rb   rd   re   r   rf   )rg   r%   r&   rh   ri   rj   rk   rl   rm   rn   ro   rS   ZresiduerV   Zatomr\   Zfull_idr^   r2   r2   r3   rf      s*    
zNACCESS_atomic.__init__)rr   rs   rt   ru   rf   r2   r2   r2   r3   rv      s   rv   __main__)	PDBParserX   )ru   
__future__r   r   r   r   r   r   ZBio.PDB.PDBIOr   ZBio.PDB.AbstractPropertyMapr   r   r4   rW   r_   r`   rv   rr   sysZBio.PDBrx   r,   Zget_structureargvsr%   neprintr2   r2   r2   r3   <module>   s,   8"!	
