ó
•™xTc           @   sþ  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 m Z d  d l Z	 d  d l m Z d  d l Z d  d l Z d  d l Z d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d e f d „  ƒ  YZ d „  Z e d „ Z d „  Z e e d „ Z d „  Z  d e f d „  ƒ  YZ! d e f d „  ƒ  YZ" d „  Z# d „  Z$ d „  Z% d e f d „  ƒ  YZ& d „  Z' e d „ Z( d  d! „ Z) d" „  Z* e e e d# „ Z+ d$ e f d% „  ƒ  YZ, d& „  Z- e e d' „ Z. d S((   iÿÿÿÿ(   t   division(   t   reflection_file_reader(   t   miller(   t   flexN(   t   show_string(   t   Sorryt   null_out(   t   countt#   Sorry_No_array_of_the_required_typec           B   s   e  Z e Z d  Z RS(   t
   exceptions(   t   __name__t
   __module__t   __orig_module__(    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyR      s   t   Sorry_Not_a_suitable_arrayc           B   s   e  Z e Z d  Z RS(   R	   (   R
   R   R   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyR      s   c         C   s.   x' |  D] } | j  | ƒ d k  r t Sq Wt S(   Ni    (   t   findt   Falset   True(   t   search_labelst   info_stringt   search_label(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   find_labels   s    t   label_tablec           B   sP   e  Z d d  „ Z d d d „ Z d d d d d „ Z d d „ Z d d „ Z RS(   c         C   sÌ   | |  _  | d  k r$ t j |  _ n	 | |  _ g  |  _ g  |  _ x† t t d ƒ | ƒ D]o \ } } | j	 ƒ  } | d  k	 r’ |  j j
 t | ƒ ƒ n |  j j
 t | ƒ ƒ |  j j
 t | d d  ƒ ƒ qU Wd  S(   Ni   t   labels(   t   miller_arrayst   Nonet   syst   stderrt   errt   info_stringst   info_labelst   zipR   t   infot   appendt   strt   getattr(   t   selfR   R   t   p_arrayt   miller_arrayR   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   __init__   s    	 			"c   
      C   sd  | | g j  d  ƒ d k s! t ‚ | d  k r9 | g } n t | ƒ d k sQ t ‚ t | ƒ t d ƒ k ru | g } n  g  } g  | D] } | j ƒ  ^ q‚ } xÃ t |  j |  j ƒ D]¬ \ } } t	 d | d | j ƒ  ƒ sç | j
 d ƒ q° t	 d | d | ƒ s| j
 d ƒ q° d } | d  k	 rKx* | D] }	 |	 | k r%| d 7} q%q%Wn  | j
 d | ƒ q° W| S(   Ni   i    t    R   R   i   (   R   R   t   AssertionErrort   lent   typet   lowerR   R   R   R   R    (
   R#   t   labelR   t   resultt   lblt   labels_lowerR   R   t   n_exact_matchest
   info_label(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   scores+   s0    ! "	c         C   sÐ   | d  k r |  j } n  | d IJ| d  k rU xf |  j D] } | d I| IJq8 WnB x? t |  j | ƒ D]+ \ } } | | k rh | d I| IJqh qh W| J| d  k r° d } n
 d | } | d | IJ| Jd  S(   Ns   Possible choices:t    R'   s
   use %s
to s>   Please %sspecify an unambiguous substring of the target label.(   R   R   R   R   (   R#   t   fR2   t   minimum_scoret   parameter_nameR   t   scoret   hint(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   show_possible_choicesF   s      
 	

c         C   s  | d  k r |  j } n  | d  k	 s* t ‚ |  j d | ƒ } d  } xš t t | ƒ d d ƒ D]€ } | j | ƒ d k r[ | j | ƒ d k rÇ | J| d | | f IJ| J|  j d | d | d | ƒ d  S|  j | j	 | ƒ Sq[ W| J| d	 | | f IJ| J|  j d | ƒ d  S(
   NR,   i    iÿÿÿÿi   s   Ambiguous %s=%sR4   R2   R5   s   Unknown %s=%s(
   R   R   R(   R2   t   xranget   maxR   R9   R   t   index(   R#   R,   t   command_line_switchR4   R2   t   selected_arrayt
   high_score(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   match_data_label[   s(     	c         C   sï   | d  k r |  j } n  t |  j ƒ d k rC | J| d IJ| Jd  St |  j ƒ d k rc |  j d S| d  k rÙ | J| } | d | IJ| d | t t |  j d j ƒ  ƒ j d ƒ d ƒ f IJ| J|  j d | ƒ d  S|  j	 d	 | d
 | ƒ S(   Ni    s   No reflection arrays available.i   s+   Please use %s to select a reflection array.s   For example: %s=%st   :iÿÿÿÿR4   R,   R=   (
   R   R   R)   R   R   R!   R   t   splitR9   R@   (   R#   R,   R=   R4   t   s(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   select_arrayp   s*     
*	N(   R
   R   R   R&   R2   R9   R@   RD   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyR      s   c         C   s+   |  j  ƒ  j } | d  k	 o* t | ƒ d k S(   Ni   (   R   R   R   R)   (   R%   t   lbls(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   presumably_from_mtz_FQDQY†   s    c         C   s´   g  } x§ |  D]Ÿ } d } | j  ƒ  r5 | r5 d } nj | j ƒ  rŸ | j ƒ  rk t | ƒ rb d } qœ d } qŸ | j ƒ  r€ d } qŸ | j ƒ  rŸ | rŸ d } qŸ n  | j | ƒ q W| S(   Ni    i   i   i   i   i   (   t   is_complex_arrayt   is_real_arrayt%   is_xray_reconstructed_amplitude_arrayRF   t   is_xray_amplitude_arrayt   is_xray_intensity_arrayR    (   R   t   strictR-   R%   R7   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_amplitude_scoresŠ   s     				c         C   sô   g  } xç |  D]ß } d } | j  ƒ  s1 | j ƒ  r: d } n¥ | j ƒ  rß | j ƒ  rU qß | j ƒ  rd qß | j ƒ  rs qß | j ƒ  j ƒ  d k rŽ qß t j	 t j
 | j ƒ  ƒ ƒ } | d k  rÁ d } qß | d k  rÖ d } qß d } n  | j | ƒ q W| S(   Ni    i   i   i   iô  i   i   (   RG   t   is_hendrickson_lattman_arrayRH   RI   RJ   RK   t   datat   sizeR   t   meant   absR    (   R   R-   R%   R7   t   m(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_phase_scores�   s.    				c   
      C   sH  d } d } d } | r' d } d } n  g  } x|  D]} | j  ƒ  sV | j d ƒ q4 d  }	 | j ƒ  j d ƒ r‰ | r€ d }	 qšd }	 n| j ƒ  rî d | }	 | d  k	 rš| r½ | j ƒ  sÑ | rÞ | j ƒ  rÞ |	 | 7}	 që |	 | 8}	 qšn¬ | j ƒ  r”| j ƒ  r;t	 | ƒ r2| r%d | }	 q8d | }	 q‘d }	 qšd | }	 | d  k	 rš| rc| j ƒ  sw| r„| j ƒ  r„|	 | 7}	 q‘|	 | 8}	 qšn d }	 |	 d  k	 s¬t
 ‚ | j ƒ  d  k	 rût | j ƒ  t j ƒ rû| j ƒ  rû|	 d k rû|	 d 7}	 n  | d  k	 r3| j ƒ  r3| r&|	 d 7}	 q3|	 d 8}	 n  | j |	 ƒ q4 W| S(   Ni   i   i    i   i   i   (   RH   R    R   RO   t   all_eqRK   t   anomalous_flagRJ   RI   RF   R(   t   sigmast
   isinstanceR   t   doublet   sigmas_are_sensible(
   R   t   ignore_all_zerost   prefer_anomaloust   prefer_amplitudest   anomalous_bonust   intensity_bonust   amplitude_bonusR-   R%   R7   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_xray_data_scores¸   sb    			
	
c         C   s   t  |  t j ƒ s t St |  j ƒ d k r/ t S|  j d j ƒ  } x6 d d d d d g D] } | j | ƒ d k rX t SqX Wt S(	   Ni   iÿÿÿÿt   freet   testt   crosst   statust   flagi    (	   RX   R   t
   array_infoR   R)   R   R+   R   R   (   Rg   R,   t   word(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   looks_like_r_free_flags_infoõ   s       t   get_r_free_flags_scorec           B   s   e  Z d  „  Z RS(   c         C   sÆ   | d  k	 s | | d k  r( t |  _ n t |  _ | | } d |  _ t d | d ƒ | k  ol | d k  n rÂ t | ƒ sª t d | d ƒ | k  o¥ | d k  n r¶ d	 |  _ qÂ d
 |  _ n  d  S(   Ng      à?i    iè  g{®Gáz„?gffffffÖ?iÐ  g{®Gáz¤?gš™™™™™É?i   i   (   R   R   t   reversedR   t
   flag_scoret   minRi   (   R#   t   test_flag_valuet   nt   n_freet   miller_array_info(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyR&   ÿ   s    	
	--(   R
   R   R&   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyRj   ý   s   t   get_r_free_flags_scoresc           B   s   e  Z d  „  Z RS(   c      
   C   sÖ  g  |  _  g  |  _ x{| D]s} d } d  } | j ƒ  } | j ƒ  rÎ | d  k pX t | ƒ } | j | ƒ } t d | d | j ƒ  d | d | j	 ƒ  ƒ }	 |	 j
 d k rl|	 j
 } |	 j rÂ | } n  | } qlnž| j ƒ  rçy | j d d ƒ }
 Wn t k
 rqlX|
 j ƒ  } |
 j ƒ  } | d  k s4| | k rl|
 j ƒ  d k r| d  k rx| d	 | d k  rod	 } q—d } n | | d k r‘d } n d	 } t d | d | j ƒ  d | | d | j	 ƒ  ƒ }	 |	 j
 d k rá|	 j
 } |	 j röd	 | } n  | | } qáqä|
 j ƒ  d
 k rät | ƒ } t | ƒ } | | | j ƒ  k  r/| t | | d	 ƒ k r/t | ƒ t | ƒ d k rŸt | j	 ƒ  ƒ r–d
 } qºd } n t | j	 ƒ  ƒ rºd	 } n  | d k rÞ| d  k r#| j ƒ  | d d d	 g k r|
 d | j ƒ  d k rd	 } q)t | ƒ } q,| } qÞqá|
 j d d ƒ |
 j d	 d ƒ } | | j ƒ  d k r‹t | j	 ƒ  ƒ r‚d } q‹d	 } n  | d k rá| d  k rÕ|
 d | j ƒ  d k rÆd	 } qÛt | ƒ } qÞ| } qáqäqln… | j ƒ  rld } | j | ƒ } t d | d | j ƒ  d | d | j	 ƒ  ƒ }	 |	 j
 d k rl|	 j
 } |	 j r`| } n  | } qln  |  j  j | ƒ |  j j | ƒ q Wt |  j  ƒ t | ƒ k s±t ‚ t |  j ƒ t | ƒ k sÒt ‚ d  S(   Ni    Rn   Ro   Rp   Rq   t   max_keysiÈ   i   i   i   gš™™™™™á?iÿÿÿÿgffffffî?R4   (   R2   t   test_flag_valuesR   RO   t   is_bool_arrayt   boolR   Rj   RP   R   Rl   Rk   t   is_integer_arrayt   countst   RuntimeErrort   keyst   valuesRm   R;   t   rangeRi   t   sortt   gett   is_string_arrayR    R)   R(   (   R#   R   Rn   R%   Rl   t   effective_test_flag_valueRO   t   trial_test_flag_valueRp   t   scoringRx   t   c_keyst   c_valuest   i_freet
   c_keys_mint
   c_keys_maxt   n_binary(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyR&     sº    				
  			
		 			
	"					
!(   R
   R   R&   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyRr     s   c         C   s   g  } xr |  D]j } | j  ƒ  rj | j ƒ  j d ƒ sD | j d ƒ qw | sZ | j d ƒ qw | j d ƒ q | j d ƒ q W| S(   Ni    i   i   (   i    i    i    i    (   RN   RO   RU   R    (   R   R[   R-   R%   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_experimental_phases_scoresz  s    c         C   s©   t  |  ƒ t  | ƒ k s t ‚ d } g  } x/ |  D]' } | j | | | f ƒ | d 7} q1 W| j d „  ƒ g  } x0 | D]( \ } } | | k ry | j | ƒ qy qy W| S(   Ni    i   c         S   s   | d |  d S(   Ni   (    (   t   xt   y(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   <lambda>�  s    (   R)   R(   R    R}   (   R   t   array_scoresR5   t   it   scored_arrayst   arrayt   valid_arraysR7   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   sort_arrays_by_scoreˆ  s    c         C   s˜  | d  k	 r! |  d  k	 s! t ‚ n  t | ƒ d k rB t d ƒ ‚ n  | d  k	 ri t | ƒ d k s| t ‚ n d g t | ƒ } t d | d | ƒ } | d  k r¦ d  }	 n | j d | ƒ }	 |	 d  k	 rAt |	 ƒ d k rAd |  d j | ƒ f }
 | d	 |
 d	 IJt | ƒ d k r2| j d
 | d d d |  ƒ n  t	 |
 ƒ ‚ n  t | ƒ d k r½|	 d  k r€| d	 | d	 IJt | ƒ ‚ n  d | |  d j | ƒ f }
 | d	 |
 d	 IJt
 |
 ƒ ‚ n  |	 d  k rÒ| } nK t | ƒ d } g  } x2 t |	 | ƒ D]! \ } } | j | | | ƒ qøW| j t | ƒ ƒ } | j | | ƒ d k r”| }
 | d	 |
 d	 IJ| j d
 | d t | ƒ d |  ƒ t	 |
 ƒ ‚ n  | S(   Ni    s   No reflection arrays available.i   R   R   R   s   No matching array: %s=%sR3   s   
R2   R5   R6   s   %s%s=%s(   R   R(   R)   R   R;   R   R2   t   joinR9   R   R   R   R    R<   R   (   R6   R   R   t   data_scoresR   t   error_message_no_arrayt"   error_message_not_a_suitable_arrayt'   error_message_multiple_equally_suitablet   lbl_tabt   label_scorest   errort   combined_scoresRo   t   label_scoret
   data_scoreRŽ   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyRD   –  sZ    	 		
		t   reflection_file_serverc           B   sŒ   e  Z d
 d
 d
 d
 d  „ Z d „  Z d
 d „ Z e d e d „ Z e d d „ Z d e d d
 d
 d „ Z	 e d d „ Z
 d e d d	 „ Z RS(   c         C   sÙ   | |  _  | |  _ | d  k r- t j |  _ n	 | |  _ g  |  _ | d  k	 r‡ x9 | D]. } |  j j | j d |  j  d |  j ƒ ƒ qR Wn  i  |  _	 xB |  j D]7 } |  j	 j
 t j j | j ƒ  j ƒ g  ƒ j | ƒ qš Wd  S(   Nt   crystal_symmetryt   force_symmetry(   RŸ   R    R   R   R   R   R   t   extendt   as_miller_arrayst   file_name_miller_arrayst
   setdefaultt   libtbxt   patht   canonical_pathR   t   sourceR    (   R#   RŸ   R    t   reflection_filesR   t   reflection_fileR%   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyR&   Ñ  s     		 						c         C   s5  | d  k r |  j St j j | ƒ } |  j j | d  ƒ } | d  k r¦ t t j d ƒ r¦ xK |  j j	 ƒ  D]7 } t j j
 | | ƒ rh |  j | } |  j | <Pqh qh Wn  | d  k rt j d | ƒ } | j ƒ  d  k ræ d  |  j | <q| j d |  j d |  j ƒ } |  j | <n  | d  k r1t d | ƒ ‚ n  | S(   Nt   samefilet	   file_nameRŸ   R    s   No reflection data in file: %s(   R   R   R¥   R¦   R§   R£   R~   t   hasattrt   osRz   R«   R   t   any_reflection_filet	   file_typeR¢   RŸ   R    R   (   R#   R¬   t   canonical_file_nameR-   t   tabulated_file_nameRª   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_miller_arraysæ  s(     				c         C   s¨   | d  k r |  j } n t j j | ƒ } |  j | } xj | D]b } t | t ƒ rr | j ƒ  j	 ƒ  | k r  | Sq> t | t
 ƒ s‡ t ‚ | j ƒ  j | k r> | Sq> Wd  S(   N(   R   R   R¥   R¦   R§   R£   RX   R!   R   t   label_stringt   listR(   R   (   R#   R   R¬   R   R±   R�   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_miller_arrayþ  s    i   c	         C   sŒ  |  j  d | ƒ }	 t d |	 d | ƒ }
 | d  k	 rD | d | } n  | rZ t |	 |
 | ƒ St d | d | d |	 d |
 d |  j d	 d
 d d d d ƒ } |	 | } | rˆ| j ƒ  } | d  k rÇ d  } n	 | j } | j ƒ  r'| j	 ƒ  } | d  k	 r| j
 | j d | d  ƒ ƒ q…| j
 d | ƒ qˆ| j ƒ  rˆ| j ƒ  } | d  k	 rr| j
 | j d | d  d g ƒ ƒ q…| j
 d | ƒ qˆn  | S(   NR¬   R   RL   t   .R6   R   R”   R   R•   s   No array of amplitudes found.R–   s$   Not a suitable array of amplitudes: R—   s5   Multiple equally suitable arrays of amplitudes found.i   R   t   as_amplitude_array(   R³   RM   R   R’   RD   R   R   R   RG   t
   amplitudest   set_infot   customized_copyRK   R¸   (   R#   R¬   R   t"   convert_to_amplitudes_if_necessaryt   parameter_scopeR6   t   return_all_valid_arraysR5   RL   R   R”   RŽ   R-   R   R   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_amplitudes  sD    				
		 c	         C   s9  | d k s t ‚ |  j d | ƒ }	 t d |	 ƒ }
 | d  k	 rP | d | } n  | rf t |	 |
 | ƒ St d | d | d |	 d |
 d	 |  j d
 d d d d d ƒ } |	 | } | j ƒ  } | d  k rÍ d  } n	 | j } | r·| j	 ƒ  rN| j
 d t ƒ } | d  k	 r;t | ƒ d k r;| j | j d | d g ƒ ƒ q´| j d | ƒ q5| j ƒ  r5| j ƒ  j
 d t ƒ } | d  k	 r¡| j | j d | d g ƒ ƒ q´| j d | ƒ q5n~ | j	 ƒ  r5| d k r5| j d | j ƒ  d t j ƒ } | d  k	 r"| j | j d | d g ƒ ƒ q5| j d | ƒ n  | S(   Nt   degt   radR¬   R   R·   R6   R   R”   R   R•   s   No array of phases found.R–   s    Not a suitable array of phases: R—   s1   Multiple equally suitable arrays of phases found.i   i   R   t   converted_to_centroid_phasesRO   i´   t   converted_to_deg(   Ns   degRÁ   (   R   R(   R³   RT   R’   RD   R   R   R   RG   t   phasesR   R)   Rº   R»   RN   t   phase_integralsRO   t   matht   pi(   R#   R¬   R   t   convert_to_phases_if_necessaryt   original_phase_unitsR½   R6   R¾   R5   R   R”   RŽ   R-   R   R   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_phases_deg@  sR    			
		##R   c
         C   sV  |  j  d | ƒ }
 t d |
 d | d | d |	 ƒ } | rI t |
 | | ƒ S|
 } | } | d  k r
g  } g  } xš t |
 | ƒ D]† \ } } | j ƒ  j d d g d d	 d
 d g d d g d d d d g g k pã t | j ƒ  t	 j
 ƒ s} | j | ƒ | j | ƒ q} q} Wn  t d | d | d | d | d | d |  j d d d d d d ƒ } | | S(   NR¬   R   R[   R\   R]   s   F-obs-filtereds   SIGF-obs-filtereds   F-obs-filtered(+)s   SIGF-obs-filtered(+)s   F-obs-filtered(-)s   SIGF-obs-filtered(-)s   F-models
   PHIF-models
   F-model(+)s   PHIF-model(+)s
   F-model(-)s   PHIF-model(-)R6   R·   R   R”   R   R•   s%   No array of observed xray data found.R–   s,   Not a suitable array of observed xray data: R—   s=   Multiple equally suitable arrays of observed xray data found.(   R³   Ra   R’   R   R   R   R   RX   RO   R   t   complex_doubleR    RD   R   (   R#   R¬   R   R[   R½   R6   R¾   R5   R\   R]   R   R”   t   new_miller_arrayst   new_data_scorest   mat   dsRŽ   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_xray_dataz  sB    
						c         C   sn  |  j  d | ƒ } | r€ | d  k s0 | d  k rX t d | d | d | d f ƒ ‚ n | rq t d d ƒ ‚ n  d  }	 d  }
 n t d | d	 | ƒ }	 |	 j }
 | rh|	 j } g  } x8 t | ƒ D]* \ } } | j | | | |
 | f ƒ qÀ W| j d
 „  ƒ g  } x] | D]U \ } } } | | k r| j	 ƒ  rJt
 | | ƒ \ } } n  | j | | f ƒ qqW| S| d  k r}d  } n	 | g } y` t d | d d | d | d |
 d |  j d d d d | d | d | d d d d ƒ } Wn1 t k
 r} t t | ƒ d d | ƒ ‚ n X| | } |
 d  k	 r@|	 j | } n  | j	 ƒ  rdt
 | | ƒ \ } } n  | | f S(   NR¬   s^   %s=True: Suitability test for R-free flags can only be disabled if both %s and %s are defined.s   .disable_suitability_tests   .labels   .test_flag_values7   return_all_valid_arrays=True: Suitability test can not s   be disabled in this mode.R   Rn   c         S   s   | d |  d S(   Ni   (    (   RŠ   R‹   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyRŒ   Ì  s    R6   R   R”   R   R•   s!   No array of R-free flags found.

s   For manual selection define:
s     %s.label
s     %s.test_flag_value
s"     %s.disable_suitability_test=TrueR–   s&   Not a suitable array of R-free flags: R—   s7   Multiple equally suitable arrays of R-free flags found.s)   
To override the suitability test define:s!    %s.disable_suitability_test=True(   R³   R   R   Rr   R2   Rt   t	   enumerateR    R}   R   t$   cif_status_flags_as_int_r_free_flagsRD   R   R   R!   (   R#   R¬   R,   Rn   t   disable_suitability_testR½   R¾   R5   R   t   flag_scoresR”   Rt   R�   RŽ   R�   t   valid_arrays_and_flagst
   flag_valueR7   R   t   eR%   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_r_free_flags¬  sl    				" 		
	"
c         C   s‰   |  j  d | ƒ } t d | d | ƒ }	 | r= t | |	 | ƒ St d | d | d | d | d |	 d |  j d	 d
 d d d d ƒ }
 | |
 S(   NR¬   R   R[   R6   R·   R   R”   R   R•   s&   No array of experimental phases found.R–   s-   Not a suitable array of experimental phases: R—   s>   Multiple equally suitable arrays of experimental phases found.(   R³   R‰   R’   RD   R   (   R#   R¬   R   R[   R½   R6   R¾   R5   R   R”   RŽ   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_experimental_phasesô  s     			N(   R
   R   R   R&   R³   R¶   R   R¿   RÊ   RÐ   RØ   RÙ   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyRž   Ï  s*   	17/Fc         C   sÁ   | d k s t  ‚ |  j ƒ  r· |  j ƒ  d k |  j ƒ  d k B} |  j ƒ  } |  j | ƒ }  t j |  j ƒ  d ƒ } | j |  j ƒ  d k d ƒ |  j	 d | ƒ }  |  j
 | ƒ d } n  |  | f S(   NR4   t   oi   i    RO   (   R(   R   RO   R   t   selectR   t   intRP   t   set_selectedR�   Rº   (   R%   Rn   t	   selectionR   RO   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyRÒ     s    "	c         C   s#   t  d |  g d | ƒ } | j d S(   NR   Rn   i    (   Rr   Rt   (   R%   Rn   RÔ   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   guess_r_free_flag_value  s    		R·   c         C   sõ   | d k rJ t  |  ƒ d k r1 t d | ƒ ‚ n  t j j |  d ƒ } n  | j ƒ  j | ƒ sp | | | 7} n  t j d k rµ t j j	 | ƒ rñ | |  d k rñ | | | 7} qñ n< t j j	 | ƒ rñ t j j
 | |  d ƒ rñ | | | 7} n  | S(   NR·   i   s=   Ambiguous name for output %s file (more than one input file).i    t   win32(   R)   R   R®   R¦   t   basenameR+   t   endswithR   t   platformt   isfileR«   (   t   input_file_namest   user_file_namet   file_type_labelt   file_extensiont   extension_seperator(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   construct_output_file_name#  s     c         C   sè   d d l  m } | j d |  d j ƒ  d |  d j ƒ  d t ƒ } |  d j ƒ  j ƒ  } xU |  d D]I } | j ƒ  } | j | | ƒ j d ƒ } | j	 | ƒ } | j
 | ƒ qc W| j d |  d j ƒ  d | d t ƒ } | j ƒ  j ƒ  S(   Niÿÿÿÿ(   R   RŸ   i    t   indicesRV   i   (   t   cctbxR   t   setRŸ   Rë   R   t	   deep_copyt   match_indicest   singlesRÛ   R¡   t
   map_to_asut   unique_under_symmetry(   R   R   t
   master_sett   master_indicesR�   t   current_indicest   missing_iselt   missing_indices(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   make_joined_set:  s"    					c            sÊ  | d  k r t j } n  ˆ  d k s* t ‚ d  } t j d |  ƒ j ƒ  } ‡  f d †  } | d IJg  } g  } xb | D]Z }	 | d |	 ƒ rt | d I|	 j ƒ  j ƒ  IJ| j	 |	 ƒ | j	 |	 j ƒ  j ƒ  ƒ qt qt Wt
 | ƒ d k ró t d	 ƒ ‚ n² t
 | ƒ d
 k r| d } n“ t
 | ƒ d
 k r¥d }
 | d  k rEt |
 ƒ ‚ q¥x] | D]R }	 | d |	 ƒ rL|	 j ƒ  j ƒ  | k rL| d I|	 j ƒ  j ƒ  IJ|	 } qLqLWn  | d  k rÆd } t | ƒ ‚ n  | S(   Nt   complext   realR¬   c            s:   ˆ  d k r |  j  ƒ  p9 ˆ  d k r0 |  j ƒ  p9 ˆ  d  k S(   NRù   Rú   (   RG   RH   R   (   RÎ   (   R*   (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   get_flagS  s    s     Available suitable arrays:RÎ   s       i    s   No suitable arrays.i   s   Multiple choices available.s     Selected:s�   
No map coefficients array selected. See choices listed above and use 'label='
to select one. Example: label="2FOFCWT,PH2FOFCWT"
(   s   complexs   realN(   R   R   t   stdoutR(   R   R¯   R¢   R   R´   R    R)   R   (   R¬   R,   R*   t   logR-   R   Rû   t   suitable_arrayst   suitable_labelsRÎ   RS   t   msg(    (   R*   sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   extract_miller_array_from_fileM  s>     	
    't   process_raw_datac           B   sž   e  Z d  Z d d d d d g Z d d d d e e j e d „ Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d d e d „ Z RS(   s  
  Automation wrapper - prepares single-wavelength experimental data (and
  optional R-free flags and experimental phases) for any future step in the
  structure determination process.  Used in Phenix for ligand pipeline and
  automated re-refinement of PDB entries.
  t   f_obst   r_free_flagsRn   RÄ   t   _generate_newc         C   s1  |	 d  k	 r | d  k	 s t ‚ | d  k rU d d l m } t j j | ƒ j ƒ  } n  | j ƒ  } d  } } | j	 ƒ  } | j
 ƒ  j ƒ  j ƒ  } | j d |	 ƒ } | j d | d | ƒ } | j ƒ  rd d l m } |
 rä |	 } n	 t ƒ  } | j d | d d  d | ƒ } n  | d  k	 s t ‚ | j ƒ  } | j ƒ  d	 k  re|	 d
 d | j ƒ  | j ƒ  f IJn  | rz| j ƒ  } n  | d  k	 r | j ƒ  } d } | d k r­d } n | d k rÂd } n  | j ƒ  rÝ| j ƒ  } n  t } | j ƒ  j ƒ  } | j ƒ  j ƒ  } | j ƒ  j ƒ  | j ƒ  j ƒ  k r4t } n  | rs| j
 ƒ  j ƒ  j ƒ  } | j d |	 ƒ } | d k r£| j d | j ƒ  d | j  ƒ  | k ƒ } t } n  | j! ƒ  } | j ƒ  rÊ| j ƒ  } n  | j" d | ƒ } | j# ƒ  j$ ƒ  } | j# ƒ  j$ ƒ  } | d  k s+| j  ƒ  j% | j  ƒ  d ƒ r>|	 d IJd  } nù | | k r7| j& d | ƒ } | j# ƒ  j$ ƒ  } | d k r7|	 d | | f IJ| d k  rè| d k rÇ| j d t' j( | t ƒ ƒ } q| j d t' j) | d ƒ ƒ } n7 | j* d | j  ƒ  j+ | ƒ | d d  d t d | ƒ } | j, d | ƒ } q7n  | d  k	 rý| j# ƒ  j$ ƒ  | j# ƒ  j$ ƒ  k spt ‚ qýq
