ó
5™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 Z d  d l	 m
 Z
 d  d l Z e j d ƒ d d d	 „  ƒ  YZ d
 d „ Z d
 d „ Z d „  Z e d k rÉ e e j d ƒ n  d S(   iÿÿÿÿ(   t   division(   t   matrix(   t   flex(   t   approx_equalN(   t   StringIOi    t	   cos_alphac           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t   sitest   opst   hkl(   t   selfR   R   R   (    (    sh   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/sites_derivatives.pyt   __init__   s    		c         C   s[   d } xN |  j  D]C } x: |  j D]/ } | | } | t j |  j j | ƒ ƒ 7} q  Wq W| S(   Ni    (   R   R   t   matht   cosR   t   dot(   R	   t   resultt   sitet   opt   op_site(    (    sh   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/sites_derivatives.pyt   f   s    
'c   	      C   s³   t  j ƒ  } x  |  j D]• } t  j d d ƒ } xm |  j D]b } | | } |  j j | ƒ } t j | ƒ |  j } | j ƒ  } | t  j | | j ƒ  ƒ 7} q8 W| j	 | ƒ q W| S(   Ni   i    (
   R   t   doubleR   R   R   R   R   t   sint	   transposet   extend(	   R	   R   R   t   d_siteR   R   t   hkl_op_sitet	   d_op_sitet   gtmx(    (    sh   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/sites_derivatives.pyt   d_sites   s    
!c         C   s  t  |  j ƒ d } t j t j | | ƒ d ƒ } |  j j ƒ  } x» t |  j ƒ D]ª \ } } t j t j d d ƒ d ƒ } xb |  j D]W } | | } |  j j	 | ƒ }	 t
 j |	 ƒ | }
 | t j | j ƒ  |
 | ƒ 7} q„ W| j | | d | d ƒ qP W| S(   Ni   i    (   t   lenR   R   R   t   gridR   t   outer_productt	   enumerateR   R   R   R   R   t   matrix_paste_block_in_place(   R	   t   nR   t   d_alpha_d_sitet   jsR   t   d2_siteR   R   R   t
   d2_op_site(    (    sh   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/sites_derivatives.pyt   d2_sites'   s    
%(   t   __name__t
   __module__R
   R   R   R&   (    (    (    sh   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/sites_derivatives.pyR      s   			g:Œ0âŽyE>c      
   C   sü   t  j ƒ  } t |  ƒ } xÝ t |  ƒ D]Ï \ } } t | ƒ } x¦ t d ƒ D]˜ }	 g  }
 xh | | g D]Y } | |	 | | |	 <t j | ƒ | | <t d | d | d | ƒ } |
 j | j	 ƒ  ƒ qd W| j |
 d |
 d d | ƒ qJ W|  | | | <q% W| S(   Ni   R   R   R   i    i   i   (
   R   R   t   listR   t   xrangeR   t   colR   t   appendR   (   R   R   R   t   epsR   t	   sites_epsR#   R   t   site_epst   jpt   vst
   signed_epst   ca(    (    sh   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/sites_derivatives.pyt   d_cos_alpha_d_sites_finite5   s    %c      
   C   sü   t  j ƒ  } t |  ƒ } xÝ t |  ƒ D]Ï \ } } t | ƒ } x¦ t d ƒ D]˜ }	 g  }
 xh | | g D]Y } | |	 | | |	 <t j | ƒ | | <t d | d | d | ƒ } |
 j | j	 ƒ  ƒ qd W| j
 |
 d |
 d d | ƒ qJ W|  | | | <q% W| S(   Ni   R   R   R   i    i   i   (   R   R   R)   R   R*   R   R+   R   R,   R   R   (   R   R   R   R-   R   R.   R#   R   R/   R0   R1   R2   R3   (    (    sh   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/sites_derivatives.pyt   d2_cos_alpha_d_sites_finiteE   s    %c      	   C   sð  d |  k } | s t  ƒ  } n	 t j } x½t d ƒ D]¯} g  } x@ t d ƒ D]2 } | j t j t j d d d d ƒ d ƒ ƒ qM Wg  } x@ t d ƒ D]2 } | j t j	 t j d d d d ƒ d ƒ ƒ q– Wt j
 t j d d d d ƒ d ƒ } t d	 | d
 | d | ƒ } t d	 | d
 | d | ƒ }	 | d It |	 ƒ IJ| j ƒ  }
 | d It |
 ƒ IJt |
 |	 ƒ stt ‚ t d	 | d
 | d | ƒ } | d It | ƒ IJ| j ƒ  } | d It | ƒ IJt | | d ƒ sßt ‚ | Jq4 Wd GHd  S(   Ns	   --verboseid   i   t   sizei	   t   factori   i   R   R   R   s
   grads_fin:s
   grads_ana:s
   curvs_fin:s
   curvs_ana:gñhãˆµøä>t   OK(   R   t   syst   stdoutR*   R,   R   t   sqrR   t   random_doubleR+   t   rowR   R4   R)   R   R   t   AssertionErrorR5   R&   (   t   argst   verboset   outt   i_trialR   t   iR   R   R3   t	   grads_fint	   grads_anat	   curvs_fint	   curvs_ana(    (    sh   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/sites_derivatives.pyt   exerciseU   s2    	00%t   __main__i   (    (   t
   __future__R    t   scitbxR   t   scitbx.array_familyR   t   libtbx.test_utilsR   R   t	   cStringIOR   R9   t   set_random_seedR   R4   R5   RH   R'   t   argv(    (    (    sh   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/sites_derivatives.pyt   <module>   s   *	