ó
–™xTc           @   s  d  Z  d d l m Z d d l m Z 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 Z d d	 l Z d
 e 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	 S(   s0   Transfer of CNS reflection files to flex arrays.iÿÿÿÿ(   t   division(   t   re_sg_uct   re_uc_sgt   crystal_symmetry_from_re_match(   t   crystal(   t   miller(   t   flex(   t   complex_math(   t   easy_pickleNt   CNS_input_Errorc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR	      s   t	   CNS_inputc           B   s;   e  Z d  „  Z d d „ Z d d „ Z d „  Z d „  Z RS(   c         C   sO   | j  |  _ g  |  _ d |  _ d |  _ d |  _ g  |  _ g  |  _ g  |  _ d  S(   Ni    t    (	   t   readlinet	   _readlinet   _buffert   _LineNot	   _LastWordt   levelt   commentst   remarkst   cryst1s(   t   selft   file(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   __init__$   s    						i    c         C   s  xòt  |  j ƒ d k rô|  j ƒ  } | d k r9 t ‚ n  |  j d 7_ | j ƒ  j ƒ  j d ƒ ry |  j j	 | ƒ q n  | j d ƒ rÉ t  | ƒ d k rÉ d j
 | d ƒ d k rÉ |  j j	 | ƒ q n  | j
 d	 ƒ } | d k rñ | |  } n  xÉ | j
 d
 ƒ } | d k  rPn  |  j d |  _ x… | j
 d | d ƒ } | d k r}|  j j	 | | | d !ƒ | |  | | d } Pn  |  j ƒ  } | d k ržt ‚ n  | | 7} q&|  j d 8_ qô | j d d ƒ } | j ƒ  j ƒ  |  _ |  j j ƒ  q W|  j j ƒ  |  _ | r|  j |  S|  j S(   Ni    R   i   s   REMARK t   CRYST1i9   s    +-.0123456789i   t   !t   {t   }t   =t    (   t   lenR   R   t   EOFErrorR   t   lstript   uppert
   startswithR   t   appendt   findR   R   R   t   replacet   splitt   reverset   popR   (   R   t   word_lent   linet   it   jt	   next_line(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   getNextWord.   sN     	   	 c         C   s   | r |  j  |  S|  j  S(   N(   R   (   R   R+   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   getLastWordS   s     c         C   s$   t  d |  j |  j f | ƒ ‚ d  S(   Ns   line %d, word "%s": (   R	   R   R   (   R   t   message(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt
   raiseErrorW   s    c         C   s   |  j  d | ƒ d  S(   Ns(   floating-point value expected for array (   R3   (   R   t   name(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   raiseError_floating_point[   s    (   R
   R   R   R0   R1   R3   R5   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR   "   s
   	
%	t   cns_reciprocal_space_objectc           B   sA   e  Z d  „  Z d d d „ Z d „  Z e d „ Z e d „ Z RS(   c         C   s�   | |  _  | |  _ t j ƒ  |  _ d  |  _ | d k rH t j ƒ  |  _ nQ | d k ro t j	 ƒ  |  _ t
 |  _ n* | d k r� t j ƒ  |  _ n t d ƒ ‚ d  S(   Nt   realt   complext   integers   Internal Error.(   R4   t   typeR   t   miller_indext   indicest   Nonet   has_non_zero_phasest   doublet   datat   complex_doublet   Falset   intt   RuntimeError(   R   R4   R:   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR   `   s    			R   c         C   sF   | d  k r t j } n  | | d |  j |  j |  j j ƒ  f IJd  S(   Ns   name=%s type=%s len(data)=%d(   R=   t   syst   stdoutR4   R:   R@   t   size(   R   t   ft   prefix(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   show_summaryo   s     
c         C   s$   |  j  j | ƒ |  j j | ƒ d  S(   N(   R<   R%   R@   (   R   t   ht   value(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR%   t   s    c         C   sP   |  j  d k r t S|  j  d k r& t S|  j s3 t S|  j j ƒ  d k rL t St S(	   NR7   R8   t   fobst   f_obst   iobst   i_obst   obs(   RM   RN   RO   RP   s   obs(   R:   t   TrueRB   R>   R4   t   lower(   R   t   use_name_as_hint(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   is_realx   s      	 	 c         C   s>   |  j  d | ƒ s t ‚ |  j d k r. |  j St j |  j ƒ S(   NRT   R7   (   RU   t   AssertionErrorR:   R@   R   t   abs(   R   RT   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt	   real_data€   s     N(	   R
   R   R   R=   RJ   R%   RR   RU   RX   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR6   ^   s
   		t   CNS_xray_reflection_Readerc           B   s>   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s   t  j |  | ƒ d  S(   N(   R   R   (   R   R   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR   ‡   s    c         C   sa   |  j  d |  _  |  j ƒ  } y t | ƒ } Wn t k
 rL |  j d ƒ n X|  j  d |  _  | S(   Ni   s   integer value expected(   R   R0   RC   t
   ValueErrorR3   (   R   t   wordt   nreflections(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   _read_nreflectionsŠ   s    c         C   sj   |  j  d |  _  |  j d ƒ } | d k r4 t } n" | d k rI t } n |  j d ƒ |  j  d |  _  | S(   Ni   i   t   TRUEt   FALSs   TRUE or FALSe expected(   R   R0   RR   RB   R3   (   R   R[   t	   anomalous(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   _read_anomalous”   s    		c         C   sô  d  } d  } d  } |  j d |  _ x»|  j d ƒ } | d k ro |  j d |  _ |  j ƒ  } |  j d |  _ q% | d k rä |  j d |  _ |  j d ƒ } | d k r¯ d } n" | d k rÄ d } n |  j d	 ƒ |  j d |  _ q% | d
 k rn|  j d |  _ |  j d ƒ } | d k r$d } n7 | d k r9d } n" | d k rNd } n |  j d	 ƒ |  j d |  _ q% | d k rÐ| j | ƒ r�|  j d | ƒ n  | d k r¹|  j d ƒ n  t | | ƒ | | <Pq% |  j d	 ƒ q% |  j d |  _ d  S(   Ni   i   t   NAMEt   DOMAt   RECIt
   reciprocalt   REALR7   s   unrecognized keywordt   TYPEt   COMPR8   t   INTER9   t   ENDs   duplicate declaration of NAME=s$   real space objects are not supported(   R=   R   R0   R3   t   has_keyR6   (   R   t   xray_objectsR4   t   domainR:   R[   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   _read_declare    sN    					c         C   s¯  |  j  d |  _  g  } x‚|  j d ƒ } | d k r‚ |  j  d |  _  |  j d ƒ } | d k ro |  j d ƒ n  |  j  d |  _  q | d k r7|  j  d |  _  |  j ƒ  } | j | ƒ sÑ |  j d | d ƒ n  | | j d	 k rô |  j d
 ƒ n  | | j j ƒ  r|  j d ƒ n  | j | ƒ |  j  d |  _  q | d k r‹t | ƒ d k r‡t | ƒ d k rw|  j d ƒ n  | j | ƒ n  Pq |  j d ƒ q |  j  d |  _  d  S(   Ni   i   Rg   t   HLs   TYPE=HL expectedt   OBJEs   reciprocal space object s    does not existR7   s5   Hendrickson-Lattman coefficients must be of type reals2   GROUp statement must appear before reflection dataRj   i    s;   there must be exactly four Hendrickson-Lattman coefficientss   unrecognized keyword(	   R   R0   R3   Rk   R:   R<   RG   R%   R    (   R   Rl   t   groupst
   this_groupR[   R4   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   _read_groupÌ   sB    


c         C   s~  |  j  } |  j } d  | _ d  | _ i  | _ g  | _ d  } t } d } yåxÞt r+| ss | d ƒ } | d 7} n  t } | d k r|  j	 d |  _	 d  g d } xR t
 d ƒ D]D }	 | ƒ  } y t | ƒ | |	 <Wq¯ t k
 rò |  j d ƒ q¯ Xq¯ Wt | ƒ } |  j	 d |  _	 qN | d k r4|  j ƒ  | _ qN | d k rR|  j ƒ  | _ qN | d	 k rq|  j | j ƒ qN | d
 k r–|  j | j | j ƒ qN | ƒ  } | j j | ƒ }
 |
 d  k rÍ|  j d ƒ n  |
 j } |  j	 d |  _	 | } d } | d k rd } n  xþ t
 | ƒ D]ð }	 | ƒ  } | d k rgy t | ƒ } Wqt k
 rc|  j d | ƒ qXq|	 d k r§y t | ƒ } Wqt k
 r£|  j | ƒ qXqy t | ƒ } Wn t k
 rÐt } qXt j | | f d t ƒ} | d k rt |
 _ qqW|
 j | | ƒ |  j	 d |  _	 qN WWn/ t k
 r^|  j	 d k r_t d ƒ ‚ q_n X| d k rzt d ƒ ‚ n  d  S(   Ni    i   i   t   INDEi   s   integer values expected for hklt   NREFt   ANOMt   DECLt   GROUs   unrecognized keywordR8   i   R9   s!   integer value expected for array t   degs   premature end-of-files
   empty file(   R0   R1   R=   R\   R`   t   reciprocal_space_objectsRq   RB   RR   R   t   xrangeRC   RZ   R3   t   tupleR]   Ra   Rn   Rs   t   getR:   t   floatR5   R   t   polarR>   R%   R!   R	   (   R   t   to_objt   gNWt   gLWt   current_hklt
   reuse_wordt   n_words_processedR[   RK   R-   t   rsoR:   R4   t   nRL   t   phase(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   loadð   sŒ    										 		
 (   R
   R   R   R]   Ra   Rn   Rs   R‰   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyRY   …   s   		
		,	$t   cns_reflection_filec           B   sŒ   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d e d „ Z	 d d d „ Z
 d „  Z d d	 „ Z d d d
 „ Z d e e d d „ Z RS(   c         C   sK   t  | ƒ } | j |  ƒ |  j ƒ  | j |  _ | j |  _ | j |  _ d  S(   N(   RY   R‰   t   optimizeR   R   R   (   R   t   file_handlet   reader(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR   <  s    
c         C   sÓ   d d l  m } d  } x¶ |  j D]« } | j ƒ  d j ƒ  j d d ƒ j ƒ  } | j d ƒ r  | j	 d ƒ r  | d d !} y | j
 | ƒ } Wn t k
 rŸ qË X| d  k r» | j ƒ  } n  | j | ƒ q  q  W| S(   Niÿÿÿÿ(   t   sgtbxi   R   R   s   symop(t   )(   t   cctbxRŽ   R=   R   R"   t   stripR'   RS   R$   t   endswitht   rt_mxRD   t   space_groupt
   expand_smx(   R   RŽ   t   resultt   remarkt   s(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   space_group_from_remark_symopD  s    (c         C   s¶   |  j  ƒ  } x£ |  j D]˜ } | j ƒ  d j ƒ  } t j t | ƒ } | d  k rV q n  t d | d d d d ƒ } | d  k	 r | d  k	 rª t	 j
 d | j ƒ  d | ƒ } n  | Sq Wd  S(	   Ni   t   mt   i_uci   t   i_sgi   t	   unit_cellR”   (   R™   R   R"   R‘   t   ret   matchR   R=   R   R   t   symmetryR�   (   R   t   sgR—   Rš   R–   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt"   crystal_symmetry_from_remark_uc_sgV  s     	c         C   sn   xg |  j  D]\ } d d l m } | j d | ƒ } | d  k	 r
 | j ƒ  d  k	 r
 | j ƒ  d  k	 r
 | Sq
 Wd  S(   Niÿÿÿÿ(   t   cryst1_interpretationt   cryst1_record(   R   t	   iotbx.pdbR£   t   crystal_symmetryR=   R�   t   space_group_info(   R   t   recordR£   R–   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   crystal_symmetry_from_cryst1e  s    c         C   s_   xX |  j  D]M } t j d t | ƒ } | d  k r8 q
 n  t d | ƒ } | d  k	 r
 | Sq
 Wd  S(   Ns   \{\s+Rš   (   R   Rž   RŸ   R   R=   R   (   R   t   commentRš   R–   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   crystal_symmetry_from_commentso  s      c         C   sx   |  j  ƒ  } | d  k r' |  j ƒ  } n  | d  k rB |  j ƒ  } n  | d  k rR | S| d  k rb | S| j d | d | ƒ S(   Nt   other_symmetryt   force(   R¢   R=   R©   R«   t   join_symmetry(   R   R¦   t   force_symmetryt   self_symmetry(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR¦   w  s    	R   c         C   s¨   | d  k r t j } n  | | d |  j IJ| | d t |  j ƒ IJx- |  j j ƒ  D] } | j d | d | ƒ qX Wx) |  j	 D] } | | d t | ƒ IJq‚ Wd  S(   Ns   nreflections=%ds
   anomalous=RH   RI   s   group: (
   R=   RE   RF   R\   t   strR`   Rz   t   valuesRJ   Rq   (   R   RH   RI   R†   t   g(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyRJ   ‡  s     c         C   sš   |  j  j ƒ  } x„ t t | ƒ d ƒ D]l } | | j } xV t | d t | ƒ ƒ D]; } | | j } t j | | ƒ d k rS | | | _ qS qS Wq& Wd  S(   Ni   i    (   Rz   R²   R{   R    R<   R   t   order(   R   t   rsosR-   t   h_iR.   t   h_j(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR‹   �  s     c         C   s·  | d  k r0 t |  j ƒ d k s' t ‚ d } n  |  j | } t | ƒ d k sU t ‚ g  } d } g  } g  } x£ | D]› } | j | ƒ |  j | } | j d k s© t ‚ | j | ƒ t | ƒ t d ƒ k rÚ | j } n  t j	 | | j ƒ }	 |	 j
 ƒ  st ‚ | j |	 ƒ qt Wt j ƒ  }
 xˆ t | j ƒ  ƒ D]t } g  } xX t d ƒ D]J } | | j ƒ  | \ } } | | k s}t ‚ | j | | j | ƒ qKW|
 j | ƒ q2W| | |
 f S(   Ni   i    i   R7   (   R=   R    Rq   RV   R%   Rz   R:   R<   R   t   match_indicest   have_singlesR   t   hendrickson_lattmanR{   RG   t   pairsR@   (   R   t   group_indext   selected_groupt   namest   miller_indicesRµ   t   matchesR4   R†   RŸ   t   hlt   iht   coefft   ict   ih0t   ih1(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   join_hl_group™  s8    	 c         C   sŸ   t  j d | d | d |  j ƒ } |  j d  k r? | j ƒ  } n  | j d | d | ƒ } | d  k	 r› | d k su t ‚ | d k rŽ | j ƒ  q› | j ƒ  n  | S(	   NR¦   R<   t   anomalous_flagR@   t   sigmasRH   R-   (   RH   R-   (	   R   t   setR`   R=   t   auto_anomaloust   arrayRV   t#   set_observation_type_xray_amplitudet#   set_observation_type_xray_intensity(   R   R¦   R¿   R@   RÉ   t   obs_typeR–   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   _as_miller_array¶  s    	c         C   sb  |  j  d | d | ƒ } | d  k r? t j d d  d d  ƒ } n  | d  k r` t j d d ƒ } n  g  } t ƒ  } x„ t t |  j	 ƒ ƒ D]m } |  j
 | ƒ \ } }	 }
 | j |  j | |	 |
 ƒ j | j d | ƒ ƒ ƒ x | D] } | j | ƒ qÛ Wq… Wi  } xQ |  j j ƒ  D]@ } | j | k r'qn  | j ƒ  s9qn  | | | j j ƒ  <qWx� t | ƒ D]� \ } } } | j |  j | | j | j ƒ  | j ƒ  | ƒ j | j d | j | j g ƒ ƒ ƒ | j | j ƒ | j | j ƒ q]Wxy |  j j ƒ  D]h } | j | k rqòn  | j |  j | | j | j ƒ j | j d | j g ƒ ƒ ƒ | j | j ƒ qòW| S(   NR¦   R¯   R�   R§   t   source_typeRŠ   t   labels(   R¦   R=   R   R    R   t
   array_infoRÊ   R{   R    Rq   RÇ   R%   RÐ   t   set_infot   customized_copyt   addRz   R²   R4   RU   RS   t   group_obs_sigmaR<   RX   R@   (   R   R¦   R¯   t   merge_equivalentst   base_array_infoR–   t   doneR¼   R¾   R¿   RÁ   R4   t   real_arraysR†   RQ   t   sigmaRÏ   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   as_miller_arraysÇ  sP    				  	" N(   R
   R   R   R™   R¢   R©   R«   R=   RB   R¦   RJ   R‹   RÇ   RÐ   RR   RÝ   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyRŠ   :  s   				
					c   	      C   s  g  } t  ƒ  } |  j d ƒ } | d  k	 r± x„ d d d g D]p } |  j | ƒ } | d  k	 r: | j j | j ƒ r: | j | | d f ƒ | j | j ƒ | j | j ƒ Pq: q: Wn  xL|  j ƒ  D]>\ } } | j | k rß q¾ n  d  } x1 d D]) } | j	 | ƒ rì | t
 | ƒ } Pqì qì W| d  k r+q¾ n  x1 d D]) } |  j | | ƒ } | d  k	 r2Pq2q2W| d  k r¢x4 d D]) } |  j | | ƒ } | d  k	 rrPqrqrWn  | d  k	 r¾ | j j | j ƒ r¾ | j | | d f ƒ | j | j ƒ | j | j ƒ q¾ q¾ W| S(   NRO   t   sigit   sigmait   sigiobsR-   RM   RN   RH   R   RÜ   t   sigR˜   (   s   fobss   f_obsRH   R   (   s   sigmaRá   R˜   (   s   sigmaRá   (   RÊ   R}   R=   R<   t   all_eqR%   RÖ   R4   t   itemsR$   R    (	   RÛ   R–   RÚ   R-   R4   R˜   RH   t   restRI   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyR×   ò  sF    	! !c         C   së  d d  l  } d |  k } xš|  D]’} | j d ƒ r: q n  | d GHt | d ƒ } | j ƒ  } t | ƒ } | j ƒ  } | d | d | d | d } | j ƒ  | j ƒ  Ht j d d ƒ }	 | j	 |	 ƒ }
 x |
 D] } | j ƒ  HqÕ W| r°| j
 j | ƒ d d	 } | j ƒ  } t j | | ƒ | j ƒ  } | d | d | d | d } | j ƒ  } t j | ƒ | j ƒ  } | d | d | d | d } d
 | | | f GHn  Hq W| j ƒ  } d | d | d | d | d f GHd  S(   Niÿÿÿÿs   --pickles   --t   :t   ri    i   s   P 1s   .pickles#   parse: %.2f, dump: %.2f, load: %.2fs   u+s,u,s: %.2f %.2f %.2f(    (   t   osR$   t   opent   timesRŠ   t   closeRJ   R   R    RÝ   t   pathR(   R   t   dumpR‰   (   t   argsRç   t	   to_picklet	   file_nameRH   t   t0t   reflection_filet   tnt   t_parseR¦   t   miller_arrayst   miller_arrayt   pickle_file_namet   t_dumpt   t_loadt   t(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   run  sB     	"


""(   t   __doc__t
   __future__R    t    iotbx.cns.crystal_symmetry_utilsR   R   R   R�   R   R   t   cctbx.array_familyR   t   libtbxR   R   Rž   RE   t	   ExceptionR	   t   objectR   R6   RY   RŠ   R×   Rú   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/cns/reflection_reader.pyt   <module>   s    <'µ¸	$