B
    d/                 @   s   d dl mZmZmZ d dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlZG d	d
 d
eZG dd deZG dd deZG dd deZe ZG dd deZdS )    )absolute_importdivisionprint_function)flex)crystalsgtbx)
covariancegeometry)model)&format_float_with_standard_uncertainty)adopt_init_argsNc               @   s   e Zd ZdddZdS )distances_as_cif_loopNF缉ؗҬ<c             C   sT  ||g d dkstd}| }tj| d}| }|d k	rL||}tj	dd| _	t
j|||||d}x|D ]}|s||j dst||j drqt|jd k	r|j|
kr|	d k	r|j|jf|	ks|j|jf|	kst|jt|j}n
||j }||j}|dkrd	}| j	||j ||j ||f qtW |j| _|j| _|j| _d S )
N   z%.4f)group)Z_geom_bond_atom_site_label_1Z_geom_bond_atom_site_label_2Z_geom_bond_distanceZ_geom_bond_site_symmetry_2)header)covariance_matrixcell_covariance_matrixparameter_mapH1.)countAssertionErrorasu_mappingsr   space_group_infospace_group	unit_cellfractionalizer
   loopr   calculate_distancesi_seq
startswithj_seqvarianceformat_float_with_sudistancemathsqrtcif_symmetry_codert_mx_jiadd_row	distances	variancespair_counts)selfpair_asu_tablesite_labels
sites_frac
sites_cartr   r   r   include_bonds_to_hydrogenfixed_distancesepsfmtr   r   r   r,   dr&   sym_code r:   q/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/iotbx/cif/geometry.py__init__   sF    




 zdistances_as_cif_loop.__init__)NNNNNFNr   )__name__
__module____qualname__r<   r:   r:   r:   r;   r      s          r   c            	   @   s   e Zd ZdddZdS )angles_as_cif_loopNF缉ؗҬ<c          	   C   sv  ||g d dkstd}| }tj| d}| }|d k	rL||}tj	dd| _	t
j||||||
d}x|D ]}|j\}}}|s|| dsv|| drqv||j}||j}|dkrd	}|dkrd	}|jd k	r0|j|kr0|	d k	r|||f|	ks0|||f|	ks0t|jt|j}n
||j }| j	|| || || |||f qvW |j| _|j| _d S )
Nr   z%.1f)r   )Z_geom_angle_atom_site_label_1Z_geom_angle_atom_site_label_2Z_geom_angle_atom_site_label_3Z_geom_angleZ_geom_angle_site_symmetry_1Z_geom_angle_site_symmetry_3)r   )r   r   r   conformer_indicesr   r   r   )r   r   r   r   r   r   r   r   r
   r   r   calculate_anglesi_seqsr"   r)   r*   rt_mx_kir$   r%   angler'   r(   r+   anglesr-   )r/   r0   r1   r2   r3   r   r   r   r4   fixed_anglesrB   r6   r7   r   r   r   rG   ar!   r#   k_seqZsym_code_jiZsym_code_kirF   r:   r:   r;   r<   D   sR    


  

zangles_as_cif_loop.__init__)	NNNNNFNNrA   )r=   r>   r?   r<   r:   r:   r:   r;   r@   B   s           r@   c               @   s   e Zd ZdddZdS )dihedral_angles_as_cif_loopF缉ؗҬ<c             C   sJ  d}t jdd| _x0|D ]&}|j\}}	}
}|sl|| ds||	 ds||
 ds|| drlq||jd }||jd }||jd }||jd }|d	krd
}|d	krd
}|d	krd
}|d	krd
}|jd k	r
|j|kr
t|jt	
|j}n
||j }| j|| ||	 ||
 || |||||f	 qW d S )Nz%.1f)	Z_geom_torsion_atom_site_label_1Z_geom_torsion_atom_site_label_2Z_geom_torsion_atom_site_label_3Z_geom_torsion_atom_site_label_4Z_geom_torsionZ_geom_torsion_site_symmetry_1Z_geom_torsion_site_symmetry_2Z_geom_torsion_site_symmetry_3Z_geom_torsion_site_symmetry_4)r   r   r   r         r   r   )r
   r   rD   r"   r)   rt_mxsr$   r%   rF   r'   r(   r+   )r/   rG   r   r1   r4   r6   r7   rI   r!   r#   rJ   l_seqZ
