#-----------------------------------------------------------------------------
# File and Version Information:
# $Id: DCVersion.py 12898 2016-11-22 19:27:56Z dubrovin@SLAC.STANFORD.EDU $
#-----------------------------------------------------------------------------
"""
:py:class:`PSCalib.DCVersion` - class for the Detector Calibration (DC) project.
Usage::
# Import
from PSCalib.DCVersion import DCVersion
# Initialization
o = DCVersion(vnum, tsprod=None, arr=None, cmt=None)
# Methods
o.set_vnum(vnum) # sets (int) version
o.set_tsprod(tsprod) # sets (double) time stamp of the version production
o.add_data(data) # sets (str or np.array) calibration data
vnum = o.vnum() # returns (int) version number
s_vnum = o.str_vnum() # returns (str) version number
tsvers = o.tsprod() # returns (double) time stamp of the version production
data = o.data() # returns (np.array) calibration array
o.save(group) # saves object content under h5py.group in the hdf5 file.
o.load(group) # loads object content from the h5py.group of hdf5 file.
o.print_obj() # print info about this object.
# and all methods inherited from PSCalib.DCBase
@see project modules
* :py:class:`PSCalib.DCStore`
* :py:class:`PSCalib.DCType`
* :py:class:`PSCalib.DCRange`
* :py:class:`PSCalib.DCVersion`
* :py:class:`PSCalib.DCBase`
* :py:class:`PSCalib.DCInterface`
* :py:class:`PSCalib.DCUtils`
* :py:class:`PSCalib.DCDetectorId`
* :py:class:`PSCalib.DCConfigParameters`
* :py:class:`PSCalib.DCFileName`
* :py:class:`PSCalib.DCLogger`
* :py:class:`PSCalib.DCMethods`
* :py:class:`PSCalib.DCEmail`
This software was developed for the SIT project.
If you use all or part of it, please give an appropriate acknowledgment.
@version $Id: DCVersion.py 12898 2016-11-22 19:27:56Z dubrovin@SLAC.STANFORD.EDU $
@author Mikhail S. Dubrovin
"""
#---------------------------------
__version__ = "$Revision: 12898 $"
#---------------------------------
import os
import sys
import numpy as np
#from time import time
from math import floor
from PSCalib.DCInterface import DCVersionI
from PSCalib.DCLogger import log
from PSCalib.DCUtils import sp, get_subgroup, save_object_as_dset
#------------------------------
[docs]def version_int_to_str(vnum) : return ('v%04d' % vnum) if vnum is not None else 'None'
[docs]def version_str_to_int(vstr) : return int(vstr.lstrip('v').lstrip('0'))
[docs]class DCVersion(DCVersionI) :
"""Class for the Detector Calibration (DC) project
Parameters
\n vnum : int - version number
\n tsprod : double - time in sec
\n arr : numpy.array - array of constants to save
\n cmt : str - comment
"""
def __init__(self, vnum, tsprod=None, arr=None, cmt=None) : # int, double, np.array
DCVersionI.__init__(self, vnum, tsprod, arr, cmt)
self._name = self.__class__.__name__
self.set_vnum(vnum)
self.set_tsprod(tsprod)
self.add_data(arr)
log.debug('In c-tor for version: %s' % vnum, self._name)
[docs] def set_vnum(self, vnum) : self._vnum = vnum # int
[docs] def set_tsprod(self, tsprod) : self._tsprod = tsprod # double or None
[docs] def add_data(self, data) : self._data = data # np.array, str or None
[docs] def vnum(self) : return self._vnum # int
[docs] def str_vnum(self) : return version_int_to_str(self._vnum) # str
[docs] def tsprod(self) : return self._tsprod # double
[docs] def data(self) : return self._data # np.array
[docs] def save(self, group) :
grp = get_subgroup(group, self.str_vnum()) # (str)
ds1 = save_object_as_dset(grp, 'version', data=self.vnum()) # dtype='int'
ds2 = save_object_as_dset(grp, 'tsprod', data=self.tsprod()) # dtype='double'
ds3 = save_object_as_dset(grp, 'data', data=self.data()) # dtype='str' or 'np.array'
msg = '==== save(), group %s object for version %d' % (grp.name, self.vnum())
log.debug(msg, self._name)
self.save_base(grp)
[docs] def load(self, grp) :
msg = '==== load data from group %s and fill object %s' % (grp.name, self._name)
log.debug(msg, self._name)
for k,v in dict(grp).iteritems() :
#subgrp = v
#print ' ', k , v
if isinstance(v, sp.dataset_t) :
log.debug('load dataset "%s"' % k, self._name)
#t0_sec = time()
if k == 'version': self.set_vnum(v[0])
elif k == 'tsprod' : self.set_tsprod(v[0])
elif k == 'data' :
d = v.value
if str(d.dtype)[:2] == '|S' :
d=d.tostring() # .split('\n')
#print 'XXX: d, type(d): %s'%d, type(d)
self.add_data(d)
else : log.warning('group "%s" has unrecognized dataset "%s"' % (grp.name, k), self._name)
#print 'TTT %s dataset "%s" time (sec) = %.6f' % (sys._getframe().f_code.co_name, k, time()-t0_sec)
elif isinstance(v, sp.group_t) :
if self.is_base_group(k,v) : continue
# print 'XXX: ', self._name, k,v
# log.debug('load group "%s"' % k, self._name)
# o = self.add_version(v['version'][0])
# o.load(v)
[docs] def print_obj(self) :
offset = 4 * self._offspace
self.print_base(offset)
print '%s version %s' % (offset, self.vnum())
tsec = self.tsprod()
msg = '%d: %s' % (floor(tsec), self.tsec_to_tstr(tsec)) if tsec is not None else 'None'
print '%s tsprod %s' % (offset, msg)
data = self.data()
if isinstance(data, np.ndarray) :
print '%s data.shape %s dtype %s' % (offset, str(data.shape), str(data.dtype))
else :
print '%s data' % (offset)
for s in data.split('\n') : print '%s %s' % (offset, s)
#for k,v in self.versions().iteritems() :
# v.print_obj()
def __del__(self) :
pass
#---- TO-DO
# def get(self, p1, p2, p3) : return None
#------------------------------
[docs]def test_DCVersion() :
o = DCVersion(None)
o.set_vnum(5)
o.set_tsprod(None)
o.add_data(None)
r = o.vnum()
r = o.str_vnum()
r = o.tsprod()
r = o.data()
#o.save(None)
#o.load(None)
r = o.get(None, None, None)
#------------------------------
[docs]def test() :
log.setPrintBits(0377)
if len(sys.argv)==1 :
print 'For test(s) use command: python %s <test-number=1-4>' % sys.argv[0]
test_DCVersion()
elif(sys.argv[1]=='1') : test_DCVersion()
else : print 'Non-expected arguments: sys.argv = %s use 1,2,...' % sys.argv
#------------------------------
if __name__ == "__main__" :
test()
sys.exit( 'End of %s test.' % sys.argv[0])
#------------------------------