Changeset 2095


Ignore:
Timestamp:
Dec 16, 2015 3:20:26 PM (6 years ago)
Author:
bfrosik
Message:

Refactored the reader for better performance

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/imports/G2img_HDF5.py

    r2087 r2095  
    1616'''
    1717
    18 import numpy as np
     18import h5py
    1919import GSASIIIO as G2IO
    2020import GSASIIpath
    2121GSASIIpath.SetVersionNumber("$Revision: $")
    2222
    23 class HDF5_Reader(G2IO.ImportImage):
     23class Hdf5_Reader(G2IO.ImportImage):
    2424    '''Routine to read a HD5 image, typically from APS Sector 6.
    2525    B. Frosik/SDM. Initial version.
    26        
     26                   Refactored.       
    2727    '''
    2828    dsetlist = []
     29    buffer = {}
     30    init = False
    2931
    3032    def __init__(self):
    31         # check if HDF5 library is present, if not importer cannot be used
    32         try:
    33             import h5py
    34         except:
    35             self.UseReader = False
    36             print 'HDF5 Reader skipped because h5py library not installed'
     33        print 'start'
    3734        super(self.__class__,self).__init__( # fancy way to self-reference
    3835                                             extensionlist=('.hdf5','.hd5','.h5','.hdf'),
     
    4340
    4441    def ContentsValidator(self, filepointer):
    45         '''test by using the HDF5 open
    46         '''
    47         import h5py
     42        '''no test at this time
     43        '''
    4844        try:
    4945            # the following does not work, filepointer is not a filename
     
    5753        '''Read using HDF5 file reader, :func:`ReadData`
    5854        '''
    59         import h5py
    6055        imagenum = kwarg.get('blocknum')
    61         if imagenum is None: imagenum = 1
    62         f = None
    63         try:
    64             f = h5py.File(filename, 'r')
    65             #print f.keys()
    66             self.visit(f)
    67             self.Comments,self.Data,self.Npix,self.Image,more = self.read_set(f,imagenum=imagenum)
    68             self.LoadImage(ParentFrame,filename,imagenum)
    69             self.repeatcount = imagenum
    70             self.repeat = more
    71             print('Read image #'+str(imagenum)+' from file '+filename)
    72             return True
    73         except IOError:
    74             print 'cannot open file ', filename
     56        #self.buffer = kwarg.get('buffer')
     57       
     58        if self.init is False:
     59            self.init = True
     60            self.readDataset(filename)
     61
     62        len = self.buffer['len']
     63        if len is 1:
     64            image = self.buffer['image']
     65        else:
     66            images = self.buffer['image']
     67            image = images[imagenum-1]
     68
     69        self.Comments,self.Data,self.Npix,self.Image = self.read_set(image,imagenum=imagenum)
     70        if self.Npix == 0 or not self.Comments:
    7571            return False
    76         finally:
    77             if f is not None:
    78                f.close()
    79            
    80     def visit(self, f):         
    81         import h5py
     72        self.LoadImage(ParentFrame,filename,imagenum)
     73        self.repeatcount = imagenum
     74        self.repeat = imagenum < len
     75        #print('Read image #'+str(imagenum)+' from file '+filename)
     76        return True
     77       
     78    def readDataset(self,filename):
     79            imagenum = 1
     80            try:
     81                f = h5py.File(filename, 'r')
     82                self.visit(f, imagenum)
     83            except IOError:
     84                print 'cannot open file ', filename
     85                return False
     86            finally:
     87                if f is not None:
     88                   f.close()
     89       
     90         
     91    def visit(self, f, imagenum):
     92        #GSASIIpath.IPyBreak()   
     93        print 'visiting'     
    8294        def func(name, dset):
    8395            datakeyword = 'data'
     
    88100                    index = len(dset.name)-len(datakeyword)
    89101                    if index == lastindex:
    90                         self.image = np.array(f[dset.name],dtype=np.int32)
     102                        if self.buffer is not None:
     103                            if len(dset.shape) > 2:
     104                                    image = dset[0,...]
     105                                    self.buffer['image'] = dset[0,...]
     106                                    self.buffer['len'] = image.shape[0]
     107                            else:
     108                                self.buffer['image'] = dset[()]
     109                                self.buffer['len'] = 1
     110                            self.buffer['name'] = dset.name
     111                        #GSASIIpath.IPyBreak()
    91112        f.visititems(func)
    92113       
    93     def read_set(self,f,imagenum=1):
    94          more = False
     114    def read_set(self,image,imagenum=1):
     115         #more = False
    95116         head = ['raw data']
    96          #if multiple frames the array size is 1 x number_frames x 2048 x 2048
    97          num_dim = len(self.image.shape)
    98          #GSASIIpath.IPyBreak()
    99          if num_dim > 2:
    100              image = self.image[0,imagenum-1]
    101              more = self.image.shape[1] > imagenum
    102          else:
    103              image = self.image
    104117         x_dim = image.shape[0]
    105118         y_dim = image.shape[1]
     
    107120         Npix = sizexy[0]*sizexy[1]             
    108121         data = {'pixelSize':[200,200],'wavelength':0.15,'distance':250.0,'center':[204.8,204.8],'size':sizexy}
    109          return head,data,Npix,image,more
     122         return head,data,Npix,image
Note: See TracChangeset for help on using the changeset viewer.