fabio.openimage

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

# Source Code for Module fabio.openimage

      1  """
      2
      3  Authors: Henning O. Sorensen & Erik Knudsen
      4           Center for Fundamental Research: Metal Structures in Four Dimensions
      5           Risoe National Laboratory
      6           Frederiksborgvej 399
      7           DK-4000 Roskilde
      8           email:henning.sorensen@risoe.dk
      9
     10  mods for fabio by JPW
     11
     12  """
     13  import sys, logging
     14  logger = logging.getLogger("openimage")
     15  from fabioutils  import FilenameObject
     16  from fabioimage import fabioimage
     17  import edfimage
     18  import adscimage
     19  import tifimage
     20  import marccdimage
     21  import mar345image
     22  import fit2dmaskimage
     23  import brukerimage
     24  import bruker100image
     25  import pnmimage
     26  import GEimage
     27  import OXDimage
     28  import dm3image
     29  import HiPiCimage
     30  import pilatusimage
     31  import fit2dspreadsheetimage
     32  import kcdimage
     33  import cbfimage
     34  import xsdimage
     35  import binaryimage
     36
     37  MAGIC_NUMBERS = [
     38      # "\42\5a" : 'bzipped'
     39      # "\1f\8b" : 'gzipped'
     40      ("FORMAT :        86" , 'bruker'),
     41      ("\x4d\x4d\x00\x2a"   , 'tif') ,
     42      # The marCCD and Pilatus formats are both standard tif with a header
     43      # hopefully these byte patterns are unique for the formats
     44      # If not the image will be read, but the is missing
     45      ("\x49\x49\x2a\x00\x08\x00"   , 'marccd') ,
     46      ("\x49\x49\x2a\x00\x82\x00"   , 'pilatus') ,
     47      ("\x49\x49\x2a\x00"   , 'tif') ,
     48      # ADSC must come before edf
     49      ("{\nHEA"             , 'adsc'),
     50      ("{"                  , 'edf'),
     51      ("\r{"                , 'edf'),
     52      ("\n{"                , 'edf'),
     53      ("ADEPT"              , 'GE'),
     54      ("OD"                 , 'OXD'),
     55      ("IM"                 , 'HiPiC'),
     56      ('\x2d\x04'           , 'mar345'),
     57      ('\xd2\x04'           , 'mar345'),
     58      ('\x04\x2d'           , 'mar345'), #some machines may need byteswapping
     59      ('\x04\xd2'           , 'mar345'),
     60      # hint : MASK in 32 bit
     61      ('M\x00\x00\x00A\x00\x00\x00S\x00\x00\x00K\x00\x00\x00' , 'fit2dmask') ,
     62      ('\x00\x00\x00\x03'   , 'dm3'),
     63      ("No"                 , "kcd"),
     64      ("<"                  , "xsd")
     65      ]
     66
     67 -def do_magic(byts):
     68      """ Try to interpret the bytes starting the file as a magic number """
     69      for magic, format_type in MAGIC_NUMBERS:
     70          if byts.find(magic) == 0:
     71              return format_type
     72          if 0: # debugging - bruker needed 18 bytes below
     73              logger.debug("m: %s f: %s", magic, format_type)
     74              logger.debug("bytes: %s len(bytes) %s", magic, len(magic))
     75              logger.debug("found: %s", byts.find(magic))
     76              for i in range(len(magic)):
     77                  logger.debug("%s %s %s %s ", ord(magic[i]), ord(byts[i]), magic[i], byts[i])
     78      raise Exception("Could not interpret magic string")
     79
     80
     81 -def openimage(filename, frame=None):
     82      """ Try to open an image """
     83      if isinstance(filename, FilenameObject):
     84          try:
     85              logger.debug("Attempting to open %s" % (filename.tostring()))
     86              obj = _openimage(filename.tostring())
     87              logger.debug("Attempting to read frame %s from %s" % (frame,
     88                  filename.tostring()))
     89              obj = obj.read(filename.tostring(), frame)
     90          except Exception, ex:
     91              # multiframe file
     92              #logger.debug( "DEBUG: multiframe file, start # %d"%(
     93              #    filename.num)
     94              logger.debug("Exception %s, trying name %s" % (ex, filename.stem))
     95              obj = _openimage(filename.stem)
     96              logger.debug("Reading frame %s from %s" % (filename.num, filename.stem))
     97              obj.read(filename.stem, frame=filename.num)
     98      else:
     99          logger.debug("Attempting to open %s" % (filename))
    100          obj = _openimage(filename)
    101          logger.debug("Attempting to read frame %s from %s" % (frame, filename))
    102          obj = obj.read(filename, frame)
    103      return obj
    104
    105
    106 -def openheader(filename):
    107      """ return only the header"""
    108      obj = _openimage(filename)
    109      obj.readheader(filename)
    110      return obj
    111
    112
    113 -def _openimage(filename):
    114      """
    115      determine which format for a filename
    116      and return appropriate class which can be used for opening the image
    117      """
    118      try:
    119          imo = fabioimage()
    120          byts = imo._open(filename).read(18)
    121          filetype = do_magic(byts)
    122          if filetype == "marccd" and filename.find("mccd") == -1:
    123              # Cannot see a way around this. Need to find something
    124              # to distinguish mccd from regular tif...
    125              filetype = "tif"
    126      except IOError, error:
    127          logger.error("%s: File probably does not exist", error)
    128          raise error
    129      except:
    130          try:
    131              file_obj = FilenameObject(filename=filename)
    132              if file_obj == None:
    133                  raise Exception("Unable to deconstruct filename")
    134              if (file_obj.format is not None) and\
    135                  len(file_obj.format) != 1 and \
    136                  type(file_obj.format) != type(["list"]):
    137                  # one of OXD/ ADSC - should have got in previous
    138                  raise Exception("openimage failed on magic bytes & name guess")
    139              filetype = file_obj.format
    140              #UNUSED filenumber = file_obj.num
    141          except Exception, error:
    142              logger.error(error)
    143              import traceback
    144              traceback.print_exc()
    145              raise Exception("Fabio could not identify " + filename)
    146      klass_name = "".join(filetype) + 'image'
    147      module = sys.modules.get("fabio." + klass_name, None)
    148      if module is not None:
    149          if hasattr(module, klass_name):
    150              klass = getattr(module, klass_name)
    151          else:
    152              raise Exception("Module %s has no image class" % module)
    153      else:
    154          raise Exception("Filetype not known %s %s" % (filename, klass_name))
    155      obj = klass()
    156      # skip the read for read header
    157      return obj
    158