ó
Î™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 d  d l	 Z 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 j d ƒ Z d  d	 l m Z d  d l Z d
 d d „ Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   maptbx(   t   flexN(   t   matrix(   t   approx_equal(   t   adopt_init_argst   cctbx_maptbx_ext(   t   millerg{®Gáz„?g333333Ó?c   	         s•   t  j ƒ  ‰ ˆ j ƒ  ‰ ‡  ‡ ‡ ‡ ‡ ‡ ‡ f d †  } x' t d ƒ D] } | d | d | ƒ qF Wx+ t d ƒ D] } | d | d d | ƒ qp Wˆ S(   Nc            sÆ   g  } x˜ | | g D]‰ } ˆ |  | ˆ |  <t  j t j j d ˆ  d ˆ ƒ ƒ } | ˆ } t j d ˆ d ˆ d | d t j | j	 ƒ  t
 ƒ ƒ } | j | ƒ q Wˆ j | d | d d	 | ƒ d  S(
   Nt   center_of_masst   qt	   unit_cellt   density_mapt
   sites_cartt	   selectioni    i   i   (   R   t   rtt   scitbxt
   rigid_bodyt    joint_lib_six_dof_aja_simplifiedR   t   real_space_target_simpleR   t   boolt   sizet   Truet   append(   t   it   deltat   fst   signed_deltat   ajat   sites_cart_deltat   rs_f(   R   R   R	   t   q_deltat   resultt   sites_cart_0R
   (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyt   get   s    
	i   R   R   i   (   R   t   doublet	   deep_copyt   xrange(	   R
   R   R    R   R	   t   unit_quaternion_deltat   translation_deltaR!   R   (    (   R   R   R	   R   R   R    R
   sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyt&   real_space_rigid_body_gradients_simple   s    !  t   refinec           B   s)   e  Z d d d  „ Z d „  Z d „  Z RS(   c
         C   sÕ  |	 |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | j ƒ  j	 ƒ  |  _
 |  j
 j ƒ  |  _ t j j j d |  j
 j ƒ  d d ƒ j ƒ  j d d  ƒ }
 t j j d d  d |  j
 d t j |  j
 j ƒ  d ƒ d |
 d	 |  ƒ |  _ |  j j ƒ  |  _ |  j j ƒ  d
 k st ‚ d |  _ |  j ƒ  \ |  _ |  _  |  j! |  _" t j# j$ d t% d t% d t% ƒ } t j# j& d |  d | d | ƒ |  _' |  j ƒ  \ |  _( |  _) |  j! |  _* |  `! |  ` |  ` |  `
 |  ` d  S(   Nt
   n_verticest	   edge_listt   all_in_one_rigid_bodyt   sitest   labelst   massesi   t
   tardy_treet   potential_obji   iÿÿÿÿt-   ignore_line_search_failed_step_at_lower_boundt-   ignore_line_search_failed_step_at_upper_boundt    ignore_line_search_failed_maxfevt   target_evaluatort   termination_paramst   exception_handling_params(+   t   states_collectort   cctbx_geometry_restraints_flagst   residueR   t   geometry_restraints_managert   real_space_gradients_deltat   real_space_target_weightR
   t   atomst   extract_xyzt   sites_cart_residue_0t   meant   residue_center_of_massR   t   graphR/   t	   constructR   t
   build_treet   fix_near_singular_hingest   NoneR   t   tardy_modelR   R"   t   residue_tardy_modelt   pack_qt   xt   AssertionErrort   number_of_function_evaluationst    compute_functional_and_gradientst   f_startt   g_startR   t
   rs_f_startt   lbfgst   exception_handling_parametersR   t   runt	   minimizert   f_finalt   g_finalt
   rs_f_final(   t   selfR9   R   R:   R<   R;   t   lbfgs_termination_paramsR
   R8   R7   t   residue_tardy_treet   lbfgs_exception_handling_params(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyt   __init__/   sP    
												c         C   s«  |  j  d k r. |  j  d 7_  |  j |  j f S|  j  d 7_  |  j j d |  j ƒ |  j j ƒ  |  _ |  j d  k	 r� |  j j
 d |  j ƒ n  t j d |  j d |  j d |  j d t j |  j j ƒ  t ƒ ƒ } t d |  j d |  j d |  j d	 |  j d
 |  j ƒ } | |  _ | |  j 9} | |  j 9} |  j d  k rH| } | } nS |  j j d |  j d |  j d t ƒ } | j |  _ | | j } | |  j j ƒ  } | | j ƒ  f S(   Ni    i   t   q_packedR   R
   R   R   R    R   R	   t   flagst   compute_gradients(    RL   RN   RO   RH   t   unpack_qRJ   t   sites_movedt   sites_cart_residueR7   RF   t   addR   R   R
   R   R   R   R   R   R'   R?   RA   R   R<   R:   t   energies_sitesR8   t	   gradientst   _refine__d_e_pot_d_sitest   targett   d_e_pot_d_q_packedt	   as_double(   RX   R   t   rs_gt   ft   gt   gr_e(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyRM   e   sB    													c         C   s   |  j  } |  `  | S(   N(   Rf   (   RX   Ra   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyt   d_e_pot_d_sites‰   s    	N(   t   __name__t
   __module__RF   R\   RM   Rn   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyR(   -   s   
-	$t	   refine_mzc           B   sh   e  Z d  Z e d d d d d d „ Z d „  Z d „  Z d „  Z d	 „  Z	 d
 „  Z
 d „  Z d „  Z RS(   s«   
  Efficient real-space rigid-body refinement. Analog of MZ rigid-body refinement
  in reciprocal space. Whole content of pdb_hierarchy is treated as one rigid
  group.
  i   i2   i   t    c         C   sL  t  |  t ƒ  ƒ d  |  _ d  |  _ |  j d  k r@ t j |  _ n  |  j j	 ƒ  |  _
 t |  j j ƒ  j ƒ  |  j
 d ƒ s| t ‚ t j d |  j j ƒ  d |  j j ƒ  d |  j j ƒ  ƒ |  _ t j d |  j j ƒ  d t d |  j ƒ |  _ |  j ƒ  |  j ƒ  |  _ x! t |  j  ƒ D] } |  j! ƒ  qW|  j j" |  j ƒ |  j j# |  j ƒ d  S(   Ngü©ñÒMbP?R
   t   space_group_infot   pre_determined_n_realt   crystal_symmetryt   anomalous_flagt   d_min($   R   t   localsRF   t   cc_bestt   sites_cart_bestt   logt   syst   stdoutt   xray_structureR   t   sites_cart_startR   t   pdb_hierarchyR=   R>   RK   R   t   crystal_griddingR
   Rs   t   map_datat   allR   t	   build_setRu   t   FalseRw   t   complete_sett   _show_and_trackt   _get_mz_resolution_limitst   d_minsR$   t   macro_cyclest   _refinet   set_sites_cartt   adopt_xray_structure(   RX   R‚   R€   R~   Rw   t   use_maskt   masking_atom_radiust   max_iterationsRŠ   t   prefixR{   t   macro_cycle(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyR\   •   s,    		 		
c         C   sÃ   |  j  ƒ  } |  j j ƒ  } |  j d  k s9 | |  j k rT | |  _ | j ƒ  |  _ n  |  j r¿ d } |  j } d t	 j
 | | j ƒ  ƒ j ƒ  j ƒ  d } |  j | |  j | |  j | f IJn  d  S(   NsB   %sCC=%6.4f (best to keep CC=%6.4f), moved from start (max/mean)=%ss   %6.3f %6.3fi   (   t   _get_ccR~   R   Ry   RF   R#   Rz   R{   R   R   t   sqrtt   dott   min_max_meant   as_tupleR‘   (   RX   t   cct   s2t   fmtt   s1t   d(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyR‡   ·   s    			-c         C   sæ   t  j j d |  j ƒ |  _ |  j ƒ  } x¸ |  j D]­ } |  j d | ƒ } | d  k	 rh | | j	 ƒ  } n  t
 d |  j d | d d  d d d | d	 d
 |  j d |  j j ƒ  ƒ } |  j j | j ƒ |  j j |  j ƒ |  j ƒ  q1 Wd  S(   NR�   Rw   R9   R   R:   R<   i   R;   g      Ð?RY   R
   (   R   RQ   t   termination_parametersR�   RY   t	   _get_maskR‰   t   _get_map_at_d_minRF   Ri   R(   R€   R~   R
   RŒ   Rb   R�   R‡   (   RX   t	   mask_dataRw   t   mdt	   minimized(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyR‹   Ã   s$    	
	c         C   s»   d } |  j  j ƒ  j ƒ  j ƒ  } | j ƒ  d k  rC |  j  j ƒ  f St | d d ƒ } | d k rk d } n | |  j f S| d k rœ |  j d k  rœ d } n t |  j d ƒ } | | | f S(   Ni    iô  i   g       @g      @(   R†   t
   d_spacingst   sortt   dataR   Rw   t   mint   max(   RX   t   n_ref_lowestt	   d_spacingt   d_0t   d_1t   d_2(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyRˆ   ×   s      		c      	   C   s¶   d  } |  j r² |  j j d t ƒ } t j | j ƒ  j ƒ  |  j	 ƒ } t
 j d | j ƒ  d | j ƒ  d |  j j ƒ  d | ƒ } | d k } | j | d ƒ } | j | d ƒ } n  | S(	   Nt   sites_mod_positivet
   sites_fracR
   t   n_realt   radiigÍÌÌÌÌÌì?i    i   (   RF   RŽ   R~   t   expand_to_p1R   R   R"   t
   scatterersR   R�   R   t   maskR®   R
   R‚   Rƒ   t   set_selected(   RX   R    t   xrs_p1R°   t   s(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyRž   ç   s    	!		c         C   sM   |  j  j d |  j ƒ j ƒ  } t j d |  j d | ƒ } | j ƒ  | j ƒ  S(   NRw   R�   t   fourier_coefficients(	   R~   t   structure_factorsRw   t   f_calcR   t   fft_mapR�   t   apply_sigma_scalingt   real_map_unpadded(   RX   R¹   Rº   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyt   _get_mapö   s    			
c         C   s1   t  j d |  j j ƒ  d |  j ƒ  j ƒ  ƒ j ƒ  S(   NRJ   t   y(   R   t   linear_correlationR‚   t   as_1dR½   t   coefficient(   RX   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyR“   þ   s    	c      	   C   se   |  j  j d | ƒ j d |  j d t d t d t ƒ } t j d |  j d | ƒ } | j	 ƒ  | j
 ƒ  S(   NRw   t   mapt	   use_scaleRv   t   use_sgR�   R·   (   R†   t   resolution_filtert   structure_factors_from_mapR‚   R   R…   R   Rº   R�   R»   R¼   (   RX   Rw   t
   f_obs_cmplRº   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyRŸ     s    					
N(   Ro   Rp   t   __doc__R…   RF   R\   R‡   R‹   Rˆ   Rž   R½   R“   RŸ   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyRq   Ž   s   						t   refine_groupsc           B   s   e  Z d  „  Z RS(   c         C   s§  | |  _  | |  _ |  j j ƒ  j ƒ  } t | |  j  j ƒ  j ƒ  d ƒ sN t ‚ |  j j ƒ  } x t	 |  j  j
 ƒ  ƒ D]	\ } }	 d G|	 j GH|	 j ƒ  j ƒ  }
 | j |
 ƒ } | j |
 ƒ } t j j d | d | d d d d d d	 d
 t j | j ƒ  j ƒ  t ƒ d | ƒ } | j } | j } | j } | j } t d | d | d | d | d | d d  d d ƒ } | j |
 | j | ƒ } qs W|  j j | ƒ |  j  j |  j ƒ d  S(   Ng-Cëâ6?s   chain:R~   R‚   t   box_cushioni   t   selection_radiust   selection_stringRƒ   R   R€   Rw   RŠ   R{   R‘   s     (    R€   R~   R   R#   R   R=   R>   RK   Ru   t	   enumeratet   chainst   idt   extract_i_seqt   selectt   mmtbxt   utilst    extract_box_around_model_and_mapR   R   R²   R   R   t   shift_to_map_boxed_sites_backt   pdb_hierarchy_boxt   map_boxt   xray_structure_boxRq   RF   R´   Rz   RŒ   R�   (   RX   R‚   R€   R~   RŠ   Rw   t   sites_cart_resultt   cst   i_chaint   chainR   t   pht   xrs_tmpt   boxt
   shift_backt   ph_bt   md_bt   xrs_bR¢   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyR\     sF    		!"						(   Ro   Rp   R\   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyRÉ     s   (   t
   __future__R    t   cctbxR   t   cctbx.array_familyR   t   scitbx.rigid_bodyR   t   scitbx.graph.tardy_treet   scitbx.lbfgsR   t   libtbx.test_utilsR   t   libtbxR   R|   t   boost.pythont   boostt   pythont
   import_extR   R   t   mmtbx.utilsRÒ   R'   t   objectR(   Rq   RÉ   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/real_space/rigid_body.pyt   <module>   s$   a‚