11 #include <top/modules/TOPDigitizer/TOPTriggerDigitizerModule.h>
14 #include <top/dataobjects/TOPRawWaveform.h>
15 #include <top/dataobjects/TOPTriggerDigit.h>
16 #include <top/dataobjects/TOPTriggerMCInfo.h>
19 #include <framework/datastore/StoreArray.h>
20 #include <framework/datastore/StoreObjPtr.h>
23 #include <framework/logging/Logger.h>
51 setDescription(
"Digitizer that provides time stamps for TOP trigger");
52 setPropertyFlags(c_ParallelProcessingCertified);
55 addParam(
"threshold", m_threshold,
56 "pulse height threshold [ADC counts]", 27);
57 addParam(
"hysteresis", m_hysteresis,
58 "pulse height threshold hysteresis [ADC counts]", 10);
59 addParam(
"gateWidth", m_gateWidth,
60 "width of discriminator gate [samples]", 8);
61 addParam(
"samplingPhase", m_samplingPhase,
62 "sampling phase [samples]", 7);
65 TOPTriggerDigitizerModule::~TOPTriggerDigitizerModule()
69 void TOPTriggerDigitizerModule::initialize()
73 waveforms.isRequired();
77 digits.registerInDataStore();
78 digits.registerRelationTo(waveforms);
80 mcInfo.registerInDataStore();
82 if (m_samplingPhase < 0 or m_samplingPhase >= c_SamplingCycle)
83 B2ERROR(
"samplingPhase must be positive and less than " << c_SamplingCycle);
87 void TOPTriggerDigitizerModule::beginRun()
91 void TOPTriggerDigitizerModule::event()
103 B2ERROR(
"No waveforms available for digitization");
106 unsigned revo9count = waveforms[0]->getRevo9Counter();
107 int offsetSamples = waveforms[0]->getOffsetWindows() * TOPRawWaveform::c_WindowSize +
108 (revo9count % 6) * TOPRawWaveform::c_WindowSize / 3;
110 int bunchTimeStamp = int((revo9count + gRandom->Rndm()) * c_SamplingCycle / 3.0);
111 mcInfo->setBunchTimeStamp(bunchTimeStamp);
113 int offset = bunchTimeStamp - offsetSamples / c_SamplingCycle;
115 for (
const auto& waveform : waveforms) {
116 const auto& data = waveform.getWaveform();
117 int currentThr = m_threshold;
118 bool lastState =
false;
121 for (
int i = 0; i < (int) data.size(); i++) {
123 if (data[i] > currentThr) {
124 currentThr = m_threshold - m_hysteresis;
125 if (!lastState) gate = m_gateWidth;
128 currentThr = m_threshold;
131 if (i % c_SamplingCycle == m_samplingPhase and gate > 0) {
132 if (i / c_SamplingCycle == 0)
continue;
134 digit = digits.appendNew(waveform.getModuleID(),
135 waveform.getChannel(),
136 waveform.getScrodID());
139 int timeStamp = i / c_SamplingCycle + offset;
140 while (timeStamp < 0) {timeStamp += c_Frame9Period;};
141 timeStamp = timeStamp % c_Frame9Period;
150 void TOPTriggerDigitizerModule::endRun()
155 void TOPTriggerDigitizerModule::terminate()