ó
Ù™xTc           @   sQ  d  d l  m 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 m Z d  d l Z d  d	 l m Z d  d l Z e j j d
 ƒ Z e j j e j j d ƒ ƒ Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d „  Z  d d „ Z" d d d „ Z# d d d „ Z$ d „  Z% d d „ Z& d d d d „ Z' d  d! d" d# d$ „ Z( d  d! d% „ Z) d& „  Z* d' „  Z+ d( „  Z, d) „  Z- d* „  Z. d+ „  Z/ d, „  Z0 d d d- „ Z1 d. „  Z2 d d d/ „ Z3 d0 „  Z4 d1 „  Z5 d2 „  Z6 d3 d4 „ Z7 d5 „  Z8 d d6 „ Z9 d S(7   iÿÿÿÿ(   t   division(   t   flex(   t
   find_peaks(   t   utilsN(   t   matrix(   t   adopt_init_args(   t   print_statistics(   t   sgtbxs¿  map_type = mFobs-DFmodel
  .type = str
  .help = Map type to be used to find hydrogens
map_cutoff = 2.0
  .type = float
  .help = Map cutoff
secondary_map_type = 2mFobs-DFmodel
  .type = str
  .help = Map type to be used to validate peaks in primary map
secondary_map_cutoff = 1.4
  .type = float
  .help = Secondary map cutoff
angular_step = 3.0
  .type = float
  .help = Step in degrees for 6D rigid body search for best fit
dod_and_od = False
  .type = bool
  .help = Build DOD/OD/O types of waters for neutron models
filter_dod = False
  .type = bool
  .help = Filter DOD/OD/O by correlation
min_od_dist = 0.60
  .type = float
  .help = Minimum O-D distance when building water from peaks
max_od_dist = 1.35
  .type = float
  .help = Maximum O-D distance when building water from peaks
min_dod_angle = 85.0
  .type = float
  .help = Minimum D-O-D angle when building water from peaks
max_dod_angle = 170.0
  .type = float
  .help = Maximum D-O-D angle when building water from peaks
h_bond_min_mac = 1.8
  .type = float
  .short_caption = H-bond minimum for DOD solvent-model
  .expert_level = 1
h_bond_max = 3.9
  .type = float
  .short_caption = Maximum H-bond length in DOD solvent model
  .expert_level = 1
s  use_sigma_scaled_maps = True
resolution_factor = 1./4.
map_next_to_model
{
  min_model_peak_dist = 0.7
  max_model_peak_dist = 1.05
  min_peak_peak_dist = 0.7
  use_hydrogens = False
}
peak_search
{
  peak_search_level = 1
  min_cross_distance = 1.0
  general_positions_only=True
}
c           C   s   t  j j d d t ƒS(   Nsv       include scope mmtbx.hydrogens.find.master_params_part1
    include scope mmtbx.hydrogens.find.master_params_part2
t   process_includes(   t   iotbxt   philt   parset   True(    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   all_master_paramsK   s    	t   h_peakc           B   s   e  Z d  „  Z RS(   c         C   s:   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   t	   site_fract   heightt   distt   scatterer_ot
   pdb_atom_ot   i_seq_o(   t   selfR   R   R   R   R   R   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   __init__R   s    					(   t   __name__t
   __module__R   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyR   Q   s   t   water_and_peaksc           B   s   e  Z d  „  Z RS(   c         C   s;   | | | | g j  d  ƒ d k s' t ‚ t |  t ƒ  ƒ d  S(   Ni    (   t   countt   Nonet   AssertionErrorR   t   locals(   R   R   t   i_seq_h1t   i_seq_h2t   peaks_sites_frac(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyR   `   s    '(   R   R   R   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyR   _   s   c         C   s�   d  } | d |  d | d |  d | d |  d f } | d |  d | d |  d | d |  d f } t j | ƒ } t j | ƒ } | j | d t ƒS(   Ni    i   i   t   deg(   R   R   t   colt   angleR   (   t   ot   h1t   h2t   resultt   at   b(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   water_bond_angleg   s    33c         C   sP   t  j d |  d | j d | j d | d | ƒ } | j ƒ  } | j d | ƒ | S(   Nt   fmodelt   map_typet
   map_cutofft   paramst   logt	   pdb_atoms(   R   t   managerR,   R-   t   peaks_mappedt   show_mapped(   R+   R0   R.   R/   t
   fp_managerR'   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   find_hydrogen_peakso   s    			c   
      C   s¾   i  } x± t  j d |  j ƒ D]š } |  j | } |  j | } | j | ƒ } | | k  r] q n  |  j | }	 | |	 r | j |	 ƒ r  | |	 j | | f g ƒ q¶ | | f g | |	 <q q W| S(   Nt   data(   R   t   sort_permutationt   iseqs_of_closest_atomst   sitest   heightst   eight_point_interpolationt   has_keyt   extend(
   t   peakst	   selectiont   obs_mapt   cutoffR'   t   it   st   ht   obsht   i_seq(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   make_peak_dict|   s    
c         C   sC  | j  ƒ  } | j ƒ  | j ƒ  k s* t ‚ |  j j ƒ  |  j j ƒ  k sN t ‚ |  j j ƒ  |  j j ƒ  k sr t ‚ | j d d d d ƒ } x |  j D] } d | | _ q” Wt j	 j
 } i  } g  }	 xê | j ƒ  D]Ü }
 xÓ |
 j ƒ  D]Å } x¼ | j ƒ  D]® } x¥ | j ƒ  D]— } | d | j ƒ d k } xv | j ƒ  D]h } | j d k rOq4n  | j j ƒ  d k sjt ‚ | r4| j j ƒ  d	 k s‹t ‚ | | | j <Pq4q4Wq	Wqö Wqã WqÐ W~ i  } x | D] } g  | | <qÀWxF t |  j ƒ D]5 \ } } | j | ƒ d  k	 rä| | j | ƒ qäqäWx| j ƒ  D]\ } } | j ƒ  } | j ƒ  d
 k sZt ‚ d  } g  } xQ | D]I } | j j ƒ  } | d	 k r—| } qm| d k s©t ‚ | j | ƒ qmW| d  k	 sÌt ‚ t | ƒ d k sät ‚ |	 j t d | j d | d j d | d j d g  | | D] } |  j | ^ qƒ ƒ q*W|	 S(   Nt   first_valuei    t	   incrementi   t   namet   common_watert   Ht   Dt   Oi   i   R   R   R   R    (   RL   RM   (   RL   RM   (   t
   scattererst   sizeR   R9   R:   R8   t	   reset_tmpt   tmpR	   t   pdbt   common_residue_names_get_classt   modelst   chainst   residue_groupst   atom_groupst   resnamet   atomst   elementt   stripRF   t	   enumeratet   getR   t   appendt   itemst   lenR   (   R>   t   pdb_hierarchyR0   t   xray_structureRO   t   sentinelRF   t	   get_classt
   o_i_seq_agR'   t   modelt   chaint   rgt   agt   is_watert   atomt   o_i_seq_i_peakt   i_peakt   ag_atomst   o_atomt   h_atomst   el(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   extract_hoh_peaksŒ   sd    $$ 		)c         C   sb  | j  ƒ  } | j ƒ  } | |  j j } | |  j j } | |  j j } |  j }	 t |	 ƒ d k rm| |  j }
 | |  j } |
 j | j k  rª | j d k rª | j } n> |
 j | j k rÞ |
 j d k rÞ | |  j j } n
 |	 d } t	 j
 j d | d | d | d |	 d d | d	 | j d
 | ƒ } | j ƒ  } | j | j ƒ } | j | j ƒ } | j | j ƒ } ng  } xY t |	 ƒ D]K \ } } x< t |	 ƒ D]. \ } } | | k  r™| j | | g ƒ q™q™Wq€Wd } x© | D]¡ } t	 j
 j d | d | d | d | d d | d d	 | j d
 | ƒ } | j ƒ  | k  rÜ| j ƒ  } | j | j ƒ } | j | j ƒ } | j | j ƒ } qÜqÜW| d k  rPt } | |  j j | |  j j | |  j j g } xQ | D]I } t j | j ƒ  | j ƒ  | d t ƒ } | j ƒ  d k rÇt } PqÇqÇW| sP| | |  j _ | | |  j _ | | |  j _ qPn  | d | IJd  S(   Ni   g333333Ó?i    t   site_frac_ot   site_frac_h1t   site_frac_h2t   site_frac_peak1t   site_frac_peak2t   angular_shiftt	   unit_cellg     8�@g      ð?g      à?s   %6.3f(   RO   Rz   R   t   siteR   R   R    Ra   t	   occupancyt   mmtbxR   t   fit_hoht   angular_stept	   dist_bestt   fractionalizet   site_cart_o_fittedt   site_cart_h1_fittedt   site_cart_h2_fittedR]   R_   t   FalseR   t   site_symmetryt   space_groupR   t
   n_matrices(   R   Rc   R.   R/   RO   t   ucRt   Ru   Rv   t   peak_sites_fract   sc1t   sc2R'   t   d_bestR$   R%   R&   t
   peak_pairsRB   t   s1t   jt   s2t   pairt   skipR9   R{   R†   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt	   fit_waterÀ   s„    	!!

		

					c      
   C   sP  t  j d d | ƒ| d  k r1 t ƒ  j ƒ  } n  t  j d d | ƒt d |  d | j d | d | ƒ } t d | d	 | j	 ƒ  d | j d
 | j
 ƒ } t  j d d | ƒ| d IJx0 | D]( } t d | d
 | j
 d | d | ƒ q¹ W| j
 j ƒ  } t j | ƒ } | | d k }	 | j
 j ƒ  }
 |	 j |
 t ƒ | j
 j d | d |	 ƒ d  S(   Ns%   Fit water hydrogens into residual mapt   outs   find peak-candidatesR+   R0   R.   R/   R>   Rb   Rc   s   6D rigid body fit of HOHs   Fit quality:R   i   t   valueR?   (   R   t   make_headerR   R   t   extractt   make_sub_headerR5   R0   Rs   Rb   Rc   R”   t   extract_u_iso_or_u_equivR   t   meant   hd_selectiont   set_selectedR…   t	   set_u_iso(   R+   Rg   R/   R.   R>   t   waters_and_peaksR   t   u_isost
   u_iso_meant   sel_bigt   hd_sel(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   run  s8    			
	c   
      C   s¨  | j  d |  j d t d t ƒ | j ƒ  | j j } | d  k rS t ƒ  j ƒ  } n  | d  k rk | j	 } n  | j
 d  k	 r‰ | j ƒ  } n | j ƒ  } d } | j j ƒ  r³ d } n  t j d | d d | ƒt |  | d	 | d
 | ƒ}  | j r-| j j } t |  | | ƒ t |  d | ƒ }  |  j ƒ  n  | j  d |  j d t d t ƒ | j ƒ  t j j |  ƒ |  j ƒ  } | |  j j ƒ  @}	 | d I|	 j t ƒ IJ|  | f S(   NRc   t   update_f_calct   update_f_maskt   xrayt   neutrons   Build water hydrogens into s    difference mapR•   R.   R/   g{®Gáz„?s!   Final number of water hydrogens: (   t   update_xray_structureRc   R   t
   show_shortt	   hydrogenst   buildR   R   R˜   R/   t   fmodel_nt   fmodel_neutront   fmodel_xrayt   guess_scattering_type_neutronR   R—   t   build_water_hydrogens_from_map2t
   filter_dodt   ordered_solventt	   b_iso_maxt   water_map_correlationst   remove_zero_occupancyt#   reprocess_pdb_hierarchy_inefficientR}   R   t   assert_model_is_consistentt   solvent_selectionRœ   R   (
   Rg   t   fmodelsR/   R.   t   hbparamsR+   t   titlet   bmaxt   sol_selR£   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   build_dod_and_od)  s@    
		
gš™™™™™©?g      T@c   
      C   s•   |  j  j ƒ  } | j ƒ  } t j j | ƒ } | j |  j  j ƒ  ƒ } |  j ƒ  } |  j  j	 ƒ  } | | @| | k  | | k B@}	 |	 }	 |  j
 d |	 ƒ S(   NR?   (   Rc   RO   t   extract_occupanciest   cctbxt   adptbxt   b_as_uRš   Rz   R¹   Rœ   t   select(
   Rg   t   min_occupancyt	   max_b_isoRZ   t   occt   umaxt   uisoR¾   R£   t   sel(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyR¶   M  s    c         C   s™  | j  } |  j ƒ  j } | | ƒ }	 | j ƒ  }
 | |
 _ |	 |
 _ d |
 _ | |
 _ d |
 _ t	 j
 j | ƒ |
 _ d |
 _ d |
 _ t j j j j ƒ  r¥ d |
 _ n  d | j ƒ  |
 _ | j ƒ  } | j ƒ  } | j ƒ  j ƒ  } | d k s | d k s t ‚ | d } | d k r#| d } n  | j d |
 ƒ | j ƒ  d } t	 j j d |
 j d |
 j j ƒ  d	 | d
 | d |
 j ƒ } |  j d | d | ƒ d  S(   Ni    iÿÿÿÿs   %2si   i   Rl   t   labelt   scattering_typeR{   t   uR|   t	   scatterert   insert_at_index(   i    i    i    (   iÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿ(   iÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿiÿÿÿÿ(   RF   Rz   t   orthogonalizet   detached_copyRJ   t   xyzt   sigxyzRÇ   t   sigoccRÁ   RÂ   t   u_as_bR)   t   sigbt   uijR	   RS   t	   hierarchyRl   t
   has_siguijt   siguijR\   R[   t   parentRZ   RP   R   t   append_atomR§   RÎ   t   add_scatterer(   t   xsRl   t	   atom_nameR   R|   RÉ   R[   RF   t   cartRÒ   RD   Rj   Ri   t   nat   j_seqt   appatRÎ   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   insert_atom_into_modelZ  sB    								
		c         C   sÂ  |  j  d | ƒ } | j | d |  j ƒ  ƒt j j d | d | ƒ } |  j ƒ  j ƒ  } i  } x]| D]U}	 |	 j | k  ré |	 j	 | k  r� qe n  | j
 |	 ƒ }
 | j |	 ƒ } |
 j ƒ  j | ƒ } |	 j	 | } | | | } |	 j } nl |	 j	 | k rþ qe n  | j
 |	 ƒ }
 | j |	 ƒ } | j ƒ  j |
 ƒ } |	 j | } | | | } |	 j	 } | d  k	 re | | } | | rº| j | ƒ r¡| | j | | f g ƒ q·| | f g | | <qºqe qe W| S(   Nt   buffer_thicknesst   min_distance_sym_equivt   asu_mappingst   distance_cutoff(   Rç   t   process_sites_fracRæ   RÁ   t   crystalt   neighbors_fast_pair_generatorRO   RP   RF   Râ   t   get_rt_mx_it   get_rt_mx_jt   inverset   multiplyR   R<   R=   (   Rc   t
   sites_fract   peak_heightsRè   t   use_selectionRç   t   pair_generatort   n_xrayR'   R’   t   rt_mx_it   rt_mx_jt   rt_mx_jit   i_seq_new_site_fract   new_site_fract   jnt   rt_mx_ijR   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   distances_to_peaks  sB    		  	

iP   iª   c         C   sQ  | } t  s t ‚ | d  k rD t | ƒ } | j | ƒ | d } n  d } d  }	 |  j | | ƒ }
 |
 d k rz |
 d k  sŠ t d |
 ƒ ‚ xƒ | D]{ \ } } |  j | | ƒ } | d k  rÁ q‘ n  |  j | | | ƒ } | | k r‘ | | k  r‘ | | k r| } | }	 qq‘ q‘ Wg  } | d  k r.| g } n  |	 d  k	 rM| j |	 g ƒ n  | S(   Ni   gœu ˆ<ä7þg      à?g      ø?s    D-O distance is out of range: %f(   R…   R   R   t   maxt   removet   distanceR#   R=   (   Rz   t   o_sitet   xyz_ht   h1_sitet   min_dod_anglet   max_dod_anglet   hh1_sitet   mxt   h_maxt   h2_sitet   d1RD   RC   t   dR(   R'   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   choose_h_for_water§  s2    (g      à?gš™™™™™õ?g     @U@g     @e@c      	   C   s\  t  | ƒ } d } d  } x=t | ƒ D]/}	 | |	 }
 |
 d } xt |	 d | ƒ D]ý} | | } | d } |  j | | ƒ } | | k  r‘ qS n  x¼t | d | ƒ D]§} | | } | d } |  j | | ƒ } |  j | | ƒ } | | k  rõ q¥ n  | | k  rq¥ n  | | | f | | | f | | | f g } g  } xº | D]² } |  j | d | d | d ƒ } |  j | d | d ƒ } |  j | d | d ƒ } | | k sÉ| | k sÉ| | k sÉ| | k  rÙ| j d ƒ q>| j t | d ƒ ƒ q>Wt t t  | ƒ ƒ d | j ƒ} | | | k  r¥ | | d k  r¥ | | } | | } q¥ q¥ WqS Wq% W| S(   Ng     €v@i   i    i   g     @Z@t   keyg     €V@(	   Ra   R   t   xrangeRÿ   R#   R_   t   abst   mint   __getitem__(   Rz   R  t   min_odt   max_odR  R  t   nt   bestat   rRB   t   x1ht   x1R�   t   x2ht   x2R	  t   kt   x3ht   x3t   d2t   d3R(   t   dat   tt   avt   td1t   td2t   ibest(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt	   match_dodÃ  sF    





*!0! 
c         C   sÚ   t  | ƒ } d } d  } x» t | ƒ D]­ } | | } | d }	 x� t | d | ƒ D]{ }
 | |
 } | d } |  j |	 | ƒ } | | k  sS | | k r� qS n  t | d ƒ } | | k  rS |	 | f } | } qS qS Wq% W| S(   Ng    _ Bi   g      ð?(   Ra   R   R  Rÿ   R  (   Rz   R  R  R  R  R  R  RB   R  R  R�   R  R  R	  t   dd1(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   match_odê  s"    



c         C   s1   d } x$ |  j  ƒ  D] } | t | ƒ 7} q W| S(   Ni    (   t   valuesRa   (   t   set_of_peaksR  R>   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt	   len_peaksý  s    c         C   sÖ   d d  l  } t | d ƒ } | d IJd } xš |  j ƒ  D]Œ } | d } | | Id I| j j ƒ  Id I| j j ƒ  Id I|  j ƒ  j | j ƒ Id I| j	 Id I| j
 j | j ƒ IJq8 W| j ƒ  d  S(   Niÿÿÿÿt   ws    scats i    i   t    (   RÁ   t   fileRO   RË   R\   RÌ   Rz   RÐ   R{   R|   RÂ   RÕ   t   u_isot   close(   Rc   t   fnRÁ   t   ftmpt   itmpt   scat(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   print_scats  s    

.c         C   s£   |  d I| j  ƒ  IJ|  d I| j IJ|  d I| j IJ|  d I| j IJ|  d | j IJ|  d I| j IJ|  d I| j IJ|  d I| j j ƒ  IJd  S(	   Ns        s           atom.xyz:  s           atom.occ:  s           atom.b:    s           atom.segid: "%s"s           atom.i_seq: s           atom.name: s           atom.element: (	   t   format_atom_recordRÒ   RÇ   R)   t   segidRF   RJ   R[   R\   (   R•   Rl   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt
   print_atom  s    c         C   s{   |  d I| j  j ƒ  IJ|  d I| j IJ|  d I| j j ƒ  IJ|  d It j j | j ƒ IJ|  d I| j IJd  S(   Ns   scatterer  label : s               site : s            element : s               biso : s                occ : (	   RË   R\   R{   RÌ   RÁ   RÂ   RÕ   R.  R|   (   R•   RC   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt
   print_scat  s
    c         C   s<   d d  l  } | j  ƒ  } t | |  ƒ t | | ƒ | j ƒ  S(   Niÿÿÿÿ(   t   StringIOR7  R8  t   getvalue(   Rl   R3  R9  RC   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt	   atom_scat!  s
    c         C   s/   d d  l  } | j  ƒ  } t | |  ƒ | j ƒ  S(   Niÿÿÿÿ(   R9  R7  R:  (   Rl   R9  RC   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   atom_as_str)  s    c         C   sm  |  j  } | j ƒ  } | j ƒ  } |  j ƒ  } |  j ƒ  } x-| D]%} | j ƒ  d k rg t d ƒ ‚ n  | j ƒ  } | j ƒ  } g  }	 d  }
 | j
 ƒ  d k rÜ xH | D]1 } | j j ƒ  d k rÈ | }
 q¤ |	 j | ƒ q¤ Wn t sè t ‚ |
 j } | | j } xd |	 D]\ } | | j j } | j | | ƒ } | d k rE| d k  st d | t | ƒ f ƒ ‚ qWq@ Wd  S(   Ni   s4   Not implemented: cannot handle water with alt. conf.i    RN   gffffffÖ?g333333÷?s   %f
%s(   Rc   Rz   RO   Rb   t   extract_water_residue_groupst   atom_groups_sizet   RuntimeErrort   only_atom_groupRZ   R   RP   R[   R\   R_   R…   R   RF   R{   Rÿ   R<  (   Rg   RÞ   Rz   RO   t   hiert	   water_rgsRi   Rj   RZ   Rq   Rp   Rl   t   o_iR   t   hatomt   hsitet   doh(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   assert_water_is_consistent/  s2    			c   2      C   sá  |  } | j  } | j ƒ  } | j ƒ  } |  j ƒ  } t j j |  ƒ | d  k r[ |  j } n  | d  k ry t	 ƒ  j
 ƒ  } n  | j }	 | j }
 |
 d k s� t ‚ |	 |
 k rµ |	 d k  s» t ‚ | j j } | j j } |	 d | j _ |
 | j _ d | j _ t | j _ |
 | j _ | j } | j } | d k  rI| d k rI| | k sOt ‚ t d | d |  j d	 | d
 | ƒ } | d  k rƒ|  St | j _ | j } | | j _ | | j _ |  j ƒ  j |  j  j ƒ  t ƒ } | d I| j t ƒ IJ|  j ƒ  } | |  j  j ƒ  @} | d I| j t ƒ IJt  | | j! | |	 d | ƒ} t  | | j! | |	 d d | ƒ} | d It" | j# ƒ  ƒ Id It" | j# ƒ  ƒ IJ| j$ ƒ  } | j% ƒ  d } g  } x| D]} | j& ƒ  d k ræt' d ƒ ‚ n  | j( ƒ  } | j) ƒ  } d } d  } d  } d  } | j* ƒ  d k rëd  }  d  }! x2 | D]* }" |" j+ j, ƒ  d k r_|" }  q;|" }! q;W|  |! g j d  ƒ d k sŠt ‚ |! j- } | | j. } |! } |! j/ j, ƒ  j0 d ƒ rÇd } q4|! j/ j, ƒ  j0 d ƒ r4d } q4nI | j* ƒ  d k r| d }  d  } n$ | j* ƒ  d k r(q¿n t s4t ‚ |  j- }# | j1 |# ƒ r¿| |# j. }$ | |# j2 | ƒ }% | |# }& t3 | |$ |& d | d | d | ƒ}' | j* ƒ  t" |' ƒ }( |( d k rît" |' ƒ d k r×| }) n
 |' d }) | j1 |# ƒ söt ‚ | |# }* t3 | |) |* d |$ d | d | ƒ}+ t" |+ ƒ d k rît" |+ ƒ d k sNt ‚ |) | |# _. | j4 |) ƒ |  _5 | d  k	 r›|$ | | _. | j4 |$ ƒ | _5 n% |+ j6 |$ ƒ t" |+ ƒ d k sÀt ‚ |+ }' | j* ƒ  t" |' ƒ d k sët ‚ qîn  xÛ t7 |' ƒ D]Ê \ }, }- | d k r|, d k  s=| d k r7|, d k  s=t ‚ | d k rRd }. n | d k rgd }. n
 |, d }. | t8 |. ƒ }/ |  j- }0 t9 | d |  d |/ d |- d  d d! |% d" | ƒ| j6 |0 ƒ qûWq¿q¿W|  j: d  k	 rt" | ƒ d k r|  j: j; d# | d$ t d% t d& t ƒ n  | d' It" | ƒ IJ|  j< ƒ  |  j: j= j* ƒ  }1 |1 |  j  j ƒ  j* ƒ  k slt ‚ |  j: j= j t ƒ |1 k s�t ‚ t j j |  ƒ |  j ƒ  } | |  j  j ƒ  @} | j t ƒ t" | ƒ k sÝt ‚ |  S((   Ng      à?g      ø?gÍÌÌÌÌÌü?gÍÌÌÌÌÌì?i´   i   R+   R0   R.   R/   s   Number of solvent molecules: s   Number of water hydrogens: Rò   g333333û?s   Peaks to consider: s    : RM   i   s4   Not implemented: cannot handle water with alt. conf.i    i   RN   t   1t   2i   R  R  R  Rl   Rß   R   R|   RÉ   R[   t   next_to_i_seqst   sites_individualt   s_occupanciest   adp_individual_isos   Number of H added:(>   Rc   Rz   RO   Rb   R}   R   R¸   R   R/   R   R˜   t   max_od_distt   min_od_distR   t   map_next_to_modelt   max_model_peak_distt   min_model_peak_distt   peak_searcht   min_cross_distanceR   t   use_hydrogenst   min_peak_peak_distR  R  R5   R0   R…   R:   R¹   R�   Rœ   R   Rü   R9   Ra   t   keysR=  t   reverseR>  R?  R@  RZ   RP   R[   R\   RF   R{   RJ   t   endswithR<   t   u_iso_or_equivR  RÐ   RÒ   R_   R]   t   strRä   t   refinement_flagst   addR·   RK  (2   Rg   R+   R.   R/   R   RÞ   Rz   RO   RA  RN  RO  t   keep_maxt   keep_minR  R  R>   t   hst   sol_OR¾   R£   t   pkst   pkssRB  R[   RJ  Ri   Rj   RZ   R%   t   h1_atomR  t   h1_i_seqRp   t   h_atomRl   RC  R   t   o_ut   h_sitest   hht   natst   h_swapt   h_sitesst   hhsRB   R   R�   RJ   RF   t   np(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   build_water_hydrogens_from_mapM  s   					*			"4
 	
