ó
O™xTc           @   sæ   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	 Z	 d  d l
 Z
 d Z d d „ Z d	 „  Z d
 „  Z d „  Z d „  Z d d „ Z d d e e d d d d „ Z d „  Z d d „ Z e d d „ Z d S(   iÿÿÿÿ(   t   division(   t   iceil(   t   null_outt   Sorry(   t   countNsý      fraction = 0.1
      .type=float
      .short_caption = Fraction of reflections in test set
      .expert_level=0
    max_free = 2000
      .type=int
      .short_caption = Maximum number of reflections in test set
      .expert_level=2
    lattice_symmetry_max_delta = 5
      .type=float
      .expert_level=2
    use_lattice_symmetry = True
      .type=bool
      .short_caption = Use lattice symmetry to generate test set
      .expert_level=0
    use_dataman_shells = False
      .type = bool
      .short_caption = Assign test set in thin resolution shells
      .help = Used to avoid biasing of the test set by certain types of         non-crystallographic symmetry.
    n_shells = 20
      .type = int
      .short_caption = Number of resolution shells
t   cnsc         C   s²  | d k r | d k  s t  ‚ d d l m } d d l m } d | } | d k sZ t  ‚ | d k sr | d	 k rS| j |  t ƒ } d } xŒ t d ƒ D]~ } t |  | | | ƒ ƒ }	 | |	 k rÆ Pn  |	 d |  k rã |	 d 7}	 n  |	 | d k sù t  ‚ t	 | t
 j | |	 ƒ <|	 } q— W| d	 k r®| j |  d ƒ }
 |
 j | d ƒ |
 } q®n[ | d
 k r®| j ƒ  } | | ƒ d } x0 t |  ƒ D] } | j t
 j d | ƒ ƒ qˆWn  | S(   Ni    g      à?iÿÿÿÿ(   t   flex(   t   iroundi   i   R   t   shelxt   ccp4(   t   AssertionErrort   scitbx.array_familyR   t   libtbx.math_utilsR   t   boolt   FalseR   t   mint   Truet   randomt	   randranget   intt   set_selectedt   ranget   appendt   randint(   t   n_reflt   fraction_freet   formatR   R   t
   group_sizet   resultt   i_startt   i_groupt   i_endt   result_t   flag_maxt   i(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   assign_random_r_free_flags"   s6    

 c         C   sO  | d k r | d k  s t  ‚ | d k r6 | |  k  s< t  ‚ d d l m } d d l m } | |  | ƒ } | |  | ƒ } | |  | | d ƒ } | d | } | j ƒ  }	 |	 j |  ƒ x} t | ƒ D]o }
 |	 j t	 |  |	 j
 ƒ  | ƒ t ƒ |	 j t	 |  |	 j
 ƒ  | ƒ t ƒ |	 j t	 |  |	 j
 ƒ  | ƒ t ƒ qÈ W|	 j |  t ƒ |	 S(   Ni    g      à?i   iÿÿÿÿ(   R   (   R   i   (   R
   R   R   R   R   R   t   reservet   xranget   resizeR   t   sizeR   R   (   R   R   t   n_binsR   R   t   n_freet	   n_per_bint   half_n_work_per_bint   n_free_per_bint   flagst   i_bin(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   assign_r_free_flags_by_shells?   s     ##'c         C   s1  | t  k s! t | t ƒ s! t ‚ d d l m } t |  | j ƒ rL t  } n t |  | j ƒ sd t ‚ t |  ƒ } t | ƒ d k r† |  S| j |  j	 ƒ  ƒ } |  j
 | ƒ } | d k rÏ t |  j	 ƒ  | ƒ } n d } xU t |  j	 ƒ  ƒ D]A } |  | | k rd | | <qè t t j ƒ  | d ƒ | | <qè W| S(   Niÿÿÿÿ(   R   i   i    i   (   R   t
   isinstanceR   R
   R   R   R   t   sett   lenR'   R   R   R   R   (   R-   t   test_flag_valueR   t   unique_valuest	   new_flagsR)   R(   R"   (    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   export_r_free_flags_for_ccp4Q   s$    !	"c         C   sº   | t  k s! t | t ƒ s! t ‚ d d l m } t |  | j ƒ rL t  } n t |  | j ƒ sd t ‚ | j |  j ƒ  d ƒ } x7 t |  j ƒ  ƒ D]# } |  | | k r� d | | <q� q� W| S(   Niÿÿÿÿ(   R   i   (	   R   R0   R   R
   R   R   R   R'   R   (   R-   R3   R   R5   R"   (    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   export_r_free_flags_for_shelxh   s    !	c         C   sG   d d l  m } t |  j ƒ  | j ƒ s. t ‚ | j |  j ƒ  ƒ d k S(   Niÿÿÿÿ(   R   i   (   R   R   R0   t   dataR   R
   t   max(   R-   R   (    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   looks_like_ccp4_flagsu   s    c         C   sç  d d l  m } t |  j ƒ  | j ƒ s. t ‚ | d k rF | d k  sL t ‚ | d k rd t j } n  |  j ƒ  j	 ƒ  } |  j ƒ  j
 t ƒ } | d k s� t ‚ | | } | d | IJ| d | IJd } | | k rÞ |  } nª| | k rÝ| | } | d | IJ|  j |  j ƒ  ƒ }	 |  j |  j ƒ  ƒ }
 | d k rE| d k  sKt ‚ | d	 k r`d
 } n  | d	 k rª|
 j d d | d d d t ƒ } | j d | j ƒ  ƒ } n |
 j d | d d d t ƒ } |	 j d | ƒ } n« | | d | } | d | IJ| d k st ‚ |  j |  j ƒ  ƒ }	 |  j |  j ƒ  ƒ }
 |	 j ƒ  j	 ƒ  d k sXt ‚ |	 j d | d d d t ƒ } | j d |
 ƒ } | j ƒ  j	 ƒ  |  j ƒ  j	 ƒ  k s²t ‚ | d | | f IJ| d | j ƒ  j
 t ƒ IJ| S(   sV   
  Expand or shrink an existing set of R-free flags to match the target
  fraction.
  iÿÿÿÿ(   R   i    i   s     current fraction free: %gs                    target: %gs*     shrinking old test set by a factor of %gg      ð?g      à?gÕxé&1à?t   fractiont   max_freet   use_lattice_symmetryR8   t   others,     flagging %g of current work set for R-frees#       old flags: %d free (out of %d) s       new flags: %d freeN(   R   R   R0   R8   R   R
   t   Nonet   syst   stdoutR'   R   R   t   selectt   generate_r_free_flagst   customized_copyt   complete_witht   indices(   t   miller_arrayR;   t   logR   R   R)   t   current_fractionR5   t   sub_fractiont   work_sett   free_sett   free_set_newt   fraction_newt	   flags_new(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   adjust_fractionz   sb     
	
		
						*c
      	   C   sŒ  d d l  m }
 |	 d  k r( t ƒ  }	 n  | d  k	 s: t ‚ t |  | ƒ j ƒ  } t | |
 j ƒ sg t ‚ | j	 ƒ  d k r‘ d | } |	 | IJ|  S| j
 t ƒ | j	 ƒ  } |	 d | | f IJ| d k r| rè d | } |	 | IJ|  St d d | | f ƒ ‚ n  | d  k	 r#| j |  ƒ } nc |  j ƒ  \ } } | d  k rJ| } n  | d  k r_| } n  |  j d	 | d
 | ƒ j |  j ƒ  ƒ } | j ƒ  j	 ƒ  } |	 d | | f IJ|  } | d k rˆ| d k rë| j d |
 j | t ƒ ƒ } nR | d  k	 r| d |  d | d | d | ƒ s|  Sn  | j d | d d  d t ƒ } | rst |  ƒ r•|	 d IJt d | j ƒ  d t ƒ } |  j d | j d | ƒ ƒ } q…d  } | d k r°d } n | d k rÅd } n  | d  k rðt d d d d | ƒ ‚ n  |
 j ƒ  } | j ƒ  } xG t | j ƒ  j	 ƒ  ƒ D]- } | | rA| j | ƒ q!| j | ƒ q!W|  j d | j d | ƒ ƒ } qˆ|  j d | ƒ } n  | S(   Niÿÿÿÿ(   R   i    s-   WARNING: array of R-free flags (%s) is empty.s   %s: fraction_free=%.3fsr   WARNING: R-free flags in %s do not appear to contain a valid test, so they can't be extended to higher resolution.s5   Can't extend R-free flags in %s to higher resolution s9   because no valid test set with flag value '%s' was found.t   d_mint   d_maxs   %s: missing %d reflectionsi   R8   RG   R3   t	   n_missingt   column_labelR;   R<   R=   s*   Exporting missing flags to CCP4 conventionR-   R>   i   s)   PHENIX doesn't know how to deal with the s/   R-free flag convention in %s; you will need to s5   disable either extending the flags or preserving the s   input values.(   i   iÿÿÿÿ(   R   R   R?   R   R
   t   get_r_free_as_boolR8   R0   R   R'   R   R   R   t   lone_sett	   d_max_mint   complete_sett
   map_to_asuRF   t   arrayR   RC   R:   R6   t   concatenateRD   R   R   R   (   t   r_free_flagsR3   t   array_labelRX   t   accumulation_callbackt   preserve_input_valuest   allow_uniform_flagsRR   RQ   RH   R   t   r_free_as_boolt   msgR   t   missing_sett	   tmp_d_maxt	   tmp_d_minRS   t   output_arrayt   missing_flagst   exported_flagst   work_flag_valueR5   t   i_seq(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   extend_flags¼   s’     



 	 	!			
				
	c         C   s  d d l  m } t |  | ƒ } | j ƒ  j t ƒ } | j d d ƒ j ƒ  } | j | j	 j
 ƒ  | j ƒ } | j ƒ  s| t ‚ | j ƒ  } | j	 j
 ƒ  | } d }	 d }
 d } | j | j | | j d ƒ ƒ }	 x4 | j	 D]) } | | d k rü |
 d 7}
 n  | } qÙ W|
 | |	 | f S(   Niÿÿÿÿ(   R   t   by_valuet
   resolutioni    i   i   (   R   R   RU   R8   R   R   t   sortt   r_free_flags_accumulationt   linear_regressiont   reflection_countst	   as_doublet   free_fractionst   is_well_definedR
   t   slopet   sumt   pow(   RG   R3   R   RZ   R)   t   accut   lrRu   t   y_idealt   sseR(   t
   n_ref_lastt   x(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   get_r_free_stats  s$    "
i    c         C   s‹   |  j  ƒ  r |  Sd d l m } t | t ƒ s5 t ‚ |  j ƒ  sG t ‚ |  j ƒ  | k } t | | j ƒ sq t ‚ |  j	 d | d d  ƒ Sd  S(   Niÿÿÿÿ(   R   R8   t   sigmas(   t   is_bool_arrayR   R   R0   R   R
   t   is_integer_arrayR8   R   RD   R?   (   RG   R3   R   t   new_data(    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyRU   /  s    c         C   sß   | d k r t ƒ  } n  |  j ƒ  s( |  S|  j ƒ  s: t ‚ |  j ƒ  }  |  j ƒ  } |  j ƒ  }  |  j d t	 ƒ } | j
 d k r“ | d | j
 IJn  | j ƒ  j ƒ  j d | ƒ } t | j ƒ  ƒ t | j ƒ  ƒ k sÛ t ‚ | S(   s¾   
  Given a set of R-free flags generated for anomalous data, detect any
  mismatches between Friedel/Bijvoet mates, and move reflections to the
  free set as needed to ensure consistency.
  t   incompatible_flags_replacementi    s"     %d reflections moved to test setR>   N(   R?   R   t   anomalous_flagR€   R
   RY   t	   deep_copyt   as_non_anomalous_arrayt   merge_equivalentsR   t   n_incompatible_flagsRZ   t   generate_bijvoet_matest
   common_setR2   RF   (   RZ   t   verboseRH   t
   orig_arrayt   mergeR5   (    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   remediate_mismatches:  s      	*(   t
   __future__R    R   R   t   libtbx.utilsR   R   t	   itertoolsR   R   R@   t   generate_r_free_params_strR#   R/   R6   R7   R:   R?   RP   R   Rk   R~   RU   RŽ   (    (    (    s@   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/r_free_utils.pyt   <module>   s,   				FU	