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 {
36
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
78
80 {
81 REG_HISTOGRAM;
82
83 StoreArray<RawTOP> rawTOPs;
84 rawTOPs.isRequired();
86 rawDigits.isRequired();
88 digits.isRequired();
90 infos.isRequired();
92 prodDebugs.isRequired();
94 waveforms.isRequired();
95 }
96
98 {
99
100 m_tree = new TTree("tree", "TTree for generator output");
101
102 std::ostringstream nModuleStr;
103 nModuleStr << "[" << c_NModule << "]";
104
105 m_tree->Branch("nHit", &m_nHit, "nHit/I");
106 m_tree->Branch("eventNum", &m_eventNum, "eventNum/i");
107 m_tree->Branch("eventNumCopper", m_eventNumCopper,
108 std::string(std::string("eventNumCopper") + nModuleStr.str() + "/i").c_str());
109 m_tree->Branch("ttuTime", m_ttuTime,
110 std::string(std::string("ttuTime") + nModuleStr.str() + "/i").c_str());
111 m_tree->Branch("ttcTime", m_ttcTime,
112 std::string(std::string("ttcTime") + nModuleStr.str() + "/i").c_str());
113 m_tree->Branch("slotNum", m_slotNum, "slotNum[nHit]/S");
114 m_tree->Branch("pixelId", m_pixelId, "pixelId[nHit]/S");
115 m_tree->Branch("channelId", m_channelId, "channel[nHit]/S");
116 m_tree->Branch("isCalCh", m_isCalCh, "isCalCh[nHit]/O");
117 m_tree->Branch("winNum", m_winNum, "winNum[nHit]/S");
118 m_tree->Branch("eventWinNum", m_eventWinNum, "eventWinNum[nHit]/S");
119 m_tree->Branch("trigWinNum", m_trigWinNum, "trigWinNum[nHit]/S");
120 m_tree->Branch("revo9Counter", m_revo9Counter, "revo9Counter[nHit]/S");
121 m_tree->Branch("windowsInOrder", m_windowsInOrder, "windowsInOrder[nHit]/O");
122 m_tree->Branch("hitQuality", m_hitQuality, "hitQuality[nHit]/b");
123 m_tree->Branch("time", m_time, "time[nHit]/F");
124 m_tree->Branch("rawTime", m_rawTime, "rawTime[nHit]/F");
125 m_tree->Branch("refTime", m_refTime, "refTime[nHit]/F");
126 m_tree->Branch("globalRefTime", &m_globalRefTime, "globalRefTime/F");
127 m_tree->Branch("sample", m_sample, "sample[nHit]/s");
128 m_tree->Branch("height", m_height, "height[nHit]/F");
129 m_tree->Branch("integral", m_integral, "integral[nHit]/F");
130 m_tree->Branch("width", m_width, "width[nHit]/F");
131 m_tree->Branch("peakSample", m_peakSample, "peakSampe[nHit]/s");
132 m_tree->Branch("offlineFlag", m_offlineFlag, "offlineFlag[nHit]/B");
133 m_tree->Branch("nHitOfflineFE", m_nHitOfflineFE, "nHitOfflineFE[nHit]/S");
134 std::ostringstream brstr[2];
135 brstr[0] << "winNumList[nHit][" << c_NWindow << "]/S";
136 m_tree->Branch("winNumList", m_winNumList, brstr[0].str().c_str());
137 if (m_saveWaveform) {
138 brstr[1] << "waveform[nHit][" << c_NWaveformSample << "]/S";
139 m_tree->Branch("waveform", m_waveform, brstr[1].str().c_str());
140 }
141 m_tree->Branch("waveformStartSample", m_waveformStartSample, "waveformStartSample[nHit]/S");
142 m_tree->Branch("nWaveformSample", m_nWaveformSample, "nWaveformSample[nHit]/s");
143
144 m_tree->Branch("nFEHeader", &m_nFEHeader, "nFEHeader/S");
145 m_tree->Branch("nEmptyFEHeader", &m_nEmptyFEHeader, "nEmptyFEHeader/S");
146 m_tree->Branch("nWaveform", &m_nWaveform, "nWaveform/S");
147 m_tree->Branch("errorFlag", &m_errorFlag, "errorFlag/i");
148 m_tree->Branch("eventErrorFlag", &m_eventErrorFlag, "eventErrorFlag/i");
149
150 m_tree->Branch("nDebugInfo", &m_nDebugInfo, "nDebugInfo/I");
151 m_tree->Branch("scordCtime", m_scrodCtime, "scrodCtime[nDebugInfo]/s");
152 m_tree->Branch("phase", m_phase, "phase[nDebugInfo]/s");
153 m_tree->Branch("asicMask", m_asicMask, "asicMask[nDebugInfo]/s");
154 m_tree->Branch("eventQueuDepth", m_eventQueuDepth, "eventQueuDepth[nDebugInfo]/s");
155 m_tree->Branch("eventNumberByte", m_eventNumberByte, "eventNumberByte[nDebugInfo]/s");
156 }
157
159 {
160
161 m_nHit = 0;
162 m_nFEHeader = 0;
164 m_nWaveform = 0;
165 m_errorFlag = 0;
166
167 StoreObjPtr<EventMetaData> EventMetaDataPtr;
168 StoreArray<RawTOP> rawTOPs;
170
171 for (int iSlot = 0 ; iSlot < c_NModule ; iSlot++) {
172 m_eventNumCopper[iSlot] = -1;
173 m_ttuTime[iSlot] = -1;
174 m_ttcTime[iSlot] = -1;
175 }
176 int iSlotTTC = 0;
177 short trigCtime = -1;
178 for (auto& rawTOP : rawTOPs) {
179 if (iSlotTTC >= c_NModule) {
180 B2WARNING("too many TTC information");
181 break;
182 }
183 m_eventNumCopper[iSlotTTC] = rawTOP.GetEveNo(0);
184 m_ttuTime[iSlotTTC] = rawTOP.GetTTUtime(0);
185 m_ttcTime[iSlotTTC] = rawTOP.GetTTCtime(0);
186
187 if (trigCtime < 0)
188 trigCtime = ((((long)m_ttcTime[iSlotTTC] + (long)(m_ttuTime[iSlotTTC] - 1524741300) * 127216000) % 11520) % 3840) % 1284;
189 iSlotTTC++;
190 }
191
192 std::map<short, short> nHitOfflineFEMap;
193 static std::set<short> noisyChannelBlackListSet;
194 UInt_t EventNum = EventMetaDataPtr->getEvent();
195 m_eventNum = EventNum;
196 m_eventErrorFlag = EventMetaDataPtr->getErrorFlag();
197 for (const auto& digit : digits) {
198
199 if (m_nHit >= c_NMaxHitEvent) {
200 B2WARNING("TOPInterimFENtuple : too many hits found (>=" << c_NMaxHitEvent
201 << "), EventNo = " << EventNum << ", no more hits are recorded.");
202 break;
203 }
204
205 m_slotNum[m_nHit] = digit.getModuleID();
206 m_pixelId[m_nHit] = (short)digit.getPixelID();
207 m_channelId[m_nHit] = (short)digit.getChannel();
208 m_isCalCh[m_nHit] = (digit.getASICChannel() == m_calibrationChannel);
209 m_winNum[m_nHit] = -1;
210 m_eventWinNum[m_nHit] = (short)digit.getFirstWindow();
211 m_trigWinNum[m_nHit] = trigCtime;
213 m_hitQuality[m_nHit] = (unsigned char)digit.getHitQuality();
214 m_isReallyJunk[m_nHit] = false;
215 m_windowsInOrder[m_nHit] = true;
216 m_rawTime[m_nHit] = digit.getRawTime();
217 m_time[m_nHit] = digit.getTime() + m_winNum[m_nHit] * m_timePerWin;
218 m_sample[m_nHit] = TMath::FloorNint(m_rawTime[m_nHit] + m_winNum[m_nHit] * c_NSamplePerWindow) % c_NSampleTBC;
219 m_height[m_nHit] = digit.getPulseHeight();
220 m_integral[m_nHit] = digit.getIntegral();
221 m_width[m_nHit] = digit.getPulseWidth();
222 m_peakSample[m_nHit] = -1;
223 for (int iWindow = 0 ; iWindow < c_NWindow ; iWindow++)
224 m_winNumList[m_nHit][iWindow] = -32767;
225 for (int iSample = 0 ; iSample < c_NWaveformSample ; iSample++)
226 m_waveform[m_nHit][iSample] = -32767;
228
229 short globalChannelId = m_pixelId[m_nHit] - 1 + (m_slotNum[m_nHit] - 1) * c_NPixelPerModule;
230 if (nHitOfflineFEMap.count(globalChannelId) == 0) nHitOfflineFEMap[globalChannelId] = 0;
231 else if (nHitOfflineFEMap[globalChannelId] > c_NMaxHitPerChannel) {
232 if (noisyChannelBlackListSet.count(globalChannelId) == 0) {
233 // cppcheck-suppress stlFindInsert
234 noisyChannelBlackListSet.insert(globalChannelId);
235 B2WARNING("TOPInterimFENtuple : noisy channel with too many hits (slotNum="
236 << (globalChannelId / c_NPixelPerModule + 1) << ", pixelId = "
237 << (globalChannelId / c_NPixelPerModule + 1) << ") ");
238 }
239 continue;
240 }
241
242 const auto* rawDigit = digit.getRelated<TOPRawDigit>();
243 if (rawDigit) {
244 m_winNum[m_nHit] = rawDigit->getASICWindow();
245 m_revo9Counter[m_nHit] = rawDigit->getRevo9Counter();
246 m_peakSample[m_nHit] = rawDigit->getSamplePeak();
247 m_windowsInOrder[m_nHit] = rawDigit->areWindowsInOrder();
248 if (rawDigit->getDataType() == TOPRawDigit::c_Interim)
249 m_trigWinNum[m_nHit] = (short)rawDigit->getLastWriteAddr();
250 if (rawDigit->isPedestalJump()) m_isReallyJunk[m_nHit] = true;
251 const auto* waveform = rawDigit->getRelated<TOPRawWaveform>();
252 if (waveform) {
253 if (rawDigit->isMadeOffline()) {
254
255 //fill hit flags ; =1 : first hit from offline FE, =2 : second ... , =0 : online FE, -1 : no waveform
256 nHitOfflineFEMap[globalChannelId]++;
257 m_offlineFlag[m_nHit] = nHitOfflineFEMap[globalChannelId];
258 } else { //hit from online feature extraction
260
261 //store waveform data
262 unsigned nSampleWfm = waveform->getSize();
263 unsigned nSample = TMath::Min((UShort_t)nSampleWfm, (UShort_t)c_NWaveformSample);
264 if (nSample > c_NWaveformSample)
265 B2WARNING("TOPInterimFENtuple: too many waveform samples in TOPRawWaveform : " << nSampleWfm << ", only first " << nSample <<
266 " are considered.");
267 for (unsigned iSample = 0 ; iSample < nSample ; iSample++)
268 m_waveform[m_nHit][iSample] = waveform->getWaveform()[iSample];
269 m_waveformStartSample[m_nHit] = (short)waveform->getStartSample();
270 m_nWaveformSample[m_nHit] = nSampleWfm;
271 //store window number
272 int iWin = 0;
273 for (const auto& window : waveform->getStorageWindows()) {
274 if (iWin < c_NWindow)
275 m_winNumList[m_nHit][iWin] = window;
276 else
277 B2WARNING("TOPInterimFENtuple: too many windows were found");
278
279 iWin++;
280 }
281
282 }
283 }//if( waveform )
284 else m_offlineFlag[m_nHit] = -1;
285 } else {
286 B2WARNING("TOPInterimFENtuple : no TOPRawDigit object found!");
287 m_offlineFlag[m_nHit] = -100;
288 }//if( rawDigit )
289
290
291 m_nHit++;
292 }//for( const auto& digit : digits )
293
294 for (int iHit = 0 ; iHit < m_nHit ; iHit++) {
295
296 short globalChannelId = m_pixelId[iHit] - 1 + (m_slotNum[iHit] - 1) * c_NPixelPerModule;
297 m_nHitOfflineFE[iHit] = nHitOfflineFEMap[globalChannelId];
298
299 }//for(int iHit)
300
302 for (const auto& info : infos) {
303 m_nFEHeader += info.getFEHeadersCount();
304 m_nEmptyFEHeader += info.getEmptyFEHeadersCount();
305 m_nWaveform += info.getWaveformsCount();
306 m_errorFlag |= info.getErrorFlags();
307 }
308
310 m_nDebugInfo = 0;
311 for (const auto& prodDebug : prodDebugs) {
312 m_scrodCtime[m_nDebugInfo] = prodDebug.getCtime();
313 m_phase[m_nDebugInfo] = prodDebug.getPhase();
314 m_asicMask[m_nDebugInfo] = prodDebug.getAsicMask();
315 m_eventQueuDepth[m_nDebugInfo] = prodDebug.getEventQueueDepth();
316 m_eventNumberByte[m_nDebugInfo] = prodDebug.getEventNumberByte();
317 m_nDebugInfo++;
318 }
319
320 //identify cal. pulse timing
322
323 m_tree->Fill();
324 }
325
327 {
328 static short globalRefAsic = m_globalRefAsicNum + 100 * m_globalRefSlotNum;
329 m_globalRefTime = -99999;
330 std::map<short, short> iRefHitMap;
331 for (int iHit = 0 ; iHit < m_nHit ; iHit++) {
332 if (!m_isCalCh[iHit]) continue;
333 short reducedPixelId = (m_pixelId[iHit] - 1) / 8 + 100 * m_slotNum[iHit];
334 if (iRefHitMap.count(reducedPixelId) > 0) continue;
335
336 if (!m_useDoublePulse) {
337 iRefHitMap[reducedPixelId] = iHit;
338 continue;
339 }
340
341 std::vector<short> iHitVec;
342 iHitVec.push_back(iHit);
343 for (int jHit = iHit + 1 ; jHit < m_nHit ; jHit++) {
344 short jReducedPixelId = (m_pixelId[jHit] - 1) / 8 + 100 * m_slotNum[jHit];
345 if (m_isCalCh[jHit] && jReducedPixelId == reducedPixelId) iHitVec.push_back(jHit);
346 }
347
348 int nCands = 0;
349 for (unsigned int iVec = 0 ; iVec < iHitVec.size() ; iVec++) {
350 int jHit = iHitVec[iVec];
351 for (unsigned int jVec = iVec + 1 ; jVec < iHitVec.size() ; jVec++) {
352 int kHit = iHitVec[jVec];
353 float timediff = m_time[kHit] - m_time[jHit];
357 if (nCands == 0) {
358 iRefHitMap[reducedPixelId] = jHit;
359 m_hitQuality[jHit] += 100;
360 m_hitQuality[kHit] += 200;
361 }
362 nCands++;
363 }
364 //in case jHit and kHit are not in time order (added at 28th Nov)
365 else if (timediff < 0 && m_height[kHit] > m_calibrationPulseThreshold1
368 if (nCands == 0) {
369 iRefHitMap[reducedPixelId] = kHit;
370 m_hitQuality[kHit] += 100;
371 m_hitQuality[jHit] += 200;
372 }
373 nCands++;
374 }//satisfy selection criteria for calibration signal
375 }
376 }//iVec (finish selecting a calibration signal candidate)
377 }
378
379
380 //loop all hits again to fill the array "refTime"
381 for (int iHit = 0 ; iHit < m_nHit ; iHit++) {
382 short reducedPixelId = (m_pixelId[iHit] - 1) / 8 + 100 * m_slotNum[iHit];
383 if (iRefHitMap.count(reducedPixelId) > 0) {
384 int iRef = iRefHitMap[reducedPixelId];
385 m_refTime[iHit] = m_time[iRef];
386 if (reducedPixelId == globalRefAsic) m_globalRefTime = m_time[iRef];
387 if (!m_isReallyJunk[iHit] && m_hitQuality[iRef] >= 100) {
388 m_hitQuality[iHit] += 10;
389 }
390 } else m_refTime[iHit] = -99999;
391 }
392
393 return;
394 }
395
397} // end Belle2 namespace
398
HistoModule()
Constructor.
Definition HistoModule.h:32
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 second 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 own 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:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
void getReferenceTiming()
Find reference timing.
virtual void initialize() override
Initialize the Module.
virtual void event() override
Event processor.
virtual void defineHisto() override
Module functions to define histograms.
Abstract base class for different kinds of events.
STL namespace.