ó
ò™xTc           @   s³   d  d l  m Z d  d l Z d  d l Z d  d l m Z m Z m Z m Z d  d l	 m
 Z
 d  d l m Z d  d l m Z d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d „  Z d S(   iÿÿÿÿ(   t   divisionN(   t   maptbxt   millert   sgtbxt   xray(   t   flex(   t   approx_equal_relatively(   t   xfranget   solvent_accessible_volumec           B   sD   e  Z e d d d d d e d „ Z d „  Z d „  Z d d „ Z RS(   i   i   c         C   so  | |  _  | d  k rc t j d | j ƒ  d | j ƒ  d | d | d | d t j d |
 ƒ ƒ |  _ n	 | |  _ |
 rDt j	 j
 | d |	 ƒj } | j d	 t j | ƒ | ƒ } t j ƒ  } | j ƒ  j } x_ t | j ƒ  | j ƒ  ƒ D]B \ } } x3 | D]+ } | j | j d
 | | j ƒ  ƒ ƒ ƒ qö Wqã Wt j d | d | ƒ } n | j ƒ  } t j	 j
 | d |	 ƒ|  _
 t j	 j d | j ƒ  d | j ƒ  j ƒ  d | j ƒ  d |  j
 j d |  j j ƒ  d | d | ƒ |  _ |
 rÿ|  j j  ƒ  } | j  ƒ  j! |  j j" ƒ n  t j	 j# |  j j" | j ƒ  ƒ |  _# t$ g |  j# j% ƒ  |  _& |  j' ƒ  |  j j" j( ƒ  | j ƒ  j) ƒ  |  _* d  S(   Nt	   unit_cellt   space_group_infot   stept   d_mint   resolution_factort   symmetry_flagst   use_space_group_symmetryt   tablet   buffer_thicknesst   sitet   crystal_symmetryt
   scattererst   space_group_order_zt
   sites_fract
   atom_radiit   gridding_n_realt   solvent_radiust   shrink_truncation_radius(+   t   xray_structuret   NoneR   t   crystal_griddingR	   R
   R   t   search_symmetry_flagst   cctbxt   maskst	   vdw_radiiR   t   asu_mappingsR   t   maxt   xray_scatterert   fractionalizet   zipR   t   mappingst   appendt   customized_copyt   mapped_siteR   t	   structuret   expand_to_p1t   around_atomst   space_groupt   order_zR   t   n_realt   maskt   tagst   apply_symmetry_to_maskt   datat
   flood_fillt   Falset   n_voidst   exclude_void_flagst   n_solvent_grid_pointst   sizet   volumeR   (   t   selfR   R   R   t   ignore_hydrogen_atomsR   t	   grid_stepR   R   t   atom_radii_tableR   R   R"   t   scatterers_asu_plus_buffert   fract   scR'   t   mappingt   xsR2   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyt   __init__   sT    
						"'	c         C   s   |  j  j ƒ  S(   N(   R5   R7   (   R<   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyR7   E   s    c         C   sI   t  g  t |  j ƒ  ƒ D], } |  j | s |  j j j | d ƒ ^ q ƒ S(   Ni   (   t   sumt   rangeR7   R8   R1   R4   t   count(   R<   t   i(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyR9   H   s    c         C   s¹   | d  k r t j } n  | d |  j j IJ| d |  j j IJ| d IJ|  j j d | ƒ | J| d |  j d |  j |  j	 j
 ƒ  j ƒ  f IJ|  j ƒ  } | J|  j j d | ƒ d  S(   Ns   solvent_radius: %.2fs   shrink_truncation_radius: %.2fs   van der Waals radii:t   logs<   Total solvent accessible volume / cell = %.1f Ang^3 [%.1f%%]id   (   R   t   syst   stdoutR1   R   R   R!   t   showR   R   R	   R;   R7   R5   t   show_summary(   R<   RJ   R7   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyRN   L   s     

Ng      Ð?(   t   __name__t
   __module__R6   R   RE   R7   R9   RN   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyR      s   /		R1   c           B   s•   e  Z e d  „ Z e d d d d e d „ Z d d „ Z d „  Z d „  Z d d d „ Z	 d	 „  Z
 d
 „  Z d „  Z d „  Z d d „ Z d „  Z RS(   c         C   s…   | |  _  | j ƒ  j ƒ  |  _ | |  _ | rB |  j j ƒ  |  _ n	 d  |  _ d  |  _ d  |  _ d  |  _	 d  |  _
 d  |  _ d  |  _ d  S(   N(   R   t   as_intensity_arrayt   average_bijvoet_matest   fo2t   use_set_completiont   complete_setR   R1   t   _f_maskt   f_000t   f_000_st
   f_000_cellt   _electron_counts_per_void(   R<   R   t   observationsRT   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyRE   `   s    								i   i   c	         C   sâ   | d  k	 r d  }	 n |  j j ƒ  }	 t |  j | | d | d | d | d |	 d | d | d | ƒ}
 |
 j |  _ |
 j |  _ |
 j |  _ |
 j |  _ t	 g |  j j
 ƒ  |  _ |  j ƒ  |  j j j ƒ  |  j j ƒ  j ƒ  |  _ d  S(   NR=   R   R>   R   R   R?   R   (   R   RS   R   R   R   R   R!   R1   R5   R6   R7   R8   R9   R4   R:   R	   R;   (   R<   R   R   R=   R   R>   R   R?   R   R   t   result(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyt   computeo   s(    	 		i
   c         C   s˜  |  j  d k	 s t ‚ |  j ƒ  d k r+ d S|  j r@ |  j } n |  j j ƒ  } | j |  j	 d d ƒj
 ƒ  |  _
 |  j ƒ  } t j | j ƒ  ƒ t j t j |  j
 j ƒ  ƒ ƒ |  _ | j d |  j |  j
 ƒ } |  j	 j ƒ  j ƒ  |  j j ƒ  |  _ d } x”t | ƒ D]†} t j |  j | ƒ |  _ |  j j ƒ  |  j j ƒ  } |  j j ƒ  j |  j  j j ƒ  d k d ƒ } |  j  ƒ  }	 xØ t |  j ƒ  ƒ D]Ä }
 |  j  j |
 d k } |  j! |
 rÌ| j | d ƒ q�n  | j" ƒ  j | d ƒ } t j | ƒ |  j } | |  j j ƒ  |  j j ƒ  |	 } | d k  r�| j | d ƒ d } t# |  j! |
 <q�q�Wt j | ƒ |  j |  _$ |  j$ | j% ƒ  | j% ƒ  |  j  ƒ  } |  j& d k	 r½t' |  j& | d ƒ r½Pn	 | |  _& | j( |  j  j j ƒ  d k |  j& |  j	 j ƒ  j ƒ  ƒ | j) d | ƒ |  _* |  j* |  j 9_* g  } g  } d	 } xt+ | d
 d ƒ D]ó } |  j, d | ƒ } t j | j ƒ  ƒ t j t j | j ƒ  ƒ ƒ } t j t j d | t j | j ƒ  ƒ t j | j ƒ  ƒ ƒ ƒ t j d | t j | j ƒ  ƒ ƒ } | j- | ƒ | j- | ƒ t. | | ƒ } | | k rJ| } | } qJqJW| |  _ |  j, d | ƒ } |  j ƒ  } | j/ | ƒ j d |  j |  j
 ƒ } qW|  j* S(   sB   P. van der Sluis and A. L. Spek, Acta Cryst. (1990). A46, 194-201.i    Nt	   algorithmt   directi   i   g-Cëâ6?t   mapiè  gÍÌÌÌÌÌì?gš™™™™™É¿t   epsilon(0   R1   R   t   AssertionErrorR7   RT   RU   RS   t   sett!   structure_factors_from_scatterersR   t   f_calct   f_obsR   RF   R4   t   abst   scale_factort   f_obs_minus_f_calcR	   R;   R   t   n_grid_pointst	   fft_scaleRG   R   t   fft_mapt   diff_mapt   apply_volume_scalingt
   statisticst   real_map_unpaddedt   set_selectedt	   as_doubleR9   R8   t	   deep_copyt   TrueRW   R:   RX   R   t   add_selectedt   structure_factors_from_mapRV   R   t   f_modelR(   t   mint   phase_transfer(   R<   t
   max_cyclest
   f_calc_setRf   Ri   t   epsilon_for_min_residualRI   t   statst   masked_diff_mapR9   t   jt	   selectiont	   diff_map_RW   RX   t   scalest	   residualst   min_residualRa   t   f_model_t   scalet   residualt   scale_for_min_residualRw   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyt   structure_factors�   sŒ     		13'	c         C   sÒ   |  j  j ƒ  } | j ƒ  } |  j rÎ |  j d  k	 rB |  j ƒ  } n	 |  j } t j	 | j
 ƒ  ƒ } t j | j
 ƒ  ƒ t j | j | ƒ j ƒ  j
 ƒ  ƒ } | j d |  j d | t j	 | j
 ƒ  ƒ d d ƒ } n  | S(   Nt   othert   data_substitutet   sigmas_substitutei    (   RS   RQ   t   as_amplitude_arrayRT   RV   R   Rw   Re   R   Rg   R4   RF   t
   common_sett   matching_setRU   (   R<   RS   Rf   Rw   R‹   Rh   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyRf   ß   s    				c         C   s   |  j  S(   N(   RV   (   R<   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyt   f_maskð   s    c         C   sŒ   |  j  d  k r d  S|  j ƒ  } | d  k r7 |  j } n  | d  k r\ | j ƒ  | j ƒ  } n | j ƒ  | | j ƒ  } t j d | d | ƒ S(   Nt
   miller_setR4   (   RV   R   R�   Re   R4   R   t   array(   R<   Re   Ra   R�   R4   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyRw   ó   s     c         C   sV   |  j  d k r d S|  j ƒ  j |  j ƒ } |  j ƒ  j |  j ƒ } t |  j | | ƒ S(   s2   Intensities with the solvent contribution removed.N(   RV   R   R�   RŽ   RS   Rw   t   modified_intensities(   R<   R�   Rw   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyR“   þ   s     c         C   s   |  j  j ƒ  S(   N(   R5   R7   (   R<   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyR7     s    c         C   sI   t  g  t |  j ƒ  ƒ D], } |  j | s |  j j j | d ƒ ^ q ƒ S(   Ni   (   RF   RG   R7   R8   R1   R4   RH   (   R<   RI   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyR9   	  s    c         C   sþ   |  j  d  k	 r |  j  Sg  |  _  |  j j ƒ  j |  j j j ƒ  d k d ƒ } x¨ t |  j	 ƒ  ƒ D]” } |  j
 | r{ d } nh | j ƒ  j |  j j | d k d ƒ } t j | ƒ |  j } | |  j j ƒ  |  j j ƒ  |  j ƒ  } |  j  j | ƒ q_ W|  j  S(   Ni    i   (   RZ   R   Rm   Rp   Rq   R1   R4   Rr   RG   R7   R8   Rs   R   RF   Rk   R   Rj   R9   R(   (   R<   R~   RI   RX   Rm   RW   (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyt   electron_counts_per_void  s     		c   
      C   sÌ  | d  k r t j } n  | d |  j IJ| d |  j j IJ| d |  j j IJ| d IJ|  j j d | ƒ | J| d |  j	 d |  j	 |  j
 j ƒ  j ƒ  f IJ|  j ƒ  } | d k rÏ | d	 |  j IJn  | J|  j j d | ƒ | d k rö d  S| J| d
 IJ|  j j ƒ  } |  j j ƒ  } |  j ƒ  } x— t |  j ƒ  ƒ D]ƒ } |  j
 j ƒ  j ƒ  | | |  j j ƒ  } g  | | D] } d | ^ q|}	 | d | d I| d | I| d | | IJqAWd  S(   Ns   use_set_completion: %ss   solvent_radius: %.2fs   shrink_truncation_radius: %.2fs   van der Waals radii:RJ   s<   Total solvent accessible volume / cell = %.1f Ang^3 [%.1f%%]id   i    s"   Total electron count / cell = %.1fs   Void  Vol/Ang^3  #Electronss   %6.3fs   %4ii   s   %10.1f     s   %7.1f(   R   RK   RL   RT   R1   R   R   R!   RM   R   R   R	   R;   R7   RX   R5   RN   t   grid_points_per_voidt   centres_of_mass_fracR”   RG   R   Rj   (
   R<   RJ   R7   R•   t   comt   electron_countsRI   t   void_volt   xt   formatted_site(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyRN      s@     

 
!c      
   C   sy  d d l  m } | j j ƒ  } | j j d d ƒ } |  j ƒ  } | d k rP | S|  j j ƒ  } |  j j ƒ  } |  j	 ƒ  } xá t
 |  j ƒ  ƒ D]Í } |  j j ƒ  j ƒ  | | |  j j ƒ  }	 t | | ƒ }
 x: t
 d ƒ D], } t |
 | d ƒ d k rÚ d |
 | <qÚ qÚ Wd } | j | d | |
 d | |
 d | |
 d d |	 d | | d g ƒ q� W| j | ƒ d | d <| S(   Niÿÿÿÿ(   t   cift   headert   _smtbx_masks_void_nrt   _smtbx_masks_void_average_xt   _smtbx_masks_void_average_yt   _smtbx_masks_void_average_zt   _smtbx_masks_void_volumet!   _smtbx_masks_void_count_electronst   _smtbx_masks_void_contenti    i   i   s   %.3fi   i   s   %.1ft   ?t   _smtbx_masks_special_details(   Rž   RŸ   R    R¡   R¢   R£   R¤   (   t   iotbxRœ   t   modelt   blockt   loopR7   R5   R•   R–   R”   RG   R   R	   R;   R   Rj   t   listt   roundt   add_rowt   add_loop(   R<   Rœ   t	   cif_blockt	   mask_loopR7   R•   R—   R˜   RI   R™   t   xyzR   t   site_fmt(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyt   as_cif_blockA  s>          	  
Ng      Ð?(   RO   RP   R6   RE   R   R]   R‰   Rf   R�   Rw   R“   R7   R9   R”   RN   R³   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyR1   _   s"   R						!c         C   sß   |  j  ƒ  } | j ƒ  d k	 r> d t j | j ƒ  ƒ } } n d } | j | d | ƒ} | j d | ƒ } t j d | d | j	 ƒ  | j	 ƒ  | ƒ } |  j
 ƒ  r¿ | j ƒ  j d |  j ƒ  ƒ S| j d | j ƒ  ƒ j ƒ  Sd S(   s¶   Subtracts the solvent contribution from the observed structure
  factors to obtain modified structure factors, suitable for refinement
  with other refinement programs such as ShelXLi   t   weightst   phase_sourceR‘   R4   t   sigmasN(   R�   R¶   R   R   t   pow2Rh   Ry   R   R’   R4   t   is_xray_intensity_arrayRQ   R)   (   R[   Rw   R�   Rf   R´   Rh   t   modified_f_obs(    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyR“   c  s     		(   t
   __future__R    RK   t   cctbx.masksR   R   R   R   R   t   cctbx.array_familyR   t   scitbx.mathR   t   libtbx.utilsR   t   objectR   R1   R“   (    (    (    sB   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/masks/__init__.pyt   <module>   s   "Sÿ 