B
    d/e                 @   sv  d dl mZmZmZ d dlm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mZmZ d dlZd dlZd dlZd dlZG dd	 d	eZd
dgZg fddZeg fddZG dd deZd3ddZd4ddZd5ddZ G dd deZ!dd Z"dd Z#dd  Z$d!d" Z%d#d$ Z&d%d& Z'd6d'd(Z(d)d* Z)G d+d, d,eZ*G d-d. d.e+Z,G d/d0 d0e*Z-G d1d2 d2e*Z.dS )7    )absolute_importdivisionprint_function)	cif_typesN)(residue_name_plus_atom_names_interpreter)dicts)show_string)Sorryformat_exceptionwindows_device_namesc               @   s   e Zd ZdS )MonomerLibraryServerErrorN)__name__
__module____qualname__ r   r   {/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/mmtbx/monomer_library/server.pyr      s    r   ZMMTBX_CCP4_MONOMER_LIBZ	CLIBD_MONc             C   s.   | d k	r*t jj| f| }t j|r*|S d S )N)ospathjoinisfile)mon_lib_pathrelative_path_componentsZcif_pathr   r   r   load_mon_lib_file   s
    r   c             C   s   t tj| d d |d}|d k	r&|S dddddg}d|krD|  x.|D ]&}t tjj|d	|d}|d k	rJ|S qJW x6| d
d  D ]&}t tj|d |d}|d k	r|S qW d S )Nr   )r   r   zchem_data/geostdzchem_data/mon_libZmon_libgeostdzext_ref_files/mon_libzmon_lib_list.cif)relative_path   )r   r   environgetreverselibtbxenvfind_in_repositories)Zenv_varsr   resultZrelative_pathsr   env_varr   r   r   find_mon_lib_file   s4     
  r$   c               @   s   e Zd Zdg dfddZdS )mon_lib_cif_loaderNFc             C   sJ   || _ | j d kr8t|d| _ | j d kr8tddt t| j d| _d S )N)r   zTCannot find CCP4 monomer library. Please define one of these environment variables: z, )	file_name)r   r$   r   r   mon_lib_env_varsread_cifcif)selfr   r   strictr   r   r   __init__:   s    


zmon_lib_cif_loader.__init__)r   r   r   r,   r   r   r   r   r%   8   s   r%   Fc             C   s   t | ddg|dS )Nlistzmon_lib_list.cif)r   r   r+   )r%   )r   r+   r   r   r   mon_lib_list_cifJ   s    r.   c          
   C   s:   yt | ddg|dS  tk
r4 } zd S d }~X Y nX d S )Nr-   zgeostd_list.cif)r   r   r+   )r%   r   )r   r+   er   r   r   geostd_list_cifP   s    r0   c             C   s>   t | dg|d}|S  tk
r*   d }Y nX |r:t||}|S )Nzener_lib.cif)r   r   r+   zgeostd_ener_lib.cif)r%   r   merge_and_overwrite_cifs)r   r+   Zmon_lib_enerZgeostd_enerr   r   r   mon_lib_ener_lib_cifY   s         

r2   c               @   s$   e Zd Zdd Zdd Zdd ZdS )trivial_html_tag_filterc             C   s   t t|| _d S )N)iteropenf)r*   r&   r   r   r   r,   m   s    z trivial_html_tag_filter.__init__c             C   s$   xt | j}|d dkr|S qW d S )Nr   <)nextr6   )r*   r"   r   r   r   r8   p   s    
ztrivial_html_tag_filter.nextc             C   s   | S )Nr   )r*   r   r   r   __iter__v   s    z trivial_html_tag_filter.__iter__N)r   r   r   r,   r8   r9   r   r   r   r   r3   k   s   r3   c             C   s   t jj| dd S )NF)	file_pathr+   )iotbxr)   readermodel)r&   r   r   r   r(   y   s    r(   c          	   #   s  i }| |}	|	d k	rR|	 |}
|
d k	rRx(|
 D ]}|f t|}|||j< q2W x@t|D ]0\}}||r`|t|d  }|| |krq`| |}|d kr||d}d }x|D ]\ }| d  }|d kr*t fddt|D }t|dkrt||}tt	 }|
