ó
Ç™xTc           @   sÐ   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 d  d l
 m Z d  d l m Z d Z e j j d	 e ƒ Z d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d d „ Z d S(   iÿÿÿÿ(   t   division(   t   flexN(   t   adopt_init_args(   t   maptbx(   t   format_value(   t   print_statisticssï  
peak_search_level = 1
  .type=int
max_peaks = 0
  .type=int
  .short_caption=Maximum peaks
interpolate = True
  .type=bool
min_distance_sym_equiv = None
  .type=float
  .short_caption=Minimum distance between symmetry-equivalent atoms
general_positions_only = False
  .type=bool
min_cross_distance = 1.8
  .type=float
  .short_caption=Minimum cross distance
min_cubicle_edge = 5
  .type=float
  .short_caption=Minimum edge length of cubicles used for     fast neighbor search
  .expert_level=2
s*    use_sigma_scaled_maps = True
    .type=bool
    .help = Default is sigma scaled map, map in absolute scale is used             otherwise.
  resolution_factor = 1./4.
    .type=float
  map_next_to_model
    .expert_level=2
    .style = noauto
  {
    min_model_peak_dist = 1.8
      .type=float
      .short_caption = Minimum distance from model
    max_model_peak_dist = 6.0
      .type=float
      .short_caption = Maximum distance from model
    min_peak_peak_dist = 1.8
      .type=float
      .short_caption = Minimum distance between peaks
    use_hydrogens = False
      .type = bool
      .short_caption = Use hydrogens
  }
  max_number_of_peaks = None
    .type=int
    .expert_level=1
  peak_search
    .expert_level=1
    .short_caption = Search settings
    .style = box auto_align
  {
    %s
  }
t   peaks_holderc           B   s)   e  Z d d  „ Z d „  Z e d „ Z RS(   c         C   s=   t  | ƒ t  | ƒ k s t ‚ | |  _ | |  _ | |  _ d  S(   N(   t   lent   AssertionErrort   heightst   sitest   iseqs_of_closest_atoms(   t   selfR	   R
   R   (    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyt   __init__F   s    		c         C   sy   d } d } xf | t  |  j ƒ k  rt | j |  j | ƒ } | | k  rg |  j | =|  j | =| d 7} q | d 7} q W| S(   Ni    i   (   R   R
   t   tricubic_interpolationR	   (   R   t   mapt	   min_valuet	   n_deletedt   kt	   map_value(    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyt   filter_by_secondary_mapL   s    

c         C   s•   d d l  m } | j |  j d | ƒ} |  j j | ƒ } |  j j | ƒ } d  } |  j d  k	 rv |  j j | ƒ } n  | |  _ | |  _ | |  _ d  S(   Niÿÿÿÿ(   R   t   reverse(   t   scitbx.array_familyR   t   sort_permutationR	   t   selectR
   t   NoneR   (   R   R   R   t	   selectiont   heights_sortedt   sites_sortedt   iseqs_sorted(    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyt   sortY   s    		N(   t   __name__t
   __module__R   R   R   t   FalseR   (    (    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyR   E   s   	t   managerc           B   sA   e  Z d d e d e e d d  „ Z d „  Z d „  Z d „  Z RS(   c         C   sç  t  |  t ƒ  ƒ | d  k	 s. |
 d  k	 s. t ‚ t |  _ d  |  _ |  j d  k r^ t j	 |  _ n  |  j
 d  k r t j ƒ  |  _
 n  |
 d  k	 rê |
 j d |  j
 j d t j ƒ } |  j
 j rË | j ƒ  d } n | j ƒ  d } | j ƒ  } nç | r]d d  l } | j j d |  j d | ƒ } | j j d |  j
 j d t j ƒ } | j ƒ  | j ƒ  } d } nt |  j j ƒ  j d |  j
 j d t j d |  j d | ƒ } |  j
 j rµ| j ƒ  d } n | j ƒ  d } | j ƒ  } | j ƒ  } | j ƒ  } |  j
 j } |  j
 j d  k r&|  j j j  ƒ  j! ƒ  d	 } n  t } |  j" d
 k  r]|  j" d 9_" t# } | d 9} n  |  j
 j$ j% } | d  k r�|  j j j% ƒ  } n  t j& d |  j
 j$ j' d |  j
 j$ j( d |  j" d |  j
 j$ j) d | d |  j
 j$ j* d |  j
 j$ j+ d |  j
 j$ j, ƒ } |  j j- ƒ  d k rã|  j j. ƒ  d k rã| j$ d | d | ƒ j/ d | ƒ } | j0 ƒ  } | ro| d 9} n  t1 d | d | j2 ƒ  ƒ |  _ |  j3 sã|  j d |  j t4 d |  j" ƒ j5 ƒ  | t4 d |  j j2 j! ƒ  ƒ f IJqãn  d  S(   Nt   resolution_factort   symmetry_flagst   sigmas   e/A**3iÿÿÿÿt   fmodelt   map_typet   use_all_datai   i    t   peak_search_levelt	   max_peakst   peak_cutofft   interpolatet   min_distance_sym_equivt   general_positions_onlyt   min_cross_distancet   min_cubicle_edgegñhãˆµøä>t
   parametersR   t   max_clustersg      ð¿R	   R
   s6   Number of peaks found at %s map (map cutoff=%s %s)= %ss   %-5.2fs   %-12d(6   R   t   localsR   R   R!   t   mappedt   peaks_t   logt   syst   stdoutt   paramst   master_paramst   extractt   fft_mapR#   R   t   use_space_group_symmetryt   use_sigma_scaled_mapst   apply_sigma_scalingt   apply_volume_scalingt   real_map_unpaddedt
   mmtbx.mapst   mapst   kickR&   t   map_coefficientst   electron_density_mapR'   t   n_realt   tagst   max_number_of_peakst   xray_structuret
   scattererst   sizet
   map_cutofft   Truet   peak_searchR-   t   peak_search_parametersR)   R*   R,   R.   R/   R0   t   r_workt   r_freet   allR	   R   R
   t   silentR   t   strip(   R   R&   R'   RM   R9   R6   t   use_kick_mapt   kick_map_paramsR(   RT   t
   map_coeffsR<   t	   map_unitst   fft_map_datat   mmtbxt   kmt   gridding_n_realt   crystal_gridding_tagsRI   t   negativeR-   RP   t   cluster_analysisR	   (    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyR   f   s–    		  	
	
		
				
	
		*		
c         C   s   |  j  S(   N(   R5   (   R   (    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyt   peaks·   s    c         C   s�  |  j  d  k r d  S|  j t k s( t ‚ |  j j j } |  j j j } | d  k r[ d } n  | d  k ry t	 t
 j ƒ } n  |  j j j ƒ  } d  } |  j j j s° | j ƒ  } n  |  j  j j ƒ  } |  j sÛ |  j d IJn  | j d |  j  j d | d | ƒ } | j } | j } | d k }	 | | d k }
 | | d k } |
 | @|	 @} | j j | ƒ } t d |  j  j j | ƒ d	 | j j | ƒ d
 | ƒ } t j | j |	 ƒ ƒ } t j | d ƒ } t j  | d ƒ } |  j s|  j d | | f IJ|  j d | | | j j ƒ  | f IJn  t j | j | ƒ ƒ } t j | d ƒ } t j  | d ƒ } |  j sw|  j d | | f IJn  t! |  _ | |  _  | S(   Ng        s+   Filter by distance & map next to the model:t
   sites_fract   distance_cutofft   use_selectioni    i   R	   R
   R   s)      mapped sites are within: %5.3f - %5.3fsL      number of sites selected in [dist_min=%5.2f, dist_max=%5.2f]: %d from: %d("   R5   R   R4   R!   R   R9   t   map_next_to_modelt   max_model_peak_distt   min_model_peak_distt   floatR7   t   maxintR&   RJ   t   deep_copy_scattererst   use_hydrogenst   hd_selectionR
   RL   RT   R6   t   closest_distancest   smallest_distances_sqt   smallest_distancest   i_seqsR   R   R	   Rb   R   t   sqrtt   min_defaultt   max_defaultRN   (   R   t   max_distt   min_distRJ   Rd   t   initial_number_of_sitest   resultRn   Ro   t   in_boxt   not_too_fart   not_too_closeR   R   Ra   t   sdt   d_mint   d_max(    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyt   peaks_mappedº   sZ     						
			c         C   sž  |  j  d  k r d  S|  j ƒ  } | j d  k r= t d ƒ ‚ n  |  j j j ƒ  } | j ƒ  | j ƒ  k sm t	 ‚ | j
 j ƒ  | j j ƒ  k s‘ t	 ‚ | j j ƒ  | j j ƒ  k sµ t	 ‚ |  j J|  j j j ƒ  j } xÆ t j d | j ƒ D]¯ } | j
 | } | j | } | j | } | | }	 | | |	 j ƒ }
 |	 j ƒ  } |  j d | | | j ƒ  |
 f IJ|
 |  j j j k s{t	 ‚ |
 |  j j j k sç t	 ‚ qç Wd  S(   Ns   iseqs_of_closest_atoms is Nonet   datas*   peak= %8.3f closest distance to %s = %8.3f(   R5   R   Ra   R   t   RuntimeErrorR&   RJ   RK   RL   R   R
   R	   R6   t	   unit_cellt   distanceR   R   t   sitet   element_symbolt   id_strR9   Re   Rf   Rg   (   R   t	   pdb_atomsRa   RK   t   distt   it   st   ht   i_seqt   sct   dt   element(    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyt   show_mappedè   s,     $$

N(	   R   R    R   R!   RN   R   Ra   R~   R�   (    (    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyR"   e   s   O		.c   	      C   sî   | d  k r t j } n  t j d | d | ƒt j ƒ  } d | j _ d | j _	 d | j
 _ t | j _ x| | d f | d f g D]b } t j | d d | ƒt d |  d d	 d
 | d d | d | ƒ } | j ƒ  | j d | ƒ q„ Wd  S(   Ns/   residual map %s: highest peaks and deepst holest   outgffffffæ?Ra   t   holesi   R&   R'   s   mFobs-DFmodelRM   i    R9   R6   R†   (   R   R7   R8   R   t   make_headerR:   R;   Re   Rg   t   min_peak_peak_distRO   R/   RN   Rk   t   make_sub_headerR"   R~   R�   (	   R&   R†   R'   t   map_cutoff_plust   map_cutoff_minusR6   t	   fp_paramst   parRw   (    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyt$   show_highest_peaks_and_deepest_holesÿ   s$     
	
(   t
   __future__R    t   cctbx.array_familyR   R7   t   libtbxR   t   cctbxR   t   libtbx.philt   libtbx.str_utilsR   t   mmtbx.refinementR   t   peak_search_params_strt   philt   parseR:   t   objectR   R"   R   R™   (    (    (    s>   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/find_peaks.pyt   <module>   s   	" Ÿ