B
    ‰°b  ã               @   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	m
Z
 ddd„Zd	d
„ Zdd„ ZG dd„ de	ƒZG dd„ de
ƒZedkräddlZddlmZ eƒ Ze dejd ¡Zed Zeeejd ƒZxeD ]Zeeƒ qÔW d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
é    N)ÚPDBIO)ÚAbstractResiduePropertyMapÚAbstractAtomPropertyMapÚnaccessú/tmp/c          	   C   sf  t j|d}t jd|d\}}t |¡ |rFtj |¡}t ||¡ nt	ƒ }	|	 
|  ¡ ¡ |	 |¡ t ¡ }
t |¡ ||g}|r| d|g¡ |r¢| d|g¡ tj|dtjtjd}| ¡ \}}t |
¡ |dd… d	 }|dd… d
 }| ¡ rt |¡ tj |¡rtj |¡s&tdƒ‚t|ƒ}| ¡ }W dQ R X t|ƒ}| ¡ }W dQ R X ||fS )zRun naccess for a pdb file.)Údirz.pdbz-pz-zT)Zuniversal_newlinesÚstdoutÚstderrNéüÿÿÿz.rsaz.asaz+NACCESS did not execute or finish properly.)ÚtempfileZmkdtempZmkstempÚosÚcloseÚpathÚabspathÚshutilÚcopyr   Zset_structureZ
get_parentZsaveÚgetcwdÚchdirÚextendÚ
subprocessÚPopenÚPIPEZcommunicateÚstripÚwarningsÚwarnÚexistsÚ	ExceptionÚopenÚ	readlines)ÚmodelÚpdb_fileZ
probe_sizeZz_slicer   Ú	temp_pathZtmp_pathZhandleZtmp_pdb_fileÚwriterZold_dirZcommandÚpÚoutÚerrZrsa_fileZasa_fileZrfÚrsa_dataZafZasa_data© r'   ú.lib/python3.7/site-packages/Bio/PDB/NACCESS.pyÚrun_naccess#   s>    







r)   c             C   sò   i }xè| D ]à}|  d¡r
|dd… }|d }t|dd… ƒ}|d }d||f}|t|dd	… ƒt|d
d… ƒt|dd… ƒt|dd… ƒt|dd… ƒt|dd… ƒt|dd… ƒt|dd… ƒt|dd… ƒt|dd… ƒdœ|||f< q
W |S )z6Process the .rsa output file: residue level SASA data.ZRESé   é   é   é	   é   ú é   é   é   é   é   é#   é$   é)   é*   é0   é1   é6   é7   é=   é>   éC   éD   éJ   éK   éP   )Úres_nameZall_atoms_absZall_atoms_relZside_chain_absZside_chain_relZmain_chain_absZmain_chain_relZnon_polar_absZnon_polar_relZall_polar_absZall_polar_rel)Ú
startswithÚintÚfloat)r&   Znaccess_rel_dictÚlinerD   Úchain_idÚresseqÚicodeÚres_idr'   r'   r(   Úprocess_rsa_data\   s(    


 rM   c             C   sr   i }xh| D ]`}|dd… }|  ¡ }|d }t|dd… ƒ}|d }d||f}|||f}	|dd… }
|
||	< q
W |S )	z5Process the .asa output file: atomic level SASA data.é   r0   é   r1   é   r/   r;   r>   )r   rF   )r&   Únaccess_atom_dictrH   Zfull_atom_idÚatom_idZchainidrJ   rK   rL   ÚidÚasar'   r'   r(   Úprocess_asa_datav   s    


rU   c               @   s   e Zd ZdZddd„ZdS )ÚNACCESSz0Define NACCESS class for residue properties map.Nr   ú/tmpc             C   sÌ   t ||||d\}}t|ƒ}i }g }	g }
xŽ|D ]†}| ¡ }xx|D ]p}| ¡ }||f|kr@|||f }|d }|| ¡ ks|t‚||||f< |	 ||f¡ |
 ||f¡ ||jd< q@q@W q.W t | ||	|
¡ dS )zInitialize the class.)r   r!   rD   ÚEXP_NACCESSN)	r)   rM   Ú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ÚchainrI   ZresrL   ÚitemrD   r'   r'   r(   r]   ‰   s*    

zNACCESS.__init__)Nr   rW   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r]   r'   r'   r'   r(   rV   †   s   rV   c               @   s   e Zd ZdZddd„ZdS )ÚNACCESS_atomicz4Define NACCESS atomic class for atom properties map.Nr   ú/tmpc             C   sÈ   t ||||d\}}t|ƒ| _i }g }g }	xˆ|D ]€}
|
 ¡ }xr|
D ]j}| ¡ }x\|D ]T}| ¡ }|||f}|| jkrT| j| }|||< | |¡ |	 ||f¡ ||jd< qTW qBW q0W t | |||	¡ dS )zInitialize the class.)r   r!   rX   N)r)   rU   rQ   rY   r[   r\   r   r]   )r^   r   r    r_   r`   ra   rb   rc   rd   re   rf   rI   ZresiduerL   ZatomrR   Zfull_idrT   r'   r'   r(   r]   «   s*    







zNACCESS_atomic.__init__)Nr   rm   )rh   ri   rj   rk   r]   r'   r'   r'   r(   rl   ¨   s   rl   Ú__main__)Ú	PDBParserÚXé   )NNr   r   )rk   r   r   r   r   r   ZBio.PDB.PDBIOr   ZBio.PDB.AbstractPropertyMapr   r   r)   rM   rU   rV   rl   rh   ÚsysZBio.PDBro   r#   Zget_structureÚargvÚsr   ÚnÚeÚprintr'   r'   r'   r(   Ú<module>   s*   
8"!
