ó
È™xTc        
   @   sÝ  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 Z 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 Z d Z d e Z d „  Z d „  Z d d „ Z d d „ Z d „  Z d „  Z d „  Z  d d „ Z! d d e" d „ Z# d d d d „ Z$ d „  Z% d „  Z& d e' f d „  ƒ  YZ( d d d d d d d d e" d „	 Z) d  „  Z* e+ e+ e+ d! d" d# d& d d$ „ Z, d d% „ Z- d S('   iÿÿÿÿ(   t   divisionN(   t   reflection_file_reader(   t   reflection_file_utils(   t   flex(   t   miller(   t   maptbx(   t   Sorryt   null_out(   t
   group_args(   t   StringIOsf  atom_radius = None
  .type = float
  .help = Atomic radius for map CC calculation. Determined automatically if           if None is given
  .expert_level = 2
hydrogen_atom_radius = None
  .type = float
  .help = Atomic radius for map CC calculation for H or D.
  .expert_level = 2
resolution_factor = 1./4
  .type = float
use_hydrogens = None
  .type = bool
s  %s
scattering_table = *n_gaussian wk1995 it1992 neutron
  .type = choice
  .help = Scattering table for structure factors calculations
detail = atom residue *automatic
  .type = choice(multi=False)
  .help = Level of details to show CC for
map_1
  .help = First map to use in map CC calculation
{
 type = Fc
   .type = str
   .help = Electron density map type. Example xmFobs-yDFcalc (for            maximum-likelihood weighted map) or xFobs-yFcalc (for simple            unweighted map), x and y are any real numbers.
 fill_missing_reflections = False
   .type = bool
 isotropize = False
   .type = bool
}
map_2
  .help = Second map to use in map CC calculation
{
 type = 2mFo-DFc
   .type = str
   .help = Electron density map type. Example xmFobs-yDFcalc (for            maximum-likelihood weighted map) or xFobs-yFcalc (for simple            unweighted map), x and y are any real numbers.
 fill_missing_reflections = True
   .type = bool
 isotropize = True
   .type = bool
}
pdb_file_name = None
  .type = str
  .help = PDB file name.
reflection_file_name = None
  .type = str
  .help = File with experimental data (most of formats: CNS, SHELX, MTZ, etc).
data_labels = None
  .type = str
  .help = Labels for experimental data.
high_resolution = None
  .type=float
low_resolution = None
  .type=float
c           C   s   t  j j t d t ƒS(   Nt   process_includes(   t   iotbxt   philt   parset   master_params_strt   False(    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   master_paramsR   s    c         C   so   t  j j d |  ƒ } | j ƒ  } | j ƒ  } | j ƒ  j ƒ  t j j	 d | d | d d  ƒ t d | d | ƒ S(   Nt	   file_namet   scattering_tablet   xray_structuret   d_mint   pdb_hierarchy(   R   t   pdbt   inputt   xray_structure_simplet   construct_hierarchyt   atomst   reset_i_seqt   mmtbxt   utilst   setup_scattering_dictionariest   NoneR   (   t   pdb_file_nameR   t   pdb_inpR   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt
   pdb_to_xrsU   s    c         C   sý   d  } |  j d  k	 rù t j d |  j ƒ } t j d | d t d | g ƒ } t j j	 ƒ  j
 ƒ  } t | _ |  j d  k	 rŠ |  j g | _ n  |  j d  k	 r¨ |  j | _ n  |  j d  k	 rÆ |  j | _ n  t j j d | d | d d d	 t d
 t ƒ  ƒ } n  | S(   NR   t   crystal_symmetryt   force_symmetryt   reflection_filest   reflection_file_servert
   parameterst   data_descriptions
   X-ray datat   extract_r_free_flagst   log(   R   t   reflection_file_nameR   t   any_reflection_fileR   R&   t   TrueR   R   t   data_and_flags_master_paramst   extractR   t#   force_anomalous_flag_to_be_equal_tot   data_labelst   labelst   high_resolutiont   low_resolutiont   determine_data_and_flagsR	   (   t   paramsR#   t   data_and_flagst   reflection_fileR&   R'   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   extract_data_and_flagsb   s.    			c         C   sk   | j  d |  ƒ j ƒ  } | j d | ƒ } | d  k rU | j d t d | ƒ d d  ƒ St j d | d | ƒ S(   NR   t   d_maxt   resolution_factorg      à?t   symmetry_flagst   crystal_griddingt   fourier_coefficients(   t   structure_factorst   f_calct   resolution_filterR   t   fft_mapt   minR   (   R3   R4   R   t   grid_resolution_factorR=   R@   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   compute_map_from_model{   s    		c         C   sÁ   d \ } } |  d  k	 r9 t j j |  j ƒ r9 |  j } n  | j d  k	 ri t j j | j ƒ ri | j } n  | | g j d  ƒ d k r“ t d ƒ ‚ n  d  } | d  k	 r® | } n | } | | _ d  S(   Ni   s   PDB file must be provided.(   NN(   R   R   R   t   is_pdb_fileR   R    t   countR   (   t   pdb_fileR6   t   fn1t   fn2t   result(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   extract_input_pdb‡   s    !$ 	c         C   sÁ   d \ } } |  d  k	 r9 t j j |  j ƒ r9 |  j } n  | j d  k	 ri t j j | j ƒ ri | j } n  | | g j d  ƒ d k r“ t d ƒ ‚ n  d  } | d  k	 r® | } n | } | | _ d  S(   Ni   s!   Reflection file must be provided.(   NN(   R   t   ost   patht   isfileR   R+   RG   R   (   t   hkl_fileR6   RI   RJ   RK   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   extract_input_data”   s    ! 	c         C   s0   | d d IJ| |  IJ| d t  |  ƒ IJd  S(   Nt   -iO   t   *(   t   len(   t   mR*   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt	   broadcast¢   s    
c         C   sà  | d  k r t j } n  t |  ƒ }  d } t |  ƒ d k sZ |  d g k sZ |  d g k r” | | IJt d d d | ƒ t ƒ  j d | d	 d
 ƒ d  Sd d l m	 } d  } d  } g  } xç |  D]ß } t
 j j | ƒ rY| | ƒ }	 |	 j d k r| j |	 j ƒ qœ|	 j d k r|	 } qœ|	 j d k r3|	 } qœt d d | t |	 j ƒ f ƒ ‚ q½ y | j t j j | ƒ ƒ Wq½ t k
 r›}
 t d | ƒ ‚ q½ Xq½ Wt ƒ  j d | d t ƒ \ } } t | ƒ d k rþx | D] } t | ƒ GHqÚWt d ƒ ‚ n  | j ƒ  } t d | d | ƒ t d d | j d | ƒ t d | j d | j ƒ } | j j d | d	 d
 ƒ t d | d | ƒ t d d | j  d | ƒ t! d | ƒ } | j" j# d | d	 d
 ƒ | j" j$ d t% j& | j" j' ƒ  t( ƒ ƒ } t) j* j+ d | j g d | j d  | j" d! | ƒ } t d d" d | ƒ | j d | d# t( ƒ | j, ƒ  } | j- d$ | j. j/ d% | j. j0 d& | j. j1 ƒ } | j- d$ | j2 j/ d% | j2 j0 d& | j2 j1 ƒ } t3 d' | d( | j4 d | d) t d | ƒ } d  S(*   Ns  
Compute map correlation coefficient given input PDB model and reflection data.

Examples:

  phenix.real_space_correlation m.pdb d.mtz
  phenix.real_space_correlation m.pdb d.mtz detail=atom
  phenix.real_space_correlation m.pdb d.mtz detail=residue
  phenix.real_space_correlation m.pdb d.mtz data_labels=FOBS
  phenix.real_space_correlation m.pdb d.mtz scattering_table=neutron
  phenix.real_space_correlation m.pdb d.mtz detail=atom use_hydrogens=true
  phenix.real_space_correlation m.pdb d.mtz map_1.type=Fc map_2.type="2mFo-DFc"
i    s   --helps	   --optionsRU   s   Default parameres:R*   t   outt   prefixs     iÿÿÿÿ(   t   any_fileR   R   t   hkls7   Don't know how to deal with the file %s - unrecognized s7   format '%s'.  Please verify that the syntax is correct.s5   Unrecognized parameter or command-line argument '%s'.t   sourcest   track_unused_definitionss   Unused parameters: see above.RH   R6   s   Input PDB file name: %sR    R   t   fRP   s   Input reflection file name: %st   datat   xray_structurest   f_obst   r_free_flagss'   R-factors, reflection counts and scalest   show_headert   map_typet   fill_missingt
   isotropizet   fmodelR   t   show_results(5   R   t   syst   stdoutt   listRT   RV   R   t   showt   iotbx.file_readerRY   RM   RN   RO   t	   file_typet   appendt   file_objectR   t   strR   R   R   t   RuntimeErrort   fetchR-   R/   RL   R    R"   R   R   t   show_summaryRQ   R+   R9   R`   t   show_comprehensive_summaryt   arrayR   t   boolt   sizeR   R   R   t   fmodel_simplet   electron_density_mapt   map_coefficientst   map_1t   typet   fill_missing_reflectionsRe   t   map_2t   simpleR   (   t   argst   command_nameR*   t   msgRY   RH   R8   t   phil_objectst   argt   inpt   et   working_philt   unusedt   uR6   t   pdboR7   Ra   Rf   t	   e_map_objt   coeffs_1t   coeffs_2t   results(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   cmd_run§   sŽ     0
  	 							c         C   s¥  | d  k r t ƒ  j ƒ  } n  | d  k r6 t j } n  |  j ƒ  } | j d | j j d | j j	 d | j j
 ƒ } | j d | j j d | j j	 d | j j
 ƒ } | j d | j ƒ } | j ƒ  | j ƒ  }	 t j d | d | ƒ }
 |
 j ƒ  |
 j ƒ  } t d d d	 | ƒ t j d
 |	 j ƒ  d | j ƒ  ƒ j ƒ  } | d | j j | j j | f IJ| j | j } } t d | d | d |  j ƒ  j ƒ  ƒ \ } } | j } | d  k ré| j d k s×|  j ƒ  j ƒ  d k ràt } qét } n  | j } | d  k r| j d k r| } qd } n  t  d | d |  j! j" ƒ  d |	 j# ƒ  d |	 j$ ƒ  d |	 d | d | d | d | d | ƒ 
} | r¡t% d	 | d | d | d | ƒ n  | S(   NRc   Rd   Re   R;   R=   R>   RU   s   Map correlation and map valuesR*   t   xt   ys     Overall map cc(%s,%s): %6.4ft   detailt   atom_radiusR   t   neutrong333333ó?i   R   t	   unit_cellt
   fft_n_realt
   fft_m_realR{   R~   t   use_hydrogenst   hydrogen_atom_radiusRŽ   R6   (&   R   R   R/   Rh   Ri   Ry   Rz   R{   R|   R}   Re   R~   RB   R;   t   apply_sigma_scalingt   real_map_unpaddedR   RV   R   t   linear_correlationt   as_1dt   coefficientR’   R“   t   set_detail_level_and_radiusR`   R   R˜   R   R-   R   R™   t   computeR   R•   t   focust   allRk   (   Rf   R   R6   R*   Rg   R‹   RŒ   R�   t	   fft_map_1R{   t	   fft_map_2R~   t
   overall_ccR’   R“   R˜   R™   RŽ   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyR     sj      		
		
!	'						"c      
   C   sð   | d  k	 s- | | g j d  ƒ d k s- t ‚ | | g j d  ƒ d k rd | j j | j j } } n  |  J|  d | | f IJ|  J| d k r™ |  d IJn
 |  d IJd } x@ | D]8 } |  | | j | j | j | j	 | j
 | j f IJq° Wd  S(   Ni    i   s   Rho1 = %s, Rho2 = %st   atoms7    <----id string---->  occ     ADP      CC   Rho1   Rho2s2     <id string>    occ     ADP      CC   Rho1   Rho2s    %s %4.2f %7.2f %7.4f %6.2f %6.2f(   R   RG   t   AssertionErrorR{   R|   R~   t   id_strt	   occupancyt   bt   cct   map_value_1t   map_value_2(   R*   RŽ   R’   R6   t
   map_1_namet
   map_2_namet   fmtt   r(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyRk   ;  s    -
%c
         C   s�  | d k s t  ‚ g  }
 x~|  j ƒ  D]p} xg| j ƒ  D]Y} xP| j ƒ  D]B} x9| j ƒ  D]+} d | j | j | j | j | j	 f } t
 j ƒ  } t
 j ƒ  } t
 j ƒ  } t
 j ƒ  } t
 j ƒ  } t
 j ƒ  } x¾| j ƒ  D]°} d | | j f } | j ƒ  r|	 } n | } | j ƒ  o%| sá | j | j | j ƒ ƒ } | j | j | j ƒ ƒ } | j | j ƒ | j | j ƒ | j | j ƒ | j | ƒ | j | ƒ | j | ƒ | d k r‘t j d | d | d | d t
 j | j g ƒ d	 t
 j | g ƒ ƒ } t
 j d
 | j | ƒ d | j | ƒ ƒ j ƒ  } t d | j d | d | d | d | d | d | j d | j d d ƒ 	} |
 j | ƒ q‘qá qá W| d k r^ t | ƒ d k r^ t j d | d | d | d | d	 | ƒ } t
 j d
 | j | ƒ d | j | ƒ ƒ j ƒ  } t d | d | j d | d | d t
 j | ƒ d t
 j | ƒ d t
 j | ƒ d t
 j | ƒ d | j ƒ  ƒ 	} |
 j | ƒ q^ q^ WqK Wq8 Wq% W|
 S(   NR¦   t   residues   %2s %1s %3s %4s %1ss   %s %4sR•   R–   R—   t
   sites_cartt
   site_radiiR�   R‘   t   chain_idR¨   R«   R¬   R­   Rª   R©   t   n_atomsi   i    (   s   atoms   residue(   R§   t   chainst   residue_groupst
   conformerst   residuest   idt   altloct   resnamet   resseqt   icodeR   t   vec3_doublet   doubleR   t   namet   element_is_hydrogent   eight_point_interpolationt   fractionalizet   xyzRn   Rª   t   occR   t   grid_indices_around_sitesRœ   t   selectRž   R   RT   t   meanRw   (   R   R•   R–   R—   R{   R~   R’   R“   R˜   R™   RŽ   t   chaint   residue_groupt	   conformerR²   t   r_id_strt   r_sites_cartt   r_bt   r_occt   r_mv1t   r_mv2t   r_radR¦   t   a_id_strt   radR¬   R­   t   selR«   RK   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyR    K  sŽ    
 									 c         C   s²   |  d	 k s t  ‚ |  d k r< | d k  r3 d }  q< d }  n  | d  k r¨ | d k  r] d } q¨ | d k r~ | d k  r~ d } q¨ | d k rŸ | d k  rŸ d } q¨ d } n  |  | f S(
   NR¦   R²   t	   automaticg       @g      ð?g      ø?g      @g      @(   s   atoms   residueRØ   (   R§   R   (   R’   R“   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyRŸ   œ  s     		 	 	 		t    selection_map_statistics_managerc           B   sM   e  Z d  Z d d d d d d d g Z d e d	 „ Z d d d e d
 „ Z RS(   sÕ   
  Utility class for performing repeated calculations on multiple maps.  Useful
  in post-refinement validation, ligand fitting, etc. where we want to collect
  both CC and values for 2mFo-DFc and mFo-DFc maps.
  R—   R–   t   atom_selectiont   sitest
   sites_fract
   atom_radiit   map_selg      ø?c         C   sŸ  | |  _  | |  _ t | t j ƒ r3 | j ƒ  } n  t | ƒ d k s[ | j d ƒ s[ t ‚ | r† | j	 ƒ  j ƒ  } | j
 | ƒ } n  t | ƒ d k sž t ‚ | |  _ | j ƒ  j | ƒ |  _ | j ƒ  j | ƒ |  _ | j ƒ  j | ƒ } t j |  j j ƒ  | ƒ |  _ xU t | ƒ D]G \ }	 }
 |
 j ƒ  j ƒ  j ƒ  d k r| sNt ‚ d |  j |	 <qqWt j d | j ƒ  d | d | d	 |  j d
 |  j ƒ |  _ d  S(   Ni   i    t   ht   dg      ð?R•   R–   R—   R³   R´   (   Rß   Rà   (   R—   R–   t
   isinstanceR   Rv   t
   iselectionRT   t   all_eqR§   t   hd_selectiont   intersectionRÚ   R³   RÉ   RÛ   RÜ   t
   scatterersRÁ   Rw   RÝ   t	   enumeratet   element_symbolt   stript   lowerR   RÈ   R•   RÞ   (   t   selfRÚ   R   R—   R–   R“   t   exclude_hydrogenst   not_hd_selectionRæ   t   i_seqt   sc(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   __init__±  s0    		(			c         C   s  | j  ƒ  |  j k r* | j ƒ  |  j k s0 t ‚ | j |  j ƒ } t j ƒ  } d
 } }	 }
 | d
 k	 r¹ | j  ƒ  |  j k r’ | j ƒ  |  j k s˜ t ‚ | j |  j ƒ } t j ƒ  }
 n  xL |  j
 D]A } | j | j | ƒ ƒ | d
 k	 rÃ |
 j | j | ƒ ƒ qÃ qÃ Wd
 } | d
 k	 rq| rAt j d | d |
 ƒ j ƒ  } n t j d | d | ƒ j ƒ  } t j |
 ƒ }	 n  d
 } } | d
 k	 rŸ| | k  j t ƒ } n  | d
 k	 rÃ| | k j t ƒ } n  t d | d t j | ƒ d t j | ƒ d t j | ƒ d | d | d	 |	 ƒ S(   s×   
    Extract statistics for the given map, plus statistics for the model map
    if given.  The CC can either be calculated across grid points within the
    given radius of the sites, or at the sites directly.
    R�   R‘   R«   RC   t   maxRÊ   t   n_below_mint   n_above_maxt
   model_meanN(   R¡   R–   R¢   R—   R§   RÉ   RÞ   R   RÁ   R   RÜ   Rn   RÄ   Rœ   Rž   RÊ   RG   R-   R   RC   Rñ   (   Rë   t   mapt	   model_mapRC   Rñ   t   compare_at_sites_onlyRÞ   t
   map_valuest   model_map_selt   model_map_meant   model_map_valuest	   site_fracR«   Ró   Rò   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   analyze_mapÑ  sB    0
N(   t   __name__t
   __module__t   __doc__t	   __slots__R   Rð   R   Rý   (    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyRÙ   ¨  s   	g      Ð?s   2mFo-DFct   Fmodelg      ø?c
         C   s&  |  d k	 r t |  ƒ d k s$ t ‚ | d k	 rÌ | d k rT | d k rT | d k sZ t ‚ | j ƒ  }
 |
 j | ƒ } | j d | ƒ j ƒ  j ƒ  } |
 j | ƒ } | j d | ƒ j ƒ  j ƒ  } | j } nE d | | | g k sç t ‚ t	 | t
 j ƒ rt	 | t
 j ƒ st ‚ |	 r¹| j ƒ  } t |  ƒ j d k r�t
 j ƒ  } x( |  D]  } | | sK| j | ƒ qKqKW| }  t |  ƒ d k s¶t ‚ q¹t |  ƒ j d k s«t ‚ |  | M}  n  t d |  d | d | j ƒ  d | j ƒ  d	 |	 ƒ } | j d
 | d | ƒ } t d | j d | j d | j ƒ S(   s´   
  Simple-but-flexible function to give the model-to-map CC and mean density
  values (sigma-scaled, unless pre-calculated maps are provided) for any
  arbitrary atom selection.
  i    R;   t   size_tRv   RÚ   R   R–   R—   Rì   Rõ   Rö   R«   t	   map1_meant	   map2_meanN(   R   RT   R§   Ry   Rz   RB   Rš   t   real_mapR   Rá   R   RÁ   Rä   R|   Rþ   R  Rn   RÙ   R¡   R¢   Rý   R   R«   RÊ   Rô   (   RÚ   Rf   R;   t   map1t   map2R   t	   map1_typet	   map2_typeR“   Rì   t   edmt   map1_coeffst   map2_coeffsRä   t   atom_selection_newRî   t   managert   stats(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt!   map_statistics_for_atom_selectionû  sJ    $*		*
					c         K   s;   |  j  ƒ  } | j ƒ  } | j d ƒ s. t ‚ t | | � S(   sp   
  Shortcut to map_statistics_for_atom_selection using a PDB hierarchy object
  to define the atom selection.
  i    (   R   t   extract_i_seqRã   R§   R  (   t   fragmentt   kwdsR   t   i_seqs(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   map_statistics_for_fragment3  s    gš™™™™™é?g      ð?g      à?c
   $      C   sJ  |	 d  k r t ƒ  }	 n  |  j }
 t | j ƒ  ƒ |
 j ƒ  j ƒ  k sK t ‚ |  j ƒ  } | j	 d d d t
 ƒ } | j d d ƒ j ƒ  j ƒ  } | j	 d d d t
 ƒ } | j d d ƒ j ƒ  j ƒ  } |
 j ƒ  } |
 j ƒ  } g  } xb| j ƒ  d j ƒ  D]J} xA| j ƒ  D]3} | j ƒ  } t | ƒ d k r;| r;qn  x | j ƒ  D]ò} | j | k rcqHn  | j ƒ  } t | ƒ d k s‡t ‚ t | ƒ d k r¥| r¥qHn  | rÁ| d j sÁqHqÁn  t d	 | d
 | d | d |  j d t ƒ } d } } } xu | D]m } | | j rq n  | d 7} | j } | j | ƒ } | j | ƒ } | | k  rc| d 7} n  | | 7} q W| | }  | | }! | j | k  s¬|! | k s¬|  | k  rHd | j | j | j | j ƒ  f }" | j  ƒ  j! ƒ  }# | j" |" |# f ƒ |	 d |" IJ|	 d | j IJ|	 d | |! f IJ|	 d |  IJqHqHWqWqø W| S(   NRc   s   2mFo-DFcRd   R;   g      Ð?t   Fci    i   R  R  R  R   Rì   s   %1s%3s%2s%5ss   Suspicious residue: %ss#     Overall CC to 2mFo-DFc map = %.2fs0     Fraction of atoms where 2mFo-DFc < %.2f = %.2fs     Mean 2mFo-DFc value = %.2f(#   R   R   R   RT   R   Ræ   Rw   R§   Ry   Rz   R   RB   Rš   R›   R•   Rä   t   modelsR·   R¸   t   atom_groupsR½   t   heteroR  R-   Rî   RÆ   RÅ   t   tricubic_interpolationR«   R¼   R»   t   residt   extract_xyzRÊ   Rn   ($   Rf   R   t   hetatms_onlyt   skip_single_atomst   skip_alt_confst   min_acceptable_cct   min_acceptable_2fofct   max_frac_atoms_below_mint   ignore_resnamesR*   R   R  t   map_coeffs1R  t   map_coeffs2R  R•   Rä   t   outliersRË   RÌ   R  t
   atom_groupR   t	   map_statsRò   t   n_heavyt   sumR¦   t   siteRü   t	   map_valuet   map_meant   frac_below_mint   residue_infot   xyz_mean(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   find_suspicious_residues=  s‚     	*									
	

	c            s†  ˆ d k r |  j ƒ  ‰ n  |  j ƒ  ‰ |  j ƒ  ‰ |  j ƒ  ‰ t ‡ ‡ ‡ ‡ ‡ f d † } ‡  f d †  } | d ƒ } | | d t ƒ\ } } ~ | d ƒ }	 | |	 ƒ }
 ~	 | d ƒ } | | ƒ } ~ | d ƒ } | | d t ƒ\ } } ~ g  } xg t ˆ ƒ D]Y \ } } ˆ | rPt j	 d | | d	 | | ƒ j
 ƒ  } | j | ƒ q| j d ƒ qWt d
 | d |
 d | d | d | ƒ S(   sþ   
  Memory-efficient routine for harvesting map values for individual atoms
  (e.g. waters).  Only one FFT'd map at a time is in memory.

  :param selection: optional atom selection (flex array)
  :returns: group_args object with various simple metrics
  c            s#  g  } g  } |  d  k r6 | s% t ‚ d  g t ˆ  ƒ SxÒ t ˆ  ƒ D]Ä \ } } ˆ | rí ˆ | } | j |  j | ƒ ƒ | rt j d ˆ d |  j ƒ  d |  j	 ƒ  d t
 j ˆ | g ƒ d t
 j d g ƒ ƒ } | j |  j | ƒ ƒ qqC | j d  ƒ | j d  ƒ qC W| r| | f S| Sd  S(   NR•   R–   R—   R³   R´   g      ø?(   R   R§   RT   Rç   Rn   RÄ   R   RÈ   R¡   R¢   R   RÀ   RÁ   RÉ   (   Rõ   t   get_selectionst   valuest
   selectionsRî   R¦   Rü   R×   (   t	   pdb_atomst	   selectionR³   RÜ   R•   (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   collect_map_values—  s,    

	
c            s>   ˆ  j  d |  ƒ } | d  k	 r: | j d d ƒ j ƒ  j ƒ  Sd  S(   NRc   R;   g      Ð?(   Rz   R   RB   Rš   R›   (   Rc   t
   map_coeffs(   Rf   (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   get_map°  s    	s   2mFo-DFcR3  s   mFo-DFct	   anomalousR  R�   R‘   t   two_fofc_valuest   fofc_valuest   anom_valuest   fmodel_valuest   two_fofc_ccsN(   R   Rä   R³   RÜ   R•   R   R-   Rç   R   Rœ   Rž   Rn   R   (   R   R6  Rf   R7  R8  R:  t   two_fofc_mapt   two_fofct   two_fofc_selt   fofc_mapt   fofct   anom_mapt   anomt
   fmodel_mapt   f_model_valt   f_model_selR@  Rî   R¦   R«   (    (   Rf   R6  R7  R³   RÜ   R•   sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt"   extract_map_stats_for_single_atoms‰  s@    	
(    (.   t
   __future__R    t   mmtbx.utilsR   R   R   R   t
   iotbx.philt	   iotbx.pdbt   cctbx.array_familyR   t   cctbxR   R   t   libtbx.utilsR   R   t   libtbxR   t	   cStringIOR	   RM   Rh   t   core_params_strR   R   R"   R   R9   RE   RL   RQ   RV   R�   R   R   Rk   R    RŸ   t   objectRÙ   R  R  R-   R2  RK  (    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/real_space_correlation.pyt   <module>   s^   1
					Z:	Q	U.	C