Belle II Software  release-08-01-10
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 
29 using namespace std;
30 
31 namespace Belle2 {
37  //-----------------------------------------------------------------
39  //-----------------------------------------------------------------
40 
41  REG_MODULE(TOPInterimFENtuple);
42 
43  //-----------------------------------------------------------------
44  // Implementation
45  //-----------------------------------------------------------------
46 
47  TOPInterimFENtupleModule::TOPInterimFENtupleModule() : HistoModule()
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();
86  StoreArray<TOPRawDigit> rawDigits;
87  rawDigits.isRequired();
88  StoreArray<TOPDigit> digits;
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;
168  m_nEmptyFEHeader = 0;
169  m_nWaveform = 0;
170  m_errorFlag = 0;
171 
172  StoreObjPtr<EventMetaData> EventMetaDataPtr;
173  StoreArray<RawTOP> rawTOPs;
174  StoreArray<TOPDigit> digits;
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;
217  m_revo9Counter[m_nHit] = -1;
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
264  m_offlineFlag[m_nHit] = 0;
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];
369  && TMath::Abs(timediff - m_calibrationPulseInterval) < m_calibrationPulseIntervalRange) {
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
380  && TMath::Abs(timediff + m_calibrationPulseInterval) < m_calibrationPulseIntervalRange) {
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.