Belle II Software development
TOPInterimFENtupleModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <top/modules/TOPInterimFENtuple/TOPInterimFENtupleModule.h>
10
11#include <framework/datastore/StoreObjPtr.h>
12#include <framework/datastore/StoreArray.h>
13
14#include <framework/dataobjects/EventMetaData.h>
15#include <top/dataobjects/TOPDigit.h>
16#include <top/dataobjects/TOPRawDigit.h>
17#include <top/dataobjects/TOPRawWaveform.h>
18#include <top/dataobjects/TOPInterimFEInfo.h>
19#include <top/dataobjects/TOPProductionEventDebug.h>
20#include <rawdata/dataobjects/RawTOP.h>
21
22#include <iostream>
23#include <sstream>
24
25#include <set>
26#include <map>
27#include <TMath.h>
28
29using namespace std;
30
31namespace Belle2 {
37 //-----------------------------------------------------------------
39 //-----------------------------------------------------------------
40
41 REG_MODULE(TOPInterimFENtuple);
42
43 //-----------------------------------------------------------------
44 // Implementation
45 //-----------------------------------------------------------------
46
48 {
49 setDescription("Create ntuple mainly from TOPDigit with double pulse identification. "
50 "Data taken with both InterimFE FW and production FW are available. (since Jan, 2017)");
51
52 addParam("calibrationChannel", m_calibrationChannel, "asic channel # where calibration pulses routed",
53 (unsigned)0);
54 addParam("saveWaveform", m_saveWaveform, "whether to save waveform data or not",
55 (bool)false);
56 addParam("useDoublePulse", m_useDoublePulse,
57 "set true when you require both of double calibration pulses for reference timing. You need to enable offline feature extraction.",
58 (bool)true);
59 // addParam("averageSamplingRate", m_averageSamplingRate, "sampling rate with assumption of uniform interval in a unit of GHz",
60 // (float)2.71394);
61 addParam("minHeightFirstCalPulse", m_calibrationPulseThreshold1, "pulse height threshold for the first cal. pulse",
62 (float)600.);
63 addParam("minHeightSecondCalPulse", m_calibrationPulseThreshold2, "pulse height threshold for the second cal. pulse",
64 (float)450.);
65 addParam("nominalDeltaT", m_calibrationPulseInterval, "nominal DeltaT (time interval of the double calibration pulses) [ns]",
66 (float)21.85);
67 addParam("nominalDeltaTRange", m_calibrationPulseIntervalRange,
68 "acceptable DeltaT shift from the noinal value before calibration [ns]",
69 (float)2.);
70 addParam("globalRefSlotNum", m_globalRefSlotNum,
71 "slot number where a global reference asic exists. slot01-asic0 (pixelId=1-8) is default.", 1);
72 addParam("globalRefAsicNum", m_globalRefAsicNum,
73 "asic number defined as int((pixelId-1)/8) of a global reference asic", 0);
74
75 addParam("timePerWin", m_timePerWin, "time interval of a single window (=64 samples) [ns]", (float)23.581939);
76 }
77
79
81 {
82 REG_HISTOGRAM;
83
84 StoreArray<RawTOP> rawTOPs;
85 rawTOPs.isRequired();
87 rawDigits.isRequired();
89 digits.isRequired();
91 infos.isRequired();
93 prodDebugs.isRequired();
95 waveforms.isRequired();
96 }
97
99 {
100
101 m_tree = new TTree("tree", "TTree for generator output");
102
103 std::ostringstream nModuleStr;
104 nModuleStr << "[" << c_NModule << "]";
105
106 m_tree->Branch("nHit", &m_nHit, "nHit/I");
107 m_tree->Branch("eventNum", &m_eventNum, "eventNum/i");
108 m_tree->Branch("eventNumCopper", m_eventNumCopper,
109 std::string(std::string("eventNumCopper") + nModuleStr.str() + "/i").c_str());
110 m_tree->Branch("ttuTime", m_ttuTime,
111 std::string(std::string("ttuTime") + nModuleStr.str() + "/i").c_str());
112 m_tree->Branch("ttcTime", m_ttcTime,
113 std::string(std::string("ttcTime") + nModuleStr.str() + "/i").c_str());
114 m_tree->Branch("slotNum", m_slotNum, "slotNum[nHit]/S");
115 m_tree->Branch("pixelId", m_pixelId, "pixelId[nHit]/S");
116 m_tree->Branch("channelId", m_channelId, "channel[nHit]/S");
117 m_tree->Branch("isCalCh", m_isCalCh, "isCalCh[nHit]/O");
118 m_tree->Branch("winNum", m_winNum, "winNum[nHit]/S");
119 m_tree->Branch("eventWinNum", m_eventWinNum, "eventWinNum[nHit]/S");
120 m_tree->Branch("trigWinNum", m_trigWinNum, "trigWinNum[nHit]/S");
121 m_tree->Branch("revo9Counter", m_revo9Counter, "revo9Counter[nHit]/S");
122 m_tree->Branch("windowsInOrder", m_windowsInOrder, "windowsInOrder[nHit]/O");
123 m_tree->Branch("hitQuality", m_hitQuality, "hitQuality[nHit]/b");
124 m_tree->Branch("time", m_time, "time[nHit]/F");
125 m_tree->Branch("rawTime", m_rawTime, "rawTime[nHit]/F");
126 m_tree->Branch("refTime", m_refTime, "refTime[nHit]/F");
127 m_tree->Branch("globalRefTime", &m_globalRefTime, "globalRefTime/F");
128 m_tree->Branch("sample", m_sample, "sample[nHit]/s");
129 m_tree->Branch("height", m_height, "height[nHit]/F");
130 m_tree->Branch("integral", m_integral, "integral[nHit]/F");
131 m_tree->Branch("width", m_width, "width[nHit]/F");
132 m_tree->Branch("peakSample", m_peakSample, "peakSampe[nHit]/s");
133 m_tree->Branch("offlineFlag", m_offlineFlag, "offlineFlag[nHit]/B");
134 m_tree->Branch("nHitOfflineFE", m_nHitOfflineFE, "nHitOfflineFE[nHit]/S");
135 std::ostringstream brstr[2];
136 brstr[0] << "winNumList[nHit][" << c_NWindow << "]/S";
137 m_tree->Branch("winNumList", m_winNumList, brstr[0].str().c_str());
138 if (m_saveWaveform) {
139 brstr[1] << "waveform[nHit][" << c_NWaveformSample << "]/S";
140 m_tree->Branch("waveform", m_waveform, brstr[1].str().c_str());
141 }
142 m_tree->Branch("waveformStartSample", m_waveformStartSample, "waveformStartSample[nHit]/S");
143 m_tree->Branch("nWaveformSample", m_nWaveformSample, "nWaveformSample[nHit]/s");
144
145 m_tree->Branch("nFEHeader", &m_nFEHeader, "nFEHeader/S");
146 m_tree->Branch("nEmptyFEHeader", &m_nEmptyFEHeader, "nEmptyFEHeader/S");
147 m_tree->Branch("nWaveform", &m_nWaveform, "nWaveform/S");
148 m_tree->Branch("errorFlag", &m_errorFlag, "errorFlag/i");
149 m_tree->Branch("eventErrorFlag", &m_eventErrorFlag, "eventErrorFlag/i");
150
151 m_tree->Branch("nDebugInfo", &m_nDebugInfo, "nDebugInfo/I");
152 m_tree->Branch("scordCtime", m_scrodCtime, "scrodCtime[nDebugInfo]/s");
153 m_tree->Branch("phase", m_phase, "phase[nDebugInfo]/s");
154 m_tree->Branch("asicMask", m_asicMask, "asicMask[nDebugInfo]/s");
155 m_tree->Branch("eventQueuDepth", m_eventQueuDepth, "eventQueuDepth[nDebugInfo]/s");
156 m_tree->Branch("eventNumberByte", m_eventNumberByte, "eventNumberByte[nDebugInfo]/s");
157 }
158
160 {
161 }
162
164 {
165
166 m_nHit = 0;
167 m_nFEHeader = 0;
169 m_nWaveform = 0;
170 m_errorFlag = 0;
171
172 StoreObjPtr<EventMetaData> EventMetaDataPtr;
173 StoreArray<RawTOP> rawTOPs;
175
176 for (int iSlot = 0 ; iSlot < c_NModule ; iSlot++) {
177 m_eventNumCopper[iSlot] = -1;
178 m_ttuTime[iSlot] = -1;
179 m_ttcTime[iSlot] = -1;
180 }
181 int iSlotTTC = 0;
182 short trigCtime = -1;
183 for (auto& rawTOP : rawTOPs) {
184 if (iSlotTTC >= c_NModule) {
185 B2WARNING("too many TTC information");
186 break;
187 }
188 m_eventNumCopper[iSlotTTC] = rawTOP.GetEveNo(0);
189 m_ttuTime[iSlotTTC] = rawTOP.GetTTUtime(0);
190 m_ttcTime[iSlotTTC] = rawTOP.GetTTCtime(0);
191
192 if (trigCtime < 0)
193 trigCtime = ((((long)m_ttcTime[iSlotTTC] + (long)(m_ttuTime[iSlotTTC] - 1524741300) * 127216000) % 11520) % 3840) % 1284;
194 iSlotTTC++;
195 }
196
197 std::map<short, short> nHitOfflineFEMap;
198 static std::set<short> noisyChannelBlackListSet;
199 UInt_t EventNum = EventMetaDataPtr->getEvent();
200 m_eventNum = EventNum;
201 m_eventErrorFlag = EventMetaDataPtr->getErrorFlag();
202 for (const auto& digit : digits) {
203
204 if (m_nHit >= c_NMaxHitEvent) {
205 B2WARNING("TOPInterimFENtuple : too many hits found (>=" << c_NMaxHitEvent
206 << "), EventNo = " << EventNum << ", no more hits are recorded.");
207 break;
208 }
209
210 m_slotNum[m_nHit] = digit.getModuleID();
211 m_pixelId[m_nHit] = (short)digit.getPixelID();
212 m_channelId[m_nHit] = (short)digit.getChannel();
213 m_isCalCh[m_nHit] = (digit.getASICChannel() == m_calibrationChannel);
214 m_winNum[m_nHit] = -1;
215 m_eventWinNum[m_nHit] = (short)digit.getFirstWindow();
216 m_trigWinNum[m_nHit] = trigCtime;
218 m_hitQuality[m_nHit] = (unsigned char)digit.getHitQuality();
219 m_isReallyJunk[m_nHit] = false;
220 m_windowsInOrder[m_nHit] = true;
221 m_rawTime[m_nHit] = digit.getRawTime();
222 m_time[m_nHit] = digit.getTime() + m_winNum[m_nHit] * m_timePerWin;
223 m_sample[m_nHit] = TMath::FloorNint(m_rawTime[m_nHit] + m_winNum[m_nHit] * c_NSamplePerWindow) % c_NSampleTBC;
224 m_height[m_nHit] = digit.getPulseHeight();
225 m_integral[m_nHit] = digit.getIntegral();
226 m_width[m_nHit] = digit.getPulseWidth();
227 m_peakSample[m_nHit] = -1;
228 for (int iWindow = 0 ; iWindow < c_NWindow ; iWindow++)
229 m_winNumList[m_nHit][iWindow] = -32767;
230 for (int iSample = 0 ; iSample < c_NWaveformSample ; iSample++)
231 m_waveform[m_nHit][iSample] = -32767;
233
234 short globalChannelId = m_pixelId[m_nHit] - 1 + (m_slotNum[m_nHit] - 1) * c_NPixelPerModule;
235 if (nHitOfflineFEMap.count(globalChannelId) == 0) nHitOfflineFEMap[globalChannelId] = 0;
236 else if (nHitOfflineFEMap[globalChannelId] > c_NMaxHitPerChannel) {
237 if (noisyChannelBlackListSet.count(globalChannelId) == 0) {
238 // cppcheck-suppress stlFindInsert
239 noisyChannelBlackListSet.insert(globalChannelId);
240 B2WARNING("TOPInterimFENtuple : noisy channel with too many hits (slotNum="
241 << (globalChannelId / c_NPixelPerModule + 1) << ", pixelId = "
242 << (globalChannelId / c_NPixelPerModule + 1) << ") ");
243 }
244 continue;
245 }
246
247 const auto* rawDigit = digit.getRelated<TOPRawDigit>();
248 if (rawDigit) {
249 m_winNum[m_nHit] = rawDigit->getASICWindow();
250 m_revo9Counter[m_nHit] = rawDigit->getRevo9Counter();
251 m_peakSample[m_nHit] = rawDigit->getSamplePeak();
252 m_windowsInOrder[m_nHit] = rawDigit->areWindowsInOrder();
253 if (rawDigit->getDataType() == TOPRawDigit::c_Interim)
254 m_trigWinNum[m_nHit] = (short)rawDigit->getLastWriteAddr();
255 if (rawDigit->isPedestalJump()) m_isReallyJunk[m_nHit] = true;
256 const auto* waveform = rawDigit->getRelated<TOPRawWaveform>();
257 if (waveform) {
258 if (rawDigit->isMadeOffline()) {
259
260 //fill hit flags ; =1 : first hit from offline FE, =2 : second ... , =0 : online FE, -1 : no waveform
261 nHitOfflineFEMap[globalChannelId]++;
262 m_offlineFlag[m_nHit] = nHitOfflineFEMap[globalChannelId];
263 } else { //hit from online feature extraction
265
266 //store waveform data
267 unsigned nSampleWfm = waveform->getSize();
268 unsigned nSample = TMath::Min((UShort_t)nSampleWfm, (UShort_t)c_NWaveformSample);
269 if (nSample > c_NWaveformSample)
270 B2WARNING("TOPInterimFENtuple: too many waveform samples in TOPRawWaveform : " << nSampleWfm << ", only first " << nSample <<
271 " are considered.");
272 for (unsigned iSample = 0 ; iSample < nSample ; iSample++)
273 m_waveform[m_nHit][iSample] = waveform->getWaveform()[iSample];
274 m_waveformStartSample[m_nHit] = (short)waveform->getStartSample();
275 m_nWaveformSample[m_nHit] = nSampleWfm;
276 //store window number
277 int iWin = 0;
278 for (const auto& window : waveform->getStorageWindows()) {
279 if (iWin < c_NWindow)
280 m_winNumList[m_nHit][iWin] = window;
281 else
282 B2WARNING("TOPInterimFENtuple: too many windows were found");
283
284 iWin++;
285 }
286
287 }
288 }//if( waveform )
289 else m_offlineFlag[m_nHit] = -1;
290 } else {
291 B2WARNING("TOPInterimFENtuple : no TOPRawDigit object found!");
292 m_offlineFlag[m_nHit] = -100;
293 }//if( rawDigit )
294
295
296 m_nHit++;
297 }//for( const auto& digit : digits )
298
299 for (int iHit = 0 ; iHit < m_nHit ; iHit++) {
300
301 short globalChannelId = m_pixelId[iHit] - 1 + (m_slotNum[iHit] - 1) * c_NPixelPerModule;
302 m_nHitOfflineFE[iHit] = nHitOfflineFEMap[globalChannelId];
303
304 }//for(int iHit)
305
307 for (const auto& info : infos) {
308 m_nFEHeader += info.getFEHeadersCount();
309 m_nEmptyFEHeader += info.getEmptyFEHeadersCount();
310 m_nWaveform += info.getWaveformsCount();
311 m_errorFlag |= info.getErrorFlags();
312 }
313
315 m_nDebugInfo = 0;
316 for (const auto& prodDebug : prodDebugs) {
317 m_scrodCtime[m_nDebugInfo] = prodDebug.getCtime();
318 m_phase[m_nDebugInfo] = prodDebug.getPhase();
319 m_asicMask[m_nDebugInfo] = prodDebug.getAsicMask();
320 m_eventQueuDepth[m_nDebugInfo] = prodDebug.getEventQueueDepth();
321 m_eventNumberByte[m_nDebugInfo] = prodDebug.getEventNumberByte();
322 m_nDebugInfo++;
323 }
324
325 //identify cal. pulse timing
327
328 m_tree->Fill();
329 }
330
332 {
333 }
334
336 {
337 }
338
340 {
341 static short globalRefAsic = m_globalRefAsicNum + 100 * m_globalRefSlotNum;
342 m_globalRefTime = -99999;
343 std::map<short, short> iRefHitMap;
344 for (int iHit = 0 ; iHit < m_nHit ; iHit++) {
345 if (!m_isCalCh[iHit]) continue;
346 short reducedPixelId = (m_pixelId[iHit] - 1) / 8 + 100 * m_slotNum[iHit];
347 if (iRefHitMap.count(reducedPixelId) > 0) continue;
348
349 if (!m_useDoublePulse) {
350 iRefHitMap[reducedPixelId] = iHit;
351 continue;
352 }
353
354 std::vector<short> iHitVec;
355 iHitVec.push_back(iHit);
356 for (int jHit = iHit + 1 ; jHit < m_nHit ; jHit++) {
357 short jReducedPixelId = (m_pixelId[jHit] - 1) / 8 + 100 * m_slotNum[jHit];
358 if (m_isCalCh[jHit] && jReducedPixelId == reducedPixelId) iHitVec.push_back(jHit);
359 }
360
361 int nCands = 0;
362 for (unsigned int iVec = 0 ; iVec < iHitVec.size() ; iVec++) {
363 int jHit = iHitVec[iVec];
364 for (unsigned int jVec = iVec + 1 ; jVec < iHitVec.size() ; jVec++) {
365 int kHit = iHitVec[jVec];
366 float timediff = m_time[kHit] - m_time[jHit];
370 if (nCands == 0) {
371 iRefHitMap[reducedPixelId] = jHit;
372 m_hitQuality[jHit] += 100;
373 m_hitQuality[kHit] += 200;
374 }
375 nCands++;
376 }
377 //in case jHit and kHit are not in time order (added at 28th Nov)
378 else if (timediff < 0 && m_height[kHit] > m_calibrationPulseThreshold1
381 if (nCands == 0) {
382 iRefHitMap[reducedPixelId] = kHit;
383 m_hitQuality[kHit] += 100;
384 m_hitQuality[jHit] += 200;
385 }
386 nCands++;
387 }//satisfy selection criteria for calibration signal
388 }
389 }//iVec (finish selecting a calibration signal candidate)
390 }
391
392
393 //loop all hits again to fill the array "refTime"
394 for (int iHit = 0 ; iHit < m_nHit ; iHit++) {
395 short reducedPixelId = (m_pixelId[iHit] - 1) / 8 + 100 * m_slotNum[iHit];
396 if (iRefHitMap.count(reducedPixelId) > 0) {
397 int iRef = iRefHitMap[reducedPixelId];
398 m_refTime[iHit] = m_time[iRef];
399 if (reducedPixelId == globalRefAsic) m_globalRefTime = m_time[iRef];
400 if (!m_isReallyJunk[iHit] && m_hitQuality[iRef] >= 100) {
401 m_hitQuality[iHit] += 10;
402 }
403 } else m_refTime[iHit] = -99999;
404 }
405
406 return;
407 }
408
410} // end Belle2 namespace
411
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Definition: HistoModule.h:29
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:96
unsigned short m_scrodCtime[c_NTotalScrod]
ctime recorded in scrod header
bool m_useDoublePulse
set true when you require both of double calibration pulses for reference timing
float m_calibrationPulseInterval
nominal DeltaT value (time interval of two calibration signals) in a unit of ns
short m_nWaveform
m_waveforms in TOPInterimFEInfo, # of waveformes
short m_nFEHeader
m_FEHeaders in TOPInterimFEInfo, the total # of FE headers found
short m_winNumList[c_NMaxHitEvent][c_NWindow]
list of window numbers for recorded waveform, valid only when waveform analysis is enabled
float m_integral[c_NMaxHitEvent]
"m_integral" in TOPDigit, but not available
unsigned m_eventNum
event number taken from EventMetaData
short m_slotNum[c_NMaxHitEvent]
"m_moduleID" in TOPDigit, slot number
short m_channelId[c_NMaxHitEvent]
"m_channel" in TOPDigit
short m_winNum[c_NMaxHitEvent]
"m_window" in TOPRawDigit
int m_globalRefSlotNum
slot number used to define "global" reference timing (a single reference timing in an event for all t...
short m_waveformStartSample[c_NMaxHitEvent]
start sample number of waveform segment (only for production FW)
unsigned short m_eventNumberByte[c_NTotalScrod]
least significant byte of FE event number
float m_calibrationPulseIntervalRange
tolerable shift of DeltaT from its nominal before calibration in a unit of ns
unsigned short m_sample[c_NMaxHitEvent]
(m_rawTDC+m_winNum*64)%256, for time base correction
unsigned short m_peakSample[c_NMaxHitEvent]
sample number for peak
float m_calibrationPulseThreshold2
minimum pulse height for the secon calibration pulse to be qualified as calibration signals
int m_nDebugInfo
number of ProductionEventDebug (in a unit of number of boardstack)
float m_refTime[c_NMaxHitEvent]
time of the first calibration signal as reference timing.
int m_nHit
number of hits for the event
unsigned m_errorFlag
m_errorFlags in TOPInterimFEInfo, defined in the TOPInterimFEInfo.h
float m_height[c_NMaxHitEvent]
"m_pulseHeight" in new TOPDigit (update at May, 2017)
short m_trigWinNum[c_NMaxHitEvent]
"m_lastWriteAddr" in TOPRawDigit, window # when trigger is issued
unsigned short m_eventQueuDepth[c_NTotalScrod]
trigger FIRO queue depth
char m_offlineFlag[c_NMaxHitEvent]
=-1 if the channel does not have waveform information, =0 when the hit comes from online FE,...
short m_revo9Counter[c_NMaxHitEvent]
"m_revo9Counter" in TOPRawDigit
float m_width[c_NMaxHitEvent]
"m_pulseWidth" in TOPDigit, full width at half maximum of the pulse, converted into unit of samples f...
short m_eventWinNum[c_NMaxHitEvent]
"m_firstWindow" in TOPDigit
unsigned m_eventErrorFlag
m_errorFlags in EventMetaData, 0x1 : CRC error
float m_time[c_NMaxHitEvent]
time in a unit of ns, defined as m_rawTime+64*m_winNum.
short m_waveform[c_NMaxHitEvent][c_NWaveformSample]
waveform from TOPRawWaveform, if not exist, filled with -32767
unsigned m_ttuTime[c_NModule]
counter for TTclock, stored in COPPER
short m_pixelId[c_NMaxHitEvent]
"m_pixelID" in TOPDigit
float m_timePerWin
time interval of onw window (=64 samples) [ns]
unsigned m_calibrationChannel
asic channel number where the calibration pulses are routed
short m_nHitOfflineFE[c_NMaxHitEvent]
number of hits for each pixel
float m_calibrationPulseThreshold1
minimum pulse height for the first calibration pulse to be qualified as calibration signals
unsigned char m_hitQuality[c_NMaxHitEvent]
"m_quality" in TOPDigit, =0:junk, =1:good, =2:charge sharing, =3:cross talk, =4:cal.
bool m_windowsInOrder[c_NMaxHitEvent]
"areWindowsInOrder()" ; false if the window number of all (4) windows taken from TOPRawWaveform::getR...
unsigned m_eventNumCopper[c_NModule]
event number stored in COPPER
int m_globalRefAsicNum
asic number used to define "global" reference timing.
float m_globalRefTime
refTime of the specific asic, which is specified by parameters "globalRefSlotNum" and "globalRefAsicN...
unsigned short m_phase[c_NTotalScrod]
event phase
unsigned short m_asicMask[c_NTotalScrod]
asic mask bit pattern
float m_rawTime[c_NMaxHitEvent]
"m_rawTime" [0-256] in new TOPDigit (update at May, 2017) in sample(time bin) unit
bool m_isCalCh[c_NMaxHitEvent]
true if the hit is in the calibration channel
unsigned m_ttcTime[c_NModule]
counter for TTclock, stored in COPPER
bool m_isReallyJunk[c_NMaxHitEvent]
true if pedestal jump or other invalid hit is detected, not saved
short m_nEmptyFEHeader
m_emptyFEHeaders in TOPInterimFEInfo, the total # of empty FE headers
unsigned short m_nWaveformSample[c_NMaxHitEvent]
number of waveform samples
bool m_saveWaveform
set true when you want to save waveform data
Class to store unpacked raw data (hits in feature-extraction format) It provides also calculation of ...
Definition: TOPRawDigit.h:24
@ c_Interim
from interim feature extraction
Definition: TOPRawDigit.h:44
Class to store raw data waveforms.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
void getReferenceTiming()
Find reference timing.
virtual void initialize() override
Initialize the Module.
virtual void event() override
Event processor.
virtual void endRun() override
End-of-run action.
virtual void terminate() override
Termination action.
virtual void beginRun() override
Called when entering a new run.
virtual void defineHisto() override
Module funcions to define histograms.
Abstract base class for different kinds of events.
STL namespace.