ó
·™xTc        	   @   s¼  d  d l  m Z d  d l m Z d  d l m Z d  d l Z d  d l Z d  d l m	 Z	 d  d l
 Td  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 d  d l m Z d  d l m Z d  d l Z d  d l Z d  d l Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d a  d a! d a" d a# d a$ d a% d a& d a' d d „ Z) d e f d „  ƒ  YZ* d d „ Z+ d e f d „  ƒ  YZ, d e f d „  ƒ  YZ- d „  Z. d d e/ e/ e/ d  e/ d d „ Z0 d  e f d! „  ƒ  YZ1 d" e f d# „  ƒ  YZ2 d$ e f d% „  ƒ  YZ3 d& e f d' „  ƒ  YZ4 d e/ d( „ Z5 d) „  Z6 d* d* d+ „ Z7 d, e f d- „  ƒ  YZ8 d e/ e/ e/ d d. „ Z9 d d d d d/ „ Z: d0 d1 „ Z; d2 „  Z< d S(3   iÿÿÿÿ(   t   division(   t   pdb(   t   flexN(   t   lbfgs(   t   *(   t   adopt_init_args(   t   approx_equal(   t   adptbx(   t   xray(   t   user_plus_sys_timet   Sorry(   t   line_breaker(   t
   group_argsc         C   sJ  t  | ƒ t  | ƒ k s t ‚ x | D] } |  j d | ƒ q% Wg  } xB | D]: } | j t d | j d | j d | j d | j ƒ ƒ qL Wt	 d |  j
 ƒ  d | d | ƒ } |  j ƒ  } xŒ t |  j ƒ  ƒ D]x \ } }	 | | d
 k rÊ |	 j j ƒ  sû t ‚ t j | t | | ƒ ƒ }
 t t j |	 j ƒ t j |
 ƒ ƒ |	 _ qÊ qÊ Wd  S(   Nt	   selectiont   tt   lt   st   origint
   sites_cartt
   selectionst   tlsosi    (   i    i    i    i    i    i    (   t   lent   AssertionErrort   convert_to_anisotropict   appendt   tlsoR   R   R   R   t   u_cart_from_tlsR   t	   unit_cellt	   enumeratet
   scattererst   flagst   use_u_anisoR   t   u_cart_as_u_start   tupleR   t   doublet   u_star(   t   xray_structuret   tls_selectionst
   tls_groupst   selR   t	   tls_groupt
   u_cart_tlsR   t   i_seqt   sct
   u_star_tls(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   combine_tls_and_u_local   s(    				c         C   sf   g  } x; | j  ƒ  D]- } x$ | j ƒ  D] } | j | j ƒ q& Wq Wt j j j d |  d | d | ƒ S(   Nt   remark_3_recordst   pdb_hierarchyt	   chain_ids(   t   modelst   chainsR   t   idt   iotbxR   t   remark_3_interpretationt   extract_tls_parameters(   R.   R/   R0   t   modelt   chain(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   tls_from_pdb_inp(   s    c         C   sÓ   t  |  j ƒ d k r¶ g  } x- t |  j ƒ D] \ } } | j | j ƒ q+ Wy> t j j d | d | d | ƒ } t d |  d | d | ƒ SWqÏ t	 k
 r² t d |  d g  d g  ƒ SXn t d |  d g  d g  ƒ Sd  S(   Ni    t   all_chain_proxiest   selection_stringsR$   t   pdb_inp_tlsR%   t   tls_selection_strings(
   R   t
   tls_paramsR   R   t   selection_stringt   mmtbxt   utilst   get_atom_selectionsR   t	   Exception(   R<   R:   R$   R=   R*   R(   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   extract_tls_from_pdb2   s&    	R(   c           B   s   e  Z d d d  „ Z RS(   c         C   s   | |  _  | |  _ | |  _ d  S(   N(   R   R?   t   selection_array(   t   selfR   R?   RE   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   __init__I   s    		N(   t   __name__t
   __module__t   NoneRG   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR(   H   s   g        c         C   sÑ   |  d  k r t j }  n  t t t t t t t	 } | d k rÍ |  d IJ|  d t IJ|  d t IJ|  d t IJ|  d t IJ|  d t IJ|  d t IJ|  d	 t	 IJ|  d
 | IJ|  d t
 IJn  | S(   Ng{®Gáz„?s   TLS refinement:s<     time_u_cart_from_tls                              = %-7.2fs=     time_tls_from_uanisos                              = %-7.2fs=     time_update_xray_structure_with_tls                = %-7.2fs=     time_split_u                                       = %-7.2fs=     time_tls_from_u_cart                               = %-7.2fs=     time_make_tlso_compatible_with_u_positive_definite = %-7.2fs=     time_generate_tlsos                                = %-7.2fs=     sum_of_partial_contributions                       = %-7.2fs=     time_tls_total                                     = %-7.2f(   RJ   t   syst   stdoutt   time_u_cart_from_tlst   time_tls_from_uanisost#   time_update_xray_structure_with_tlst   time_split_ut   time_tls_from_u_cartt2   time_make_tlso_compatible_with_u_positive_definitet   time_generate_tlsost   time_tls_total(   t   outt   total(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt
   show_timesW   s      
R&   c           B   s   e  Z d d d  „ Z RS(   c         C   s   | | |  _  |  _ d  S(   N(   R   R;   (   RF   R   R;   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRG   n   s    N(   RH   RI   RJ   RG   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR&   m   s   c      	   C   s  | d  k r t j } n  t | ƒ d k rN t |  ƒ d k sB t ‚ d  g } n t |  ƒ t | ƒ k sl t ‚ | d IJ| d t |  ƒ IJ| d IJd } d } xZt |  | ƒ D]I\ } } | d  k rÑ d } n  | d 7} | j } | j } | j }	 | j	 }
 | | d | IJt
 | d	 d
 ƒ} xM t | ƒ D]? \ } } | d k r]| | d | IJq0| | d | IJq0W| | d |
 d |
 d |
 d f IJ| | d IJ| | d | d | d f IJ| | d | d | d f IJ| | d | d | d f IJ| | d IJ| | d | d | d f IJ| | d | d | d f IJ| | d | d | d f IJ| | d IJ| | d |	 d |	 d |	 d f IJ| | d |	 d |	 d |	 d f IJ| | d |	 d |	 d |	 d  f IJq° Wd  S(!   Ni    i   s   REMARK   3  TLS DETAILS.s'   REMARK   3   NUMBER OF TLS GROUPS: %-6ds#   REMARK   3   ORIGIN: CENTER OF MASSs   REMARK   3   t   alls   TLS GROUP : %-6dt   widthi-   s    SELECTION: %ss             : %ss)    ORIGIN FOR THE GROUP (A):%9.4f%9.4f%9.4fi   s5    T TENSOR                                            s-      T11:%9.4f T22:%9.4f                       s-      T33:%9.4f T12:%9.4f                       i   s-      T13:%9.4f T23:%9.4f                       i   i   s5    L TENSOR                                            s-      L11:%9.4f L22:%9.4f                       s-      L33:%9.4f L12:%9.4f                       s-      L13:%9.4f L23:%9.4f                       s5    S TENSOR                                            s)      S11:%9.4f S12:%9.4f S13:%9.4f         s)      S21:%9.4f S22:%9.4f S23:%9.4f         s)      S31:%9.4f S32:%9.4f S33:%9.4f         i   i   i   (   RJ   RK   RL   R   R   t   zipR   R   R   R   R   R   (   R   R;   RU   t   r3t   counterR   R?   R   R   R   t   ot   linest   i_linet   line(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   remark_3_tlsq   sL     

	
				'      ''t   show_tlsc           B   s   e  Z d  d d „ Z RS(   t    c         C   s  | d  k r t j } n  d } d } d } d } d d d d } | | }	 d	 | }
 d
 } d t |
 | ƒ } | |
 d | | IJx`| D]X} | d 7} | j } | j } | j } | j } d | } d t | d ƒ } | | d | d IJ| d d d | d | d | d f d d IJ| | | d | d | d | d | d | d f IJ| | | d | d | d | d | d | d f IJ| |	 | d | d | d | d | d | d | d | d | d f	 IJq� W| d d d d IJd  S(   Ni    s=   |T11=%8.4f T22=%8.4f T33=%8.4f T12=%8.4f T13=%8.4f T23=%8.4f|s=   |L11=%8.4f L22=%8.4f L33=%8.4f L12=%8.4f L13=%8.4f L23=%8.4f|s>   |S11=%8.4f S22=%8.4f S33=%8.4f S12=%8.4f S13=%8.4f S21=%8.4f|
s   |S23=%8.4f S31=%8.4f S32=%8.4ft    i'   t   |s   |-s   -|iO   t   -i   s   |TLS group number %d: i   s"   Origin (x,y,z) = %9.4f %9.4f %9.4fi   i   i   i   i   i   i   i   iM   s                  s                   (   RJ   RK   RL   R   R   R   R   R   (   RF   R   t   textRU   R\   t   formatTt   formatLt   formatS1t   formatS2t   formatSt   part1t   part2t   nt   itemt   Tt   Lt   SR   R`   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRG   ›   s6     


				
/88QN(   RH   RI   RJ   RG   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRb   š   s   t   show_tls_one_groupc           B   s   e  Z d  d d „ Z RS(   Rc   c         C   s¾  | d  k r t j } n  d } d } d } d } d d d d } | | }	 d	 | }
 d
 } d t |
 | ƒ } | |
 d | | IJ| d 7} | j } | j } | j } | j } | d d d | d | d | d f d d IJ| | | d | d | d | d | d | d f IJ| | | d | d | d | d | d | d f IJ| |	 | d | d | d | d | d | d | d | d | d f	 IJ| d d d d IJd  S(   Ni    s=   |T11=%8.4f T22=%8.4f T33=%8.4f T12=%8.4f T13=%8.4f T23=%8.4f|s=   |L11=%8.4f L22=%8.4f L33=%8.4f L12=%8.4f L13=%8.4f L23=%8.4f|s>   |S11=%8.4f S22=%8.4f S33=%8.4f S12=%8.4f S13=%8.4f S21=%8.4f|
s   |S23=%8.4f S31=%8.4f S32=%8.4fRd   i'   Re   s   |-s   -|iO   Rf   i   i   s"   Origin (x,y,z) = %9.4f %9.4f %9.4fi   i   i   i   i   i   i   i   iM   s                  s                   (   RJ   RK   RL   R   R   R   R   R   (   RF   R   Rg   RU   R\   Rh   Ri   Rj   Rk   Rl   Rm   Rn   Ro   Rq   Rr   Rs   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRG   ¸   s.     


				/88MN(   RH   RI   RJ   RG   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRt   ·   s   c   	      C   s¢   t  j  ƒ  } t j |  j ƒ  d d d d d d g ƒ } xK t | | ƒ D]: \ } } t d | d |  j | ƒ ƒ } | j | | ƒ qF Wt  j  ƒ  } t | | 7a | S(   Ni    R   R   (	   t   timeR   t   sym_mat3_doublet   sizeRZ   t   uaniso_from_tls_one_groupt   selectt   set_selectedRM   (	   R   R   R   t   t1t   uanisosR   R   t   ut   t2(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR   Ð   s    *i¸  iè  c   !      C   s4  t  j  ƒ  } |
 d  k r$ t j }
 n  | d k rL t d | d d d |
 ƒ n  |  j ƒ  j |  j ƒ  ƒ } g  } g  } g  } d } xEt | | ƒ D]4\ } } | d 7} | j	 } | j
 } | j } |	 rç t j | ƒ } t j | ƒ } n  d } d } |  j ƒ  j | ƒ } | j | ƒ } xç t d | d ƒ D]Ò } | } t d | d	 | d
 | d | d | d | d | d | d | j d | ƒ 
} | r‘| j } n t | | j ƒ s©t ‚ | r»| j } n t | | j ƒ sÓt ‚ | rå| j } q+t | | j ƒ s+t ‚ q+W| d k r'|
 d | I| j IJn  | j } | j } |	 r`t j | ƒ } t j | ƒ } n  | j | ƒ | j | ƒ | j | j ƒ |	 r� t j | d ƒ s¨t ‚ t j | d ƒ sÃt ‚ q� q� Wt d | d |  d | d | d | ƒ } | d k rt d | d d d |
 ƒ n  t  j  ƒ  }  t |  | 7a | S(   Ni    R   Rg   s   TLS from ADP: start TLS valuesRU   i   g      ð¿t   uanisot	   T_initialt	   L_initialt	   S_initialt   refine_Tt   refine_Lt   refine_St   max_iterationsR   t   sitess!   TLS group %d: minimized target = g�íµ ÷Æ°>R   R$   Rq   Rr   Rs   s   TLS from ADP: final TLS values(   Ru   RJ   RK   RL   Rb   R   t   extract_u_cartR   RZ   R   R   R   R   t   eigenvalue_filteringR   Ry   t   ranget   tls_from_uaniso_minimizerR   t   T_minR   R   t   L_mint   S_mint   fR   t   is_positive_definitet   generate_tlsosRN   (!   R$   R   t   tlsos_initialt   number_of_macro_cyclesR†   Rƒ   R„   R…   t   verboset   enforce_positive_definite_TLRU   R{   t   u_cartRŒ   R�   RŽ   t   group_countert   tlso_initialR   R€   R�   R‚   t	   stop_flagt   target_stopt   sites_cart_selectedt   u_cart_selectedt   it   target_startt	   minimizedt   T_min_t   L_min_t   tlsos_resultR~   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   tls_from_uanisosÜ   sˆ     
					   			R‹   c           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   sH  t  |  t ƒ  ƒ | j ƒ  |	 j ƒ  k s. t ‚ t |  j ƒ |  _ t |  j ƒ |  _ t |  j	 ƒ |  _
 |  j d k r‚ |  j
 d k sˆ t ‚ |  j |  _ |  j |  _ |  j	 |  _ |  j |  j |  j |  j ƒ |  _ |  j j ƒ  |  _ t j d |  d t j d |
 d t |
 d ƒ ƒ d t j d	 t d
 t d t ƒ ƒ |  _ |  j ƒ  |  ` d  S(   Ni   i	   t   target_evaluatort   termination_paramsR†   t	   max_callsg      ø?t   exception_handling_paramst-   ignore_line_search_failed_step_at_lower_boundt-   ignore_line_search_failed_step_at_upper_boundt    ignore_line_search_failed_maxfev(   R   t   localsRw   R   R   R€   t   dim_TR�   t   dim_LR‚   t   dim_SRŒ   R�   RŽ   t   packt   xRo   R   t   runt   termination_parameterst   intt   exception_handling_parameterst   Truet	   minimizert    compute_functional_and_gradients(   RF   R   R€   R�   R‚   Rƒ   R„   R…   R   R‡   R†   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRG   *  s,    $!			
c         C   sm   g  } |  j  r" | t | ƒ 7} n  |  j r> | t | ƒ 7} n  |  j rZ | t | ƒ 7} n  t j t | ƒ ƒ S(   N(   Rƒ   t   listR„   R…   R   R"   R!   (   RF   Rq   Rr   Rs   t   v(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR¯   N  s    	 	 	 c         C   s    d } |  j  r7 t |  j ƒ | |  j !|  _ |  j } n  |  j rp t |  j ƒ | | |  j !|  _ | |  j 7} n  |  j rœ t |  j ƒ | | |  j	 !|  _
 n  d  S(   Ni    (   Rƒ   R!   R°   R¬   RŒ   R„   R­   R�   R…   R®   RŽ   (   RF   R�   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   unpack_xU  s    		 	c         C   s€   |  j  ƒ  t |  j |  j |  j |  j |  j |  j ƒ } | j ƒ  |  _	 |  j
 | j ƒ  | j ƒ  | j ƒ  ƒ |  _ |  j	 |  j f S(   N(   Rº   t    tls_from_uaniso_target_and_gradsRŒ   R�   RŽ   R   R‡   R   t   targetR�   R¯   t   grad_Tt   grad_Lt   grad_St   g(   RF   t   manager(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR·   `  s    
	*(   RH   RI   RG   R¯   Rº   R·   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR‹   )  s   	$		t   tls_from_uiso_minimizerc           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   sW  t  |  t ƒ  ƒ | j ƒ  |	 j ƒ  k s. t ‚ t |  j ƒ |  _ t |  j ƒ |  _ t |  j	 ƒ |  _
 |  j d k r‘ |  j
 d k r‘ |  j d k s— t ‚ |  j |  _ |  j |  _ |  j	 |  _ |  j |  j |  j |  j ƒ |  _ |  j j ƒ  |  _ t j d |  d t j d |
 d t |
 d ƒ ƒ d	 t j d
 t d t d t ƒ ƒ |  _ |  j ƒ  |  ` d  S(   Ni   i   i   R¤   R¥   R†   R¦   g      ø?R§   R¨   R©   Rª   (   R   R«   Rw   R   R   R€   R¬   R�   R­   R‚   R®   RŒ   R�   RŽ   R¯   R°   Ro   R   R±   R²   R³   R´   Rµ   R¶   R·   (   RF   t   uisoR€   R�   R‚   Rƒ   R„   R…   R   R‡   R†   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRG   n  s,    3!			
c         C   sy   g  } |  j  r. | t t j | g ƒ ƒ 7} n  |  j rJ | t | ƒ 7} n  |  j rf | t | ƒ 7} n  t j t | ƒ ƒ S(   N(   Rƒ   R¸   R   R"   R„   R…   R!   (   RF   Rq   Rr   Rs   R¹   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR¯   ’  s    	 	 	 c         C   s    d } |  j  r7 t |  j ƒ | |  j !|  _ |  j } n  |  j rp t |  j ƒ | | |  j !|  _ | |  j 7} n  |  j rœ t |  j ƒ | | |  j	 !|  _
 n  d  S(   Ni    (   Rƒ   R!   R°   R¬   RŒ   R„   R­   R�   R…   R®   RŽ   (   RF   R�   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRº   ™  s    		 	c         C   s„   |  j  ƒ  t |  j d |  j |  j |  j |  j |  j ƒ } | j ƒ  |  _	 |  j
 | j ƒ  | j ƒ  | j ƒ  ƒ |  _ |  j	 |  j f S(   Ni    (   Rº   t   tls_from_uiso_target_and_gradsRŒ   R�   RŽ   R   R‡   RÃ   R¼   R�   R¯   R½   R¾   R¿   RÀ   (   RF   RÁ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR·   ¤  s    
*(   RH   RI   RG   R¯   Rº   R·   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRÂ   m  s   	$		t   tls_xray_target_minimizerc           B   s2   e  Z e e d  „ Z d „  Z d „  Z d „  Z RS(   c         C   sd  t  |  t ƒ  ƒ | j j ƒ  j d t ƒ t j d | j j ƒ  d t ƒ |  j	 r] t |  _
 n  |  j j ƒ  |  _ |  j j ƒ  |  _ d |  _ g  |  _ g  |  _ g  |  _ g  |  _ xZ | D]R } |  j j | j ƒ |  j j | j ƒ |  j j | j ƒ |  j j | j ƒ qµ Wd |  _ t |  j ƒ |  _ t |  j d ƒ |  _ t |  j d ƒ |  _ t |  j d ƒ |  _ |  j |  _ |  j |  _  |  j |  _! |  j" |  j |  j  |  j! ƒ |  _# t$ j% d |  d t$ j& d d ƒ d	 t$ j' d
 | d t( | d ƒ ƒ d t$ j) d t d t d t ƒ ƒ |  _* |  j+ ƒ  |  `# t, d |  j- d |  j j d |  j d |  j  d |  j! ƒ |  _. d  S(   Nt   stateR   t   u_anisoi    R¤   t   core_paramst   maxfevi
   R¥   t   min_iterationsR¦   g      ø?R§   R¨   R©   Rª   R   R$   Rq   Rr   Rs   (/   R   R«   R$   R   t   flags_set_gradst   FalseR   t   set_scatterer_grad_flagsRµ   t   run_finite_differences_testt   correct_adpt   fmodelt	   deep_copyt   fmodel_copyt   target_functort#   run_finite_differences_test_counterR€   R�   R‚   t   originsR   R   R   R   R   R\   R   t   n_groupsR¬   R­   R®   RŒ   R�   RŽ   R¯   R°   R   R±   t   core_parametersR²   R³   R´   R¶   R·   R‘   R   R¢   (   RF   RÐ   R’   Rƒ   R„   R…   R   t   selections_1dR†   RÎ   RÏ   t   tlso_(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRG   ²  sZ    	 						!			
			c         C   s“   g  } xw t  | | | ƒ D]c \ } } } |  j rD | t | ƒ 7} n  |  j r` | t | ƒ 7} n  |  j r | t | ƒ 7} q q Wt j t | ƒ ƒ S(   N(   RZ   Rƒ   R¸   R„   R…   R   R"   R!   (   RF   Rq   Rr   Rs   R¹   t   Tit   Lit   Si(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR¯   ê  s    "	 	 	 c         C   sí   d } g  } g  } g  } xÎ t  |  j ƒ D]½ } |  j rk t |  j ƒ | | |  j !|  j | <| |  j 7} n  |  j r¨ t |  j ƒ | | |  j !|  j	 | <| |  j 7} n  |  j
 r( t |  j ƒ | | |  j !|  j | <| |  j 7} q( q( Wd  S(   Ni    (   t   xrangeRÖ   Rƒ   R!   R°   R¬   RŒ   R„   R­   R�   R…   R®   RŽ   (   RF   R�   RŒ   R�   RŽ   t   j(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRº   ò  s    	$	$	$c         C   sD  |  j  d 7_  |  j ƒ  t d |  j d |  j j d |  j d |  j d |  j ƒ } t	 d |  j j d |  j d |  j
 d | d	 |  j ƒ |  j j d
 t ƒ |  j d t ƒ } | j ƒ  |  _ t d | d |  j d | ƒ } |  j | j | j | j ƒ |  _ |  j r4|  j d k  r4d } |  j d 7_ t d |  j d |  j d |  j d |  j d |  j d |  j d d ƒ \ } } } d } d }	 x8 t | j | ƒ D]$ \ }
 } t |
 | | ƒ s“t ‚ q“Wx8 t | j | ƒ D]$ \ }
 } t |
 | | ƒ sÎt ‚ qÎWx; t | j | ƒ D]$ \ }
 } t |
 | | ƒ s	t ‚ q	Wn  |  j |  j f S(   Ni   R   R$   Rq   Rr   Rs   RØ   R   RÏ   t   update_f_calct   compute_gradientst   target_resulti   gü©ñÒMbP?RÓ   RÕ   t   deltagñhãˆµøä>s)   %10.6f %10.6f %10.6f %10.6f %10.6f %10.6fs>   %10.6f %10.6f %10.6f %10.6f %10.6f %10.6f %10.6f %10.6f %10.6f(   R\   Rº   R‘   R   RÒ   R$   RŒ   R�   RŽ   t   update_xray_structure_with_tlsRØ   RÏ   t   update_xray_structureRµ   RÓ   t   target_workR�   t   tls_xray_gradsR¯   R½   R¾   R¿   RÀ   RÎ   RÔ   t/   finite_differences_grads_of_xray_target_wrt_tlsRÕ   RZ   R   R   (   RF   R   t   t_rt   grad_managert	   tolerancet   GTt   GLt   GSt   formatt   formatst   m1t   m2(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR·     sX    
				
									(   RH   RI   RÌ   Rµ   RG   R¯   Rº   R·   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRÅ   ±  s
   
.		Ræ   c           B   s   e  Z d  „  Z RS(   c         C   sí   g  |  _  g  |  _ g  |  _ | j d t ƒ } x¹ t | | ƒ D]¨ \ } } t d | j j j	 ƒ  j
 | ƒ d | j d | j
 | ƒ d t d t ƒ } |  j  j t | j  ƒ  ƒ ƒ |  j j t | j ƒ  ƒ ƒ |  j j t | j ƒ  ƒ ƒ q= Wd  S(   NRÇ   R‡   R   t   d_target_d_uanisot   scale_l_and_st   use_trace_s_zero_constraint(   R½   R¾   R¿   t   gradients_wrt_atomic_parametersRµ   RZ   t   d_target_d_tlsRÁ   R$   R   Ry   R   R   R¸   (   RF   Rá   R   R   Rò   R'   R   t   d_target_d_tls_manager(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRG   =  s    							(   RH   RI   RG   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRæ   ;  s   c         C   sm   t  ƒ  } t d |  j ƒ  d | d | ƒ } |  j d | d | ƒ | rY |  j d d ƒ n  t | j ƒ  7a d  S(   NR   R   R   R–   R   t   u_ming�íµ ÷Æ°>(   R	   R   R   t
   set_u_cartt   tidy_usRO   t   elapsed(   R$   R   R   RØ   RÏ   t   timert   u_cart_from_tls_(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRã   N  s    		 c      	   C   s  t  ƒ  } |  j ƒ  } |  j ƒ  j ƒ  } |  j ƒ  } xV| D]N} | j | ƒ } t j | ƒ }	 | rv t j	 d ƒ }
 n d }
 |	 |
 k r• |	 |
 }	 n  t j
 | |	 ƒ } xÞ | D]Ö } |  j ƒ  | } | j | | k sÝ t ‚ | j |	 } | d k sü t ‚ | | _ | j j ƒ  st ‚ | j j ƒ  s/t ‚ | j d k rJ| | _ q® t j | j ƒ } t j | ƒ } t | | ƒ } | | _ q® Wq: W|  j ƒ  j ƒ  j |  j ƒ  ƒ } | d k  j t ƒ d k sÎt ‚ |  j ƒ  } t | | ƒ sït ‚ t | j ƒ  7a d  S(   Ng      @g        g      ð¿i    (   g      ð¿g      ð¿g      ð¿g      ð¿g      ð¿g      ð¿(   R	   R   R   t   extract_u_isot   extract_u_iso_or_u_equivRy   R   t   minR   t   b_as_ut   u_iso_as_u_start   u_isoR   R   R   t	   use_u_isoR#   R"   R¸   t   countRµ   R   RP   Rû   (   R$   R%   t   offsetRü   t   ucR  t   u_eq_1t   tls_selectiont	   u_iso_selt	   u_iso_mint   offset_R   R*   R+   t	   u_iso_newR°   t   yt   zt   u_eq_2(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   split_u\  sB    		!id   c         C   s  t  ƒ  } |  j ƒ  } |  j d d ƒ |  j ƒ  } | d k  j t ƒ d k sR t ‚ |  j ƒ  j | ƒ } xD | D]< }	 | j	 |	 ƒ }
 t
 j |
 d ƒ j t ƒ d k sn t ‚ qn W|  j d d ƒ g  } g  } g  } d } x¸t | | ƒ D]§\ }	 } | j | j ƒ t | j d ƒ | k r/| j d d } n | j d } t | j d ƒ | k ri| j d d } n | j d } t | j d ƒ | k r£| j d d } n | j d } t | j d	 ƒ | k rÝ| j d	 d } n | j d	 } t | j d
 ƒ | k r| j d
 d } n | j d
 } t | j d ƒ | k rQ| j d d } n | j d } | j | | | | | | g ƒ | j | j ƒ qæ Wt d | d |  d | d | d | ƒ } x† d d d g d d d g d d d g g D]Z \ } } } t d |  d | d | d | d | d | d | d | d d d d  ƒ 
} | } qãWg  } g  } g  } x| D]w} | j | j ƒ t | j d ƒ | k r–| d } n | j d } t | j d ƒ | k rÉ| d } n | j d } t | j d ƒ | k rü| d } n | j d } t | j d	 ƒ | k r/| d } n | j d	 } t | j d
 ƒ | k rb| d } n | j d
 } t | j d ƒ | k r•| d } n | j d } | j | | | | | | g ƒ | j | j ƒ qZWt d | d |  d | d | d | ƒ } t | j ƒ  7a | S(   NRø   g�íµ ÷Æ°>g        i    g      $@g      @i   i   i   i   i   R   R$   Rq   Rr   Rs   R’   R“   R†   Rƒ   R„   R…   R”   iÿÿÿÿRU   (   R	   R   Rú   Rÿ   R  Rµ   R   R   Rˆ   Ry   R   R�   RÌ   RZ   R   R   t   absR   R   R‘   R£   RJ   RQ   Rû   (   R$   R’   R%   R“   R†   Rü   R  t   ueqR–   R	  Rœ   R   R   R   t   lim_lR   t   l1t   l2t   l3t   l4t   l5t   l6R   t   rtt   rlt   rst   tlsos_(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   tls_from_u_cart�  s¢    	!+      :	
      t   tls_refinementc           B   s#   e  Z d e d  d d e d „ Z RS(   g�íµ ÷Æ°>c         C   sA  t  ƒ  } | d  k r! t j } n  d } | j ƒ  j d | d d | ƒ | j j d | d d | ƒ | j } | j d d ƒ |
 d  k	 rÕ y/ t	 |
 d ƒ } t
 d |
 d	 | d
 | ƒ } Wqt k
 rÑ |
 } qXn- t d
 | d | j j d | d d d d ƒ } | r(t d | d | d d | ƒ n  xÂt d | d ƒ D]­} | Jd t | ƒ } t d | d | d | d | d | d	 | d | d |	 d | ƒ 	} | j j } | j d | d | ƒ | rÜt d | j d | d | ƒ n  | j d
 | d t ƒ | j ƒ  j d | d | ƒ | j ƒ  j t ƒ d k rà| j d d ƒ | j d | d d | ƒ | j d
 | d t ƒ | j ƒ  j d | d d | ƒ t d | j d
 | j ƒ  d	 | d d d d d | d | d | d | d | d d ƒ } q<| j } q<W| rt d | d d  d | ƒ n  | |  _ | | j _ | |  _ t | j ƒ  7a d  S(!   Ns   TLS refinement:Rg   s    start modelRU   Rø   g�íµ ÷Æ°>i    t   valueR   R$   R’   R%   R“   id   R†   R   s    start parametersi   s!   TLS refinement: after macrocycle RÐ   Rƒ   R„   R…   RØ   RÎ   Rß   s    : after making positive definitei
   t    number_of_u_nonpositive_definitet   epst+   number_of_macro_cycles_for_tls_from_uanisoss   TLS refinement: final values(   R	   RJ   RK   RL   t   infot   show_targetsR$   t   show_u_statisticsRú   R  R‘   RC   R  R&   R   Rb   RŠ   t   strRÅ   RÒ   R¢   Rä   Rµ   t   is_positive_definite_uR  RÌ   t-   make_tlso_compatible_with_u_positive_definitet   deep_copy_scatterersRÐ   RT   Rû   (   RF   RÐ   R7   R   RØ   Rƒ   R„   R…   R“   t   max_number_of_iterationst   start_tls_valueRÎ   R#  RU   t   macro_cycleR”   Rü   t   prefixt   xrst   crash_or_notR   RŸ   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRG   Õ  s’    	  		 		
			N(   RH   RI   RJ   RÌ   Rµ   RG   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR   Ô  s   c         C   sR  t  j  ƒ  } |
 d  k r$ t j }
 n  xì t d | d ƒ D]× } t d |  d | d | ƒ |  j ƒ  } | d k s{ | | k rŽ |  j d |
 ƒ n  |  j d d ƒ t	 d |  d | d | d	 | d
 | d |	 d d d | ƒ } | | k rö |  j d |
 ƒ n  | j
 t ƒ | k r8 Pq8 q8 W|  j ƒ  j
 t ƒ d k s4t ‚ t  j  ƒ  } t | | 7a | S(   Ni   R$   R   R   RU   Rø   g�íµ ÷Æ°>R’   Rƒ   R„   R…   R†   id   R“   i    (   Ru   RJ   RK   RL   RŠ   Rã   R)  R'  Rú   R£   R  RÌ   R   RR   (   R$   R   R†   R"  R#  R$  R   Rƒ   R„   R…   RU   R{   R�   t   ipd_1R~   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR*  1  s:     	 !c         C   s¬  t  j  ƒ  } | d  k r? | | | g j d  ƒ d k sc t ‚ n$ | | | g j d  ƒ d k sc t ‚ | d  k	 rû g  } g  } g  } | } | | | | | | g } | | | | | | | | | g	 }	 x8 |  D]- }
 | j | ƒ | j | ƒ | j |	 ƒ qÇ Wn  g  } x0 |  D]( }
 | j |
 ƒ } | j | j ƒ  ƒ qWg  } xQ t | | | | ƒ D]: \ } } } } | j t d | d | d | d | ƒ ƒ qPWt  j  ƒ  } t	 | | 7a	 | S(   Ni    i   R   R   R   R   (
   Ru   RJ   R  R   R   Ry   t   center_of_massRZ   R   RS   (   R   R$   R!  Rq   Rr   Rs   R{   R¹   t   vtlt   vsR   RÕ   R0  R   t   T_t   L_t   S_t   origin_R~   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyR‘   Z  s2     '$!(,gñhãˆµøä>c         C   s™  |  j  } g  } xxt t | ƒ ƒ D]d}	 g  }
 xHt d ƒ D]:} g  } xd D]ü } g  } x! | D] } | j t | ƒ ƒ qa W| | } | |	 | c | 7<g  } xQ t | | | | ƒ D]: \ } } } } | j t d | d | d | d | ƒ ƒ q¸ Wt d | j d	 | d
 | d t	 ƒ | j
 d t ƒ |  d t	 ƒ j ƒ  } | j | ƒ qN W| d | d d | } |
 j | ƒ q; W| j |
 ƒ q" Wg  } xxt t | ƒ ƒ D]d}	 g  } xHt d ƒ D]:} g  } xd D]ü } g  } x! | D] } | j t | ƒ ƒ qâW| | } | |	 | c | 7<g  } xQ t | | | | ƒ D]: \ } } } } | j t d | d | d | d | ƒ ƒ q9Wt d | j d	 | d
 | d t	 ƒ | j
 d t ƒ |  d t	 ƒ j ƒ  } | j | ƒ qÏW| d | d d | } | j | ƒ q¼W| j | ƒ q£Wg  } xxt t | ƒ ƒ D]d}	 g  } xHt d ƒ D]:} g  } xd D]ü } g  } x! | D] } | j t | ƒ ƒ qcW| | } | |	 | c | 7<g  } xQ t | | | | ƒ D]: \ } } } } | j t d | d | d | d | ƒ ƒ qºWt d | j d	 | d
 | d t	 ƒ | j
 d t ƒ |  d t	 ƒ j ƒ  } | j | ƒ qPW| d | d d | } | j | ƒ q=W| j | ƒ q$W| | | f S(   Ni   iÿÿÿÿi   R   R   R   R   R$   R   R   RÏ   Rß   Rà   i    i   i	   (   iÿÿÿÿi   (   iÿÿÿÿi   (   iÿÿÿÿi   (   RÁ   RÝ   R   R   R¸   RZ   R   Rã   R$   RÌ   Rä   Rµ   Rå   (   RÓ   Rq   Rr   Rs   RÕ   R   Râ   RÐ   t   derivative_TRÞ   t   dTR�   t   target_valuest   d_signR6  Rp   t   dR   RÚ   RÛ   RÜ   t   originit   t_wt
   derivativet   derivative_Lt   dLR7  t   derivative_St   dSR8  (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyRç   w  s¬    	
(	
(	
(	c         C   s�   | j  ƒ  } | j d ƒ } t j | j ƒ  t ƒ } x' |  D] } | j | ƒ } | | O} q: W| | @j t ƒ d k r‰ t d d ƒ ‚ n  d  S(   Ns   resname HOHi    s8   TLS groups contain waters, which will conflict with the s   water picking procedure.(	   t   atom_selection_cacheR   R   t   boolRw   RÌ   R  Rµ   R
   (   R%   R/   t   cachet	   water_selt   tls_selt   sele_strt	   group_sel(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   check_tls_selections_for_watersÝ  s    (=   t
   __future__R    R4   R   t   cctbx.array_familyR   RK   Ru   t   scitbxR   t   mmtbx_tls_extt   libtbxR   t   libtbx.test_utilsR   t   cctbxR   R   t   libtbx.utilsR	   R
   t   libtbx.str_utilsR   R   t   mmtbx.utilsR@   t!   iotbx.pdb.remark_3_interpretationR-   R9   RD   t   objectR(   RM   RN   RO   RP   RQ   RR   RS   RT   RJ   RW   R&   Ra   Rb   Rt   R   Rµ   R£   R‹   RÂ   RÅ   Ræ   Rã   R  R  R   R*  R‘   Rç   RM  (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/tls/tools.pyt   <module>   sv   
		
	)	CDDŠ
	(Od !`