// %sample:codesample1%
#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
HSDXtcWriter::HSDXtcWriter()
{
// Define the shape/contours of each record in our feature extraction data set
class FexDef:public VarDef
{
public:
enum index
{
floatFex,
arrayFex,
intFex
};
FexDef()
{
NameVec.push_back({"floatFex",Name::DOUBLE});
NameVec.push_back({"arrayFex",Name::FLOAT,2});
NameVec.push_back({"intFex",Name::INT64});
}
};
// Define some instance variables.
FILE *this->xtcoutfile;
// An Xtc::Dgram to store metadata about the output
Dgram& this->configDgram;
std::vector<NameIndex>& this->namesVec;
this->FexDef = new FexDef();
// Now initialize various things
_initializeConfigDgram();
}
void HSDXtcWriter::_initializeConfigDgram()
{
TypeId tid(TypeId::Parent, 0);
void* configbuf = malloc(BUFSIZE);
this->configDgram = *(Dgram*)configbuf;
this->configDgram.xtc.contains = tid;
this->configDgram.xtc.damage = 0;
// Check if Xtc::Xtc auto-alloc will take care of updating this extent as we go?
this->configDgram.xtc.extent = sizeof(Xtc);
}
void HSDXtcWriter::_addNames(Xtc& parent, std::vector<NameIndex>& namesVec)
{
// Instantiate and Alg to define metadata for a feature extraction ("fex") algorithm
Alg hsdFexAlg("fex",4,5,6);
// "Insert" a Names structure into the config Dgram's Xtc container.
Names& this->fexNames = *new(parent) Names("xpphsd", hsdFexAlg, "hsd","detnum1234")
// And now we populate the structure with the definition of the FexDex shapes
this->fexNames.add(parent, this->FexDef);
namesVec.push_back(NameIndex(this->fexNames));
}
void HSDXtcWriter::setup()
{
// Add a Names structure to the configuration Dgram
_addNames(this->configDgram.xtc, this->namesVec);
}
void HSDXtcWriter::openXtcFile(xtcoutfilename)
{
this->xtcoutfile = fopen(xtcoutfilename, "w");
}
void HSDXtcWriter::writeFeature()
{
// Need some makebelieve code here to show how this callback method unpacks data from DAQ
// to cram into these Xtc structures...
// Talk to Chris. Is this event by event? Would you want to destruct this CreateData after each event?
CreateData fex(parent, NamesVec, nameId);
// set_value() lets you set scalar values in the data record.
// The 'floatFex' ID is defined in our custom FexDef class.
fex.set_value(FexDef::floatFex, (double)41.0);
// Use allocate() to set up data that's better represented as vectors or matrices.
// The 'arrayFex' ID is defined in our custom FexDef class.
unsigned shape[MaxRank] = {2,3}; //MaxRank is an Xtc library global upper limit on data complexity.
Array<float> arrayT = fex.allocate<float>(FexDef::arrayFex,shape);
for(unsigned i=0; i<shape[0]; i++){
for (unsigned j=0; j<shape[1]; j++) {
arrayT(i,j) = 142.0+i*shape[1]+j;
}
};
// Another scalar value setter.
// The 'intFex' ID is defined in our custom FexDef class.
fex.set_value(FexDef::intFex, (int64_t) 42);
}
void HSDXtcWriter::closeXtcFile()
{
fclose(this->xtcoutfile);
}
// %endsample% |