ó
·™xTc           @   s,  d  d l  m Z d  d l m Z d  d l Z d  d l m Z d  d l Z d  d l m	 Z	 d  d l
 m Z d  d l Z d  d l m Z d  d l Z d  d l m Z d  d	 l m Z e j d
 ƒ d „  Z d d d „ Z d e f d „  ƒ  YZ d d „ Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   matrixN(   t   eigensystem(   t   approx_equal(   t
   group_args(   t   flex(   t   Sorry(   t   adptbxi…ä( c         C   s(   d t  |  ƒ } | |  Id | IJd  S(   Ni2   t   *(   t   len(   t   st   logt   n(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyt
   print_step   s    gH¯¼šò×z>s   ensemble.pdbc         C   s‡  t  j j d |  ƒ } | j ƒ  } | j d | j ƒ  ƒ } t j j j	 d | j
 d ƒ d | ƒ } | j }	 t |	 ƒ d k rŠ t d ƒ ‚ n  |	 d }	 t j d	 }
 t j d
 |	 j ƒ } t j d
 |	 j ƒ |
 d } t j |	 j ƒ |
 } t j |	 j | ƒ st d ƒ ‚ n  t j |	 j | ƒ s1t d ƒ ‚ n  t d | d | d | d | ƒ } t d | d | d | d | d | ƒ j d | ƒ d  S(   Nt	   file_namet   crystal_symmetryt   remark_3_recordsi   t   pdb_hierarchyi   s2   Only one TLS group per PDB is currently supported.i    i´   t   sym_mat3i   s"   T matrix is not positive definite.s"   L matrix is not positive definite.t   Tt   Lt   SR   t   decompose_tls_objectt   xray_structuret   n_models(   t   iotbxt   pdbt   inputt   construct_hierarchyt   extract_xray_structuret   crystal_symmetry_from_cryst1t   mmtbxt   tlst   toolst   tls_from_pdb_inpt   extract_remark_iii_recordst
   tls_paramsR	   R   t   matht   piR   t   symt   tt   lt   sqrR
   R   t   is_positive_definitet   decompose_tlst   ensemble_generatort   write_pdb_file(   t   pdb_file_nameR   R   t   epst   output_file_namet   pdb_inpR   t   xrst   tls_extractt   tlsot   deg_to_rad_scaleR   R   R   t   r(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyt   run   s4    			
!R-   c           B   s   e  Z d d  „ Z d „  Z RS(   c         C   s›  | d  k r t j } n  | j ƒ  | j d d ƒ } | j ƒ  } t j j d | d | ƒ |  _ | } | J| d | IJxt	 | ƒ D]} | d | IJt
 d | j j d | j j d	 | ƒ \ }	 }
 } t d
 | j d	 | ƒ } t j ƒ  } x’ | D]Š } | j j j ƒ  | } t d | d | j d | j d |	 d |
 d | d | j j ƒ } t d | d | ƒ } | j t j | ƒ | ƒ qò W|  j j d | ƒ qƒ Wd  S(   Nt   valuei    R   R   s!   Generating ensemble of %d models:s	   model #%dt   L_Lt   R_PLR   t   h_ot   r_Lt   c_ot   e_ot   dx0t   dy0t   dz0t   d_r_M_Lt   d_r_M_Vt
   sites_cart(   t   Nonet   syst   stdoutt   convert_to_isotropict	   set_b_isoRE   R   t   utilst   statest   xranget   step_i__get_dxdydzt   b_oR:   R;   t   step_jR<   R   t   vec3_doublet	   transposet   step_i__compute_delta_L_r_dpR>   R?   t   step_kt   appendR   t   colt   add(   t   selfR   R   R   R   R   RE   R7   t   trialR@   RA   RB   RD   t   sites_cart_newt	   site_cartR=   RC   t   d_r_M(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyt   __init__7   s0     
*9c         C   s   |  j  j d | ƒ d  S(   NR   (   RL   t   write(   RX   R   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR.   U   s    N(   t   __name__t
   __module__RF   R]   R.   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR-   6   s   c         C   sæ   t  d | ƒ |  j ƒ  } | d | d | d } } } d \ } }	 }
 t | ƒ | k ro t j d | ƒ } n  t | ƒ | k r– t j d | ƒ }	 n  t | ƒ | k r½ t j d | ƒ }
 n  | d I| I|	 I|
 IJ| |	 |
 f S(   s0   
  Generation of shifts from screw rotations.
  s   step_i__get_dxdydz:i    i   i   s     dx0, dy0, dz0:(   i    i    i    (   R   t   as_sym_mat3t   abst   randomt   normalvariate(   R:   R;   R   R0   t   L_t   Lxxt   Lyyt   LzzR@   RA   RB   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyRN   X   s        c         C   s«  | j  | j | j } } }	 |  \ }
 } } t j t j } } t j | | | | j | | ƒ d | | j	 | | ƒ | | j | | ƒ | | j	 | | ƒ d f ƒ } t j | | j
 | | ƒ |
 | j | | ƒ d | | | | j
 | | ƒ d |
 | j | | ƒ f ƒ } t j |
 | j | | ƒ d | | j | | ƒ |
 | j | | ƒ | | j | | ƒ d |	 | f ƒ } | | | } | | } | S(   Ni   (   t   sx_bart   sy_bart   sz_barR%   t   cost   sinR   RV   t   wy_lxt   wz_lxt   wz_lyt   wx_lyt   wx_lzt   wy_lz(   R=   R>   R?   R@   RA   RB   R;   t   sxbt   sybt   szbt   xt   yt   zRl   Rm   t   d_lx_r_Lt   d_ly_r_Lt   d_lz_r_Lt   d_r_LR\   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyRS   f   s$    -6-6--
c         C   sö   t  d | ƒ |  j j ƒ  } d \ } } } | d d k rT t j d | d ƒ } n  | d d k r} t j d | d ƒ } n  | d d k r¦ t j d | d ƒ } n  | d I| I| I| IJ| |  j | |  j | |  j } |  j | } | S(   s-   
  Generate shifts from group translation.
  s   step_j:i    i   i   s     u0, v0, w0:(   i    i    i    (	   R   t   V_VRa   Rc   Rd   t   v_xt   v_yt   v_zt   R_MV(   R<   R   t   V_V_t   tx0t   ty0t   tz0t   d_r_VR\   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyRP   }   s       #c         C   s   |  | S(   s>   
  Calculate the total shift in original coordinate system.
  (    (   RC   RD   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyRT   Œ   s    R,   c           B   sz   e  Z d  „  Z d d „ Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d	 „  Z
 d
 „  Z d „  Z d „  Z RS(   c      	   C   s0  | |  _  d |  _ d |  _ |  j  d I|  j IJ| | | |  _ |  _ |  _ t d |  j  ƒ |  j d |  j d d d d	 ƒ |  j d |  j d d d d
 ƒ |  j d |  j d d d d ƒ |  j d |  j d |  j d |  j ƒ |  _	 |  j
 d |  j	 j d |  j	 j d |  j	 j ƒ |  _ |  j d |  j j d |  j j d |  j j ƒ |  _ |  j d |  j j d |  j j d |  j j ƒ |  _ |  j d |  j d |  j j ƒ |  _ |  j d |  j d |  j j d |  j j ƒ |  _ |  j d |  j j d |  j d |  j d |  j ƒ |  _ |  j d |  j j d |  j ƒ |  _ d S(   sb   
    Decompose TLS matrices into components necessary to compute ensemble:
    steps a) - h).
    s   %12.9fg•Ö&è.>s   Small is defined as:s   Input TLS matrices:Rw   t   prefixs     t   titlet   T_Mt   L_Mt   S_MR   R   R   t   T_pt   L_pt   S_pt   T_LR:   t   S_Lt   S_CR>   t   C_LWR?   t   V_LRO   N(   R   t   ffR0   R   R   R   R   t   show_matrixt   step_at   a_ot   step_bR�   RŽ   R�   RO   t   step_cR�   R:   R‘   R>   t   step_dR’   t   step_eR?   t   step_fR“   t   step_gt   g_ot   step_hR”   R<   (   RX   R   R   R   R   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR]   “   s"    			*333$06s     c         C   s¾   |  j  | I| IJd |  j |  j |  j f } |  j  | I| | d | d | d f IJ|  j  | I| | d | d | d f IJ|  j  | I| | d | d	 | d
 f IJ|  j  Jd  S(   Ns   %s %s %si    i   i   i   i   i   i   i   i   (   R   R•   (   RX   Rw   R‰   Rˆ   t   f(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR–   ª   s    ,,,c         C   sx   |  j  | I| IJ|  j  | I|  j | d IJ|  j  | I|  j | d IJ|  j  | I|  j | d IJ|  j  Jd  S(   Ni    i   i   (   R   R•   (   RX   Rw   R‰   Rˆ   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyt   show_vector²   s
    c      	   C   sõ  t  j | j ƒ  ƒ } | j ƒ  | j ƒ  } } |  j d Id j g  | D] } |  j | ^ qH ƒ IJ|  j d Id j g  | D] } |  j | ^ q~ ƒ IJ| d | d k o½ | d k n sÈ t ‚ t	 | d | d ƒ |  j
 k rNt	 | d | d ƒ |  j
 k rNt	 | d | d ƒ |  j
 k rNt j | d | d | d f ƒ } t j | d | d | d	 f ƒ } t j | d
 | d | d f ƒ } | | | }	 }
 } | d | d | d g } |  j d IJ|	 j |
 ƒ | } t	 | d ƒ |  j
 k s1t	 | d ƒ |  j
 k s1t	 | d ƒ |  j
 k rQ|  j d IJd | } qQnt	 | d | d ƒ |  j
 k  rît	 | d | d ƒ |  j
 k  rît	 | d | d ƒ |  j
 k  rî|  j d IJt j d ƒ }	 t j d ƒ }
 t j d ƒ } nct	 | d | d ƒ |  j
 k  t	 | d | d ƒ |  j
 k  t	 | d | d ƒ |  j
 k  g j t ƒ d k rQ|  j d IJt j | d | d | d f ƒ }	 t j | d | d | d	 f ƒ }
 t j | d
 | d | d f ƒ } |	 j |
 ƒ | } t	 | d ƒ |  j
 k s4t	 | d ƒ |  j
 k s4t	 | d ƒ |  j
 k rQ|  j d IJd | } qQn  |  j d Id j g  | D] } |  j | ^ qkƒ IJ|  j d IJ|  j d |	 d d ƒ |  j d |
 d d ƒ |  j d | d d ƒ t d |	 d |
 d | d | ƒ S(   Ns     eigen values :t    s     eigen vectors:i    i   i   i   i   i   i   i   i   s     re-assign: x, y, z = 3, 2, 1s     convert to right-handedg      ð¿s6     three eigenvalues are equal: make eigenvectors unit.s     two eigenvalues are equal.Rw   R‰   s   vector xs   vector ys   vector zRx   Ry   t   vals(   i   i    i    (   i    i   i    (   i    i    i   (   R   t   real_symmetricRa   t   valuest   vectorsR   t   joinR•   t   AssertionErrorRb   R0   R   RV   t   crosst   countt   TrueR¢   R   (   RX   t   mt   esR¤   t   vecst   it   l_1t   l_2t   l_3t   l_xt   l_yt   l_zt   tmp(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyt   eigen_system_default_handler¹   sT    66.!!!$$$K!!!3($$$K6c         C   s¤  t  d |  j ƒ |  j d IJ| j ƒ  } t j | d | d | d | d | d | d | d | d | d | d | d | d f	 ƒ } |  j d	 | d
 d ƒ t | j ƒ  ƒ |  j k  rB|  j d I|  j IJ| } | } | } t j	 d ƒ }	 t j d |	 d |	 d |	 d d |	 d |	 d |	 d d f	 ƒ }
 nÕ t j	 | d | d | d | d | d | d f ƒ } |  j
 d	 | d
 d ƒ | j ƒ  } |  j d	 | d
 d ƒ | | }	 t j d |	 d |	 d |	 d d |	 d |	 d |	 d d f	 ƒ }
 | } | } | } |  j
 d	 |	 d
 d ƒ |  j d	 |
 d
 d ƒ |  j d	 | d
 d ƒ |  j d	 | d
 d ƒ |  j d	 | d
 d ƒ t d | d | d | d |	 ƒ S(   sd   
    Shift origin into reaction center. New S' must be symmetric as result of
    origin shift.
    s   Step a:s3     system of equations: m * p = b, p = m_inverse * bi   i   i    i   i   i   Rw   R‰   R­   s	     det(m)<i   i   t   bt	   m_inverset   pt   Pt   T_Pt   L_Pt   S_PR�   RŽ   R�   (   i    i    i    (   R   R   Ra   R   R*   R–   Rb   t   determinantR0   RV   R¢   t   inverseR   (   RX   R   R   R   Re   R­   R�   RŽ   R�   R»   R¼   R¹   t   m_inv(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR—     sP    '<

c         C   sµ  t  d |  j ƒ |  j d | ƒ } | j | j | j } } } |  j d | d d ƒ |  j d | d d ƒ |  j d | d d ƒ t j | d | d | d | d	 | d	 | d	 | d
 | d
 | d
 g	 ƒ } |  j	 d | d d ƒ t
 | j ƒ  | j ƒ  ƒ st ‚ | j ƒ  | | }	 | j ƒ  | | }
 | j ƒ  | | } |  j	 d |	 d d ƒ |  j	 d |
 d d ƒ |  j	 d | d d ƒ t d | d | d | d |	 d |
 d | d | ƒ S(   s<   
    Principal libration axes and transition to L-base.
    s   Step b:R­   Rw   R‰   R´   Rµ   R¶   i    i   i   s   rotation matrix R_PLR�   R:   R‘   R;   (   R   R   R¸   Rw   Rx   Ry   R¢   R   R*   R–   R   RR   RÁ   R©   R   (   RX   R�   RŽ   R�   R®   R´   Rµ   R¶   R;   R�   R:   R‘   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR™   G  s4    !c         C   st  t  d |  j ƒ | j ƒ  } | d | d | d } } } d } d }	 d }
 d } d } d } t | ƒ |  j k rÍ t | d ƒ |  j k r  | d | } n  t | d ƒ |  j k rÍ | d | }	 qÍ n  t | ƒ |  j k r:t | d ƒ |  j k r| d | }
 n  t | d ƒ |  j k r:| d | } q:n  t | ƒ |  j k r§t | d ƒ |  j k rz| d | } n  t | d ƒ |  j k r§| d | } q§n  t j d | |	 f ƒ } t j |
 d | f ƒ } t j | | d f ƒ } t d	 | d
 |	 d |
 d | d | d | d | d | d | ƒ 	} |  j d | d d ƒ |  j d | d d ƒ |  j d | d d ƒ | S(   s$   
    Position of rotation axes.
    s   Step c:i    i   i   i   i   i   i   Rn   Ro   Rq   Rp   Rr   Rs   t   w_lxt   w_lyt   w_lzRw   R‰   (	   R   R   Ra   Rb   R0   R   RV   R   R¢   (   RX   R�   R:   R‘   Re   Rf   Rg   Rh   Rn   Ro   Rq   Rp   Rr   Rs   RÃ   RÄ   RÅ   t   result(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyRš   f  sR           	c         C   sü  t  d |  j ƒ d } | j ƒ  } | d | d | d } } } | j ƒ  }	 |	 d |	 d |	 d }
 } } | d | d | d } } } t | ƒ |  j k  r¬ d } n  t | ƒ |  j k  rÊ d } n  t | ƒ |  j k  rè d } n  t j } |
 | } | | } | | } | d k rˆ| d k rˆ| d k rˆt | | | ƒ | | | ƒ | | | ƒ ƒ } t | | | ƒ | | | ƒ | | | ƒ ƒ } |  j d I| I| IJt | ƒ |  j k  rÊd } n  t | ƒ |  j k  rèd } n  t | | ƒ |  j k  r
