ó
9™xTc           @   s¡   d  d l  m Z d  d l m Z d  d l m Z d  d l Z d d d „  ƒ  YZ d e f d „  ƒ  YZ d	 d d
 „  ƒ  YZ	 d „  Z
 d „  Z d d d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   g_exp_i_alpha_derivatives(   t   matrixNt
   parametersc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   s7   t  | ƒ |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   t   tuplet   xyzt   ut   wt   fpt   fdp(   t   selfR   R   R   R   R	   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyt   __init__   s
    			c         C   s)   t  |  j ƒ |  j |  j |  j |  j g S(   N(   t   listR   R   R   R   R	   (   R
   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyt   as_list   s    c         C   s{   t  j d |  j t j d t j d |  j | ƒ d d |  j d |  j d d t j t	 j
 |  j ƒ j t	 j
 | ƒ ƒ ƒ S(   Nt   giþÿÿÿi   t   ffpi   R	   t   alpha(   R   R   R   t   matht   expt   piR   R   R	   R   t   colR   t   dot(   R
   t   hklt	   d_star_sq(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyt
   as_g_alpha   s
    	,	(   t   __name__t
   __module__R   R   R   (    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyR      s   		t	   gradientsc           B   s   e  Z RS(    (   R   R   (    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyR      s    t
   curvaturesc           B   s   e  Z d  „  Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   uut   uw(   R
   R   R   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyR      s    	(   R   R   R   (    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyR      s   c         C   s.   g  } x! |  D] } | j  | j ƒ  ƒ q W| S(   N(   t   extendR   (   t   paramst   resultt   p(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyt   pack_parameters!   s    c         C   s
   t  |  ƒ S(   N(   R#   (   t   grads(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyt   pack_gradients'   s    t   structure_factorc           B   sG   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s   | |  _  | |  _ | |  _ d  S(   N(   R   R   R    (   R
   R   R   R    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyR   ,   s    		c      	   C   s>   t  j d g  |  j D]$ } | j d |  j d |  j ƒ ^ q ƒ S(   NR    R   R   (   R   t   g_exp_i_alpha_sumR    R   R   R   (   R
   R"   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyt   as_exp_i_sum1   s    	c         C   s   |  j  ƒ  j ƒ  S(   N(   R(   t   f(   R
   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyR)   6   s    c         C   s¢   g  } d t  j d |  j } d t  j t j |  j ƒ } x` |  j D]U } t  j | | j ƒ } | j	 t
 d | d | j | | d | d d d d ƒ ƒ qE W| S(	   s–   Mathematica:
         alpha = 2 Pi {h,k,l}.{x,y,z}
         g = w Exp[-2 Pi^2 u dss]
         D[alpha,x]; D[alpha,y]; D[alpha,z]; D[g,u]; D[g,w]"
    iþÿÿÿi   R   R   R   R   i   R	   (   R   R   R   R   R   R   R    R   R   t   appendR   R   (   R
   R!   t   ct   d_xyzR"   t   e(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyt   d_g_alpha_d_params9   s    =c         C   s{   g  } d t  j d |  j } xV |  j D]K } t  j | | j ƒ } | j t d | d | j | d | | ƒ ƒ q( W| S(   s‘  Mathematica:

         alpha = 2 Pi {h,k,l}.{x,y,z}
         g = w Exp[-2 Pi^2 u dss]
         D[alpha,x,x]; D[alpha,x,y]; D[alpha,x,z]; D[g,x,u]; D[g,x,w]"
         D[alpha,y,x]; D[alpha,y,y]; D[alpha,y,z]; D[g,y,u]; D[g,y,w]"
         D[alpha,z,x]; D[alpha,z,y]; D[alpha,z,z]; D[g,z,u]; D[g,z,w]"
         D[alpha,u,x]; D[alpha,u,y]; D[alpha,u,z]; D[g,u,u]; D[g,u,w]"
         D[alpha,w,x]; D[alpha,w,y]; D[alpha,w,z]; D[g,w,u]; D[g,w,w]"

    This curvature matrix is symmetric.
    All D[alpha, x|y|z, x|y|z|u|w] are 0.

       D[g,u,u] = (4 dss^2 Pi^4) w Exp[-2 Pi^2 u dss]
       D[g,u,w] = (-2 dss Pi^2)    Exp[-2 Pi^2 u dss]
       D[g,w,w] = 0
    iþÿÿÿi   R   R   (	   R   R   R   R    R   R   R*   R   R   (   R
   R!   R+   R"   R-   (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyt   d2_g_alpha_d_paramsG   s    3c         C   s©   g  } |  j  ƒ  j d | ƒ } |  j ƒ  } xx t | | ƒ D]g \ } } | j t d | j t j | j	 ƒ d | j
 | j d | j
 | j d | j d | j ƒ ƒ q: W| S(   Nt   targetR   R   R   R   R	   (   R(   t   d_target_d_paramsR.   t   zipR*   R   R   R   R   R   R   R   R   R   R	   (   R
   R0   R!   t   dtst   dst   dtt   d(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyR1   `   s    	c         C   sv  g  } |  j  ƒ  } | j d | ƒ } t | j d | ƒ ƒ } |  j ƒ  } |  j ƒ  } d } xt | | | ƒ D]\ }	 }
 } | j ƒ  } xÚ |
 j D]Ï } g  } | j	 } t | ƒ } xž | D]– } | j ƒ  } x# | j D] } | | | | ƒ qÖ W| j ƒ  } | | | | j
 ƒ | | | | j ƒ | | j ƒ  | ƒ | | j ƒ  | ƒ qº W| j	 | ƒ q’ Wg  } | j	 } | j ƒ  } t | ƒ } xÿ | D]÷ } | j ƒ  } x& | j D] } | | | |
 j
 ƒ q¯W| j ƒ  } | | |
 j
 | j
 ƒ |
 | k r| d c |	 j | j 7<n  | | |
 j
 | j ƒ |
 | k r\| d c |	 j | j 7<n  | | j ƒ  |
 j
 ƒ | | j ƒ  |
 j
 ƒ q“W| j	 | ƒ g  } | j	 } t | ƒ } xÖ | D]Î } | j ƒ  } x& | j D] } | | | |
 j ƒ qÙW| j ƒ  } | | |
 j | j
 ƒ |
 | k rE| d c |	 j | j 7<n  | | |
 j | j ƒ | | j ƒ  |
 j ƒ | | j ƒ  |
 j ƒ q½W| j	 | ƒ xÏ d d g D]Á } g  } | j	 } t | j ƒ  ƒ } xŠ | D]‚ } | j ƒ  } x | j D] } | | | ƒ qóW| j ƒ  } | | | j
 ƒ | | | j ƒ | | j ƒ  ƒ | | j ƒ  ƒ q×W| j	 | ƒ q©Wqm W| S(   s¡  Combined application of chain rule and product rule.
       d_target_d_.. matrix:

         aa ag a' a"
         ga gg g' g"
         'a 'g '' '"
         "a "g "' ""

       Block in resulting matrix:

         xx xy xz xu xw x' x"
         yx yy yz yu yw y' y"
         zx zy zz zu zw z' z"
         ux uy uz uu uw '' '"
         wx wy wz wu ww "' ""
         'x 'y 'z 'u 'w '' '"
         "x "y "z "u "w "' ""
    R0   i    iÿÿÿÿi   (   R(   R1   t   itert   d2_target_d_paramsR.   R/   R2   t   nextR   R*   R   R   R   R   R   (   R
   R0   R!   t	   exp_i_sumR3   t   d2tiR4   t   d2st   idt2R5   t   dit   d2t   d2ti0t   dxit   rowt   rat   d2tijt   djt   d2tt   dxjt   ip(    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyR8   m   sŽ    " 	 	   	  	(	   R   R   R   R(   R)   R.   R/   R1   R8   (    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyR&   *   s   						(    (    (    (   t
   __future__R    t   cctbx.examplesR   t   scitbxR   R   R   R   R   R#   R%   R&   (    (    (    sY   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_derivatives.pyt   <module>   s   		