00001
00002
00003
00004
00005
00006 """
00007 :py:class:`PSCalib.DCVersion` - class for the Detector Calibration (DC) project.
00008
00009 Usage::
00010
00011 # Import
00012 from PSCalib.DCVersion import DCVersion
00013
00014 # Initialization
00015 o = DCVersion(vnum, tsprod=None, arr=None, cmt=None)
00016
00017 # Methods
00018 o.set_vnum(vnum) # sets (int) version
00019 o.set_tsprod(tsprod) # sets (double) time stamp of the version production
00020 o.add_data(data) # sets (str or np.array) calibration data
00021 vnum = o.vnum() # returns (int) version number
00022 s_vnum = o.str_vnum() # returns (str) version number
00023 tsvers = o.tsprod() # returns (double) time stamp of the version production
00024 data = o.data() # returns (np.array) calibration array
00025 o.save(group) # saves object content under h5py.group in the hdf5 file.
00026 o.load(group) # loads object content from the h5py.group of hdf5 file.
00027 o.print_obj() # print info about this object.
00028
00029 # and all methods inherited from PSCalib.DCBase
00030
00031
00032 @see project modules
00033 * :py:class:`PSCalib.DCStore`
00034 * :py:class:`PSCalib.DCType`
00035 * :py:class:`PSCalib.DCRange`
00036 * :py:class:`PSCalib.DCVersion`
00037 * :py:class:`PSCalib.DCBase`
00038 * :py:class:`PSCalib.DCInterface`
00039 * :py:class:`PSCalib.DCUtils`
00040 * :py:class:`PSCalib.DCDetectorId`
00041 * :py:class:`PSCalib.DCConfigParameters`
00042 * :py:class:`PSCalib.DCFileName`
00043 * :py:class:`PSCalib.DCLogger`
00044 * :py:class:`PSCalib.DCMethods`
00045 * :py:class:`PSCalib.DCEmail`
00046
00047 This software was developed for the SIT project.
00048 If you use all or part of it, please give an appropriate acknowledgment.
00049
00050 @version $Id: DCVersion.py 12898 2016-11-22 19:27:56Z dubrovin@SLAC.STANFORD.EDU $
00051
00052 @author Mikhail S. Dubrovin
00053 """
00054
00055
00056 __version__ = "$Revision: 12898 $"
00057
00058
00059 import os
00060 import sys
00061 import numpy as np
00062
00063 from math import floor
00064 from PSCalib.DCInterface import DCVersionI
00065 from PSCalib.DCLogger import log
00066 from PSCalib.DCUtils import sp, get_subgroup, save_object_as_dset
00067
00068
00069
00070 def version_int_to_str(vnum) : return ('v%04d' % vnum) if vnum is not None else 'None'
00071
00072 def version_str_to_int(vstr) : return int(vstr.lstrip('v').lstrip('0'))
00073
00074 class DCVersion(DCVersionI) :
00075
00076 """Class for the Detector Calibration (DC) project
00077
00078 Parameters
00079 \n vnum : int - version number
00080 \n tsprod : double - time in sec
00081 \n arr : numpy.array - array of constants to save
00082 \n cmt : str - comment
00083 """
00084
00085 def __init__(self, vnum, tsprod=None, arr=None, cmt=None) :
00086 DCVersionI.__init__(self, vnum, tsprod, arr, cmt)
00087 self._name = self.__class__.__name__
00088
00089 self.set_vnum(vnum)
00090 self.set_tsprod(tsprod)
00091 self.add_data(arr)
00092 log.debug('In c-tor for version: %s' % vnum, self._name)
00093
00094 def set_vnum(self, vnum) : self._vnum = vnum
00095
00096 def set_tsprod(self, tsprod) : self._tsprod = tsprod
00097
00098 def add_data(self, data) : self._data = data
00099
00100 def vnum(self) : return self._vnum
00101
00102 def str_vnum(self) : return version_int_to_str(self._vnum)
00103
00104 def tsprod(self) : return self._tsprod
00105
00106 def data(self) : return self._data
00107
00108 def save(self, group) :
00109 grp = get_subgroup(group, self.str_vnum())
00110 ds1 = save_object_as_dset(grp, 'version', data=self.vnum())
00111 ds2 = save_object_as_dset(grp, 'tsprod', data=self.tsprod())
00112 ds3 = save_object_as_dset(grp, 'data', data=self.data())
00113
00114 msg = '==== save(), group %s object for version %d' % (grp.name, self.vnum())
00115 log.debug(msg, self._name)
00116
00117 self.save_base(grp)
00118
00119
00120 def load(self, grp) :
00121 msg = '==== load data from group %s and fill object %s' % (grp.name, self._name)
00122 log.debug(msg, self._name)
00123
00124 for k,v in dict(grp).iteritems() :
00125
00126
00127
00128 if isinstance(v, sp.dataset_t) :
00129 log.debug('load dataset "%s"' % k, self._name)
00130
00131 if k == 'version': self.set_vnum(v[0])
00132 elif k == 'tsprod' : self.set_tsprod(v[0])
00133 elif k == 'data' :
00134 d = v.value
00135 if str(d.dtype)[:2] == '|S' :
00136 d=d.tostring()
00137
00138 self.add_data(d)
00139
00140 else : log.warning('group "%s" has unrecognized dataset "%s"' % (grp.name, k), self._name)
00141
00142
00143 elif isinstance(v, sp.group_t) :
00144 if self.is_base_group(k,v) : continue
00145
00146
00147
00148
00149
00150
00151 def print_obj(self) :
00152 offset = 4 * self._offspace
00153 self.print_base(offset)
00154 print '%s version %s' % (offset, self.vnum())
00155
00156 tsec = self.tsprod()
00157 msg = '%d: %s' % (floor(tsec), self.tsec_to_tstr(tsec)) if tsec is not None else 'None'
00158 print '%s tsprod %s' % (offset, msg)
00159
00160 data = self.data()
00161 if isinstance(data, np.ndarray) :
00162 print '%s data.shape %s dtype %s' % (offset, str(data.shape), str(data.dtype))
00163 else :
00164 print '%s data' % (offset)
00165 for s in data.split('\n') : print '%s %s' % (offset, s)
00166
00167
00168
00169
00170 def __del__(self) :
00171 pass
00172
00173
00174
00175
00176
00177
00178
00179 def test_DCVersion() :
00180
00181 o = DCVersion(None)
00182
00183 o.set_vnum(5)
00184 o.set_tsprod(None)
00185 o.add_data(None)
00186
00187 r = o.vnum()
00188 r = o.str_vnum()
00189 r = o.tsprod()
00190 r = o.data()
00191
00192
00193
00194
00195 r = o.get(None, None, None)
00196
00197
00198
00199 def test() :
00200 log.setPrintBits(0377)
00201
00202 if len(sys.argv)==1 :
00203 print 'For test(s) use command: python %s <test-number=1-4>' % sys.argv[0]
00204 test_DCVersion()
00205 elif(sys.argv[1]=='1') : test_DCVersion()
00206 else : print 'Non-expected arguments: sys.argv = %s use 1,2,...' % sys.argv
00207
00208
00209
00210 if __name__ == "__main__" :
00211 test()
00212 sys.exit( 'End of %s test.' % sys.argv[0])
00213
00214