ó
R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 m Z d  d l m Z d  d	 l m Z m Z d  d l Z d
   Z d e f d     YZ d e f d     YZ d e f d     YZ d e f d     YZ d   Z d e f d     YZ e e d  Z d d e d d d d  Z  d S(   i’’’’(   t   division(   t   bfgs(   t   xrayN(   t   flex(   t   matrix(   t   Autot
   group_args(   t   count(   t   pit   atan2c         C   s   |  t  t t  |  | |  S(   N(   R   R	   (   t   limitt   gradt   curv(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   delta_estimation_minus_cos   s    t   shift_limit_pairc           B   s8   e  Z d  d d g Z d d d  Z d   Z d   Z RS(   t   negt   post   curv_est_factorg¹?c         C   s|   | d k s t   | d  k r' | } n | d k s9 t   | d k sK t   | d k s] t   | |  _ | |  _ | |  _ d  S(   Ni    i   (   t   AssertionErrort   NoneR   R   R   (   t   OR   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   __init__   s    			c         C   s   | d k  r |  j  S|  j S(   Ni    (   R   R   (   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   get    s     c         C   s#   | d k  r |  j  t S|  j t S(   Ni    (   R   R   R   (   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   curv_est_shift$   s    N(   t   __name__t
   __module__t	   __slots__R   R   R   R   (    (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR      s   	t   dynamic_shift_limit_sitec           B   s)   e  Z d  Z d g Z d   Z d   Z RS(   sZ   neg, pos estimation: xrefine_pot first_negative_after_min(curv)
  neg = pos = d_min / 2
  t   widthc         C   s   | |  _  d  S(   N(   R   (   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR   0   s    c         C   s   t  d |  j  S(   NR   (   R   R   (   R   t   x(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   pair3   s    (   R   R   t   __doc__R   R   R   (    (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR   )   s   		t   dynamic_shift_limit_u_isoc           B   s#   e  Z d  g Z d   Z d   Z RS(   t   d_minc         C   s   | |  _  d  S(   N(   R!   (   R   R!   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR   :   s    c         C   st   | } d |  j  d } t d d d |  j   } d } | | t d |  | } t d |  } t d	 | d
 |  S(   sć   neg, pos estimation: xrefine_pot first_negative(curv)
    d_min y_interc slope
      0.5   0.04    1.6
      1     0.06    1.5
      2     0.2     1.4
      3     0.4     1.3
      4     0.6     1.2
      5     1.4     1.1
    g©?i   g      š?gł?g¹?g      ą?g        g{®Gįz?R   R   (   R!   t   maxR   (   R   R   t   u_isot   y_interct   slopet   slope_attenuationR   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR   =   s    
(   R   R   R   R   R   (    (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR    6   s   		t	   xfgc_infoc           B   s2   e  Z d  d d d d d g Z d   Z d   Z RS(   R   t   funclt   gradst   curvst
   is_iteratet   approx_quadsc         C   sL   | j  j   |  _  | j |  _ | j |  _ | j |  _ | |  _ d  |  _ d  S(   N(   R   t	   deep_copyR(   R)   R*   R+   R   R,   (   t   kt   work_objR+   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR   S   s    	c         C   sß   | |  k	 s t   |  j } | j } |  j } | j }	 | | | | | j |  k }
 t |	 j |   | t | j |   k } | j |  j } t |	 j |   | t | j |   k } | | k sÕ t   |
 oŽ | S(   N(   R   R(   R)   t   dott   absR   (   R.   t   lt   pkt   akt   c1t   c2t   fkt   flt   gkt   glt	   decr_condt	   curv_condt   skt   curv_cond_sk(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   check_strong_wolfe[   s    				!..(   R   R   R   R   R?   (    (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR'   O   s   	c         C   s$   |  d k  r d S|  d k r  d Sd S(   Ni    i’’’’i   (    (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   sign0j   s
      t
   refinementc           B   sF  e  Z d$ d$ d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d d  Z
 d	   Z d$ d
  Z d   Z d   Z d   Z d$ d  Z d   Z d   Z d   Z d   Z d e e d  Z e d  Z d d  Z d   Z d   Z d d  Z d   Z d   Z d   Z d d$ d   Z  d!   Z! d"   Z" d#   Z# RS(%   c   
   	   C   s%  | |  _  | |  _ | |  _ | |  _ |  j   | |  _ d  |  _ d  |  _ d  |  _	 |  j
   |  j d  k rw d  |  _ n |  j d |  j  |  j |  _ |  j   d G|  j j   GH| d  k	 rÜ |  j j   | k sÜ t  n  | |  _ d  |  _ t |  j  j j  d k rh|  j  j } | j d  k	 r„| j d k  sK| j |  j j   k rtt d | j |  j j   d f   n  | j d  k	 rĆt d | j | j f   qĆn | j d  k rĆt d   n  t | j  d k rö| j d  k röt d   n  d	   }	 t d
 |	 |  j  j j | j j  d |	 |  j  j j | j j  d |	 |  j  j j | j j   |  _ n  |  j   g  |  _  |  j! d t"  d  |  _# d  |  _$ d |  _% |  j d  |  j  j& rĢ|  j'   n# |  j  j( rå|  j)   n
 |  j*   d |  j+ d t |  j   |  j% f GH|  j d  d  S(   Nt   xray_structures   Number of variables:i    s.   Out of range: plot_samples.ix = %d (max is %d)i   sR   Incompatible parameter combination: plot_samples.ix=%d and plot_samples.ix_auto=%ss?   Either plot_samples.ix or plot_samples.ix_auto must be defined.s^   Incompatible parameter combination: plot_samples.pyplot=None and plot_samples.file_prefix=Nonec         S   s   | d k r |  S| S(   NR   (    (   t   maint   sub(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   select¢   s     t   typet   obs_typet   weighting_schemeR+   s
    UNDEFINEDt   initials*   Number of iterations, evaluations: %d %d%st   final(,   t   paramst   i_obst   f_obsRB   t   setup_bulk_solvent_correctiont   reference_structureR   R)   R*   t   grads_mean_sqt   show_rms_infot   x_referencet   pack_variablesR   t   sizeR   t   plot_samples_idt	   ps_targett   lent   plot_samplest   stagest   ixt   RuntimeErrort   ix_autot   pyplott   file_prefixR   t   targetRF   RG   RH   t   calc_weights_if_neededt
   xfgc_infost
   update_fgct   Truet   pseudo_curvst   pseudo_curvs_i_infot   termination_remarkt   use_classic_lbfgst   classic_lbfgst   use_lbfgs_emulationt   lbfgs_emulationt   developmental_algorithmst   i_step(
   R   RL   RM   RB   RK   RO   t   expected_n_refinable_parametersRU   t   pRE   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR   q   sx    				
				

		'#$	$
				
"c         C   sń  |  j  j } | | j k r d  S| j d  k	 rD |  j | | j  n©| j d k r xt |  j j	    D] } |  j | |  qi Wng| j d k rŚ| j
 j d  k	 s­ t  | j
 j d k sÅ t  | j
 j d  k	 sŻ t  t j d | j
 j  } |  j j   j   j   j   } t j |  j j	   t  } x` | D]X } | j	   } t | | j
 j  }	 | j d | d |	  }
 | j | j |
  t  q8WxV t |  j  D]/ \ } \ } } | | r¤|  j | |  q¤q¤Wn t d | j   d  S(   Nt   allt   randomi    t   seedt   population_sizet   sample_sizes!   Unknown plot_samples.ix_auto = %s(   RK   RX   RY   RZ   R   t   plot_samples_ixR\   t   xrangeR   RT   t	   ix_randomt   samples_each_scattering_typeR   t   random_seedR   t   mersenne_twisterRB   t
   scattererst   extract_scattering_typest   i_seqs_by_valuet   valuest   boolt   Falset   mint   random_selectiont   set_selectedRE   Rc   t	   enumeratet   x_infoR[   (   R   t   stageRn   RZ   t   mtt   i_seqs_groupedt   i_seqs_selectedt   i_seqst   pst   sst   iselt   i_sct   _(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRX   Ā   s0    !"
c            s3    j  j    j  \      f d   } |      j j t j  g       f d     j   d 	  j   j	 d  
     	 
  f d   } |    d G GHt
 j j   g        f d   } g    d k r j  j k  st   j d k s)t  xRt  j d  D]S }  j |  j  j  j } | 	 _ |   }  j | | 	 j f  q=Wnē j d k s¬t   j d k sĮt  
 j   }	 |	 j   }
 d	 j   } | d k sśt   | } t   j | | |
 ! } | | } d
 d l m } | |	 j d |  	 j  s\t  	 j } | d | | <|	 j d |  	 _  j   j  	 j |  } | d k sµt   j | } x¹ t  j d  j d d  D] } |  j d | } | | | | <|	 j d |  	 _ |   }  j   j  	 j |  } | d k  r`| d
 9} n   j | | | | f  qåWd  j!  | f       f d   } |   t"  j#  d k r/d
 d l$ m# } | j%     j& d d d  } t'    \ } } } | j( | | d    j  } | j( | | g t)   t*   g d    j+ d  k	 r¦  j+  } | j( | | g t)   t*   g d  n  | j-  d d | j.  d d  d
 d d  d  g     f d   } d  j# k r|   n  d  j# k r/| j/   q/n  d  S(   Nc             sL     j  j    }  |  j } z d |  _   j   j   } Wd  | |  _ X| S(   Ni    (   RB   Rz   t	   occupancyt
   get_f_calct   data(   t   sct   occt   result(   R   R   (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   f_calc_without_moving_scattererį   s    		
c              s+     j  j d  d d d t  j   j   S(   NRB   t	   algorithmt   directt   cos_sin_table(   RM   t!   structure_factors_from_scatterersR   t   f_calcR   (    (   R   t   xs(    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   f_calc_movingģ   s    i    c        	      s2   d   j     j  j  j  j    f S(   Ns!   %s|%03d|%03d|%s|%s|occ=%.2f|%s|%s(   RU   t   labelt   scattering_typeR   t   special_op_simplified(    (   R   R   RZ   R   R   t   x_type(    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   build_info_stró   s    	s   plot_samples:c       	      si     j  d   j d   j j d       d d d   j d   j  }  |  j   }  j |  | S(   Nt   f_cbsR   R   t   derivatives_depthi    R_   t   weights(   t   _refinement__get_tgt	   get_f_cbsRM   t   customized_copyRV   t
   ps_weightst   target_workt   append(   t   tgt   y(   R   t   f_calc_fixedR   t   ys(    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt	   ys_append  s    			t   ui   t   xyzi’’’’(   t   approx_equalt   independent_paramsi   s
   %s_%03d_%sc             s¢    j  d  k r d  St   d d  }  |  d  IJ|  d t  j    IJ|  d t  j   j    IJx-  D]% \ } } } |  | I| I| IJqu Wd  S(   Ns   .xyt   ws   # %s(   R^   R   t   opent   strt	   unit_cellt   space_group_infot   symbol_and_number(   t   fR   R¬   t   v(   t   base_name_plot_filest   info_strRn   R   t   xyv(    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt	   write_xyv1  s      (   R]   s   r-s   k--s   r--t   fontsizei   c              s.    j  d  k r d  S j   d d d d  S(   Ns   .pdft   bbox_inchest   tight(   R^   R   t   savefig(    (   R¼   t   figRn   (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt	   write_pdfG  s     t   pdft   gui(0   RK   RX   R   RB   RE   R   t   size_tRz   t   site_symmetry_tableR   t   syst   stdoutt   flusht   u_mint   u_maxR   t   u_stepsRu   R#   RŖ   t   x_radiust   x_stepst   site_constraintst   n_independent_paramst   findt   listR   t   libtbx.test_utilsR²   t
   all_paramst   siteR·   t   distanceR^   RW   R]   t   libtbxt   figuret   add_subplott   zipt   plotR   R"   RR   R   t	   set_titlet   axist   show(   R   R   RZ   R   R”   RÆ   Rl   R°   R¬   t	   ss_constrt   ss_npt   ss_ipt   ixxt   indept   i_inpR²   t   site_inpt   distt   x_scaleR   Ræ   R]   t   axR»   RÅ   (    (   R   R¼   R­   R   RÄ   R   R½   RZ   Rn   R   R   R    R   R¾   R®   s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRt   Ž   s    		
		
"		 

!	)	 +.)
c         C   s  d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ |  j j sF d  S|  j j	 j
 j d k r® |  j j   |  _ |  j j   |  _ d GH|  j j d d d d  d t  |  _ n  d Gt j j   d d  l } | j j d	 |  j d
 |  j d |  j  } | j d t d t  d GHt j j   d GHd Gt | j    GHd | j   GHd Gt | j   d d GH| j   |  _ |  j j d | j    |  _ d GH|  j j   } | j d d  | j d t  j  d d  |  j d  k	 rd Gt j j   | j   |  _ d GHn  t j j   d  S(   Nt   mls?   INFO: generating R-free flags for plot_samples.target.type = mlt   fractiong©?t   max_freet   use_lattice_symmetrysC   Computing bulk-solvent model and anisotropic scaling correction ...i’’’’RM   t   r_free_flagsRB   t   verboset   optimize_masks   done.s   bulk-solvent correction:s	     k_sols:s     b_sol: %.6gs	     b_cart:t   zero_thresholdgķµ ÷Ę°>R   s     mean of f_bulk.amplitudes():t   n_binsi   t   use_binningt   prefixs       s&   Computing alpha-beta for ml target ...(!   R   t   epsilonst   centric_flagsRš   t   f_bulkt   fb_cartt
   alpha_betaRK   t   bulk_solvent_correctionRX   R_   RF   RM   t   generate_r_free_flagsRc   RŹ   RĖ   RĢ   t   mmtbx.f_modelt   f_modelt   managerRB   t   update_solvent_and_scaleR   t   numstrt   k_solst   b_solt   b_cartR§   t
   amplitudest   setup_binnert   meanRį   (   R   t   mmtbxt   fmmt	   bulk_ampl(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRN   O  sT    								c         C   s,   d d  l  } d |  _ | j j d |   d  S(   Ni’’’’i    t   target_evaluator(   t   scitbx.lbfgsRl   t   lbfgst   run(   R   t   scitbx(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRh   {  s    	c         C   s   |  j    |  j |  j f S(   N(   Rb   R(   R)   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt    compute_functional_and_gradients  s    
c         C   s   |  j  d t  d |  j d |  j   f GHt j j   |  j |  j j	 k  r[ d |  _
 t S|  j d |  j j k r d |  _
 t S|  j d 7_ d  S(   NR+   s   %4d: %si   t    s    (iteration limit reached)(   Rb   Rc   Rl   t   format_rms_infoRŹ   RĖ   RĢ   RP   RK   t   grads_mean_sq_thresholdRf   t   iteration_limit(   R   t	   minimizer(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   callback_after_step  s    		i   c   
      C   sā  t  |  j  d k s t  xĄt |  j j  D]£|  _ |  j d k rf |  j } d |  j j   } né |  j	   } t  |  d k s t  | d  k	 rØ | | d } n  |  j d |  } | d  k	 sĢ t  | d } | d } t j d | j | j d | j | j  } t j |  j j   |  }	 t j d | d	 |	 d
 |  j  } d } |  j | d | } | d  k	 svt  |  j d t  d |  j d |  j   f GHt j j   |  j |  j j k  r. d |  _ Pq. q. Wd |  _ d  S(   Ni   i    t   active_infosi’’’’iž’’’R=   t   ykt   memoryt   hk0R9   t   stpR+   s   %4d: %sR  s    (iteration limit reached)(   RW   Ra   R   Ru   RK   R  Rl   R)   t   normt   get_active_infosR   t   build_bfgs_memoryR   t
   h0_scalingR   R   t   doubleRT   t   hg_two_loop_recursiont   line_searchRb   Rc   R  RŹ   RĖ   RĢ   RP   R  Rf   (
   R   t   memory_ranget   destsR  R  R  t   k_1t   k_2t   gammaR  (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRj     s:    


			c         C   s“   x­ t  |  j j  D] |  _ |  j   d |  j d |  j   f } |  j d  k	 ro | d |  j |  j f 7} n  | GHt	 j
 j   |  j |  j j k  r d |  _ Pq q Wd |  _ d  S(   Ns   %4d: %si   s    aq(%d, %d)R  s    (iteration limit reached)(   Ru   RK   R  Rl   t   compute_stepR  t   aq_sel_sizeR   t	   aq_n_usedRŹ   RĖ   RĢ   RP   R  Rf   (   R   t   s(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRk   ±  s    
	c         C   sc  | d  k r |  j } n  t j   |  _ g  |  _ t j   |  _ g  |  _ g  | j	   j
   d  D] } d | ^ q_ } |  j j   } d } | j   } xĘt | j    D]²\ } } | j j   sŹ t  | j j   są t  | j |  }	 |	 j   r| j } | }
 n3 |	 j   j d | j  } |	 j   j d |  }
 |  j j t j |   |  j j g  t t |   D] } | d | f ^ qu |  j j g  |
 D] } t d |  ^ q¢ x4 t t |   D]  } |  j j |  | d 7} qŃW|  j j | j  |  j j | d f  |  j j t d	 |   |  j j |  | d 7} | d 7} q© Wd  S(
   Ni   g333333Ć?i    R×   R±   R   i   R°   R!   (    R   RB   R   R!  R   R   RČ   t   gact_indicest   dynamic_shift_limitsR·   t
   parametersRM   R!   RÉ   R   Rz   t   flagst	   use_u_isoR   t   use_u_anisoR   t   is_point_group_1RŲ   RŅ   R³   t   extendRu   RW   R   RŖ   R#   R    (   R   RB   Rn   t   site_limitsR!   t   i_allt   sstabR   R   t   site_symmetryR2   t   iR   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRS   æ  sD    		-			9	#
c         C   s  d } |  j  j   } xĶ t |  j  j    D]¶ \ } } | j |  } | j   r| t |  j | | d ! | _ | d 7} nK | j	   } | j
   } | j d t |  j | | | !  | _ | | 7} |  j | | _ | d 7} q+ W| |  j j   k s t  d  S(   Ni    i   R³   i   (   RB   RÉ   R   Rz   R   R3  t   tupleR   RŲ   RŅ   RÓ   R×   R#   RT   R   (   R   RZ   R7  R   R   R8  t   constrt   np(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   __unpack_variablesē  s    ")
c         C   s6  d d l  m } d } |  j j   } xļ t |  j j    D]Ų \ } } | j |  } | j   r t | | | d ! } | d 7} nH | j	   }	 |	 j
   }
 t | | | |
 ! d  g d |
 } | |
 7} | j | |  | d 7} d j g  | D] } | d |  ^ qö  GHq; W| |  j j   k s2t  d  S(   Ni’’’’(   t   format_valuei    i   i   t    s   %15.6f(   t   libtbx.str_utilsR>  RB   RÉ   R   Rz   R   R3  RÕ   RŅ   RÓ   R   RŖ   t   joinR   RT   R   (   R   R%  R>  RZ   R7  R   R   R8  t   valsR;  R<  R»   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt
   show_destsų  s     "&

.c         C   s:   |  j  j } |  j j d |  j d | j d | j  j   S(   NRB   R   R   (   RK   t   f_calc_optionsRM   R   RB   R   R   R   (   R   Rn   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR     s
    		c         C   s^   | d  k r |  j   } n  |  j d  k r. | S| j d |  j j   | j   |  j j    S(   NR   (   R   R   Rł   R§   Rś   R   (   R   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR¦     s    	c         C   s%   |  j  j d |  j   d t d t  S(   Nt   othert   scale_factort   assume_index_matching(   RM   t	   r1_factorR¦   R   Rc   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRH    s    c            s÷   | d k s t   t j |   d d l m } m } m  | d   j j   d      j	 j
   j d  sy t   | d d	 d
 d d   j	 j   d   j	 j
   d  d    | d k rČ  Sd t f       f d     Y} |   S(   NR“   t   ti’’’’(   t   calc_kt   calc_wt   calc_tRM   t   i_calcg{®Gįz?t   wag¹?t   wbi    RL   t   i_sigR.   t   wrapperc              s,   e  Z       f d    Z d   Z RS(   c            s%      j  j       |  _ d  S(   N(   RL   R   RI  (   t   W(   R   RL  RM  R.   R“   (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR   .  s    c         S   s   |  j  S(   N(   RI  (   RR  (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR©   0  s    (   R   R   R   R©   (    (   R   RL  RM  R.   R“   (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRQ  -  s   (   R“   RI  (   R   R   R  t%   cctbx.xray.targets.tst_shelxl_wght_lsRJ  RK  RL  RM   R   RL   t   sigmast   all_get   object(   R   R¢   t   needRJ  RK  RQ  (    (   R   RL  RM  R.   R“   s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   calc_shelxl_wght_ls  s     	(c         C   sč   d  |  _ d  |  _ |  j j j d k } |  j d  k	 oE |  j j d k } | rl |  j j j d k sl t  n  | r |  j j d k s t  n  | s | rä |  j	 d |  j
   j   d d  } | rĻ | |  _ n  | rä | |  _ qä n  d  S(   Nt   shelxl_wght_oncet   IR¢   RW  R“   (   R   R¤   RØ   RK   R_   RH   RV   RG   R   RX  R¦   R   (   R   t	   main_needt	   plot_needR¤   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR`   4  s    		$c         C   s    |  j    |  j d |  j    S(   NR¢   (   t   _refinement__unpack_variablesR„   R¦   (   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   __unpack_variables_get_tgE  s    
i   c         C   s  | t  k r |  j j } n  | t  k r3 |  j } n  | j d k rN |  j } n	 |  j } | j d k r{| j d( k rĮ t	 j
 d t d | j d | j   d |  j d	 d  d
 | j   d | d d  S| j d k rę t d | j   n  | j d k sū t  | d k r#|  j d | j   d d  St	 j j d |  j j   d |  j j   d |  j j   d
 | j   d d  d d d d  S| j d k rŹt	 j d | j d | j   d |  j d	 d  d
 | j   d |  S| j d k r8| j d k sīt  | j d k st  d d l m } | j d |  j j   d
 | j    S| j d k r| d) k sYt  |  j d  k rwt d!   n  t	 j d |  j j   d	 |  j j   d
 | j   d" |  j d j   d# |  j d  j   d d  d$ |  j j   d% |  j j   d& t |   	St d' | j   d  S(*   Nt   Ft   lst   unitRY  t   compute_scale_using_all_dataRG   t   obsR¤   Rš   R   R£   RF  i    t   shelxl_wghts%   Unknown: target.weighting_scheme = %sRZ  R¢   RW  RI  RM   RL   RP  RM  RN  g¹?RO  t   cct   r1i’’’’(   Rf  Rģ   i   s?   target.type=ml can only be used if bulk_solvent_correction=Truet   alphat   betaR÷   Rų   t   compute_gradientss   Unknown target_type: %s(   Ra  s   shelxl_wght_once(   i    i   (   R   RK   R_   R¤   RG   RM   RL   RF   RH   R   t   targets_least_squaresRc   R   R   R[   R   RX  t   targetst   shelxl_wght_lsRT  t   targets_correlationt   cctbx.xray.targetsRf  R÷   t$   targets_maximum_likelihood_criterionRš   Rū   Rų   R~   (   R   R¢   R£   R_   R¤   Rc  Rf  (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   __get_tgI  s~      									c         C   s$  t  |  j  d k rS |  j d } | j j |  j  rS | j sL | | _ n  d  Sn  |  j   } | j   d  k	 sw t  |  j	 j
 d |  j j   d | j   d | j    } | j   |  _ | j j |  j  |  _ | j j |  j  |  _ t j |  j  |  _ |  j j t d |  d |   d  S(   Ni    i’’’’t   miller_indicest   da_dbt   daa_dbb_dabR/   R+   (   RW   Ra   R   t   all_eqR+   t$   _refinement__unpack_variables_get_tgR©   R   R   RB   t   grads_and_curvs_target_simpleRM   t   indicest   gradients_workt   hessians_workR(   R)   RE   R-  R*   R   t   mean_sqRP   RŖ   R'   (   R   R+   t	   prev_xfgcR«   t   gact(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRb     s"    	i    c         C   s;   g  } x. |  j  | D] } | j r | j |  q q W| S(   N(   Ra   R+   RŖ   (   R   t   i_startR   t   info(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR    s
    	c         C   s   g  } x t  t |  d  D]j } | | } | | d } t j d | j | j d | j | j  } | j d  k rz d  S| j |  q W| S(   Ni   R,  R¬   (	   Ru   RW   R   t   memory_elementR   R)   t   rhoR   RŖ   (   R   R  R   t   iinfoR.   R2   t   m(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR  £  s    
,c         C   s  d |  _  d |  _ |  j j d k r( d  St j   } d } g  } xČ t t |  j  d d d  D]§ } |  j | } | j	 r` | d k r° | j
 } | j   } | d k  r÷ d  SnG | j d | j
  } | j   | d k  rń t |  d k rń Pn  | } | j |  q` q` W| j   | j   |  _  t |  d k  sE|  j  d k  rId  Sd |  _ | d t |  j  d k sut  |  j | d j j |  } | j d  s§t  d | }	 g  }
 xū | d  D]ļ } |  j | } |  j | d } | j j |  } | j j |  } | j j |  } | j j |  } t j d | | d	 | |  } | j | j  } | j | j  } | d | k } | sd  S| j d  k r¤d
 GHd  S|
 j |  qĀWt j d |
 d |	 d |  j d j j |   } d |  _ x t | |  D]} \ } } |  j | } | j d |  j |  j d |  j |  } t  |  |  j j | k r | | | <|  j d 7_ q q Wd  S(   Niž’’’i    i   i’’’’i   RE  gĶĢĢĢĢĢģ?R,  R¬   s   Warning: rho <= 0R  R  R9   R   R   (!   R*  R+  RK   t   bfgs_estimate_limit_factorR   RČ   Ru   RW   Ra   R+   R,   RT   t   intersectionRŖ   t   sortR   R*   RE   t   all_gtR   R)   R   R  R0   R,  R  R   R"  RŻ   R.  R   R   R1   (   R   R%  t   aq_selt   aq_sel_size_startt   iinfo_activeR  R~  t   next_aq_selR*   R  R  R.   R2   t   xkt   xlR9   R:   R  t   gkst   glst   wolfe_curv_condt   aq_destst   aq_destRZ   t   dslR
   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   update_dests_using_bfgs_formula®  sr    		&		
!	#
 	)	,
g¹?c         C   sG  |  j  } t j   } x t t   |  j |  j  D]p \ } } } | j d |  j  |  j d |  | } | d k r | d 9} n  | d k s t	  | j
 |  q1 W|  j } | | |  _  |  j   |  j }	 | | |  _  |  j   |  j }
 | |  _  |  j   |  j j   |  j j   |  j j   |	 |
 d | } | |  _ d  S(   NR   R   i    i’’’’i   (   R   R   R!  RŻ   R   R.  R)   R   R   R   RŖ   Rb   Ra   t   popR*   (   R   t   shift_limit_factort
   x_on_entryt   shiftsRZ   R  t   gt   shiftt   grads_zt   grads_pt   grads_mt   apprx(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   approx_curvsģ  s,    	+)	
	
		
c         C   s'   |  j  j r |  j   n
 |  j   d  S(   N(   RK   t	   use_curvst   compute_step_using_curvst   compute_step_just_grads(   R   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR)  	  s    c            s’  t    j  d    j d  t j    xX t t     j  j  D]; \ } } }  j | j	 d   j
 |  j d |   qH W j d  s t       f d   }   j d  k rĻ |   } nš   j   j  } t  |  d k sł t    j d |  } | d  k r,d    _ |   } n d   j } t j d | d	 | d
  j  } t j t j |    }	 |	 d k rd G|	 GH| d |	 9} n  t j |  j  d  sæt    j | d d }
 d G|
 GH|
 d  k	 rö| |
 9} nR   j d  k	 rHd    _ |   }   j | d d }
 |
 d  k	 rH| |
 9} qHn    j d  k rÉ| d k j  j d k   s{t  t j |  j  d  st   j |   _   j j d  sÉt  n   j
 |   _
   j d t  d    _ d    _ d  S(   Ni   i’’’’R   R   i    c             s   t  j t  j  j   }  |  d k s- t   j |   d } t  j |  j  d d  si t  | d k j  j d k   s t     _ | S(   Ni    i   i   gķµ ÷Ę°>gzo š?(   R   R"   R1   R)   R   t   all_leRt  Re   (   t   ag_maxR%  (   R   t
   inp_i_infot   inp_infot   limits(    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   get_pseudo_curvs  s    &$	R  R  R  R9   s   madl:gķµ ÷Ę°>t   stpmaxg       @s	   dest_adj:R+   gzo š?gzo š?(   RW   Ra   R   R!  RŻ   R   R.  R)   RŖ   R   R   R   R  R   Rd   R   R  Re   R  R   R"  R"   R1   R¢  R#  Rt  Rb   Rc   R*  R+  (   R   RZ   R  R  R§  R%  R  R  R  t   madlt   dest_adj(    (   R   R¤  R„  R¦  s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR”    sT    +0			"			$"	c         C   sæ  t  |  j  d k r1 |  j j r1 |  j d } n d  } t j   } t j   } |  j j rh |  j	   n  xt
 t   |  j |  j |  j  D]o\ } } } } | j d |  j |  j d |  } d  }	 | d  k	 rh| j | }
 t |  t |
  k rh|  j | } | j | } | | |
 | | |
 } | | }	 |	 | k rK| }	 qe|	 | k  re| }	 qeqhn  |	 d  k rģ| d k rĶ|  j j d k rĶt |  |  j j | | k  rĶ| | }	 | j |  qģt d | d | d |  }	 n  | j |	  q W| |  j d _ |  j |  |  j d j |  _ |  j j r|  j | d	 d
 } d G| GH| d  k	 r| d k  r| | 9} qn  |  j j r|  j |  n  |  j | |  _ |  j d t  d  S(   Ni   iž’’’R   R   i    R
   R   i’’’’RØ  g      š?s	   dest_adj:R+   (   RW   Ra   RK   t   use_gradient_flipsR   R   R!  RČ   t   try_approx_curvsR  RŻ   R   R.  R)   R*   R   R   R   R@   t   approx_quad_limit_factorR1   RŖ   R   R,   R  t   x_before_line_searcht   use_line_searchR#  RC  Rb   Rc   (   R   t   prevR%  R,   RZ   R  R  t   cR
   t   destt   prev_gR   t   prev_xt   xmRŖ  (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR   D  sT    !4%
 	  	 i   c   	      C   s  d d  l  } |  j d } | j j   } d | _ d | _ | d  k	 rd | | k sX t  | | _ n  y5 | j	 d |  j
 d |  j d |  j d | d |  Wn, t k
 rĒ } t |  d	 k rĆ   n  d  SX| j d k sŻ t  |  j   x| j d k rż| j d
 |  j d d | d | j d | j d | j  } | j d |  j
 d |  j d |  j  | rv| j d k sšt  nz | j d k r| j d k st  d  S| j d k rÉ| j j d  sÅt  d  S| j d k sšt | j | j f   |  j   qź W| j S(   Ni’’’’g-Cėā6?gĶĢĢĢĢĢģ?R   t
   functionalt	   gradientst   search_directiont,   initial_estimate_of_satisfactory_step_lengths   Search direction not descent.R2   R3   R4   R5   R6   i   s&   The step is at the upper bound stpmax.i   s)   Rounding errors prevent further progress.(   t   scitbx.mathRa   t   matht   line_search_more_thuente_1994t   ftolt   gtolR   R   RØ  t   startR   R(   R)   R[   R¶   t	   info_codeRb   R?   R  t   nextt   info_meaningt
   startswith(	   R   R%  R  RØ  R  R.   R#  t   et   chk(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR#  o  sV    						
			%	c         C   s  |  j  d  k r d  S|  j } |  j  } | j   } | j   } | | } t j | j    } t j | j   j d |   } | | } | | }	 | j	   j
   | j	   j
   }
 | j   j   } | | j   |  _ | |	 j   |  _ t j |
  d |  _ |  j j rxxh t | j	   | |	 |
  D]G \ } } } d | j Gd j g  | D] } d | ^ qQ Gd | GHq*Wn  |  j |  j |  j f S(   Nt   translation_fracg      ą?s	       %-10sR?  s   %6.3f(   RO   R   RB   t
   sites_fracR   t   colR  Rø   t)   subtract_continuous_allowed_origin_shiftsRz   t   extract_u_isoR·   t   orthogonalization_matrixt
   rms_lengtht   crmsdt   armsdR   Rz  t   urmsdRK   t%   show_distances_to_reference_structureRŻ   R   RA  (   R   R   t   rst   xft   rft   cdt   ave_csht   ave_csh_perpt
   caosh_corrt   adt   udt   omxR   t   aR°   R»   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   get_rms_info  s0    		


,$c         C   s   d } |  j    } | d  k	 r@ x | D] } | d | 7} q% Wn  |  j d  k	 rl | d |  j |  j f 7} n  | d |  j   7} | S(   NR  s    %5.3fs    f=%8.2e |g|=%8.2es    r1=%.4f(   RÜ  R   RP   R(   RH  (   R   R,  R~  t   r(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyR  ø  s    c         C   s<   |  j    } t |  d k r8 d GH| GHt j j   n  d  S(   Ni    s    cRMSD aRMSD uRMSD(   R  RW   RŹ   RĖ   RĢ   (   R   R,  (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRQ   Ć  s
    N($   R   R   R   R   RX   Rt   RN   Rh   R  R  Rj   Rk   RS   R]  RC  R   R¦   RH  RX  R`   Ru  R   R„   R   Rb   R  R  R  R  R)  R”  R   R#  RÜ  R  RQ   (    (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyRA   o   s@   J		q	,			!	(							@		>		5	+.		c         C   s  | d  k | d  k k s t  d GH|  j   j   Hd GH| j   j   Hd G|  j d |  GHH| j } | d k r d GH| j d |  Hn  | d  k rī |  j d t d	 d
 d d d t  j	   j
   } | j d t j | j     } n  t d | d | d | d | d |   S(   Ns   Ideal structure:s   Modified structure:s   rms difference:RE  i    s'   structure_shake inter-atomic distances:t   distance_cutofft   anomalous_flagR!   i   R   R   R   R   RL   RM   RB   RK   RO   (   R   R   t   show_summaryt   show_scattererst   rms_differencet   show_distances_thresholdt   show_distancest   structure_factorsR   R   t   intensitiest   arrayR   t   sqrtR   RA   (   t   structure_idealt   structure_shakeRK   RL   RM   t   sdt(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   run_refinementŹ  s8    		$i2   i    gķµ ÷Ę°>s   *direct fftR  c   	      C   sB   d d d  } |   } | d d  } t  j j d t   |  S(   NR  c         S   s   d t    S(   Nsõ         target {
        type = *%(auto)sls cc r1%(ml)s
          .type = choice
        obs_type = *%(auto)sF I
          .type = choice
        weighting_scheme = *%(auto)sunit shelxl_wght shelxl_wght_once
          .type = choice
      }
      (   t   vars(   t   autoRģ   (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   build_target_scopeō  s    
s   Auto s    mlsļ  
    general_positions_only = True
      .type = bool
    shake_sites_rmsd = 0.5
      .type = float
    shake_adp_spread = 20
      .type = float
    show_distances_threshold = %(show_distances_threshold)s
      .type = float
    bulk_solvent_correction = %(bulk_solvent_correction)s
      .type = bool
    %(main_target_scope)s
    iteration_limit = %(iteration_limit)s
      .type = int
    grads_mean_sq_threshold = %(grads_mean_sq_threshold)s
      .type = float
    use_classic_lbfgs = False
      .type = bool
    use_lbfgs_emulation = False
      .type = bool
    use_curvs = True
      .type = bool
    approx_quad_limit_factor = 1.0
      .type = float
    bfgs_estimate_limit_factor = 1.0
      .type = float
    use_line_search = False
      .type = bool
    use_gradient_flips = True
      .type = bool
    try_approx_curvs = False
      .type = bool
    show_dests = False
      .type = bool
    show_distances_to_reference_structure = False
      .type = bool
    f_calc_options {
      algorithm = %(f_calc_options_algorithm)s
        .type = choice
      cos_sin_table = False
        .type = bool
    }
    plot_samples {
      stages = initial final
        .type = choice(multi=True)
      ix = None
        .type = int
      ix_auto = all random
        .type = choice
      ix_random {
        samples_each_scattering_type = 3
          .type = int
        random_seed = 0
          .type = int
      }
      %(plot_samples_target_scope)s
      x_radius = 5
        .type = float
      x_steps = 100
        .type = int
      u_min = -0.05
        .type = float
      u_max = 0.45
        .type = float
      u_steps = 100
        .type = int
      file_prefix = None
        .type = str
      pyplot = *gui pdf
        .type = choice(multi=True)
    }
(   RŚ   t   philt   parseRķ  (	   R  Rć  Rü   R  t   f_calc_options_algorithmt   additional_phil_stringRļ  t   main_target_scopet   plot_samples_target_scope(    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   get_master_philķ  s
    		G(!   t
   __future__R    t	   cctbx.omzR   t   cctbxR   Rn  t   cctbx.array_familyR   R  R   t   libtbx.philRŚ   R   R   t	   itertoolsR   R»  R   R	   RŹ   R   RV  R   R   R    R'   R@   RA   R   Rģ  R   Rö  (    (    (    s;   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/dev.pyt   <module>   s8   		’ ’ ’ b