ó
,™xTc           @   sœ  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	 Z 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 m Z d  d l Z e j d ƒ d e f d „  ƒ  YZ e d d ƒ Z e d d ƒ Z e d d ƒ Z d „  Z d „  Z d e f d „  ƒ  YZ d „  Z d d d „  ƒ  YZ  d e f d „  ƒ  YZ! d e f d „  ƒ  YZ" d S(    iÿÿÿÿ(   t   division(   t   geometry_restraintsN(   t   xray(   t   crystal(   t   sgtbx(   t   flex(   t   matrix(   t   format_value(   t   counti    t   restraint_parametersc           B   s   e  Z d  „  Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   distance_idealt   weight(   t   selfR
   R   (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyt   __init__   s    	(   t   __name__t
   __module__R   (    (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyR	      s   gÃõ(\�Âù?g       @g’we@g=
×£p=Ú?g=ð1X‘@g´Yõ¹ÚŠÍ?c         C   s„  |  j  ƒ  } t j | j ƒ  ƒ } x\t | ƒ D]N\ } } x?| j ƒ  D]1} | | g } | j ƒ  g  | D] } | | j ^ qj }	 |	 j ƒ  |	 d d g k r¨ t }
 nB |	 d d g k rÃ t	 }
 n' |	 d d g k rÞ t
 }
 n t d ƒ ‚ | | j | ƒ s&t j d |
 j d |
 j ƒ | | | <qG | | | } t | j |
 j ƒ d k  sVt ‚ t | j |
 j ƒ d k  sG t ‚ qG Wq. W| S(   Nt   Sit   Os   Unknown scattering type pair.R
   R   g:Œ0âŽyE>(   t
   scatterersR   t   bond_params_tablet   sizet	   enumeratet   keyst   sortt   scattering_typet   restraint_parameters_si_o_sit   restraint_parameters_si_ot   restraint_parameters_o_si_ot   AssertionErrort   has_keyt   bond_paramsR
   R   t   abs(   t	   structuret   bond_sym_tableR   t   tt   i_seqt   bond_sym_dictt   j_seqt   i_seqst   it   scattering_typest   paramst   prev_params(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyt   setup_bond_params_table   s.    
 
					"*c          C   sR   t  j ƒ  }  |  j } d | j d ƒ d <d | j d ƒ d <d | j d ƒ d <|  S(   NgÍÌÌÌÌÌ@R   g      ø?R   g       @(   R   t   nonbonded_paramst   distance_tablet
   setdefault(   t   pt   d(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyt   setup_nonbonded_params9   s    	t
   add_oxygenc           B   s   e  Z d  „  Z RS(   c      	   C   s�  | j  ƒ  |  _ t j | j ƒ  ƒ } | j ƒ  } t d ƒ } x,t | ƒ D]\ } } t j	 | | ƒ } xü | j
 ƒ  D]î \ }	 }
 |	 | k s“ t ‚ xÍ |
 D]Å } t j	 | | |	 ƒ } | | d } |  j j ƒ  j ƒ  } |  j j t j d d | j ƒ  d | ƒ ƒ | | j | ƒ j t j d d ƒ ƒ | |	 j | ƒ j | j ƒ  ƒ | j t j ƒ  ƒ qš Wqu WqI W| j d |  j j ƒ  ƒ |  _ d  S(   Ni   i   t   labels   O%dt   sitet   site_symmetry_table(   t   deep_copy_scatterersR    R   t   pair_sym_tableR   t
   sites_fracR   R   t   mxt   colt   itemsR   R   t   add_scattererR   t	   scatterert   nextR.   t   appendR   t   rt_mxt   inverse_cancelt   pair_sym_dictt   tidyR5   R!   (   R   t   si_structuret   si_si_sym_tableR!   R8   t   i_oxygenR#   RB   t   site_frac_iR%   t   sym_opst   rt_mx_jit   site_frac_jit   bond_centert   i_seq_o(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyR   C   s,    
	(   R   R   R   (    (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyR2   A   s   c         C   sÁ  |  j  ƒ  } | j d |  j ƒ  ƒ } t j | j ƒ  ƒ } xot | ƒ D]a\ } } | | j d k rk qF n  g  } xW | j ƒ  D]I \ } }	 | | j d k r£ q~ n  x! |	 D] }
 | j	 | |
 f ƒ qª Wq~ WxÙ t
 d t | ƒ d ƒ D]¾ } | | } | d } | d j ƒ  } x‘ t
 | d t | ƒ ƒ D]v } | | } | d } | j | d ƒ } | | k r| | j | ƒ j	 | ƒ q)| | j | ƒ j	 | j ƒ  ƒ q)Wqå WqF W| j d |  j ƒ  ƒ S(   NR5   R   R   i    i   (   R   t   full_connectivityR5   R   R7   R   R   R   R;   R?   t   xranget   lent   inverset   multiplyR.   RC   (   t   si_o_structuret   si_o_bond_sym_tableR   t   si_o_full_sym_tablet   o_si_o_sym_tableR#   RB   t   jr_listR%   RH   RI   t   i_jj1t   jr1t   rt_mx_jr1_invt   i_jj2t   jr2t
   rt_mx_jr21(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyt   make_o_si_o_sym_table[   s4    	   

 

,	t$   distance_and_repulsion_least_squaresc           B   s/   e  Z d d  d d d  d d d d e d „
 Z RS(   i   t   gaussiang      ð?i   i
   c   1         s—  | dB k s t  ‚ | d k s$ t  ‚ | d k s6 t  ‚ |	 d k sH t  ‚ ˆ d  k r` t j ‰ n  ˆ j d ˆ ƒ j d ˆ ƒ ˆ Jˆ j ƒ  ‡  ‡ ‡ ‡ f d †  } | ƒ  \ } } ˆ j ƒ  t d ˆ d | ƒ } | j j d ˆ ƒ j d ˆ ƒ | j j	 ƒ  } ˆ Jˆ j ƒ  | j j
 d	 | j d
 ˆ ƒ } | j ƒ  } | j ƒ  } | |  j | ƒ s[t  ‚ | | j d ƒ | | k s~t  ‚ ˆ Jˆ j ƒ  t d | j d | j ƒ } | j j
 d	 | d
 ˆ ƒ } | |  j d ƒ sÛt  ‚ | j d ƒ | k r| | j d ƒ st  ‚ n  ˆ Jˆ j ƒ  t j j d | j j d | ƒ d | d d ƒ } | d j d | ƒ | d j d | ƒ g  | D] } | j d | ƒ ^ qy} t d | j d | d ƒ } t ƒ  } t j ƒ  } x' | j j ƒ  D] } | j | j ƒ qØW| d k r4t j d | j d | ƒ ƒ } | d  k rmd } qmn9 | d k rat j  d | j d | ƒ ƒ } n t j! ƒ  } t j" j" d | j d | d | d | d | d | d | d  | d! | d" d# ƒ 
} d  } x1t# | ƒ D]#}  x`t# |	 d$ ƒ D]2}! | j j$ ƒ  }" |  d k rS|" j ƒ  j ƒ  }# |" j% t j& t j' d% |# d ƒ d& d' ƒ ƒ |" j( ƒ  n  g  }$ d  }% x¥t# | ƒ D]—}& |% d  k	 r­|" j% d( |% ƒ |" j) d) d* ƒ }" |" j( ƒ  n  |" j* ƒ  }% t j+ j+ d+ t, d, |& d | d k ƒ }' | s¡yO t j- j- d( |% d- | d. |' d/ t. j- j/ d0 d# ƒ d1 t. j- j0 d2 t, ƒ ƒ }( WnG t1 k
 r€}) |  d k r[‚  n  t2 |) ƒ j3 d3 ƒ sv‚  n  d  }( PqX|$ j |( ƒ |" j% d( |% ƒ qlt4 d( |% d- | d. |' d/ t. j- j/ d0 d# ƒ d1 t. j- j0 d2 t, ƒ ƒ }( |$ j |( ƒ |" j% d( |% ƒ qlW|( d  k	 råPqåqåWt1 d4 |	 t2 |) ƒ f ƒ ‚ |$ d5 j5 }* | j6 d( |% ƒ }+ t j7 |+ j8 j9 d( |% ƒ d  ƒ }, ˆ d6 |  |* j: |* j; t< d7 d8 d9 |, ƒ f IJˆ j ƒ  | d  k sÜ| d5 j5 j= |$ d5 j5 j= k rÎ|$ } |" }- |  }. qÎqÎW| d  k	 st  ‚ xl t> | ƒ D]^ \ }/ }( ˆ Jˆ d: |/ d$ IJ|( j? j@ d ˆ ƒ ˆ Jˆ d; |/ d$ IJ|( j5 j@ d ˆ ƒ qWˆ Jˆ d< |. | d5 j5 j= f IJ| d5 j5 j= d= k rÉˆ d> | d5 j5 j= IJn  ˆ J|- j
 d	 | d d
 ˆ ƒ ˆ J|- j* ƒ  }0 | j6 d( |0 ƒ }+ |+ jA jB d? d@ d( |0 dA g  |- j ƒ  D] } | jC ^ q.d ˆ ƒ ˆ J|+ j8 jD d( |0 d ˆ ƒ ˆ Jˆ j ƒ  | |  _E | j |  _F |- |  _G d  S(C   NR_   t   cost   prolsqi    t   fc             s�   ˆ j  d ˆ ƒ }  t j d |  ƒ } | j d ˆ ƒ | j ƒ  } ˆ j d | d ˆ ƒ } ˆ  d  k	 r t | ƒ ˆ  k s t ‚ n  ˆ J| | f S(   Nt   buffer_thicknesst   asu_mappingst   distance_cutoffR7   t   out(	   Rd   R   t   pair_asu_tablet   add_all_pairst   extract_pair_sym_tablet   pair_sym_table_show_distancest   Nonet   listR   (   t   si_asu_mappingst	   asu_tableRE   t   si_pair_counts(   t   connectivitiesRe   Rf   RD   (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyt   get_si_si_sym_table�   s    				RD   RE   R7   Rf   i   RR   RS   i   i   t   full_pair_sym_tableR5   t	   max_shelli   t   otherR    R!   t   max_residualt   bond_stretch_factori   t   crystal_symmetryR   t   shell_sym_tablesR,   t   nonbonded_typest   nonbonded_functiont   nonbonded_distance_cutofft   nonbonded_buffert   max_reasonable_bond_distanceid   i   R   i
   i   t
   sites_cartt   max_shift_cartgš™™™™™É?t   bondt	   nonbondedt   geometry_restraints_managert   geometry_restraints_flagst   lbfgs_termination_paramst   max_iterationst   lbfgs_exception_handling_paramst-   ignore_line_search_failed_step_at_lower_bounds.   Bond distance > max_reasonable_bond_distance: s&   max_exceptions_handled=%d exceeded: %siÿÿÿÿs:   i_trial, bond, nonbonded, min distance: %d, %.6g, %.6g, %st   formats   %.4gt   values&   Energies at start of %d. minimization:s$   Energies at end of %d. minimization:s%   Final target value (i_trial=%d): %.6ggš™™™™™¹?s'   WARNING: LARGE final target value: %.6gt   by_valuet   residualt   site_labels(   R_   R`   Ra   (H   R   Rk   t   syst   stdoutt   show_summaryt   show_scattererst   flushR2   R    R5   Rj   R!   R   t   all_eqR   R]   R   t   coordination_sequencesRx   RM   t   add_pair_sym_table_in_placeRC   R+   R1   R   t
   std_stringR   R?   R   R   t   gaussian_repulsion_functiont   mean_residualt   cos_repulsion_functiont   prolsq_repulsion_functiont   managerRN   R6   t   set_sites_cartt   vec3_doublet   random_doublet   apply_symmetry_sitest   random_shift_sitesR~   t   flagst   Truet   lbfgst   scitbxt   termination_parameterst   exception_handling_parameterst   RuntimeErrort   strt
   startswitht	   dev_lbfgst   final_target_resultt   pair_proxiest   min_defaultt   nonbonded_proxiest   deltast   bond_residual_sumt   nonbonded_residual_sumR   t   targetR   t   first_target_resultt   showt   bond_proxiest   show_sortedR3   t!   show_histogram_of_model_distancesR‚   t   start_structuret   minimized_structure(1   R   RD   Re   R{   R|   t!   nonbonded_repulsion_function_typet*   nonbonded_max_residual_bond_stretch_factort   n_trialst   n_macro_cyclest   max_exceptions_handledRp   Rf   t   devRq   RE   Ro   t   si_ot   si_o_sstt   si_o_pair_countst   n_sit   n_si_oRU   t   o_si_o_pair_countsRx   t   _R   R,   Ry   R=   Rz   R‚   t	   minimizedt   i_trialt   i_exceptions_handledt   trial_structuret   n_scattererst   trial_minimizedt   trial_sites_cartt   i_macro_cycleRƒ   t   mt   lbfgs_errort   ftrR«   t   min_nonbonded_distanceR¸   t   best_i_trialt   imR~   (    (   Rp   Re   Rf   RD   s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyR   x   sx    

	
		#
		
		"											 	 				
	
		
	N(   R   R   Rk   t   FalseR   (    (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyR^   v   s   t   dev_target_resultc           B   s    e  Z d  „  Z d d d „ Z RS(   c         C   s1   | |  _  | |  _ | |  _ d  |  _ d |  _ d  S(   Ni    (   R±   t   n_bond_proxiesR¯   Rk   t   n_nonbonded_proxiesR°   (   R   R±   RÖ   R¯   (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyR   U  s
    				t    c         C   s‘   | d  k r t j } n  | | d |  j IJ|  j d  k	 r] | | d |  j |  j f IJn  |  j d  k	 r� | | d |  j |  j f IJn  d  S(   Ns   target: %.6gs      bond_residual_sum (n=%d): %.6gs%     nonbonded_residual_sum (n=%d): %.6g(   Rk   R�   RŽ   R±   RÖ   R¯   R×   R°   (   R   Rb   t   prefix(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyR³   \  s     

N(   R   R   R   Rk   R³   (    (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyRÕ   S  s   	R©   c           B   s2   e  Z d  d d d d d g Z d „  Z d „  Z RS(   t   grmt   xt   proxiest	   minimizerR²   Rª   c            sp  | ˆ  _  ˆ  j  j } ˆ  j  j } | j ƒ  j | ƒ } | j d | ƒ ˆ  _ t j ƒ  ˆ  _	 x¦ t
 ˆ  j  j d ƒ D]Ž \ }	 }
 x |
 j ƒ  D]q \ } } |	 | k s¨ t ‚ ˆ  j  j |	 | } x< | D]4 } ˆ  j	 j t j d |	 | g d | d | ƒ ƒ qÃ WqŠ Wqq W‡  f d †  } | ƒ  ˆ  _ d d  l } | j j d ˆ  d	 | d
 | ƒ ˆ  _ ˆ  j ƒ  \ } } | ƒ  ˆ  _ d  S(   NR8   i    R&   RI   R)   c             s4   ˆ  j  ƒ  \ }  } t d |  d ˆ  j j ƒ  d |  ƒ S(   NR±   RÖ   R¯   (   t    compute_functional_and_gradientsRÕ   RÜ   R   (   Rb   RÅ   (   R   (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyt   get_target_result‚  s
    iÿÿÿÿt   target_evaluatort   termination_paramst   exception_handling_params(   RÚ   Rw   R5   t	   unit_cellt   fractionalizet   pack_coordinatesRÛ   R   t   shared_bond_simple_proxyRÜ   R   Rx   R;   R   R   R?   t   bond_simple_proxyR²   t   scitbx.lbfgsR¢   t   runRÝ   RÞ   Rª   (   R   R~   R‚   Rƒ   R„   R†   t   cst   sstR8   R#   RB   R%   RH   R   RI   Rß   R£   Rb   RÅ   (    (   R   s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyR   m  s0    	#c   	   	   C   s¹   |  j  j } |  j  j } | j d |  j ƒ } | j ƒ  j | ƒ } t j | j	 ƒ  d ƒ } t
 j d | j ƒ  d | d |  j d | ƒ } | | j ƒ  j ƒ  } | j d | ƒ } | | f S(	   Nt   packed_coordinatesi    Rã   R~   RÜ   t   gradient_arrayt   g_frac(   i    i    i    (   RÚ   Rw   R5   t   unpack_coordinatesRÛ   Rã   t   orthogonalizeR   Rœ   R   R   R¯   RÜ   t   orthogonalization_matrixt   pack_gradients(	   R   Rê   Rë   R8   R~   t   g_cartRb   Rî   t   g(    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyRÞ   ‘  s    			(   R   R   t	   __slots__R   RÞ   (    (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyR©   f  s
   		$(    (#   t
   __future__R    t   cctbxR   t   cctbx.geometry_restraints.flagst!   cctbx.geometry_restraints.managert   cctbx.geometry_restraints.lbfgsR   R   t$   cctbx.crystal.coordination_sequencesR   t   cctbx.array_familyR   R£   R   R9   Rè   t   libtbx.str_utilsR   t	   itertoolsR   R�   t   set_random_seedt   objectR	   R   R   R   R+   R1   R2   R]   R^   RÕ   R©   (    (    (    s^   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/geometry_restraints/distance_least_squares.pyt   <module>   s4   			Ý