Page History
...
- short-term goal - support in a single place calibration data for detectors moving across LCLS experiments.
- perspective goal long-term goal - calibration store for LCLS-II.
It is assumed that hardware Hardware configuration of modern detectors will detector can be associated with configuration index coming from DAQunique index hardwired on detector controller chip. This index will be used to recognize detector and extract hardly retrievable calibration data such as parameters for geometry, gain factors, masks etc. in case of transition of the detector from one experiment to another.
Requirements
- Instrument independent - detector can be moved between instruments and hatches. / Experiment independent - detector can be moved between experiments, hatches, and instruments.
- Portability - calibration data for particular detector should be portable as a self consistent file or (part of) calibration directory.
- API + Interfaces - API, Command Line (CL), GUI for central management; management can ONLY be done through the API/CL/GUI in order to prevent adding/removing unknown files without history.
- Time stamp (sec) - is THE ONLY value for validity range check; the same rules are applied to the time stamp , like for to the run number in current calibration system.
- The <detname> is equivalent to File name - the <detname> in the calibration store is <dettype>-<detid> and is THE ONLY choice for the file name in the calibration store.
- Aliases to the calibration file names and specific data can be used to simplify access.
- Support calibration versionsVersions - support versions of calibration data.
- Support links Links to predecessor and successor - support access to predecessor and successor if this info is available.
Architecture
To accommodate requirements calibration store Detector Calibration Store (DCS) suppose to be implemented as a combination of FS & DB file system (FS) and data base (DB) files (hdf5 for uniformity).
Calibration directory and files
Default calibration directory in LCLS FS
instrument and experiment-independent path
- /reg/g/psdm/detector/calib
in contrast to the current instrument and experiment-dependent path
- /reg/d/psdm/<INS>/<experiment>/calib
In local space
define calib path
- <path>/calib/
assuming further structure of the calibration directory <dettype>/<dettype>-<detid>.h5
or use detector calibration file directly
- <path>/<dettype>-<detid>.h5
Structure of calibration directory
Everything in lower case:
Code Block |
---|
<path>/calib/
<dettype>/
cspad2x2/
pnccd/
epix100a/
cspad/
<files>
<aliases1>.als # file with a map of aliases to detector names
...
<aliasesN>.als # one of these files can be used to map "sources" to detector names
<dettype>-<detid>.h5
<dettype>-<detid>.h5 |
Detector type <dettype> is used as a folder to organize files under the calib directory. In case of direct access to the hdf5 file the detector type is duplicated in the name of the file. Unique part of the detector name <detid> is used to assign calibration file to the particular detector version. If the detector is changing the new calibration file is created with new <detid>. Information about predecessor and successor (if available) can be saved under the root level of the calibration file. Current sources (ex: 'Camp.0:pnCCD.1' ) should be presented in the dictionary of aliases.
Calibration file structure
Calibration data hierarchical scheme
Access to calibration data is based on time stamp. Time stamp internally is presented in Unix time sec which can be easily converted forth and back to human readable format YYYY-MM-DDTHH:MM:SS+HH:MM
The scheme of the calibration data, which presumably will be implemented in <dettype>-<detid>.h5
Functionality of the DCS from bottom to top level can be listed as follows.
- All calibration constants for particular detector id (
detid
- index of the detector version) will be kept in a single hdf5 file named as<dettype>-<detid>.h5
- Schema of this file contains a few levels which account for constant types, time stamp ranges, versions of constants.
- Beside main functionality each level contains dictionary of parameters and dictionary of history records.
- These files are grouped in the directory for detector type; ex.:
cspad, cspad2x2, pnccd
, etc.- The same directory contains files with aliases
<aliases1>.als
which map human readable detector name-and-version with appropriate<dettype>-<detid>.h5
file.
- The same directory contains files with aliases
- All detector type folders in regular case are collected under
calib
directory, although it is assumed that calibration files can be used directly. - The
calib
directory may be nested in three locations;- repository - experiment-independent space with FS back-up, contains most complete calibration files in terms of time stamp and versions,
- experimental work-space - experiment-dependent space, contains squeezed version of calibration files with time stamp and versions essential for particular experiment,
- local work-space - experiment-independent any local directory, with squeezed files similar to experimental work-space.
The repository and experimental works-pace have predictable location in the file system, local work-space may have an arbitrary path. Direct file access pick up calibration file from any place.
- Two-levels of interaction with DCS:
- interaction with calibration data in particular calibration file,
- add/get/remove constants for type, time stamp, version, etc.
- add/remove/edit metadata.
- data exchange between files between repository, experimental and local work-spaces.
- file difference
- transfer constants for type, time stamp, version, etc.
- use web-service mechanism
- interaction with calibration data in particular calibration file,
- Access Control Lists (ACL) depends on file location and is assumed to be
- repository - limited to dedicated persons
- experimental work-spaces - members of experimental group
- local work-spaces - all
Calibration directory and files
Repository
instrument and experiment-independent path to calibration directory and file
- <PATH>/detector/calib/
<dettype>/<dettype>-<detid>.h5
Experiment calibration directory
experiment-dependent path to calibration directory and file
- <PATH>/<INS>/<experiment>/calib/
<dettype>/<dettype>-<detid>.h5
Local calibration directory
local calib path to calibration directory and file
- <path-to-calib>/calib/
<dettype>/<dettype>-<detid>.h5
Direct path to calibration file
direct path to calibration file
- <path-to-calib>/<dettype>-<detid>.h5
Structure of calibration directory
Everything in lower case:
Code Block |
---|
<path-to-calib>/calib/ # top calib directory
<dettype>/ # detector type folders
cspad2x2/
pnccd/
epix100a/
cspad/
<files> # level of files
<aliases1>.als # file with a map of aliases to detector names
...
<aliasesN>.als # one of these files can be used to map "sources" to detector names
<dettype>-<detid>.h5 # files with detector-dependent calibration data
<dettype>-<detid>.h5 |
- The
calib
directory is a top level DCS directory. - Detector type
<dettype>
folders are used to organize files under thecalib
directory. In case of direct access to the hdf5 file the detector type is duplicated in the name of the file. - Unique part of the detector name
<detid>
is used to assign calibration file to the particular detector hardware configuration version. If the detector hardware configuration is changing a new calibration file is created with new<detid>
. - Information about predecessor and successor (if available) can be saved under the root level of the calibration file.
- Current sources (ex:
'Camp.0:pnCCD.1'
) could be presented in the dictionary of aliases.
Calibration file structure
Calibration data hierarchical scheme
Access to calibration data is based on time stamp. Time stamp internally is presented in Unix time sec which can be easily converted forth and back to human readable format YYYY-MM-DDTHH:MM:SS+HH:MM
The schema (structure) of the DCS files <dettype>-<detid>.h5
Code Block |
---|
DCStore DCType DCRange DCVersion
/ # top-root-level contains info for the unique detector version
dettype (str) |
Code Block |
/ # detector type name, ex: cspad, pnccd, etc detid (str) # top-root-level contains info for the # unique detector versionid, ex: 01234 dettypetscfile (strfloat) # detectortime typestamp name,of ex:creation cspad,of pnccd,this etcstructure detidpredecessor (str) # name of the previous detector #if uniqueavailable detector id, ex: 01234or None tscfilesuccessor (uintstr) # #name of timethe stampnext ofdetector creationif ofavailable thisor structureNone predecessordictpars (strdict) # namedictionary of theparameters previousassociated detectorwith ifthis availableversion orof Nonedetector successorhistory (strdict) # name of thedictionary nextof detectorhistory ifrecords availablepaired or None tags (dict)as (tstamp:record) <ctype>/ # dictionaryfolder offor tagscalibration associated with this version of detector <ctype>/type, ex.: pedestals, rms, mask, etc ctype (str) # folder for calibration type name ctypedictpars (strdict) # dictionary of parameters associated #with calibration type name tagshistory (dict) # dictionary of tagshistory associatedrecords withpaired calibration typeas (tstamp:record) <tstamp-range>/ # folder for time stamp validity range <tstamp>[-<tstamp-end>]/ # folder for validity range. If <tstamp-end> is not specified - then valid to the end tsbegin (uintfloat) # time stamp for the beginning of the validity range tsend (uintfloat) # time stamp for the end of the validity range defaultv # reference to the default calibration, ex: <vers-tstamp2> tagsdictpars (dict) # dictionary of parameters associated with validity range history (dict) # dictionary of tagshistory associatedrecords withpaired validity rangeas (tstamp:record) <vers-tstamp1>/ # folder for version created on tstamp1 tsvers (uintfloat) # tstamp1 of this version production calib (ndarray) # calibration data history (strdict) # #dictionary productionof history records paired as (tstamp:record) tagsdictpars (dict) # dictionary of tagsparameters, # ex: array size, number of dimensions, shape, data type, experiment, run, comments, author <vers <vers-tstamp2>/ # folder for version created on tstamp2 tsvers (uintfloat) calib (ndarray) history (strdict) tagsdictpars (dict) <tstamp2>[-<tstamp2-end>]/ # folder for the next validity range. pedestals/ # folder for the next calibration type, pedestals rms/ # folder for the next calibration type, rms |
...
Schema features
- Detector name consists of a common part <dettype> part
<dettype>
and unique part<detid>
. - Alias to the detector name should be kept in separate dictionary outside the file scheme.
- Each detector may have optional predecessor, successor, and other tags parameters kept in the dictionary of parameters.
- Calibration type folders contain info about calibrations of particular type, ex: pedestals, rms, status, mask, background, etc.
- Each calibration type contains a set of time stamp ranges defining calibration validity range. If the second time stamp of the range is missing it is considered as infinity (by the end).
- The time stamp range folder contains tstamp_begin, tstamp_end (int) values, dictionary of tags parameters associated with this folder, reference to the default calibration, and folders with calibration versions, distinguished by there production time stamp.
- The number of calibration versions for each time stamp range is not limitedunlimited. Default calibration is defined by the reference default _ version
defaultv
.
Metadata in
...
dictpars
Below are the lists of metadata fields which potentially can be used to define detector configuration, calibration parameters etc.
Detector metadata
Field name | Description | More details, example |
---|---|---|
dettype | detector type | CSPAD, CSPAD2X2, EPIX100A, etc. |
detname | detector unique name | (if any) ex.: Camera1 |
detalias | alias name | if it is hard to memorize the entire name, ex.: 'cspad1' |
detidx | detector index | integer number which codes the hardware version |
detidxalias | symbolic alias of the index | can be used if it is hard to memorize the index integer number |
detcompidx:001 | list of component indexes | just in case if we are going to retrieve calibration parameters for separate components |
detidxprev | detector index for previous version | detector index for previous version (if available) for the purpose of old calibration search |
detidxnext | detector index for next version | detector index for next version (if available) for the purpose of new calibration search |
dettsec | time-stamp | time stamp associated with beginning of the validity range for new configuration |
detcom:001 | comments for this hardware version | as it says {key:comment} |
detpar:001 | other |
parameters | just in case if something is forgotten in this table |
Calibration parameters' metadata
Field name | Description | More details, example |
---|---|---|
calibtype | calibration type | ex.: geometry, pixel_status, pixel_gain, pedestals, common_mode, etc. |
tsec | time stamp | beginning of the validity range |
exp | original experiment | (if available) where calibration constants were obtained |
runnum | original run number | (if available) where calibration constants were obtained |
runbegin | begin run number | (if available) for validity range |
runend | end run number | (if available) for validity range |
source | original DAQ data source | data source from DAQ, ex.: 'CxiDs2.0:Cspad.0' |
srcalias | data source alias | ex.: 'cspad' |
calibvers | version |
par | in order to access using symbolic name or some alias | |
calibversalias | version alias | if it is hard to memorize version |
par | ||
com:001 | comments for this version | as it says {key:comment} |
par:001 | other |
parameters | just in case if something is forgotten in this table |
In case of numpy array their metadata are stored with an object.
Text file needs in n-d array metadata
n-d array metadata
Field name | Description | More details, example |
---|
DTYPE | (str) data type | int, float, double, etc. |
NDIMS | (int) number of dimensions (N) |
ex.: 3 | ||
DIM:1 | (int) size of dim.1 | ex. |
: 185 |
DIM:2 | (int) size of dim.2 | ex. |
: 388 | ||
... | ... | ... |
DIM:N | (int) size of dim.N | ex. |
: 2 |
API
Parameters
dettype
(str) - detector type: cspad, cspad2x2, pnccd, fccd, opal, epix100a
, etc.
ctype
(str) - calibration type: pedestals, status, rms, mask, gain, bkgd, common_mode, geometry
detid
(str) - detector unique id number, ex: 123456
detname
(str) - detector unique name, combination of <dettype>-<detid>
detalias
(str) - detector alias name assigned to the detname
cpath
(str) - path to the calibration directory (ex: cpath='<path>/calib'
) or direct hdf5 file name (ex: cpath='<path>/<detname>-<detid>.h5'
). Default calibration directory CPATH_DEF='/reg/g/psdm/detector/calib'
.
version
(int) - time stamp of the version creation
versind
(int) - consecutive version index assigned/mapped to the version production time stamp.
Initialization
, geometry
detid
(str) - detector unique id number, ex: 123456
detname
(str) - detector unique name, combination of <dettype>-<detid>
detalias
(str) - detector alias name assigned to the detname
cpath
(str) - path to the calibration directory (ex: cpath='<path>/calib'
) or direct hdf5 file name (ex: cpath='<path>/<detname>-<detid>.h5'
). Default calibration directory CPATH_DEF='/reg/g/psdm/detector/calib'
.
version
(int) - time stamp of the version creation
versind
(int) - consecutive version index assigned/mapped to the version production time stamp.
Initialization
Code Block |
---|
# Import
from PSCalib.DCStore import DCStore # inport DCStore (Detector Calibration Store) object
# Initialization
REPO = '<PATH>/detector/calib' # default calib repository
cdir = env.calibDir() |
Code Block |
# Import from PSCalib.DCStore import DCStore # inport DCStore (Detector Calibration Store) object # Initialization CPATH_DEF = '/reg/g/psdm/detector/calib' # default calib directory cpath = '<path>/calib' # local calib directory cpath = '<path>/<dettype>-<detid>.h5' # direct to file cpath = env.calibDir() # '/reg/d/psdm/<INS>/<experiment>/calib' - accept current directory detname = 'pnccd-12345678' # standard name includes detector type, dash, and n-digit id number detname = 'Camera1' # # alias cs = DCStore(cpath, detname) '<PATH>/<INS>/<experiment>/calib' - accept current directory path = cdir + <dettype> fname = '[path/]pnccd-12345678' # standard #name createsincludes adetector DCStore object. """ get calibration store object Input parameters: type, dash, and n-digit id number fname = '[path/]Camera1' cpath [str] - path to the hdf5 file or calibration directory.# alias cs = DCStore(fname) If cpath is a path to hdf5 file -# nextcreates parametera isDCStore ignoredobject. """ get calibration store object Input parameters: fname [str] - file name/alias of Ifthe cpath=None - default path is used. If cpath is specified as a path to directory (or default) then detname can be an alias. detname [str] - name/alias of the detector """ |
UI acess methods
Code Block |
---|
ctype = pedestals # status, rms, mask, gain, bkgd, common_mode, geometry, etc
tsp = tstamp parameter to identify constants, which can be retrieved from evt.run() - run number, evt
vers = None # for default or versind or version time stamp.
# generic access method:
obj = cs.get(ctype, tsp, vers)
|
Base class
Is reserved to support common methods of all project classes. For now it stands for manipulations with tags but not limited to.
detector
""" |
- If path is missing - use repository.
- If calibration file is not found - throw raise IOError('File %s is not available' % fname)
UI acess methods
Code Block |
---|
ctype = pedestals # status, rms, mask, gain, bkgd, common_mode, geometry, etc
tsp = tstamp parameter to identify constants, which can be retrieved from evt.run() - run number, evt
vers = None # for default or versind or version time stamp.
# generic access method:
obj = cs.get(ctype, tsp, vers=None)
|
Base class DCBase
Is reserved to support common methods of all project classes. For now it stands for manipulations with dictpars but not limited to.
Code Block |
---|
o = DCBase()
# acess methods
dictpars = o.dictpars() # returns (dictpars) dictionary of dictpars associated with each object
par = o.par(k) # returns par value for key k
log = o.history(fmt) |
Code Block |
DCBase - base class for this project ==================================== tags = obj.tags() # returns (str) history records preceded by the time #stamp (dictdefault fmt='%Y-%m-%dT%H:%M:%S%Z') dictionaryas ofa tagstext associated d with each object tag = objo.taghistdict(k) # returns #(dict) returnshistory tagdictionary valueassociated forwith keycurrent k objobject # management methods o.set_tagsdictpars(d) # set (dictd) dictionary of tagsparameters for object objo.add_tagpar(k,v) # add (k,v) tagpar to the dictionary of tagsparameters for object objo.del_tagsdictpars() # delete all tagsparameters from the dictionary obj.del_tag(k)o.del_par(k) # delete par with key k o.set_history(d) # set (dict) as a history dictionary of the current object o.add_history(rec, ts) # delete tag with key k |
Access methods
Code Block |
---|
DCStore # add (str) record with (float) time stamp to the history dictionary (ts:rec). If ts is None - call current time is used as a key. |
Class DCStore
Code Block |
---|
cs = DCStore(cpath, detnamemethods =============== tscfile = cs.tscfile() # (int) time stamp of the file creation dettype = cs.dettype() # (str) path to calib directory or #file, (str) detector typename detid# acess methods nda = cs.detid() get(ctype, tsp, vers) # (str) detectorctype id detname- calibration = cs.detname()type # (str) detector name of self object predecessor = cs.predecessor() # (str...) detnametsp of- predecessorparameter orto None successorget time =stamp cs.successor()evt, runnum, ts_sec) # (str) detname of successor or None ctypes = cs.ctypes() # (listint) vers calibration- typesversion inof the file cto calibration, None - use default tscfile = cs.ctypeobjtscfile(ctype) # (DCType ~ h5py.Group) calibration type object _________________________________________ nda int) time stamp of the file creation dettype = cs.get(ctype, tsp, vers)dettype() # (str) ctype - calibration type detector type detid = cs.detid() # (str) detector id detname = cs.detname() # (str) detector name of self object predecessor = cs.predecessor() # (str) detname of predecessor or None successor # (...) tsp - parameter to get time stamp (evt, runnum, ts_sec) _________________________________________# (int) vers - version of calibration, None - use default DCType methods ============== ctype= cs.successor() # (str) detname of successor or None ctypes = cs.ctypes() =# cto.ctype(list) calibration types in the file cto = cs.ctypeobj(ctype) # (strDCType ~ h5py.Group) ofcalibration ctypetype name tsranges = cto.ranges()object # management methods cs.set_tscfile(ts) # set (listint) of time rangesstamp forof ctype tsrothe file creation = cto.rangeobj(tsrange) # (DCRange ~ h5py.Group) time stamp validity range object DCRange methods =============== tsbegin = tsro.begin( cs.set_dettype(dettype) # set (str) detector type cs.set_detid(detid) # set (str) detector (intid cs.set_detname(detname) time stamp beginning validity range tsend = tsro.end(# set (str) detector name of self object cs.set_predecessor(pred) # #set (intstr) timedetname stampof ending validity range versions = tsro.versions(predecessor or None cs.set_successor(succ) # set (list of uintstr) versionsdetname of calibrations versodefsuccessor or None cs.add_ctype(ctype) = tsro.versdef() # add (DCVersionstr) ~ h5py.Group) referencecalibration type to the default version in the time-range object verso DCStore object cs.del_ctype(ctype) = tsro.versobj(vers) # delete ctype (str) from the #DCStore (DCVersion ~ h5py.Group) specified version in the time-range object DCVersion methods ================= tsversobject cs.save(path) = verso.tsprod() # save current calibration in the file specified # (int) time stamp of the version production calibdata = verso.calib(by path, if path is Null - update current file. |
Class DCType
Code Block |
---|
cto = DCType(dettype) # (np.arraystr) calibrationdetector arraytype rec# acess methods ctype = versocto.historyctype() # (str) production history record |
Management methods
Code Block |
---|
DCStore methods =============== cs.set_tscfile(ts) of ctype name tsranges = cto.ranges() # (list) of time ranges for ctype tsro = cto.rangeobj(tsrange) # (DCRange set (int~ h5py.Group) time stamp ofvalidity the file creation cs.set_dettype(dettype)range object # management methods cto.add_range(tsr) # setadd (str) detector type cs.set_detid(detidof time ranges for ctype cto.del_range(tsr) # delete range from the DCType object |
Class DCRange
Code Block |
---|
tsro = DCRange(tsrange# set (str) detector id cs.set_detname(detname) # set (str) detectortime namestamp ofvalidity self object cs.set_predecessor(pred) range tsro = DCRange(tsbegin, tsend) # set (strint,int) detnametime stamp of predecessor or None cs.set_successor(succ)validity range # acess methods tsbegin = tsro.begin() # set (strint) detnametime ofstamp successorbeginning orvalidity None cs.add_ctype(ctyperange tsend = tsro.end() # (int) time stamp ending # add (str) calibration type to the DCStore object cs.del_ctype(ctype) validity range versions = tsro.versions() # (list of float) versions of calibrations versodef = tsro.versdef() # delete ctype (str) from the DCStore object cs.save(path) (DCVersion ~ h5py.Group) reference to the default version in the time-range object verso = tsro.versobj(vers) # (DCVersion # save current calibration~ h5py.Group) specified version in the file specified by path, if path is Null - update current file. DCType methods ============== cto.add_range(tsr) time-range object # management methods tsro.set_begin(tsbegin) # addset (strint) oftime timestamp rangesbeginning forvalidity ctyperange ctotsro.delset_rangeend(tsrtsend) # deleteset range(int) fromtime the DCType object DCRange methods ===============stamp ending validity range tsro.setadd_beginversion(tsbeginvers) # set (int)DCVersion time stamp beginning validity range~ h5py.Group) versions of calibrations tsro.set_endversdef(tsendvers) # set # set (int) time stamp ending validity range tsro.add_version(vers)(DCVersion ~ h5py.Group) versions of calibrations tsro.del_version(vers) # delete version |
Class DCVersion
Code Block |
---|
verso = DCVersion(vers) # (str) version name # acess methods tsvers set (DCVersion ~ h5py.Group) versions of= calibrations tsro.set_versdef(versverso.tsprod() # (int) time stamp of the #version setproduction calibdata (DCVersion ~ h5py.Group) versions of calibrations tsro.del_version(vers= verso.calib() # delete version DCVersion methods =================# (np.array) calibration array # management methods verso.set_tsprod(tsprod) # set (int) time stamp of the version production verso.add_calib(nda) # set (np.array) calibration array verso.history(rec) # (str) set production history record |
TBD
Open questions
- What is included in the detector Id version? FEE version, controller version, etc?
- when constants are updated (file open to write) they are not available... Lock to resolve.
Data flow
- who produces and supply constants
- who is allowed to submit constants
- who is allowed to access constants
- ACL inside API or using OS
- ACL for all or particular detector/type/ etc.
References
TBD
Open questions
- logic for default version
- always last added constants
- set specified version
- what to do with default if new version is added?
- when constants are updated (file open to write) they are not available... Lock to resolve.
Data flow
- who produces and supply constants
- who is allowed to submit constants
- who is allowed to access constants
- ACL inside API or using OS
- ACL for all or particular detector/type/ etc.
2016-10-27 Mtg with cpo
- table of aliases with records: <alias> <source> <begin> <end>
- repository
- <PATH>
/detector/calib
"g" or "d" - epix100a full name - 6 numbers of hardware versions, firmware version is a 7th number
- time double to two integers or int64 (32bit-sec, 32-bit-nsec)
- geometry needs to be saved as a text
- repository file has
geometry
andpixel_gain
- like constants - do not search in
<experiment>/calib
- access through network for AMI (cpo: TCP with hardwired IP addresses, m:web service/reddis)
References
- Calibration Store
- Path to data and calibration constants for psana in LCLS1
- Calibration Store
- Unix time
- ISO 8601 time format
...