Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ZDCDataAnalyzer.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 
8 #include <sstream>
9 #include <utility>
10 
11 #include "CxxUtils/trapping_fp.h"
12 
13 
14 ZDCDataAnalyzer::ZDCDataAnalyzer(ZDCMsg::MessageFunctionPtr msgFunc_p, int nSample, float deltaTSample, size_t preSampleIdx, std::string fitFunction,
15  const ZDCModuleIntArray& peak2ndDerivMinSamples,
16  const ZDCModuleFloatArray& peak2ndDerivMinThresholdsHG,
17  const ZDCModuleFloatArray& peak2ndDerivMinThresholdsLG,
18  unsigned int LGMode) :
19  m_msgFunc_p(msgFunc_p),
20  m_nSample(nSample), m_deltaTSample(deltaTSample), m_preSampleIdx(preSampleIdx),
21  m_fitFunction(std::move(fitFunction)),
22  m_LGMode(LGMode),
23  m_repassEnabled(false),
24  m_eventCount(0),
25  m_haveECalib(false),
26  m_haveT0Calib(false),
27  m_currentLB(-1),
28 
29  // Default "calibrations"
30  m_currentECalibCoeff ({{{{1, 1, 1, 1}}, {{1, 1, 1, 1}}}}),
31  m_currentT0OffsetsHG ({{{{0, 0, 0, 0}}, {{0, 0, 0, 0}}}}),
32  m_currentT0OffsetsLG ({{{{0, 0, 0, 0}}, {{0, 0, 0, 0}}}}),
33 
34  m_moduleMask(0),
35  m_moduleSum({{0, 0}}),
36  m_moduleSumErrSq({{0, 0}}),
37  m_moduleSumPreSample({{0, 0}}),
38  m_calibModuleSum({{0, 0}}),
39  m_calibModuleSumErrSq({{0, 0}}),
40  m_averageTime({{0, 0}}),
41  m_fail({{false, false}})
42 {
43  m_moduleDisabled[0] = {{false, false, false, false}};
44  m_moduleDisabled[1] = {{false, false, false, false}};
45 
46  m_moduleAnalyzers[0] = {{0, 0, 0, 0}};
47  m_moduleAnalyzers[1] = {{0, 0, 0, 0}};
48 
49  m_calibAmplitude[0] = {{0, 0, 0, 0}};
50  m_calibAmplitude[1] = {{0, 0, 0, 0}};
51 
52  m_calibTime[0] = {{0, 0, 0, 0}};
53  m_calibTime[1] = {{0, 0, 0, 0}};
54 
55  m_dataLoaded[0] = {{false, false, false, false}};
56  m_dataLoaded[1] = {{false, false, false, false}};
57 
58  m_delayedOrder[0] = {0, 0, 0, 0};
59  m_delayedOrder[1] = {0, 0, 0, 0};
60 
61  // For now we are using hard-coded gain factors and pedestals
62  //
63  m_HGGains[0] = {{10, 10, 10, 10}};
64  m_HGGains[1] = {{10, 10, 10, 10}};
65 
66  m_pedestals[0] = {{100, 100, 100, 100}};
67  m_pedestals[1] = {{100, 100, 100, 100}};
68 
69 
70  // Construct the per-module pulse analyzers
71  //
72  for (size_t side : {0, 1}) {
73  for (size_t module : {0, 1, 2, 3}) {
74  std::ostringstream moduleTag;
75  moduleTag << "_s" << side << "_m" << module;
76 
77  m_moduleAnalyzers[side][module].reset (new ZDCPulseAnalyzer(m_msgFunc_p, moduleTag.str(), m_nSample, m_deltaTSample, m_preSampleIdx,
78  m_pedestals[side][module], m_HGGains[side][module], m_fitFunction,
79  peak2ndDerivMinSamples[side][module],
80  peak2ndDerivMinThresholdsHG[side][module],
81  peak2ndDerivMinThresholdsLG[side][module]));
82  m_moduleAnalyzers[side][module]->setLGMode(m_LGMode);
83  }
84  }
85 }
86 
88 {
89 }
90 
92 {
93  if (side < 2 && module < 4) {
94  //
95  // Can't disable in the middle of analysis
96  //
97  if (m_dataLoaded[side][module]) return false;
98  else {
99  m_moduleDisabled[side][module] = true;
100  return true;
101  }
102  }
103  else {
104  return false;
105  }
106 }
107 
108 void ZDCDataAnalyzer::enableDelayed(float deltaT, const ZDCModuleFloatArray& undelayedDelayedPedestalDiff)
109 {
110  int delayedOrder = deltaT < 0 ? -1 : 1;
111  for (size_t side : {0, 1}) {
112  for (size_t module : {0, 1, 2, 3}) {
113  m_delayedOrder[side][module] = delayedOrder;
114  m_moduleAnalyzers[side][module]->enableDelayed(std::abs(deltaT), undelayedDelayedPedestalDiff[side][module]);
115  }
116  }
117 }
118 
119 void ZDCDataAnalyzer::enableDelayed(const ZDCModuleFloatArray& delayDeltaTArray, const ZDCModuleFloatArray& undelayedDelayedPedestalDiff)
120 {
121  for (size_t side : {0, 1}) {
122  for (size_t module : {0, 1, 2, 3}) {
123  if (delayDeltaTArray[side][module] < 0) m_delayedOrder[side][module] = -1;
124  else m_delayedOrder[side][module] = 1;
125 
126  (*m_msgFunc_p)(ZDCMsg::Verbose, "Enabling use of delayed samples on side, module = " + std::to_string(side) + ", " +
127  std::to_string(module) + ", delta t = " + std::to_string(delayDeltaTArray[side][module]));
128 
129  m_moduleAnalyzers[side][module]->enableDelayed(std::abs(delayDeltaTArray[side][module]), undelayedDelayedPedestalDiff[side][module]);
130  }
131  }
132 }
133 
134 void ZDCDataAnalyzer::enablePreExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray& HGADCThresh, const ZDCModuleIntArray& LGADCThresh)
135 {
136  for (size_t side : {0, 1}) {
137  for (size_t module : {0, 1, 2, 3}) {
138  m_moduleAnalyzers[side][module]->enablePreExclusion(maxSamplesExcl, HGADCThresh[side][module], LGADCThresh[side][module]);
139  }
140  }
141 }
142 
143 void ZDCDataAnalyzer::enablePreExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh)
144 {
145  for (size_t side : {0, 1}) {
146  for (size_t module : {0, 1, 2, 3}) {
147  m_moduleAnalyzers[side][module]->enablePreExclusion(maxSamplesExcl, HGADCThresh, LGADCThresh);
148  }
149  }
150 }
151 
152 void ZDCDataAnalyzer::enablePostExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray& HGADCThresh, const ZDCModuleIntArray& LGADCThresh)
153 {
154  for (size_t side : {0, 1}) {
155  for (size_t module : {0, 1, 2, 3}) {
156  m_moduleAnalyzers[side][module]->enablePostExclusion(maxSamplesExcl, HGADCThresh[side][module], LGADCThresh[side][module]);
157  }
158  }
159 }
160 
161 void ZDCDataAnalyzer::enablePostExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh)
162 {
163  for (size_t side : {0, 1}) {
164  for (size_t module : {0, 1, 2, 3}) {
165  m_moduleAnalyzers[side][module]->enablePostExclusion(maxSamplesExcl, HGADCThresh, LGADCThresh);
166  }
167  }
168 }
169 
170 
171 void ZDCDataAnalyzer::enableRepass(const ZDCModuleFloatArray& peak2ndDerivMinRepassHG, const ZDCModuleFloatArray& peak2ndDerivMinRepassLG)
172 {
173  m_repassEnabled = true;
174  for (size_t side : {0, 1}) {
175  for (size_t module : {0, 1, 2, 3}) {
176  m_moduleAnalyzers[side][module]->enableRepass(peak2ndDerivMinRepassHG[side][module], peak2ndDerivMinRepassLG[side][module]);
177  }
178  }
179 }
180 
182 {
183  for (size_t side : {0, 1}) {
184  for (size_t module : {0, 1, 2, 3}) {
185  m_moduleAnalyzers[side][module]->set2ndDerivStep(step);
186  }
187  }
188 }
189 
190 void ZDCDataAnalyzer::SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG)
191 {
192  for (size_t side : {0, 1}) {
193  for (size_t module : {0, 1, 2, 3}) {
194  m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorHG, gainFactorLG);
195  }
196  }
197 }
198 
199 void ZDCDataAnalyzer::SetGainFactorsHGLG(const ZDCModuleFloatArray& gainFactorsHG, const ZDCModuleFloatArray& gainFactorsLG)
200 {
201  for (size_t side : {0, 1}) {
202  for (size_t module : {0, 1, 2, 3}) {
203  m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorsHG[side][module], gainFactorsLG[side][module]);
204  }
205  }
206 }
207 
209  for (size_t side : {0, 1}) {
210  for (size_t module : {0, 1, 2, 3}) {
211  m_moduleAnalyzers[side][module]->SetPeak2ndDerivMinTolerance(tolerance);
212  }
213  }
214 }
215 
216 
218  for (size_t side : {0, 1}) {
219  for (size_t module : {0, 1, 2, 3}) {
220  m_moduleAnalyzers[side][module]->SetFitTimeMax(tmax);
221  }
222  }
223 }
224 
225 
228 }
229 
230 
232  const ZDCModuleFloatArray& tau1, const ZDCModuleFloatArray& tau2,
233  const ZDCModuleFloatArray& t0HG, const ZDCModuleFloatArray& t0LG)
234 {
235  for (size_t side : {0, 1}) {
236  for (size_t module : {0, 1, 2, 3}) {
237  m_moduleAnalyzers[side][module]->SetTauT0Values(fixTau1[side][module], fixTau2[side][module],
238  tau1[side][module], tau2[side][module], t0HG[side][module], t0LG[side][module]);
239  }
240  }
241 }
242 
243 void ZDCDataAnalyzer::SetNoiseSigmas(const ZDCModuleFloatArray& noiseSigmasHG, const ZDCModuleFloatArray& noiseSigmasLG)
244 {
245  for (size_t side : {0, 1}) {
246  for (size_t module : {0, 1, 2, 3}) {
247  m_moduleAnalyzers[side][module]->SetNoiseSigmas(noiseSigmasHG[side][module], noiseSigmasLG[side][module]);
248  }
249  }
250 }
251 
253  for (size_t side : {0, 1}) {
254  for (size_t module : {0, 1, 2, 3}) {
255  m_moduleAmpFractionLG[side][module] = moduleAmpFractionLG[side][module];
256  }
257  }
258 }
259 
261  const ZDCModuleFloatArray& maxAmpHG, const ZDCModuleFloatArray& maxAmpLG)
262 {
263  for (size_t side : {0, 1}) {
264  for (size_t module : {0, 1, 2, 3}) {
265  m_moduleAnalyzers[side][module]->SetFitMinMaxAmp(minAmpHG[side][module], minAmpLG[side][module],
266  maxAmpHG[side][module], maxAmpLG[side][module]);
267 
268  }
269  }
270 }
271 
272 void ZDCDataAnalyzer::SetFitMinMaxAmpValues(float minHG, float minLG, float maxHG, float maxLG)
273 {
274  for (size_t side : {0, 1}) {
275  for (size_t module : {0, 1, 2, 3}) {
276  m_moduleAnalyzers[side][module]->SetFitMinMaxAmp(minHG, minLG, maxHG, maxLG);
277  }
278  }
279 }
280 
282  const ZDCModuleFloatArray& LGOverflowADC)
283 {
284  for (size_t side : {0, 1}) {
285  for (size_t module : {0, 1, 2, 3}) {
286  m_moduleAnalyzers[side][module]->SetADCOverUnderflowValues(HGOverflowADC[side][module], HGUnderflowADC[side][module], LGOverflowADC[side][module]);
287  }
288  }
289 }
290 
291 void ZDCDataAnalyzer::SetCutValues(const ZDCModuleFloatArray& chisqDivAmpCutHG, const ZDCModuleFloatArray& chisqDivAmpCutLG,
292  const ZDCModuleFloatArray& deltaT0MinHG, const ZDCModuleFloatArray& deltaT0MaxHG,
293  const ZDCModuleFloatArray& deltaT0MinLG, const ZDCModuleFloatArray& deltaT0MaxLG)
294 {
295  for (size_t side : {0, 1}) {
296  for (size_t module : {0, 1, 2, 3}) {
297  m_moduleAnalyzers[side][module]->SetCutValues(chisqDivAmpCutHG[side][module], chisqDivAmpCutLG[side][module],
298  deltaT0MinHG[side][module], deltaT0MaxHG[side][module],
299  deltaT0MinLG[side][module], deltaT0MaxLG[side][module]);
300  }
301  }
302 }
303 
305  const std::array<std::array<std::vector<float>, 4>, 2>& HGParamArr,
306  const std::array<std::array<std::vector<float>, 4>, 2>& LGParamArr)
307 {
308  for (size_t side : {0, 1}) {
309  for (size_t module : {0, 1, 2, 3}) {
310  m_moduleAnalyzers[side][module]->SetTimingCorrParams(mode, refADC, refScale,
311  HGParamArr.at(side).at(module), LGParamArr.at(side).at(module));
312  }
313  }
314 
315 }
316 
317 void ZDCDataAnalyzer::SetNonlinCorrParams(float refADC, float refScale,
318  const std::array<std::array<std::vector<float>, 4>, 2>& HGNonlinCorrParams,
319  const std::array<std::array<std::vector<float>, 4>, 2>& LGNonlinCorrParams)
320 {
321  for (size_t side : {0, 1}) {
322  for (size_t module : {0, 1, 2, 3}) {
323  m_moduleAnalyzers[side][module]->SetNonlinCorrParams(refADC, refScale,
324  HGNonlinCorrParams[side][module],
325  LGNonlinCorrParams[side][module]);
326  }
327  }
328 }
329 
330 void ZDCDataAnalyzer::enableFADCCorrections(bool correctPerSample,
331  std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& corrHistHG,
332  std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& corrHistLG)
333 {
334  for (size_t side : {0, 1}) {
335  for (size_t module : {0, 1, 2, 3}) {
336  m_moduleAnalyzers[side][module]->enableFADCCorrections(correctPerSample, corrHistHG[side][module], corrHistLG[side][module]);
337  }
338  }
339 }
340 
342 {
343  for (size_t side : {0, 1}) {
344  for (size_t module : {0, 1, 2, 3}) {
345  m_moduleAnalyzers[side][module]->disableFADCCorrections();
346  }
347  }
348 }
349 
350 void ZDCDataAnalyzer::enableTimeSigCut(bool AND, float sigCut, const std::string& TF1String,
351  const std::array<std::array<std::vector<double>, 4>, 2>& parsHGArr,
352  const std::array<std::array<std::vector<double>, 4>, 2>& parsLGArr)
353 {
354  for (size_t side : {0, 1}) {
355  for (size_t module : {0, 1, 2, 3}) {
356  m_moduleAnalyzers[side][module]->enableTimeSigCut(AND, sigCut, TF1String, parsHGArr[side][module], parsLGArr[side][module]);
357  }
358  }
359 }
360 
362 {
363  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Starting new event, event index = " + std::to_string(m_eventCount)));
364 
365  // By default we perform quiet pulse fits
366  //
368  else {ZDCPulseAnalyzer::SetQuietFits(true);}
369 
370  // See if we have to load up new calibrations
371  //
372  if (lumiBlock != m_currentLB) {
373  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Starting new luminosity block " + std::to_string(lumiBlock)));
374 
375  if (m_haveECalib) {
376  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Loading energy calibrations for event " + std::to_string(m_eventCount) + ", lumi block " +
378 
379  for (size_t side : {0, 1}) {
380  for (size_t module : {0, 1, 2, 3}) {
381  float splineLBMin = m_LBDepEcalibSplines[side][module]->GetXmin();
382  float splineLBMax = m_LBDepEcalibSplines[side][module]->GetXmax();
383 
384  if (lumiBlock >= splineLBMin && lumiBlock <= splineLBMax) {
386  }
387  else if (lumiBlock < splineLBMin) {
389  }
390  else {
392  }
393  }
394  }
395  } // end of if (_haveEcalib) {
396 
397  if (m_haveT0Calib) {
398  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Loading timing calibrations for event " + std::to_string(m_eventCount) + ", lumi block " + std::to_string(lumiBlock)));
399 
400  for (size_t side : {0, 1}) {
401  for (size_t module : {0, 1, 2, 3}) {
402  float splineLBMin = m_T0HGOffsetSplines[side][module]->GetXmin();
403  float splineLBMax = m_T0HGOffsetSplines[side][module]->GetXmax();
404 
405  if (lumiBlock >= splineLBMin && lumiBlock <= splineLBMax) {
408  }
409  else if (lumiBlock < splineLBMin) {
412  }
413  else {
416  }
417  }
418  }
419  } // end of if (m_haveT0Calib)
420  }
421 
422  // Initialize transient results
423  //
424  for (size_t side : {0, 1}) {
425  for (size_t module : {0, 1, 2, 3}) {
426  m_dataLoaded[side][module] = false;
427  m_moduleStatus[side][module] = 0;
429  m_calibTime[side][module] = 0;
430  // _moduleFail[side][module] = false;
431  }
432 
433  m_moduleSum[side] = 0;
434  m_moduleSumErrSq[side] = 0;
437 
438  m_calibModuleSum[side] = 0;
441  m_averageTime[side] = 0;
442  m_fail[side] = false;
443  }
444 
445  m_moduleMask = 0;
447 }
448 
449 void ZDCDataAnalyzer::LoadAndAnalyzeData(size_t side, size_t module, const std::vector<float>& HGSamples, const std::vector<float>& LGSamples)
450 {
451 
452  // We immediately return if this module is disabled
453  //
454  if (m_moduleDisabled[side][module]) {
455  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Skipping analysis of disabled module for event index " + std::to_string(m_eventCount) + ", side, module = " + std::to_string(side) + ", " + std::to_string(module)));
456 
457  return;
458  }
459 
460  (*m_msgFunc_p)(ZDCMsg::Verbose, ("/n Loading data for event index " + std::to_string(m_eventCount) + ", side, module = " + std::to_string(side) + ", " + std::to_string(module)));
461 
462  ZDCPulseAnalyzer* pulseAna_p = m_moduleAnalyzers[side][module].get();
463  pulseAna_p->LoadAndAnalyzeData(HGSamples, LGSamples);
464  m_dataLoaded[side][module] = true;
465 
466  if (pulseAna_p->Failed()) {
467  (*m_msgFunc_p)(ZDCMsg::Debug, ("ZDCPulseAnalyzer::LoadData() returned fail for event " + std::to_string(m_eventCount) + ", side, module = " + std::to_string(side) + ", " + std::to_string(module)));
468 
469  m_fail[side] = true;
470  }
471 
472  m_moduleStatus[side][module] = pulseAna_p->GetStatusMask();
473 }
474 
475 void ZDCDataAnalyzer::LoadAndAnalyzeData(size_t side, size_t module, const std::vector<float>& HGSamples, const std::vector<float>& LGSamples,
476  const std::vector<float>& HGSamplesDelayed, const std::vector<float>& LGSamplesDelayed)
477 {
478  // We immediately return if this module is disabled
479  //
480  if (m_moduleDisabled[side][module]) {
481  (*m_msgFunc_p)(ZDCMsg::Debug, ("Skipping analysis of disabled mofule for event index " + std::to_string(m_eventCount) + ", side, module = " + std::to_string(side) + ", " + std::to_string(module)));
482 
483  return;
484  }
485 
486  if (m_delayedOrder[side][module] == 0) {
487  (*m_msgFunc_p)(ZDCMsg::Error, ("Handling of delayed pulses not enabled, on side, module = " + std::to_string(side) + ", " + std::to_string(module) + ", skipping processing for event index " + std::to_string(m_eventCount)));
488  return;
489  }
490 
491  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Loading undelayed and delayed data for event index " + std::to_string(m_eventCount) + ", side, module = " + std::to_string(side) + ", " + std::to_string(module)));
492 
493  ZDCPulseAnalyzer* pulseAna_p = m_moduleAnalyzers[side][module].get();
494  if (m_delayedOrder[side][module] > 0) {
495  pulseAna_p->LoadAndAnalyzeData(HGSamples, LGSamples, HGSamplesDelayed, LGSamplesDelayed);
496  }
497  else {
498  pulseAna_p->LoadAndAnalyzeData(HGSamplesDelayed, LGSamplesDelayed, HGSamples, LGSamples);
499  }
500  m_dataLoaded[side][module] = true;
501 
502  if (pulseAna_p->Failed()) {
503  (*m_msgFunc_p)(ZDCMsg::Debug, ("ZDCPulseAnalyzer::LoadData() returned fail for event " + std::to_string(m_eventCount) + ", side, module = " + std::to_string(side) + ", " + std::to_string(module)));
504 
505  m_fail[side] = true;
506  }
507 
508  m_moduleStatus[side][module] = pulseAna_p->GetStatusMask();
509 }
510 
512 {
513  // First make sure that all data is loaded. while we're at it, count how many modules on each side have a pulse
514  //
515  unsigned int sideNPulsesMod[2] = {0, 0};
516 
517  for (size_t side : {0, 1}) {
518  for (size_t module : {0, 1, 2, 3}) {
519  if (!m_dataLoaded[side][module] && !m_moduleDisabled[side][module]) {return false;}
520  if (m_moduleAnalyzers[side][module]->ArmSumInclude()) {sideNPulsesMod[side]++;}
521  }
522  }
523 
524  // Are we doing a repass? If so, reanalyze modules for which no pulse was found the first time
525  // as long as we have one module with a pulse on the given side
526  //
527  if (m_repassEnabled) {
528  for (size_t side : {0, 1}) {
529  if (sideNPulsesMod[side] == 0) continue;
530 
531  for (size_t module : {0, 1, 2, 3}) {
532  if (m_moduleDisabled[side][module]) continue;
533 
534  ZDCPulseAnalyzer* pulseAna_p = m_moduleAnalyzers[side][module].get();
535 
536  // If this module had no pulse the first time, reanalyze it (with a lower 2nd derivative threshold)
537  //
538  if (!pulseAna_p->HavePulse()) {
539  (*m_msgFunc_p)(ZDCMsg::Debug, ("ZDCPulseAnalyzer:: performing a repass on data for side, module = " + std::to_string(side) + ", " + std::to_string(module)));
540  pulseAna_p->ReanalyzeData();
541  m_moduleStatus[side][module] = pulseAna_p->GetStatusMask();
542  }
543  }
544  }
545  }
546 
547  // Now sum up amplitudes etc
548  //
549  for (size_t side : {0, 1}) {
550  float tempFraction = 1.0;
551  double sumAmpTimesBkgdFrac = 0.0;
552  double sumCalibAmpTimesBkgdFrac = 0.0;
553 
554  for (size_t module : {0, 1, 2, 3}) {
555  ZDCPulseAnalyzer* pulseAna_p = m_moduleAnalyzers[side][module].get();
556 
557  if (pulseAna_p->ArmSumInclude()) {
558  int moduleMaskBit = 4 * side + module;
559  m_moduleMask |= 1 << moduleMaskBit;
560 
561  float amplitude = pulseAna_p->GetAmplitude();
562  float ampError = pulseAna_p->GetAmpError();
563  float bkgdFraction = pulseAna_p->GetBkgdMaxFraction();
564 
566 
567  float calibAmpError = ampError * m_currentECalibCoeff[side][module];
568 
569  float timeCalib = pulseAna_p->GetT0Corr();
570  if (pulseAna_p->UseLowGain()) {timeCalib -= m_currentT0OffsetsLG[side][module];}
571  else {timeCalib -= m_currentT0OffsetsHG[side][module];}
572 
573  m_calibTime[side][module] = timeCalib;
574 
575  m_moduleSum[side] += amplitude;
576  m_moduleSumErrSq[side] += ampError * ampError;
577  sumAmpTimesBkgdFrac += amplitude*bkgdFraction;
578 
579  m_moduleSumPreSample[side] += pulseAna_p->GetPreSampleAmp();
580 
582  m_calibModuleSumErrSq[side] += calibAmpError * calibAmpError;
583 
585  sumCalibAmpTimesBkgdFrac += amplitude*bkgdFraction;
586  }
587 
588  // subtract the fraction of LGOverflow events if we have fraction available (<0 means unavailable)
589  if (pulseAna_p->LGOverflow() && m_moduleAmpFractionLG[side][module] > 0) {tempFraction -= m_moduleAmpFractionLG[side][module];}
590  }
591 
592  {
594  if (m_moduleSum[side] > 0) m_moduleSumBkgdFrac[side] = sumAmpTimesBkgdFrac/m_moduleSum[side];
595  else m_moduleSumBkgdFrac[side] = 0;
596  }
597 
598  if (m_calibModuleSum[side] > 1e-6) {
600  m_calibModSumBkgdFrac[side] = sumCalibAmpTimesBkgdFrac/m_calibModuleSum[side];
601  }
602  else {
603  m_averageTime[side] = 0;
605  }
606 
607  if (tempFraction < 1.0) {m_moduleSum[side] /= tempFraction;}
608  }
609 
610  m_eventCount++;
611  return true;
612 }
ZDCDataAnalyzer::m_T0LGOffsetSplines
std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > m_T0LGOffsetSplines
Definition: ZDCDataAnalyzer.h:51
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
ZDCDataAnalyzer::m_calibAmplitude
std::array< std::array< float, 4 >, 2 > m_calibAmplitude
Definition: ZDCDataAnalyzer.h:66
ZDCDataAnalyzer::m_dataLoaded
std::array< std::array< bool, 4 >, 2 > m_dataLoaded
Definition: ZDCDataAnalyzer.h:60
CXXUTILS_TRAPPING_FP
#define CXXUTILS_TRAPPING_FP
Definition: trapping_fp.h:24
ZDCPulseAnalyzer::UseLowGain
bool UseLowGain() const
Definition: ZDCPulseAnalyzer.h:553
ZDCDataAnalyzer::m_moduleMask
unsigned int m_moduleMask
Definition: ZDCDataAnalyzer.h:63
ZDCPulseAnalyzer::ArmSumInclude
bool ArmSumInclude() const
Definition: ZDCPulseAnalyzer.h:573
ZDCDataAnalyzer::enableTimeSigCut
void enableTimeSigCut(bool AND, float sigCut, const std::string &TF1String, const std::array< std::array< std::vector< double >, 4 >, 2 > &parsHGArr, const std::array< std::array< std::vector< double >, 4 >, 2 > &parsLGArr)
Definition: ZDCDataAnalyzer.cxx:350
ZDCPulseAnalyzer::ReanalyzeData
bool ReanalyzeData()
Definition: ZDCPulseAnalyzer.cxx:730
ZDCPulseAnalyzer::Failed
bool Failed() const
Definition: ZDCPulseAnalyzer.h:554
ZDCDataAnalyzer::m_moduleAnalyzers
std::array< std::array< std::unique_ptr< ZDCPulseAnalyzer >, 4 >, 2 > m_moduleAnalyzers
Definition: ZDCDataAnalyzer.h:39
ZDCPulseAnalyzer.h
ZDCDataAnalyzer::ZDCModuleFloatArray
std::array< std::array< float, 4 >, 2 > ZDCModuleFloatArray
Definition: ZDCDataAnalyzer.h:22
ZDCPulseAnalyzer::GetAmpError
float GetAmpError() const
Definition: ZDCPulseAnalyzer.h:598
ZDCPulseAnalyzer::LGOverflow
bool LGOverflow() const
Definition: ZDCPulseAnalyzer.h:559
ZDCPulseAnalyzer::GetStatusMask
unsigned int GetStatusMask() const
Definition: ZDCPulseAnalyzer.cxx:2017
ZDCDataAnalyzer::m_repassEnabled
bool m_repassEnabled
Definition: ZDCDataAnalyzer.h:34
ZDCPulseAnalyzer::HavePulse
bool HavePulse() const
Definition: ZDCPulseAnalyzer.h:552
ZDCDataAnalyzer::m_moduleSum
std::array< float, 2 > m_moduleSum
Definition: ZDCDataAnalyzer.h:69
ZDCDataAnalyzer::m_T0HGOffsetSplines
std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > m_T0HGOffsetSplines
Definition: ZDCDataAnalyzer.h:50
ZDCDataAnalyzer::ZDCModuleIntArray
std::array< std::array< int, 4 >, 2 > ZDCModuleIntArray
Definition: ZDCDataAnalyzer.h:24
Root::AND
@ AND
Definition: TGRLCollection.h:32
ZDCPulseAnalyzer
Definition: ZDCPulseAnalyzer.h:22
ZDCPulseAnalyzer::GetAmplitude
float GetAmplitude() const
Definition: ZDCPulseAnalyzer.h:597
ZDCDataAnalyzer::m_msgFunc_p
ZDCMsg::MessageFunctionPtr m_msgFunc_p
Definition: ZDCDataAnalyzer.h:27
ZDCPulseAnalyzer::SetQuietFits
static void SetQuietFits(bool quiet)
Definition: ZDCPulseAnalyzer.h:443
ZDCPulseAnalyzer::GetT0Corr
float GetT0Corr() const
Definition: ZDCPulseAnalyzer.h:584
ZDCDataAnalyzer::set2ndDerivStep
void set2ndDerivStep(size_t step)
Definition: ZDCDataAnalyzer.cxx:181
ZDCDataAnalyzer::SetCutValues
void SetCutValues(const ZDCModuleFloatArray &chisqDivAmpCutHG, const ZDCModuleFloatArray &chisqDivAmpCutLG, const ZDCModuleFloatArray &deltaT0MinHG, const ZDCModuleFloatArray &deltaT0MaxHG, const ZDCModuleFloatArray &deltaT0MinLG, const ZDCModuleFloatArray &deltaT0MaxLG)
Definition: ZDCDataAnalyzer.cxx:291
TRT::Hit::side
@ side
Definition: HitInfo.h:83
ZDCPulseAnalyzer::LoadAndAnalyzeData
bool LoadAndAnalyzeData(const std::vector< float > &ADCSamplesHG, const std::vector< float > &ADCSamplesLG)
Definition: ZDCPulseAnalyzer.cxx:653
ZDCDataAnalyzer::m_calibTime
std::array< std::array< float, 4 >, 2 > m_calibTime
Definition: ZDCDataAnalyzer.h:67
ZDCDataAnalyzer::enableFADCCorrections
void enableFADCCorrections(bool correctPerSample, std::array< std::array< std::unique_ptr< const TH1 >, 4 >, 2 > &correHistHG, std::array< std::array< std::unique_ptr< const TH1 >, 4 >, 2 > &correHistLG)
Definition: ZDCDataAnalyzer.cxx:330
ZDCDataAnalyzer.h
python.PyAthena.module
module
Definition: PyAthena.py:131
ZDCDataAnalyzer::m_haveECalib
bool m_haveECalib
Definition: ZDCDataAnalyzer.h:46
ZDCMsg::Verbose
@ Verbose
Definition: ZDCMsg.h:18
ZDCDataAnalyzer::m_eventCount
int m_eventCount
Definition: ZDCDataAnalyzer.h:41
checkTP.save
def save(self, fileName="./columbo.out")
Definition: checkTP.py:178
ZDCDataAnalyzer::m_moduleSumBkgdFrac
std::array< float, 2 > m_moduleSumBkgdFrac
Definition: ZDCDataAnalyzer.h:72
ZDCDataAnalyzer::m_haveT0Calib
bool m_haveT0Calib
Definition: ZDCDataAnalyzer.h:49
ZDCDataAnalyzer::LoadAndAnalyzeData
void LoadAndAnalyzeData(size_t side, size_t module, const std::vector< float > &HGSamples, const std::vector< float > &LGSamples)
Definition: ZDCDataAnalyzer.cxx:449
ZDCDataAnalyzer::m_fail
std::array< bool, 2 > m_fail
Definition: ZDCDataAnalyzer.h:79
ZDCDataAnalyzer::m_calibModuleSumErrSq
std::array< float, 2 > m_calibModuleSumErrSq
Definition: ZDCDataAnalyzer.h:75
ZDCDataAnalyzer::SetNoiseSigmas
void SetNoiseSigmas(const ZDCModuleFloatArray &noiseSigmasHG, const ZDCModuleFloatArray &noiseSigmasLG)
Definition: ZDCDataAnalyzer.cxx:243
ZDCDataAnalyzer::m_averageTime
std::array< float, 2 > m_averageTime
Definition: ZDCDataAnalyzer.h:78
ZDCDataAnalyzer::SetADCOverUnderflowValues
void SetADCOverUnderflowValues(const ZDCModuleFloatArray &HGOverflowADC, const ZDCModuleFloatArray &HGUnderflowADC, const ZDCModuleFloatArray &LGOverflowADC)
Definition: ZDCDataAnalyzer.cxx:281
ZDCDataAnalyzer::m_currentLB
int m_currentLB
Definition: ZDCDataAnalyzer.h:55
ZDCDataAnalyzer::m_moduleSumPreSample
std::array< float, 2 > m_moduleSumPreSample
Definition: ZDCDataAnalyzer.h:71
ZDCPulseAnalyzer::SetSaveFitFunc
static void SetSaveFitFunc(bool save)
Definition: ZDCPulseAnalyzer.h:444
Preparation.mode
mode
Definition: Preparation.py:107
ZDCPulseAnalyzer::TimingCorrMode
TimingCorrMode
Definition: ZDCPulseAnalyzer.h:57
ZDCDataAnalyzer::m_calibModuleSum
std::array< float, 2 > m_calibModuleSum
Definition: ZDCDataAnalyzer.h:74
ZDCDataAnalyzer::SetFitMinMaxAmpValues
void SetFitMinMaxAmpValues(const ZDCModuleFloatArray &minAmpHG, const ZDCModuleFloatArray &minAmpLG, const ZDCModuleFloatArray &maxAmpHG, const ZDCModuleFloatArray &maxAmpLG)
Definition: ZDCDataAnalyzer.cxx:260
ZDCDataAnalyzer::SetTauT0Values
void SetTauT0Values(const ZDCModuleBoolArray &fxiTau1, const ZDCModuleBoolArray &fxiTau2, const ZDCModuleFloatArray &tau1, const ZDCModuleFloatArray &tau2, const ZDCModuleFloatArray &t0HG, const ZDCModuleFloatArray &t0LG)
Definition: ZDCDataAnalyzer.cxx:231
ZDCDataAnalyzer::enableDelayed
void enableDelayed(float deltaT, const ZDCModuleFloatArray &undelayedDelayedPedestalDiff)
Definition: ZDCDataAnalyzer.cxx:108
ZDCDataAnalyzer::m_calibModSumBkgdFrac
std::array< float, 2 > m_calibModSumBkgdFrac
Definition: ZDCDataAnalyzer.h:76
lumiFormat.array
array
Definition: lumiFormat.py:91
ZDCMsg::Error
@ Error
Definition: ZDCMsg.h:22
tolerance
Definition: suep_shower.h:17
trapping_fp.h
Tell the compiler to optimize assuming that FP may trap.
ZDCDataAnalyzer::enablePostExclusion
void enablePostExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray &HGADCThresh, const ZDCModuleIntArray &LGADCThresh)
Definition: ZDCDataAnalyzer.cxx:152
ZDCDataAnalyzer::ZDCDataAnalyzer
ZDCDataAnalyzer(ZDCMsg::MessageFunctionPtr messageFunc_p, int nSample, float deltaTSample, size_t preSampleIdx, std::string fitFunction, const ZDCModuleIntArray &peak2ndDerivMinSamples, const ZDCModuleFloatArray &peak2ndDerivMinThresholdsHG, const ZDCModuleFloatArray &peak2ndDerivMinThresholdsLG, unsigned int LGMode=ZDCPulseAnalyzer::LGModeNormal)
Definition: ZDCDataAnalyzer.cxx:14
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
ZDCDataAnalyzer::m_moduleSumErrSq
std::array< float, 2 > m_moduleSumErrSq
Definition: ZDCDataAnalyzer.h:70
ZDCMsg::MessageFunctionPtr
std::shared_ptr< MessageFunction > MessageFunctionPtr
Definition: ZDCMsg.h:14
ZDCDataAnalyzer::m_currentT0OffsetsHG
ZDCModuleFloatArray m_currentT0OffsetsHG
Definition: ZDCDataAnalyzer.h:57
ZDCDataAnalyzer::disableFADCCorrections
void disableFADCCorrections()
Definition: ZDCDataAnalyzer.cxx:341
ZDCDataAnalyzer::enablePreExclusion
void enablePreExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray &HGADCThresh, const ZDCModuleIntArray &LGADCThresh)
Definition: ZDCDataAnalyzer.cxx:134
ZDCDataAnalyzer::SetNonlinCorrParams
void SetNonlinCorrParams(float refADC, float refScale, const std::array< std::array< std::vector< float >, 4 >, 2 > &HGNonlinCorrParams, const std::array< std::array< std::vector< float >, 4 >, 2 > &LHGNonlinCorrParams)
Definition: ZDCDataAnalyzer.cxx:317
ZDCDataAnalyzer::m_moduleStatus
std::array< std::array< unsigned int, 4 >, 2 > m_moduleStatus
Definition: ZDCDataAnalyzer.h:65
ZDCPulseAnalyzer::GetBkgdMaxFraction
float GetBkgdMaxFraction() const
Definition: ZDCPulseAnalyzer.h:676
ZDCDataAnalyzer::~ZDCDataAnalyzer
~ZDCDataAnalyzer()
Definition: ZDCDataAnalyzer.cxx:87
ZDCDataAnalyzer::disableModule
bool disableModule(size_t side, size_t module)
Definition: ZDCDataAnalyzer.cxx:91
ZDCDataAnalyzer::FinishEvent
bool FinishEvent()
Definition: ZDCDataAnalyzer.cxx:511
ZDCDataAnalyzer::ZDCModuleBoolArray
std::array< std::array< bool, 4 >, 2 > ZDCModuleBoolArray
Definition: ZDCDataAnalyzer.h:23
ZDCDataAnalyzer::m_currentECalibCoeff
ZDCModuleFloatArray m_currentECalibCoeff
Definition: ZDCDataAnalyzer.h:56
ZDCDataAnalyzer::m_currentT0OffsetsLG
ZDCModuleFloatArray m_currentT0OffsetsLG
Definition: ZDCDataAnalyzer.h:58
ZDCDataAnalyzer::m_LBDepEcalibSplines
std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > m_LBDepEcalibSplines
Definition: ZDCDataAnalyzer.h:47
ZDCDataAnalyzer::SetFitTimeMax
void SetFitTimeMax(float tmax)
Definition: ZDCDataAnalyzer.cxx:217
LArCellBinning.step
step
Definition: LArCellBinning.py:158
ZDCMsg::Debug
@ Debug
Definition: ZDCMsg.h:19
ZDCDataAnalyzer::enableRepass
void enableRepass(const ZDCModuleFloatArray &peak2ndDerivMinRepassHG, const ZDCModuleFloatArray &peak2ndDerivMinRepassLG)
Definition: ZDCDataAnalyzer.cxx:171
ZDCDataAnalyzer::m_moduleDisabled
ZDCModuleBoolArray m_moduleDisabled
Definition: ZDCDataAnalyzer.h:38
ZDCDataAnalyzer::SetPeak2ndDerivMinTolerances
void SetPeak2ndDerivMinTolerances(size_t tolerance)
Definition: ZDCDataAnalyzer.cxx:208
xAOD::lumiBlock
setTeId lumiBlock
Definition: L2StandAloneMuon_v1.cxx:327
ZDCDataAnalyzer::SetSaveFitFunc
void SetSaveFitFunc(bool save)
Definition: ZDCDataAnalyzer.cxx:226
ZDCDataAnalyzer::SetGainFactorsHGLG
void SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG)
Definition: ZDCDataAnalyzer.cxx:190
ZDCDataAnalyzer::SetTimingCorrParams
void SetTimingCorrParams(ZDCPulseAnalyzer::TimingCorrMode mode, float refADC, float refScale, const std::array< std::array< std::vector< float >, 4 >, 2 > &HGParamArr, const std::array< std::array< std::vector< float >, 4 >, 2 > &LGParamArr)
Definition: ZDCDataAnalyzer.cxx:304
ZDCDataAnalyzer::StartEvent
void StartEvent(int lumiBlock)
Definition: ZDCDataAnalyzer.cxx:361
ZDCDataAnalyzer::m_moduleAmpFractionLG
std::array< std::array< float, 4 >, 2 > m_moduleAmpFractionLG
Definition: ZDCDataAnalyzer.h:81
ZDCDataAnalyzer::m_delayedOrder
std::array< std::array< int, 4 >, 2 > m_delayedOrder
Definition: ZDCDataAnalyzer.h:36
ZDCPulseAnalyzer::GetPreSampleAmp
float GetPreSampleAmp() const
Definition: ZDCPulseAnalyzer.h:675
ZDCDataAnalyzer::SetModuleAmpFractionLG
void SetModuleAmpFractionLG(const ZDCDataAnalyzer::ZDCModuleFloatArray &moduleAmpFractionLG)
Definition: ZDCDataAnalyzer.cxx:252