ó
[™xTc           @   s³   d  d l  m Z d  d l m Z d  d l m Z d  d l Z d  d l Z e j d Z	 d „  Z
 d „  Z d „  Z d	 e f d
 „  ƒ  YZ d „  Z e d k r¯ e e j d ƒ n  d S(   iÿÿÿÿ(   t   division(   t   flex(   t   matrixNi   c   	   
   C   sý   t  j t  j } } | |  d t ƒ } | |  d t ƒ } | |  d t ƒ } | |  d t ƒ } | |  d t ƒ } | |  d t ƒ } | | | | | | | | | | | | | | | | | | | | | | | | | | | | | f	 S(   s´   
  Mathematica code:
    rx = {{1, 0, 0}, {0, cx, -sx}, {0, sx, cx}}
    ry = {{cy, 0, sy}, {0, 1, 0}, {-sy, 0, cy}}
    rz = {{cz, -sz, 0}, {sz, cz, 0}, {0, 0, 1}}
    rx.ry.rz
  i    i   i   (   t   matht   sint   cost   angle_scale(	   t   eaR   R   t   cxt   sxt   cyt   syt   czt   sz(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   euler_xyz_matrix	   s    .c      
   C   s‹   t  j t  j } } | |  d t ƒ } | |  d t ƒ } | |  d t ƒ } | |  d t ƒ } d d | d | | | d | | | f	 S(   s,   Goldstein (A14.xyz) with sinus sign reversedi    i   (   R   R   R   R   (   R   R   R   R   R	   R
   R   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt*   euler_xyz_ea_d_as_omega_fixed_frame_matrix   s    	c         C   s�   t  j d ƒ } t  j d ƒ } xW t |  | ƒ D]F \ } } t  j | ƒ } | | 7} | t  j | ƒ | j | ƒ 7} q. Wt  j | j | j ƒ S(   s&   Schwieters & Clore (2001) equations 24i    (   i    i    i    (   i    i    i    (   R   t   colt   zipt   crosst   elems(   t   sitest   pivott   d_potential_energy_d_sitet	   sum_gradst   sum_momentst   sitet   grad(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   newton_euler_f)   s    
$t
   rigid_bodyc           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   sI   | |  _  t j | j ƒ  ƒ |  _ t j d ƒ |  _ t j d ƒ |  _ d  S(   Ni    (   i    i    i    (   i    i    i    (   t
   sites_origR   R   t   meant   center_of_mass_origt   ltR   (   t   selfR   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   __init__5   s    	c         C   s   t  d |  j ƒ S(   NR   (   R   R   (   R!   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   rotation_matrix;   s    c         C   s   |  j  |  j S(   N(   R   R    (   R!   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   center_of_mass_moved>   s    c         C   s"   |  j  ƒ  |  j |  j |  j ƒ  S(   N(   R#   R   R   R$   (   R!   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   sites_movedA   s    	c         C   s    |  j  ƒ  } | d | d |  j ƒ } t d | d |  j ƒ  d | j ƒ  ƒ } t | ƒ } t j t d |  j	 ƒ ƒ j
 ƒ  } t t | t j | d  ƒ ƒ | d S(	   Nt   nodest   homesR   R   R   R   i   iýÿÿÿ(   R%   R   R   R$   t	   gradientst   listR   t   sqrR   R   t	   transposeR   R   (   R!   t   energy_cart_functionR%   t   energy_cartt   ne_ft   ft   c(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   ea_gradientsG   s    (   t   __name__t
   __module__R"   R#   R$   R%   R1   (    (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyR   3   s
   				c            sù   t  |  ƒ d k s t ‚ t j d d d g ƒ } d t f d „  ƒ  Y‰ d „  ‰ d ‡ f d † ‰  ‡  ‡ f d †  } t d | ƒ } t j ƒ  } d } xY t | ƒ D]K } t j	 | j
 ƒ  ƒ | | _ t j	 | j
 ƒ  ƒ | | _ | d | ƒ q¡ Wd GHd  S(   Ni    gÙÎ÷Sãå%@gáz®G¡)@gTã¥›Ä`.@g�Âõ(\Ï$@gœÄ °rè+@g/Ý$�Õ/@g+‡ÙŽ%@g /Ý$†.@gNbX9t.@R-   c           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         S   s4   | j  ƒ  | j  ƒ  k s t ‚ | |  _ | |  _ d  S(   N(   t   sizet   AssertionErrorR&   R'   (   R!   R&   R'   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyR"   ]   s    	c         S   s   t  j |  j |  j j ƒ  ƒ S(   N(   R   t   sumR&   R'   t   dot(   R!   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt
   functionalb   s    c         S   s   d |  j  |  j S(   Ni   (   R&   R'   (   R!   (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyR(   e   s    (   R2   R3   R"   R8   R(   (    (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyR-   [   s   		c         S   s›   d | k o d k  n s" t  ‚ | d k  rb t |  j ƒ } | | c | 7<t j | ƒ |  _ n5 t |  j ƒ } | | d c | 7<t j | ƒ |  _ d  S(   Ni    i   i   (   R5   R)   R   R   R   R    (   t   rbt   it   deltat   v(    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   incr_positionh   s    "g�íµ ÷Æ°>c            s  g  } x÷ t  d ƒ D]é } g  } ˆ  d |  d | d | ƒ | j | d |  j ƒ  d |  j ƒ j ƒ  ƒ ˆ  d |  d | d | ƒ ˆ  d |  d | d | ƒ | j | d |  j ƒ  d |  j ƒ j ƒ  ƒ ˆ  d |  d | d | ƒ | j | d | d d	 | ƒ q W| S(
   Ni   R9   R:   R;   R&   R'   i    i   i   (   t   xranget   appendR%   R   R8   (   R9   R,   t   epst   resultR:   t   fs(   R=   (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   ea_gradients_fds   s    %c            s`   |  j  d ˆ ƒ } ˆ  d |  d ˆ ƒ } d G| d  GHd G| d  GHd G| d GHd G| d GHHd  S(   NR,   R9   s   an ea:i   s   fd ea:s   an lt:s   fd lt:(   R1   (   R9   t   ant   fd(   RC   R-   (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   show_gradients‚   s    R   i   R9   t   OK(   gÙÎ÷Sãå%@gáz®G¡)@gTã¥›Ä`.@(   g�Âõ(\Ï$@gœÄ °rè+@g/Ý$�Õ/@(   g+‡ÙŽ%@g /Ý$†.@gNbX9t.@(   t   lenR5   R   t   vec3_doublet   objectR   t   mersenne_twisterR>   R   R   t   random_double_point_on_sphereR   R    (   t   argsR   RF   R9   t   mtt   n_trialsR:   (    (   RC   R-   R=   sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   exerciseT   s"    		t   __main__i   (   t
   __future__R    t   scitbx.array_familyR   t   scitbxR   R   t   syst   piR   R   R   R   RJ   R   RP   R2   t   argv(    (    (    sX   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/examples/rigid_body_refinement_core.pyt   <module>   s   			
!	A