ó
,™xTc           @   sØ   d  d l  m Z d  d l m Z 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	 „ Z d d
 „ Z e d „ Z d d d d „ Z d „  Z e d k rÔ e d e j d ƒ n  d S(   iÿÿÿÿ(   t   division(   t   anglet   angle_delta_deg(   t   flex(   t   matrix(   t   approx_equal(   t   null_outNg�íµ ÷Æ°>c      
   C   sa  t  j ƒ  } |  j } g  | D] } t | ƒ ^ q } x&t d ƒ D]} g  } xö t d ƒ D]è }	 g  }
 x¢ | | g D]“ } | | |	 | | | |	 <t d | d |  j d |  j ƒ } | d k r× |
 j | j	 ƒ  ƒ qt | d k r|
 j | j
 ƒ  | |	 ƒ qt t ‚ qt W| | |	 | | |	 <| j |
 d |
 d d | ƒ qZ W| j t | ƒ ƒ qA W| S(   Ni   t   sitest   angle_idealt   weighti   i   i    (   R   t   vec3_doubleR   t   listt   xrangeR   R   R	   t   appendt   residualt	   gradientst   RuntimeErrort   tuple(   t   at   ordert   epst   resultt   sites0t   siteR   t   i_sitet   dst   i_dimt   samplest
   signed_epst   a_eps(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/tst_angle_derivs.pyt	   derivs_fd	   s&    	!
%c         C   s®   d t  d t j  t j | j ƒ  ƒ ƒ ƒ } |  d It | | ƒ IJ|  d It | | ƒ IJ| s‹ t | | | | d | ƒs¦ t ‚ n t | | | | d | ƒ|  Jd  S(   Ni   s     ana:s     fin:R   (   t   maxR   t   abst	   as_doubleR   R   t   AssertionError(   t   outt   anat   fint   expect_failureR   t   s(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/tst_angle_derivs.pyt   compare_derivs   s    +&c      	   C   sÁ   |  d I| j  IJ|  J| j ƒ  } |  d I| j  IJt d | d d ƒ } t d |  d | d  d	 | d
 | ƒ |  d I| j  IJt d | d d ƒ } t d |  d | d d	 | d
 | ƒ |  Jd  S(   Ns   sites:s   grads:R   R   i   R#   R$   i   R%   R&   s   curvs:i   (   R   t   grads_and_curvsR   R(   (   R#   R   R&   t   gct   g_fdt   c_fd(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/tst_angle_derivs.pyt   check_derivs)   s    ##i   i   g     ˆÓÀc      	      sÒ  ˆ d k s t  ‚ g  ‰ d } d } t j d ƒ } x˜d d g D]Š‰  d „  } | ƒ  } | ƒ  }	 x(t d	 | d
 | | | ƒ D]}
 |
 | } | j d | d t ƒ } t d | | | | g d ˆ  d d ƒ } ˆ d k rë | j ƒ  } n1 t d | d d ƒ } | j	 t d | d d ƒ ƒ x3 t d ƒ D]% } | | j
 | | d | f ƒ q)Wx3 t d ƒ D]% } |	 | j
 | | d | f ƒ q_Wq€ W‡  ‡ ‡ ‡ f d †  } | d d d | ƒ | d d d |	 ƒ q@ Wˆ S(   NR$   R%   iÿÿÿÿi    i   i´   ix   c          S   s.   g  }  x! t  d ƒ D] } |  j g  ƒ q W|  S(   Ni   (   R   R   (   R   t   j(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/tst_angle_derivs.pyt
   init_plots<   s    iZ   i  R   t   degR   R   R	   R   R   i   i   i   c            sæ   d ˆ  |  ˆ f } ˆ j  | ƒ t | d ƒ } | d IJ| d |  ˆ  ˆ f IJx, t d ƒ D] } | d | d | f IJq] Wx` | D]X } xE | D]= \ } } |  d k rÀ | ˆ k  rÀ ˆ } n  | | I| IJq“ W| d	 IJq† Wd  S(
   Ns   angle_%d_%s_%s.xyt   ws   @with g0s   @ title "%s ideal=%d method=%s"i   s   @ s%d legend "%s"t   xyzt   curvt   &(   R   t   openR   (   t   derivt   plotst	   file_namet   fR.   t   plott   xt   y(   R   t   c_truncate_att   methodt   plot_file_names(    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/tst_angle_derivs.pyt   writeS   s    
 	R6   t   gradR7   R3   (   s   anas   fin(   iÿÿÿÿi    i    (   i    i    i    (   i    i    i   (   R"   R   t   colR   t$   axis_and_angle_as_r3_rotation_matrixt   TrueR   R)   R   t   extendR   (   R>   t	   rot_scalet   rot_stepR=   t   site0t   site1t   axisR/   t   g_plotst   c_plotst
   rot_deg_sct   rot_degt   rR   R*   R.   R@   (    (   R   R=   R>   R?   sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/tst_angle_derivs.pyt   write_plots5   s8    			%
	#'c      
   C   s¸  |  g  d g g k s t  ‚ t |  ƒ d k r9 t ƒ  } n	 t j } t j d d ƒ } xst d ƒ D]e} | j ƒ  d } | j ƒ  d } | j ƒ  d } | j ƒ  d d d | j	 ƒ  d	 d } t
 j | j ƒ  ƒ } | j ƒ  }	 | | }
 |
 | | } |	 j d
 | d t ƒ } |
 | | | } t d | |
 | g d | j ƒ  d d d | j ƒ  d d ƒ } t t t t d | j d | ƒ ƒ t t d | j d | ƒ ƒ ƒ d ƒ s³t  ‚ t d | d | ƒ qa Wx´ d% d& g D]¦ } t j d d d g ƒ } x… t r|t d t t j d' d( | g ƒ j | ƒ ƒ d | j ƒ  d d d | j ƒ  d d ƒ } t d | d | ƒ | j ƒ  søPqøqøWq×Wx® d) d* d+ d, g D]š } t j d d d g ƒ } xy t r-t d t t j | d- t
 j | ƒ g ƒ j | ƒ ƒ d d d d ƒ } t d | d | d t ƒ | j ƒ  sµPqµqµWq”Wg  } x* d d g D] } | j t d | ƒ ƒ qEWt d d  ƒ } x. | D]& } | d! | | j d" d# ƒ f IJq{W| j  ƒ  d$ GHd  S(.   Ns	   --verbosei    t   seedi
   g      à?i²   i   i´   i   R   R0   R   R   iÐ  ih  R	   gš™™™™™¹?t   angle_1t   angle_2R#   R   gffffff@g      @i   g333333ó?gÍÌÌÌÌÌô?R&   R$   R%   R>   t   angle_xy_as_pdf_commandsR1   s   ppdf %s > %ss   .xys   .pdft   OK(   i    gffffff@i    (   i    i    g      @(   g333333ó?i    i    (   i    i    i    (   i   i    i    (   i    i   i    (   i    i    i   (   i   i   i   (   i    i    i    (!   R"   t   lenR   t   syst   stdoutR   t   mersenne_twisterR   t   random_doublet   random_size_tR   RB   t   random_double_point_on_spheret   orthoRC   RD   R   R   t   minR    R   t   angle_modelR-   t   size_tR   R
   t   selectt   next_permutationRE   RP   R5   t   replacet   close(   t   argsR#   t   mtt   i_trialt   l0t   l1t   l2R_   t   vRJ   RI   RH   RO   t   site2R   t   permR?   R>   R9   R8   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/tst_angle_derivs.pyt   rune   sl    	*
.				(	$
t   __main__Re   (   t
   __future__R    t   cctbx.geometry_restraintsR   R   t   cctbx.array_familyR   t   scitbxR   t   libtbx.test_utilsR   t   libtbx.utilsR   RW   R   R(   t   FalseR-   RP   Rn   t   __name__t   argv(    (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/tst_angle_derivs.pyt   <module>   s   
0	@