B
    d
                 @   s   d dl mZmZmZ d dlmZ d dlm  mZ	 d dl
mZ e	dZd dlT d dlZd dlZd dlZedZedZdejd	  Zed	 ZdddZdddZdd Zdd ZdddZdd ZdS )    )absolute_importdivisionprint_function)flexN)rangecctbx_adptbx_ext)*      h  c                s0   t jj fddtdD ddj}t|| S )Nc                s   g | ]}t  qS  )randomuniform).0i)r_maxr_minr   k/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/cctbx/adptbx.py
<listcomp>   s    z+random_rotate_ellipsoid.<locals>.<listcomp>   T)deg)scitbxmatheuler_angles_as_matrixr   elemsZc_u_c_transpose)u_cartr   r   cr   )r   r   r   random_rotate_ellipsoid   s     r   c                s(   t  fddtdD dddg dS )Nc                s   g | ]}t      qS r   )r   )r   r   )u_minu_scaler   r   r      s   z!random_u_cart.<locals>.<listcomp>r   r   )r   )r   r   )r    r   r   )r   r    r   random_u_cart   s    r!   c             C   s   t t| dtt| |  S )N)h)r   doubleZ0debye_waller_factor_u_star_gradient_coefficientsmtpsdebye_waller_factor_u_star)r"   u_starr   r   r   $debye_waller_factor_u_star_gradients   s    r'   c             C   s   t | dtt| |  S )N)r"   )Z1debye_waller_factor_u_star_curvature_coefficientsmtpssr%   )r"   r&   r   r   r   %debye_waller_factor_u_star_curvatures    s    r)   皙?c             C   s   ddl m} |    }|j|d  }|j|dd}t	| 
 t||d}|j|d}|j|d}tt| 
 |}	|	d |	d	  |	d
  d }
|	d |
 |	d	 |
 |	d
 |
 |	d |	d |	d g}	|	S )Nr   )sgtbx)symbolT)space_groupreciprocal_space)r    r   )
all_params)independent_paramsr	   r   r         )cctbxr+   r-   typelookup_symbolspace_group_infogroupbuild_derived_point_grouptensor_rank_2_constraintsu_cart_as_u_star	unit_cellr!   r0   r/   u_as_bu_star_as_u_cart)crystal_symmetryr    r   r+   r,   point_groupadp_constraintsr&   Zu_indepb_carttrr   r   r   ,random_traceless_symmetry_constrained_b_cart$   s     rC   c       
      C   s   ddl m} ||krtjS t| tr.t|| } t|trBt||}||j|d}||j|d}t|| }t	| ||||d
 }	|	| S )z
  Calculate the intersection of two scatterers, given coordinates and atomic
  displacements.  If the scatterers do not actually intersect the result will
  be negative.
  r   )col)	site_frac)Zustar1Zustar2Zsite1Zsite2r;   )scitbx.matrixrD   sysmaxsize
isinstancefloatZu_iso_as_u_starorthogonalizeabsZprojection_sumZdelta_z)
Zu_1Zu_2Zsite_1Zsite_2r;   rD   Zsite_cart_1Zsite_cart_2ZdxyzZproj_sumr   r   r   intersection7   s"    



rM   )r   r   )r	   r   )r	   r*   ) 
__future__r   r   r   cctbx.array_familyr   boost_adaptbx.boost.pythonboostpythonbp	six.movesr   
import_extextr   scitbx.mathr   r   r   r<   Zu_as_b_factorb_as_uZb_as_u_factorpir$   r(   r   r!   r'   r)   rC   rM   r   r   r   r   <module>   s&   


 