|	 d t- | j	 ƒ  ƒ d j. g  | j/ ƒ  j0 ƒ  D] } d | ^ q¢ƒ t- | j	 ƒ  ƒ d j. g  | j/ ƒ  j0 ƒ  D] } d | ^ qàƒ f IJn
 |	 d IJt |  _1 | d  k rp| j* d | j2 d | j3 d | j4 d | j5 d  | j6 d d ƒ } d } t |  _1 n  | j ƒ  r‹| j ƒ  } n  | d  k	 rÄ| j ƒ  } | j
 ƒ  j d | d | ƒ } n  | j7 ƒ  sÖt ‚ | j8 | ƒ |  _9 | j8 | ƒ |  _: | |  _; d  |  _< | d  k	 r-| j8 | ƒ |  _< n  d  S(!   Niÿÿÿÿ(   t   generate_r_free_params_strRý   t   d_mint   d_max(   t   french_wilsonR%   t   paramsgÍÌÌÌÌÌì?sµ   
  WARNING: data are incomplete (%.1f%% of possible reflections measured to
  %.2fA).  This may cause problems if you plan to use the maps for building
  and/or ligand fitting!
    id   t   cnsi    t   ccp4t   shelxRŸ   RO   t   others}   
  WARNING: uniform R-free flags detected; a new test set will be generated,
  but this will bias the refinement statistics.
sö   
  WARNING: R-free flags are incomplete relative to experimental
  data (%d vs. %d reflections).  The flags will be extended to
  complete the set, but we recommend supplying flags that are already
  generated to the maximum expected resolution.
i   i   t   fractiont   max_freet   use_lattice_symmetryt   formats¡   
    NOTE: incompatible symmetry between the data and the R-free flags:
         Data  : %s  %s
         Flags : %s  %s
       A new test set will be generated.
R3   s   %gsx   
 WARNING: R-free flags not supplied.  This may bias the refinement if the
     structures are very nearly isomorphous!
t   use_dataman_shellst   n_shells(=   R   R(   t   cctbx.r_free_utilsR  R¥   t   philt   parset   extractR   t   space_group_infoRñ   t   merge_equivalentsR�   t   eliminate_sys_absentt   resolution_filterRK   Rì   R	  R   t   french_wilson_scalet   average_bijvoet_matest   completenessR  RV   R   t   space_groupt   build_derived_point_groupR*   t   numberR   R»   RŸ   RO   Rî   t
   common_setRë   RP   RU   t   lone_setR   Rv   RÜ   t   generate_r_free_flagsR   t   concatenateR!   R“   t	   unit_cellt
   parametersR  R  R  R  R  R  RJ   Rº   R  R  Rn   RÄ   (   R#   t   obsR  Rn   RÄ   R  R  t   r_free_flags_paramst   merge_anomalousRý   t   verboseR  t   obs_infot   r_free_flags_infot   phases_infot   sgR	  t   fw_outt
   merged_obsR  t   is_compatible_symmetryt   obs_pgt   flags_pgt   obs_tmpt   n_r_freet   n_obst   missing_sett	   n_missingt   missing_flagsRŠ   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyR&     sÚ    	
			#		$				!		0/9								!		c         C   sc   |  j  j ƒ  r d S|  j  j ƒ  rB |  j  j ƒ  d  k	 r; d Sd Sn |  j  j ƒ  d  k	 r[ d Sd Sd  S(   Ns   F,SIGF,DANO,SIGDANO,ISYMs   F(+),SIGF(+),F(-),SIGF(-)s	   F(+),F(-)s   F,SIGFt   F(   R  RI   RV   RW   R   (   R#   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   data_labels  s    c         C   s   d S(   Nt
   FreeR_flag(    (   R#   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   r_free_flags_label  s    c         C   sV   |  j  j d |  j  j ƒ  |  j k ƒ } |  j j ƒ  rR | j ƒ  rR | j ƒ  } n  | S(   NRO   (   R  R»   RO   Rn   R  RV   t   generate_bijvoet_mates(   R#   t   flags(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   r_free_flags_as_boolean_array   s
    c         C   s   |  j  j d |  j ƒ  ƒ S(   NR  (   R  t   common_setsRB  (   R#   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   data_and_flags'  s    c         C   s   |  j  d  k	 r d Sd  S(   Ns   HLA,HLB,HLC,HLD(   RÄ   R   (   R#   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   phase_labels*  s    c         C   s   |  j  j ƒ  j ƒ  S(   N(   R  RO   RP   (   R#   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyR8  /  s    c         C   s,   |  j  j ƒ  j |  j ƒ |  j  j ƒ  j ƒ  S(   N(   R  RO   R   Rn   RP   (   R#   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   fraction_free2  s    c         C   s   |  j  S(   N(   R  (   R#   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   flags_are_new6  s    c         C   s¨   |  j  j d d d | ƒ } |  j  j ƒ  rS | rS | j d |  j  j ƒ  d d ƒ n  |  j d  k	 r{ | j |  j d d ƒn  | j |  j d d ƒ| j ƒ  j	 | ƒ d  S(   Nt   column_root_labelR<  t
   wavelengthR%   t   HLR>  (
   R  t   as_mtz_datasetRV   t   add_miller_arrayR  RÄ   R   R  t
   mtz_objectt   write(   R#   R¬   t   titleRI  t   single_datasett   mtz_data(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   write_mtz_file9  s    		

N(   R
   R   t   __doc__t	   __slots__R   R   R   Rü   R   R&   R=  R?  RB  RD  RE  R8  RF  RG  RR  (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyR  q  s0   	‡								c         C   sS   t  j |  ƒ } | j ƒ  d k s' t ‚ | j ƒ  } | j | ƒ } | j |  ƒ d S(   sA   
  Update the space group in an MTZ file, writing it in place.
  t   ccp4_mtzN(   R   R¯   R°   R(   t   file_contentt   set_space_group_infoRN  (   R¬   R  t   mtz_inRM  t   mtz_new(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   change_space_groupK  s
    c         C   s;  t  j |  ƒ } | j ƒ  d k s' t ‚ t d d d t d | g d t j ƒ } d } } } | j	 d |  d d d	 d d
 t
 d d ƒ \ } } | j ƒ  }	 | d k	 sª t ‚ | j d | j ƒ  | k ƒ } d }
 } xq | j D]f } | j ƒ  j ƒ  } | j ƒ  r!| j ƒ  r!| } | j ƒ  } qÜ | d k rÜ | } | j ƒ  }
 qÜ qÜ W| d k rm| d k	 rm| j ƒ  } n  | j ƒ  } | j d | ƒ } | j d | ƒ } d | | g k sµt ‚ | d k	 r| r| j ƒ  } | j ƒ  } | j d | ƒ j | ƒ } | j d | ƒ j |	 ƒ } | | f S| j |
 ƒ | j |	 ƒ f S(   s\   
  Automation wrapper for reading in MTZ files generated by the process_raw_data
  class.
  RU  RŸ   R    R©   R   R¬   R,   R>  Rn   RÓ   R½   R'   RO   s   F,SIGFR  N(   R   R¯   R°   R(   Rž   R   R   R   R   RØ   R   R   R»   RO   R   R´   RJ   RV   R  R  R#  R@  Rº   (   R¬   RV   RÄ   RX  t   file_serverR  t
   f_obs_anomt   r_freeRn   t   r_free_infot
   f_obs_infot   f_obs_anom_infoR�   R,   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   load_f_obs_and_r_freeU  sN    		

(/   t
   __future__R    t   iotbxR   Rì   R   t   cctbx.array_familyR   t   libtbx.pathR¥   t   libtbx.str_utilsR   t   libtbx.utilsR   R   t   libtbx.philt	   itertoolsR   RÆ   R   R®   R   R   R   t   objectR   RF   R   RM   RT   R   Ra   Ri   Rj   Rr   R‰   R’   RD   Rž   RÒ   Rß   Rê   Rø   R  R  RZ  Ra  (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/reflection_file_utils.pyt   <module>   sD   	k		<	m			9ÿ B	
	$Ú	
