Page History
Info |
---|
Draft, in work. |
Table of Contents |
---|
Include Page | ||||
---|---|---|---|---|
|
Generating Xtc
For tutorial purposes, the following streamlined example shows XXX. For an example involving more detectors, formats and algorithms, see xtcdata/xtcdata/app/xtcwriter.cc.
A Notional DAQ Harness
Let's motivate the example. Assume we're developing a an Xtc writer class to output CSPAD data. This class will get plugged in to a (notional) DAQ framework.
Code Block | ||||
---|---|---|---|---|
| ||||
# Assume some totally made-up data acquisition callback framework named DAQFramework # Developers of the psdaq package are welcome to come in and change this toy example # to match the real DAQ API. CSPADXtcWriter padwriter() DAQFramework.registerHandler("configure", padwriter.setup) DAQFramework.registerHandler("runstart", std::bind(padwriter.openXtcFile, filename)) DAQFramework.registerHandler("readout", padwriter.writeImage) DAQFramework.registerHandler("runend", padwriter.closeXtcFile) |
"setup" Method: Set Up The Names Structure
Deck of Cards | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||
|
"writeImage" Method: Add Readout Data
Deck of Cards | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||
|
Parsing Whole Xtc Files, Using Small Data Files
xtcreader.cc and XtcIterator.hh
A Notional Offline Pipeline Harness
Notes for Real-World Code
Realistic Xtc Writers
(Bullet lists of gotchas and recommendations)
- Thread safety issue #1
- Thread safety issue #2
- (You'll likely need to sub-class from XYZ in order to ABC)
Realistic Xtc Readers
(Bullet lists of gotchas and recommendations)
- Thread safety issue #1
- Thread safety issue #2
- (You'll likely need to sub-class from XYZ in order to ABC)
Full "Hello Xtc" Code Listings
CSPADXtcWriter Example
Code Block | ||||
---|---|---|---|---|
| ||||
#include "xtcdata/xtc/ShapesData.hh" #include "xtcdata/xtc/DescData.hh" #include "xtcdata/xtc/Dgram.hh" #include "xtcdata/xtc/TypeId.hh" #include "xtcdata/xtc/XtcIterator.hh" #include "xtcdata/xtc/VarDef.hh" using namespace XtcData; #define BUFSIZE 0x4000000 CSPADXtcWriter::CSPADXtcWriter() { // Squirrel away algorithm definitions in a VarDef class PadDef:public VarDef { enum index { arrayRaw }; PadDef() { Alg segmentAlg("caspadsegcspadseg",2,3,42); // alg name, major, minor, patch) // We get a NameVec by subclassing from VarDef NameVec.push_back({"arrayRaw", segmentAlg}); } }; // Define some instance variables. FILE *this->xtcoutfile; Dgram& this->configDgram; std::vector<NameIndex>& this->namesVec; this->PadDef = new PadDef(); // Now initialize various things _initializeConfigDgram(); } void CSPADXtcWriter::_initializeConfigDgram() { TypeId tid(TypeId::Parent, 0); void* configbuf = malloc(BUFSIZE); this->configDgram = *(Dgram*)configbuf; this->configDgram.xtc.contains = tid; this->configDgram.xtc.damage = 0; this->configDgram.xtc.extent = sizeof(Xtc); } void CSPADWriter::_addNames(Xtc& parent, std::vector<NameIndex>& namesVec) { } void CSPADXtcWriter::setup() { _addNames(this->configDgram.xtc, this->namesVec); } void CSPADXtcWriter::openXtcFile(xtcoutfilename) { this->xtcoutfile = fopen(xtcoutfilename, "w"); } void CSPADXtcWriter::writeImage() { } void CSPADXtcWriter::closeXtcFile() { fclose(this->xtcoutfile); } |