d } n  | | k  r¡| j	 ƒ  d } | | k rG| | k rG| } q…t | | ƒ } t | | ƒ } | | k  r|| } q…| } q¡n |  j d Id Id IJ| t j | d d d | d d d | f	 ƒ } |  j d	 I| IJ|  j d
 | d d ƒ | S(   sG   
    Minimization of correlation between translation and rotation.
    s   Step d:i    i   i   i   i   s     tmin, tmax:g      @s     tS:Rw   R‰   R’   N(   R   R   Ra   Rb   R0   R%   t   sqrtt   maxt   mint   traceRF   R   R*   R–   (   RX   R‘   R:   R�   t   tSRe   Rf   Rg   Rh   t   T_t   Txxt   Tyyt   Tzzt   Sxxt   Syyt   SzzRÇ   t   TxxLxxt   TyyLyyt   TzzLzzt   tmint   tmaxt   trS_L_over3t   tmp1t   tmp2R’   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR›   Ž  sR        	 	 		


$00 	 	 		 	.c         C   s  t  d |  j ƒ | j ƒ  } | d | d | d } } } d \ } } }	 t | ƒ |  j k rq | d | } n  t | ƒ |  j k r— | d | } n  t | ƒ |  j k r½ | d | }	 n  t d | d | d	 |	 ƒ }
 |  j d
 I|
 j IJ|  j d I|
 j IJ|  j d I|
 j IJ|
 S(   s-   
    Find screw components of libration.
    s   Step e:i    i   i   i   i   Ri   Rj   Rk   s	     sx_bar:s	     sy_bar:s	     sz_bar:(   i    i    i    (	   R   R   Ra   Rb   R0   R   Ri   Rj   Rk   (   RX   R’   R:   Re   Rf   Rg   Rh   Ri   Rj   Rk   RÆ   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyRœ   ¹  s        c         C   s  t  d |  j ƒ | j ƒ  } | d | d | d } } } | j } | j }	 | j }
 | j } | j } | j } | d | | d | |	 d | | d | | d | |
 d | | | | |
 | | | |	 | g } t	 j
 d | ƒ } |  j d | d d ƒ | S(	   sY   
    Calculate translational contribution C_LW of rotations due to axes dispalcement
    s   Step f:i    i   i   R   Rw   R‰   R“   (   R   R   Ra   Rn   Ro   Rq   Rp   Rr   Rs   R   R'   R–   (   RX   R>   R�   R:   Re   Rf   Rg   Rh   Rn   Ro   Rq   Rp   Rr   Rs   R“   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR�   Ê  s     						E*c         C   sÄ   t  d |  j ƒ t j d | j | d | j | d | j | d d d d g ƒ } | | } | | } |  j d | d d ƒ |  j d | d d	 ƒ |  j d | d d
 ƒ t d | d | d | ƒ S(   ss   
    Calculate translation contribution C_LS of rotation due to screw components
    and resulting V_L matrix.
    s   Step g:R   i    i   i   Rw   R‰   t   C_LSs   C_L s   V_L R”   t   C_L(	   R   R   R   R'   Ri   Rj   Rk   R–   R   (   RX   R�   R“   R?   R’   RÛ   RÜ   R”   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyRž   Þ  s    	<

c         C   s	  t  d |  j ƒ | j | | j j ƒ  } |  j d | d d ƒ |  j d | ƒ } | j | j | j } } } | j	 \ } }	 }
 |  j
 d | d d ƒ |  j
 d | d d ƒ |  j
 d | d d ƒ t | j | ƒ d	 ƒ sá t ‚ t | j | ƒ d	 ƒ sÿ t ‚ t | j | ƒ d	 ƒ st ‚ t j | d	 | d	 | d	 | d
 | d
 | d
 | d | d | d g	 ƒ } |  j d | d d ƒ t j d | |	 |
 d	 d	 d	 g ƒ } |  j d | d d ƒ t | | j ƒ  | | ƒ sÞt ‚ t d | d | d | d | d | d | ƒ S(   s*   
    Three uncorrelated translations.
    s   Step h:Rw   R‰   s   V_M R­   R   R€   R�   i    i   i   R‚   R   R~   t   V_M(   R   R   R;   RR   R–   R¸   Rw   Rx   Ry   R¤   R¢   R   t   dotR©   R   R*   R'   R   (   RX   R”   RO   RÝ   R®   R   R€   R�   t   lam_ut   lam_vt   lam_wR‚   R~   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR    ð  s6    $#(   R_   R`   R]   R–   R¢   R¸   R—   R™   Rš   R›   Rœ   R�   Rž   R    (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyR,   ’   s   		V	8		(	+			(    t
   __future__R    t   scitbxR   R%   t   scitbx.linalgR   Rc   t   libtbx.test_utilsR   t   libtbxR   t   mmtbx.utilsR   t   scitbx.array_familyR   t	   iotbx.pdbR   t   libtbx.utilsR   t   cctbxR   t   seedR   R8   t   objectR-   RN   RS   RP   RT   R,   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tls_as_xyz.pyt   <module>   s*   	"			