ó
±™xTc        	   @   sy  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 m Z d  d l Z	 d  d l	 m Z m Z d  d l Z d  d l Z d	 „  Z e ƒ  Z e Z d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d d d d e e e d d „ Z d d „ Z d d „ Z d e
 j f d „  ƒ  YZ  d „  Z! e" d k rue e j# d ƒ n  d S(   iÿÿÿÿ(   t   division(   t   utils(   t   flex(   t   make_headert   format_value(   t   runtime_utils(   t   SorryN(   t   adopt_init_argst
   group_argsc          C   s#   d d l  m }  |  d t d d ƒ S(   Niÿÿÿÿ(   t    generate_master_phil_with_inputst   enable_automatic_twin_detectiont   phil_strings  
find_peaks
  .style = auto_align
{
  include scope mmtbx.find_peaks.master_params
}
map_cutoff = 3.0
  .type = float
  .short_caption = mFo-DFc map cutoff (sigma)
anom_map_cutoff = 3.0
  .type = float
  .short_caption = Anomalous map cutoff (sigma)
include_peaks_near_model = False
  .type = bool
  .short_caption = Don't filter peaks by distance to model
  .help = By default, the program will only display peaks that map to points     outside of the current model, ignoring those that overlap with atoms.      Setting this option to True is equivalent to specifying a distance     cutoff of zero for the filtering step.
  .style = OnChange:toggle_min_model_peak_dist
wavelength = None
  .type = float
  .help = Optional parameter, if defined this will cause all atoms to be     treated as anomalous scatterers using the standard Sasaki table to     obtain theoretical fp and fpp values.  Only really useful if the Phaser     LLG map is being used for the anomalous map.
filter_peaks_by_2fofc = None
  .type = float
  .short_caption = Filter peaks by 2mFo-DFc
  .help = If this is set, peaks outside 2mFo-DFc density at the     cutoff will be discarded.  (This does not apply to the analysis of     solvent atoms.)  Holes will not be changed.
use_phaser_if_available = True
  .type = bool
  .short_caption = Use Phaser LLG map
  .help = If True, and Phaser is installed and configured, an anomalous LLG     map will be used in place of the simple anomalous difference map.  The     wavelength should be specified for this to be maximally useful.
write_pdb = True
  .type = bool
  .short_caption = Write peaks to PDB file
write_maps = True
  .type = bool
  .short_caption = Save map coefficients
output_file_prefix = peaks_holes
  .type = str
