ó
±™xTc           @   só   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	 Z	 d Z
 d „  Z d „  Z d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d d d d d e d d „ Z d d „ Z e d k rï e e	 j d ƒ n  d S(   iÿÿÿÿ(   t   division(   t   make_header(   t	   multi_out(   t
   group_argsNs¢  
  resolution_factor = 1/4.
    .type = float
    .help = Map grid spacing (multiplied times d_min).
  sidechains = True
    .type = bool
    .help = Remove poor sidechains
  mainchain = False
    .type = bool
    .help = Remove entire residues in poor density
  min_backbone_2fofc = 0.8
    .type = float
    .help = Minimum 2mFo-DFc sigma level at C-alpha to keep.  Residues with       C-alpha in density below this cutoff will be deleted.
  min_backbone_fofc = -3.0
    .type = float
    .help = Maximum mFo-DFc sigma level at C-alpha to keep.  Residues with       C-alpha in difference density below this cutoff will be deleted.
  min_sidechain_2fofc = 0.6
    .type = float
    .help = Minimum mean 2mFo-DFc sigma level for sidechain atoms to keep.       Residues with sidechains below this level will be truncated.
  max_sidechain_fofc = -2.8
    .type = float
    .help = Maximum mean 2mFo-DFc sigma level for sidechain atoms to keep.       Residues with sidechains below this level will be truncated.
  min_cc = 0.7
    .type = float
    .help = Minimum overall CC for entire residue to keep.
  min_cc_sidechain = 0.6
    .type = float
    .help = Minimum overall CC for sidechains to keep.
  min_fragment_size = 3
    .type = int
    .help = Minimum fragment size to keep.  Fragments smaller than this will       be deleted in the final step (based on the assumption that the adjacent       residues were already removed).  Set this to None to prevent fragment       filtering.
  check_cgamma = True
    .type = bool
    .help = Check for poor density at the C-gamma atom for long sidechains.        Useful in cases where the terminal atoms may have been misfit into       nearby density.
c          C   s'   d d l  m }  |  d t d d t ƒ S(   Niÿÿÿÿ(   t    generate_master_phil_with_inputst   enable_automatic_twin_detectiont   phil_strings?   
prune {
  %s
}
output {
  file_name = None
    .type = path
}
(   t   mmtbx.command_lineR   t   Truet   model_prune_master_phil(   R   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   get_master_phil8   s    	c         C   s    d | j  |  j | j | j f S(   Ns   %3s %s%4s%s(   t   resnamet   idt   resseqt   icode(   t   chaint   residue_groupt
   atom_group(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   id_strF   s    t   residue_summaryc           B   s&   e  Z d  d d d „ Z d d „ Z RS(   t   CCs   2mFo-DFct   residuec         C   sU   | j  |  _  | |  _ | j |  _ | j |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   R   t   chain_idR   R   t   scoret
   score_typet
   atoms_typet   map_type(   t   selfR   R   R   R   R   R   R   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   __init__K   s    				c         C   s‡   | d  k r t j } n  d |  j |  j |  j |  j f } |  j d  k	 ru | d | |  j |  j	 |  j
 |  j f IJn | d | IJd  S(   Ns   %3s %s%4s%ss   %s : %s %s %s = %.2fs#   %s : not part of a continuous chain(   t   Nonet   syst   stdoutR   R   R   R   R   R   R   R   (   R   t   outR   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   show\   s     N(   t   __name__t
   __module__R   R   R!   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyR   J   s   
t   prune_modelc           B   s/   e  Z d  „  Z d „  Z d „  Z d d „ Z RS(   c         C   s  t  | j ƒ  ƒ d k s t ‚ d d l m } d d l m } d d l m } | |  _	 | |  _
 | j ƒ  |  _ | j d | j ƒ }	 |	 j ƒ  j ƒ  |  _ | j d | j ƒ }
 |
 j ƒ  j ƒ  |  _ | j d | j ƒ } | j ƒ  j ƒ  |  _ | d d d	 | j ƒ  d
 d ƒ \ } |  _ d S(   sÙ   
    Removes atoms with poor electron density, as judged by several sigma-level
    cutoffs and overall CC.  This is basically an attempt to apply the same
    visual intuition we use when editing in Coot (etc.).
    i   iÿÿÿÿ(   t   set_detail_level_and_radius(   t   maptbx(   t   flext   resolution_factort   detailt	   automatict   d_mint   atom_radiusN(   t   lent   modelst   AssertionErrort   mmtbx.real_space_correlationR%   t   cctbxR&   t   scitbx.array_familyR'   t   paramst   pdb_hierarchyt	   unit_cellt   fft_mapR(   t   apply_sigma_scalingt   real_mapt   f_mapt   diff_mapt	   model_mapR+   R   R,   (   R   t   f_map_coeffst   diff_map_coeffst   model_map_coeffsR4   R3   R%   R&   R'   t	   f_map_fftt   diff_map_fftt   model_map_fftR)   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyR   g   s&    				c         C   sÀ  d d l  m } d d l m } | j ƒ  } | j ƒ  } | j ƒ  } | j ƒ  } x� | D]… } | j | j ƒ | j j	 ƒ  d k rW | j | j ƒ |  j
 j | j ƒ }	 | j |  j j |	 ƒ ƒ | j |  j j |	 ƒ ƒ qW qW Wt | ƒ d k rö d  S| j d |  j
 d |  j j ƒ  d	 |  j j ƒ  d
 | d t | |  j ƒ ƒ }
 |  j j |
 ƒ } |  j j |
 ƒ } |  j j |
 ƒ } | j d | d | ƒ j ƒ  } t d | d | j | ƒ d | j | ƒ ƒ S(   Niÿÿÿÿ(   R&   (   R'   t   Ht   Di    R5   t
   fft_n_realt
   fft_m_realt
   sites_cartt
   site_radiit   xt   yt   cct
   mean_2fofct	   mean_fofc(   RB   RC   (   R1   R&   R2   R'   t   vec3_doublet   doublet   appendt   xyzt   elementt   stripR5   t   fractionalizeR9   t   eight_point_interpolationR:   R-   R   t   grid_indices_around_sitest   focust   allt   get_atom_radiiR,   t   selectR;   t   linear_correlationt   coefficientR   t   mean(   R   t   atomsR&   R'   RF   t   sites_cart_nonHt   values_2fofct   values_fofct   atomt	   site_fract   selt	   f_map_selt   model_map_selt   diff_map_selRJ   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   get_map_stats_for_atoms‰   s8     		c         C   sO   |  j  j d | j ƒ } |  j j | ƒ } |  j j | ƒ } t d | d | ƒ S(   Nt	   site_cartt   two_fofct   fofc(   R5   RS   RP   R9   RT   R:   R   (   R   Ra   Rb   t   two_fofc_valuet
   fofc_value(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   get_density_at_atom§   s    c         C   s¤  | d  k r t j } n  d } d } d } g  } t d d | ƒx|  j j ƒ  d j ƒ  D]õ} | j ƒ  sr qZ n  i  } g  } t | j	 ƒ  ƒ d k rª | d | j
 IJn  x;t | j ƒ  ƒ D]'\ }	 }
 | d 7} |	 | |
 j ƒ  <x¹|
 j ƒ  D]«} t | |
 | ƒ } | j } t } g  } g  } xX | j ƒ  D]J } | j j ƒ  d+ k r[| j | ƒ q0| j d, k r0| j | ƒ q0q0Wt | ƒ d k r^|  j j r^|  j | ƒ } | j |  j j k  r| j t d | j
 d |
 d | d | j d d d d ƒ ƒ t } q^| j |  j j k  r^| j t d | j
 d |
 d | d | j d d d d ƒ ƒ t } q^n  | ss|  j | j ƒ  ƒ } | j |  j j  k  rÑ|  j j rÑ| j t d | j
 d |
 d | d | j ƒ ƒ t } qst | ƒ d k rs|  j j! rst } |  j | ƒ } | d  k rqð n  | j |  j j" k  rh| j t d | j
 d |
 d | d | j d d ƒ ƒ t } nÂ| j |  j j# k  rÀ| j t d | j
 d |
 d | d | j d d d d ƒ ƒ t } n^ | j |  j j$ k  r| j t d | j
 d |
 d | d | j d d d d d d ƒ ƒ t } n  |  j j% r*| d- k r*d  } } xP | j ƒ  D]B } | j j ƒ  d k rq| } qM| j j ƒ  d k rM| } qMqMW| d  k	 r*|  j& | ƒ } | j' d  k  sÛ| j' d! k  r'| j( d" k  r'| j t d | j
 d |
 d | d | j' d d d d d d# ƒ ƒ t } q'q*n  | rp|  j j! sBt) ‚ x | D] } | j* | ƒ qIW| d 7} qpqsn  | rð |  j j s‹t) ‚ |
 j+ | ƒ qð qð Wt |
 j ƒ  ƒ d k r½ | j, |
 ƒ | d 7} | j |
 j- ƒ  ƒ q½ q½ W|  j j rZ |  j j. d  k	 rZ t | j ƒ  ƒ } x4t | j ƒ  ƒ D]\ }	 }
 |
 j/ j ƒ  d$ k rRq+n  |
 j- ƒ  } t } | d | k s€|	 d k rðd% G| GHxd t0 d |  j j. d ƒ D]F } | | | k rÃt } Pq£|	 | t | j ƒ  ƒ k r£t } Pq£q£Wn  | r+| j t d | j
 d |
 d | d d  ƒ ƒ | j, |
 ƒ | j | ƒ | d 7} q+q+WqZ qZ Wx | D] } | j1 | ƒ qZW| d& | | f IJt2 d' | d( | d) | d* | ƒ S(.   Ni    s   Pruning residues and sidechainsR    i   s+   WARNING: chain '%s' has multiple conformerst   Nt   Ot   CRB   t   CAt   CBt   ALAt   GLYR   R   R   R   R   t   sigmaR   s   C-alphat	   sidechainR   s   mFo-Dfct   ARGt   LYSt   TYRt   TRPt   PHEt   CGt   CDgš™™™™™é?g      ð?g      Às   2mFo-Dfct    s
   candidate:s%   Removed %d residues and %d sidechainst   n_res_proteint   n_res_removedt   n_sc_removedt   outliers(   Rn   Ro   Rp   RB   Rq   Rr   (   Rs   Rt   (   Rw   Rx   Ry   Rz   R{   (3   R   R   R   R   R4   R.   t   chainst
   is_proteinR-   t
   conformersR   t	   enumeratet   residue_groupst   residt   atom_groupsR   R   t   FalseR]   t   nameRR   RO   R3   t	   mainchainRg   RK   t   min_backbone_2fofcR   R   RL   t   min_backbone_fofcRJ   t   min_cct
   sidechainst   min_cc_sidechaint   min_sidechain_2fofct   max_sidechain_fofct   check_cgammaRm   Ri   Rj   R/   t   remove_atomt   remove_atom_groupt   remove_residue_groupt   resseq_as_intt   min_fragment_sizeR   t   rangeR!   R   (   R   R    R€   R�   R   t   prunedR   t   residue_id_hasht   removed_resseqst   j_seqR   R   t	   ag_id_strR   R–   t   sidechain_atomst   backbone_atomsRa   t   mc_statst	   res_statst   remove_sidechaint   sc_statst   c_gammat   c_deltat
   map_valuest   n_rgR   t   removet   kt   outlier(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   process_residues­   s<    
			
			
!				
			
			
	
			

	 	


N(   R"   R#   R   Rg   Rm   R   R­   (    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyR$   f   s   	"		c         C   su   d d l  m } | j | g t |  ƒ ƒ } xB t |  ƒ D]4 \ } } | j j ƒ  j ƒ  d k r9 d | | <q9 q9 W| S(   Niÿÿÿÿ(   R'   RB   RC   g      ð?(   RB   RC   (   R2   R'   RN   R-   R†   RQ   RR   t   upper(   R]   R,   R'   t   radiit   i_seqRa   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyRX   S  s    t   2FOFCWTt   FOFCWTs   F-modelc	         C   s�  | d  k r t j } n  | d  k r? t ƒ  j ƒ  j ƒ  j } n  d d l m }	 |	 j	 |  d d ƒ}
 |
 j
 d ƒ |
 j j } | j ƒ  j ƒ  | j ƒ  j ƒ  |	 j	 | d d ƒ} | j
 d ƒ d  } } } x~ | j j D]p } | j ƒ  j } | d | k r| } qÚ | d | k r!| } qÚ | d | | d g k rÚ | j ƒ  } qÚ qÚ W| d  k rmt d | ƒ ‚ n> | d  k rŒt d	 | ƒ ‚ n | d  k r«t d
 | ƒ ‚ n  t d | d | d | d | d | ƒ j d | ƒ } | r}| d  k rt j j |  ƒ } t j j | ƒ d d } n  t | d ƒ } | j d d j |
 j j j  ƒ  ƒ ƒ | j | j! ƒ  ƒ | j" ƒ  | | _# n  | S(   Niÿÿÿÿ(   t   file_readert
   force_typet   pdbt   hkli    s   (+)s,   2mFo-DFc map not found (expected labels %s).s+   mFo-DFc map not found (expected labels %s).s&   Fc map not found (expected labels %s).R<   R=   R>   R4   R3   R    s   _pruned.pdbt   ws   %s
