ó
†™xTc        	   @   s"  d  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 e j f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z e j d „ Z d
 d
 d
 d
 d d e e j d „ Z d „  Z d
 S(   s8   Reading and writing of scalepack merge reflection files.iÿÿÿÿ(   t   division(   t   uctbx(   t   sgtbx(   t   crystal(   t   miller(   t   flex(   t   iround(   t   easy_pickleNt   FormatErrorc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyR      s    t   readerc           B   sV   e  Z e d  „ Z d d d „ Z d „  Z d e e d d „ Z d e e d d „ Z	 RS(   c         C   s  | j  ƒ  } | j ƒ  d k r* t d ‚ n  | j  ƒ  d } | j  ƒ  } t | ƒ d k  sh | d d k rt t | ‚ n  y< g  t d ƒ D]% } t | | d | d	 d !ƒ ^ q„ } Wn- t k
 rÆ ‚  n t k
 rß t | ‚ n Xt j	 | ƒ |  _	 | d
 j
 ƒ  |  _ t |  j ƒ d k r&t | ‚ n  y t j |  j ƒ |  _ Wn- t k
 rU‚  n t k
 rnd  |  _ n X| ryd  St j ƒ  |  _ t j ƒ  |  _ t j ƒ  |  _ t |  _ d } xY| j  ƒ  } | d	 7} d | } | d k rèPn  | j ƒ  } t | ƒ d k rq¸n  | d d 7} g  } d }	 x8 d D]0 }
 |	 |
 } | j | |	 | !j
 ƒ  ƒ | }	 q-Wy- g  t d ƒ D] } t | | ƒ ^ qq} Wn- t k
 r¤‚  n t k
 r½t | ‚ n XxMd D]E} d d | } t | | ƒ rÅy) t | | ƒ t | | d	 ƒ } } WnQ t k
 r(‚  n> t k
 re| | d t | | ƒ k rYqÅn  t | ‚ n X| d k r„| d k r„qÅn  | r°g  | D] } | ^ q‘} t |  _ n  | d k sÔ| d k r