|f t| q|d kr>|| |}t||}tt	 }x&| D ]}|
|f t| q\W qW |d k	r`||_|V  q`W d S )N)id_c             3   s(   | ] \}}| d   r||fV  qdS )r?   N)
startswith).0kv)
loop_blockr   r   	<genexpr>   s    z%convert_list_block.<locals>.<genexpr>r   )r   iterrowsdictr>   six	iteritemsr@   lengetattrr   append
cif_object)source_inforM   	list_namelist_item_namedata_prefixcif_type_innercif_type_outerouter_mappingsZtabulated_itemsZ
list_blockZlist_item_blockrowZ	obj_innerkeycif_dataZitem_idZ	obj_outerZlst_namerowsdlsttypr   )rD   r   convert_list_block|   sF    	


 








r\   c             c   s>   x8t | |dddtjtjdddddd	d
gdD ]
}|V  q,W d S )NZ	comp_list
_chem_compZcomp_)Zchem_comp_atom	atom_list)Zchem_comp_bond	bond_list)Zchem_comp_angle
angle_list)Zchem_comp_tortor_list)Zchem_comp_chir	chir_list)Zchem_comp_plane_atomplane_atom_list)Zchem_comp_rotamer_infoZrotamer_info_phil_str_list)rN   rM   rO   rP   rQ   rR   rS   rT   )r\   r   	chem_compcomp_comp_id)rN   rM   re   r   r   r   convert_comp_list   s     rf   c             c   s:   x4t | |dddtjtjdddddgd	D ]
}|V  q(W d S )
N	link_listZ
_chem_linkZlink_)Zchem_link_bondr_   )Zchem_link_angler`   )Zchem_link_torra   )Zchem_link_chirrb   )Zchem_link_planeZ
plane_list)rN   rM   rO   rP   rQ   rR   rS   rT   )r\   r   	chem_linklink_link_id)rN   rM   ri   r   r   r   convert_link_list   s    rj   c             c   s<   x6t | |dddtjtjdddddd	gd
D ]
}|V  q*W d S )NZmod_listZ	_chem_modZmod_)Zchem_mod_atomr^   )Zchem_mod_bondr_   )Zchem_mod_angler`   )Zchem_mod_torra   )Zchem_mod_chirrb   )Zchem_mod_plane_atomrc   )rN   rM   rO   rP   rQ   rR   rS   rT   )r\   r   chem_mod
mod_mod_id)rN   rM   rl   r   r   r   convert_mod_list   s    rm   c             C   s8   |  |}|d krg S | |}|d k	r0| S g S d S )N)r   rF   )rM   	data_nameZ
table_namerW   tabler   r   r   get_rows   s    
 
 rp   c          
   C   s  |j }| d k	r| j }x|D ]}|| }||}|rbtd t| td t| td d}d}	|drvn|drd}	nd}|sd}|	rdd }
t| }|sqg }x6|D ]}|d	d
krq|d	d }||krq|| ||}||}|sq|r,tdd||df  x|	 D ]}|rvx.|D ]&}td|
d| d|| f  qFW t  xDt|	 D ]4\}}|
|||r|| |t|  qW q6W qW n&|st| }|sqg }x|D ]}|d	d
krq|d	d }||kr"q|| ||}||}|sJq|rdtdd||df  x`|	 D ]T}|rx.|D ]&}td|
d| d|| f  q~W t  |t|  qnW qW n"|rtdd  t| |||< |rtd t| td qW |S )NzP++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++zP--------------------------------------------------------------------------------FZ_listenergyTc             S   sp   ddgi}||kst || }d}x8| D ]0}||kr6q(||kr@q(| | || kr(|d7 }q(W |t|krldS dS )N	_lib_atomz_lib_atom.typer   r   TF)AssertionErrorrJ   )row1row2rV   Z
match_keysrB   countk1r   r   r   
_row_match   s    

    z,merge_and_overwrite_cifs.<locals>._row_match.r   z;
