B
    dg:                 @   s  d dl mZmZmZ d dlZd dlZd dlm	  m
Z d dlmZ edZd dlT d dlmZ d dlZG dd dejZd	d
 Zeejjd eejjd eejjd eejjd eejjd eejG dd dZdddZdddZG dd deZdd Z dS )    )absolute_importdivisionprint_functionN)zipcctbx_uctbx_ext)*)matrixc               @   s   e Zd ZdZdddZdS )	unit_cella  
  Class for the handling of unit cell information.

  All angles are in degrees.

  The PDB convention for orthogonalization and fractionalization
  of coordinates is used:

  | Crystallographic Basis: D = {a,b,c}
  | Cartesian Basis:        C = {i,j,k}
  | i parallel to a
  | j is in (a,b) plane
  | k = i x j

  :param parameters: A list, tuple or string of unit cell parameters.
  :param metrical_matrix: Metrical matrix. See also
                          :py:meth:`metrical_matrix`.
  :param orthogonalization_matrix: Orthogonalization matrix. See also
                          :py:meth:`orthogonalization_matrix`.

  :returns: None
  :rtype: None
  Nc             C   s   |||g d dkst|d k	rVt|trDdd |dd D }tjj| |d nD|d k	rptjj| |d n*|d k	rtjj| |d ntjj| g d d S )	N   c             S   s   g | ]}t |qS  )float).0pr   r   s/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/cctbx/uctbx/__init__.py
<listcomp>-   s    z&unit_cell.__init__.<locals>.<listcomp>, )
parameters)metrical_matrix)orthogonalization_matrix)	countAssertionError
isinstancestrreplacesplitextr	   __init__)selfr   r   r   r   r   r   r   &   s    



zunit_cell.__init__)NNN)__name__
__module____qualname____doc__r   r   r   r   r   r	      s     r	   c             C   s,   y
|| _ W n tk
r&   || j_ Y nX d S )N)r"   AttributeError__func__)objstringr   r   r   update_docstring9   s    
r'   a?  
Access to the metrical matrix:

.. math::
   \begin{pmatrix}
     a^2                & a b \cos(\gamma) & a c \cos(\beta)  \\
     a b \cos(\gamma) & b^2                & b c \cos(\alpha) \\
     a c \cos(\beta)  & b c \cos(\alpha) & c^2                \\
   \end{pmatrix}

:returns: the metrical matrix
:rtype: tuple
z
Matrix for the conversion of fractional to Cartesian coordinates:

.. math::
  \mathbf{x}_\textrm{Cartesian} = \mathbf{O} \mathbf{x}_\textrm{fractional}

:returns: the orthogonalization matrix
:rtype: tuple
z
Matrix for the conversion of fractional to Cartesian coordinates:

.. math::
  \mathbf{x}_\textrm{fractional} = \mathbf{F} \mathbf{x}_\textrm{Cartesian}

:returns: the fractionalization matrix
:rtype: tuple
a:  
Conversion of fractional coordinates to Cartesian coordinates.

:param sites_frac: The fractional coordinates.
                   Either coordinates for a single site (3-tuple) or a
                   flex.vec3_double array of coordinates.

:returns: the Cartesian coordinates
:rtype: 3-tuple or flex.vec3_double
a:  
Conversion of Cartesian coordinates to fractional coordinates.

:param sites_cart: The Cartesian coordinates.
                   Either coordinates for a single site (3-tuple) or a
                   flex.vec3_double array of coordinates.

:returns: the fractional coordinates
:rtype: 3-tuple or flex.vec3_double
c            
   @   s   e Zd Zdd Zdd Zd/ddZd0d
dZd1ddZd2ddZdd Z	d3ddZ
d4ddZd5ddZd6ddZd7ddZd8ddZd9dd Zd:d#d$Zd;d%d&Zd'd( Zd<d)d*Zd=d-d.ZeZdS )>_c             C   s
   t | dS )Nz0({:.6g}, {:.6g}, {:.6g}, {:.6g}, {:.6g}, {:.6g}))format)r   r   r   r   __str__z   s    z	_.__str__c             C   s
   t | dS )Nz)uctbx.unit_cell(({}, {}, {}, {}, {}, {})))r)   )r   r   r   r   __repr__}   s    z
