Diana Software
MTutorialPulseShape.cc

Example module which computes a simple pulse shape parameter, implementation file.

Author
Marco Vignati

See header in MTutorialPulseShape.hh.

#include "QEvent.hh"
#include "QRawEvent.hh"
#include "QVector.hh"
#include "QBaseType.hh"
#include "QBaselineData.hh"
using namespace Diana;
{
fAveragePulseInput = GetString("AveragePulseInput","NODEFAULT");
// require presence in the events of quantities read by this module
ev.Require<QPulseInfo>("DAQ","PulseInfo");
ev.Require<QPulse>("DAQ","Pulse");
ev.Require<QBaselineData>("BaselineModule","BaselineData");
// add to event quantities written by this module.
ev.Add<QDouble>("ChiSquare");
}
{
// get channel number and samples from raw event
const QPulseInfo& pi = ev.Get<QPulseInfo>("DAQ","PulseInfo");
const int chan = pi.GetChannelId();
const QPulse& pulse = ev.Get<QPulse>("DAQ","Pulse");
const QVector& samples = pulse.GetSamples();
// get baseline value and rms computed by MBaselineModule in a previous sequence (diana_tutorial.cfg).
const QBaselineData& baseData = ev.Get<QBaselineData>("BaselineModule","BaselineData");
double baseline = baseData.GetBaseline();
double baselineRMS = baseData.GetBaselineRMS();
// get amplitude (Maximum minus baseline) computed in a previous sequence (diana_tutorial.cfg).
const QDouble& amplitude = ev.Get<QDouble>("PulseBasicParameters","MaxBaseline");
// get average pulse of this channel
GlobalHandle<QVector> apHandle("Samples");
apHandle.SetChannel(chan);
GlobalData().Get("TutorialAveragePulse",&apHandle,fAveragePulseInput);
if(!apHandle.IsValid()) {
if(fChannelsWithoutAP.count(chan) == 0) {
fChannelsWithoutAP.insert(chan);
Warn("Average pulse not found for channel %04d",chan);
}
return;
}
const QVector& averagePulse = apHandle.Get();
// compute amplitude and baseline of the average pulse
double apBaseline = averagePulse[0];
double apAmplitude = averagePulse.GetMax()-apBaseline;
// estimate chi square
double chisq = 0.;
for(size_t i =0; i < samples.Size(); i++) {
double res = (samples[i]-baseline) - (averagePulse[i]-apBaseline)*amplitude/apAmplitude;
chisq += res*res;
}
chisq /= (samples.Size() - 1)*baselineRMS*baselineRMS;
// save chi square value of this event
ev.Get<QDouble>("ChiSquare") = chisq;
}
{
}
#define REGISTER_MODULE(clazz)
Definition: QDriver.hh:133
template class to handle diana global QObject with QGlobalDataManager
void Done()
Done method.
void Init(Diana::QEvent &ev)
Init method.
void Do(Diana::QEvent &ev)
Do method. Declare and implement only one of the two versions.
base types wrapped into a QObject. Currently implemented types are QInt QDouble and QFloat....
Definition: QBaseType.hh:17
baseline data
double GetBaseline() const
double GetBaselineRMS() const
diana event
Definition: QEvent.hh:46
void Require(const std::string &owner, const std::string &name) const
notify the QEvent that we need a QObject, if not found an exception is thrown
Definition: QEvent.hh:232
void Get(const char *owner, ReadHandle< Q > &handle) const
Get a QObject Handle in read mode.
Definition: QEvent.hh:74
void Add(WriteHandle< Q > &handle)
Add a QObject to the event.
Definition: QEvent.hh:193
Raw event: bolometer channel, trigger positions and types.
Definition: QPulseInfo.hh:18
const int & GetChannelId() const
Get ChannelId.
Definition: QPulseInfo.hh:22
Raw event: sampled waveform.
Definition: QPulse.hh:22
const Diana::QVector & GetSamples() const
Get Samples casted to double (QVector instead of QVectorI). Use this method in place of GetSamplesADC...
Definition: QPulse.cc:49
Interface for vectors in Diana analysis.
Definition: QVector.hh:30
double GetMax() const
get maximum element
Definition: QVector.hh:355
the Diana namespace is needed because sometimes we use Qt libraries, that use same class names of our...