include scope libtbx.phil.interface.tracking_params
(   t   mmtbx.command_lineR	   t   True(   R	   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   get_master_phil   s    0t   peaks_holes_containerc           B   sn   e  Z d  d	 d  d	 d	 d	 d „ Z e j d „ Z d „  Z d „  Z d „  Z	 d e
 e
 e
 d	 d „ Z d „  Z RS(
   g      @c	   	      C   s¿   t  |  t ƒ  ƒ |  j j d t ƒ |  j j ƒ  |  j d  k	 rU |  j j d t ƒ n  |  j d  k	 r t	 |  j d „  ƒ |  _ n  |  j
 d  k	 r© t	 |  j
 d „  ƒ |  _
 n  d  |  _ d  |  _ d  S(   Nt   reversec         S   s   t  | j |  j ƒ S(   N(   t   cmpt   peak_height(   t   xt   y(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   <lambda>U   s    c         S   s   t  | j |  j ƒ S(   N(   R   R   (   R   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR   X   s    (   R   t   localst   peakst   sortR   t   holest
   anom_peakst   Nonet   water_peakst   sortedt   water_anom_peakst   pdb_filet   map_file(	   t   selfR   R   t
   map_cutoffR   t   anom_map_cutoffR   R   t   non_water_anom_peaks(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   __init__J   s    			c         C   s   |  j  ƒ  j d | ƒ d  S(   Nt   out(   t   get_summaryt   show(   R!   R&   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   show_summary\   s    c         C   s  d } |  j d k	 r* t |  j j ƒ } n  d } } |  j d k	 rU t |  j ƒ } n  |  j d k	 rv t |  j ƒ } n  d } } t |  j j ƒ d k r° t j |  j j ƒ } n  t |  j	 j ƒ d k rà t j
 |  j	 j ƒ } n  d } t |  d d ƒ d k	 rt |  j ƒ } n  t d |  j j |  j k j t ƒ d |  j j |  j d k j t ƒ d |  j j |  j d k j t ƒ d |  j	 j |  j k  j t ƒ d	 |  j	 j |  j d k  j t ƒ d
 |  j	 j |  j d k  j t ƒ d | d | d | d | d | d |  j d |  j d | ƒ S(   sF   
    Returns a simple object for harvesting statistics elsewhere.
    i    R$   t	   n_peaks_1t	   n_peaks_2i   t	   n_peaks_3i   t	   n_holes_1t	   n_holes_2t	   n_holes_3t   peak_maxt   hole_maxt   n_anom_peakst   n_water_peakst   n_water_anom_peaksR"   R#   t   n_non_water_anom_peaksN(   R   R   t   lent   heightsR   R   R   R   t   maxR   t   mint   getattrR$   t   summaryR"   t   countR   R#   (   R!   R2   R3   R4   R1   R0   R5   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR'   _   s>    

""##		c         C   s+   | d k s t  ‚ |  j j | k j t ƒ S(   Ni    (   t   AssertionErrorR   R7   R<   R   (   R!   t   cutoff(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   n_peaks_above_cutoffƒ   s    c         C   s+   | d k  s t  ‚ |  j j | k  j t ƒ S(   Ni    (   R=   R   R7   R<   R   (   R!   R>   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   n_holes_below_cutoff‡   s    s	   peaks.pdbc            sy  | d k r t j } n  d d l ‰  |  j j d t ƒ ˆ  j j j	 ƒ  } ˆ  j j j
 ƒ  } | j | ƒ ˆ  j j j d d ƒ } | j | ƒ ‡  f d †  }	 d }
 xR t |  j j |  j j ƒ D]5 \ } } |	 | | |
 ƒ } | j | ƒ |
 d 7}
 q¾ Wt | d ƒ } | j d	 ƒ | j d
 |  j ƒ | rÅ| j d |  j ƒ ˆ  j j j d d ƒ } | j | ƒ d }
 xU t |  j j |  j j ƒ D]5 \ } } |	 | | |
 ƒ } | j | ƒ |
 d 7}
 q‰Wn  | rq|  j d k	 rq| j d |  j ƒ ˆ  j j j d d ƒ } | j | ƒ d }
 xU t |  j j |  j j ƒ D]5 \ } } |	 | | |
 ƒ } | j | ƒ |
 d 7}
 q5Wn  | r¥|  j d k	 r¥| j d |  j ƒ ˆ  j j j d d ƒ } | j | ƒ xF t |  j ƒ D]5 \ }
 } |	 | j | j |
 d ƒ } | j | ƒ qÏW| r¥|  j d k	 r¥| j d |  j ƒ ˆ  j j j d d ƒ } | j | ƒ xI t |  j ƒ D]5 \ }
 } |	 | j | j |
 d ƒ } | j | ƒ qfWq¥n  | rAt |  d d ƒ d k	 rA| j d ƒ ˆ  j j j d d ƒ } | j | ƒ xI t |  j ƒ D]5 \ }
 } |	 | j | j |
 d ƒ } | j | ƒ qWn  | j | j ƒ  ƒ | j  ƒ  | d | IJ| |  _! d S(   sÂ   
    Write out a PDB file with up to three chains: A for peaks, B for holes,
    C for anomalous peaks.  Atoms are UNK, with the B-factor set to the height
    or depth of the peak or hole.
    iÿÿÿÿNR   t   idt   Ac            sœ   ˆ  j  j j d t | ƒ ƒ } ˆ  j  j j d d ƒ } | j | ƒ ˆ  j  j j ƒ  } | j | ƒ d | _ d | _	 |  | _
 | | _ d | _ | | _ | S(   Nt   resseqt   resnamet   UNKs    UNKt   Xg      ð?(   t   pdbt	   hierarchyt   residue_groupt   strt
   atom_groupt   append_atom_groupt   atomt   append_atomt   namet   elementt   xyzt   bt   occt   serial(   RQ   t   peakRT   t   rgt   agt   a(   t   iotbx(    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   create_atomž   s    						i   t   ws6   REMARK  Interesting sites from mmtbx.find_peaks_holes
s5   REMARK  Chain A is difference map peaks (> %g sigma)
s5   REMARK  Chain B is difference map holes (< %g sigma)
t   Bs0   REMARK  Chain C is anomalous peaks (> %g sigma)
t   Cs:   REMARK  Chain D is waters with mFo-DFc peaks (> %g sigma)
t   Ds8   REMARK  Chain E is waters with anom. peaks (> %g sigma)
t   ER$   s<   REMARK  Chain F is non-water, non-HD atoms with anom. peaks
t   Fs   Wrote %s("   R   t   syst   stdoutt   iotbx.pdb.hierarchyR   R   R   RG   RH   t   roott   modelt   append_modelt   chaint   append_chaint   zipR7   t   sitest   append_residue_groupt   opent   writeR"   R   R   R#   R   t	   enumerateRQ   R   R   R:   R$   t   as_pdb_stringt   closeR   (   R!   t	   file_namet   include_holest   include_anomt   include_watert   logRd   Re   t   peaks_chainRZ   t   kRU   RQ   RV   t   ft   holes_chaint   holet
   anom_chaint   waters_chaint   waters_chain_2t   anom_chain_2(    (   RY   sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   save_pdb_file‹   s†     (		(	(		
c         C   sZ   g  } |  j  d  k	 r. | j |  j  d f ƒ n  |  j d  k	 rV | j |  j d f ƒ n  | S(   Ns   Peaks as PDB atomss   Map coefficients(   R   R   t   appendR    (   R!   t   output_files(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   get_output_file_infoå   s    N(   t   __name__t
   __module__R   R%   Ra   Rb   R)   R'   R?   R@   R   R   R‚   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR   I   s   		$		UR;   c           B   s   e  Z e j d  „ Z RS(   c         C   s¿  | d IJ| d IJ|  j  |  j  d |  j  d g } |  j |  j |  j g } g  } g  } x? t | | ƒ D]. \ } } | j d | ƒ | j d | ƒ qh W| j d ƒ | j t d |  j ƒ ƒ |  j |  j	 |  j
 g } x? t | | ƒ D]. \ } }	 | j d	 | ƒ | j d |	 ƒ qè W| j d
 ƒ | j t d |  j ƒ ƒ |  j d  k	 rz| j d |  j ƒ | j d |  j ƒ n  |  j d  k	 r´| j d |  j  ƒ | j d |  j ƒ n  |  j d  k	 rî| j d |  j  ƒ | j d |  j ƒ n  |  j d  k	 r!| j d ƒ | j d |  j ƒ n  g  | D] }
 |
 j ƒ  d ^ q(} t g  | D] }
 t |
 ƒ ^ qNƒ } d | } x; t | | ƒ D]* \ } } | | } | d | | f IJqƒW| d IJd  S(   Nt    s   SUMMARY OF MAP PEAKS:g      @g      @s   mFo-DFc >  %-4gs   %6ds   mFo-DFc maxs   %6.2fs   mFo-DFc < -%-4gs   mFo-DFc mins   anomalous > %-4gs   suspicious H2O (mFo-DFC > %g)s   anomalous H2O (anomalous > %g)s   anomalous non-water atomst   :s   %%-%dss     %s %s(   R"   R*   R+   R,   Ri   R€   R   R0   R-   R.   R/   R1   R2   R   R#   R3   R4   R5   t   stripR8   R6   (   R!   R&   t   cutoffsR   t   labelst   valuesR>   t   n_peaksR   t   n_holest   lt	   label_lent   formatt   labelt   valuet	   formatted(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR(   î   sH    

 #%

(   Rƒ   R„   Ra   Rb   R(   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR;   í   s   t
   water_peakc           B   s#   e  Z d  d „ Z e j d „ Z RS(   s   mFo-DFcc         C   s   t  |  t ƒ  ƒ d  S(   N(   R   R   (   R!   t   id_strRQ   R   t   map_type(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR%     s    c         C   s$   | d |  j  |  j |  j f IJd  S(   Ns     %s  map_type=%s  peak=%g(   R”   R•   R   (   R!   R&   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR(     s    (   Rƒ   R„   R%   Ra   Rb   R(   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR“     s   g      @c
   -      C   s  |	 d k r t j }	 n  | d k r< t j ƒ  j ƒ  j } n  | rQ d | j _ n  | j	 ƒ  }
 |  j
 j ƒ  } d d l m } d d l m } d } | d k	 rç |  j ƒ  j d | j d | j d d d	 t ƒ } | j ƒ  | j ƒ  } n  t d
 d |	 ƒ| j d |  d d d | d | d |	 ƒ } | j ƒ  | j |
 ƒ | j ƒ  } | d k	 rŒ| j d | d | ƒ } |	 d IJ|	 d t | j ƒ IJn  | j | j ƒ | _ |	 d IJ|	 j ƒ  t d d |	 ƒ| j d |  d d d | d | d |	 ƒ } | j ƒ  | j |
 ƒ | j ƒ  } | j | j ƒ | _ |	 d IJ|	 j ƒ  d } d } |  j  ƒ  j! ƒ  r—t d d |	 ƒd } | rÒt" j# j$ d ƒ rÒ|  j% rÒd d l& } |	 d IJd } | j' j( d |  d | d |	 ƒ } n  | j d |  d | d | d | d | d |	 ƒ } | j ƒ  | j |
 ƒ | j ƒ  } | d k	 rk| j d | d | ƒ |	 d IJ|	 d t | j ƒ IJn  | j | j ƒ | _ |	 d IJ|	 j ƒ  n  d } | j) ƒ  } |  j
 j* ƒ  } | j+ d ƒ j, ƒ  } d d g } t | ƒ d k r¾d g } | g }  |  j  ƒ  j! ƒ  r,| j- d ƒ |  j- | ƒ n  x�t. | ƒ D]~\ }! }" d }# |" d k r„| d k	 r„| j d | j d | j ƒ }# n0 |  j ƒ  j d | j d | j d |" d	 t ƒ }# |# j ƒ  j/ ƒ  }$ |" d k rÛ|$ } n  g  }% xu | D]m }& |
 |& }' |$ j0 | |& ƒ }( |( |  |! k rèt1 d |' j2 ƒ  d  |' j3 d! |( d |" ƒ }) |% j- |) ƒ qèqèWt |% ƒ d k r9t d" |" d |	 ƒx |% D] }) |) j4 d |	 ƒ q†W|	 d IJ|% | |! <q9q9Wn  d }* |  j  ƒ  j! ƒ  r¹g  }* | d k r-|  j ƒ  j d | j d | j d d# d	 t ƒ }# |# j ƒ  j/ ƒ  } n  | j+ d$ ƒ j, ƒ  }+ xt |+ D]i }& | j0 | |& ƒ }( |( | k rI|
 |& }' t1 d |' j2 ƒ  d  |' j3 d! |( d d ƒ }) |* j- |) ƒ qIqIWn  t5 d% | d& | d' | d | d( | d) | d d* | d+ d, |* ƒ }, |, j6 d |	 ƒ | r|, | f S|, S(-   s%  
  Find peaks and holes in mFo-DFc map, plus flag solvent atoms with
  suspiciously high mFo-DFc values, plus anomalous peaks if anomalous data are
  present.  Returns a pickle-able object storing all this information (with
  the ability to write out a PDB file with the sites of interest).
  i    iÿÿÿÿ(   t
   find_peaks(   t   maptbxt   resolution_factort   symmetry_flagsR•   s   2mFo-DFct   use_all_datas   Positive difference map peaksR&   t   fmodels   mFo-DFcR"   t   paramsRu   t   mapt	   min_valueR…   s+   %d peaks remaining after 2mFo-DFc filterings   Negative difference map holess   Anomalous difference map peakst   anom_residualt   phaserNs   Will use Phaser LLG mapt   pdb_hierarchyt
   map_coeffss,   resname HOH and not (element H or element D)t	   anomalousR”   RQ   R   s   Water molecules with %s peakst   anoms+   not (resname HOH or element H or element D)R   R   R   R#   R   R   i   R$   (7   R   Ra   Rb   t   master_philt   fetcht   extractR–   t   map_next_to_modelt   min_model_peak_distt   atomst   xray_structuret	   unit_cellt   mmtbxt   cctbxR—   t   electron_density_mapt   fft_mapR˜   t   use_space_group_symmetryR   t   apply_sigma_scalingt   real_mapR   t   managert   peaks_mappedt   show_mappedR   t   filter_by_secondary_mapR6   Rj   t   orthogonalizet   flusht   f_obst   anomalous_flagt   libtbxt   envt
   has_modulet   twint   mmtbx.map_toolst	   map_toolst#   get_phaser_sad_llg_map_coefficientst   atom_selection_cachet
   sites_fract	   selectiont
   iselectionR€   Rn   t   real_map_unpaddedt   tricubic_interpolationR“   R”   RQ   R(   R   R)   (-   R›   R¡   Rœ   R"   R#   t   filter_peaks_by_2fofct   use_phaser_if_availablet   return_llg_mapt   include_peaks_near_modelR&   t	   pdb_atomsR¬   R–   R—   t   f_mapt   f_map_t   peaks_resultR   t	   n_removedt   holes_resultR   R¤   t   anom_map_coeffst   anom_map_typeR­   t   anom_resultt   anom_mapt   cacheRÄ   t
   water_iselt
   waters_outt	   map_typest   map_cutoffsRw   R•   R°   R³   t   suspicious_waterst   i_seqRM   t   rhoRU   R$   t   non_water_non_H_i_selt   all_results(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   find_peaks_holes  sH    			
		
		


		




		
	

							 	
		
			
		

	
c         C   s  | d  k r t j } n  d d  l } d } | j j d |  d t d | d t d t d t d	 | ƒ } | j	 } | j
 } | j d  k	 r¼ | j } | j d
 | j d d ƒ | j | d t ƒn  | j ƒ  t d | d | j d | j d | j d | j d | j d t d t d | j d | ƒ 
