B
    §d-'  ã               @   s€   d dl mZmZmZ d dlmZ d dlmZ d dlmZ G dd„ de	ƒZ
G dd„ de	ƒZd	d
„ Zdd„ Zedkr|eƒ  eƒ  dS )é    )Úabsolute_importÚdivisionÚprint_function)Úsgtbx)Úrange)Úzipc               @   s.   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ ZdS )Úfind_best_cellNTc             C   s¢  |d krd}g | _ | ¡  ¡  ¡ }|dkrT| ¡ | _| | j¡| _| j  | j¡ d S |dk sd|dkr†t	 
¡ | _|| _| j  | j¡ d S t	j|dd}| ¡  ¡  ¡ }| ¡  ¡ }| ¡ | }| ¡  |¡| ¡ ksÖt‚t	 
¡ }	|}
|dkrt	 | ¡ dƒ ¡ ¡}t| ¡ ƒdkst‚t| ¡ ƒ}| d¡dks8t‚| d¡}t	 | ¡ ¡}x®| ¡ D ]¢}t	 
|¡ |	¡}| |¡}| ¡ | ¡ krZ|rÄ|dkrÄ| ¡  ¡ }| ¡ sÄ| |¡ | |¡}| j  |¡ |
 ¡ j| ¡ ||d	}|dkrZ|}	|}
qZW nt|ƒ  d
¡rt‚t	 d¡ |¡}xj|D ]b}t	 
|¡ |	¡}| |¡}| ¡ | ¡ kr,| j  |¡ |
 ¡  !| ¡ ¡}|dkr,|}	|}
q,W |	| _|
| _d S )Né   é   éK   ZA1983)ÚsymbolÚtable_idé   é   r   )ÚotherÚunique_axisÚangular_tolerancez:2zP 4 3*)"Ú
_all_cellsÚspace_group_infoÚtypeÚnumberÚ!change_of_basis_op_to_niggli_cellÚ_cb_opÚchange_basisÚ	_symmetryÚappendr   Úchange_of_basis_opÚcb_opÚinverseÚgroupÚspace_groupÚAssertionErrorÚrot_mx_infoÚrÚabsÚlistÚevÚcountÚindexÚfind_affineÚcb_mxÚnew_denominatorsÚ	unit_cellÚ+change_of_basis_op_for_best_monoclinic_betaÚis_identity_opÚupdateÚcompare_monoclinicÚstrÚendswithÚcompare_orthorhombic)ÚselfÚinput_symmetryr   Úbest_monoclinic_betaÚspace_group_numberZstandard_infoZcb_op_inp_refZcb_op_std_refZcb_op_std_inpÚ
best_cb_opZbest_symmetryZtwo_fold_infor&   r   Zaffiner*   r   Zalt_symmetryZcb_op_best_betaZ
cmp_resultZaffine_groupZaffine_s© r9   ú{/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/cctbx/crystal/find_best_cell.pyÚ__init__	   s~    















zfind_best_cell.__init__c             C   s   | j S )N)r   )r4   r9   r9   r:   r   O   s    zfind_best_cell.cb_opc             C   s   | j S )N)r   )r4   r9   r9   r:   ÚsymmetryR   s    zfind_best_cell.symmetryc             C   s   | j S )N)r   )r4   r9   r9   r:   Ú	all_cellsU   s    zfind_best_cell.all_cells)NT)Ú__name__Ú
__module__Ú__qualname__r;   r   r<   r=   r9   r9   r9   r:   r      s
    
