ó
w™xTc           @   s”   d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l	 m
 Z
 d  d l m Z e Z d e
 f d „  ƒ  YZ d S(	   iÿÿÿÿ(   t   divisionN(   t   approx_equal(   t   flex(   t   DetectorImageBase(   t	   ReadDTrekt
   DTREKImagec           B   sV   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   s@   enforce dTREK Image Format v1.1, using Rigaku/MSC documentation.c         C   s   t  j |  | ƒ d |  _ d  S(   Nt   RAXIS(   R   t   __init__t
   vendortype(   t   selft   filename(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyR      s    c   	      C   sq  t  |  j d ƒ } z” | j d ƒ d k s0 t ‚ g  | j d ƒ D] } | j ƒ  r@ | ^ q@ } t d j | ƒ ƒ } | d d k s‰ t ‚ | j d ƒ | j | ƒ } Wd  | j ƒ  X| j	 ƒ  } | d d !d	 k sÙ t ‚ | d
 d k sï t ‚ | |  _
 | d d !j d ƒ } g  |  _ i  |  _ xJ | D]B } |  j j | j d ƒ ƒ |  j d d |  j |  j d d <q'Wd  S(   Nt   rbi   s   {
HEADER_BYTESi   t    i   i    i   s   {
iþÿÿÿs   
}iýÿÿÿs   ;
t   =iÿÿÿÿi   (   t   openR
   t   readt   AssertionErrort   isdigitt   intt   joint   seekt   closet   rstript   headert   splitt   headerlinest   keyst   append(	   R	   t   Gt   charact   rawt   header_bytest   padded_headert   unpadded_headert   raw_key_valuest   i(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyt   read_vendor_header   s&    .		 	c   	      C   s@  d t  d f d t  d f d t  d f d t j d f d t d f d	 t d f d
 t d f d t j d f d t j d f d t d f d t d f d t j d f d t d f d t j d f d t j d f d t j d f d t  d f d t  d f g |  _ x|  j D]} t j | d ƒ } | j |  j ƒ } xÖ | D]Î } t	 rE| Gn  | d d k rv| d |  j
 | ƒ |  j
 | <nu |  j |  j
 | ƒ } g  | D] } | d | ƒ ^ q“} | d d k rÞt | ƒ | d k sÞt ‚ n  | |  j
 | <t	 r2|  j
 | GHq2q2Wq Wx1 d d d g D]  } t  |  j
 | ƒ |  j
 | <qWd  S(   Nt   SIZE1i   t   SIZE2t   SATURATED_VALUEt   DETECTOR_NAMESi    s$   \n([0-9A-Za-z]+_DETECTOR_DIMENSIONS)i   s   \n([0-9A-Za-z]+_DETECTOR_SIZE)s   \n(ROTATION)=i
   s   \n([0-9A-Za-z]+_GONIO_NAMES)s   \n([0-9A-Za-z]+_GONIO_UNITS)s   \n([0-9A-Za-z]+_GONIO_VALUES)t   SOURCE_WAVELENGTHs(   \n([0-9A-Za-z]+_SPATIAL_DISTORTION_TYPE)s(   \n([0-9A-Za-z]+_SPATIAL_DISTORTION_INFO)i   t   DETECTOR_TYPEt	   DATA_TYPEt
   BYTE_ORDERt   RAXIS_COMPRESSION_RATIOt   HEADER_BYTES(   R   t   typest
   StringTypet   floatt   enft   ret   compilet   findallR   t   verboseR   t   tokenizet   lenR   (	   R	   t   mandatet   patternt   matchest   matcht
   all_tokenst   azt
   all_valuest   integer(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyt   enforce_types'   sH     !# c         C   sI   t  | ƒ t k r | S| j d ƒ } x d | k rD | j d ƒ q( W| S(   Nt    R   (   t   typet   listR   t   remove(   R	   t   string_t   tokens(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyR7   R   s     c   
      C   s]  i  |  _  t rB x0 |  j D]" } d | d G|  j | d GHq Wn  |  j d |  j  d <|  j d |  j  d <|  j d |  j  d <|  j d d } t j |  j | d ƒ } t j |  j | d	 ƒ } | | } | d | d
 k sç t ‚ | d |  j  d <t |  j d d
 |  j d d |  j d d ƒ s2t ‚ |  j d d |  j  d <|  j d d |  j  d <|  j | d j d ƒ } |  j | d | d k s�t ‚ |  j | d | |  j  d <|  j d d d k sÖt ‚ |  j d d
 |  j  d <|  j | d d k st ‚ t j |  j | d d d !ƒ } | | k s>t ‚ t j |  j | d d d !ƒ | } | d |  j  d <| d
 |  j  d <|  j | d j d ƒ }	 |  j | d |	 d  k sÀt ‚ |  j | d |	 |  j  d! <|  j j	 d" ƒ r|  j d" |  j  d# <nT |  j j	 |  j d d d$ ƒ rL|  j |  j d d d$ |  j  d# <n d% |  j  d# <d  S(&   Ns   %29si    R%   R&   R'   t   CCD_IMAGE_SATURATIONR(   t   DETECTOR_SIZEt   DETECTOR_DIMENSIONSi   t
   PIXEL_SIZEt   ROTATIONi   t	   OSC_STARTt	   OSC_RANGEt   GONIO_NAMESt   Distancet   GONIO_UNITSt   mmt   GONIO_VALUESt   DISTANCER)   g      ð?t
   WAVELENGTHt   SPATIAL_DISTORTION_TYPEt   Simple_spatialt   SPATIAL_DISTORTION_INFOi   t   BEAM_CENTER_Xt   BEAM_CENTER_Yt   2Thetat   degt   TWOTHETAR*   t   DETECTOR_SNt   DETECTOR_IDENTIFICATIONs   No serial number(
   t
   parametersR6   R   R   R   t   doubleR   R   t   indext   has_key(
   R	   R#   t   dname_prefixt   sizest   pixelst   pixel_sizest   distance_idxt   check_pixel_sizest   beam_mmt   tt_idx(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyt   generic_param_from_vendor_headY   sL    	#
 !!!&c         C   s.   |  j  s* |  j ƒ  |  j ƒ  |  j ƒ  n  d  S(   N(   R`   R$   RA   Rl   (   R	   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyt
   readHeaderŒ   s    	

c         C   s8   |  j  ƒ  |  j d j ƒ  j d ƒ d k r0 d Sd Sd  S(   NR,   t   bigi    i   (   Rm   R   t   lowert   find(   R	   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyt	   getEndian’   s    
"c         C   sm  t  |  j d ƒ } zò | j |  j d ƒ i d d 6d d 6|  j d } i d d	 6d
 d 6d d 6d d 6d d 6d d 6d d 6|  j d } i d d 6d d
 6d d 6d d 6d d 6d d 6d d 6| } | d k sØ t ‚ |  j d |  j d } | j | | ƒ } Wd  | j ƒ  X|  j t	 d | d | d |  j d d |  j d d  |  j
 ƒ  d! |  j j d" d ƒ ƒ ƒ d  S(#   NR   R.   t   <t   little_endiant   >t
   big_endianR,   t   bs   signed chart   Bs   unsigned chart   hs	   short intR#   s   long intt   Hs   unsigned short intt   Is   unsigned long intt   fs
   float IEEEt	   Data_typei   i   i   R%   R&   R   t	   type_codet   slowt   fastt   swapt
   uncompressR-   (   R   R
   R   R   R   R`   R   R   t   bin_safe_set_dataR   t   endian_swap_requiredt   get(   R	   R   t   endian_codeR}   t	   type_sizet
   array_sizet   rawdata(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyR   ™   s.    
;(   t   __name__t
   __module__t   __doc__R   R$   RA   R7   Rl   Rm   Rq   R   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyR   
   s   			+		3		(   t
   __future__R    R3   R/   t   structt   libtbx.test_utilsR   t   scitbx.array_familyR   t   iotbx.detectors.detectorbaseR   t   iotbx.detectorsR   t   FalseR6   R   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/iotbx/detectors/dtrek.pyt   <module>   s   $