!		
		
	

(6 	 	
	!

!!!c         C   sì   |  } | j  ƒ  d k r' t d ƒ ‚ n  | j ƒ  } | j ƒ  } g  } x$ | D] } | j } | j | ƒ qL Wt j ƒ  } x@ t d | ƒ D]/ }	 |	 | k rª | j t	 ƒ qˆ | j t
 ƒ qˆ W| j t	 ƒ }
 |
 d k râ |
 d k sè t ‚ | S(   Ni   s4   Not implemented: cannot handle water with alt. conf.i    i   (   R>  R?  R@  RZ   RF   R_   R   t   boolR  R   R…   R   R   (   t   water_residue_groupt   n_atomsRi   Rj   RZ   t   wsRl   RB   R'   R�   t   nw(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   select_one_waterÚ  s$    	c   3      C   s†	  |  } | j  } | j ƒ  } | j ƒ  } |  j ƒ  } t j j |  ƒ |  j ƒ  t |  ƒ | d  k ro |  j
 } n  | d  k r� t ƒ  j ƒ  } n  | j }	 | j }
 |
 d k s± t ‚ |	 |
 k rÉ |	 d k  sÏ t ‚ | j j } | j j } |	 d | j _ |
 | j _ | j | j _ | j j d k  r3d | j _ n  t | j _ |
 | j _ | j } | j } | d k  r�| d k r�| | k s‡t ‚ t d | d |  j d	 | d
 | ƒ } | d  k r»|  St | j _ | j } | | j _ | | j _ |  j ƒ  j |  j  j  ƒ  t ƒ } | d I| j! t ƒ IJ|  j ƒ  } | |  j  j  ƒ  @} | d I| j! t ƒ IJt" | d | j# ƒ} | j$ } | d k r�| d k  s–t ‚ t% | | | | ƒ } d } x$ | j& ƒ  D] } | t' | ƒ } q¾W| d I| IJ| j( ƒ  } | j) ƒ  d } g  } x| D]} | j* ƒ  d k r8t+ d ƒ ‚ n  | j, ƒ  } | j- ƒ  } g  } d  }  | j. ƒ  d k r­xH | D]1 }! |! j/ j0 ƒ  d k r™|! }  qu| j1 |! ƒ quWn t s¹t ‚ |  j2 }" | j3 |" ƒ r| |" j4 }# t5 j6 | j ƒ  | j7 ƒ  |# d t ƒ }$ |$ j8 ƒ  d k r#t }% qn  | |" j9 | ƒ }& | |" }' | j: |# ƒ }( |( | k rq|' j1 d |# f ƒ n  x• | D]� }) | |) j2 j4 }* | j; |* |# ƒ }+ |+ d k r¸|+ d k  sÔt d |+ t< |) ƒ f ƒ ‚ | j: |* ƒ }( |( | k rx|' j1 d |* f ƒ qxqxWt= | |' d | j d | j d | j d | j ƒ}, |, d  k r×t> | |' d | j d | j ƒ}- |- d  k	 r|- d | |" _4 | j? |- d ƒ |  _@ |- d }. t' | ƒ d k r“| jA ƒ  }) | j? |. ƒ |) _@ d |) _B tC jD jE |& ƒ |) _F d |) _G |) j2 }/ d | |/ _H |. | |/ _4 d | |/ _I |& | |/ _J t' | ƒ d k rÑ| jA ƒ  }) d |) _G d |) _B |) j2 }/ d | |/ _H d | |/ _I qÑqÔtK | d |  d d d  |. d! d d" |& d# d ƒ| j1 |  j2 ƒ qq|, d | |" _4 | j? |, d ƒ |  _@ d }0 x|, d |, d$ f D]õ }. d tL |0 ƒ }1 |0 d }0 t' | ƒ d k rÐ| jA ƒ  }) | j? |. ƒ |) _@ d |) _B tC jD jE |& ƒ |) _F |1 |) _G |) j2 }/ |1 | |/ _H |. | |/ _4 d | |/ _I |& | |/ _J qtK | d |  d |1 d  |. d! d d" |& d# d ƒ| j1 |  j2 ƒ qWqqW|  jM d  k	 rbt' | ƒ d k rb|  jM jN d% | d& t d' t d( t ƒ n  | d) It' | ƒ IJ|  j ƒ  |  jM jO d  k	 rë|  jM jO j. ƒ  }2 |2 |  j  j ƒ  j. ƒ  k sÇt ‚ |  jM jO j! t ƒ |2 k sët ‚ n  t j j |  ƒ |  j ƒ  } | |  j  j  ƒ  @} | j! t ƒ t' | ƒ k s;	t ‚ t |  ƒ t r‚	|  jP ƒ  |  j d* t ƒ t j j |  ƒ t |  ƒ n  |  S(+   Ng      à?g      ø?gÍÌÌÌÌÌü?gffffffæ?i´   i   R+   R0   R.   R/   s   Number of solvent molecules: s   Number of water hydrogens: R,   g        g      Y@i    s   Peaks to consider: RM   i   s4   Not implemented: cannot handle water with alt. conf.RN   g333333÷?s   %f
