ó
Î™xTc           @   s+  d  d l  m Z d  d l m 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 m Z d  d	 l m Z d  d
 l m Z d  d l Z d a d d „ Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   flex(   t   adopt_init_argsN(   t   approx_equal(   t   lbfgs(   t   adptbx(   t   xray(   t   user_plus_sys_time(   t   crystalg        c         C   sI   |  d  k r t j }  n  t } | d k rE |  d IJ|  d t IJn  | S(   Ng{®Gáz„?s   Group ADP refinement:s1     time_group_py                          = %-7.2f(   t   Nonet   syst   stdoutt   time_group_py(   t   outt   total(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyt
   show_times   s     
t   sphere_similarity_restraintsc           B   s    e  Z d  d „ Z e d „ Z RS(   g      @c         C   s¸   | |  _  t t | ƒ j ƒ d k s* t ‚ | |  _ | |  _ | |  _ | j d |  j ƒ } | j	 ƒ  |  _
 |  j |  j g j t ƒ d k s� t ‚ | j ƒ  |  _ | j ƒ  j ƒ  |  _ d  S(   Nt   boolt   distance_cutoffi   (   t	   selectiont   strt   typet   __name__t   AssertionErrort   sphere_radiust
   refine_adpt
   refine_occt   pair_asu_tablet   extract_pair_sym_tablet   pair_sym_tablet   countt   Truet
   sites_fract	   unit_cellt   orthogonalization_matrix(   t   selft   xray_structureR   R   R   R   R   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyt   __init__   s    	!				'c   
      C   s}  | r | j  ƒ  } n | } |  j r3 | j ƒ  } n  |  j rQ | j ƒ  j ƒ  } n  | rt j | ƒ } t j | ƒ } t	 | | ƒ t	 | | ƒ d d d k  rt j
 | ƒ } | j ƒ  } t j ƒ  } xB t | ƒ D]1 }	 | j | d | t j d d d g ƒ ƒ qÕ Wqn  t j d |  j d	 |  j d
 |  j d | d |  j d |  j d |  j d |  j d d d d d d d t d t ƒ S(   Ni   id   gü©ñÒMbP?gš™™™™™¹?iÿÿÿÿi    i   R   R"   R    t   u_isosR   t	   use_u_isot
   grad_u_isoR   t   distance_powert   average_powert	   min_u_sumg�íµ ÷Æ°>t   compute_gradientst   collect(   t   deep_copy_scatterersR   t   extract_u_iso_or_u_equivR   t
   scattererst   extract_occupanciesR   t   mint   maxt   abst   meant   sizet   doublet   xranget   appendt   randomt   choiceR   t(   adp_iso_local_sphere_restraints_energiesR   R"   R    R   R   R   t   False(
   R#   R$   t   to_compute_weightt   xrst   paramst   pmint   pmaxt   pmeant   n_part   i(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyt   target_and_gradients-   s<    	 	 ,5								(   R   t
   __module__R%   R=   RF   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyR      s   t   managerc           B   sD   e  Z d d  d e d e d e e e d d d d „ Z d d „ Z RS(   i2   i   gñhãˆµøä>c   $      C   s~  t  j ƒ  } x | D] } | j | ƒ q Wt  j | j j ƒ  j ƒ  | ƒ } t ƒ  } |  j d | j	 ƒ  d | j
 ƒ  d | j ƒ  d d d d d |
 d | d	 | d
 | ƒ 	| d  k r¾ t j } n  |
 | g j t ƒ d k sß t ‚ | d  k rg  } | j t  j | j j ƒ  j ƒ  t ƒ ƒ n t | ƒ d k s4t ‚ g  } g  } x� | D]y } |
 rl| j t j d ƒ ƒ n  | r‚| j d ƒ n  t t | ƒ j ƒ d k r³| j | j ƒ  ƒ qG| j | ƒ qGW| } | j j ƒ  } | j d t ƒ | j j ƒ  } | j j ƒ  } x˜ | D]� } |
 r…xU | D]M } | | } | j j ƒ  s!| j j t ƒ | j  d k rnd | _  qnq!q!W| j! d | ƒ n  | r| j" d | ƒ qqWd  } | rÕt# d | j d | d |
 d | ƒ } n  | j$ ƒ  } t  j% ƒ  } | j j ƒ  j$ ƒ  } d  } d |  _& xÕt' d | d d ƒ D]½} | d  k	 rF| j( } n  t) d | d | d | d | d |
 d | d | d |	 d | d | ƒ 
} | d  k	 rµ| j( } |  j& | j& 7_& n  t* d | j d | d | d | d |
 d | ƒ | j+ d | j d t ƒ | j, j	 ƒ  }  | j, j
 ƒ  }! t- |  | j	 ƒ  ƒ s5t ‚ |  j d |  d |! d | j, j ƒ  d | d | j. d |
 d | d	 | j/ d
 | ƒ 	| r(| j |  ƒ | j ƒ  d k rå| j ƒ  d }" t0 | |" | |" d ƒ | k  râPqâqåq(q(W| j j1 ƒ  | j+ d | j d t ƒ | rat  j ƒ  }# x | D] } |# j | ƒ q(W| j j2 d | d | d |# ƒ n  | |  _, t3 | j4 ƒ  7a3 d  S(   Nt   rwt   rft   twt   mci    t   itR   R   t   weightR   i   g        R   t   stateiÿÿÿÿt
   iselectionR$   R   t   fmodelt   sc_startt
   selectionst   par_initialt   max_number_of_iterationst   run_finite_differences_testt   restraints_managert   restraints_weightt   part   update_f_calct   occ_maxt   occ_min(5   R   t   size_tt   extendR   R$   R0   R6   R   t   showt   r_workt   r_freet   target_wR	   R
   R   R   R   R   R9   t   lenR   t   b_as_uR   R   R   RP   t   flags_set_gradsR=   R'   t   use_u_anisot   flagst   set_use_u_isot   u_isot   flags_set_grad_u_isot   flags_set_grad_occupancyR   t	   deep_copyR7   t   testedR8   t   par_mint   group_minimizert   apply_transformationt   update_xray_structureRQ   R   t   counterRN   R4   t   tidy_ust   adjust_occupancyR   t   elapsed($   R#   RQ   RS   RU   t   number_of_macro_cyclest   use_restraintsRX   t   convergence_testt   convergence_deltaRV   R   R   t   logt   occupancy_maxt   occupancy_mint   tmpt   st   selections_as_boolt   timerRT   t   selections_t   selR0   t   save_use_u_isot   save_use_u_anisot   scRW   t   fmodel_copyt   rworksRR   t	   minimizedt   macro_cyclet   rworkt   rfreeR6   t   i_selection(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyR%   P   sò     			 !%  
 		 								"	
	c
         C   su  |	 d  k r t j }	 n  t | ƒ } t | ƒ } | r? d }
 n  | rN d }
 n  d } d t |
 | | | ƒ } d d | d } |	 |
 | | | | IJd }
 | d  k rÁ d	 t | ƒ } n d	 t d
 | ƒ j ƒ  } d t d | ƒ } d t d | ƒ } d t d | ƒ } d t | | | | ƒ } d | d } |	 | | | | | IJ|	 d d d d IJd  S(   Ns+   |-group b-factor refinement (macro cycle = s,   |-group occupancy refinement (macro cycle = s   ; iterations = iM   t   )t   -t   |s   | s    restraints weight = s   %10.3fs   | r_work = s   %.4fs
    r_free = s
    target = s   %.6fiN   t    (   R	   R
   R   R   Rc   t   strip(   R#   RI   RJ   RK   RL   RM   R   R   RN   R   t   part1t   part2t   nt   part3t   part4t   end(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyR_   Ù   s.      	 	N(   R   RG   R	   R=   R   R%   R_   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyRH   O   s   „Ro   c           B   sY   e  Z e d d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z RS(	   c         C   sŒ  t  |  t ƒ  ƒ | j ƒ  |  _ |  j j ƒ  d |  _ t |  j ƒ t |  j ƒ k sY t ‚ t	 j
 |  j ƒ |  _ |  j |  j ƒ |  _ |  j j ƒ  |  _ |	 |  _ |  j d  k	 r>|  j d  k r>|  j d t ƒ j d | d | ƒ } |  j j d |  j j d t ƒ } | j ƒ  } | d k r2| j j ƒ  | |  _ q>d |  _ n  |  j d  k	 re|  j d  k	 set ‚ n  | rŒt j ƒ  |  _ t j ƒ  |  _ n  t j d |  d	 t j  d
 | ƒ d t j! d t d t ƒ ƒ |  _" |  j# ƒ  |  ` d |  _$ | rˆx, t% |  j |  j ƒ D] \ } } | G| GHq Wt j& |  j |  j ƒ } | d k  } | j ƒ  d k rˆ| j' t ƒ d | j ƒ  d k rˆ|  j$ d 7_$ qˆn  d  S(   Ni    R,   Ri   t	   occupancyR$   R>   g      ð?t   target_evaluatort   termination_paramst   max_iterationst   exception_handling_paramst-   ignore_line_search_failed_step_at_lower_boundt-   ignore_line_search_failed_step_at_upper_boundgü©ñÒMbP?g      Y@i2   i   ((   R   t   localst   target_functort   prepare_for_minimizationRr   Rc   RS   RT   R   t   copyt   deepcopyRn   t   packt   xR6   R”   RN   RW   R	   R   t   gradients_wrt_atomic_parametersRF   RQ   R$   t   normt	   gradientsR   R7   t
   buffer_anat
   buffer_finR   t   runt   termination_parameterst   exception_handling_parameterst	   minimizert    compute_functional_and_gradientsRm   t   zipR4   R   (   R#   RQ   RR   RS   RT   R   R   RU   RV   RX   RW   t   gxt   rtgt   gx_normt   at   ft   diffR~   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyR%   û   sV    	$								
	"5c         C   s7   d  } |  j d  k	 r3 |  j j d |  j j ƒ } n  | S(   NR$   (   R	   RW   RF   RQ   R$   (   R#   t   result(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyt   get_restraints_tg3  s
    c         C   sF   t  d |  j d |  j d |  j d |  j d | d |  j ƒ  d |  j ƒ S(   NR    RS   R   R   R,   R²   RN   (   t   target_and_gradsR    RS   R   R   R¸   RN   (   R#   R,   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyt   get_tg:  s    				c         C   sA   t  d |  j j d | d |  j d |  j d |  j d |  j ƒ d  S(   NR$   RY   RR   RS   R   R   (   Rp   RQ   R$   RR   RS   R   R   (   R#   RY   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyt   apply_shiftsD  s    			c         C   s   t  j t | ƒ ƒ S(   N(   R   R7   t   tuple(   R#   RY   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyR¤   M  s    c         C   s   t  |  j ƒ |  _ d  S(   N(   R¼   R¥   Rn   (   R#   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyt   unpack_xP  s    c         C   sH  |  j  j ƒ  d k rDt j t j |  j ƒ ƒ } d } t |  j ƒ } |  j | | | | <|  j d | ƒ |  j  j	 d t
 ƒ |  j d t ƒ j ƒ  } |  j | | | | <|  j d | ƒ ~ |  j  j	 d t
 ƒ |  j d t ƒ j ƒ  } |  j d |  j ƒ |  j  j	 d t
 ƒ |  j j |  j | ƒ |  j j | | | d ƒ n  d  S(   Ngü©ñÒMbP?gñhãˆµøä>RY   RZ   R,   i   (   RQ   R`   R   t	   max_indexR4   t   gt   listRn   R»   Rq   R   Rº   R=   t   targetR©   R9   Rª   (   R#   t   i_g_maxt   epst   par_epst   t1t   t2(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyt   finite_difference_testS  s"    c         C   sž   |  j  ƒ  |  j d 7_ |  j d |  j ƒ |  j j d t ƒ |  j d t ƒ } | j ƒ  |  _	 t
 j | j ƒ  ƒ |  _ |  j rŽ |  j ƒ  n  |  j	 |  j f S(   Ni   RY   RZ   R,   (   R½   Rr   R»   Rn   RQ   Rq   R   Rº   RÁ   Rµ   R   R7   t   gradients_wrt_parR¿   RV   RÇ   (   R#   t   tg_obj(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyR¯   f  s    
	N(   R   RG   R=   R	   R%   R¸   Rº   R»   R¤   R½   RÇ   R¯   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyRo   ú   s   
-		
					c   	   
   C   sÒ   t  | ƒ t  | ƒ k s t ‚ | | g j t ƒ d k s? t ‚ | j ƒ  } xs t | | ƒ D]b \ } } | r˜ t j d | d |  j ƒ  d | d | ƒ n  | r[ t j	 d | d | d | ƒ q[ q[ W|  j
 | ƒ d  S(   Ni   R0   R!   t   u_shiftR   t   q_shift(   Rc   R   R   R   Rl   R°   R   t   shift_usR!   t   shift_occupanciest   replace_scatterers(	   R$   RY   RS   RR   R   R   t   new_scR‚   t   pari(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyRp   r  s     !	
	R¹   c           B   s,   e  Z e d d d  „ Z d „  Z d „  Z RS(   c         C   sõ   | | g j  t ƒ d k s! t ‚ | d | ƒ } | j ƒ  |  _ | d  k	 re |  j | | j |  _ n  | rè | j d | d | ƒ }	 | d  k	 r£ |	 | | j }	 n  g  |  _	 xB | D]. }
 |	 j
 |
 ƒ } |  j	 j t j | ƒ ƒ q³ Wn	 d  |  _	 d  S(   Ni   R,   Ri   R˜   (   R   R   R   t   target_workRµ   R	   t   residual_sumR¦   R¨   t   grads_wrt_part   selectR9   R   t   sum(   R#   R    RS   R   R   R,   R²   RN   t   t_rt   target_grads_wrt_parR‚   t   target_grads_wrt_par_sel(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyR%   ‹  s     	! 			 c         C   s   |  j  S(   N(   Rµ   (   R#   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyRÁ   ¥  s    c         C   s   |  j  S(   N(   RÓ   (   R#   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyRÈ   ¨  s    N(   R   RG   R   R	   R%   RÁ   RÈ   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyR¹   Š  s
   	(   t
   __future__R    t   cctbx.array_familyR   t   libtbxR   R
   t   libtbx.test_utilsR   t   scitbxR   R¢   t   cctbxR   R   t   libtbx.utilsR   R   R:   R   R	   R   t   objectR   RH   Ro   Rp   R¹   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/group.pyt   <module>   s$   7«x	