ó
Õ™xTc           @   sõ  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 d  d l	 Z	 d  d l
 Z d  d l m Z d  d l m Z d  d l	 Z	 d  d l Z d  d l m Z d  d l Z d  d l Z d  d l m Z d  d l Z d  d l Z e	 j d	 ƒ e j d	 ƒ d
 „  Z d d d d d d g d „ Z d d d d d d g d „ Z d d d d	 d	 d	 g d „ Z d d d d d d g d „ Z d „  Z  d d d d „ Z! d „  Z" d „  Z# d „  Z$ d  „  Z% d! „  Z& e' d" k rñe& ƒ  n  d S(#   iÿÿÿÿ(   t   division(   t   flex(   t   pdbN(   t   approx_equal(   t   format_cpu_times(   t   xray(   t   matrixi    c          C   s\  xUt  d ƒ D]G}  t j d d ƒ t j d d ƒ t j d d ƒ } } } | t j d | t j d | t j d } } } t j t j | ƒ t j | ƒ d t j | ƒ t j | ƒ d d d d f	 ƒ } t j t j | ƒ d t j | ƒ d d d t j | ƒ d t j | ƒ f	 ƒ } t j t j | ƒ t j | ƒ d t j | ƒ t j | ƒ d d d d f	 ƒ }	 | | |	 }
 t	 j
 j d | d | d	 | d
 d ƒ j ƒ  } t j t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ t j | ƒ f	 ƒ } t |
 | ƒ s?t ‚ t |
 | ƒ s t ‚ q Wd  S(   Ni'  i—þÿÿii  i´   i    i   t   phit   psit   thet
   conventiont   zyz(   t   xranget   randomt	   randranget   matht   piR   t   sqrt   cost   sint   scitbxt
   rigid_bodyt   eulert   rot_matR   t   AssertionError(   t   it   aat   bbt   cct   at   bt   ct   r1t   r2t   r3t   r_zyz_1t   r_zyz_2t   r_zyz_3(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   test_matrices_zyz   s.    5"!	%"ššHg        g      à?gffffffæ?gÍÌÌÌÌÌì?c   
   	   C   sg  t  j j d | d | d | d | ƒ } |  j j ƒ  j ƒ  } |  j j d | j ƒ  d | ƒ |  j d t	 ƒ |  j
 ƒ  d k sƒ t ‚ t j j j j ƒ  } t | _ t	 | _ d	 | _ t j j j d
 |  d t j | t	 ƒ j ƒ  g d | ƒ }	 t |	 j ƒ  d d d d g d d ƒst ‚ t |	 j ƒ  d d d d g ƒ sBt ‚ t |  j
 ƒ  d d d ƒsct ‚ d  S(   NR   R   R	   R
   t   rott   transt   update_f_calcg      à?t   ls_wunit_k1t   fmodelt
   selectionst   paramsi    g      à¿gffffffæ¿gÍÌÌÌÌÌì¿t   epsgñhãˆµøä>g        (   R   R   R   t   xray_structuret
   scattererst   sizet   apply_rigid_body_shiftR   t   update_xray_structuret   Truet   r_workR   t   mmtbxt
   refinementt   master_paramst   extractt   Falset   refine_rotationt   refine_translationt   targett   managerR   t   boolt
   iselectionR   t   translationt   rotation(
   R+   R
   R   R   R	   R(   t   rot_objR1   R-   t   rb(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   test_1.   s&    				.(c   
   	   C   s^  t  j j d | d | d | d | ƒ } |  j j ƒ  j ƒ  } |  j j d | j ƒ  d | ƒ |  j d t	 ƒ t
 |  j ƒ  d ƒ s† t ‚ t j j j j ƒ  } t	 | _ t	 | _ d	 | _ t j j j d
 |  d t j | t	 ƒ j ƒ  g d | ƒ }	 t
 |	 j ƒ  d d d d g ƒ st ‚ t
 |	 j ƒ  d d d d g ƒ s?t ‚ t
 |  j ƒ  d ƒ sZt ‚ d  S(   NR   R   R	   R
   R'   R(   R)   g        R*   R+   R,   R-   i    (   R   R   R   R/   R0   R1   R2   R   R3   R4   R   R5   R   R6   R7   R8   R9   R;   R<   R=   R>   R   R?   R@   RA   RB   (
   R+   R
   R   R   R	   R(   RC   R1   R-   RD   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   test_2D   s&    				((i   i   i   c   
   	   C   sˆ  t  j j d | d | d | d | ƒ } |  j j ƒ  j ƒ  } |  j j d | j ƒ  d | ƒ |  j d t	 ƒ |  j
 ƒ  d k sƒ t ‚ t j j j j ƒ  } t	 | _ t | _ d	 | _ d
 | _ d
 | _ d | _ t j j j d |  d t j | t	 ƒ j ƒ  g d | ƒ }	 | d k rAt |	 j ƒ  d d d d g d ƒ sAt ‚ n  t |	 j ƒ  d d d d g ƒ sit ‚ t |  j
 ƒ  d ƒ s„t ‚ d  S(   NR   R   R	   R
   R'   R(   R)   g333333Ã?g      ð?i2   R*   R+   R,   R-   t   xyzi    g      ð¿g       Àg      Àgš™™™™™É?g        (   R   R   R   R/   R0   R1   R2   R   R3   R4   R5   R   R6   R7   R8   R9   R;   R:   R<   t   high_resolutiont   max_iterationst*   lbfgs_line_search_max_function_evaluationsR=   R>   R   R?   R@   R   RB   RA   (
   R+   R
   R   R   R	   R(   RC   R1   R-   RD   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   test_3Z   s.    							.(g      ð?g      ø?c   
   	   C   s|  t  j j d | d | d | d | ƒ } |  j j ƒ  j ƒ  } |  j j d | j ƒ  d | ƒ |  j d t	 ƒ |  j
 ƒ  d k sƒ t ‚ t j j j j ƒ  } t	 | _ t	 | _ d	 | _ d
 | _ t j j j d |  d t j | t	 ƒ j ƒ  g d | ƒ }	 | d k r/t |	 j ƒ  d d d d g d ƒ s/t ‚ n  t |	 j ƒ  d d d d g d ƒ sZt ‚ t |  j
 ƒ  d d ƒ sxt ‚ d  S(   NR   R   R	   R
   R'   R(   R)   g333333Ã?g      ð?R*   R+   R,   R-   RG   i    g      ð¿g       Àg      Àgš™™™™™É?g      à¿g      ø¿gü©ñÒMbP?g        (   R   R   R   R/   R0   R1   R2   R   R3   R4   R5   R   R6   R7   R8   R9   R;   R<   RH   R=   R>   R   R?   R@   R   RB   RA   (
   R+   R
   R   R   R	   R(   RC   R1   R-   RD   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   test_4s   s*    					.+c      	   C   sÕ  |  j  j ƒ  j ƒ  } t j ƒ  } t j ƒ  } xW t | ƒ D]I } | d k  ri | j t ƒ | j t ƒ q: | j t ƒ | j t ƒ q: W| j	 ƒ  | j	 ƒ  g } t
 j j d d d d d d d | ƒ } t
 j j d d d d d d d | ƒ } |  j  j d	 | j ƒ  d
 d d d g d | j	 ƒ  ƒ |  j  j d	 | j ƒ  d
 d d d g d | j	 ƒ  ƒ |  j d t ƒ |  j ƒ  d k s}t ‚ t j j j j ƒ  }	 t |	 _ t |	 _ d |	 _ d |	 _ t j j j d |  d | d |	 ƒ }
 | d k r?t |
 j ƒ  d d d d g d ƒ st ‚ t |
 j ƒ  d d d d g d ƒ s?t ‚ n  t |
 j ƒ  d d d d g d ƒ sjt ‚ t |
 j ƒ  d d d d g d ƒ s•t ‚ t |  j ƒ  d d  ƒ s³t ‚ t |  j ƒ  d d  ƒ sÑt ‚ d  S(!   Niô  R   i   R   i   R	   i   R
   R'   R(   g      à?g      ð?g      ø?t	   selectionR)   gffffffÖ?R*   R+   R,   R-   RG   i    iÿÿÿÿiþÿÿÿiýÿÿÿgš™™™™™É?g      à¿g      ð¿g      ø¿g-Cëâ6?g        gü©ñÒMb@?(   R/   R0   R1   R   R?   R   t   appendR4   R:   R@   R   R   R   R2   R   R3   R5   R   R6   R7   R8   R9   R;   R<   RH   R=   R>   R   RB   RA   t   r_free(   R+   R
   R1   t   sel1t   sel2R   R,   t	   rot_obj_1t	   rot_obj_2R-   RD   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   test_5Š   sN    					+.++t   directg       @R*   c   	   	   C   sˆ  t  j j d d |  d t j j ƒ } t j j d | ƒ j	 ƒ  } t
 j j j j ƒ  } | j d  k sj t ‚ | j d k s t ‚ | j j d k s— t ‚ | | _ d | _ | | j _ t
 j j d | d	 | d
 | d d ƒ j } t t
 j j | j ƒ  j ƒ  | j ƒ  j ƒ  ƒ d ƒ st ‚ t
 j j j ƒ  } | | _ t
 j j d | d | d t | j ƒ  ƒ d | ƒ } t | j  ƒ  d ƒ s„t ‚ | S(   Nt   relative_paths   phenix_regression/pdb/%st   testt	   file_namet
   n_gaussiant   fftt   wk1995R/   R-   R=   t   r_free_flags_fractiong{®Gáz„?i    t   target_namet   f_obst   sf_and_grads_accuracy_params(!   t   libtbxt   envt   find_in_repositoriest   ost   patht   isfilet   iotbxR   t   inputt   xray_structure_simpleR6   t   command_lineR+   t(   fmodel_from_xray_structure_master_paramsR9   RH   t   NoneR   t   scattering_tablet   structure_factors_accuracyt	   algorithmt   utilst   fmodel_from_xray_structureR   t   bulk_solventt   r_factorR^   t   datat   f_modelt#   sf_and_grads_accuracy_master_paramsR>   t   absR5   (	   t   pdb_file_nameRn   t   d_minR=   t   pdb_fileR/   R-   R+   t
   sfg_params(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   get_fmodel_from_pdb´   s4    		!		c          C   sé   t  d d ƒ }  t  d d d d ƒ } x¾ d d g D]° } d G| GHt d	 |  j ƒ  d
 | ƒ d G| GHt d	 |  j ƒ  d
 | ƒ d G| GHt d	 |  j ƒ  d
 | ƒ d G| GHt d	 | j ƒ  d
 | ƒ d G| GHt d	 | j ƒ  d
 | ƒ q1 Wd  S(   NRw   s   enk_gbr.pdbs   lys_rigid_body.pdbRn   RZ   RG   R   s   test 1: R+   R
   s   test 2: s   test 3: s   test 4: s   test 5: (   R{   RE   t	   deep_copyRF   RK   RL   RT   (   t   fmodel_smallt
   fmodel_bigR
   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt	   run_testsÓ   s    						c          C   s$  d GHt  d d d d d d d d	 ƒ }  t j d
 |  j j ƒ  d t ƒ xØd d g D]Ê} t j j d d d d d d d | ƒ } |  j j ƒ  j	 ƒ  } t
 j | t ƒ j ƒ  g } |  j j d | j ƒ  d d d d g ƒ |  j d t ƒ |  j ƒ  } g  } x3 | D]+ } | j j | ƒ } | j | j ƒ  ƒ q Wt j j j d | d | j j ƒ  d | j ƒ  d | g d | d t ƒ }	 t |	 j ƒ  | j ƒ  ƒ s˜t ‚ |	 j ƒ  |	 j ƒ  }
 } t  | d d  ƒ} t t! | d ƒ | ƒ sât ‚ t" d! | d d  d | ƒ } t t! |
 d ƒ | ƒ sR t ‚ qR Wd  S("   Ns   finite_differences_test: Rw   s   enk_rbr.pdbRn   RU   Rx   g       @R=   R*   R0   t   siteR   RG   R   i    R   R	   R
   R'   R(   i   i   i   R)   t   centers_of_masst
   sites_cartt   target_functort   rot_objsR,   t   suppress_gradientst   eg-Cëâ6?R+   (#   R{   R   t   set_scatterer_grad_flagsR/   R0   R4   R   R   R   R1   R   R?   R@   R2   R   R3   R|   t   selectRN   t   center_of_massR6   R7   t   target_and_gradsR‚   Rƒ   R:   R   R=   t   target_wR   t   gradients_wrt_rt   gradients_wrt_tt   fd_translationt   listt   fd_rotation(   R+   R
   RC   R1   R,   t   fmodel_copyR�   t   st   xrst   tg_objt   g_rott   g_translt	   fd_translt   fd_rot(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   finite_differences_testä   sH    				!	c      	   C   s/  g  } x"| d d g d | d g d d | g g D]ö } |  j  j ƒ  } |  j  j ƒ  } |  j ƒ  } | j d | d d | d d | d ƒ } | j d | d d | d d | d ƒ } | j d | d t ƒ | j ƒ  ƒ  j ƒ  }	 | j d | d t ƒ | j ƒ  ƒ  j ƒ  }
 | j |	 |
 d | ƒ q1 W| S(	   Ni    t   xt   yi   t   zi   R/   R)   (	   R/   t   deep_copy_scatterersR|   t	   translateR3   R4   Rƒ   t   target_workRN   (   R+   R†   t   gradst   shiftt   xrs1t   xrs2t   fmt   xrs_g1_1t   xrs_g1_2t   t1t   t2(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyRŽ     s    1*-c      
   C   sú  g  } xí| d d g d | d g d d | g g D]Á} |  j  j ƒ  } |  j  j ƒ  } |  j ƒ  } t j j d | d d | d d | d d | ƒ } t j | j ƒ  j	 ƒ  t
 ƒ g }	 t j j j d | d	 | j ƒ  g d
 d g d |	 ƒ }
 t j j d | d d | d d | d d | ƒ } t j | j ƒ  j	 ƒ  t
 ƒ g }	 t j j j d | d	 | j ƒ  g d
 d g d |	 ƒ } | j d |
 d t
 ƒ | j ƒ  ƒ  j ƒ  } | j d | d t
 ƒ | j ƒ  ƒ  j ƒ  } | j | | d | t j d ƒ q1 W| S(   Ni    R   R   i   R	   i   R
   R/   t   rotation_matricest   translation_vectorsg        R,   R)   i´   (   g        g        g        (   g        g        g        (   R/   R�   R|   R   R   R   R   R?   R0   R1   R4   R6   R7   t   apply_transformationR   R3   Rƒ   RŸ   RN   R   R   (   R+   R†   R
   R    R¡   R¢   R£   R¤   RC   R,   R¥   R¦   R§   R¨   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyR�     sB    1

	!			!		(c           C   s!   t  ƒ  t ƒ  t ƒ  t ƒ  GHd  S(   N(   R&   R   R™   R   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   exerciseB  s    t   __main__((   t
   __future__R    t   cctbx.array_familyR   Rf   R   t   libtbx.load_envR`   Rc   R   t   mmtbx.refinement.rigid_bodyR6   t   libtbx.test_utilsR   t   libtbx.utilsR   R   t   cctbxR   t   mmtbx.utilst	   iotbx.pdbR   R   t   mmtbx.command_line.fmodelt   scitbx.rigid_bodyt   seedt   set_random_seedR&   RE   RF   RK   RL   RT   R{   R   R™   RŽ   R�   R¬   t   __name__(    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tst_rigid_body.pyt   <module>   sF   				+		'		&	