%s
  Merging rows to CIF
    block "%s"
      loop "%s
%s
z    %-20s : %sz%s. z:
%s
  Adding rows to CIF
    block "%s"
      loop "%s
%s
z#
%s
  Adding/replacing CIF block
%s)zP--------------------------------------------------------------------------------zP--------------------------------------------------------------------------------)r)   r   printendswithr-   keysfindsplitrL   rF   replace	enumerate
delete_rowadd_rowvalues)geostd_list_cif_objlist_cifverboseZmon_lib_cifZ
geostd_cifZgeostd_block_keyZgeostd_blockZmon_lib_blockZreplace_blockZmerge_blockrx   Zgeostd_loop_keysdoneZgeostd_loop_keyZgeostd_loopZmon_lib_looprt   rV   iru   rU   r   r   r   r1      s    



   


  


& 
 
 


  

 r1   c             C   sD   d}x2t | dD ] }|ddkr(q|d| 7 }qW t| d S )Nr{   
r?   rz   z%s
)strr   r   r|   )r)   outlliner   r   r   print_filtered_cif^  s    r   c               @   s    e Zd ZdddZdddZdS )	process_cif_mixinNTc             C   sz   |d krd }nd| }y| j |||d W nJ tk
r@    Y n6 tk
rt   |d krZd}tdt|t f Y nX d S )Nzfile: )rN   rM   cachez(file name not available)z&Error processing CIF file:
  %s
  (%s))convert_allKeyboardInterrupt	Exceptionr	   r   r
   )r*   rM   r&   r   rN   r   r   r   process_cif_objectj  s      z$process_cif_mixin.process_cif_objectc             C   sb   yt |d}W n> tk
r$    Y n* tk
rL   tdt|t f Y nX | j|||d d S )N)r&   z#Error reading CIF file:
  %s
  (%s))rM   r&   r   )r(   r   r   r	   r   r
   r   )r*   r&   r   rM   r   r   r   process_cif|  s      zprocess_cif_mixin.process_cif)NT)T)r   r   r   r   r   r   r   r   r   r   h  s   
r   c               @   s   e Zd Zdd ZdS )id_dictc             C   s6   t d|| || kr$t d ds$tt| || d S )NDICTzassert 0r   )r|   rs   rG   __setitem__)r*   rV   itemr   r   r   r     s
    zid_dict.__setitem__N)r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdddZdddZdd	 Zd
