ó
Ã™xTc           @   sK  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	 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 Z d  d l m Z d	 d d d d
 „ Z d e f d „  ƒ  YZ e j j d ƒ Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   dynamics(   t   boltzmann_constant_akmat   akma_time_as_pico_seconds(   t   xray(   t   flexN(   t   adopt_init_args(   t   maptbxi    c         C   s  t  j ƒ  } | j |  j ƒ  ƒ | d  k	 r; t j | ƒ n  | d  k rS t j } n  | d  k rk t j } n  t | } x‹ |  D]ƒ } | d k s” t	 ‚ | d k s¯ | ƒ  | k ré | | d }	 | j
 g  d D] }
 | d |	 ƒ ^ qÊ ƒ q| | j
 d d d g ƒ q| W| S(   Ni    g      à?i   i   i   (   i   i   i   (   R   t   vec3_doublet   reservet   sizet   Nonet   randomt   seedt   gaussR   t   AssertionErrort   append(   t   massest   target_temperaturet   zero_fractiont   random_gausst   random_randomR   t   resultt   ktt   masst   sigmat   i(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyt   random_velocities   s       
,t   interleaved_lbfgs_minimizationc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s�   | |  _  | j ƒ  |  _ t j j d |  d t j j d | ƒ d t j j d t d t d t ƒ ƒ |  _	 | j
 ƒ  | j t j |  j ƒ ƒ d  S(   Nt   target_evaluatort   termination_paramst   max_iterationst   exception_handling_paramst)   ignore_line_search_failed_rounding_errorst-   ignore_line_search_failed_step_at_lower_boundt    ignore_line_search_failed_maxfev(   t   restraints_managert	   as_doublet   xt   scitbxt   lbfgst   runt   termination_parameterst   exception_handling_parameterst   Truet	   minimizert   cleart   extendR   R   (   t   selfR$   t
   sites_cartR   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyt   __init__)   s    		
c         C   sO   t  j |  j ƒ } |  j j d | d t ƒ } | j } | j } | | j ƒ  f S(   NR1   t   compute_gradients(	   R   R   R&   R$   t   energies_sitesR,   t   targett	   gradientsR%   (   R0   R1   t   tmpt   ft   g(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyt    compute_functional_and_gradients:   s    			(   t   __name__t
   __module__R2   R:   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR   '   s   	sZ    temperature = 300
    .type = int
  number_of_steps = 200
    .type = int
  time_step = 0.0005
    .type = float
  initial_velocities_zero_fraction = 0
    .type = float
  n_print = 100
    .type = int
  verbose = -1
    .type = int
  random_seed = None
    .type = int
  n_collect = 10
    .type = int
  stop_cm_motion = True
    .type = bool
t(   gradients_calculator_geometry_restraintsc           B   s    e  Z d d  „ Z e d „ Z RS(   c         C   s   t  |  t ƒ  ƒ d |  _ d  S(   Ni    (   i    i    (   R   t   localst   gc(   R0   R$   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR2   X   s    c         C   sv   d } | j  ƒ  } |  j j d | d t ƒ } | j d  k	 rL | | j 9} n  | j } | d k rr | d | 9} n  | S(   Ng      ð?R1   R3   (   R1   R$   R4   R,   t   normalization_factorR   R6   (   R0   t   xray_structuret   force_update_maskt   factorR1   t   cR   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR6   \   s    	 	 N(   R;   R<   R   R2   t   FalseR6   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR=   W   s   t%   gradients_calculator_reciprocal_spacec           B   s/   e  Z d d d d d d  d „ Z e d „ Z RS(   i    c         C   sê   t  |  t ƒ  ƒ |  j |  j g j d  ƒ d k s7 t ‚ |  j |  j g j d  ƒ d k s^ t ‚ d \ |  _	 |  _
 |  j d  k	 ræ |  j j ƒ  |  _ t j d |  j j j ƒ  d t ƒ t j |  j d t ƒ j d t ƒ j ƒ  ƒ |  _	 n  d  S(	   Ni    i   t
   scattererst   siteR3   (   i    i   (   i    i   (   i    i    (   R   R>   t   fmodelt   wxt   countR   R   R$   t   wct   gxR?   t   target_functort   x_target_functorR   t   set_scatterer_grad_flagsRA   RG   R,   R   R   t   gradients_wrt_atomic_parameterst   packed(   R0   R$   RI   R1   RJ   RL   t   update_gradient_threshold(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR2   j   s    ''	c   	      C   s¢  d } | j  ƒ  } |  j d  k	 r³ t j t j |  j  | j ƒ  ƒ ƒ } | |  j k r³ |  j j d | d t	 d t
 ƒ t j |  j d t	 ƒ j d t	 ƒ j ƒ  ƒ |  _ | |  _  q³ n  |  j d  k	 r|  j j d | d t	 ƒ } | j |  _ | |  j 9} | j d  k	 r| | j 9} qn  d  } |  j d  k	 r@|  j |  j } n  |  j d  k	 r�|  j |  j } | d  k rt| } q�| | } n  | d k rž| d | 9} n  | S(   Ng      ð?RA   t   update_f_calct   update_f_maskR3   RH   R1   (   R1   RI   R   R   t   maxt   sqrtt   dotRS   t   update_xray_structureR,   RE   R   RO   RQ   RR   RM   R$   R4   R6   R?   RL   R@   RJ   (	   R0   RA   RB   RC   R1   t	   max_shiftRD   R   t   gcw(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR6   }   s<    %	  	 N(   R;   R<   R   R2   RE   R6   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyRF   i   s   t&   gradients_calculator_real_space_simplec        	   B   s>   e  Z d d d d d d d d d „ Z d „  Z e d „ Z RS(   g      ð?i   i    c	   	      C   s•   t  |  t ƒ  ƒ |  j |  j g j d  ƒ d k s7 t ‚ |  j |  j g j d  ƒ d k s^ t ‚ d \ |  _	 |  _
 |  j d  k	 r‘ |  j ƒ  |  _	 n  d  S(   Ni    i   (   i    i   (   i    i   (   i    i    (   R   R>   t
   target_mapRJ   RK   R   R   R$   RL   RM   R?   t   _compute_gradients(	   R0   R$   t   real_space_gradients_deltat	   unit_cellR]   R1   RJ   RL   RS   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR2   œ   s    	''c         C   sM   d t  j d |  j d |  j d |  j d |  j d t j |  j j ƒ  t	 ƒ ƒ S(   Ng      ð¿R`   t   density_mapR1   t   deltat	   selection(
   R   t   real_space_gradients_simpleR`   R]   R1   R_   R   t   boolR
   R,   (   R0   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR^   ¬   s    				c   	      C   sb  d } | j  ƒ  } |  j d  k	 rs t j t j |  j  | j ƒ  ƒ ƒ } | |  j k rs | |  _  |  j ƒ  |  _	 qs n  |  j
 d  k	 rØ |  j
 j d | d t ƒ } | j |  _ | |  j 9} | j d  k	 rØ | | j 9} qØ n  d  } |  j d  k	 r |  j |  j	 } n  |  j d  k	 rA|  j |  j } | d  k r4| } qA| | } n  | d k r^| d | 9} n  | S(   Ng      ð?R1   R3   (   R1   R]   R   R   RV   RW   RX   RS   R^   RM   R$   R4   R,   R6   R?   RL   R@   RJ   (	   R0   RA   RB   RC   R1   RZ   RD   R   R[   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR6   ´   s2    %		  	 Ng      Ð?(   R;   R<   R   R2   R^   RE   R6   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR\   ›   s   	R)   c           B   s�   e  Z d  d d d d d d e e e d d d d d d „ Z d „  Z d	 „  Z d
 „  Z d „  Z	 d „  Z
 d „  Z d „  Z d „  Z d „  Z RS(   i,  iÈ   gü©ñÒMb@?i    i   i
   iÿÿÿÿc         C   sU  t  |  t ƒ  ƒ |  j d k s% t ‚ |  j d k s: t ‚ |  j d k sO t ‚ |  j d k sd t ‚ |  j d  k	 sˆ |  j	 d k  sˆ t ‚ |  j
 j ƒ  |  _ |  j d  k	 rÂ |  j j d |  j ƒ n  t |  _ d |  _ d |  _ d |  _ t |  _ |  j
 j ƒ  |  _ | d  k r.t j |  j j ƒ  d ƒ |  _ n	 | |  _ |  j |  j |  _ |  ƒ  d  S(   Ni    g        i   R1   (   i    i    i    (   R   R>   t   n_printR   t   temperaturet   n_stepst	   time_stept   logR   t   verboseRA   R1   t   sites_cart_startt   states_collectort   addR   t   k_boltzt   current_temperaturet   ekint   ekcmR   t   timfact   atomic_weightsR   R   R
   t   vxyzt   tstep(   R0   RA   t   gradients_calculatorRg   Rh   Ri   t    initial_velocities_zero_fractionRu   Rf   t	   n_collectt   interleaved_minimizationt   reset_velocitiest   stop_cm_motionRj   t   stop_at_difft   random_seedRm   Rk   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR2   Î   s(    $					!	c         C   s/  |  j  ƒ  t j |  j |  j ƒ } | j |  _ | j |  _ |  j	 d k r\ |  j
 d d ƒ n  |  j rÎ |  j ƒ  |  j  ƒ  t j |  j |  j ƒ } | j |  _ | j |  _ |  j	 d k rÎ |  j
 d d ƒ qÎ n  |  j rä |  j ƒ  n  |  j  ƒ  t j |  j |  j ƒ } | j |  _ | j |  _ |  j	 d k r@|  j
 d d ƒ n  |  j ƒ  |  j  ƒ  t j |  j |  j ƒ } | j |  _ | j |  _ |  j	 d k r¦|  j
 d d ƒ n  |  j	 d k rÅ|  j d IJn  |  j ƒ  |  j  ƒ  t j |  j |  j ƒ } | j |  _ | j |  _ |  j	 d k r+|  j
 d d ƒ n  d  S(	   Ni   t   texts   restrained dynamics starts   set velocitiess   center of mass motion removeds   velocities rescaleds   integration startss   after final integration step(   t   center_of_mass_infoR   t   kinetic_energy_and_temperatureRu   Rt   Rg   Rp   t   kinetic_energyRq   Rk   t   print_dynamics_statR{   t   set_velocitiesR|   t   stop_global_motiont   velocity_rescalingRj   t   verlet_leapfrog_integration(   R0   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyt   __call__÷   sL    
	

	




c         C   sa   |  j  j j } |  j j ƒ  } t d |  j  j d | d d ƒ |  j j d | ƒ |  j j ƒ  d  S(   NR$   R1   R   i   (   Rw   R$   t   geometryRA   R1   R   t   set_sites_cartt   apply_symmetry_sites(   R0   t   geo_managerR1   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyt   run_interleaved_minimization"  s    c      
   C   sH   |  j  j ƒ  |  j  j t d |  j d |  j d |  j d |  j ƒ ƒ d  S(   NR   R   R   R   (   Ru   R.   R/   R   Rt   Rg   Rx   R~   (   R0   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR„   ,  s    			c         C   s   |  j  j d |  j ƒ S(   NRA   (   Rw   R6   RA   (   R0   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyt   accelerations4  s    c         C   s™   |  j  j ƒ  |  _ t j |  j |  j  j ƒ  |  j |  j ƒ } t j	 ƒ  |  _
 t j	 ƒ  |  _ |  j
 j | j
 ƒ  ƒ |  j j | j ƒ  ƒ | j ƒ  |  _ d  S(   N(   RA   t   center_of_masst   rcmR   R€   R1   Ru   Rt   R   R   t   vcmt   acmR   Rr   (   R0   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR€   7  s    c         C   sW   |  j  j ƒ  |  _ t j |  j |  j d |  j d |  j  j ƒ  |  j |  j	 ƒ |  _ d  S(   Ni    (
   RA   R�   R�   R   t   stop_center_of_mass_motionR’   R‘   R1   Ru   Rt   (   R0   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR…   D  s    

c         C   sE   |  j  d k r d } n t j |  j |  j  ƒ } |  j | |  _ d  S(   Ng»½×Ùß|Û=g      ð?(   Rp   t   mathRW   Rg   Ru   (   R0   RC   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR†   N  s    	c   
      C   sR  xKt  d |  j d d ƒ D]0} d  } |  j |  j g j d  ƒ d k rY |  j j ƒ  } n  |  j d  k	 r£ t j	 t j
 |  j | j ƒ  ƒ ƒ } | |  j k r£ d  Sn  |  j ƒ  } d } t j t | ƒ |  j ƒ d } | d k sü | d k sü | |  j k r|  j d k rd } n  |  j d  k	 rƒt j t | ƒ |  j ƒ d } | d k sj| d k sj| |  j k rƒ|  j j d | ƒ qƒn  | d k rãd | } |  j ƒ  t j |  j |  j ƒ }	 |	 j |  _ |	 j |  _ |  j | ƒ n  |  j r|  j ƒ  |  j  ƒ  n  t j! |  j |  j | |  j" ƒ t j |  j |  j ƒ }	 |	 j |  _ |	 j |  _ |  j# ƒ  | d k rˆd rˆ|  j ƒ  |  j | ƒ n  |  j j$ d |  j j ƒ  |  j |  j" ƒ |  j j% ƒ  |  j& rä| |  j k rä|  j' ƒ  n  t j |  j |  j ƒ }	 |	 j |  _ |	 j |  _ | d k r@d r@|  j ƒ  |  j | ƒ n  |  j ƒ  q Wd  S(   Ni   i   i    R1   s   integration step number = %5d((   t   rangeRh   R   R}   Rm   RK   RA   R1   R   t   meanRW   Rl   RX   RŽ   R”   t   modft   floatRf   Rk   Ry   Rn   R€   R   R�   Ru   Rt   Rg   Rp   R‚   Rq   Rƒ   R|   R…   t   vxyz_at_t_plus_dt_over_2Rv   R†   RŠ   R‹   Rz   R�   (
   R0   t   cycleR1   t   distRŽ   t
   print_flagt   switcht   switch2R   R   (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR‡   U  s`     !%  6	 '

	



c         C   sb  t  } t d | d ƒ } d | d } |  j d | d | d IJ|  j d |  j IJ|  j d |  j |  j d |  j d |  j d	 f IJ|  j d
 |  j |  j d d | |  j d d | |  j d d	 | f IJ|  j d |  j |  j	 d d | |  j	 d d | |  j	 d d	 | f IJ|  j d |  j
 |  j f IJ|  j d d d d IJd  S(   Ns   | t   |iP   i   t   -sK   | kin.energy = %10.3f            | information about center of free masses|sD   | start temperature = %7.3f        | position=%8.3f%8.3f%8.3f      |i    i   sD   | curr. temperature = %7.3f        | velocity=%8.4f%8.4f%8.4f      |sB   | number of integration steps = %4d | ang.mom.=%10.2f%10.2f%10.2f|sK   | time step = %6.4f                 | kin.ener.=%8.3f                     |iM   (   R   t   lenRj   Rq   Rg   R�   Rp   R‘   Rh   R’   Ri   Rr   (   R0   R   Rs   t   line_lent   fill_len(    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyRƒ   ‹  s"    


+
=
=
N(   R;   R<   R   RE   R,   R2   Rˆ   R�   R„   RŽ   R€   R…   R†   R‡   Rƒ   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyR)   Í   s0   	+	
				
		6(    t
   __future__R    t   mmtbxR   t   mmtbx.dynamics.constantsR   R   t   cctbxR   t   cctbx.array_familyR   t   scitbx.lbfgsR'   t   libtbxR   R   t   timeR”   t
   iotbx.philt   iotbxR   R   R   t   objectR   t   philt   parset   master_paramsR=   RF   R\   R)   (    (    (    sO   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/cartesian_dynamics.pyt   <module>   s,   		22