ó
Ä™xTc           @   s%  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
 m 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 Z d  d l Z d
 d d d d „ Z d e f d „  ƒ  YZ e j j d ƒ Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   dynamics(   t   boltzmann_constant_akmat   akma_time_as_pico_seconds(   t   geometry_restraints(   t   xray(   t   flexN(   t   Sorry(   t   adopt_init_argsi    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(    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.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   conservative_pair_proxiest	   as_doublet   xt   scitbxt   lbfgst   runt   termination_parameterst   exception_handling_parameterst   Truet	   minimizert   cleart   extendR   R	   (   t   selfR%   t
   sites_cartR    (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyt   __init__+   s    		
c      	   C   s—   t  j |  j ƒ } d } t  j | j ƒ  d ƒ } xT |  j j |  j j g D]: } | d  k ra qI n  | t j	 d | d | d | ƒ 7} qI W| | j
 ƒ  f S(   Ni    R2   t   sorted_asu_proxiest   gradient_array(   i    i    i    (   R   R	   R'   R   R%   t   bondt   angleR   R   t   bond_residual_sumR&   (   R1   R2   t   ft   gR4   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyt    compute_functional_and_gradients<   s     (   t   __name__t
   __module__R3   R;   (    (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyR   )   s   	së     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
t   cartesian_dynamicsc           B   s³   e  Z d  e d d d d d d d d d d d d e e e d d d d d „ Z d „  Z 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   g        iÿÿÿÿc         C   s  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 ‚ t
 j d |  j j ƒ  d t ƒ |  j j ƒ  |  _ t |  _ d |  _ t |  _ |  j j ƒ  |  _ | d  k rt j |  j j ƒ  d	 ƒ |  _ n	 | |  _ |  j d  k	 rO|  j j d  k	 rO|  j j |  _ n  |  j d  k	 ryd |  j _ d |  j _ n  |  j  d  k	 r?|  j d  k r¬|  j  j! ƒ  |  _" n3 |  j  |  _" |  j j# d  k	 rß|  j j# |  j" _$ n  |  j" j% ƒ  |  _% |  j& d  k	 st ‚ |  j' d  k	 st ‚ |  j( d  k r?|  j) ƒ  |  _( q?n  |  j* } | d  k	 o`| j+ d k |  _, |  j, rÓ| j- d k s„t ‚ |  j | j- 9_ d | j. k r¾t/ d | j0 ƒ  ƒ ‚ n  d | j. k |  _1 n	 t2 |  _1 |  j |  j |  _3 t2 |  _4 |  ƒ  d  S(
   Ni    g        i   t
   scattererst   sitet   bondss?   Invalid choice: %s.restraints: "bonds" must always be included.t   angles(   i    i    i    (5   R   t   localst   n_printR   t   temperaturet   n_stepst	   time_stept   logR   t   verboseR   t   set_scatterer_grad_flagst	   structureR?   R-   t   deep_copy_scattererst   structure_startR   t   k_boltzt   ekcmR   t   timfact   atomic_weightst   weightsR   R	   R   t   vxyzt   er_datat
   velocitiest   geo_grad_rmst   xray_grad_rmst   fmodelt	   deep_copyt   fmodel_copyt   fix_scale_factort   set_scale_switcht   target_functort   chem_target_weightt   xray_target_weightt   xray_gradientt
   xray_gradst   interleaved_minimization_paramst   number_of_iterationst   interleaved_minimization_flagt   time_step_factort
   restraintsR   t   __phil_path__t   interleaved_minimization_anglest   Falset   tstept   show_gradient_rms(   R1   RK   t   restraints_managerRE   t   protein_thermostatRF   RG   t    initial_velocities_zero_fractionRS   Rb   RD   RX   R_   R^   t   shift_updatet   xray_structure_last_updatedR`   t   reset_velocitiest   stop_cm_motiont   update_f_calcRT   RH   t   stop_at_diffRI   t   imp(    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyR3   Y   s^    $			!					c         C   s3  |  j  ƒ  |  j r* |  j ƒ  |  j  ƒ  n  |  j j |  j j ƒ |  _ |  j j |  j j ƒ |  _	 |  j j |  j j ƒ |  _
 |  j j |  j j ƒ |  _ t j |  j |  j	 ƒ |  _ t j |  j
 |  j ƒ |  _ t j |  j |  j ƒ |  _ |  j rÿ |  j ƒ  n  |  j ƒ  |  j ƒ  |  j d k r/|  j ƒ  n  d  S(   Ng      ð?(   t   center_of_mass_infoRq   t   set_velocitiesRS   t   selectRT   t   solvent_selt   non_solvent_vxyzRR   t   non_solvent_weightst   solvent_vxyzt   solvent_weightsR   t   kinetic_energy_and_temperaturet   non_solvent_ktt
   solvent_ktR   Rr   t   stop_global_motiont   velocity_rescalingt   verlet_leapfrog_integrationRI   t   print_detailed_dynamics_stats(   R1   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyt   __call__«   s"    
	
	

c      
   C   si   |  j  j ƒ  |  j d  k	 r+ |  j j } n d  } |  j  j t d |  j d |  j d |  j	 d | ƒ ƒ d  S(   NR   R   R   R   (
   RS   R/   RT   R   R   R0   R   RR   RE   Rn   (   R1   R   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyRw   Ã   s    			c      	   C   s  |  j  j d |  j j ƒ  d t ƒ |  _ |  j d  k	 rÉ |  j j d  k	 rÉ |  j  j	 j
 d |  j j ƒ  d |  j j d |  j j d |  j j ƒ } |  j j j ƒ  | j ƒ  k s± t ‚ |  j j | 7_ qÉ n  |  j j } d  } |  j d  k	 r/|  j d k r/t j |  j j |  j ƒ j ƒ  ƒ } t j | ƒ } n  |  j d  k	 r³| d  k	 r€| |  j k r�|  j j ƒ  |  _ |  j ƒ  |  _ q�n |  j ƒ  |  _ |  j |  j |  j j |  j } n  d } |  j d  k	 rØ| |  j 9} n  |  j j d  k	 rý| |  j j 9} n  | d k r| d | 9} n  |  j d  k	 rÿ|  j | |  _ |  j | |  _ |  j j |  j |  _  |  j |  j |  _! |  j  j" |  j j# ƒ } |  j! j" |  j j# ƒ } |  j j$ t j% | j& ƒ  ƒ d |  j' 7_$ |  j j( t j% | j& ƒ  ƒ d |  j' 7_( n  | S(	   NR2   t   compute_gradientst   ta_harmonic_restraint_infot   weightt   slacki    g      ð?g      à?()   Rl   t   energies_sitesRK   R2   R-   t   stereochemistry_residualsRT   R   t   er_harmonic_restraints_infot   geometryt   ta_harmonic_restraintst   er_harmonic_restraints_weightt   er_harmonic_restraints_slackt	   gradientsR   R   Rp   Ro   R   t   sqrtt   difference_vectors_cartt   dott   maxRX   RL   Ra   R`   R_   R^   t   normalization_factort   wct   wxt   ggt   xgRx   Ry   RV   t   mean_sqR&   RF   RW   (   R1   t   harmonic_gradsR   t   d_maxt$   array_of_distances_between_each_atomt   factort   gg_prot   xg_pro(    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyt   accelerationsÎ   sV    $,/c         C   sV   |  j  j d |  j d |  j d t ƒ |  j d t ƒ j d t ƒ } t j	 | j
 ƒ  ƒ S(   Nt   xray_structureRs   t   update_f_maskR†   R@   (   RZ   t   update_xray_structureRK   Rs   Ri   R]   R-   t   gradients_wrt_atomic_parametersR   R	   t   packed(   R1   t   sf(    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyRa     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(   RK   t   center_of_masst   rcmR   Rv   R2   RS   RR   R   R	   t   vcmt   acmR   RO   (   R1   R   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyRv     s    c         C   sW   |  j  j ƒ  |  _ t j |  j |  j d |  j d |  j  j ƒ  |  j |  j	 ƒ |  _ d  S(   Ni    (
   RK   R©   Rª   R   t   stop_center_of_mass_motionR¬   R«   R2   RS   RR   (   R1   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyR�     s    

c         C   sÞ   |  j  rX |  j d  k	 rX |  j j d k r6 d |  _ q• t j |  j |  j j ƒ |  _ n= |  j j d k rv d |  _ n t j |  j |  j j ƒ |  _ |  j	 d |  j |  _
 t j |  j
 |  j ƒ |  _ |  j	 |  j |  _	 d  S(   Ng»½×Ùß|Û=g      ð?(   Rm   RT   R   R   RE   t   v_factort   mathR’   R   RS   t   vyz_vscale_removeR   R~   RR   t   kt_vscale_remove(   R1   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyR‚   '  s    "c         C   s³   |  j  j } | j d  k	 s! t ‚ t | j ƒ d k s< t ‚ |  j j d | j d d |  j ƒ } |  j j	 ƒ  } t
 d | d | d |  j j ƒ |  j j d | ƒ |  j j ƒ  d  S(   Ni    t   bond_sym_tablet   conserve_anglesR2   R%   R    (   Rl   R�   t   shell_sym_tablesR   R   t   lenRK   R%   Rh   R2   R   Rb   Rc   t   set_sites_cartt   apply_symmetry_sites(   R1   t   geo_managerR%   R2   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyt   interleaved_minimization7  s    c         C   s   x™t  d |  j d d ƒ D]~|  _ |  j d  k	 ri t j |  j j d |  j	 ƒ ƒ } | |  j k ri d  Sn  |  j
 ƒ  } |  j r• |  j ƒ  |  j ƒ  n  t j |  j |  j | |  j ƒ |  j j |  j j ƒ |  _ |  j j |  j j ƒ |  _ |  j j |  j j ƒ |  _ |  j j |  j j ƒ |  _ t j |  j |  j ƒ |  _ t j |  j |  j ƒ |  _ t j |  j |  j ƒ |  _ |  j d  k	 r�|  j ƒ  n  |  j ƒ  |  j  d k r|  j! d I|  j" IJt j# |  j j$ ƒ  ƒ |  _% |  j! d IJ|  j% j& ƒ  j' d |  j! ƒ n  |  j	 j( d |  j	 j) ƒ  |  j |  j ƒ |  j	 j* ƒ  |  j+ rR|  j, ƒ  n  t j |  j |  j ƒ |  _ |  j d  k r‰|  j
 ƒ  q |  j |  j _- q Wd  S(   Ni   t   otherg      ð?s   Scale factor : s   vxyz_length_sq pst scalet   outR2   (.   t   rangeRF   t   cycleRt   R   R   t   meanRM   t	   distancesRK   R¢   Rr   Rv   R�   R   t   vxyz_at_t_plus_dt_over_2RS   RR   Rj   Rx   RT   Ry   Rz   R{   R|   R}   R~   R   R   R€   t   store_temperaturesR‚   RI   RH   R®   R’   R”   t   vxyz_length_sqt   min_max_meant   showR¶   R2   R·   Rd   R¹   RU   (   R1   t   diffR¢   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyRƒ   F  sF    #! 	

	c         C   s—   |  j  d k r6 d |  j _ d |  j _ d |  j _ n  |  j j |  j j |  j 7_ |  j j |  j j |  j 7_ |  j j |  j	 j |  j 7_ d  S(   Ni   i    (
   R½   RT   t   non_solvent_tempt   solvent_tempt   system_tempR   RE   RF   R€   R   (   R1   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyRÁ   s  s    c         C   sj  |  j  d IJ|  j  d IJ|  j  d IJ|  j  d j |  j j |  j j |  j j |  j j |  j |  j	 j |  j j
 |  j j |  j |  j d t ƒ j ƒ  |  j j ƒ  j ƒ  j ƒ  ƒ
 IJ|  j  d IJd |  j |  j j ƒ  |  _ |  j |  j |  _ |  j j |  j |  _ d d  d d	 „ } xKd
 d d g D]:} |  j  d IJ| d
 k rV|  j j } n8 | d k rr|  j j  } n | d k r�|  j j  } n PxÑ d d d g D]À } | d k rÅ|  j j! | ƒ } na | d k rõt" j# |  j j! | ƒ j ƒ  ƒ } n1 | d k r%t" j# |  j j! | ƒ j ƒ  ƒ } n P| d | d |  j  d t$ |  j j ƒ d | d | ƒ qžWq(Wd  S(   Ns   
sO            MC |    Temperature (K)   |   Vscale   | Etot = Ekin + Echem + wxExraysM               |  (sys)  (pro)  (sol) |  Fac  T(K) |   Ekin  Echem     wx  Exraysc     ~E~ {0:5d} | {1:6.1f} {2:6.1f} {3:6.1f} | {4:4.1f} {5:5.1f} | {6:6.1f} {7:6.1f} {8:6.1f} {9:6.1f}R†   g      à?i2   t    c   
      S   s?  | d  k r t j } n  | d | IJt j j |  ƒ } | d | j IJ| d | j IJ| d | j IJ| d | j	 IJ| d | j
 IJ| d | j IJ| d | j IJt j d	 |  d
 | ƒ } | j ƒ  } x[ t | j ƒ  ƒ D]G \ } } | j ƒ  | j ƒ  | d }	 | d | |	 | f IJ|	 } qæ W| j ƒ  | S(   Ns   
s   
  Number  : %7.4f s     Min     : %7.4f s     Max     : %7.4f s     Mean    : %7.4f s     Stdev   : %7.4f s     Skew    : %7.4f s     Sum     : %7.4f t   datat   n_slotsi   s   %7.3f - %7.3f: %d(   R   t   syst   stdoutR(   R¯   t   basic_statisticst   nt   minR•   R¾   t   biased_standard_deviationt   skewt   sumR   t	   histogramt   data_mint	   enumeratet   slotst
   slot_widtht   flush(
   RÊ   RË   R»   t   prefixt   data_basic_statsRÔ   t
   low_cutoffR   RÏ   t   high_cutoff(    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyt   show_histogram˜  s(     	

t   Systemt   Non_solventt   Solvents   

t   Kinetic_energyt	   Xray_gradt	   Chem_gradRÊ   R»   RÚ   t   _(%   RH   t   formatRT   t   macro_cycleR   RE   R   R€   R®   R±   t   kinetic_energyR‹   t   residual_sumR_   R]   Ri   t   target_workRZ   t   f_calc_wRÊ   R   RR   RS   R”   t	   atomic_keR`   t   atomic_wxray_gR‘   R^   t   atomic_wchem_gR   t   all_selRy   Rx   R   R’   t   str(   R1   RÞ   t   selection_typet	   selectiont   histogram_typeRÊ   (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyR„   }  sR    							4$$	N(   R<   R=   Ri   R   R-   R3   R…   Rw   R¢   Ra   Rv   R�   R‚   R¹   Rƒ   RÁ   R„   (    (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyR>   X   s@   ;			9				
			-	
(    t
   __future__R    t   mmtbxR   t   mmtbx.dynamics.constantsR   R   t   cctbxR   R   t   cctbx.array_familyR   t   scitbx.lbfgsR(   t   scitbx.matht   libtbx.utilsR   t   libtbxR   R   R¯   RÌ   t
   iotbx.philt   iotbxR   R   t   objectR   t   philt   parset   master_paramsR>   (    (    (    sH   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/dynamics/ensemble_cd.pyt   <module>   s*    		