ó
J™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	 Z	 d  d l
 Z
 d  d l Z d  d l m Z d d	 „ Z d
 d „ Z d d „ Z d „  Z e d d d d „ Z d d d e d d „ Z d „  Z d „  Z e d k re ƒ  n  d S(   iÿÿÿÿ(   t   division(   t   xray(   t   random_structure(   t   debug_utils(   t   flexN(   t   adptbxgñhãˆµøä>c      	   C   s®  | j  ƒ  } | j ƒ  d  } t j ƒ  } xt | j ƒ  j ƒ  ƒ D]e} d d d g } x@t d ƒ D]2}	 g  }
 xè d
 D]à } | j ƒ  } | j ƒ  | } t | j	 ƒ } |  sÌ | |	 c | | | |	 7<n8 t | j
 | ƒ ƒ } | |	 c | | 7<| j | ƒ } | | _	 | j ƒ  j d | d d ƒ j ƒ  } | | d t ƒ} |
 j | j ƒ  ƒ qv W|
 d |
 d d	 | } |  s‹| | |	 9} n  | | |	 <qc W| j | ƒ qA W| S(   Ni   i    iÿÿÿÿi   t   xray_structuret	   algorithmt   directt   compute_derivativesi   (   iÿÿÿÿi   (   t	   unit_cellt
   parametersR   t   vec3_doublet   xranget
   scattererst   sizet   deep_copy_scattererst   listt   sitet   orthogonalizet   fractionalizet   f_obst!   structure_factors_from_scattererst   f_calct   Falset   appendt   target(   t   cartesian_flagt   target_ftort	   structuret   deltaR
   t   abct   derivativest   i_scatterert   d_target_d_sitet   ixt   target_valuest   d_signt   modified_structuret   msR   t	   site_cartR   t   target_resultt
   derivative(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_xray_derivatives.pyt   finite_differences_site   s8    	 g�íµ ÷Æ°>c         C   sd  t  j ƒ  } xQt | j ƒ  j ƒ  ƒ D]7} d d d d d d g } | j ƒ  | j j ƒ  rOxà t d ƒ D]Ò } g  } xŸ d
 D]— } | j ƒ  }	 |	 j ƒ  | }
 t |
 j	 ƒ } | | c | | 7<| |
 _	 |  j
 ƒ  j d |	 d d ƒ j ƒ  } |  | d t ƒ} | j | j ƒ  ƒ q| W| d | d d	 | } | | | <qi W| j | ƒ q% | j | ƒ q% W| S(   Ni    i   iÿÿÿÿi   R   R   R   R	   i   (   iÿÿÿÿi   (   R   t   sym_mat3_doubleR   R   R   t   flagst   use_u_anisoR   R   t   u_starR   R   R   R   R   R   (   R   R   R   R    R!   t   d_target_d_u_start   iuR$   R%   R&   R'   R/   R   R)   R*   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_xray_derivatives.pyt   finite_differences_u_star*   s,    	c         C   s  t  j ƒ  } xt | j ƒ  j ƒ  ƒ D]ñ} g  } x»d D]³} | j ƒ  } | j ƒ  | }	 |  d k r‹ |	 j j ƒ  r‹ |	 j | | 7_ n|  d k r4|	 j j ƒ  r4|	 j d k s» t	 ‚ t
 j |	 j t
 j t j |	 j j ƒ t
 j d ƒ | | }
 t j |	 j j ƒ t
 j t
 j |
 ƒ t
 j d |	 _ nn |  d k rV|	 j | | 7_ nL |  d k ry|	 j | | |	 _ n) |  d	 k rœ|	 j | | |	 _ n t ‚ | j ƒ  j d
 | d d ƒ j ƒ  } | | d t ƒ} | j | j ƒ  ƒ q8 W| d | d d | } | j | ƒ q% W| S(   Niÿÿÿÿi   t   u_isot	   tan_u_isoi    i   t	   occupancyt   fpt   fdpR   R   R   R	   (   iÿÿÿÿi   (   R   t   doubleR   R   R   R   R-   t	   use_u_isoR3   t   AssertionErrort   matht   tant   piR   t   b_as_ut   paramt   atanR5   R6   R7   t   RuntimeErrorR   R   R   R   R   R   (   t   parameter_nameR   R   R   R    R!   R$   R%   R&   R'   t   xR   R)   R*   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_xray_derivatives.pyt   finite_differences_scalarD   s6    ?:c         C   s=   t  j ƒ  } x* |  D]" } | j t  j t | ƒ ƒ ƒ q W| S(   N(   R   R8   t   extendt   tuple(   t
   flex_tuplet   resultt   t(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_xray_derivatives.pyt   flex_tuple_as_flex_doublec   s     gü©ñÒMbP?g+‡ÙÎ÷ï?i    c   
      C   s”  t  |  ƒ t  t j ƒ  ƒ k r- t |  ƒ }  n  t  | ƒ t  t j ƒ  ƒ k rZ t | ƒ } n  d sf | r‡ d Gt |  ƒ GHd Gt | ƒ GHn  t j t j |  ƒ ƒ d k rÇ t j t j | ƒ ƒ d k rÇ d  St j |  | ƒ } t j |  | ƒ j	 ƒ  } | j
 ƒ  st ‚ t | j ƒ  d ƒ | k s+| | k  r�d GHd G| j ƒ  GHd G| GHd sT| r€x) t |  | ƒ D] \ } }	 | G|	 GHqdWn  | s�t ‚ n  d  S(   Ni    s   analytical:s   numerical: i   s"   Error: finite difference mismatch:s   slope:s   correlation:(   t   typeR   R8   RJ   RF   t   maxt   abst   linear_regressiont   linear_correlationt   coefficientt   is_well_definedR:   t   slopet   zip(
   t   d_analyticalt   d_numericalt	   test_hardt   slope_tolerancet   correlation_mint   verboset   regrt   corrt   at   n(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_xray_derivatives.pyt   linear_regression_testi   s*    (	i	   g      @g      Ð?c         C   s  | d k s | d k s t  ‚ | d k r> |  t j k r> d  S| d k rZ | t k rZ d  S| d k rq | rq d  St j | d d0 | |  d	 d
 d | d | d t d t d d d t d t ƒ	} | d1 k r× | d } n  t j d | j ƒ  d d d d d | ƒ | j	 d | d | d d ƒ j
 ƒ  } | d k r>t | ƒ } n% | d k rc| j ƒ  } | j ƒ  n  | j | | d t ƒ} t | j ƒ  ƒ t | j ƒ  ƒ k s¥t  ‚ |  | ƒ } xr | | f D]c } | j d  | d d ƒ j
 ƒ  } | | d! t ƒ} | | k r¿t | j ƒ  ƒ d" k  s"t  ‚ q¿q¿Wt j	 j d | d k pPt j t t f ƒ d | d k pqt j t t f ƒ d# | d k p’t j t t f ƒ d$ | d$ k p³t j t t f ƒ d% | d% k pÔt j t t f ƒ d | d k pû| oût j t t f ƒ ƒ } t j d | j ƒ  d | j d | j d# | j d$ | j d% | j d | j ƒ t j | j ƒ  ƒ } t j	 j d  | d& d  d' | d( | j  ƒ  d) d* ƒ } | d k r| j! ƒ  } | rÃ| j" | ƒ n  | rØ| j# ƒ  } n  t$ | | | ƒ } | sÏ| j" | ƒ qÏnÌ | d k r<| j% d* k r<| j& ƒ  } t' | | ƒ } n“ | d$ k rW| j( ƒ  } nf | d k r�| j) d* k r�| j* ƒ  } n< | d% k rœ| j+ ƒ  } n! | d k r·| j, ƒ  } n t- ‚ t. | | | ƒ } t/ | | |	 d+ |
 ƒ| d k r| j) d* k rt0 j1 ƒ  } x“ | j ƒ  D]… } | j2 j3 t ƒ | j2 j4 | j ƒ t j5 d, d- ƒ } | | j2 _6 t7 j8 | j t7 j9 t: j; | ƒ t7 j9 d. ƒ } | j< | ƒ qWt j	 j d  | d& | d' | d( | j  ƒ  d) d* ƒ } | j* ƒ  } t. d/ | | ƒ } t/ | | |	 d+ |
 ƒn  d  S(2   Nt   Fs   F^2R   R7   t   elementst   Ot   Nt   Ct   volume_per_atomid   t   random_f_prime_d_mint   random_f_double_primeR.   R9   t   random_u_cart_scaleg333333Ó?t   random_u_isot   random_occupancyR/   R3   g       @R   t   random_u_iso_scalet   random_u_iso_ming        RB   t   anomalous_flagt   d_minR   R   t   vary_z_onlyR   R	   gñhãˆµøä>t   u_anisoR5   R6   t   u_iso_refinable_paramst
   miller_sett   d_target_d_f_calct   n_parametersi    RY   iZ   ix   i   R4   (   Ra   Rb   Rc   (   s   u_stars   u_iso(=   R:   R   t   unified_least_squares_residualt   TrueR   R   R   t   random_modify_adp_and_adp_flagsR   t   structure_factorsR   RM   t   normt#   set_observation_type_xray_intensityt   random_modify_parametersRF   t   special_position_indicesR   R   t   gradient_flagst   randomt   choicet   set_scatterer_grad_flagsR   R3   Ro   R5   R6   R7   t   scatterer_grad_flags_countst   gradients_directt   NoneR    t   d_target_d_site_fract*   apply_special_position_ops_d_target_d_sitet   d_target_d_site_cartR+   R.   R0   R2   t   d_target_d_occupancyR9   t   d_target_d_u_isot   d_target_d_fpt   d_target_d_fdpRA   RD   R^   R   R8   R-   t   set_tan_u_isot   set_grad_u_isot   randintR?   R;   R<   R=   R   R>   R   (   t   target_functort	   data_typeRB   t   space_group_infoRl   R   t
   n_elementsRm   t   shake_sigmaRV   RY   t   structure_idealt
   rnd_f_calct   y_obst   structure_shakeR   R   R   R)   R|   t   grad_flags_countst   sfRT   RU   Rp   t	   scattererR?   t   value(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_xray_derivatives.pyt   exerciseƒ   sà       	 			%!!!!!					
	1	c   
      C   s  g  } |  j  r | j t ƒ n  |  j r8 | j t ƒ n  t | ƒ d k rY t t g } n  xµ d D]¬ } x£ t t f D]” } x‹ | D]ƒ } xz t j j ƒ  j	 ƒ  D]c } | d k r¹ t } n  | d k rÎ t } n  x0 d D]( }	 t
 | |	 | | | | d
 |  j ƒqÕ Wqž Wq‚ Wqu Wqa Wd  S(   Ni    R   R3   R/   R5   R6   R7   R_   s   F^2RY   (   s   sites   u_isos   u_stars	   occupancys   fps   fdp(   R_   s   F^2(   t   FracR   R   t   CartRu   t   lenR   t   target_functorst   registryt   valuesRš   t   Verbose(
   R-   R�   t   coordinate_systemsRB   Rl   R   R�   R9   R.   RŽ   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_xray_derivatives.pyt   run_call_backú   s0    	 	  	 	c           C   s   t  j t j d t d ƒ d  S(   Ni   R›   Rœ   (   s   Fracs   Cart(   R   t   parse_options_loop_space_groupst   syst   argvR£   (    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_xray_derivatives.pyt   run  s     t   __main__(   t
   __future__R    t   cctbxR   t   cctbx.developmentR   R   t   cctbx.array_familyR   R}   R;   R¥   R   R+   R2   RD   RJ   Ru   R^   Rš   R£   R§   t   __name__(    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/regression/tst_xray_derivatives.pyt   <module>   s0   	q		