ó
î™xTc           @   sÖ  d  Z  d d l m Z m Z d d l m Z d d l m Z d d l m	 Z	 d d l
 m Z d d l
 m Z d d l
 m 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 Z d d l Z d d l Z d e j e j f d „  ƒ  YZ d e j e j f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ  d e f d „  ƒ  YZ! d „  Z" d „  Z# d e f d „  ƒ  YZ$ e% e j& d „ Z' d e f d  „  ƒ  YZ( d S(!   sú   Charge flipping algorithm(s) and related data structures

References.

[1] G. Oszl{'a}nyi and A. S{"u}t{\H o}.
Ab initio structure solution by charge flipping.
Acta Cryst. A, 60:134--141, 2003.

[2] G. Oszl{'a}nyi and A. S{"u}t{\H o}.
Ab initio structure solution by charge flipping.
II. use of weak reflections. Acta Cryst. A, 61:147, 2004.

[3] L. Palatinus and G. Chapuis
SUPERFLIP -- a computer program for the solution of crystal structures
by charge flipping in arbitry dimensions
J. Appl. Cryst., 40:786--790, 2007

[4] M. Shiono and M.M. Woolfson.
Direct-space methods in phase extension and phase determination.
I. low-density elimination. Acta Cryst. A, 48:451-456, 1992.
--> This is a protein paper

[5] H. Takakura, M. Shiono, T.J. Sato, A. Yamamoto, and A.P. Tsai.
Ab initio structure determination of icosahedral zn-mg-ho quasicrystals
by density modification method.
Phys. Rev. Lett., 86:236, 2001
--> This is an elaboration on the method in [4] as well as an application in a
different compartment of crystallography. This is also the method used
in SUPERFLIP circa Sept 2007 to polish the electron density after the charge
flipping method has converged.

[6] G. Oszl{'a}nyi and A. S{"u}t{\H o}. The charge flipping algorithm. Acta
Cryst. A64:123-134, 2008
iÿÿÿÿ(   t   divisiont
   generators(   t   object_oriented_patterns(   t   adopt_optional_init_args(   t   flex(   t   crystal(   t   sgtbx(   t   miller(   t   maptbx(   t   translation_search(   t   symmetry_search(   t	   ab_initioNt   _array_extensionc           B   s!   e  Z e j d  d e d „ Z RS(   i   gš™™™™™É?c         C   sØ   t  | | j ƒ  ƒ } | rU |  j d d d t ƒ } |  j | ƒ } | j | ƒ } n |  } t j | j ƒ  ƒ } | |  | }	 t j | j ƒ  |  ƒ }
 |	 j	 | | ƒ |
 j	 |  j ƒ  | ƒ t
 j |  |
 ƒ j |	 ƒ S(   s    As per ref. [2] t   by_valuet   datat   reverse(   t   intt   sizet   sort_permutationt   Truet   selectR   t   argR   t   abst   extendR   t   arrayt   phase_transfer(   t   selft   sourcet   delta_varphit   weak_reflection_fractiont   need_sortingt   cutt   pt   targett   source_phasest   phasest   moduli(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   oszlanyi_suto_phase_transfer;   s    (   t   __name__t
   __module__t   matht   piR   R%   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR   9   s   
t   _fft_extensionc           B   s†   e  Z d  Z d „  Z e j e ƒ Z d „  Z e j e ƒ Z d „  Z e j e ƒ Z d „  Z e j e ƒ Z d „  Z	 e j e	 ƒ Z	 RS(   s€    We add those methods to fft_map so that they can be easily reused and
  tested independently of the charge flipping iterators. c         C   sN   |  j  d t ƒ j ƒ  } t j | ƒ } | j | ƒ } | t | | j ƒ  ƒ S(   Nt   in_place(   t   real_map_unpaddedt   Falset   as_1dR   R   R   R   R   (   R   t   fractiont   rhoR    t
   sorted_rho(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   flipped_fraction_as_deltaV   s    c         C   s=   |  j  d t ƒ j ƒ  } t j t j | j | | k  ƒ ƒ ƒ S(   NR+   (   R,   R-   R.   R   t   sumR   R   (   R   t   deltaR0   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   c_flip]   s    c         C   s   t  j |  j ƒ  ƒ S(   N(   R   R3   t   real_map(   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   c_totb   s    c         C   s   t  j |  j ƒ  ƒ j ƒ  S(   N(   R   t   more_statisticsR6   t   skewness(   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR9   f   s    c         C   s   t  j |  j ƒ  ƒ j ƒ  S(   N(   R   t
   statisticsR6   t   sigma(   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR;   j   s    (
   R&   R'   t   __doc__R2   t   oopt   memoize_methodR5   R7   R9   R;   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR*   R   s   					t   density_modification_iteratorc           B   sn   e  Z d  Z d „  Z d d „ Z e d „ Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z RS(   s   Skeleton for any method which, like charge flipping, does cycles like

      rho --|1|--> rho' --|Fourier analysis|--> g --|2|--> f
       ^                                                   |
       |----------------|Fourier synthesis|----------------|

    where the transformation (1) and (2) are specific to each method.

    Synopsis:
      flipping = heir_of_density_modification_iterator(...)
      flipping.start(f_obs, initial_phases)
      flipping.next() # 1st cycle
      flipping.next() # 2nd cycle
      ....
  c         K   s   t  |  | ƒ d  S(   N(   R   (   R   t   kwds(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   __init__€   s    i    c         C   s«   | |  _  t j d |  j  j ƒ  d t j d ƒ d |  j  j ƒ  d d	 d t j ƒ |  _ |  j  j ƒ  j ƒ  j	 ƒ  |  j j
 ƒ  |  _ |  j  j | ƒ |  _ | |  _ |  j ƒ  d  S(
   Nt	   unit_cellt   space_group_infot   P1t   d_mint   resolution_factori   i   t   symmetry_flagsg      à?(   t   f_obsR   t   crystal_griddingRB   R   RC   RE   t   use_space_group_symmetryt   crystal_symmetryt   volumet   n_grid_pointst	   fft_scaleR   t   f_calct   f_000t   compute_electron_density_map(   R   RH   R#   RP   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   startƒ   s    			c         C   sâ   |  j  j | ƒ } | j d ƒ r2 | j d ƒ s8 t ‚ | j | j ƒ  ƒ } |  j  j ƒ  | j ƒ  k sn t ‚ | r¡ |  j  | j ƒ  _  |  j | j ƒ  _ n* |  j  | j ƒ  9_  |  j | j ƒ  9_ d |  _	 |  j
 ƒ  d  S(   Ni    i   (   RH   t   match_indicest   singlest   AssertionErrorR   t   permutationt   indicesR   RO   RP   RQ   (   R   t   normalisationst   dividet   m(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt	   normalise’   s    &!	c         C   s   |  j  | d t ƒd  S(   NRY   (   R[   R-   (   R   RX   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   denormalise    s    c         C   s   |  S(   N(    (   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   __iter__£   s    c         C   s8   |  j  ƒ  |  j ƒ  |  j ƒ  |  j |  _ |  j ƒ  |  S(   s%    perform one cycle and return itself (   t   modify_electron_densityt   compute_structure_factorst   transfer_phase_to_f_obst   _g_000RP   RQ   (   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   next¦   s    



c         C   s2   t  j |  j |  j |  j ƒ |  _ |  j j ƒ  d S(   s‹    Compute the electron density from the structure factors self.f_calc
    and the 000 component self.f_000, scaling by the unit cell volume N(   R   t   fft_mapRI   RO   RP   t   rho_mapt   apply_volume_scaling(   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRQ   ¯   s    c         C   sY   |  j  j ƒ  } t j | ƒ |  j |  _ |  j j | d t ƒ|  _	 |  j	 |  j 9_	 d S(   s”    Compute the structure factors self._g of self.rho_map,
    as well as the 000 component self._g_000, scaling them by the number of
    grid points t   in_place_fftN(
   Rd   R6   R   R3   RN   Ra   RH   t   structure_factors_from_mapR   t   _g(   R   R0   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR_   ·   s    c         C   s   |  j  j |  j ƒ |  _ d  S(   N(   RH   R   Rh   RO   (   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR`   À   s    c         C   s   |  j  j |  j d t ƒS(   Nt   assume_index_matching(   RH   t	   r1_factorRh   R   (   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRj   Ã   s    (   R&   R'   R<   RA   RR   R   R[   R\   R]   Rb   RQ   R_   R`   Rj   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR?   o   s   									t   basic_iteratorc           B   s8   e  Z d  Z d d „ Z e d „ Z d „  Z d „  Z RS(   s£    An iterator over the sequence of electron densities and structure
  factors obtained by repeateadly applying the basic charge flipping
  described in ref. [1].
  c         K   s#   t  t |  ƒ j | �  | |  _ d  S(   N(   t   superRk   RA   R4   (   R   R4   R@   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRA   Í   s    c         C   sH   |  j  j ƒ  } t t |  ƒ j | | ƒ |  j |  j  j ƒ  | 9_ d  S(   N(   Rd   R;   Rl   Rk   R[   R4   (   R   RX   RY   t	   old_sigma(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR[   Ñ   s    c         C   s    |  j  j ƒ  |  j  j |  j ƒ S(   N(   Rd   R7   R5   R4   (   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   c_tot_over_c_flipÖ   s    c         C   s#   t  j j |  j j ƒ  |  j ƒ d S(   s     This shall modify rho in place N(   R   t   extt   flip_charges_in_placeRd   R6   R4   (   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR^   Ù   s    N(	   R&   R'   R<   t   NoneRA   R   R[   Rn   R^   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRk   Ç   s
   	t!   weak_reflection_improved_iteratorc           B   s<   e  Z d  Z d e j d d d „ Z d d „ Z d „  Z RS(   s%    The variation described in ref. [2] i   gš™™™™™É?c         K   s/   t  t |  ƒ j | | � | |  _ | |  _ d  S(   N(   Rl   Rr   RA   R   R   (   R   R4   R   R   R@   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRA   á   s    	i    c         C   sP   t  t |  ƒ j | | | ƒ |  j j d d d t ƒ } |  j j | ƒ |  _ d S(   s6    sort f_obs by increasing amplitudes once and for all R   R   R   N(   Rl   Rr   RR   RH   R   R   R   (   R   RH   R#   RP   R    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRR   ê   s    c         C   s.   |  j  j |  j |  j |  j d t ƒ|  _ d  S(   NR   (   RH   R%   Rh   R   R   R-   RO   (   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR`   ð   s
    		N(	   R&   R'   R<   Rq   R(   R)   RA   RR   R`   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRr   Þ   s   
t    low_density_elimination_iteratorc           B   sA   e  Z d  Z d d „ Z e d „ Z d „  Z d „  Z d „  Z	 RS(   s8    A method related to charge flipping.
  C.f. Ref [4].
  c         K   s#   t  t |  ƒ j | �  | |  _ d  S(   N(   Rl   Rs   RA   t   constant_rho_c(   R   Rt   R@   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRA   ý   s    c         C   s
   t  ‚ d  S(   N(   t   NotImplementedError(   R   RX   RY   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR[     s    c         C   s&   t  j j |  j j ƒ  |  j ƒ  ƒ d  S(   N(   R   Ro   t2   low_density_elimination_in_place_tanaka_et_al_2001Rd   R6   t   rho_c(   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR^     s    	c         C   s$   |  j  d  k	 r |  j  S|  j ƒ  Sd  S(   N(   Rt   Rq   t   shiono_woolfson_rho_c(   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRw     s    c         C   s;   |  j  j d t ƒ j ƒ  } d t j | j | d k ƒ ƒ S(   s     The rho_c suggested in Ref [4] R+   gš™™™™™É?i    (   Rd   R,   R-   R.   R   t   meanR   (   R   R0   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRx     s    N(
   R&   R'   R<   Rq   RA   R   R[   R^   Rw   Rx   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRs   ø   s   		c   	      c   sQ  |  j  d t j d t d t ƒ d d ƒ } t j d | j ƒ  d |  j ƒ  d	 |  j ƒ  d
 |  j ƒ  d |  j	 ƒ  d t
 j ƒ  d | j ƒ  d | j	 ƒ  ƒ j ƒ  } t j d d d d d t d d d t d |  j ƒ  d ƒ } | j ƒ  j d | d | ƒ } xV | D]N } | j | k  rPn  t j |  | | j ƒ } | j j | j | j j f Vqû Wd  S(   NRG   t   is_isotropic_search_modelt   have_f_partRF   i   i   t   griddingt   space_groupt   anomalous_flagt   miller_indices_f_obsRH   t   f_partt   miller_indices_p1_f_calct	   p1_f_calct   peak_search_levelt   peak_cutoffg      à?t   interpolatet   min_distance_sym_equivg�íµ ÷Æ°>t   general_positions_onlyt   min_cross_distancei   t   mapt
   parametersgUUUUUUÕ?(   RI   R	   RG   R-   t   fast_nv1995t   n_realR}   R~   RW   R   R   t   complex_doublet
   target_mapR   t   peak_search_parametersR   RE   t   tagst   peak_searcht   heightR
   t   shift_refinementt   sitet   symmetrised_shifted_sft   f_xt   shiftt   goost   correlation(	   RH   t   f_calc_in_p1t   min_cc_peak_heightRI   t   correlation_mapt   search_parameterst   correlation_map_peakst   peakt   sr(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   f_calc_symmetrisations  s<    
								 c         C   s    |  j  d d d d ƒ |  j ƒ  S(   Nt   reflections_per_biniÈ   t   d_toleranceg{®Gáz„?(   t   setup_binner_counting_sortedt   amplitude_quasi_normalisations(   RH   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR¥   H  s    t   solving_iteratorc           B   sÑ   e  Z d Z e d  „  ƒ Z d Z d Z d Z d Z	 d Z
 d Z e Z d Z d Z d Z d Z d Z d Z d Z d	 Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s   d t  j t j |  j ƒ  ƒ S(   Ni   (   R(   R)   R   t   random_doubleR   (   RH   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   <lambda>R  s    R;   gš™™™™™ñ?i   i
   g{®Gáz„?gš™™™™™é?iô  i   gÍÌÌÌÌÌì?c         K   sü   | |  _  t |  | ƒ |  j |  j k  s. t ‚ g  |  _ d  |  _ g  |  _ t	 |  _
 t	 |  _ | j ƒ  j ƒ  j ƒ  j ƒ  } |  j | ƒ |  _ |  _ i |  j d 6|  j d 6|  j ƒ  |  _ |  j ƒ  |  _ |  j ƒ  |  _ |  j | ƒ |  _ |  j ƒ  |  _ d  S(   NR;   Rn   (   t   flipping_iteratorR   t   min_delta_guessing_iterationst   max_delta_guessing_iterationsRU   t   attemptsRq   RX   t   f_calc_solutionsR-   t   had_phase_transitiont   max_attempts_exceededt   eliminate_sys_absentt   as_non_anomalous_arrayt   merge_equivalentsR   t	   _startingt   statet   startingt   _guessing_delta_with_map_sigmat&   _guessing_delta_with_c_tot_over_c_flipt   delta_guessing_methodt   guessing_deltat   _solvingt   solvingt
   _polishingt	   polishingt   _evaluatingt
   evaluatingt	   _finishedt   finished(   R   R©   RH   R@   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRA   d  s&    						

c         c   sf   xU y |  j  j ƒ  } Wn t k
 r* Pn Xy |  j VWn t k
 rK Pn X| |  _  q |  j ƒ  d S(   s   Note: a loop for flipping in solving_iterator_obj: that is
    interrupted by break will reliably result in a call
    solving_iterator_obj.clean_up() in Python 2.5+ while the code should
    still run on earlier versions of Python but without the clean-up. N(   R´   Rb   t   StopIterationR©   t   GeneratorExitt   clean_up(   R   R´   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR]     s        c         C   s.   |  `  |  ` |  ` |  ` |  ` |  ` |  ` d S(   sê   The generator-based state machine pattern used to implement this
    class creates cycles for each generator:
       self.polishing.gi_frame.f_locals['self'] is self == True
    for example.
    Thus reference counting does not have it collected,
    and self.flipping_iterator is not collected either.
    The latter holds large objects (a fft_map and a miller.array), which
    results in the memory being used to creep up each time a charge
    flipping run is done.
    Note: using a weak reference for solving.flipping_iterator would not work
    because that object is also owned by several of the generators' frame
    mentionned above.

    Thus we delete the generators after the run has finished, therefore
    breaking the cycle.
    N(   R´   Rµ   R¹   R»   R½   R¿   RÁ   (   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRÄ   Œ  s    c         c   sƒ   | j  ƒ  j ƒ  j ƒ  j ƒ  } |  j d  k	 rU |  j | ƒ |  _ | |  j j ƒ  } n  x' |  j j	 | |  j
 | ƒ ƒ |  j VqX d  S(   N(   t   expand_to_p1R²   R   t   discard_sigmast   normalisations_forRq   RX   R   R©   RR   t   initial_phases_forR¹   (   R   RH   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR³   ¥  s    c         c   s!   |  j  s t |  _ n  |  j Vd  S(   N(   R¯   R   R®   RÁ   (   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRÀ   °  s    	c         c   s  |  j  } t } xò g  |  _ | rB | j j |  j ƒ | _ t } n  x t j	 | |  j
 ƒ D] } qX W| j ƒ  } d \ } } | | k o‘ | k n r± |  j V| j ƒ  t } q |  j rÅ |  j Vn  | | k  rã | j d 9_ q | | k r | j d 9_ q q d  S(   Ngš™™™™™é?g      ð?gÍÌÌÌÌÌì?g…ëQ¸ñ?(   gš™™™™™é?g      ð?(   R©   R   R­   Rd   R2   t   initial_flipped_fractionR4   R-   t	   itertoolst   isliceR«   Rn   R»   t   restartt   yield_during_delta_guessingR¹   (   R   t   flippingt   delta_needs_initialisationt   foot   rt   lowt   high(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR·   µ  s.    				
		c         c   sõ   xî g  |  _  t j ƒ  } xË t |  j ƒ D]º } |  j j j ƒ  } | j | ƒ |  j	 | |  j _
 t | ƒ |  j k  rˆ |  j j ƒ  q( n  t j j | d ƒ } t | j | j ƒ |  j k  rÁ Pn  |  j rÕ |  j Vn  |  j j ƒ  q( W|  j Vq d  S(   Niûÿÿÿ(   R­   R   t   doublet   xrangeR«   R©   Rd   R;   t   appendt   delta_over_sigmaR4   t   lenRª   Rb   t   scitbxR(   t   basic_statisticsR   t!   bias_corrected_standard_deviationRy   t   map_sigma_stability_thresholdRÍ   R¹   R»   (   R   t   sigmast   iR;   t   sigma_tail_stats(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR¶   Ð  s$    			 c         c   s"  xd } xþ | |  j  k  r	| d 7} | d k rC |  j d 9_ n  t ƒ  |  _ x´ t t j |  j d |  j ƒ ƒ D]w \ } } | |  _ | |  j	 d k r¤ |  j
 Vn  |  j j | j j ƒ  ƒ |  j j ƒ  rq |  j j | ƒ |  j VPqq qq W| |  j  k r |  j Vq q Wt |  _ |  j Vq d  S(   Ni    i   i   g      ø?(   t$   max_attempts_to_get_phase_transitiont   max_solving_iterationst   observable_evolutiont   skewness_evolutiont	   enumerateRÊ   RË   R©   t   iteration_indext   yield_solving_intervalR»   RÖ   Rd   R9   R®   R¬   R½   Rµ   R   R¯   RÁ   (   R   t	   i_attemptt   nRÎ   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRº   ã  s,    
		c         c   s  x|  j  r¬ |  j j |  j  ƒ t j ƒ  } x~ t |  j ƒ D]j } |  j j ƒ  | j |  j j	 j
 ƒ  ƒ | d k  ry q; n  t j j | d ƒ } | j |  j k  r; Pq; q; Wn  t d |  j j ƒ } | j d |  j j d |  j j d d ƒ x! t |  j ƒ D] } | j ƒ  qù W|  j Vq d  S(   Ni   iýÿÿÿRt   RH   R#   RP   i    (   RX   R©   R\   R   RÔ   RÕ   t,   extra_iterations_on_f_after_phase_transitionRb   RÖ   Rd   R9   RÙ   R(   t   median_statisticst   median_absolute_deviationt    map_skewness_stability_thresholdRs   R4   RR   RH   RO   t   polishing_iterationsR¿   (   R   R9   RÞ   t   statst   low_density_elimination(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR¼   ý  s*    	  c         c   s¹   x² d } x� | |  j  k  r¨ | d 7} g  |  _ xX t | |  j j |  j ƒ D]; \ } } } | |  j k  rl Pn  |  j j | | | f ƒ qJ W|  j r� |  j Vq |  j Vq Wt	 |  _
 q d  S(   Ni    i   (   t)   max_attempts_to_get_sharp_correlation_mapR­   R¡   R©   RO   R›   RÖ   RÁ   Rµ   R   R¯   (   R   t   original_f_obsR¬   RO   R—   t   cc_peak_height(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR¾     s     
		 	 N(    R&   R'   Rq   RÇ   t   staticmethodRÈ   R¸   R×   Rª   R«   RÜ   RÉ   R-   RÍ   Rá   Rà   Rð   Ræ   Ré   Rì   Rí   R›   RA   R]   RÄ   R³   RÀ   R·   R¶   Rº   R¼   R¾   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR¦   N  s8   									c         C   s?  d  } x2|  D]*} |  j |  j k r1| rf | |  j k rG | d IJqf | |  j k rf | d IJqf n  | d k r.| |  j k	 rª | d IJ| d d IJ| d d IJn  | j } | j ƒ  } | j | j ƒ } | | j	 9} | | j	 9} | d | j | j | j
 ƒ  | j ƒ  | j | | | | f IJq.ný |  j |  j k rÌ| d k r.| |  j k	 r | J| d IJ| d | j IJ| J| d d IJ| d d IJn  | d |  j | j | j j ƒ  f IJq.nb |  j |  j k rþ| d k r.| J| d IJq.n0 |  j |  j k r.|  j r*| J| d IJn  Pn  |  j } q Wd  S(   Ns&   ** Restarting (no phase transition) **s+   ** Restarting (no sharp correlation map) **t   highlys   Guessing delta...s.   %10s | %10s | %10s | %10s | %10s | %10s | %10sR4   s	   delta/sigt   Rt   F000R7   R5   s   c_tot/c_flipt   -iZ   s<   %10.4f | %10.4f | %10.3f | %10.3f | %10.1f | %10.1f | %10.2fs
   Solving...s   with delta=%.4fs   %5s | %10s | %10st   #R9   i!   s   %5i | %10.1f | %10.3ft	   Polishings7   ** Maximum number of attempts exceeded: it won't solve!(   s   deltas	   delta/sigRõ   Rö   s   c_tots   c_flips   c_tot/c_flip(   Rø   Rö   s   skewness(   Rq   R´   R¹   R»   R¿   Rd   R7   R5   R4   RN   R;   Rj   RP   Rå   R9   R½   RÁ   R¯   (   R»   t   verboset   outt   previous_stateRÎ   R0   R7   R5   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   loop+  s`    
 	 
	Râ   c           B   s;   e  Z d  Z e Z d Z d Z d „  Z d „  Z d „  Z	 RS(   g      Ð?g333333Ó?gš™™™™™É?c         K   s>   t  |  | ƒ t j ƒ  |  _ t j ƒ  |  _ t j ƒ  |  _ d  S(   N(   R   R   RÔ   t   valuest
   raw_valuest   differences(   R   R@   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRA   i  s    c         C   s¡   |  j  j | ƒ t |  j ƒ d k r� |  j } |  j d } | | | | } |  j j | ƒ | | } |  j sz | } n  |  j j | ƒ n |  j j | ƒ d  S(   Ni   iÿÿÿÿ(   Rÿ   RÖ   RØ   Rþ   t   smoothing_coefficientt
   increasingR   (   R   t   xt   at   y0t   y1R4   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRÖ   o  s    	
	 
c         C   s?  t  |  j ƒ d k  r t St j |  j ƒ } |  j |  j |  j | k  } t j | |  t ƒ } | d  k rs d } n  | d 7} | | d k  r‘ t S|  j d k  } t j	 | | t ƒ } | d  k rÆ t S| | 7} | | d k  rä t St  |  j
 ƒ | d k  rt St j j |  j d ƒ } | j |  j |  j | k r;t St S(   Ni   iÿÿÿÿi   i   i    i
   iûÿÿÿ(   RØ   R   R-   R   t	   max_indext   noise_level_beforet
   last_indexR   Rq   t   first_indexRþ   RÙ   R(   RÚ   t   max_absolutet   noise_level_after(   R   t   i_maxt   noise_beforet   beforet   negative_aftert   aftert
   tail_stats(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyR®   |  s2      	
  
   (
   R&   R'   R  R   R  R  R  RA   RÖ   R®   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyRâ   b  s   		()   R<   t
   __future__R    R   t   libtbxR   R=   R   t   cctbx.array_familyR   t   cctbxR   R   R   R   R	   R
   t   smtbxR   t   scitbx.mathRÙ   RÊ   t   sysR(   t   injectorR   R   Rc   R*   t   objectR?   Rk   Rr   Rs   R¡   R¥   R¦   R   t   stdoutRý   Râ   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/ab_initio/charge_flipping.pyt   <module>"   s4   X	4	Ý7