%sR  R  R  R  t   D1t   D2Rl   Rß   R   R|   RÉ   R[   i   RJ  RK  RL  RM  s   Number of H added:t   sync_with_xray_structure(Q   Rc   Rz   RO   Rb   R}   R   R¸   R·   RG  R   R/   R   R˜   RN  RO  R   RP  RQ  RR  RS  RT  R   RU  RV  R  R  R5   R0   R…   R:   R¹   R�   Rœ   R   R@   t   secondary_map_typet   secondary_map_cutoffRG   R(  Ra   R=  RX  R>  R?  R@  RZ   RP   R[   R\   R_   RF   R<   R{   R   R†   R‡   Rˆ   RZ  R;   Rÿ   R<  R%  R'  RÐ   RÒ   t   popRÇ   RÁ   RÂ   RÕ   R)   RJ   RË   R|   R.  Rä   R[  R\  R]  RK  t
   idealize_h(3   Rg   R+   R.   R/   R   RÞ   Rz   RO   RA  RN  RO  R^  R_  R  R  R>   R`  Ra  R¾   R£   t   obsmapt   cutoff2Rc  t   npeakst   pkRB  R[   RJ  Ri   Rj   RZ   Rq   Rp   Rl   RC  R   R†   t   specialRg  Rh  t   valRD  RE  RF  t   dodt   odRD   t   h_it   iiRJ   Rn  (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyR±   ï  sJ   	

				*				
		
4
						
			!

!$!

c         C   sy   |  } | j  ƒ  d k r' t d ƒ ‚ n  | j ƒ  } | j ƒ  } x' | D] } | j j ƒ  d k rF | SqF Wt su t ‚ d  S(   Ni   s4   Not implemented: cannot handle water with alt. conf.RN   (   R>  R?  R@  RZ   R[   R\   R…   R   (   Rq  Ri   Rj   RZ   Rl   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   get_pdb_oxygen®  s    c      	   C   sõ   d d  l  j j } d d l m } | j ƒ  j ƒ  } | j } | j ƒ  j ƒ  } d | _ | j	 d  k	 rv | j ƒ  } n | j ƒ  } d }	 | j j ƒ  r  d }	 n  |  j j ƒ  }
 |
 | j j ƒ  k sÊ t ‚ | j d | d | d d	 d
 d ƒ } | j S(   Niÿÿÿÿ(   t   real_space_correlationt   residueR§   R¨   t   atom_selectionR+   t	   map1_typet   Fot	   map2_typet   Fmodel(   t   mmtbx.solvent.ordered_solventt   solventR³   R}   Rˆ  t   master_paramsR˜   t   secondary_map_and_map_cc_filtert   detailR­   R   R®   R¯   Rc   R°   RO   R   t!   map_statistics_for_atom_selectiont   cc(   Rg   Rº   t   waterR³   Rˆ  R.   t   part   rcparamsR+   R¼   RO   t   results(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   one_water_correlationº  s(    					c         C   s‘   t  ƒ  } x� t |  | ƒ D]p \ } } | r | | j ƒ  j ƒ  7} | d 7} | d | j | j f 7} | d 7} | | j 7} | d 7} q q W| S(   Ns    : s   %4.2f %6.3fs    = s   ;   (   R[  t   zipt   element_symbolR\   R|   R.  RË   (   RO   R?   R  RC   RÍ   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   scatterers_infoÒ  s    	

g      Ð?c         C   s1   |  j  ƒ  j | ƒ } | j d | ƒ j ƒ  j ƒ  S(   Nt   resolution_factor(   t   electron_density_mapt   map_coefficientst   fft_mapt   apply_sigma_scalingt   real_map(   R+   R,   Rž  t
   map_coeffs(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyR@   Þ  s    	c         C   sL   t  j ƒ  } x9 |  D]1 } | j | ƒ } | | k r | j | ƒ q q W| S(   N(   R   t   vec3_doubleR;   R_   (   Rð   R@   RA   R'   R   R‚  (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   map_peak_filterç  s    c      	   C   së  t  j d d | ƒ| j d |  j d t d t ƒ | j ƒ  |  j j ƒ  } |  j ƒ  } |  j ƒ  } t	 | ƒ } xu| D]m} t
 | ƒ } | | j }	 t | | ƒ }
 |
 j t ƒ d k  r¿ qv n  x!t | |
 ƒ D]\ } } | rÏ | j ƒ  j ƒ  } | d k rß| j d k s| j d	 k rÜ| j } t |  | |
 ƒ } | j d k r_d
 | _ |	 j | _ n	 d | _ | j d |  j d t d t ƒ t |  | |
 ƒ } | | k  rÐ| | _ | j d |  j d t d t ƒ qÙ| } qÜqßqÏ qÏ Wqv Wt S(   Ns   Water real space correlationsR•   Rc   R¥   R¦   i   RM   g{®Gáz”?g\�Âõ(\ï?g      ð?g        (   R   R—   R©   Rc   R   Rª   RO   R¹   R=  Ra   R‡  RF   Ru  R   R›  Rœ  R\   R|   Rš  R.  (   Rg   Rº   R/   RO   t   watersRB  Rr  Ri   Rp   t   o_scatR–  RC   RÍ   t   et   keep_occt
   neutron_cct   ncc(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyRµ   ð  sD    
				(:   t
   __future__R    t   cctbx.array_familyR   R}   R   R   t
   iotbx.philR	   t   scitbxR   t   libtbxR   t   mmtbx.refinementR   t   mmtbx.utilsRÁ   R   R
   R   t   master_params_part1R‘  t   fetcht   master_params_part2R   t   objectR   R   R*   R5   RG   Rs   R”   R   R¤   R¿   R¶   Rä   Rü   R  R%  R'  R*  R4  R7  R8  R;  R<  RG  Ro  Ru  R±   R‡  Rš  R�  R@   R¦  Rµ   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/hydrogens/find.pyt   <module>   s`   	*						4	H!$	&'	&			
				�	¿					