| d	 k r
|  j j | ƒ |  j j | ƒ |  j j | ƒ q
qÅqÅWq¸d  S(   Ns       1s   line 1: expecting '    1's<   line 3: expecting unit cell parameters and space group labeli?   i<   t    i   i
   i   i=   i    i   s   line %d: expecting (3I4, 4F8.1)t    i,   i   i   i   t   *iÿÿÿÿ(   i   i   i   i   i   i   i   (   i    i   (   t   readlinet   rstripR   t   lent   xranget   floatt   KeyboardInterruptt	   ExceptionR   t	   unit_cellt   stript   space_group_symbolR   t   space_group_infot   NoneR   t   miller_indext   miller_indicest   doublet   i_obst   sigmast   Falset	   anomaloust   appendt   intt   True(   t   selft   file_handlet   header_onlyt   linet
   line_errort   it	   uc_paramst
   line_countt   fldst   usedt   widtht	   next_usedt   ht   jR   t   sigmat   e(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   __init__   s’    
"<   	

  

- ) $R   c         C   s„   | d  k r t j } n  |  j j d | d | d ƒ | | d I|  j IJ| | d I|  j IJ| | d I|  j j ƒ  IJd  S(   Nt   ft   prefixs   Unit cell: s   Space group symbol:s   Anomalous flag:s   Number of reflections:(	   R   t   syst   stdoutR   t   show_parametersR   R!   R   t   size(   R%   t   outR7   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   show_summaryb   s     c            s5   ‡  f d †  } t  j d ˆ  j d ˆ  j d | ƒ  ƒ S(   Nc             s:   ˆ  j  j ƒ  }  |  j d ƒ o9 |  j d ƒ p9 |  j d ƒ S(   Nt   Rt   H(   R   t   uppert
   startswitht   endswith(   t   s(   R%   (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   have_r_with_axes_infoj   s    R   R   t)   correct_rhombohedral_setting_if_necessary(   R   t   symmetryR   R   (   R%   RD   (    (   R%   sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   crystal_symmetryi   s
    			c      	   C   sÊ   | d  k r! t j d d ƒ } n  |  j ƒ  } |  j rK d d d d g } n d d g } t j d	 t j d
 | j d | d | ƒ d |  j d |  j ƒ d |  j	 d |  j
 ƒ j | j d | d | ƒ ƒ j ƒ  S(   Nt   source_typet   scalepack_merges   I(+)s   SIGI(+)s   I(-)s   SIGI(-)t   It   SIGIt
   miller_setRG   t   other_symmetryt   forcet   indicest   anomalous_flagt   dataR   t   labelst   crystal_symmetry_from_file(   R   R   t
   array_infoRG   R!   t   arrayt   sett   join_symmetryR   R   R   t   set_infot   customized_copyt#   set_observation_type_xray_intensity(   R%   RG   t   force_symmetryt   merge_equivalentst   base_array_infoRS   RR   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   as_miller_arrayr   s$    								c      	   C   s%   |  j  d | d | d | d | ƒ g S(   NRG   R[   R\   R]   (   R^   (   R%   RG   R[   R\   R]   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   as_miller_arraysŒ   s
    	N(
   R	   R
   R    R5   R   R=   RG   R$   R^   R_   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyR      s   F	
c         C   sh   | d k  r d | Sd t  | ƒ } t | ƒ d k rd t d t |  ƒ j d d ƒ | | f ƒ ‚ n  | S(   Ng    €„.As   %8.1fs   %8di   s>   Value is too large for scalepack merge format: hkl=%s, %s=%.6gR   R   (   R   R   t
   ValueErrort   strt   replace(   R1   t   labelt   valuet   result(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   format_f8_1_or_i8—   s     (c         C   sZ   |  j  ƒ  j ƒ  j } d } | | k rV |  j ƒ  j d | ƒ }  | d t | ƒ IJn  |  S(   Ng   ÀçÖ—At
   target_maxs6   NOTE: Scaled array (max=%s) to fit in Scalepack format(   RQ   t   min_max_meant   maxt	   deep_copyt   apply_scalingRa   (   t   miller_arrayR<   Rd   t	   max_value(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   scale_intensities_if_necessary    s    s       1s    -987c         C   s  |  | g j  d  ƒ d k s! t ‚ | j ƒ  sE | j ƒ  sE t d ƒ ‚ | j ƒ  d  k	 s] t ‚ | d  k r{ t |  d ƒ } n  | j ƒ  s– | j ƒ  } n  | d  k rá t | j	 ƒ  ƒ } | j
 d ƒ sá | j d d ƒ j ƒ  } qá n  | rü t | d | ƒ} n  | | IJ| | IJ| d d	 | j ƒ  j ƒ  I| | IJ| j ƒ  s­xÈt | j ƒ  | j ƒ  | j ƒ  ƒ D]= \ } }	 }
 | d | t | d |	 ƒ t | d |
 ƒ IJqiWnb| j ƒ  \ } } | j d ƒ } | j d ƒ } | j ƒ  j | ƒ } | j ƒ  j | ƒ } | j ƒ  j | ƒ } | j ƒ  j | ƒ } | j ƒ  j | ƒ } x} t | | | | | ƒ D]c \ } } } } } | d | t | d | ƒ t | d | ƒ t | d | ƒ t | d | ƒ IJq_W| j d ƒ } | j ƒ  j | ƒ } | j ƒ  j | ƒ } | j ƒ  j | ƒ } xQ t | | | ƒ D]= \ } }	 }
 | d | t | d |	 ƒ t | d |
 ƒ IJq'W| j d ƒ } | j ƒ  j | ƒ } | j ƒ  j | ƒ } | j ƒ  j | ƒ } xU t | | | ƒ D]A \ } }	 }
 | d | d t | d |	 ƒ t | d |
 ƒ IJqÊWd  S(   Ni   s-   Input data must be amplitudes or intensities.t   wt   )R   R   R<   s   %10.3fi   s   %4di   t	   intensityR3   t   +t   -i   s	   %4d%4d%4ds	   %4d%4d%4ds	   %4d%4d%4ds	   %4d%4d%4ds                   (   t   countR   t   AssertionErrort   is_xray_intensity_arrayt   is_xray_amplitude_arrayR   t   opent	   f_as_f_sqRa   R   RB   Rb   t   lowerRn   R   t
   parametersRP   t   zipRO   RQ   Rf   t   match_bijvoet_matest   pairs_hemisphere_selectiont   selectt   singles_hemisphere_selection(   t	   file_namet   file_objectRl   R   t   line_1t   line_2t%   scale_intensities_for_scalepack_mergeR<   R1   R6   RC   t   asut   matchest   sel_pairs_plust   sel_pairs_minusRO   t	   data_plust
   data_minust   sigmas_plust   sigmas_minust   fpt   spt   fmt   smt   sel_singlesRQ   R   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   write©   sf    !	


	1N"."c         C   s¨   d |  k } x• |  D]� } | j  d ƒ r. q n  t t | d ƒ ƒ } | j d d | ƒ } | j ƒ  | rŸ t j j | ƒ d d } d G| GHt j	 | | ƒ n  Hq Wd  S(	   Ns   --pickles   --t   rt   infos   From file: i   s   .pickles   Writing:(
   RA   R   Rx   R^   R=   t   ost   patht   splitR   t   dump(   t   argst	   to_pickleR�   RC   Rl   t   pickle_file_name(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   runí   s     
	(   t   __doc__t
   __future__R    t   cctbxR   R   R   R   t   cctbx.array_familyR   t   libtbx.math_utilsR   t   libtbxR   t
   exceptionsR–   R8   R   R   t   objectR   Rf   R9   Rn   R   R    R“   R�   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/scalepack/merge.pyt   <module>   s,   }				?