s   
($   R   R   R   R
   t   fetcht   extractt   prunet   iotbxR³   t   any_filet   assert_file_typet   file_objectt	   hierarchyR]   t   reset_i_seqt(   set_chemical_element_simple_if_necessaryt   file_servert   miller_arrayst   infot   labelst   average_bijvoet_matest   RuntimeErrorR$   R­   t   ost   patht   basenamet   splitextt   opent   writet   joint   inputt   crystallographic_sectiont   as_pdb_stringt   closet   output_file(   t   pdb_filet   map_coeffs_fileRÓ   R3   t   f_map_labelt   diff_map_labelt   model_map_labelt   write_modelR    R³   t   pdb_inR4   t   mtz_inR<   R=   R>   t   arrayRÅ   t   resultt	   base_namet   f(    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   run_post_refinement[  s^    
 		
c         C   s  | d  k r t j } n  d } d d l m } | d |  d t ƒ  d | d t d t ƒ } | j } | j	 } | j
 j d  k r¾ t j j | j j j d	 ƒ } t j j | ƒ d	 d
 | j
 _ n  t j j t j j | j
 j ƒ ƒ d	 d } t | d ƒ }	 t ƒ  }
 |
 j d | ƒ |
 j d |	 ƒ | j ƒ  } | j d d ƒ } | j d d ƒ } | j d d ƒ } t d | d | d | d | j d | j ƒ j d |
 ƒ } t | j
 j d ƒ } | j d ƒ | j | j j d | j ƒ ƒ | j ƒ  |	 j ƒ  | d | j
 j IJ| j
 j S(   Ns<  mmtbx.prune_model model.pdb data.mtz [options...]

Filters protein residues based on CC to 2mFo-DFc map and absolute
(sigma-scaled) values in 2mFo-DFc and mFo-DFc maps.  For fast automatic
correction of MR solutions after initial refinement (ideally with rotamer
correction) to remove spurious loops and sidechains.
iÿÿÿÿ(   t   load_model_and_datat   argst   master_philR    t   process_pdb_filet   create_fmodeli    s   _pruned.pdbs   .logR·   t   logR   s   2mFo-DFcs   mFo-DFct   FcR<   R=   R>   R4   R3   s#   REMARK edited by mmtbx.prune_model
t   crystal_symmetrys   Wrote %s(   R   R   R   R   Rá   R
   RŠ   R   R3   t   fmodelt   outputt	   file_nameRÈ   RÉ   RÊ   RÏ   Rµ   RË   RÌ   R   t   registert   electron_density_mapt   map_coefficientsR$   R4   Rº   R­   RÍ   RÑ   t   xray_structureRÒ   (   Râ   R    t   usage_stringRá   t   cmdlineR3   Ré   RÞ   t   log_fileRæ   t   out2t
   map_helperR<   R=   R>   RÝ   Rß   (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   run•  sN     				#%		

t   __main__i   (   t
   __future__R    t   libtbx.str_utilsR   t   libtbx.utilsR   t   libtbxR   RÈ   R   R	   R
   R   t   objectR   R$   RX   R   R   Rà   Rõ   R"   t   argv(    (    (    sL   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/command_line/prune_model.pyt   <module>   s*   -		í	1/