ó
¬™xTc           @   sû   d  d l  m Z d  d l m Z d  d l m Z d  d l m Z d  d l m	 Z	 d  d l m
 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  d l Z d d d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   flex(   t   scaling(   t   absolute_scaling(   t   adptbx(   t   crystal(   t   miller(   t   Sorry(   t   newton_more_thuente_1994(   t   matrixNt   refineryc           B   s_   e  Z e e e d  d  g d	 d „ Z d „  Z d „  Z d „  Z d „  Z	 d d „ Z
 d „  Z RS(
   i   c         C   så  | |  _  | j ƒ  j | ƒ |  _ |  j j ƒ  s? t d ƒ ‚ n  | j ƒ  j | ƒ |  _ |  j j ƒ  su t d ƒ ‚ n  | rÆ |  j j ƒ  sŸ |  j j ƒ  |  _ n  |  j j ƒ  sÆ |  j j ƒ  |  _ qÆ n  | s|  j j ƒ  rð |  j j	 ƒ  |  _ n  |  j j ƒ  r|  j j	 ƒ  |  _ qn  |  j j
 ƒ  j |  j j
 ƒ  ƒ \ |  _ |  _ |  j j ƒ  |  _ |  j j ƒ  |  _ |  j j ƒ  |  _ |  j d  k r |  j d d |  _ n  |  j j ƒ  |  _ |  j j ƒ  |  _ |  j d  k rê|  j d d |  _ n  |  j j ƒ  |  _ | s)|  j d d |  _ |  j d |  _ n  d  |  _ | rÚ| rŒt j |  j |  j |  j |  j |  j d |  j d d d d d d g ƒ |  _ qyt j |  j |  j |  j |  j |  j d |  j d d d d d d g ƒ |  _ nŸ | r.t j |  j |  j |  j |  j |  j d |  j d d d d d d g ƒ |  _ nK t j |  j |  j |  j |  j |  j d |  j d d d d d d g ƒ |  _ |  j j ƒ  |  _ |  j j ƒ  |  _ |  j j |  _  |  j  ƒ  d k sÄt! ‚ t" j# |  j  ƒ  d d ƒ } | d  k	 r| j$ ƒ  |  j% j$ ƒ  k st! ‚ | } n  t& d |  d | d	 d
 d d d d d d ƒ }	 t' j( |  j j) ƒ  d ƒ }
 |	 j* d |  _+ |  j, |	 j* ƒ |  _- t. t" j# |  j- ƒ |
 ƒ |  _- t/ j0 t/ j1 |  j |  j- ƒ ƒ |  _2 t/ j3 |  j |  j- ƒ |  _4 d  S(   Ns#   A real array is need for ls scalingi    i   g        g      ð?i   t   functiont   x0t   gtolg1Eîð2®>t   eps_1g�íµ ÷Æ°>t   eps_2t!   matrix_symmetric_relative_epsilong       @g      @gUUUUUUå?(5   t   maskt	   deep_copyt   set_observation_typet   nativet   is_real_arrayR   t
   derivativet   is_xray_intensity_arrayt	   f_as_f_sqt	   f_sq_as_ft
   map_to_asut   common_setst   indicest   hklt   datat
   i_or_f_natt   sigmast   sig_natt   Nonet
   i_or_f_dert   sig_dert	   unit_cellt   minimizer_objectR   t   least_squares_on_i_wtt   least_squares_on_it   least_squares_on_f_wtt   least_squares_on_ft   space_groupt   sgt   adp_constraintst   n_independent_paramst   dim_ut   AssertionErrorR   t   doublet   sizet   xR   t   matht   powt   volumet   x_start   p_scalet   unpackt   u_start   listR   t   u_as_bt   u_star_as_u_cartt   b_cartt   u_star_as_u_cift   u_cif(   t   selft   miller_nativet   miller_derivativet   use_intensitiest   scale_weightt   use_weightsR   t   start_valuesR   t	   minimizedt   Vrwgk(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyt   __init__   sº    		!!!!		c         C   se   | d t  |  j d ƒ g t t  |  j d ƒ t j |  j j t | d ƒ ƒ ƒ ƒ } t j | ƒ S(   Ni    i   (   t   floatR   R;   R   R1   R-   t   independent_gradients(   RA   t   grad_tensort   grad_independent(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyt   packš   s
    c         C   s    |  j  j t | d ƒ ƒ } | S(   Ni   (   R-   t
   all_paramsR;   (   RA   R3   t   u_tensor(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyR9   ¢   s    c         C   s3   |  j  | ƒ } |  j j | d | ƒ |  j j ƒ  S(   Ni    (   R9   R&   t
   set_paramst   get_function(   RA   R3   t   u_full(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyt
   functional¦   s
    	c         C   sH   |  j  | ƒ } |  j j | d | ƒ |  j j ƒ  } |  j | ƒ } | S(   Ni    (   R9   R&   RR   t   get_gradientRO   (   RA   R3   RT   t   g_fullt   g(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyt	   gradients¯   s    	g�íµ ÷Æ°>c         C   sZ   |  j  | ƒ } |  j j | d | ƒ |  j j ƒ  } | j ƒ  } |  j | |  j ƒ } | S(   Ni    (   R9   R&   RR   t   hessian_as_packed_ut   matrix_packed_u_as_symmetrict   hessian_transformR-   (   RA   R3   t   epsRT   t   result(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyt   hessian¸   s    	c         C   sb  t  j | j ƒ  | j ƒ  j ƒ  ƒ } t  j | | j ƒ  ƒ } | j ƒ  j ƒ  d d } | j ƒ  j ƒ  d d } t j | | d ƒ } d } d }	 xk t | ƒ D]] }
 xT t | ƒ D]F } |
 d k rî | d k rî | |	 | | <|	 d 7}	 qî n  | d 7} q² WqŸ Wd | d <t  j | | | f ƒ } | | | j ƒ  } t j | ƒ } | j t j	 | j
 ƒ ƒ | S(   Ni    i   (   R	   t   rect   gradient_sum_matrixt   focusR   R1   t   ranget	   transposet   resizet   gridt   n(   RA   t   original_hessianR-   t   constraint_matrix_tensort   hessian_matrixt   rowst   columnst   expanded_constraint_arrayt	   count_newt	   count_oldt   iit   jjR^   t   new_hessian(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyR\   Ä   s0    		
	N(   t   __name__t
   __module__t   Truet   FalseR"   RJ   RO   R9   RU   RY   R_   R\   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyR
      s   	~						t   ls_rel_scale_driverc           B   s&   e  Z e e e d  „ Z d d „ Z RS(   c   	   	   C   sj  | j  ƒ  j ƒ  |  _ | j  ƒ  j ƒ  |  _ t |  j |  j d | d | d | ƒ} | j |  _ | j |  _ | j |  _ |  j j |  j ƒ \ } } t	 j
 t	 j | j ƒ  | j ƒ  ƒ ƒ |  _ t	 j
 t	 j | j ƒ  | j ƒ  ƒ ƒ d k r!|  j t	 j
 t	 j | j ƒ  | j ƒ  ƒ ƒ d _ n  t j |  j |  j |  j ƒ |  _ |  j j  ƒ  j |  j ƒ j ƒ  |  _ |  j } |  j } |  j j ƒ  j |  j j ƒ  ƒ \ } } t	 j
 t	 j | j ƒ  | j ƒ  ƒ ƒ |  _ t	 j
 t	 j | j ƒ  ƒ ƒ t	 j
 t	 j | j ƒ  ƒ ƒ d k rT|  j t	 j
 t	 j | j ƒ  ƒ ƒ t	 j
 t	 j | j ƒ  ƒ ƒ d _ n  | |  _ | |  _ d  S(   NRD   RE   RF   i    g       @(   R   R   R   R   R
   R8   R>   R:   R   R   t   sumt   absR   t   r_val_beforeR   t   anisotropic_correctionR   t   scaled_original_derivativet   r_val_after(	   RA   RB   RC   RD   RE   RF   t
   lsq_objectt   tmp_natt   tmp_der(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyRJ   è   s:    			+.8		'%"(	c         C   s¡   | d  k r t j } n  | J| d |  j IJ| d t j |  j ƒ IJ| d |  j d |  j d |  j d f IJ| J| d |  j IJ| d |  j IJ| Jd  S(	   Ns"   p_scale                    : %5.3fs#                               (%5.3f)s0   B_cart trace               : %5.3f, %5.3f, %5.3fi    i   i   s"   R-value before LS scaling  : %5.3fs"   R-value after LS scaling   : %5.3f(	   R"   t   syst   stdoutR8   R4   t   expR>   Rz   R}   (   RA   t   out(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyt   show  s    

N(   Rs   Rt   Ru   RJ   R"   R…   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyRw   ç   s   .t   local_scaling_driverc           B   sJ   e  Z e e d  d d d d	 d „ Z d „  Z d „  Z d „  Z d „  Z	 RS(
   i
   iè  i   g      ð?c         C   s$  |
 d  k r t j }
 n  | j ƒ  j | ƒ j ƒ  |  _ | j ƒ  j | ƒ j ƒ  |  _ |  j j ƒ  d  k so t	 ‚ |  j j ƒ  d  k sŠ t	 ‚ |  j j
 |  j ƒ \ |  _ |  _ | rü |  j j ƒ  sÕ |  j j ƒ  |  _ n  |  j j ƒ  sü |  j j ƒ  |  _ qü n  | sM|  j j ƒ  r&|  j j ƒ  |  _ n  |  j j ƒ  rM|  j j ƒ  |  _ qMn  |  j j |  j j ƒ  ƒ j |  j ƒ j ƒ  |  _ |  j j |  j j ƒ  ƒ j |  j ƒ j ƒ  |  _ |  j j ƒ  j d |  j j ƒ  ƒ } |  j j ƒ  d } | d k söt	 ‚ t j d t j d |  j j ƒ  d | ƒ d |  j j ƒ  d | ƒ |  _ d  |  _ | |  _ | |  _ | |  _ | |  _  |	 |  _! | d r‹|  j" |
 ƒ n  | d	 r¥|  j# |
 ƒ n  | d
 r¿|  j$ |
 ƒ n  |  j j% ƒ  } |  j j& ƒ  } |
 d | d IJ|
 d | d IJ|
 d | d IJ|
 J|
 d t' j( | ƒ IJ|
 d t) j* t' j( | | ƒ t' j( | ƒ t' j( | ƒ ƒ IJ|
 d t' j+ | ƒ IJ|
 d t' j, | ƒ IJ|  j j- d |  j j. ƒ  | d |  j j/ ƒ  | ƒ j |  j ƒ |  _ |  j j |  j j ƒ  j0 ƒ  ƒ j |  j ƒ j ƒ  |  _ |  ` |  ` d  S(   Nt   anomalous_flaggš™™™™™¹?i    t   crystal_symmetryR%   R+   t   d_mint   local_momentt	   local_lsqt   local_nikonovs+   Mean number of neighbours           : %8.3fi   s)   Minimum number of neighbours        : %8is)   Maximum number of neighbours        : %8ii   s+   Mean local scale                    : %8.3fs+   Standard deviation of local scale   : %8.3fs+   Minimum local scale                 : %8.3fs+   Maximum local scale                 : %8.3fR   R    (1   R"   R�   R‚   R   R   R   R   R   t   observation_typeR0   R   R   R   R   t   change_basist!   change_of_basis_op_to_niggli_cellt   nat_primsett   der_primsetR+   t(   build_derived_reflection_intensity_groupR‡   R‰   R   t	   build_setR   t   symmetryR%   t
   master_sett   local_scalert   spheret	   max_deptht   target_neighboursRF   t	   thresholdt   local_moment_scalingt   local_lsq_scalingt   local_nikonov_scalingt
   get_scalest   statsR   t   meanR4   t   sqrtt   mint   maxt   customized_copyR   R    t   inverse(   RA   RB   RC   t   local_scaling_dictRD   RF   R˜   R™   R—   Rš   R„   t   intensity_groupt   tmp_reso_limt   scalesRŸ   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyRJ   /  s�    												


!	c         C   s‚   t  j |  j j ƒ  |  j j ƒ  ƒ } t  j |  j j ƒ  |  j j ƒ  ƒ d } t  j | ƒ } t  j | ƒ } | d | | IJd  S(   Ng       @s   Current R value: %4.3f(   R   Ry   R‘   R   R�   Rx   (   RA   R„   t   topt   bottom(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyt   r_value®  s    c         C   sô   | J| d IJ| d |  j  IJ| d |  j IJ| d |  j IJ| Jt j d |  j j ƒ  d |  j j ƒ  d |  j j ƒ  d |  j j	 ƒ  d	 |  j
 j ƒ  d
 |  j
 j	 ƒ  d |  j j ƒ  d |  j j ƒ  d |  j d |  j  d |  j d |  j ƒ |  _ d  S(   Ns   Moment based local scalings   Maximum depth        : %8is   Target neighbours    : %8is   neighbourhood sphere : %8it
   hkl_mastert   hkl_setst
   data_set_at   sigma_set_at
   data_set_bt   sigma_set_bR+   R‡   t   radiust   deptht
   target_reft   use_experimental_sigmas(   R˜   R™   R—   R   t   local_scaling_moment_basedR•   R   R�   R   R    R‘   R+   R‡   RF   R–   (   RA   R„   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyR›   ¸  s&    
				c         C   sô   | J| d IJ| d |  j  IJ| d |  j IJ| d |  j IJ| Jt j d |  j j ƒ  d |  j j ƒ  d |  j j ƒ  d |  j j	 ƒ  d	 |  j
 j ƒ  d
 |  j
 j	 ƒ  d |  j j ƒ  d |  j j ƒ  d |  j d |  j  d |  j d |  j ƒ |  _ d  S(   Ns!   Least squares based local scalings   Maximum depth        : %8is   Target neighbours    : %8is   neighbourhood sphere : %8iR­   R®   R¯   R°   R±   R²   R+   R‡   R³   R´   Rµ   R¶   (   R˜   R™   R—   R   t   local_scaling_ls_basedR•   R   R�   R   R    R‘   R+   R‡   RF   R–   (   RA   R„   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyRœ   Î  s&    
				c         C   s9  | J| d IJ| d |  j  IJ| d |  j IJ| d |  j IJ| J|  j j ƒ  ro t d ƒ ‚ t so t ‚ n  t j	 d |  j
 j ƒ  d |  j j ƒ  d |  j j ƒ  d	 |  j j ƒ  d
 |  j j ƒ  j ƒ  j ƒ  d t j |  j j ƒ  j ƒ  ƒ d |  j d |  j j ƒ  d |  j j ƒ  d |  j d |  j  d |  j ƒ |  _ d  S(   Ns   Nikonev based local scalings   Maximum depth        : %8is   Target neighbours    : %8is   neighbourhood sphere : %8is=    For Nikonev target in local scaling, amplitudes must be usedR­   R®   R¯   R±   t   epsilonst   centricRš   R+   R‡   R³   R´   Rµ   (   R˜   R™   R—   R‘   R   R   Rv   R0   R   t   local_scaling_nikonovR•   R   R�   R   R¹   t	   as_doubleR   t   boolt   centric_flagsRš   R+   R‡   R–   (   RA   R„   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyR�   ã  s,    
				N(
   Rs   Rt   Ru   Rv   R"   RJ   R¬   R›   Rœ   R�   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyR†   .  s   u	
		(    (   t
   __future__R    t   cctbx.array_familyR   t   mmtbxR   t   mmtbx.scalingR   t   cctbxR   R   R   t   libtbx.utilsR   t   scitbx.minimizersR   t   scitbxR	   R4   R�   R
   t   objectRw   R†   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/scaling/relative_scaling.pyt   <module>   s   ÔG