d Zdd Zd 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d ZdS )$serverNFc             C   s   |d krt  }|d kr&t }t||}tjtj|j| _tjtj| jd| _i | _	i | _
tt| _i | _g | _i | _g | _i | _| jd|j |jdd i | _|   d S )Nr   zfile: T)rN   rM   skip_comp_list)r.   r0   r1   r   r   dirname	root_pathr   geostd_pathderiv_list_dictcomp_synonym_list_dictr   with_default_factoryrG   comp_synonym_atom_list_dictcomp_comp_id_dictlink_link_id_listlink_link_id_dictmod_mod_id_listmod_mod_id_dictr   r)   comp_comp_id_mod_dictprocess_geostd_rna_dna)r*   r   Zanother_list_cifr   r   r   r   r   r,     s*    zserver.__init__Tc             C   sX   | j |d | j|d | j|d |s8| j|||d | j||d | j||d d S )N)rM   )rN   rM   r   )rN   rM   )convert_deriv_list_dictconvert_comp_synonym_listconvert_comp_synonym_atom_listrf   rj   rm   )r*   rN   rM   r   r   r   r   r   r     s    
zserver.convert_allc             C   s6   x0t |ddD ] }tjf t|}|| j|j< qW d S )NZ
deriv_listZ_chem_comp_deriv)rp   r   Zchem_comp_derivrG   r   comp_id)r*   rM   rU   derivr   r   r   r     s    zserver.convert_deriv_list_dictc             C   s,   x&t |ddD ]}|d | j|d < qW d S )NZcomp_synonym_listZ_chem_comp_synonymz_chem_comp_synonym.comp_idz&_chem_comp_synonym.comp_alternative_id)rp   r   )r*   rM   rU   r   r   r   r     s    z server.convert_comp_synonym_listc             C   sd   x^t |ddD ]N}tjf t|}| j|j }|j||j< |jdkr| j|j }|j||j< qW d S )NZcomp_synonym_atom_listZ_chem_comp_synonym_atomr{   )	rp   r   Zchem_comp_synonym_atomrG   r   r   atom_idZatom_alternative_idZcomp_alternative_id)r*   rM   rU   ZsynonymrY   r   r   r   r     s    
z%server.convert_comp_synonym_atom_listc             C   s@   x:t ||dD ]*}|  |j}|r|| j|j  < qW d S )N)rN   rM   )rf   normalize_atom_ids_in_placerd   r   r>   stripupper)r*   rN   rM   r   re   rd   r   r   r   rf     s    zserver.convert_comp_listc             C   s4   x.t ||dD ]}| j| || j|jj< qW d S )N)rN   rM   )rj   r   rL   r   rh   r>   )r*   rN   rM   ri   r   r   r   rj     s    zserver.convert_link_listc             C   s4   x.t ||dD ]}| j| || j|jj< qW d S )N)rN   rM   )rm   r   rL   r   rk   r>   )r*   rN   rM   rl   r   r   r   rm     s    zserver.convert_mod_listc             C   s>   t j| jsd S x&dD ]}| jt j| jd|d qW d S )N)zchain_link_rna2p.cifzchain_link_rna3p.cifzmod_rna2p.cifzmod_rna3p.cifzmod_rna2p_pur.cifzmod_rna3p_pur.cifzmod_rna2p_pyr.cifzmod_rna3p_pyr.cifrna_dna)r&   )r   r   isdirr   r   r   )r*   r&   r   r   r   r     s
     
	zserver.process_geostd_rna_dnac                s,       t dkrd S d }d }|r.|}n|d k	r|dkrDd}n4|dkrVd| }n"|dkrhd| }ndsxtd| d	  |f }tjj d  |}tj	|r|}qd S nj
 }|d k	r|S j d    fd
d}	|d kr|	 }|d krd S d}
|r$d}
|r.|S j||
d tdkrXj
}nd }|d k	rr|j
 < n|rt|d}x*tt||dD ]\}}|  |}qW |dkst|S j
 }|d k	rtdkr(|j
< n8d}tdkrdt }tdt|t |f |S )Nr   )Zneutralr{   )lowhighz_pH_%s)neutronz_%szunknown pH value : %szdata_%s%s.cifc                 s  xdD ]} x gD ]}t |dkr.qtjj|d  }tj|rd| }| dkrtj||g}x|D ]}tj|rz|S qzW nr| }xht|D ]Z}| |krqt	d| t	d|  t	| t	t| t	d| dst
tj||S W tjj|d  }tj|r|tkrBd||f }n|d }| dkrvtj||}tj|r|S q| }x0t|D ]"}| |krqtj||S W qW qW d S )	N)r   r   r   zdata_%s.cifnodeZ<i_passi_passi_passi_passi_passi_passi_passi_passi_passi_passcif_namez	%s_%s.cifz.cif)rJ   r   r   r   r   lowerr   r   listdirr|   rs   r   r   )Zi_passZtrial_comp_iddir_namer   
file_namesr&   r   )r   r*   std_comp_idr   r   	find_file  sL     

 




 z1server.get_comp_comp_id_direct.<locals>.find_fileTF)r&   r   )r&   )rN   rM   zor %sz4Monomer library file %s does not define comp_id %s%s)r   r   rJ   rs   r   r   r   r   r   existsr   r   r   r   r(   r   rf   r   r   r	   )r*   r   ZpH_rangespecific_residue_restraintsZreturn_filenamer"   r&   rrZrr_cif_namer   r   rM   Zi_comp_compre   Zor_std_comp_idr   )r   r*   r   r   get_comp_comp_id_direct  s|      



)
 
  



