ó
Û™xTc           @   s5  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
 Z d  d l m Z d  d l Z d „  Z d d	 d
 d d d g d „ Z d e f d „  ƒ  YZ d d „ Z d d d	 d
 d d d g d „ Z e d „ Z d d e d „ Z d d d „ Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   flexN(   t   miller(   t   maptbx(   t   approx_equalc         C   s,   t  j d | d |  ƒ } | j ƒ  | j ƒ  S(   Nt   crystal_griddingt   fourier_coefficients(   R   t   fft_mapt   apply_sigma_scalingt   real_map_unpadded(   t
   map_coeffsR   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   get_map   s
    		
i    gš™™™™™¹?gš™™™™™É?g333333Ó?gš™™™™™Ù?g      à?c      	   C   sY   t  d |  d | ƒ } | d  k r* | } n+ t j d | d | d t j | ƒ d t ƒ | S(   NR
   R   t
   map_data_1t
   map_data_2t
   thresholdst   average(   R   t   NoneR   t   intersectionR   t   doublet   True(   R
   R   t   map_dataR   t   m(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   compute_map_and_combine   s     		t   weighted_averagec           B   s   e  Z d  „  Z d d „ Z RS(   c         C   sÍ   | j  ƒ  |  _ | |  _ | j ƒ  j  ƒ  } | | } t | j ƒ  ƒ j  ƒ  t | j ƒ  ƒ j  ƒ  } | j ƒ  j ƒ  } t | | ƒ t | | ƒ |  _ | d  k r¼ t	 j
 | j ƒ  d ƒ } n  | | |  _ d  S(   Ni   (   t   datat   map_coefficients_datat   map_coefficientst   f_obst   abst   f_model_scaled_with_k1t   sigmast   rR   R   R   t   sizet   so(   t   selft   fmodelR   t   f_ot   i_ot   i_ct   sig(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   __init__"   s    	
!c         C   sÑ   |  j  j ƒ  |  j j ƒ  k o2 |  j j ƒ  k n s= t ‚ t j d |  j  d |  j d |  j d | d | d | ƒ } |  j j d | ƒ } | d  k	 r² | j
 d | d	 t ƒ } n  | j t j | j ƒ  | ƒ ƒ S(
   NR   t	   r_factorst   sigma_over_f_obst   random_scalet   random_seedt   n_cyclesR   t   othert   scale(   R   R    R   R!   t   AssertionErrorR   t   fem_averaging_loopR   t   customized_copyR   t   complete_withR   t   selectR   t   random_bool(   R"   R+   R,   R-   t   fraction_keept   missingt   mc_datat   mc_wa(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt'   random_weight_averaged_map_coefficients/   s    					N(   t   __name__t
   __module__R(   R   R:   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyR   !   s   	i
   c   	      C   sE  d  } d d l m } x(t | ƒ D]} | d k rY |  j t j |  j ƒ  d ƒ ƒ } n |  j ƒ  } t	 d | d | ƒ } t
 j d | d d	 d
 d d d d t ƒ t
 j d | d d ƒ j ƒ  } | d  k	 rí t
 j d | d d ƒ j ƒ  } n  | j d | d | d t j g  t d d d ƒ D] } | d ^ qƒ d t ƒ } q# W| S(   Niÿÿÿÿ(   t   femi    g®Gáz®ï?R
   R   R   t   substitute_valueg        t   less_than_thresholdg      à?t   greater_than_thresholdiñØÿÿt   use_andt   mapt   n_binsi'  t   m1t   m2R   i7   i   g      Y@R   (   R   t
   mmtbx.mapsR=   t   xrangeR4   R   R5   R    t	   deep_copyR   R   t   resetR   t   volume_scaleR   R   R   t   range(	   R
   R   R-   t
   map_filterR=   t   cyclet   mcR   t   i(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   randomize_completeness2@   s(    $	!2c      
   C   s~   d  } xq t | ƒ D]c } | d k rI |  j t j |  j ƒ  d ƒ ƒ } n |  j ƒ  } t d | d | d | d | ƒ } q W| S(   Ni    gffffffî?R
   R   R   R   (   R   RG   R4   R   R5   R    RH   R   (   R
   R   R-   R   R   RM   RN   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   randomize_completenessY   s    $c   
      C   s  d  } xº t | ƒ D]¬ } t j d  d! d" d# d$ d% d& d' d( d) g
 ƒ \ } } } | r^ d } n  t j |  j ƒ  | ƒ } |  j d | d | d | ƒ }	 | d  k r¯ |	 j ƒ  } q | |	 j ƒ  } q W| | } t	 j
 d |  j ƒ  d |  j ƒ  d t ƒ j d | ƒ S(*   Ngš™™™™™¹?i(   gš™™™™™É?g
×£p=
·?g333333Ó?g{®Gáz´?i   gš™™™™™Ù?gìQ¸…ë±?g      à?g¸…ëQ¸®?i   g333333ã?gš™™™™™©?gffffffæ?g{®Gáz¤?gš™™™™™é?g¸…ëQ¸ž?i
   gÍÌÌÌÌÌì?g{®Gáz”?g      ð?g{®Gáz„?i    t   amplitude_errort   phase_error_degt	   selectiont   crystal_symmetryt   indicest   anomalous_flagR   (   gš™™™™™¹?gš™™™™™¹?i(   (   gš™™™™™É?g
×£p=
·?i(   (   g333333Ó?g{®Gáz´?i   (   gš™™™™™Ù?gìQ¸…ë±?i   (   g      à?g¸…ëQ¸®?i   (   g333333ã?gš™™™™™©?i   (   gffffffæ?g{®Gáz¤?i   (   gš™™™™™é?g¸…ëQ¸ž?i
   (   gÍÌÌÌÌÌì?g{®Gáz”?i
   (   g      ð?g{®Gáz„?i
   (   R   RG   t   randomt   choiceR   R5   R    t   randomize_amplitude_and_phaseR   R   t   setRU   RV   t   Falset   array(
   R
   t   number_of_kickst   phases_onlyt   map_coeff_datat   kickt   rct   art   prt   selRN   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   randomize_struture_factorsh   s2    	 		 
	gffffffî?c   
      C   sö   d  } | d k r0 t d |  d | d | ƒ } n  x¿ t | ƒ D]± } d | GH| d k rv t d |  d | d | ƒ }	 n |  j ƒ  }	 | d  k	 r© |	 j d | d	 t ƒ }	 n  | rÓ |	 j t j	 |	 j
 ƒ  | ƒ ƒ }	 n  t d |	 d | d | ƒ } q= W| S(
   Ni    R
   R   R   s     %dR^   R_   R.   R/   (   R   R   RG   Rf   RH   R3   R   R4   R   R5   R    (
   R
   R   R^   t   macro_cyclesR7   t   kick_completenessR_   R   t   itRN   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   kick_map_coeffs‚   s*    	$c            sÕ  |  j  ƒ  } |  j ƒ  j d t j |  j ƒ  j ƒ  j ƒ  d ƒ ƒ } t j j	 d |  j
 ƒ  d |  j ƒ  d |  j ƒ  d |  j ƒ  d |  j  ƒ  d |  j ƒ  d	 |  j ƒ  d
 | ƒ }	 |  j ƒ  }
 |	 j ƒ  } t |
 | d ƒ sç t |
 | g ƒ ‚ ‡  f d †  } d „  } d  } xÉ t | ƒ D]» } d | GHt d | d | ƒ } | d |	 ƒ }	 |	 j d | ƒ | d |	 ƒ } | d  k	 rˆ| j | d t ƒ} n  | r²| j t j | j ƒ  | ƒ ƒ } n  t d | d | d | ƒ } qW| S(   NR   i    R   t   r_free_flagst   k_isotropict   k_anisotropict   f_calct   f_part1t   f_part2t   f_maskg-Cëâ6?c            s"   |  j  ƒ  j d ˆ  d t d t ƒ S(   Nt   map_typet
   isotropizet   fill_missing(   t   electron_density_mapR   R   R\   (   t   fm(   Rr   (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   get_mc¸   s    c         S   sI   t  j d d g ƒ } t j |  j ƒ  j ƒ  j ƒ  | ƒ } | |  j _ |  S(   Ngš™™™™™©?gÍÌÌÌÌÌì?(	   RX   RY   R   R5   R   RV   R    t   _r_free_flagst   _data(   R#   Rb   Rk   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   recreate_r_free_flags½   s    $s     %dR
   R^   R#   Rv   R/   R   R   (   t   f_model_no_scalesRn   R2   R   t   complex_doubleR   R    t   mmtbxt   f_modelt   managerR   Rk   Rl   Rm   Ro   Rp   t   r_workR   R0   R   RG   Rf   t   updateR3   R   R4   R5   R   (   R#   Rr   R   R^   Rg   R7   Rh   R~   t   zerot	   fmodel_dct   r1t   r2Rw   Rz   R   Ri   t   f_model_kickRN   (    (   Rr   s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   kick_fmodel¡   sD    '	$			$t   runc           B   sJ   e  Z d  Z d d
 d
 d d d e d „ Z d d „ Z d „  Z d	 „  Z RS(   sš   
  Note 1: Assume Fmodel has correct scaling already (all f_parts etc).
  Note 2: More macro_cycles can substantially clean map in extremely bad cases.
  s   2mFo-DFcid   i
   gffffffî?c	         C   s:  |  j  d | ƒ } d d l m }	 |	 j d | ƒ j d d d t d t ƒ |  _ t d |  j d	 | ƒ }
 |	 j	 d | d |  j d
 d  d t d t ƒ |  _ t d |  j d	 | ƒ } |  j j |  j ƒ |  _ t d |  j d	 | d | d | d |  j d | ƒ } |  j d | ƒ |  _ t d | d | d	 | d | d | d |  j d | ƒ } |  j d | ƒ |  _ | rwt j j j d d d	 | d d d | j ƒ  d t d d ƒ } t d | j d	 | d | d | d t d |  j d | ƒ } |  j d | ƒ |  _ t j j j d d d	 | d d d | j ƒ  d t d d ƒ } t d | j d	 | d | d | d t d |  j d | ƒ } |  j d | ƒ |  _ n  d „  } | | d } | | | d t ƒ} | | | d t ƒ} | rë| | | d t ƒ} | | | d t ƒ} n  | | |
 d t ƒ} | | | d t ƒ} | |  _ |  j d |  j ƒ |  _ d  S(   NR#   iÿÿÿÿ(   t	   map_toolsRr   s   2mFo-DFcRs   Rt   R
   R   t   pdb_inpt   use_model_hlt   fillR^   Rg   R7   Rh   R   s   mFo-DFct   n_debias_cyclesi   t   full_resolution_mapt   box_size_as_fractiong¸…ëQ¸ž?R_   c         S   sW   t  j d |  d | d t j d d d d d d	 g ƒ d
 t ƒ | rO |  | d S|  Sd  S(   NR   R   R   i    gš™™™™™¹?gš™™™™™É?g333333Ó?gš™™™™™Ù?g      à?R   i   (   R   R   R   R   R\   (   RD   RE   t   use_average(    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt	   intersect,  s    	! R�   (   t   convert_to_non_anomalousR}   R‰   Ru   R   R   R\   t   mc_origR   t   resolve_dm_mapR   t   complete_sett   lone_setR7   Rj   t   map_coeffs_from_mapt   mc_kickR‡   t   mc_fmt   mapst   composite_omit_mapRˆ   RH   t   mc_com1t   mc_com2t   map_data_resultt	   mc_result(   R"   R#   Rr   t	   mask_dataR   R^   Rg   Rh   t   omitR‰   t   md_origt   md_complete_sett   md_kickt   md_fmt   com1t   md_com1t   com2t   md_com2R‘   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyR(   Ú   sš    
																		s   mc.mtzc         C   sÔ   |  j  j d d ƒ } | j d |  j d d ƒ | j d |  j d d ƒ t r‚ | j d |  j d d ƒ | j d |  j d d ƒ n  | j d |  j d d ƒ | j d |  j	 d d	 ƒ | j
 ƒ  } | j d
 | ƒ d  S(   Nt   column_root_labelR“   t   miller_arrayR˜   R™   Rœ   R�   RŸ   R•   t	   file_name(   R“   t   as_mtz_datasett   add_miller_arrayR˜   R™   R¡   Rœ   R�   RŸ   R•   t
   mtz_objectt   write(   R"   R¬   t   mtz_datasetR¯   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   write_mc?  s,    								
				c      	   C   s%   |  j  j d | d t d t d t ƒ S(   NRB   t	   use_scaleRW   t   use_sg(   R“   t   structure_factors_from_mapR   R\   (   R"   R   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyR—   W  s
    c         C   sk   | j  ƒ  j ƒ  rg | j  ƒ  j ƒ  } | j ƒ  j ƒ  } t j j d | d | d | j ƒ } | j ƒ  n  | S(   NR   Rk   t   xray_structure(	   R   RW   t   average_bijvoet_matesRk   R}   R~   R   R¶   t   update_all_scales(   R"   R#   R   Rk   (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyR’   ^  s    N(	   R;   R<   t   __doc__R   R   R(   R²   R—   R’   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyRˆ   Ô   s   \	(   t
   __future__R    t   scitbx.array_familyR   RX   t   cctbxR   R   t   libtbx.test_utilsR   t   mmtbx.f_modelR}   t   mmtbx.maps.composite_omit_mapR   R   t   objectR   RP   RQ   R\   Rf   R   Rj   R‡   Rˆ   (    (    (    s=   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/maps/kick.pyt   <module>   s*   	,