ó
Ó™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	 Z d  d l
 m Z d  d l Z d  d l m Z d  d l m Z d  d	 l m Z d  d
 l m Z m Z d  d l m Z d  d l Z e j Z d Z d e f d „  ƒ  YZ e d e  d „ Z! d e d d „ Z" d S(   iÿÿÿÿ(   t   division(   t   kinetic_energy_as_temperaturet   temperature_as_kinetic_energy(   t   akma_time_as_pico_seconds(   t   xrayN(   t   flex(   t
   tardy_tree(   t   matrix(   t   Sorry(   t   format_valuet   show_string(   t
   group_argss›    xray_weight_factor = 10
    .type = float
  start_temperature_kelvin = 2500
    .type = float
  final_temperature_kelvin = 300
    .type = float
  velocity_scaling = True
    .type = bool
  temperature_cap_factor = 1.5
    .type = float
  excessive_temperature_factor = 5
    .type = float
  number_of_cooling_steps = 500
    .type = int
  number_of_time_steps = 1
    .type = int
  time_step_pico_seconds = 0.001
    .type = float
  temperature_degrees_of_freedom = *cartesian constrained
    .type = choice
    .optional = False
  minimization_max_iterations = 0
    .type = int
  prolsq_repulsion_function_changes
    .help = "energy(delta) = "
            "c_rep*(max(0,(k_rep*vdw_distance)**irexp-delta**irexp))**rexp"
  {
    c_rep = None
      .type = float
      .help = "Usual value: 16"
    k_rep = 0.75
      .type = float
      .help = "Usual value: 1."
              "Smaller values reduce the distance threshold at which"
              "the repulsive force becomes active."
    irexp = None
      .type = float
      .help = "Usual value: 1"
    rexp = None
      .type = float
      .help = "Usual value: 4"
  }
  omit_bonds_with_slack_greater_than = 0
    .type = float
  constrain_dihedrals_with_sigma_less_than = 10
    .type = float
  near_singular_hinges_angular_tolerance_deg = 5
    .type = float
  emulate_cartesian = False
    .type = bool
  trajectory_directory = None
    .type = path
    .expert_level = 3
t   potential_objectc           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c   	   	   C   s/  | |  _  | |  _ | |  _ | j |  _ | |  _ | } | j d  k r~ | j d  k r~ | j	 d  k r~ | j
 d  k r~ d  |  _ n] | j j j } t | t j j ƒ s¨ t ‚ | j d | j d | j d | j	 d | j
 ƒ |  _ |  j j ƒ  |  j j ƒ  |  j j ƒ  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  S(   Nt   c_rept   k_rept   irexpt   rexp(   t   xray_weight_factort   fmodelst   modelt   xyz_weights_resultt   weightst   reduced_geo_managerR   t   NoneR   R   R   t   custom_nonbonded_functiont   restraints_managert   geometryt   nonbonded_functiont
   isinstancet   cctbxt   geometry_restraintst   prolsq_repulsion_functiont   AssertionErrort   customized_copyt   create_target_functorst(   prepare_target_functors_for_minimizationt:   target_functions_are_invariant_under_allowed_origin_shiftst+   allowed_origin_shifts_need_to_be_suppressedt   last_sites_movedt   ft   gt	   last_grms(	   t   OR   t!   prolsq_repulsion_function_changesR   R   t   target_weightsR   t   cR   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   __init__L   s6    											c         C   s   |  j  j j j S(   N(   R   R   R   t   crystal_symmetry(   R*   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyR/   q   s    c      	   C   sH  |  j  d  k s* |  j  j ƒ  | j ƒ  k rA| |  _  |  j j ƒ  j } t | ƒ | j ƒ  j ƒ  k si t	 ‚ | } | j
 d | ƒ |  j j d t ƒ | j ƒ  j d t ƒ | j ƒ  j d t j | j ƒ  j ƒ  ƒ ƒ t | ƒ d } |  j d  k	 rZ|  j j d |  j d t ƒ } | j ƒ  |  j |  _ | j ƒ  |  j |  _ |  j j ƒ  | k sxt	 ‚ n d |  _ t j | d	 ƒ |  _ |  j d  k r�d  } n |  j j d | d t ƒ } |  j j j d | d
 t j j  j  d t ƒ d |  j! d t ƒ } | j" |  j j# } |  j | j |  j j# 7_ | j |  j j# }	 | d  k	 rb|  j | j | 7_ |	 | j | 7}	 n  | d	 k stt	 ‚ d | }
 t$ d |
 t j% |	 j& ƒ  ƒ d d |
 t j% |  j ƒ d d d ƒ |  _' t( j) j* d | j ƒ  d |  j d |	 ƒ |  j |
 9_ |  j |
 9_ t j% |  j ƒ d |  j' _+ t j, |  j ƒ |  _ n  |  j S(   Nt
   sites_cartt   update_f_calct   statet
   iselectioni   R   t   compute_gradientsg        i    t   geometry_flagst	   nonbondedR   i   t   geog      à?R   t   real_or_xrayt
   scattererst   xray_gradientst   site_gradients(-   R&   R   t   idR   t   fmodel_xrayt   xray_structuret   lenR9   t   sizeR    t   set_sites_cartt   update_xray_structuret   Truet   flags_set_gradst   Falset   flags_set_grad_siteR   t   size_t_rangeR   t   target_and_gradientsR   t   targetR'   t	   gradientsR(   t   doubleR   t   energies_sitesR   R   R   R   t   flagsR   t   normalization_factort   wR   t   mean_sqt	   as_doubleR)   R   t   minimizationt   add_gradientst   totalt   vec3_double(   R*   t   sites_movedt   xsR0   t   expected_g_sizet   tgt   reduced_geo_energiest   other_energiest   nfwt   ggt   scale(    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   e_pott   sh    	$							
	c         C   s   |  j  d | ƒ |  j S(   NRV   (   R_   R(   (   R*   RV   (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   d_e_pot_d_sites¬   s    (   t   __name__t
   __module__R.   R/   R_   R`   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyR   J   s   	%		8c            sœ  |  j  ƒ  d  k s t ‚ ˆ j d  k s- t ‚ |  j ƒ  j } | j ƒ  }	 |	 }
 g  | j ƒ  D] } | j ^ q[ } | j	 rª t
 j j j d t |
 ƒ d g  ƒ } | j ƒ  n? ˆ j j j d |
 d ˆ j j d | j d | j d | j ƒ } | d IJ| j d	 | d
 | d d ƒ | J| j ƒ  | j	 r/d  } n¢ t } ˆ j j j j d  k	 rwd ˆ j j j j j j k rwt } qwn  ˆ j j j  d | d | j d | ƒ } | rÑd d  l! } | j" j# j# d t ƒ | j _# n  t$ d | j% d | j& d |  d ˆ d | d | ƒ } t
 j' j( d | d |
 d | j) ƒ  d | d | d | j ƒ } ‡  ‡ ‡ f d †  } t* d | d | d | j+ ƒ  d d  d  | d! |  j ƒ  d" | d# | ƒ d  S($   Nt
   n_verticest	   edge_listt   sitest	   selectiont"   omit_bonds_with_slack_greater_thant(   constrain_dihedrals_with_sigma_less_thant*   near_singular_hinges_angular_tolerance_degs   tardy_tree summary:t   vertex_labelst   outt   prefixs     t   torsionR   t   include_den_restraintsiÿÿÿÿt   denR   R+   R   R   R,   R   t   labelst   massest   potential_objc            s,   ˆ d  k	 r( ˆ  r( ˆ j ˆ |  d ƒ n  d  S(   Nt   torsion_dynamics(   R   t	   call_back(   t   fmodel(   t   call_back_after_stepR   t   monitor(    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   refinement_callbackí   s    t   tardy_modelt   paramst   rmsd_calculatort   callbackt   logRu   t   format_for_phenix_refineRx   (,   t   fmodel_neutronR   R    t   ias_selectionR=   R>   R0   R9   t   labelt   emulate_cartesiant   scitbxt   graphR   t	   constructR?   t
   build_treeR   R   t   construct_tardy_treet   refinement_flagst   sites_torsion_anglesRg   Rh   Ri   t   show_summaryt   flushRE   t   generic_restraints_managert   den_managerRz   t   annealing_typeRC   t   reduce_for_tardyt   mmtbx.geometry_restraints.flagsR   RM   R   R   R+   t
   rigid_bodyRy   t   atomic_weightst   actionR{   (   R   R   R,   Rz   R}   R~   Rw   Rv   RW   t   sites_cart_startRe   t   scRp   t   ttR   Rn   t   mmtbxRr   Ry   Rx   (    (   Rv   R   Rw   sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   run°   st    "			

					!			c   #         sÎ	  ˆ j  ƒ  ‰	 ˆ j ƒ  } | j }	 |	 d  k	 rˆ d t |	 ƒ IJd d l m }
 |
 d |	 ƒ d d l m } | j	 d t
 j |	 d ƒ d ˆ j ƒ d	 t d
 | j | j ƒ } | j	 d t
 j |	 | d ƒ d ˆ	 ƒ | d  k	 r| j	 d t
 j |	 d ƒ d | j ƒ n  ˆ Jn  ˆ	 j ƒ  d } | j d k r:| ‰ n. | j d k rUˆ j ‰ n t d | j ƒ ‚ ‡ f d †  ‰ ‡ f d †  } | j t } ˆ d IJˆ d Iˆ j ƒ  IJd t t | ƒ ƒ } ˆ d I| ˆ j IJˆ d I| | IJˆ d ˆ j t d | ƒ | t d ˆ j ƒ f IJˆ d | j ˆ f IJˆ d IJ| j ƒ  j d ˆ d d ƒ ˆ d | j IJˆ d  I| j IJˆ j j ‰ ˆ d! Iˆ IJˆ j ƒ  ˆ d  k	 rÝˆ d" ˆ d# ˆ ƒ t  k rÝd  Sn  ˆ r1ˆ j! ƒ  ‰ ˆ j j" ƒ  ‰ ˆ d  k	 st# ‚ t$ j% ƒ  ‰  t& j' dT ƒ g ‰
 n  ‡  ‡ ‡ ‡ ‡
 ‡ f d$ †  } | d% t  ƒ d } d  } ˆ j j( d  k	 r¿ˆ j j( j) d  k	 r¿d& | j* | j+ | j } t, t- | ƒ ƒ } n  xÎt. | j d ƒ D]¹} | j d k r
| j* | j+ k rþPn  | j* } n" | j* | | j* | j+ | j } ˆ j j( d  k	 r¾ˆ j j( j) d  k	 r¾ˆ j j( j) j/ d  k	 r¾| d k r¾| | r¾ˆ d' | | f IJˆ j j( j) j/ j0 d( ˆ j  ƒ  ƒ q¾n  | d) | ƒ ‰ ‡ ‡ ‡ ‡ f d* †  } | d k s | j d k r| d+ ƒ } n  xzt. | j ƒ D]i} | j1 d, k s:t# ‚ | j2 | j1 k sRt# ‚ ˆ j3 ƒ  ˆ | j1 k rˆ d- IJˆ j3 ƒ  ˆ | j2 k rÞˆ d. | j2 IJˆ d/ | | j2 IJˆ d0 | j IJˆ j ƒ  t4 d1 ƒ ‚ n  ˆ d2 | j1 IJˆ d3 | | j1 IJ| d4 ƒ } n  ˆ j3 ƒ  ˆ j5 ƒ  } } ˆ j6 d5 | ƒ | d% t7 ƒ ˆ j3 ƒ  ˆ j5 ƒ  } } | | k r|| | } n | | k r•| | } n d  } | j r·ˆ j8 d6 ˆ ƒ n  | d 7} |	 d  k	 rü| j	 d t
 j |	 | | ƒ d ˆ j  ƒ  ƒ n  ˆ j j9 } | rÇ| d k s%| d7 r\d8 } ˆ ˆ j  ƒ  ˆ	 ƒ }  ˆ | t: d9 | ƒ t: d: ˆ d; ˆ j3 ƒ  ƒ ƒ t: d< |  ƒ t: d< | j; ƒ  ƒ t: d< | j< ƒ  ƒ f IJt= | d= ƒ rÄ| | ƒ qÄq\n• | rêt  } ˆ j> d> | j? ƒ n  ˆ d? | ˆ ˆ j  ƒ  ˆ	 ƒ ˆ d; ˆ j3 ƒ  ƒ ˆ d; | | ƒ t: d@ dA dB | ƒ | j@ tA | | j? ƒ | jB f IJˆ j ƒ  ˆ d  k	 rˆ ƒ  t  k rˆd  SqqWqÓWˆ rõˆ dC IJˆ  j ƒ  j d ˆ d d ƒ ˆ dD IJˆ dE ItC dF ˆ
 d jD dG dH dI dU ƒ IJn  | jE d  k s	| jE d k rÊ	ˆ dL IJˆ j ƒ  d  ‡ ‡ ‡ ‡	 ‡ f dM † }! y ˆ jF dN | jE dO |! ƒ }" Wn tG k
 rx	d  SXˆ dP IJ|! ƒ  ˆ dQ I|" jH IJˆ dR I|" jI IJˆ dS I|" jJ IJˆ Jn  d  S(V   Ns!   Creating trajectory directory: %siÿÿÿÿ(   t   move_old_create_new_directoryt   path(   t   easy_picklet	   file_nameRp   t   objs   sites_%%0%dds   %di    R>   i   t	   cartesiant   constraineds*   Unknown temperature_degrees_of_freedom: %sc            s   t  d ˆ  d |  ƒ S(   Nt   doft   e(   R   (   R¡   (   t   temperature_dof(    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   e_as_t!  s    c            s   t  d ˆ  d |  ƒ S(   NR    t   t(   R   (   R¤   (   R¢   (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   t_as_e#  s    s   tardy dynamics:s     number of bodies:s   %%%dds     number of degrees of freedom:s              number of atoms * 3:s-                            ratio: %.3f = 1/%.2fi   s)     temperature degrees of freedom: %s (%d)s7     kinetic energy sensitivity to generalized velocities:Rk   Rl   s       s     time step: %7.5f pico secondss     velocity scaling:s$     suppressing allowed origin shifts:Ry   R{   c            s¥   ˆ s
 d  Sˆ j  d ˆ ƒ } | d  k	 r¡ t j | ƒ } t j ˆ j d | ƒ ƒ } | | } ˆ j d ˆ d | ƒ |  r¡ ˆ  j t | ƒ ƒ ˆ d c | 7<q¡ n  d  S(   Nt   number_of_sites_in_each_treet   translation_cartt   valuei    (   t   mean_linear_velocityR   R   t   colt)   subtract_continuous_allowed_origin_shiftst   subtract_from_linear_velocitiest   appendt   abs(   t   collect_statst   mlvt   mlv_perpt
   correction(   t)   allowed_origin_shift_velocity_correctionsR%   R/   R¦   t0   sum_of_allowed_origin_shift_velocity_correctionsRy   (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   suppress_allowed_origin_shiftsF  s     			
	R¯   i2   s0      update DEN eq distances at step %d, temp=%.1fR0   R¤   c            sA   ˆ j  d ˆ ƒ ˆ d |  ˆ  d ˆ j ƒ  ƒ f IJˆ j ƒ  t S(   Nt   e_kin_targets     %s temperature: %8.2f KR¡   (   t   reset_e_kint   e_kinR‹   RC   (   t   msg(   R£   R¶   R}   Ry   (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyR·   x  s
    
s
   new targetg      ð?s!     system temperature is too high:s&       excessive_temperature_factor: %.6gs'       excessive temperature limit: %.2f Ks        time_step_pico_seconds: %.6gsq   Excessive system temperature in torsion angle dynamics:
  Please try again with a smaller time_step_pico_seconds.s!        temperature_cap_factor: %.6gs        temperature cap: %.2f Kt	   resettingt   delta_tR¶   i   s5      step=%s temperature=%s rmsd=%s r_work=%s r_free=%ss   %5ds   %7.1fR¡   s   %6.4ft   __call__s—               coordinate                   fluctuations        gradient rms
    step      rmsd        temp        temp   e_total     geo %    7s   total
s;       %4d  %8.4f A  %8.2f K  %8.2f K  %s  %6.2f  %6.2f  %6.2ft   formats   %6.3fR¨   sA     allowed origin shift velocity corrections applied (magnitudes):s=     sum of allowed origin shift velocity corrections (vectors):s      t   valuest   fmts   %.5ft   bracketst   (t   )s#   tardy gradient-driven minimization:c            sR   ˆ d ˆ ˆ j  ƒ  ˆ ƒ IJˆ j ƒ  ˆ  d  k	 rN ˆ  ƒ  t k rN t ‚ qN n  d  S(   Ns     coor. rmsd: %8.4f(   RV   R‹   R   RE   t   StopIteration(   t	   minimizer(   R|   R}   R{   R”   Ry   (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   show_rmsØ  s    
 t   max_iterationst   callback_after_steps   After tardy minimization:s!     number of function evaluations:s     number of lbfgs steps:s     number of lbfgs restarts:(   i    i    i    (   RÁ   RÂ   (K   RV   t   assign_random_velocitiest   trajectory_directoryR   R
   t   libtbx.pathR™   t   libtbxR›   t   dumpt   opt   joinRp   R?   t   number_of_cooling_stepst   number_of_time_stepsR>   R@   t   temperature_degrees_of_freedomt   degrees_of_freedomt   RuntimeErrort   time_step_pico_secondsR   t   bodies_sizet   strt   maxt   min_max_meant   showt   velocity_scalingRr   R%   R‹   RE   R¦   R/   R    R   RK   R   Rª   R   RŒ   t   start_temperature_kelvint   final_temperature_kelvint   intt   roundt   xrangeR�   t   update_eq_distancest   temperature_cap_factort   excessive_temperature_factorR¸   R   t   e_tott   dynamics_stepRC   R·   R)   R	   t   r_workt   r_freet   hasattrt   writeR8   R7   t   getattrRT   t   numstrt   elemst   minimization_max_iterationsRR   RÃ   t   function_evaluations_totalt   lbfgs_steps_totalt   lbfgs_restarts(#   Ry   Rz   R{   R|   R}   Ru   R~   Rx   t   qd_e_kin_scalest   traj_dirR™   R›   t   traj_serial_fmtt   cartesian_dofR¥   t   time_step_akmaR¿   Rµ   t   n_time_stepst   den_update_intervalt   i_cool_stept   t_targetR·   t   show_column_headingst   i_time_stept   e_kin_beforet   e_tot_beforet   e_kin_aftert   e_tot_aftert   fluct_e_tott   grmst   fmtrt   rmsdRÅ   t   refinery(    (   R³   R%   R|   R/   R£   R¶   R}   R¦   R{   R”   R´   Ry   R¢   sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyR“   ú   s‚   			
			





				
	



	
	
 

		

	(#   t
   __future__R    t   mmtbx.dynamicsR   R   t   mmtbx.dynamics.constantsR   R   R   t   cctbx.geometry_restraintst   cctbx.array_familyR   t   scitbx.rigid_bodyRƒ   t   scitbx.graphR   R   t   libtbx.utilsR   t   libtbx.str_utilsR	   R
   RË   R   t   osRš   RÍ   t   master_phil_strt   objectR   RE   R   RC   R˜   R“   (    (    (    sD   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/refinement/tardy.pyt   <module>   s(   	8gN