zserver.get_comp_comp_id_directc             C   sj   t |||dd}|jd krdS t|jdd }|d k	rT| j|d k	rT| j|dd fS | j|j|d|jfS )NT)residue_name
atom_names#translate_cns_dna_rna_residue_namesreturn_mon_lib_dna_name)NNd_aa_residue_name)r   )r   r   )r   work_residue_namerK   atom_name_interpretationr   r   r   )r*   r   r   r   r   rnpanid_aa_rnr   r   r   -get_comp_comp_id_and_atom_name_interpretationh  s     
 z4server.get_comp_comp_id_and_atom_name_interpretationc             C   s(   | j |d}|d krd S |j|||dS )N)r   )r   
sites_cartfine_sampling)r   rotamer_iterator)r*   r   r   r   r   re   r   r   r   r     s    zserver.rotamer_iteratorc       	      C   sx   d |jjf| }| j|}|d krt|}g }x0|D ](}| j| }|j|d}||jj q6W ||f}|| j|< |S )N%)mod)	r   rd   r>   r   r   r   	apply_modrL   rk   )	r*   re   Zmod_idsrV   r"   Zmod_comp_comp_idZchem_mod_idsZmod_idrl   r   r   r   get_comp_comp_id_mod  s    


zserver.get_comp_comp_id_mod)NNF)FT)T)NNF)NN)F)r   r   r   r,   r   r   r   r   rf   rj   rm   r   r   r   r   r   r   r   r   r   r     s"   
 


  
r 

	r   c               @   s:   e Zd ZdddZdddZdd	 Zdd
dZdd ZdS )ener_libNFc             C   s<   |d krt  }i | _i | _g | _| j||j|d g | _d S )N)rN   rM   use_neutron_distances)r2   lib_synonymlib_atomlib_vdwr   r)   source_infos)r*   Zener_lib_cifrN   r   r   r   r   r,     s    zener_lib.__init__Tc             C   s>   |d k	r| j | | j|d | j||d | j|d d S )N)rM   )rM   r   )r   rL   convert_lib_synonymconvert_lib_atomconvert_lib_vdw)r*   rN   rM   r   r   r   r   r   r     s    zener_lib.convert_allc             C   s8   x2t |ddD ]"}tjf t|}|j| j|j< qW d S )Nrq   Z_lib_synonym)rp   r   Zenergy_lib_synonymrG   	atom_typer   Zatom_alternative_type)r*   rM   rU   Zsynr   r   r   r     s    zener_lib.convert_lib_synonymc             C   sL   xFt |ddD ]6}tjf t|}|r8|jd k	r8|j|_|| j|j< qW d S )Nrq   rr   )rp   r   Zenergy_lib_atomrG   Zvdw_radius_neutronZ
vdw_radiusr   type)r*   rM   r   rU   entryr   r   r   r     s    
zener_lib.convert_lib_atomc             C   s6   x0t |ddD ] }tjf t|}| j| qW d S )Nrq   Z_lib_vdw)rp   r   Zenergy_lib_vdwrG   r   rL   )r*   rM   rU   Zvdwr   r   r   r     s    zener_lib.convert_lib_vdw)NNF)FT)F)r   r   r   r,   r   r   r   r   r   r   r   r   r     s     
 


r   )NF)NF)NF)F)/
__future__r   r   r   Zmmtbx.monomer_libraryr   	iotbx.cifr;   	iotbx.pdbr   scitbx.python_utilsr   libtbx.str_utilsr   libtbx.utilsr	   r
   r   libtbx.load_envr   libtbx.pathr   rH   RuntimeErrorr   r'   r   r$   objectr%   r.   r0   r2   r3   r(   r\   rf   rj   rm   rp   r1   r   r   rG   r   r   r   r   r   r   r   <module>   sD   

	
-
w
!  