Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

Draft, in work.

Table of Contents

Include Page
Xtc Topic Map
Xtc Topic Map

The DAQ Side: 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
languagecpp
linenumberstrue
# 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
idsetup
Card
defaulttrue
labelCoding Steps

Register the algorithms and "shape" of the data associated with detector elements so the processing pipeline knows what to do with it.

  1. First some plumbing...
    1. Create an XtcData:Dgram as the root container. %codesample1:1-11%
  2. Next code sample summary.

 

Card
idsetuptldr
labelTL;DR
Panel

At some initialization step, for example in response to a DAQ configure signal:

  • Subclass XtcData::VarDef to build a data structure specific to the detector in question.

 

 

"writeImage" Method: Add Readout Data

Deck of Cards
idsetup
Card
defaulttrue
labelCoding Steps

Another list of steps/big ideas this time about appending data.

  1. A chunk of code summary.
  2. A chunk of code summary.

 

Card
idsetuptldr
labelTL;DR
Panel

At some initialization step, for example in response to a DAQ configure signal:

  • Subclass XtcData::VarDef to build a data structure specific to the detector in question.

The Pipeline Side: 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
languagecpp
linenumberstrue
// @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

CSPADXtcWriter::CSPADXtcWriter()
{
	// Squirrel away 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});
		}
	} FexDef;

	// Define some instance variables.
	FILE *this->xtcoutfile;
	Dgram& this->configDgram;
	std::vector<NameIndex>& this->namesVec;
	this->FexDef = new FexDef();

	// 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)
{
	Alg hsdFexAlg("fex",4,5,6);
    Names& fexNamesthis->fexNames = *new(parent) Names("xpphsd", hsdFexAlg, "hsd","detnum1234")
    this->fexNames.add(parent, FexDef);
    namesVec.push_back(NameIndex(this->fexNames));
}

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);
}