_.__repr__0({:.6g}, {:.6g}, {:.6g}, {:.6g}, {:.6g}, {:.6g})c             C   s   |j |   S )N)r)   r   )r   format_specr   r   r   
__format__   s    z_.__format__NUnit cell: c             C   s&   |d krt j}t|t|  |d d S )N)file)sysstdoutprintr   )r   fprefixr   r   r   show_parameters   s     z_.show_parametersMbP?c             C   s`   |   }t|d |d  |kr$dS dddg}x,dD ]$}t|| ||d   |kr4dS q4W dS )	Nr      FZ   x   )         r;   T)r   abs)r   absolute_length_toleranceabsolute_angle_tolerancer   Zideal_anglesir   r   r   is_conventional_hexagonal_basis   s    

z!_.is_conventional_hexagonal_basisc             C   s`   |   }x(dD ] }t|d ||  |krdS qW x(dD ] }t|d ||  |kr8dS q8W dS )N)r8   r
   r   F)r<   r=   r;   T)r   r>   )r   r?   r@   r   jr   r   r   "is_conventional_rhombohedral_basis   s    

z$_.is_conventional_rhombohedral_basisc             C   s   t | ||dS )N)r	   site_frac_1site_frac_2)distance_mod_1)r   rE   rF   r   r   r   rG      s    z_.distance_mod_1c             C   s2   |d krd}|d krd}|d kr$d}t | |||S )Nd      r
   )Zfast_minimum_reduction)r   iteration_limit"multiplier_significant_change_testmin_n_no_significant_changer   r   r   minimum_reduction   s    z_.minimum_reductionc             C   s   |  ||| S )N)rM   as_unit_cell)r   rJ   rK   rL   r   r   r   minimum_cell   s    z_.minimum_cellc             C   s   ddl m} || | S )Nr   )gruber_parameterization)cctbx.uctbx.reduction_baserP   is_buerger_cell)r   relative_epsilonrP   r   r   r   rR      s    z_.is_buerger_cellc             C   s   ddl m} || | S )Nr   )rP   )rQ   rP   is_niggli_cell)r   rS   rP   r   r   r   rT      s    z_.is_niggli_cellc             C   s   ddl m} || ||S )Nr   )krivy_gruber_1976)Zcctbx.uctbxrU   	reduction)r   rS   rJ   rU   r   r   r   niggli_reduction   s    z_.niggli_reductionc             C   s   |  || S )N)rW   rN   )r   rS   rJ   r   r   r   niggli_cell   s    z_.niggli_cellc             C   s   |  || S )N)rW   change_of_basis_op)r   rS   rJ   r   r   r   !change_of_basis_op_to_niggli_cell   s    z#_.change_of_basis_op_to_niggli_cellr;   Tc             C   s   ddl m} |j| ||dS )Nr   )sgtbx)reduced_cell	max_delta)enforce_max_delta_for_generated_two_folds)cctbxr[   lattice_symmetry_group)r   r]   r^   r[   r   r   r   r`      s
    z_.lattice_symmetry_groupc             C   sf   |   }| |}|j|d}ddlm} |j|| d}ddlm}	 |	j|||d}
|
|	 S )N)r]   r   )crystal)r	   space_group_info)miller)crystal_symmetryanomalous_flagd_min)
rZ   change_basisr`   r_   ra   symmetryinforc   	build_setinverse)r   re   rf   lattice_symmetry_max_deltacb_oprX   lattice_groupra   Zniggli_lattice_symmetryrc   Zniggli_lattice_setr   r   r   )complete_miller_set_with_lattice_symmetry   s    
z+_.complete_miller_set_with_lattice_symmetryc                s<   ddl m   j|  fdddD djt|d  S )Nr   )direct_space_asuc                s   g | ]} j |d dqS )r   )nc)Zfloat_cut_plane)r   rq   )rp   r   r   r      s   z(_.buffer_shifts_frac.<locals>.<listcomp>))r   r   )r   rs   r   )r   r   rs   )r	   Zcuts)Z	thickness)cctbx.crystalrp   Z	float_asuZ
add_bufferr   Zshape_verticesmax)r   bufferr   )rp   r   buffer_shifts_frac   s    
z_.buffer_shifts_fracc             C   s   ||g d dkst|d kr<| dks.t| j|d}n| dksLt~|d ks^|dkrn| | fS | |  }}~| j|d}tdd t||D tdd t||D fS )Nr8   r   )
sites_cart)rv   c             S   s   g | ]\}}|| qS r   r   )r   sbr   r   r   r     s    z+_.box_frac_around_sites.<locals>.<listcomp>c             S   s   g | ]\}}|| qS r   r   )r   ry   rz   r   r   r   r     s    )	r   r   sizefractionalizeminru   rw   tupler   )r   rx   
sites_fracrv   Zs_minZs_maxZshifts_fracr   r   r   box_frac_around_sites   s    z_.box_frac_around_sites2   Fc             C   s   ||g d dkst||||||g d dks4tddlm} |}|d krP|}|d k	rb||}|d k	r|| |||	|
S |d k	r||}|d k	r|| |}|d k	r|	| |}|d k	st|
|||	|
S )Nr8   r=   r   )adptbx)r   r   r_   r   u_as_bZdebye_waller_factor_b_isostol_sqZb_as_uZu_cart_as_u_starZu_cif_as_u_starZdebye_waller_factor_u_star)r   miller_indexmiller_indicesu_isob_isou_cartb_cartu_cifu_starexp_arg_limittruncate_exp_argr   hr   r   r   debye_waller_factors
  s*     


z_.debye_waller_factors)r,   )Nr/   )r7   r7   )r7   r7   )NNN)NNN)N)N)NN)NN)NN)r;   T)r;   )NNN)
NNNNNNNNr   F)r   r    r!   r*   r+   r.   r6   rB   rD   rG   rM   rO   rR   rT   rW   rX   rZ   r`   ro   rw   r   r   Zdebye_waller_factorr   r   r   r   r(   w   sP   

 
 

  
  



 
 
 


  
         
r(         ?c             C   s0   t |t |  }tt|}|dkr,|}|S )Nr   )r   colru   list)sites_cart_minsites_cart_maxdefault_buffer_layer
sites_spanbuffer_layerr   r   r   !non_crystallographic_buffer_layer,  s
    r   c                s   | d k|d kk	st |d k|d kks(t | d k	r@|  }|  }|d krVt|||d}t|t| }t fdd|t|gd d  D S )N)r   r   r   c                s   g | ]}t  |qS r   )ru   )r   Zunit_cell_length)min_unit_cell_lengthr   r   r   H  s   z2non_crystallographic_unit_cell.<locals>.<listcomp>r;   r
   )r   r}   ru   r   r   r   r	   )rx   r   r   r   r   r   r   r   )r   r   non_crystallographic_unit_cell6  s    r   c               @   s&   e Zd Zd
