ó
Ü™xTc           @   s?  d  d l  m Z d  d l m Z d  d l 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 d  d l Z d  d l m Z d  d l m
 Z
 d  d	 l m Z d  d
 l m Z d e f d „  ƒ  YZ e e d d d „ Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d d d „ Z d S(   iÿÿÿÿ(   t   division(   t   maptbxN(   t   flex(   t   adptbx(   t   approx_equal(   t   kick(   t   adopt_init_args(   t	   map_tools(   t   millert   runc           B   st   e  Z d  d  e d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 e
 e d „ Z d „  Z d	 „  Z d
 „  Z RS(   i
   c	      	   C   s  t  |  t ƒ  ƒ |  j d  k r. t j |  _ n  |  j ƒ  |  j ƒ  |  _ |  j	 ƒ  |  j
 d t ƒ |  _ |  j j d |  j j ƒ  j ƒ  d t j d d ƒ |  _ t j d |  j ƒ j d d	 d
 t d t ƒ |  _ t j d |  j ƒ j d d	 d
 t d t ƒ |  _ |  j ƒ  |  _ |  j ƒ  }	 |  j d |	 ƒ }	 |  j d |	 ƒ t j d |	 d d ƒ j ƒ  }	 |	 d k  }
 |	 j |
 d ƒ } | d k }
 | j |
 d ƒ } |  j j  d |	 d t d t d t ƒ } t! j" j# d | d t d t ƒ |  _$ t% d |  j$ d |  j ƒ | |  _& d  S(   Nt   showt   d_mint   symmetry_flagst   resolution_factorg      ð?i   t   fmodelt   map_types   2mFo-DFct
   isotropizet   fill_missingt   mt   mapt   n_binsi'  g      à?i    i   t	   use_scalet   anomalous_flagt   use_sgt
   map_coeffst   b_onlyt   mct   cggUUUUUUÕ?('   R   t   localst   logt   Nonet   syst   stdoutt   prepare_f_obs_and_flagst   compute_original_mapt   mc_origt   remove_common_isotropic_adpt   create_fmodelt   TrueR   t   f_obst   crystal_griddingR   R   t   use_space_group_symmetryR   t   electron_density_mapt   map_coefficientst   FalseR   t   mc_fillt&   atom_selection_for_typical_volume_calct	   selectiont
   outer_loopt   low_volume_density_eliminationt   zero_below_thresholdt   volume_scalet   map_datat   set_selectedt   structure_factors_from_mapt   mmtbxt   mapst0   b_factor_sharpening_by_map_kurtosis_maximizationt	   mc_resultt   get_mapt
   map_result(   t   selfR'   t   r_free_flagst   xray_structuret   solvent_selectiont   n_inner_loopt   n_outer_loopt   use_omitR   R   t   selt   mskR:   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyt   __init__   sL    
 

				c         C   su   |  j  j d | ƒ } | j d |  j d | ƒ | j ƒ  } | j d | ƒ t d |  j d | d  d d |  j ƒ d  S(   Nt   column_root_labelt   miller_arrayt	   file_nameR   iüÿÿÿs   .ccp4R4   (	   R:   t   as_mtz_datasett   add_miller_arrayR#   t
   mtz_objectt   writet   ccp4_mapR(   R<   (   R=   RI   t	   fem_labelt
   orig_labelt   mtz_datasetRL   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyt   write_output_filesG   s    		c         C   s4   t  j d |  j d t ƒ ƒ j d d d t d t ƒ S(   NR   t   update_f_part1R   s   2mFo-DFcR   R   (   R   R*   R%   R,   R+   (   R=   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR"   Q   s
    	c   	      C   ss  t  j j d |  j d |  j ƒ } | j d t ƒ } t j d |  j d |  j ƒ } t	 d |  j
 d |  j d |  j ƒ } t j d |  j j ƒ  d	 d
 d d d d ƒ } x® t |  j ƒ D]� } t d |  j d | d | d |  j d |  j
 d | ƒ } |  j d | ƒ } t j d | d d
 d d ƒ |  j d | ƒ | t j | ƒ } | j d | ƒ q² W| j ƒ  } | j ƒ  } | | S(   Nt   coeffsR   t   deterministicR+   t   n1t   n2R   t   n_realt
   smearing_bi   t   max_peak_scaleid   t   smearing_spani   t   wamt   missingR(   t   nt   progress_counterR   R4   t
   index_spant
   n_averagesi   (   R7   R   t   model_missing_reflectionsR   R   t   get_missingR&   R   t   weighted_averaget   counterRA   RB   R   R   t   map_accumulatorR(   RX   t   xranget
   inner_loopR1   t   sharpenR2   R   t   maxt   addt   as_median_mapt   sample_standard_deviation(	   R=   t   missing_reflections_managerR]   R\   R_   Rf   t   iR   t   sd(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR0   X   s2    						c         C   sƒ   |  j  } t j | j ƒ  t j d ƒ ƒ } d G| GH| j d | ƒ t j | j ƒ  t j d ƒ ƒ } t | d d ƒ s t ‚ d  S(   Ni   s4   Max B subtracted from atoms and used to sharpen map:t   b_shifti    gü©ñÒMbP?(	   R?   R   t   mint   extract_u_iso_or_u_equivR   t   u_as_bt   shift_usR   t   AssertionError(   R=   t   xrst	   b_iso_min(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR$   s   s    	"	"c         C   s¨   |  j  j ƒ  d k } |  j  j | ƒ |  _  |  j j | ƒ |  _ xA |  j  |  j g D]- } | j ƒ  j ƒ  } | j ƒ  j | ƒ } qR W|  j  j |  j ƒ \ |  _  |  _ d  S(   Ni    (	   R'   t   datat   selectR>   t   as_non_anomalous_arrayt   merge_equivalentst   arrayt   set_observation_typet   common_sets(   R=   RD   t   mat   merged(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR!   {   s    c         C   s€   t  j j d |  j d |  j d |  j ƒ } | j d | ƒ | r| | j d t d t ƒ |  j	 d | j
 ƒ  | j ƒ  f IJn  | S(   NR'   R>   R?   RS   t   show_headert   show_approxs   r_work=%6.4f r_free=%6.4f(   R7   t   f_modelt   managerR'   R>   R?   t   update_all_scalesR
   R,   R   t   r_workt   r_free(   R=   RS   R
   R   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR%   „   s    		c         C   s_   t  d |  j d |  j d |  j j ƒ } |  j j t ƒ d k rO |  j | @} n | } | } | S(   NR(   R   R?   i    (   t   poor_atoms_selectionR(   R-   R   R?   R@   t   countR&   (   R=   t   selection_goodR/   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR.   �   s    		c         C   sÂ   g  t  d d ƒ D] } | d ^ q } | j ƒ  x‹ | D]ƒ } t } | d k rX t } n  t d | d |  j d | d | d	 d
 | d d d t d | d |  j ƒ 	} | d  k	 r7 | | } q7 q7 W| S(   Ni   i   g      $@g      à?R   R   t   c1t   c2g      Ð?t   cutofft   scalei   t   as_intt   zero_all_interblob_regionR/   (   t   ranget   reverseR,   R&   t   truncate_with_rootsR   R/   R   (   R=   R   Ro   t   rrt   cR‘   RE   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR1   œ   s    &
 	1c         C   s,   t  j d | d d d d d d d t ƒ d  S(	   NRy   t   substitute_valueg        t   less_than_thresholdg¸…ëQ¸Î?t   greater_than_thresholdiñØÿÿt   use_and(   R   t   resetR&   (   R=   R   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR2   ª   s    	N(   t   __name__t
   __module__R,   R   RF   RR   R"   R0   R$   R!   R&   R%   R.   R1   R2   (    (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR	      s   ,	
							c
      	   C   s  | | k s t  ‚ | d  k r{ | j j ƒ  }
 |	 d  k	 rK |
 j |	 ƒ }
 n  t j d |  d |
 d | j j ƒ  d | ƒ } n  | d  k s¡ t | | ƒ d d k r¥ d  St | | ƒ d } t j	 d |  d | ƒ } t j	 d |  d | ƒ } | j
 d | d	 | d
 | ƒ } | r| S| j ƒ  Sd  S(   NR4   t
   sites_cartt   crystal_symmetryRŽ   i   i    t	   thresholdt   connectivity_object_at_t1t"   elimination_volume_threshold_at_t1R‘   (   Rv   R   R?   Rž   Rz   R   t   peak_volume_estimateRŸ   t   intt   connectivityt   noise_elimination_two_cutoffst	   as_double(   R   R   RŒ   R�   RŽ   R�   R‘   R�   t   average_peak_volumeR/   Rž   t   co1t   co2t   result(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR”   ²   s,    	&		 c         C   s„  t  j d |  d | ƒ } | j ƒ  | j ƒ  } t j ƒ  } x* | j ƒ  D] } | j | j | ƒ ƒ qG W| d k  } | j	 ƒ  } | j
 d | ƒ j ƒ  }	 t  j d |  d |	 ƒ } | j ƒ  | j ƒ  }
 x· t | ƒ D]© \ } } t j d | j ƒ  d | j ƒ  d | j ƒ  d t j | g ƒ d	 t j d
 g ƒ ƒ } t j d | j | ƒ d |
 j | ƒ ƒ j ƒ  } | d k  rÒ t | | <qÒ qÒ W| S(   NR(   t   fourier_coefficientsg      ð?R?   t	   unit_cellt
   fft_n_realt
   fft_m_realRž   t
   site_radiig      ø?t   xt   ygffffffæ?(   R   t   fft_mapt   apply_sigma_scalingt   real_map_unpaddedR   t   doublet
   sites_fract   appendt   eight_point_interpolationRž   t!   structure_factors_from_scattererst   f_calct	   enumerateR   t   grid_indices_around_sitesR­   t   focust   allt   vec3_doublet   linear_correlationRz   t   coefficientR&   (   R(   R   R?   R³   R4   t	   rho_atomst	   site_fract   sel_excludeRž   R»   t	   map_data2t   i_seqt	   site_cartR/   t   cc(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR‰   Ë   s:    		
			
	 c         C   sc  t  j d | j ƒ  d d d d d d ƒ } xt | ƒ D]} | j d | d	 t j d
 d d d d d g ƒ d t j t d d d ƒ ƒ d d d t j d d d g ƒ ƒ } t j t t	 g ƒ rÙ t
 j d | d d ƒ } n  t d | d | ƒ }	 |	 t j |	 ƒ }	 |	 d
 k  }
 |	 j |
 d
 ƒ }	 | j d |	 ƒ | j ƒ  q7 W| j ƒ  } | j ƒ  } | | } | S(   NRX   RY   i   RZ   id   R[   i   R]   t   random_scalei    i   i   i   t   random_seediýÖ” i'  t   n_cyclest   fraction_keepgÍÌÌÌÌÌì?gffffffî?g      ð?R   t   number_of_kicksR   R   R4   (   R   Rf   RX   Rg   t'   random_weight_averaged_map_coefficientst   randomt   choiceR’   R&   R,   R   t   randomize_struture_factorsR;   R   Rj   R5   Rk   R
   Rl   Rm   (   R   R\   R]   R(   R^   R_   t   mact   jt   mc_wR   RD   t   mmRp   t   r(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyRh   ñ   s,    	!
c         C   s,   t  j d | d |  ƒ } | j ƒ  | j ƒ  S(   NR(   R¬   (   R   R³   R´   Rµ   (   R   R   R³   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR;   	  s
    		
Re   c           B   s   e  Z d  „  Z d „  Z RS(   c         C   sP   t  |  t ƒ  ƒ d |  _ |  j |  j d k s5 t ‚ d |  j |  j |  _ d  S(   Ni    g      Y@(   R   R   R^   RV   RW   Rv   t   progress_scale(   R=   RV   RW   R   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyRF     s    	c         C   sJ   |  j  d 7_  |  j j d d t |  j  |  j ƒ f ƒ |  j j ƒ  d  S(   Ni   s   %s %d%%s   FEM loop: done so far:(   R^   R   RM   R¤   RØ   t   flush(   R=   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyR
     s
    	(   Rœ   R�   RF   R
   (    (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyRe     s   	c         C   s™   | | g j  d  ƒ d k s! t ‚ | d  k rE t d | d |  ƒ } n  d d l m } | j d | d |  j ƒ  d |  j ƒ  d	 | d
 t	 j
 d g ƒ ƒ d  S(   Ni   R   R   iÿÿÿÿ(   RN   RI   R­   t   space_groupR4   t   labelst    (   RŠ   R   Rv   R;   t   iotbxRN   t   write_ccp4_mapR­   RÚ   R   t
   std_string(   R   RI   R   R4   RN   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyRN     s    !	(   t
   __future__R    t   cctbxR   t
   mmtbx.mapsR7   t   mmtbx.map_toolsRÐ   t   scitbx.array_familyR   R   t   libtbx.test_utilsR   R   R   t   libtbxR   R   R   t   objectR	   R&   R,   R   R”   R‰   Rh   R;   Re   RN   (    (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/fem.pyt   <module>   s*   £	&		