fabio.HiPiCimage

Package fabio :: Module HiPiCimage |
[hide private]
[frames] | no frames]

# Source Code for Module fabio.HiPiCimage

      1
      2  #!/usr/bin/env python
      3  """
      4  Authors: Henning O. Sorensen & Erik Knudsen
      5           Center for Fundamental Research: Metal Structures in Four Dimensions
      6           Risoe National Laboratory
      7           Frederiksborgvej 399
      8           DK-4000 Roskilde
      9           email:erik.knudsen@risoe.dk
     10
     11          + Jon Wright, ESRF
     12
     13  Information about the file format from Masakatzu Kobayashi is highly appreciated
     14  """
     15
     16  import numpy, logging
     17  logger = logging.getLogger("HiPiCimage")
     18  from fabioimage import fabioimage
     19
     20 -class HiPiCimage(fabioimage):
     21      """ Read HiPic images e.g. collected with a Hamamatsu CCD camera"""
     22
     23
     24 -    def _readheader(self, infile):
     25          """
     26          Read in a header from an already open file
     27
     28          """
     29          Image_tag = infile.read(2)
     30          print Image_tag
     31          Comment_len = numpy.fromstring(infile.read(2), numpy.uint16)
     32          Dim_1 = numpy.fromstring(infile.read(2), numpy.uint16)[0]
     33          Dim_2 = numpy.fromstring(infile.read(2), numpy.uint16)[0]
     34          Dim_1_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0]
     35          Dim_2_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0]
     36          HeaderType = numpy.fromstring(infile.read(2), numpy.uint16)[0]
     37          Dump = infile.read(50)
     38          Comment = infile.read(Comment_len)
     39          self.header['Image_tag'] = Image_tag
     40          self.header['Dim_1'] = Dim_1
     41          self.header['Dim_2'] = Dim_2
     42          self.header['Dim_1_offset'] = Dim_1_offset
     43          self.header['Dim_2_offset'] = Dim_2_offset
     44          #self.header['Comment'] = Comment
     45          if Image_tag != 'IM' :
     46              # This does not look like an HiPic file
     47              logging.warning("no opening.  Corrupt header of HiPic file " + \
     48                              str(infile.name))
     49          Comment_split = Comment[:Comment.find('\x00')].split('\r\n')
     50
     51          for topcomment in Comment_split:
     52              topsplit = topcomment.split(',')
     53              for line in topsplit:
     54                  if '=' in line:
     55                      key, val = line.split('=' , 1)
     56                      # Users cannot type in significant whitespace
     57                      key = key.rstrip().lstrip()
     58                      self.header_keys.append(key)
     59                      self.header[key] = val.lstrip().rstrip()
     60                      self.header[key] = val.lstrip('"').rstrip('"')
     61
     62 -    def read(self, fname, frame=None):
     63          """
     64          Read in header into self.header and
     65              the data   into self.data
     66          """
     67          self.header = {}
     68          self.resetvals()
     69          infile = self._open(fname, "rb")
     70          self._readheader(infile)
     71          # Compute image size
     72          try:
     73              self.dim1 = int(self.header['Dim_1'])
     74              self.dim2 = int(self.header['Dim_2'])
     75          except:
     76              raise Exception("HiPic file", str(fname) + \
     77                                  "is corrupt, cannot read it")
     78          bytecode = numpy.uint16
     79          self.bpp = len(numpy.array(0, bytecode).tostring())
     80
     81          # Read image data
     82          block = infile.read(self.dim1 * self.dim2 * self.bpp)
     83          infile.close()
     84
     85          #now read the data into the array
     86          try:
     87              self.data = numpy.reshape(
     88                  numpy.fromstring(block, bytecode),
     89                  [self.dim2, self.dim1])
     90          except:
     91              print len(block), bytecode, self.bpp, self.dim2, self.dim1
     92              raise IOError, \
     93                'Size spec in HiPic-header does not match size of image data field'
     94          self.bytecode = self.data.dtype.type
     95
     96          # Sometimes these files are not saved as 12 bit,
     97          # But as 16 bit after bg subtraction - which results
     98          # negative values saved as 16bit. Therefore values higher
     99          # 4095 is really negative values
    100          if self.data.max() > 4095:
    101              gt12bit = self.data > 4095
    102              self.data = self.data - gt12bit * (2 ** 16 - 1)
    103
    104          # ensure the PIL image is reset
    105          self.pilimage = None
    106          return self
    107