ddZdd Zdd	 ZdS );non_crystallographic_unit_cell_with_the_sites_in_its_centerN      ?r   c       	      C   sx   |  }| }td |||||d| _t| jdgd }t| t|   d }|| | _|| j | _d S )N)rx   r   r   r   r   r   g      ?r;   r
   )	r}   ru   r   r	   r   r   orthogonalizeZshift_vectorrx   )	r   rx   r   r   r   r   r   Zunit_cell_centerZmodel_centerr   r   r   r   M  s    

zDnon_crystallographic_unit_cell_with_the_sites_in_its_center.__init__c             C   s,   ddl m} ddl m} |j| j| dS )Nr   )ra   )r[   )r	   space_group)r_   ra   r[   rh   r	   r   )r   ra   r[   r   r   r   rd   a  s
    zLnon_crystallographic_unit_cell_with_the_sites_in_its_center.crystal_symmetryc             C   s   | j | jS )N)r	   r|   rx   )r   r   r   r   r   h  s    zFnon_crystallographic_unit_cell_with_the_sites_in_its_center.sites_frac)Nr   r   )r   r    r!   r   rd   r   r   r   r   r   r   K  s
     
r   c             C   sP  ddl m} d}t|j| ddd}t| dkr@t| S | }|dkrt| d	krf| d }n:t| d
kr| \}}}||  kr|ksn t	nt
|t|||dddf}	n|dkrd}
|dkr|dkrd}
|
rt| dkrt
|| d }| d	 }t||||||f}	nt| dkr:| d }| d	 }nht| d
krb| \}}}||kst	n@t| dkr| \}}}}||kst	|dkst	nt
|t|||dddf}	n|dkrHt| dkr| d }| d	 }t|||dddf}	nLt| d
kr<| d d
 \}}}||ks&t	t|||dddf}	nt
|n |dkrt| d
krht
|| d }| d	 }| d }t|||dddf}	n|dkr6t| dkrt
|| d }| d	 }| d }| d
 }|dkrt|||d|df}	n>|dkrt|||dd|f}	n|dkrHt||||ddf}	n|dkrHt
||	S d S )Nr   )r[   z&Cannot interpret unit cell parameters.)groupr       ZCubicr8   r;   r9   )Z	HexagonalTrigonalFr   )zR-3m:RzR-3:RTr
   r<   r:   Z
TetragonalZOrthorhombicZ
MonocliniczP12/m1zP112/mzP2/m11Z	Triclinic)r_   r[   r   rb   Zbuild_derived_laue_groupr   lenr	   crystal_systemr   RuntimeError)paramsr   r[   	error_msgZ
laue_groupr   arz   rr   Z
unit_cell_Zis_rhombohedralangler   r   r   infer_unit_cell_from_symmetryk  s    


 



 
 



r   )r   )NNNNr   r   )!
__future__r   r   r   Zcctbx.array_family.flexr_   scitbx.array_family.sharedscitbxboost_adaptbx.boost.pythonboostpythonbp	six.movesr   
import_extr   r   r   r1   r	   r'   r   r   fractionalization_matrixr   r|   inject_intor(   r   r   objectr   r   r   r   r   r   <module>   s>   
,		 9
     
 