PSCalib/src/DCVersion.py

Go to the documentation of this file.
00001 #-----------------------------------------------------------------------------
00002 # File and Version Information:
00003 #  $Id: DCVersion.py 12898 2016-11-22 19:27:56Z dubrovin@SLAC.STANFORD.EDU $
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 #from time import time
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) : # int, double, np.array
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     # int
00095 
00096     def set_tsprod(self, tsprod)   : self._tsprod = tsprod # double or None
00097 
00098     def add_data(self, data)       : self._data = data     # np.array, str or None
00099 
00100     def vnum(self)                 : return self._vnum     # int
00101 
00102     def str_vnum(self)             : return version_int_to_str(self._vnum) # str
00103 
00104     def tsprod(self)               : return self._tsprod   # double
00105 
00106     def data(self)                 : return self._data      # np.array
00107 
00108     def save(self, group) :
00109         grp = get_subgroup(group, self.str_vnum())                      # (str)
00110         ds1 = save_object_as_dset(grp, 'version', data=self.vnum())     # dtype='int'
00111         ds2 = save_object_as_dset(grp, 'tsprod',  data=self.tsprod())   # dtype='double'
00112         ds3 = save_object_as_dset(grp, 'data',    data=self.data())     # dtype='str' or 'np.array'
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             #subgrp = v
00126             #print '    ', k , v
00127 
00128             if isinstance(v, sp.dataset_t) :                    
00129                 log.debug('load dataset "%s"' % k, self._name)
00130                 #t0_sec = time()
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() # .split('\n')
00137                         #print 'XXX: d, type(d): %s'%d, type(d)
00138                     self.add_data(d)
00139 
00140                 else : log.warning('group "%s" has unrecognized dataset "%s"' % (grp.name, k), self._name)
00141                 #print 'TTT %s dataset "%s" time (sec) = %.6f' % (sys._getframe().f_code.co_name, k, time()-t0_sec)
00142 
00143             elif isinstance(v, sp.group_t) :
00144                 if self.is_base_group(k,v) : continue
00145             #    print 'XXX: ', self._name, k,v
00146             #    log.debug('load group "%s"' % k, self._name)
00147             #    o = self.add_version(v['version'][0])
00148             #    o.load(v)
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         #for k,v in self.versions().iteritems() :
00168         #    v.print_obj()
00169 
00170     def __del__(self) :
00171         pass
00172 
00173 #---- TO-DO
00174 
00175 #    def get(self, p1, p2, p3)  : return None
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     #o.save(None)
00193     #o.load(None)
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 #------------------------------

Generated on 19 Dec 2016 for PSANAmodules by  doxygen 1.4.7