B
    ¨d.  ã               @   sÆ   d dl mZmZmZ d dlZd dlmZ d dlZ	d dl	m
Z
 d dlZd dlm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	d
„ZG dd„ dƒZG dd„ dƒZdd„ Zddd„Zddd„ZdS )é    )Úabsolute_importÚdivisionÚprint_functionN)ÚSorry)Ú
group_args)Úflex)Úzip)ÚrangeFc             C   s.   t j tj dd¡¡}|d kr*| s*tdƒ‚|S )NÚmmtbxÚrotamerz/Can't seem to find mmtbx/rotamer/ directory.
  )ÚlibtbxÚenvÚfind_in_repositoriesÚosÚpathÚjoinr   )ÚoptionalÚresult© r   ú}/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/mmtbx/rotamer/sidechain_angles.pyÚfind_source_dir   s
    r   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚPropertyFilec             C   s
   i | _ d S )N)Ú
properties)Úselfr   r   r   Ú__init__   s    zPropertyFile.__init__c          
   C   sž   yt |ƒ}W n6 tk
rB } zt|d ƒ t ¡  W d d }~X Y nX xL|D ]D}| d¡sJ|dkrdqJqJ| d¡}|d  ¡  d¡| j|d  ¡ < qJW | 	¡  d S )Nz file not foundú#Ú
ú=é   ú"r   )
ÚopenÚImportErrorÚprintÚsysÚexitÚ
startswithÚsplitÚstripr   Úclose)r   ÚfileLocÚfÚeÚlineZpropsr   r   r   Úprocess   s    
 
$zPropertyFile.processN)Ú__name__Ú
__module__Ú__qualname__r   r-   r   r   r   r   r      s   r   c               @   sj   e Zd Zi Zi Zi Zi Zi Zi Zi Z	i Z
dd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zddd„Zddd„Zd	S )ÚSidechainAnglesc             C   s\  || _ tƒ }tƒ }| tj |d¡¡ x.|jd  d¡D ]}xXt	|jd|   d¡|jd|   d¡ƒD ]*\}}|szql| j
 |i ¡ || j
| |< qlW i | j|< |j|d  | j|< |j|d   d¡}|j|d   d¡}|| j|< d	}	x|D ]}
|
d
kr|d |
 }|j|  d¡| j|< |j| }|dkrT|
dkrT| dd¡}nB|dkrv|
dkrv| dd¡}n |dkr–|
dkr–| dd¡}|
| j| |< |dksÌ|dksÌ|dksÌ|dkr|	t|j|d  ƒk r|d }|j|  d¡| j|< |	d7 }	qöW || j|< x:|D ]2}|d
kr|d | }|j|  d¡| j|< qW q:W d S )Nzsidechain_angles.propsZ
aminoacidsú,z%s.rotamersz%s.frequenciesz.chisz.anglesz	.rotamersr   Ú Ú.ÚvalZchi1ZCG1ZCG2ÚthrZOG1ÚileÚleuÚargZ_atomsr   ú )Úshow_errorsr   r   r-   r   r   r   r   r&   r   Úfrequencies_from_rotamerÚ
setdefaultÚresAtomsToChiÚ	chisPerAAÚanglesForAAÚatomsForAngleÚreplaceÚintÚatomsMoveWithAngleÚrotamersForAAÚanglesForRot)r   Z	show_errsÚ
source_dirr*   ÚaaÚrotZfreqZ	anglelistZrotamerlistZchi_ctrÚangleÚkeyZ	chi_atomsZkey2r   r   r   r   r   5   sN     



(


zSidechainAngles.__init__c             C   sd   i }|  ¡ }|| jkrd S | j |¡}x8|D ]0}|dkr,|d | }dd„ | j| D ƒ||< q,W |S )Nr3   r4   c             S   s   g | ]}t |ƒ‘qS r   )Úfloat)Ú.0Úxr   r   r   ú
<listcomp>n   s    z0SidechainAngles.get_rotamers.<locals>.<listcomp>)ÚlowerrE   ÚgetrF   )r   Úresidue_nameZrotamersrH   Zrotamer_listr   rK   r   r   r   Úget_rotamerse   s    

zSidechainAngles.get_rotamersc             C   sP   g }|  ¡ }|d | }| j |¡}|d kr0d S x|D ]}| t|ƒ¡ q6W |S )Nr4   )rP   rF   rQ   ÚappendrL   )r   rR   Úrotamer_nameZreturn_anglesrH   rK   ÚanglesrJ   r   r   r   Úget_rotamer_anglesq   s    
z"SidechainAngles.get_rotamer_anglesc             C   s6   |  ¡ }|| jkrd S | j |¡}|s*d S | |d ¡S )N)rP   rE   r<   rQ   )r   rR   rU   rH   Zfreqsr   r   r   Ú#get_rotamer_expectation_frequencies|   s    
  z3SidechainAngles.get_rotamer_expectation_frequenciesNc       	   	   C   s¢   |j  ¡  ¡ }tjj}||j ƒdkršyLt| j| ƒ}g }x4t|ƒD ](}| 	| j