sym_code_iZ
sym_code_jZ
sym_code_kZ
sym_code_lrF   r:   r:   r;   r<      sF    

    
z$dihedral_angles_as_cif_loop.__init__N)FrL   )r=   r>   r?   r<   r:   r:   r:   r;   rK      s    rK   c               @   s   e Zd ZdddZdS )hbondNc             C   s   t | t  d S )N)r   locals)r/   d_seqa_seqrt_mxr:   r:   r;   r<      s    zhbond.__init__)N)r=   r>   r?   r<   r:   r:   r:   r;   rQ      s   rQ   c            
   @   s&   e Zd ZdddZdd Zd	d
 ZdS )hbonds_as_cif_loopN   333333@缉ؗҬ<c             C   s6  ||g d dkstd}|}| }tj| d}| | _|| _|| _|d k	r`| j	|}|d k	rt| j
|}|d k	r|
d k	stt|| j|
| _nd | _|	| _|| _|
| _tjdd| _xl|D ]b}|j|j }}|| }|jd k	r|| }|j| }| j
|}n|| }t||f}x| |j  D ]\}}|| d dkr\q>|| }t||f}t||f}t|||f}|j|k s>|j|krq>|jd k	r||j}nd}| j|| || || | |||t | |||t | ||||j| !|||||j|f q>W qW d S )	Nr   z%.1f)r   )Z_geom_hbond_atom_site_label_DZ_geom_hbond_atom_site_label_HZ_geom_hbond_atom_site_label_AZ_geom_hbond_distance_DHZ_geom_hbond_distance_HAZ_geom_hbond_distance_DAZ_geom_hbond_angle_DHAZ_geom_hbond_site_symmetry_A)r   r   )r   Dr   )"r   r   r   r   r   r   r   r5   rH   r   orthogonalizer   orthogonalize_covariance_matrixcovariance_matrix_cartr   r6   r   r
   r   rS   rT   rU   r	   r&   tableitemsrF   angle_modeldistance_modelr)   r+   formatted_distanceunit_mxformatted_angle)r/   Zhbondsr0   r1   r2   r3   Zmin_dha_angleZmax_da_distancer   r   r   r6   r5   rH   Zfmt_ar   r   rQ   rS   rT   Zsite_cart_dZsite_frac_aZsite_cart_aZdistance_daZh_seqZh_sym_groupsZsite_cart_hZdistance_dhZdistance_haZ	angle_dhar9   r:   r:   r;   r<      sj    

	
zhbonds_as_cif_loop.__init__c             C   s   |d krt }| jd k	rtt||f| j| j}| jd k	rR||| j| j	|}n||| j	|}|| j
kr| jd k	r||f| jks||f| jkst|jt|S d|j S )Nz%.4f)rc   r]   r   #extract_covariance_matrix_for_sitesr   size_tr   r   r$   r   r6   r5   r%   ra   r'   r(   )r/   r!   r#   r&   r*   covvarr:   r:   r;   rb     s      

z%hbonds_as_cif_loop.formatted_distancec             C   s   |d krt }| jd k	rtt|||f| j| j}| jd k	rZ||| j| j	t t |f}n||| j	t t |f}|| j
kr| jd k	r|||f| jks|||f| jkst|jt|S d|j S )Nz%.1f)rc   r]   r   re   r   rf   r   r   r$   r   r6   rH   r%   r`   r'   r(   )r/   r!   r#   rJ   rF   rE   rg   rh   r:   r:   r;   rd     s      

z"hbonds_as_cif_loop.formatted_angle)
NNrW   rX   NNNrY   NN)r=   r>   r?   r<   rb   rd   r:   r:   r:   r;   rV      s            
BrV   )
__future__r   r   r   cctbx.array_familyr   cctbxr   r   r   r	   	iotbx.cifr
   libtbx.utilsr   r%   libtbxr   r'   objectr   r@   rK   rQ   rU   rc   rV   r:   r:   r:   r;   <module>   s   5>2