Cr   c               @   s>   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )Úalternative_find_best_cellc             C   sö  ddl m} || _|j| j|d| _tj|d| _| j ¡  	¡ | _	d | _
t d¡| _| j ¡ }| j |¡| _| j ¡ | _| j |¡| _|| j | _t d¡t d¡t d¡t d¡t d	¡t d
¡g| _ddddd d g}t d¡g| _t d¡g| _d }t d¡ ¡  ¡ }x|t| jdd … |dd … ƒD ]\\}}	| j |¡}
|
 ¡  	¡ }|
 ¡  ¡  ¡ }||kr(| j |¡ | j |
 ¡ ¡ |	}q(W |g| _|  ||¡g| _xH| jdd … D ]6}| j |¡ ¡ }| j |¡ | j |  ||¡¡ q°W |  ¡  d S )Nr   )Úcrystal)r    )r   zx,y,zz-x,z,yzy,x,-zzz,-y,xzz,x,yzy,z,xÚAllr   r
   )ÚcctbxrB   r,   r<   Úxsr   r   Zsg_infor   Úhall_symbolÚ	best_cellr   r8   Ú'change_of_basis_op_to_reference_settingr   Zaxes_permutÚallowed_cb_opsÚallowed_cb_ops_to_refÚcr#   r   r   Zunit_cell_arrayÚorder_checkÚorder_check_arrayÚfind_it)r4   r,   r    rB   ÚtmpÚ	fix_flagsZfixed_elementÚidentity_opr   ÚfixedZsg_newZsg_new_hall_symbolZcp_op_to_ref_rotational_partZtmp_ucr9   r9   r:   r;   b   sN    


z#alternative_find_best_cell.__init__Nc             C   s°   d}|  ¡ d |  ¡ d |  ¡ d g}|d krT|d |d kr¬|d |d kr¬d}nX|dks`t‚|dkslt‚g }x&tdƒD ]}||krz| || ¡ qzW |d |d kr¬d}|S )NFr   r
   r   Tr	   )Ú
parametersr!   r   r   )r4   r,   rR   Zprefered_orderÚabcZtmp_abcÚiir9   r9   r:   rL   ­   s"    

z&alternative_find_best_cell.order_checkc             C   sª   | j  d¡}d }|dkr&| j  d¡}n.x,t| j tt| j ƒƒƒD ]\}}|r>|}P q>W |d kr`d}| j| | j|  | j | _| j	 
| j| | j|  ¡| _| j ¡ | _d S )NTr
   r   )rM   r'   r(   r   r   ÚlenrJ   rI   r8   rE   r   Úbest_xsr,   rG   )r4   Zn_trueZ
best_indexÚorderrU   r9   r9   r:   rN   Ã   s    
z"alternative_find_best_cell.find_itc             C   s   | j S )N)rG   )r4   r9   r9   r:   Úreturn_best_cellÛ   s    z+alternative_find_best_cell.return_best_cellc             C   s   | j S )N)r8   )r4   r9   r9   r:   Ú&return_change_of_basis_op_to_best_cellÞ   s    zAalternative_find_best_cell.return_change_of_basis_op_to_best_cellc             C   s   | j S )N)rW   )r4   r9   r9   r:   Úreturn_best_xsá   s    z)alternative_find_best_cell.return_best_xs)N)	r>   r?   r@   r;   rL   rN   rY   rZ   r[   r9   r9   r9   r:   rA   a   s   K
rA   c              C   s¶   ddl m}  t d¡}xštddƒD ]Œ}tj|d}|jdd}| j||d	 |¡}t	| 
¡ | ¡ ƒ}td
|ƒ td| ¡  ¡ ƒ td| ¡  ¡ ƒ tdt|jƒƒ tƒ  tƒ  q"W d S )Nr   )rB   zx,y,zr
   éç   )r   iè  )Úvolume)r,   r   zSpace group : zUnit cell   : zcb op       : zN cb op     : )rD   rB   r   r   r   r   Úany_compatible_unit_cellr<   r   rA   r,   r   ÚprintrY   rS   rZ   Úas_xyzrV   rI   )rB   r   r7   ÚsgiÚucrE   Zabestr9   r9   r:   Úexercise_alternativeå   s    


rc   c              C   s²   ddl m}  t d¡}x–dgttddƒƒ D ]~}tj|d}|jdd	}| j||d
 	|¡}t
|dd}| ¡  ¡  t| ¡  ¡ ƒ t| ¡  ¡ ƒ tt| ¡ ƒƒ tƒ  q,W d S )Nr   )rB   zy,z,xr
   r	   éI   )r   iè  )r]   )r,   r   )r   )rD   rB   r   r   r%   r   r   r^   r<   r   r   Úshow_summaryr_   r   r`   rK   rV   r=   )rB   r   r7   ra   rb   rE   Úbestr9   r9   r:   Úexerciseø   s    
rg   Ú__main__N)Ú
__future__r   r   r   rD   r   Ú	six.movesr   r   Úobjectr   rA   rc   rg   r>   r9   r9   r9   r:   Ú<module>   s   Z 