dt|d ƒ |||d¡ qBW |S  tk
r–   | jr’t|d ƒ d S X nd S d S )NÚcommon_amino_acidZchir   )Ú	angleNameÚresÚ	atom_dictÚ
sites_cartz is an unknown residue type)ÚresnamerP   r'   ÚiotbxÚpdbÚcommon_residue_names_get_classrC   r?   r	   rT   ÚmeasureAngleÚstrÚKeyErrorr;   r"   )	r   r[   r\   r]   ZresNameÚ	get_classZnumChisÚvaluesÚir   r   r   ÚmeasureChiAnglesƒ   s$     z SidechainAngles.measureChiAnglesc             C   sf   | j |||d}|d krd S |d kr4dd„ |D ƒ}n"g }x|D ]}| ||j ¡ q>W tjj|ddS )N)rZ   r[   r\   c             S   s   g | ]
}|j ‘qS r   )Úxyz)rM   Úar   r   r   rO   ­   s    z0SidechainAngles.measureAngle.<locals>.<listcomp>T)ÚsitesÚdeg)Úextract_chi_atomsrT   Úi_seqÚscitbxÚmathÚdihedral_angle)r   rZ   r[   r\   r]   Ú
angleAtomsrk   rj   r   r   r   rb   ¥   s    
zSidechainAngles.measureAnglec             C   s®   d }|d krt |ƒ}n|}| j|j ¡  ¡ d |  }g }xn|D ]f}| d¡}d }	d}
x.|	d kr„|
t|ƒk r„| ||
 ¡}	|
d7 }
qXW |	d kr¢| | |	j	¡¡ q@d S q@W |S )Nr4   ú;r   r   )
ÚmakeAtomDictrA   r^   rP   r'   r&   ÚlenrQ   rT   Úname)r   rZ   r[   r\   ÚatomNamesMapZ	atomNamesrr   ÚatZnamelistZtestAtomÚjr   r   r   rm   µ   s"    


z!SidechainAngles.extract_chi_atoms)NN)N)N)r.   r/   r0   r?   r@   rA   rE   rF   rD   r>   r<   r   rS   rW   rX   rh   rb   rm   r   r   r   r   r1   )   s    0
 

r1   c             C   s$   i }x|   ¡ D ]}|||j< qW |S )N)Úatomsrv   )r[   rw   Úatomr   r   r   rt   Ê   s    rt   c             C   sÂ  t dƒ}g }|d k	rNt|tjƒr&|}n(t|tjƒrNt |  ¡ d¡}| |d¡ |d krft |  ¡ d¡}xT|  ¡ D ]F}x>| ¡ D ]0}x(| 	¡ D ]}x| 
¡ D ]}|j |j ¡ d¡}	yt|	ƒ}	W n tk
rä   w¨Y nX g }
| ¡ d  ¡ j}g }xTtd|	d ƒD ]B}| d| |¡}|d kr0n dd„ |D ƒ}|
 t||d¡ qW d}x|D ]}|| s`d}P q`W t|
ƒdkr¨|r¨t|j|j|| ¡ |
d	}| |¡ q¨W q–W q„W qrW |S )
NFTr   r   zchi%dc             S   s   g | ]
}|j ‘qS r   )rn   )rM   r{   r   r   r   rO   î   s    z0collect_sidechain_chi_angles.<locals>.<listcomp>)Úchi_idÚi_seqs)rR   Úchain_idÚaltlocÚresidÚchis)r1   Ú
isinstancer   ÚboolÚsize_tÚ
atoms_sizeÚset_selectedÚmodelsÚchainsÚ
conformersÚresiduesr?   rQ   r^   rP   rC   Ú
ValueErrorrz   Úfetch_labelsr   r	   rm   rT   r   ru   Úidr€   )Úpdb_hierarchyÚatom_selectionZangle_lookupÚresidue_chisÚactual_selectionÚmodelÚchainÚ	conformerÚresidueZn_chir   r   r}   rg   rz   Zatoms_in_selectionrn   Úresidue_infor   r   r   Úcollect_sidechain_chi_anglesÐ   sT    


r—   c             C   sâ  t jj}g }t| |d}|}|r$|S |d k	rft|tjƒr>|}n(t|tjƒrft |  ¡ d¡}| 	|d¡ |d kr~t |  ¡ d¡}d }d }xT|  
¡ D ]F}	x>|	 ¡ D ]0}
x(|
 ¡ D ]}xt| ¡ ƒD ] \}}||jƒdkræqÌ|t| ¡ ƒd k r| ¡ |d  }nd }g }d gd }|jdd|d	< |jd
d|d< |jdd|d< |d k	rz|jd
d|d< |jdd|d< |d k	r”|jdd|d< x<tt|ƒƒD ],}|| d k	r¢||| j s¢d ||< q¢W x²tdddgƒD ] \}}|||d …  d ¡dkrâtj || ||d  ||d	  ||d  ¡}|d k	râ|| j||d  j||d	  j||d  jg}| t||d¡ qâW | ¡ d  ¡ j}t|ƒdkrÊt|j|
j|| ¡ |d}| |¡ |}qÌW q¶W q¤W q’W |S )N)rŽ   r   FTrY   r   é   z N  )rv   é   z CA é   z C  é   r   é   ÚomegaÚphiÚpsi)r|   r}   )rR   r~   r   r€   r   )r_   r`   ra   r—   r‚   r   rƒ   r„   r…   r†   r‡   rˆ   r‰   Ú	enumeraterŠ   r^   ru   Zfind_atom_byr	   rn   Úcountr
   r   Úomega_from_atomsrT   r   rz   rŒ   r   r   r€   )rŽ   r   Zchi_angles_onlyre   Zresidue_torsionsr   r‘   Zprevious_residueZnext_residuer’   r“   r”   Zi_resr•   ZtorsionsZatoms_to_workrg   rv   rJ   r}   r   r–   r   r   r   Úcollect_residue_torsion_anglesÿ   s‚    






r£   )F)N)NF)Ú
__future__r   r   r   Úscitbx.mathro   Úlibtbx.utilsr   Úlibtbx.load_envr   r   Ú	iotbx.pdbr_   Úcctbx.array_familyr   Úmmtbx.rotamerr
   r#   r   Ú	six.movesr   r	   r   r   r1   rt   r—   r£   r   r   r   r   Ú<module>   s$   
 "
0 