B
    §dï  ã               @   s†   d dl mZmZmZ d dlmZ ejZejZ	dd„ Z
d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ G d
d„ dƒZdS )é    )Úabsolute_importÚdivisionÚprint_function)Úsgtbxc             C   s   t j| d ¡  dd¡ ¡ S )N)ÚgroupT)r   Úspace_group_infoÚtypeÚ.expand_addl_generators_of_euclidean_normalizerÚbuild_derived_acentric_group)r   © r   ú{/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/cctbx/sgtbx/lattice_symmetry.pyÚmetric_supergroup   s    r   )Úadopt_init_args)Ú	subgroups)Úflex)Úcrystal)Úbravais_typesÚchange_of_basis_opc               @   sN   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )Úmetric_subgroupsTc             C   s.   t | tƒ ƒ g | _|  ¡  | j|  ¡ d d S )N)Úgroup_of_interest)r   ÚlocalsÚresult_groupsÚchange_input_to_minimum_cellÚderive_result_group_listÚlattice_group_info)ÚselfÚinput_symmetryÚ	max_deltaÚ)enforce_max_delta_for_generated_two_foldsÚbravais_types_onlyÚbest_monoclinic_betar   r   r   Ú__init__   s    zmetric_subgroups.__init__c             C   s    | j  ¡ | _| j  | j¡| _d S )N)r   Ú"change_of_basis_op_to_minimum_cellÚcb_op_inp_minimumÚchange_basisÚminimum_symmetry)r   r   r   r   r      s    z-metric_subgroups.change_input_to_minimum_cellc             C   s&   t j| j ¡ | j| jd}t j|dS )N)r   r   )r   )r   Úlattice_symmetry_groupr%   Ú	unit_cellr   r   r   )r   Úlattice_groupr   r   r   r   &   s
    
z#metric_subgroups.lattice_group_infoc             C   s$  t   |¡ ¡ }t ¡ }xP|D ]H}| ¡ }t |d¡ ¡ }d|  krLdksRn t‚| 	|d | ¡ qW t 
|d¡}x¨|D ]ž}|| }	t|	ƒ}
t |	¡}| t d¡¡ tj| j ¡ |dd}tj| j ¡ |
dd}| ¡  ¡  ¡ }| |¡}| jrt| ¡ ƒtjkrq||  |¡}| |¡}tt|ƒdd	d	d
}tt|ƒdd	d	d
}tt| jƒdd	d	d
| _|| | j }| ¡  | j ¡ ¡rô|  ¡ }y| |¡}W n: t!k
rØ } zt|ƒ "d¡dk rÈ‚ W d d }~X Y nX | ¡ | ¡ krô|| }| j# 	|||||t$| j ¡ |
ddœ¡ q|W d S )NFé   éæ   iè  T)r   r   r   )r'   Úspace_groupÚassert_is_compatible_unit_cellÚ é   )Z
stop_charsÚr_denÚt_denz.Unsuitable value for rational rotation matrix.r   )Úreduced_cellr+   )ÚsubsymÚsupersymÚ
ref_subsymÚbest_subsymÚcb_op_inp_bestÚmax_angular_difference)%r   Zgroups_parent_settingr   ÚdoubleÚorder_zr   Úspace_group_typeÚnumberÚAssertionErrorÚappendÚsort_permutationr   r+   Ú
expand_invÚtr_vecr   Úsymmetryr%   r'   r   r   Úcb_opr$   r   Ústrr   ÚcentricÚchange_of_basis_op_to_best_cellr   r#   Úis_similar_tor   ÚinverseÚRuntimeErrorÚfindr   Úfind_max_delta)r   r   ZsubgrsZsort_valuesr   r9   Úspace_group_numberÚpermZi_subgrZacentric_subgroupZacentric_supergroupZcentric_groupr2   r3   Zcb_op_minimum_refr4   Zcb_op_best_cellr5   r6   Z
cb_op_corrZbest_subsym_corrÚer   r   r   r   /   sb    




z)metric_subgroups.derive_result_group_listc             C   s   |j | jdS )N)r    )rE   r    )r   r4   r   r   r   rE   r   s    z0metric_subgroups.change_of_basis_op_to_best_cellc             C   sZ   t ƒ  t dƒ t dƒ t ƒ  | j ¡  t ƒ  t d| j ƒ t ƒ  t dƒ t dƒ t ƒ  d S )NZInputz=====zAngular tolerance: %.3f degreeszSimilar symmetriesz==================)Úprintr   Úshow_summaryr   )r   r   r   r   Ú
show_inputv   s    
zmetric_subgroups.show_inputc             C   sª   x¤| j D ]š}|d  ¡ jdd td| j ¡ ƒ td|d  ¡ ƒ |d  ¡ jdd td|d  ¡ ƒ td	|d
  ¡ ƒ td|d
  ¡ ƒ td|d  ƒ tƒ  qW d S )Nr2   z"Symmetry in minimum-lengths cell: )Úprefixz!      Input minimum-lengths cell:z!           Symmetry-adapted cell:r5   z"            Conventional setting: z!                       Unit cell:z!                 Change of basis:r6   z!                         Inverse:z.      Maximal angular difference: %.3f degreesr7   )r   r   rO   rN   r%   r'   ÚcÚc_inv)r   Úitemr   r   r   Úshow_groupsƒ   s    zmetric_subgroups.show_groupsc             C   s   |   ¡  |  ¡  d S )N)rP   rU   )r   r   r   r   Úshow“   s    zmetric_subgroups.showN)TTT)Ú__name__Ú
__module__Ú__qualname__r!   r   r   r   rE   rP   rU   rV   r   r   r   r   r      s     
	Cr   N)Ú
__future__r   r   r   Úcctbxr   r&   r   Úlattice_symmetry_find_max_deltarJ   r   Úlibtbxr   Úcctbx.sgtbxr   Úscitbx.array_familyr   r   r   r   r   r   r   r   r   Ú<module>   s   