\ } }	 | j
 j }
 | j
 j rX| j d d |
 d | ƒ n  | j
 j rd d  l } d d  l } | j j j | ƒ \ } } |	 } | j  ƒ  j! ƒ  rÓ| d  k rÓ| j j j" | ƒ } n  | j# j$ d | d | d d |
 d | ƒ d |
 | _% n  | S(   Niÿÿÿÿs
  mmtbx.find_peaks_holes - difference map analysis
  Prints a summary of all peaks and holes above the specified cutoff in the
  mFo-DFc map, and flag any water molecules with suspiciously high peaks
  (possible ions).  Will also check the anomalous map if available.
t   argsR¥   R&   t   process_pdb_filet   create_fmodelt   prefer_anomaloust   usage_stringt   photont   tablet   sasakit   update_f_calcR›   R¡   Rœ   R"   R#   RÉ   RÊ   RË   RÌ   Rq   s   %s.pdbRu   t
   fwt_coeffst   delfwt_coeffss   %s_maps.mtzt   anom_coeffs(&   R   Ra   Rb   R   t   command_linet   load_model_and_dataR¥   t   FalseR   R›   Rœ   t
   wavelengthR«   t   set_inelastic_form_factorst   update_xray_structureR¹   Rá   R¡   R–   R"   R#   RÉ   RÌ   t   output_file_prefixt	   write_pdbR   t
   write_mapst   mmtbx.maps.utilst   iotbx.map_toolst   mapsR   t   get_maps_from_fmodelRº   R»   t   get_anomalous_mapRÁ   t   write_map_coeffsR    (   Râ   R&   R­   Ræ   t   cmdlineR›   Rœ   t   xrst   resultt   llg_mapt   prefixRY   RÎ   t   diff_mapRÖ   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   runØ  sb     						
						
c         C   sn   d d l  m } | |  ƒ |  j j j d k  rB t d d ƒ ‚ n  |  j j j d k rj t d d ƒ ‚ n  d  S(   Niÿÿÿÿ(   t   validate_input_paramsi    s<   The parameter 'Minimum distance from model' must be at leasts    zero.s<   The parameter 'Minimum cross distance' must be greater than s   zero.(   R   R  R–   R¨   R©   R   t   peak_searcht   min_cross_distance(   Rœ   t   callbackR  (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   validate_params  s    
t   launcherc           B   s   e  Z d  „  Z RS(   c         C   s/   t  j |  j ƒ t d t |  j ƒ d t j ƒ S(   NRâ   R&   (   t   ost   chdirt
   output_dirR  t   listRâ   Ra   Rb   (   R!   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR    s    (   Rƒ   R„   R  (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyR	    s   c         C   s1   g  } g  } |  d  k	 r' |  j ƒ  } n  | | f S(   N(   R   R‚   (   Rÿ   R�   t   stats(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt
   finish_job  s
    t   __main__i   ($   t
   __future__R    R­   R   t   scitbx.array_familyR   t   libtbx.str_utilsR   R   R¼   R   t   libtbx.utilsR   t   libtbx.philR   R   R
  Ra   R   R¥   t   master_paramst   objectR   R;   R“   R   R   Rð   Rá   R  R  t   target_with_save_resultR	  R  Rƒ   t   argv(    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/find_peaks_holes.pyt   <module>   s:   	5	¤'²7
	