ó
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   sitet   opst   hkl(   t   selfR   R   R   (    (    sg   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/site_derivatives.pyt   __init__   s    		c         C   sJ   d } x= |  j  D]2 } | |  j } | t j |  j j | ƒ ƒ 7} q W| S(   Ni    (   R   R   t   matht   cosR   t   dot(   R	   t   resultt   opt   op_site(    (    sg   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/site_derivatives.pyt   f   s
    #c         C   s�   t  j d d ƒ } xv |  j D]k } | |  j } |  j j | ƒ } t j | ƒ |  j } | j ƒ  } | | j ƒ  } | t  j | ƒ 7} q W| S(   Ni   i    (	   R   t   doubleR   R   R   R   R   t   sint	   transpose(   R	   R   R   R   t   hkl_op_sitet	   d_op_sitet   gtmxt   d_site(    (    sg   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/site_derivatives.pyR      s    c         C   s�   t  j d d ƒ } |  j j ƒ  } xe |  j D]Z } | |  j } |  j j | ƒ } t j | ƒ | } | t  j | j	 ƒ  | | ƒ 7} q+ W| S(   Ni   i    i	   (
   R   R   R   t   outer_productR   R   R   R   R   R   (   R	   R   t   d_alpha_d_siteR   R   R   t
   d2_op_site(    (    sg   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/site_derivatives.pyt   d2_site$   s    %(   t   __name__t
   __module__R
   R   R   R   (    (    (    sg   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/site_derivatives.pyR      s   			g�íµ ÷Æ°>c   
   	   C   sÉ   t  j ƒ  } t |  ƒ } xª t d ƒ D]œ } g  } x^ | | g D]O } |  | | | | <t d t j | ƒ d | d | ƒ }	 | j |	 j ƒ  ƒ q? W|  | | | <| j | d | d d | ƒ q% W| S(   Ni   R   R   R   i    i   i   (	   R   R   t   listt   xrangeR   R   t   colt   appendR   (
   R   R   R   t   epsR   t   site_epst   ipt   vst
   signed_epst   ca(    (    sg   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/site_derivatives.pyt   d_cos_alpha_d_site_finite.   s    $%c   
   	   C   sÉ   t  j ƒ  } t |  ƒ } xª t d ƒ D]œ } g  } x^ | | g D]O } |  | | | | <t d t j | ƒ d | d | ƒ }	 | j |	 j ƒ  ƒ q? W|  | | | <| j	 | d | d d | ƒ q% W| S(   Ni   R   R   R   i    i   i   (
   R   R   R   R    R   R   R!   R"   R   t   extend(
   R   R   R   R#   R   R$   R%   R&   R'   R(   (    (    sg   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/site_derivatives.pyt   d2_cos_alpha_d_site_finite;   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 Wt j	 t j d d d d ƒ d ƒ } t 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 |
 |	 ƒ sPt ‚ t d	 | d
 | d | ƒ } | d It | ƒ IJ| j ƒ  } | d It | ƒ IJt | | ƒ 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:t   OK(   R   t   syst   stdoutR    R"   R   t   sqrR   t   random_doubleR!   t   rowR   R)   R   R   R   t   AssertionErrorR+   R   (   t   argst   verboset   outt   i_trialR   t   iR   R   R(   t	   grads_fint	   grads_anat	   curvs_fint	   curvs_ana(    (    sg   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/site_derivatives.pyt   exerciseH   s.    	0%%t   __main__i   (    (   t
   __future__R    t   scitbxR   t   scitbx.array_familyR   t   libtbx.test_utilsR   R   t	   cStringIOR   R/   t   set_random_seedR   R)   R+   R>   R   t   argv(    (    (    sg   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/structure_factor_calculus/site_derivatives.pyt   <module>   s   #	