// @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()
{
// Squirrel awayDefine the shape/contours of the data related to our feature extraction
// algorithm definitions in a VarDef
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;
this->configDgram.xtc.extent = sizeof(Xtc);
}
void HSDXtcWriter::_addNames(Xtc& parent, std::vector<NameIndex>& namesVec)
{
// Use Alg to define metadata for a feature extraction ("fex") algorithm
Alg hsdFexAlg("fex",4,5,6);
Names& this->fexNames = *new(parent) Names("xpphsd", hsdFexAlg, "hsd","detnum1234")
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...
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);
} |