ó
³™xTc           @   s5  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
 e
 j j d ƒ 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 Z d  d
 l m Z d  d l Z d  d l Z d  d l Z d  d	 l m Z d  d l m Z d „  Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   flexN(   t   bulk_solvent(   t   adptbxt   mmtbx_f_model_ext(   t   sgtbx(   t   bulk_solvent_and_scaling(   t
   group_args(   t   miller(   t   approx_equalc         C   s§  |  d g t  |  ƒ |  t |  ƒ d g } } x_t d ƒ D]Q} | } t j t | ƒ t ƒ } x¬ t | ƒ D]ž \ } } | d k ro | t | ƒ d k ro | | d | | k  rÍ | | d | | k  sý | | d | | k r| | d | | k rt | | <qqo qo Wxs t t | ƒ ƒ D]_ } | d k r$| t | ƒ d k r$| | r$| | d | | | | d d | | <q$q$W| } q= W| d t | ƒ d !S(   Ni    i   i   g      @(   t   listt   lent   xrangeR   t   boolt   Falset	   enumeratet   True(   t   xt   x_t   cyclet   resultt	   selectiont   it   s(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   moving_average   s    0"00,1t   runc           B   s"  e  Z d d  d d d e e e e e e e d „ Z d „  Z d d „ Z d d d d d e d „ Z e d „ Z	 d	 „  Z
 d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z d „  Z d d „ Z d d d d „ Z d „  Z d „  Z d d d „ Z d „  Z d „  Z d d „ Z RS(   t   comboi   g-Cëâ6?c   #      C   s  | j  ƒ  j | j  ƒ  ƒ s! t ‚ |
 |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _	 | |  _
 | |  _ | j ƒ  |  _ d  |  _ d  |  _ | |  _ | |  _ | |  _ |	 |  _ d  |  _ | |  _ | |  _ d \ |  _ |  _ |  j d  k r|  j j ƒ  |  _ n  |  j ƒ  } | rEt j d |  j d |  j j ƒ  ƒ |  _ n9 t j d |  j d t j |  j j ƒ  j  ƒ  t! ƒ ƒ |  _ | |  _ d „  } | ƒ  |  _" |
 d  k r´t# j$ }
 n  | rÕ|
 d d IJ|
 d IJn  t% j& d | j' ƒ  j( ƒ  j) ƒ  ƒ j* ƒ  j+ ƒ  } t% j, d | d	 t! ƒ |  _- t. j/ j0 d
 | d | ƒ |  _1 t2 |  j1 j3 ƒ  ƒ j ƒ  j d ƒ rnt4 |  _ n  g  |  _5 |  j6 ƒ  |  _7 |  j8 ƒ  |  _9 | rµ|
 d t: |  j ƒ IJn  g  |  _; |  j j ƒ  d k } |  j j< d |  j j ƒ  | @ƒ |  _ x¿ t= |  j ƒ D]® \ } } |  j1 j> d | ƒ } |  j j ƒ  j> | ƒ } | |  j j ƒ  @} |  j5 j? | | | | g ƒ |  j j> | ƒ } |  j; j? t j@ | ƒ t jA | ƒ t jB | ƒ g ƒ qWxgtC | ƒ D]Y} |  jD d t! ƒ } | } t4 } | d k r t! } n  | r%|
 d | IJ|
 d | IJn  |  j rº| d k r¥|  jE d | d | d | ƒ } |  jF d | ƒ } | r„|  j d | IJn  |  jE d | d | d | ƒ } qº|  jG d | ƒ } n  | | | g jH t! ƒ rø| rå|
 d IJn  |  jI d | ƒ n  |  j rÇ|  jJ d | d |  j ƒ rÇPqÇqÇW|  jK ƒ  | rU|
 d |  jD ƒ  IJ|  jL ƒ  n  |  jM ƒ  |  _ |  jN ƒ  |  _O | r|  j j ƒ  j> |  j7 ƒ } d t j@ | ƒ jP ƒ  }  d t jA | ƒ jP ƒ  }! | j  ƒ  }" |  j d |! |  |" |  j f IJ|
 d d IJn  |  jD ƒ  |  _Q d  S(   Nt
   miller_sett   datac           S   s%   t  d d  d d  d d  d d  d d  ƒ S(   Nt   k_mask_bin_origt   k_mask_bin_smootht   k_maskt   k_isotropict   k_mask_fit_params(   R   t   None(    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   init_result[   s    t   -iP   s@   Overall, iso- and anisotropic scaling and bulk-solvent modeling:t   symbolt   space_groupt   reciprocal_spacet   f_calct   f_masksi    s     Using %d resolution binsR   t	   use_scales     cycle %d:s       r(start): %6.4ft   r_startt   use_scale_rt   verboses&       r(bulk_solvent_grid_search): %6.4fs       anisotropic scaling:t	   tolerances     r(final): %6.4fs   %7.4fs1   r(low-resolution: %s-%s A; %d reflections): %6.4f(   NN(R   t   indicest   all_eqt   AssertionErrort   logt   scale_methodR-   t   r_free_flagst   ssR   t   try_polyt   try_expanalt
   try_expmint
   d_spacingsR"   t   r_lowt   poly_approx_cutofft   f_obst   auto_convergencet   auto_convergence_tolerancet   scale_matricest   autot   bin_selectionst   k_exp_overallt   b_exp_overallt   log_binningt   is_flags_goodR   t   arrayR   t   selection_workR   R   t   sizeR   t
   bss_resultt   syst   stdoutR   t   space_group_infoR&   t   typet   lookup_symbolt   groupt   build_derived_point_groupt   tensor_rank_2_constraintst   adp_constraintst   mmtbxt   arrayst   initt   coret   abst   f_maskR   t   cores_and_selectionst   _low_resolution_selectiont   low_resolution_selectiont   _high_resolution_selectiont   high_resolution_selectionR   t   ss_bin_valuest   customized_copyR   t   selectt   appendt   mint   maxt   meanR   t   r_factort   set_k_isotropic_expt   k_mask_grid_searcht   bulk_solvent_scalingt   countt   anisotropic_scalingt   is_convergedt   apply_overall_scalet   showt   _r_lowt   _r_hight   r_hight   stript   r_final(#   t   selfR<   R(   RX   R4   R5   RA   R3   t   number_of_cyclesR>   R2   R@   R=   R   R6   R7   R8   R-   t   ifgR#   t   point_groupt   sel_positivet   i_selt   selt   core_selectedt   sel_uset   sel_workR   R+   t   r_start0R,   t   dt   d1t   d2t   n(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   __init__&   sØ    !																						'		 		'	$ 			 		 

c         C   sg   t  } |  j j ƒ  } xK t |  j ƒ D]: \ } } | j | ƒ } | j t  ƒ d k r% t } Pq% q% W| S(   s8   
    This function detects inadequate R-free flags.
    i    (   R   R4   R   R   RA   R`   Ri   R   (   Rs   R   t   fdRx   Ry   t   fd_(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRE   ¯   s    iœÿÿÿc   
      C   sw  t  j j d |  j j d |  j j ƒ  d |  j j d |  j j d |  j j ƒ  ƒ } |  j	 j
 ƒ  } t j j d t j |  j ƒ j | ƒ d |  j j
 ƒ  j | ƒ d t | j ƒ j
 ƒ  j | ƒ ƒ } | j | k  rÓ | S| j t j |  j | j ƒ } |  j d	 | d
 | ƒ }	 |	 | k  rY| r2|  j d |	 IJn  |  j j d	 | ƒ |  _ |  j ƒ  } n | rs|  j d |	 IJn  | S(   NR(   R)   R    t   k_anisotropict   k_masksR   t   yt   zt   k_isotropic_expR,   s!       r(set_k_isotropic_exp): %6.4fs,       r(set_k_isotropic_exp): %6.4f (rejected)(   RS   RT   RU   RV   R(   RX   R    R…   R   RG   R   t   scitbxt   matht   gaussian_fit_1d_analyticalR   t   sqrtR5   R`   R<   RW   t   f_modelt   bt   at   expt	   try_scaleR2   t   updateRe   (
   Rs   R+   R,   R-   t   b_lower_limitRT   Ry   t   rft   kt   r(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRf   ¼   s.    ! !c   	      C   sE  | d  k r |  j j } n  | d  k r6 |  j j } n  | d  k rT |  j j ƒ  } n  | d  k ro |  j j } n  t j j d |  j j	 d |  j j
 ƒ  d | d | d | d | ƒ } |  j j ƒ  } | s| d  k	 rß | | @} n  t j |  j j ƒ  | j j ƒ  | ƒ St j j |  j j ƒ  j | ƒ | j j ƒ  j | ƒ ƒ j ƒ  Sd  S(   NR(   R)   R‰   R    R…   R†   (   R"   RV   R‰   R    R   R…   RS   RT   RU   R(   RX   RG   R   R   Re   R<   RŽ   t   cctbxt   xrayR`   t   value(	   Rs   R‰   R    R   R…   R   R,   t   cRy   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyR’   Ö   s,        	 %	c         C   so   | r7 t  j |  j j ƒ  |  j j j ƒ  |  j j ƒ  ƒ St  j |  j j ƒ  |  j j j ƒ  |  j j ƒ  d ƒ Sd  S(   Ni   (   R   Re   R<   R   RV   RŽ   RG   (   Rs   R*   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRe   ð   s
    c         C   s.   t  j |  j j ƒ  |  j j j ƒ  |  j d ƒ S(   Ni   (   R   Re   R<   R   RV   RŽ   R]   (   Rs   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRo   ø   s    c         C   s.   t  j |  j j ƒ  |  j j j ƒ  |  j d ƒ S(   Ni   (   R   Re   R<   R   RV   RŽ   R[   (   Rs   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRn   ü   s    c         C   s%   |  j  t |  j  ƒ d |  j j ƒ  @S(   Ni   (   RA   R   RG   R   (   Rs   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyR\      s    c         C   sÚ   |  j  j ƒ  } d  } | d k j t ƒ d k r? | d k } nŠ |  j d j ƒ  } | j t ƒ d k rp | } nY xP t d t |  j ƒ ƒ D]6 } | |  j | j ƒ  O} | j t ƒ d k r‰ Pq‰ q‰ W| } | |  j	 j ƒ  @S(   Ni   iô  i    i   i,  (
   R9   R   R"   Ri   R   RA   t	   deep_copyt   rangeR   RG   (   Rs   R~   R   Ry   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRZ     s     	 c      
   C   sò  t  | ƒ t  |  j ƒ k s! t ‚ d „  } t j |  j j ƒ  d ƒ } t j |  j j ƒ  d ƒ } t j |  j j ƒ  d ƒ } xOt |  j ƒ D]>\ } } | \ } }	 }	 }	 |  j | d |  j | d }
 } | | } | t  | ƒ d k rý | | d } n | | d } | d |
 d | d | d | ƒ \ } } t	 j
 |  j | | | | ƒ | j | | ƒ |  j d	 | d
 | ƒ } |  j d	 | d
 | ƒ } | | k  r¹t	 j
 |  j | | | | ƒ q‹ | j | | ƒ q‹ W| d k  j t ƒ d k sît ‚ | S(   Nc         S   s?   d } |  | k r' | | | |  } n  | | |  } | | f S(   Ni    (    (   t   x1t   x2t   y1t   y2R–   R�   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   linear_interpolation  s
     iÿÿÿÿi    i   Rž   RŸ   R    R¡   R   R   (   R   RY   R1   R   t   doubleR<   RH   R   R^   R   t   set_to_linear_interpolatedR5   t   set_selectedR’   Ri   R   (   Rs   t
   k_mask_binR¢   t   result1t   result2R   R   t   casR   t   zzzRž   RŸ   R    R¡   R–   R�   t   r1t   r2(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt6   populate_bin_to_individual_k_mask_linear_interpolation  s,    !	#
'!c         C   s  t  j g  t d d d ƒ D] } | d ^ q ƒ } t  j |  j j ƒ  d ƒ } t  j ƒ  } xÙ t |  j ƒ D]È \ } } | \ } }	 }
 } |  j j j	 | ƒ |  j j
 j	 | ƒ |  j j j	 | ƒ } |  j j	 | ƒ } t j | j ƒ  | |	 j j ƒ  |	 j ƒ  j ƒ  | |
 ƒ \ } } | j | ƒ | j | | ƒ qi W|  j | ƒ } |  j d | ƒ } |  j d | d | ƒ } |  j j d | d	 | ƒ |  _ | |  j _ | |  j _ | |  j _ | |  j _
 |  j ƒ  } t |  j ƒ d
 k rt  j ƒ  } t  j ƒ  } x~ t |  j ƒ D]m \ } } | \ } }	 }
 } | } |  j | d
 } t  j |  j j
 j	 | ƒ ƒ } | j | ƒ | j | ƒ qWd d  l } | j  j! d t  j" | ƒ d | ƒ } |  j ƒ  } | j# t  j$ |  j% | j& ƒ } |  j' d	 | ƒ } | | k  r|  j j d	 | ƒ |  _ |  j ƒ  } qn  | S(   Ni    iŠ  i2   g     @�@R¦   R+   R   R†   R    i   iÿÿÿÿR   R‡   ((   R   R£   R�   R<   RH   R   RY   RV   R…   R`   R    R‰   R   t    k_mask_and_k_overall_grid_searchR   R(   RX   Ra   R¥   t   smoothR­   t   _k_isotropic_as_scale_k1R“   RI   R   R   R   Re   R   R^   Rd   t   scitbx.mathR‹   RŒ   R�   R�   R‘   R5   R�   R’   (   Rs   R+   R   t   k_mask_trial_rangeR   R¦   t   i_casR©   R   RV   t   selection_useR|   t   scaleR<   t   k_mask_bin_t   k_isotropic_bin_R   R    R   R‡   Rx   Ry   t   ss_t   k_isotropic_RŠ   R—   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRg   2  sZ    2%		$!c         C   sY   t  j |  j j ƒ  |  j j j ƒ  |  j j ƒ  ƒ } |  j j d |  j j | ƒ |  _ d  S(   NR    (	   R   Rµ   R<   R   RV   RŽ   RG   R“   R    (   Rs   t   scale_k1(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRl   d  s    !c         C   sY   |  j  ƒ  |  _ t } | |  j k sL | |  j k rU t | |  j ƒ | k  rU t } n  | S(   N(   Re   Rr   R   RW   R   (   Rs   R+   R.   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRk   i  s    (	c         C   s\  |  j  } |  j d IJd } |  j j j ƒ  } |  j d IJ|  j d IJt d  ƒ } t d  ƒ } t d  ƒ } xét |  j ƒ D]Ø\ } } | \ }	 }
 } } | } |  j	 | d } | d  k	 ræ |  j  j
 d  k	 ræ d |  j  j
 | } n  | d  k	 r|  j  j d  k	 rd |  j  j | } n  d t j |  j j ƒ  j | ƒ ƒ } |  j j ƒ  j | ƒ } t j | ƒ } t j | ƒ } | j ƒ  } |  j j | ƒ } t j | j ƒ  ƒ } t j |  j j j | ƒ ƒ } t j |  j j j | ƒ ƒ } | j d | ƒ d } t j | j ƒ  | j | ƒ d	 ƒ } |  j | | | | | | | | | | | | | f IJq| Wd  S(
   Ns      Statistics in resolution bins:sF     %7.5f %6.2f -%6.2f %5.1f %5d %-6s %-6s %-6s  %6.3f %6.3f %8.2f %6.4fsS     s^2      Resolution    Compl Nrefl k_mask                 k_iso  k_ani <Fobs>   Rs:                   (A)        (%)       orig   smooth averagei   s   %6.4ft   d_maxg      Y@i   (   RI   R2   RV   RŽ   R   t   strR"   R   RY   R^   R   R   R   Rd   R   R`   R9   Rb   Rc   RH   R<   R    R…   t   completenessR   Re   (   Rs   R�   t   fmtRŽ   t   k_mask_bin_orig_t   k_mask_bin_smooth_t   k_mask_bin_approx_Rx   R©   R   RV   R´   R|   Ry   R¸   t   k_mask_bin_averaged_t   d_t   d_min_t   d_max_t   n_ref_t   f_obs_t   f_obs_mean_R¹   t   k_anisotropic_t   cmpl_t   r_(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRm   q  s>    	%$	c         C   sS  t  j |  j j ƒ  d ƒ } | d  k r9 |  j j ƒ  } n  t j j	 d |  j j
 d |  j j ƒ  d |  j j d |  j j d | ƒ j } xb t |  j ƒ D]Q \ } } | \ } } }	 }
 t j |  j j ƒ  | j |
 ƒ } | j | | ƒ } q” W| j d ƒ d k st ‚ |  j d	 | d
 | ƒ } | | k rO|  j j d	 | d | ƒ |  _ | } n  | S(   NiÿÿÿÿR(   R)   R‰   R…   R†   g      ð¿i    R    R   (   R   R£   R5   RH   R"   RV   R   RS   RT   RU   R(   RX   R‰   R…   R   R   RY   R   Rµ   R<   RŽ   R¥   Ri   R1   R’   R“   (   Rs   R+   R   R    t	   core_dataR³   R©   R   RV   R´   R|   Rº   R—   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyR°   “  s(     	i   i   iô  c   	      C   sÜ   t  | |  j j ƒ  | ƒ } |  j j ƒ  | k  } | |  j j ƒ  @} d } | j t ƒ | k rØ |  j j	 d | ƒ } |  j j	 | ƒ } | j
 | j | j j ƒ  | j ƒ  | j ƒ  j ƒ  } t j | j ƒ  | ƒ } n  | S(   Ni   R   (   Rb   R<   t   d_minR9   R   RG   Ri   R   RV   R`   R‰   R…   R(   R   RX   R   Rµ   (	   Rs   t   cutofft   widtht   min_reflectionst   sel_highRº   RV   R<   t   fm(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   estimate_scale_k1©  s    c      
   C   sü  t  j |  j j ƒ  d ƒ } t  j ƒ  } t  j g  t d d d ƒ D] } | d ^ q@ ƒ } |  j ƒ  } d d „ } x[t |  j ƒ D]J\ } }	 |	 \ }
 } } } |  j j	 j
 |
 ƒ | |  j j j
 |
 ƒ } |  j j
 |
 ƒ j ƒ  } | j j ƒ  | } | j ƒ  j ƒ  | } |  j d k ret j d	 | d
 | d | d | ƒ } | j | j ƒ | j |
 | j ƒ q� |  j d k r¾t j d	 | d
 | d | d | ƒ } | j | j ƒ | j |
 | j ƒ q� |  j d k rt j | | | | | ƒ \ } } | j | ƒ | j |
 | ƒ q� |  j d k r¿t  j ƒ  } t  j ƒ  } |  j j | } | j |
 | ƒ |  j d | d |
 ƒ } | j | ƒ | j | ƒ t j d	 | d
 | d | d | ƒ } | j |
 | j ƒ | j |  j d | d |
 ƒ ƒ | j | j ƒ t j d	 | d
 | d | d | ƒ } | j |
 | j ƒ | j |  j d | d |
 ƒ ƒ | j | j ƒ t  j | ƒ } | j
 | ƒ d } t j | | | | d | ƒ | ƒ \ } } | j | ƒ | j |
 | ƒ q� d s� t ‚ q� W|  j | ƒ } |  j d | ƒ } |  j d | d | ƒ } |  j d | d | ƒ } | | k sR| | k rÌt | | ƒ d d k  rÌ|  j j  d | d | ƒ |  _ | |  j _ | |  j _! | |  j _" | |  j _# | } |  j$ rò|  j% d d | f IJqòn& |  j$ rò|  j% d d | d f IJn  |  j& ƒ  S(   Niÿÿÿÿi    iè  i
   g     @�@gš™™™™™©?c         S   sj   |  d k r d }  n  t  j ƒ  } t d |  | ƒ } x/ | |  | d k re | j | ƒ | d 7} q7 W| S(   Ni   i    gü©ñÒMbP?g{®Gáz„?(   R   R£   Rc   Ra   (   R   t   shiftR   t   inc(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   get_k_mask_trial_range»  s     	t   k_iso_k_mask_analR<   R(   RX   R   t   k_mask_analt   k_mask_r_grid_searchR   R   R   R¦   R+   R    id   g      à?R†   s       %s: %6.4fs   bulk-solvents       %s: %6.4f (%s)s   result rejected('   R   R£   R<   RH   R�   RÓ   R   RY   RV   R…   R`   R‰   R   R(   RX   R3   R   t6   overall_and_bulk_solvent_scale_coefficients_analyticalRa   t   x_bestR¥   t*   bulk_solvent_scale_coefficients_analyticalR®   RI   R   R’   t   sort_permutationR1   R¯   R­   R°   RW   R“   R   R   R    R-   R2   Re   (   Rs   R+   R   R¦   R   R²   Rº   RÖ   R³   R©   R   RV   R´   R|   Rµ   R<   R(   RX   t   objR¶   R·   R—   R–   t   x0t   r0t   obj1t   obj2R   R   R   R    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRh   ¶  s²    2										2		c         C   s�   t  d | ƒ } t j t | ƒ d ƒ } xb t | ƒ D]T \ } } d t j |  j | d ƒ d } | d k r~ | d k  r~ Pn  | | | <q4 W| S(   NR   i    i   i   i   (   R   R   R£   R   R   R‹   R�   R^   (   Rs   R   R   t   result_R   R—   R~   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyR¯      s    " c   	      C   s]  | } | d  k r |  j } n  | } | d  k r> | d IJd  St | ƒ d k r� | d Id j g  | D] } t d | ƒ j ƒ  ^ qg ƒ IJnÊ g  } g  } xC t | ƒ D]5 \ } } | d k rÐ | j | ƒ q¨ | j | ƒ q¨ W| d Id j g  | D] } t d | ƒ j ƒ  ^ qø ƒ IJ| d Id j g  | D] } t d | ƒ j ƒ  ^ q4ƒ IJd  S(   Ns     k_anisotropic=1i   s          b_cart(11,22,33,12,13,23):t   ,s   %8.4fi    i   i   i   i
   s	         V0:s	         V1:(   i    i   i   i   i   i
   (   R"   R?   R   t   joinR¼   Rq   R   Ra   (	   Rs   t   mR2   t   smt   outR   t   v0t   v1R�   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   format_scale_matrix)  s(     

5 
2
c         C   sÌ  d \ } } } d  \ } } } d! \ } }	 }
 |  j j ƒ  } |  j j j ƒ  j | ƒ } |  j j ƒ  j | ƒ } |  j j ƒ  j | ƒ } |  j j ƒ  } |  j j ƒ  } |  j	 rUt
 j d | d | d | d |  j j ƒ  ƒ } |  j j t | j ƒ ƒ } t j t j | | ƒ ƒ } t j | | ƒ } |  j d | ƒ } |  j rU|  j d | IJqUn  |  j rÕt
 j d | d | d | d | ƒ } | j }	 t j | | j | ƒ } |  j d | ƒ } |  j rÕ|  j d | IJqÕn  t } | d  k	 r)|  j r)| | k  r)| d	 k j t ƒ d	 k r)t } t |  _ n  |  j r¼|  j j | ƒ j  d
 t! j" | j# ƒ  d	 ƒ ƒ } t$ j% j& d |  j j | ƒ d |  j j j | ƒ d | g d | d | d |  j' ƒ } t( j) d | d |  j j | ƒ d d	 d	 d	 d	 d	 d	 g d t d d d d d t d d d d ƒ 	} | j* } t j t j | | ƒ ƒ }
 t j | | ƒ } |  j d | ƒ } |  j r{|  j d | IJn  | r¼|  j j+ d | ƒ |  _ |  j rµ|  j, d |
 ƒ n  d  Sn  | | | f | | |	 f | | |
 f g } | } d  } d  } xQ | D]I } | \ } } } | d  k	 rÿ| | k  rÿ| } | j- ƒ  } | } qÿqÿW| d  k rt|  j rÈ|  j d IJqÈnT | |  _. |  j j+ d | ƒ |  _ |  j/ ƒ  } |  j rÈ|  j, ƒ  |  j d | IJn  d  S("   NRŽ   R<   t   miller_indicest   adp_constraint_matrixR…   s         r_expanal: %6.4ft	   unit_cells         r_poly   : %6.4fi    R   R(   R)   t   f_part1t   f_part2R5   t   fmodel_core_datat	   u_initialt   refine_ut   min_iterationsiô  t   max_iterationst   symmetry_constraints_on_b_cartt	   u_min_maxg     @@t	   u_min_ming     @Às       r_expmin   : %6.4fRæ   s.         result rejected due to r-factor increases         r_final  : %6.4f(   NNN(   NNN(   NNN(0   R"   RG   R   RV   t   f_model_no_aniso_scaleR`   R<   R/   Rî   R7   R   t   aniso_u_scalerRR   t   gradient_sum_matrixt
   all_paramst   tuplet   u_star_independentR   t   u_as_bt   u_star_as_u_cartt   extR…   R’   R-   R2   R6   R�   R   R@   Ri   R   R8   R_   R   t   complex_doubleRH   RS   RŽ   t   manager_kbuR5   R   t   u_star_minimizert   u_minR“   Rë   Rœ   R?   Re   (   Rs   R+   t	   r_expanalt   r_polyt   r_expmint   k_anisotropic_expanalt   k_anisotropic_polyt   k_anisotropic_expmint   scale_matrix_expanalt   scale_matrix_polyt   scale_matrix_expminRy   RŽ   R<   t   mit   uct   mi_allRÞ   t   u_start   force_to_use_expmint   zeroRÒ   R—   t   r_bestt   k_anisotropic_bestt   scale_matrix_bestR   Re   R…   t   scale_matrixt   r_aniso(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyRj   >  s²    								!						 				
c         C   sW   |  j  j |  j  j |  j  j } t j j d t j |  j	 ƒ d | ƒ } | j
 | j f S(   NR   R‡   (   RV   R    R…   R‰   RŠ   R‹   RŒ   R   R�   R5   R�   R�   (   Rs   t   k_totalR—   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   overall_isotropic_kb_estimateŸ  s    'c         C   só  d  } |  j ƒ  \ } } |  j j |  j j |  j j } t j j | |  j	 | | ƒ \ } } } | d k  r� | | |  _
 |  _ n  | d  k	 rï|  j
 |  j g j d  ƒ d k rï| d k rï| j ƒ  t j d ƒ } d „  } | d |  j d | ƒ \ }	 }
 |  j
 t j |  j	 |	 ƒ } t d | d |  j j | |  j j d g  |  j j D]! } | t j |  j	 |	 ƒ ^ qKd	 |  j j ƒ } | j ƒ  t j d ƒ } | | } t t j | ƒ t j | ƒ ƒ sËt ‚ t t j | ƒ |	 ƒ sìt ‚ qïn  | S(
   Ng      à?i    g      ð?c         S   sT   | j  ƒ  t j d ƒ } t d | |  d ƒ } |  | } | j d | ƒ | | f S(   Ng      ð?i    g�íµ ÷Æ°>t   b_shift(   t   min_u_cart_eigenvalueR   Rÿ   Rb   t   shift_us(   t   b_tracet   xray_structuret   b_mint   b_rest   b_adj(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   split¯  s
    
R  R   R    R   R…   (   R"   R  RV   R    R…   R‰   RS   R   t   fit_k_exp_b_to_k_totalR5   RB   RC   Ri   t   extract_u_iso_or_u_equivR   Rÿ   R   R‘   R   R†   R	   Rb   Rc   R1   (   Rs   R   R   R–   R�   R  R—   t   bs1R$  R#  R"  t   k_newRæ   t   bs2t   diff(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt,   apply_back_trace_of_overall_exp_scale_matrix¥  s.    ' -	4
'$N(   t   __name__t
   __module__R"   R   R   R‚   RE   Rf   R’   Re   Ro   Rn   R\   RZ   R­   Rg   Rl   Rk   Rm   R°   RÓ   Rh   R¯   Rë   Rj   R  R+  (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyR   %   sL   x							2		"	j			a	(   t
   __future__R    t   scitbx.array_familyR   RJ   RS   R   R˜   R   t   boost.pythont   boostt   pythont
   import_extR  R   t   mmtbx.bulk_solventR   t   mmtbx.f_modelR‹   t   libtbxR   R±   RŠ   R   t   mmtbx.arrayst
   cctbx.xrayt   libtbx.test_utilsR	   R   t   objectR   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/bulk_solvent/scaler.pyt   <module>   s(   	