00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 """Helper for operations with CalibCycles.
00012
00013 This software was developed for the SIT project. If you use all or
00014 part of it, please give an appropriate acknowledgment.
00015
00016 @see RelatedModule
00017
00018 @version $Id:$
00019
00020 @author Mikhail S. Dubrovin
00021 """
00022
00023
00024
00025
00026 __version__ = "$Revision: 4 $"
00027
00028
00029
00030
00031
00032 import sys
00033 import os
00034 import h5py
00035
00036
00037
00038
00039 import GlobalMethods as gm
00040
00041
00042
00043
00044 class CalibCycles :
00045 """Helper class for operations with CalibCycles
00046 """
00047
00048 def __init__ ( self, h5fname=None, dsname=None ) :
00049 """Initialization
00050
00051 if the h5fname is missing, than the self.numberOfCalibCycles
00052 should be defined from open file by extractNumberOfCalibCyclesFromOpenFile(...)
00053 """
00054
00055
00056
00057 if h5fname != None :
00058 self.numberOfCalibCycles = self.extractNumberOfCalibCycles(h5fname, dsname)
00059
00060
00061
00062
00063
00064
00065 def openHDF5File(self, h5fname) :
00066 self.h5file = h5py.File(h5fname, 'r')
00067 return self.h5file
00068
00069
00070
00071 def closeHDF5File(self) :
00072 self.h5file.close()
00073
00074
00075
00076 def extractNumberOfCalibCycles(self, h5fname, dsname) :
00077 h5file = self.openHDF5File(h5fname)
00078 numberOfCalibCycles = self.extractNumberOfCalibCyclesFromOpenFile(h5file, dsname)
00079 self.closeHDF5File()
00080 return numberOfCalibCycles
00081
00082
00083
00084 def extractNumberOfCalibCyclesFromOpenFile(self, h5file, dsname) :
00085 runGroupName = self.getRunGroupName(dsname)
00086 g = h5file[runGroupName]
00087 self.numberOfCalibCycles = len(g.items())
00088 return self.numberOfCalibCycles
00089
00090
00091
00092 def getNumberOfCalibCycles(self) :
00093 return self.numberOfCalibCycles
00094
00095
00096
00097 def getRunGroupName(self, dsname) :
00098 s0, sN, isFoundInString = gm.getPatternEndsInTheString(dsname, pattern='Run:')
00099 if isFoundInString :
00100 runGroupName = dsname[0:sN+4]
00101 return runGroupName
00102 else :
00103 return None
00104
00105
00106
00107 def getCalibCycleNumber(self, dsname) :
00108 s0, sN, isFoundInString = gm.getPatternEndsInTheString(dsname, pattern='CalibCycle:')
00109 if isFoundInString :
00110 calibcycleNumber = dsname[sN:sN+4]
00111 return int(calibcycleNumber)
00112 else :
00113 return None
00114
00115
00116
00117 def get4DigitStringFromNumber(self, N) :
00118 str_number = '%04d' % N
00119 return str_number
00120
00121
00122
00123 def getDSNameForCalibCycleNumber(self, dsname, Ncc) :
00124 s0, sN, isFoundInString = gm.getPatternEndsInTheString(dsname, pattern='CalibCycle:')
00125 if isFoundInString :
00126
00127 NccNew = self.checkNccLimits(Ncc)
00128 return dsname[0:sN] + self.get4DigitStringFromNumber(NccNew) + dsname[sN+4:]
00129 else :
00130 return None
00131
00132
00133
00134 def checkNccLimits(self, Ncc) :
00135 NccNew = Ncc
00136 if NccNew < 0 :
00137 NccNew = 0
00138 print 'WARNING: Requested CalibCycle number < 0: set NccNew =', NccNew
00139 if NccNew >= self.numberOfCalibCycles :
00140 NccNew = self.numberOfCalibCycles - 1
00141 print 'WARNING: Requested CalibCycle number > max: set NccNew =', NccNew
00142 return NccNew
00143
00144
00145
00146 def getDSNameForCalibCycleDN(self, dsname, dNcc) :
00147 Ncc = self.getCalibCycleNumber(dsname)
00148 return self.getDSNameForCalibCycleNumber(dsname, Ncc + dNcc)
00149
00150
00151
00152
00153 if __name__ == "__main__" :
00154
00155 h5fname = '/reg/d/psdm/AMO/amo30211/hdf5/amo30211-r0326.h5'
00156 dsname = '/Configure:0000/Run:0000/CalibCycle:0012/Acqiris::DataDescV1/AmoETOF.0:Acqiris.0/waveforms'
00157
00158 print 'h5fname =', h5fname
00159 print 'dsname =', dsname
00160
00161 o = CalibCycles( h5fname, dsname )
00162
00163 print 'Run group name =', o.getRunGroupName(dsname)
00164 print 'CalibCycle number =', o.getCalibCycleNumber(dsname)
00165 print 'Number of calibcycles =', o.extractNumberOfCalibCycles(h5fname, dsname)
00166 print 'Number of calibcycles =', o.getNumberOfCalibCycles()
00167 print '4-digit string for N=56 =', o.get4DigitStringFromNumber(56)
00168 print 'dsname for CalibCycle 17 =', o.getDSNameForCalibCycleNumber(dsname,17)
00169 print 'dsname for CalibCycle -11 =', o.getDSNameForCalibCycleNumber(dsname,-11)
00170 print 'dsname for CalibCycle 57 =', o.getDSNameForCalibCycleNumber(dsname,57)
00171 print 'dsname for CalibCycle N+1 =', o.getDSNameForCalibCycleDN(dsname, 1)
00172 print 'dsname for CalibCycle N-3 =', o.getDSNameForCalibCycleDN(dsname,-3)
00173 print 'dsname for CalibCycle N+2 =', o.getDSNameForCalibCycleDN(dsname, 2)
00174 print 'dsname for CalibCycle N+40 =', o.getDSNameForCalibCycleDN(dsname, 40)
00175 print 'dsname for CalibCycle N-40 =', o.getDSNameForCalibCycleDN(dsname,-40)
00176
00177 sys.exit ( "End of test" )
00178
00179