ATLAS Offline Software
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_haveNLcalib(false),
41  m_NLcalibFactors({{
42  {{ {{0,0,0,0,0,0}},{{0,0,0,0,0,0}},{{0,0,0,0,0,0}} }},
43  {{ {{0,0,0,0,0,0}},{{0,0,0,0,0,0}},{{0,0,0,0,0,0}} }} }}),
44  m_NLcalibModuleSum({{0, 0}}),
45  m_NLcalibModuleSumErrSq({{0, 0}}),
46  m_averageTime({{0, 0}}),
47  m_fail({{false, false}})
48 {
49  m_moduleDisabled[0] = {{false, false, false, false}};
50  m_moduleDisabled[1] = {{false, false, false, false}};
51 
52  m_moduleAnalyzers[0] = {{0, 0, 0, 0}};
53  m_moduleAnalyzers[1] = {{0, 0, 0, 0}};
54 
55  m_calibAmplitude[0] = {{0, 0, 0, 0}};
56  m_calibAmplitude[1] = {{0, 0, 0, 0}};
57 
58  m_calibTime[0] = {{0, 0, 0, 0}};
59  m_calibTime[1] = {{0, 0, 0, 0}};
60 
61  m_dataLoaded[0] = {{false, false, false, false}};
62  m_dataLoaded[1] = {{false, false, false, false}};
63 
64  m_delayedOrder[0] = {0, 0, 0, 0};
65  m_delayedOrder[1] = {0, 0, 0, 0};
66 
67  // For now we are using hard-coded gain factors and pedestals
68  //
69  m_HGGains[0] = {{10, 10, 10, 10}};
70  m_HGGains[1] = {{10, 10, 10, 10}};
71 
72  m_pedestals[0] = {{100, 100, 100, 100}};
73  m_pedestals[1] = {{100, 100, 100, 100}};
74 
75  // Construct the per-module pulse analyzers
76  //
77  for (size_t side : {0, 1}) {
78  for (size_t module : {0, 1, 2, 3}) {
79  std::ostringstream moduleTag;
80  moduleTag << "_s" << side << "_m" << module;
81 
82  m_moduleAnalyzers[side][module].reset (new ZDCPulseAnalyzer(m_msgFunc_p, moduleTag.str(), m_nSample, m_deltaTSample, m_preSampleIdx,
83  m_pedestals[side][module], m_HGGains[side][module], m_fitFunction,
84  peak2ndDerivMinSamples[side][module],
85  peak2ndDerivMinThresholdsHG[side][module],
86  peak2ndDerivMinThresholdsLG[side][module]));
87  m_moduleAnalyzers[side][module]->setLGMode(m_LGMode);
88  }
89  }
90 }
91 
93 {
94 }
95 
97 {
98  if (side < 2 && module < 4) {
99  //
100  // Can't disable in the middle of analysis
101  //
102  if (m_dataLoaded[side][module]) return false;
103  else {
104  m_moduleDisabled[side][module] = true;
105  return true;
106  }
107  }
108  else {
109  return false;
110  }
111 }
112 
113 void ZDCDataAnalyzer::enableDelayed(float deltaT, const ZDCModuleFloatArray& undelayedDelayedPedestalDiff)
114 {
115  int delayedOrder = deltaT < 0 ? -1 : 1;
116  for (size_t side : {0, 1}) {
117  for (size_t module : {0, 1, 2, 3}) {
118  m_delayedOrder[side][module] = delayedOrder;
119  m_moduleAnalyzers[side][module]->enableDelayed(std::abs(deltaT), undelayedDelayedPedestalDiff[side][module]);
120  }
121  }
122 }
123 
124 void ZDCDataAnalyzer::enableDelayed(const ZDCModuleFloatArray& delayDeltaTArray, const ZDCModuleFloatArray& undelayedDelayedPedestalDiff)
125 {
126  for (size_t side : {0, 1}) {
127  for (size_t module : {0, 1, 2, 3}) {
128  if (delayDeltaTArray[side][module] < 0) m_delayedOrder[side][module] = -1;
129  else m_delayedOrder[side][module] = 1;
130 
131  (*m_msgFunc_p)(ZDCMsg::Verbose, "Enabling use of delayed samples on side, module = " + std::to_string(side) + ", " +
132  std::to_string(module) + ", delta t = " + std::to_string(delayDeltaTArray[side][module]));
133 
134  m_moduleAnalyzers[side][module]->enableDelayed(std::abs(delayDeltaTArray[side][module]), undelayedDelayedPedestalDiff[side][module]);
135  }
136  }
137 }
138 
139 void ZDCDataAnalyzer::enablePreExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray& HGADCThresh, const ZDCModuleIntArray& LGADCThresh)
140 {
141  for (size_t side : {0, 1}) {
142  for (size_t module : {0, 1, 2, 3}) {
143  m_moduleAnalyzers[side][module]->enablePreExclusion(maxSamplesExcl, HGADCThresh[side][module], LGADCThresh[side][module]);
144  }
145  }
146 }
147 
148 void ZDCDataAnalyzer::enablePreExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh)
149 {
150  for (size_t side : {0, 1}) {
151  for (size_t module : {0, 1, 2, 3}) {
152  m_moduleAnalyzers[side][module]->enablePreExclusion(maxSamplesExcl, HGADCThresh, LGADCThresh);
153  }
154  }
155 }
156 
157 void ZDCDataAnalyzer::enablePostExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray& HGADCThresh, const ZDCModuleIntArray& LGADCThresh)
158 {
159  for (size_t side : {0, 1}) {
160  for (size_t module : {0, 1, 2, 3}) {
161  m_moduleAnalyzers[side][module]->enablePostExclusion(maxSamplesExcl, HGADCThresh[side][module], LGADCThresh[side][module]);
162  }
163  }
164 }
165 
166 void ZDCDataAnalyzer::enablePostExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh)
167 {
168  for (size_t side : {0, 1}) {
169  for (size_t module : {0, 1, 2, 3}) {
170  m_moduleAnalyzers[side][module]->enablePostExclusion(maxSamplesExcl, HGADCThresh, LGADCThresh);
171  }
172  }
173 }
174 
175 
176 void ZDCDataAnalyzer::enableRepass(const ZDCModuleFloatArray& peak2ndDerivMinRepassHG, const ZDCModuleFloatArray& peak2ndDerivMinRepassLG)
177 {
178  m_repassEnabled = true;
179  for (size_t side : {0, 1}) {
180  for (size_t module : {0, 1, 2, 3}) {
181  m_moduleAnalyzers[side][module]->enableRepass(peak2ndDerivMinRepassHG[side][module], peak2ndDerivMinRepassLG[side][module]);
182  }
183  }
184 }
185 
187 {
188  for (size_t side : {0, 1}) {
189  for (size_t module : {0, 1, 2, 3}) {
190  m_moduleAnalyzers[side][module]->set2ndDerivStep(step);
191  }
192  }
193 }
194 
195 void ZDCDataAnalyzer::SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG)
196 {
197  for (size_t side : {0, 1}) {
198  for (size_t module : {0, 1, 2, 3}) {
199  m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorHG, gainFactorLG);
200  }
201  }
202 }
203 
204 void ZDCDataAnalyzer::SetGainFactorsHGLG(const ZDCModuleFloatArray& gainFactorsHG, const ZDCModuleFloatArray& gainFactorsLG)
205 {
206  for (size_t side : {0, 1}) {
207  for (size_t module : {0, 1, 2, 3}) {
208  m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorsHG[side][module], gainFactorsLG[side][module]);
209  }
210  }
211 }
212 
214  for (size_t side : {0, 1}) {
215  for (size_t module : {0, 1, 2, 3}) {
216  m_moduleAnalyzers[side][module]->SetPeak2ndDerivMinTolerance(tolerance);
217  }
218  }
219 }
220 
221 
223  for (size_t side : {0, 1}) {
224  for (size_t module : {0, 1, 2, 3}) {
225  m_moduleAnalyzers[side][module]->SetFitTimeMax(tmax);
226  }
227  }
228 }
229 
230 
233 }
234 
235 
237  const ZDCModuleFloatArray& tau1, const ZDCModuleFloatArray& tau2,
238  const ZDCModuleFloatArray& t0HG, const ZDCModuleFloatArray& t0LG)
239 {
240  for (size_t side : {0, 1}) {
241  for (size_t module : {0, 1, 2, 3}) {
242  m_moduleAnalyzers[side][module]->SetTauT0Values(fixTau1[side][module], fixTau2[side][module],
243  tau1[side][module], tau2[side][module], t0HG[side][module], t0LG[side][module]);
244  }
245  }
246 }
247 
248 void ZDCDataAnalyzer::SetNoiseSigmas(const ZDCModuleFloatArray& noiseSigmasHG, const ZDCModuleFloatArray& noiseSigmasLG)
249 {
250  for (size_t side : {0, 1}) {
251  for (size_t module : {0, 1, 2, 3}) {
252  m_moduleAnalyzers[side][module]->SetNoiseSigmas(noiseSigmasHG[side][module], noiseSigmasLG[side][module]);
253  }
254  }
255 }
256 
258  for (size_t side : {0, 1}) {
259  for (size_t module : {0, 1, 2, 3}) {
260  m_moduleAmpFractionLG[side][module] = moduleAmpFractionLG[side][module];
261  }
262  }
263 }
264 
266  const ZDCModuleFloatArray& maxAmpHG, const ZDCModuleFloatArray& maxAmpLG)
267 {
268  for (size_t side : {0, 1}) {
269  for (size_t module : {0, 1, 2, 3}) {
270  m_moduleAnalyzers[side][module]->SetFitMinMaxAmp(minAmpHG[side][module], minAmpLG[side][module],
271  maxAmpHG[side][module], maxAmpLG[side][module]);
272 
273  }
274  }
275 }
276 
277 void ZDCDataAnalyzer::SetFitMinMaxAmpValues(float minHG, float minLG, float maxHG, float maxLG)
278 {
279  for (size_t side : {0, 1}) {
280  for (size_t module : {0, 1, 2, 3}) {
281  m_moduleAnalyzers[side][module]->SetFitMinMaxAmp(minHG, minLG, maxHG, maxLG);
282  }
283  }
284 }
285 
287  const ZDCModuleFloatArray& LGOverflowADC)
288 {
289  for (size_t side : {0, 1}) {
290  for (size_t module : {0, 1, 2, 3}) {
291  m_moduleAnalyzers[side][module]->SetADCOverUnderflowValues(HGOverflowADC[side][module], HGUnderflowADC[side][module], LGOverflowADC[side][module]);
292  }
293  }
294 }
295 
296 void ZDCDataAnalyzer::SetCutValues(const ZDCModuleFloatArray& chisqDivAmpCutHG, const ZDCModuleFloatArray& chisqDivAmpCutLG,
297  const ZDCModuleFloatArray& deltaT0MinHG, const ZDCModuleFloatArray& deltaT0MaxHG,
298  const ZDCModuleFloatArray& deltaT0MinLG, const ZDCModuleFloatArray& deltaT0MaxLG)
299 {
300  for (size_t side : {0, 1}) {
301  for (size_t module : {0, 1, 2, 3}) {
302  m_moduleAnalyzers[side][module]->SetCutValues(chisqDivAmpCutHG[side][module], chisqDivAmpCutLG[side][module],
303  deltaT0MinHG[side][module], deltaT0MaxHG[side][module],
304  deltaT0MinLG[side][module], deltaT0MaxLG[side][module]);
305  }
306  }
307 }
308 
310  const std::array<std::array<std::vector<float>, 4>, 2>& HGParamArr,
311  const std::array<std::array<std::vector<float>, 4>, 2>& LGParamArr)
312 {
313  for (size_t side : {0, 1}) {
314  for (size_t module : {0, 1, 2, 3}) {
315  m_moduleAnalyzers[side][module]->SetTimingCorrParams(mode, refADC, refScale,
316  HGParamArr.at(side).at(module), LGParamArr.at(side).at(module));
317  }
318  }
319 
320 }
321 
322 void ZDCDataAnalyzer::SetNonlinCorrParams(float refADC, float refScale,
323  const std::array<std::array<std::vector<float>, 4>, 2>& HGNonlinCorrParams,
324  const std::array<std::array<std::vector<float>, 4>, 2>& LGNonlinCorrParams)
325 {
326  for (size_t side : {0, 1}) {
327  for (size_t module : {0, 1, 2, 3}) {
328  m_moduleAnalyzers[side][module]->SetNonlinCorrParams(refADC, refScale,
329  HGNonlinCorrParams[side][module],
330  LGNonlinCorrParams[side][module]);
331  }
332  }
333 }
334 
335 void ZDCDataAnalyzer::SetNLcalibParams(std::array< std::array< std::array<float,6>, 3>, 2>& nlcalibParams)
336 {
337  for (size_t side: {0,1})
338  {
339  for (size_t module: {0,1,2})
340  {
341  for (size_t val: {0,1,2,3,4,5})
342  {
343  m_NLcalibFactors[side][module][val] = nlcalibParams[side][module][val];
344  }
345  }
346  }
347  m_haveNLcalib = true;
348 }
349 
350 void ZDCDataAnalyzer::enableFADCCorrections(bool correctPerSample,
351  std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& corrHistHG,
352  std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& corrHistLG)
353 {
354  for (size_t side : {0, 1}) {
355  for (size_t module : {0, 1, 2, 3}) {
356  m_moduleAnalyzers[side][module]->enableFADCCorrections(correctPerSample, corrHistHG[side][module], corrHistLG[side][module]);
357  }
358  }
359 }
360 
362 {
363  for (size_t side : {0, 1}) {
364  for (size_t module : {0, 1, 2, 3}) {
365  m_moduleAnalyzers[side][module]->disableFADCCorrections();
366  }
367  }
368 }
369 
370 void ZDCDataAnalyzer::enableTimeSigCut(bool AND, float sigCut, const std::string& TF1String,
371  const std::array<std::array<std::vector<double>, 4>, 2>& parsHGArr,
372  const std::array<std::array<std::vector<double>, 4>, 2>& parsLGArr)
373 {
374  for (size_t side : {0, 1}) {
375  for (size_t module : {0, 1, 2, 3}) {
376  m_moduleAnalyzers[side][module]->enableTimeSigCut(AND, sigCut, TF1String, parsHGArr[side][module], parsLGArr[side][module]);
377  }
378  }
379 }
380 
382 {
383  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Starting new event, event index = " + std::to_string(m_eventCount)));
384 
385  // By default we perform quiet pulse fits
386  //
388  else {ZDCPulseAnalyzer::SetQuietFits(true);}
389 
390  // See if we have to load up new calibrations
391  //
392  if (lumiBlock != m_currentLB) {
393  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Starting new luminosity block " + std::to_string(lumiBlock)));
394 
395  if (m_haveECalib) {
396  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Loading energy calibrations for event " + std::to_string(m_eventCount) + ", lumi block " +
398 
399  for (size_t side : {0, 1}) {
400  for (size_t module : {0, 1, 2, 3}) {
401  float splineLBMin = m_LBDepEcalibSplines[side][module]->GetXmin();
402  float splineLBMax = m_LBDepEcalibSplines[side][module]->GetXmax();
403 
404  if (lumiBlock >= splineLBMin && lumiBlock <= splineLBMax) {
406  }
407  else if (lumiBlock < splineLBMin) {
409  }
410  else {
412  }
413  }
414  }
415  } // end of if (_haveEcalib) {
416 
417  if (m_haveT0Calib) {
418  (*m_msgFunc_p)(ZDCMsg::Verbose, ("Loading timing calibrations for event " + std::to_string(m_eventCount) + ", lumi block " + std::to_string(lumiBlock)));
419 
420  for (size_t side : {0, 1}) {
421  for (size_t module : {0, 1, 2, 3}) {
422  float splineLBMin = m_T0HGOffsetSplines[side][module]->GetXmin();
423  float splineLBMax = m_T0HGOffsetSplines[side][module]->GetXmax();
424 
425  if (lumiBlock >= splineLBMin && lumiBlock <= splineLBMax) {
428  }
429  else if (lumiBlock < splineLBMin) {
432  }
433  else {
436  }
437  }
438  }
439  } // end of if (m_haveT0Calib)
440  }
441 
442  // Initialize transient results
443  //
444  for (size_t side : {0, 1}) {
445  for (size_t module : {0, 1, 2, 3}) {
446  m_dataLoaded[side][module] = false;
447  m_moduleStatus[side][module] = 0;
449  m_calibTime[side][module] = 0;
450  // _moduleFail[side][module] = false;
451  }
452 
453  m_moduleSum[side] = 0;
454  m_moduleSumErrSq[side] = 0;
457 
458  m_calibModuleSum[side] = 0;
461 
465 
466  m_averageTime[side] = 0;
467  m_fail[side] = false;
468  }
469 
470  m_moduleMask = 0;
472 }
473 
474 void ZDCDataAnalyzer::LoadAndAnalyzeData(size_t side, size_t module, const std::vector<float>& HGSamples, const std::vector<float>& LGSamples)
475 {
476 
477  // We immediately return if this module is disabled
478  //
479  if (m_moduleDisabled[side][module]) {
480  (*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)));
481 
482  return;
483  }
484 
485  (*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)));
486 
487  ZDCPulseAnalyzer* pulseAna_p = m_moduleAnalyzers[side][module].get();
488  pulseAna_p->LoadAndAnalyzeData(HGSamples, LGSamples);
489  m_dataLoaded[side][module] = true;
490 
491  if (pulseAna_p->Failed()) {
492  (*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)));
493 
494  m_fail[side] = true;
495  }
496 
497  m_moduleStatus[side][module] = pulseAna_p->GetStatusMask();
498 }
499 
500 void ZDCDataAnalyzer::LoadAndAnalyzeData(size_t side, size_t module, const std::vector<float>& HGSamples, const std::vector<float>& LGSamples,
501  const std::vector<float>& HGSamplesDelayed, const std::vector<float>& LGSamplesDelayed)
502 {
503  // We immediately return if this module is disabled
504  //
505  if (m_moduleDisabled[side][module]) {
506  (*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)));
507 
508  return;
509  }
510 
511  if (m_delayedOrder[side][module] == 0) {
512  (*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)));
513  return;
514  }
515 
516  (*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)));
517 
518  ZDCPulseAnalyzer* pulseAna_p = m_moduleAnalyzers[side][module].get();
519  if (m_delayedOrder[side][module] > 0) {
520  pulseAna_p->LoadAndAnalyzeData(HGSamples, LGSamples, HGSamplesDelayed, LGSamplesDelayed);
521  }
522  else {
523  pulseAna_p->LoadAndAnalyzeData(HGSamplesDelayed, LGSamplesDelayed, HGSamples, LGSamples);
524  }
525  m_dataLoaded[side][module] = true;
526 
527  if (pulseAna_p->Failed()) {
528  (*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)));
529 
530  m_fail[side] = true;
531  }
532 
533  m_moduleStatus[side][module] = pulseAna_p->GetStatusMask();
534 }
535 
537 {
538  // First make sure that all data is loaded. while we're at it, count how many modules on each side have a pulse
539  //
540  unsigned int sideNPulsesMod[2] = {0, 0};
541 
542  for (size_t side : {0, 1}) {
543  for (size_t module : {0, 1, 2, 3}) {
544  if (!m_dataLoaded[side][module] && !m_moduleDisabled[side][module]) {return false;}
545  if (m_moduleAnalyzers[side][module]->ArmSumInclude()) {sideNPulsesMod[side]++;}
546  }
547  }
548 
549  // Are we doing a repass? If so, reanalyze modules for which no pulse was found the first time
550  // as long as we have one module with a pulse on the given side
551  //
552  if (m_repassEnabled) {
553  for (size_t side : {0, 1}) {
554  if (sideNPulsesMod[side] == 0) continue;
555 
556  for (size_t module : {0, 1, 2, 3}) {
557  if (m_moduleDisabled[side][module]) continue;
558 
559  ZDCPulseAnalyzer* pulseAna_p = m_moduleAnalyzers[side][module].get();
560 
561  // If this module had no pulse the first time, reanalyze it (with a lower 2nd derivative threshold)
562  //
563  if (!pulseAna_p->HavePulse()) {
564  (*m_msgFunc_p)(ZDCMsg::Debug, ("ZDCPulseAnalyzer:: performing a repass on data for side, module = " + std::to_string(side) + ", " + std::to_string(module)));
565  pulseAna_p->ReanalyzeData();
566  m_moduleStatus[side][module] = pulseAna_p->GetStatusMask();
567  }
568  }
569  }
570  }
571 
572  // Now sum up amplitudes etc
573  //
574  for (size_t side : {0, 1}) {
575  float tempFraction = 1.0;
576  double sumAmpTimesBkgdFrac = 0.0;
577  double sumCalibAmpTimesBkgdFrac = 0.0;
578 
579  for (size_t module : {0, 1, 2, 3}) {
580  ZDCPulseAnalyzer* pulseAna_p = m_moduleAnalyzers[side][module].get();
581 
582  if (pulseAna_p->ArmSumInclude()) {
583  int moduleMaskBit = 4 * side + module;
584  m_moduleMask |= 1 << moduleMaskBit;
585 
586  float amplitude = pulseAna_p->GetAmplitude();
587  float ampError = pulseAna_p->GetAmpError();
588  float bkgdFraction = pulseAna_p->GetBkgdMaxFraction();
589 
591 
592  float calibAmpError = ampError * m_currentECalibCoeff[side][module];
593 
594  float timeCalib = pulseAna_p->GetT0Corr();
595  if (pulseAna_p->UseLowGain()) {timeCalib -= m_currentT0OffsetsLG[side][module];}
596  else {timeCalib -= m_currentT0OffsetsHG[side][module];}
597 
598  m_calibTime[side][module] = timeCalib;
599 
600  m_moduleSum[side] += amplitude;
601  m_moduleSumErrSq[side] += ampError * ampError;
602  sumAmpTimesBkgdFrac += amplitude*bkgdFraction;
603 
604  m_moduleSumPreSample[side] += pulseAna_p->GetPreSampleAmp();
605 
607  m_calibModuleSumErrSq[side] += calibAmpError * calibAmpError;
608 
610  sumCalibAmpTimesBkgdFrac += amplitude*bkgdFraction;
611  }
612 
613  // subtract the fraction of LGOverflow events if we have fraction available (<0 means unavailable)
614  if (pulseAna_p->LGOverflow() && m_moduleAmpFractionLG[side][module] > 0) {tempFraction -= m_moduleAmpFractionLG[side][module];}
615  }
616 
617  {
619  if (m_moduleSum[side] > 0) m_moduleSumBkgdFrac[side] = sumAmpTimesBkgdFrac/m_moduleSum[side];
620  else m_moduleSumBkgdFrac[side] = 0;
621  }
622 
623  if (m_calibModuleSum[side] > 1e-6) {
625  m_calibModSumBkgdFrac[side] = sumCalibAmpTimesBkgdFrac/m_calibModuleSum[side];
626  }
627  else {
628  m_averageTime[side] = 0;
630  }
631 
632  if (tempFraction < 1.0) {m_moduleSum[side] /= tempFraction;}
633  }
634 
636 
637  m_eventCount++;
638  return true;
639 }
640 
642 {
643  if (!m_haveNLcalib) return;
644 
645  for (int iside:{0,1})
646  {
647  if (m_calibModuleSum[iside]>0.)
648  {
649  float fEM = m_calibAmplitude[iside][0] / m_calibModuleSum[iside];
650  float fHad1 = m_calibAmplitude[iside][1] / m_calibModuleSum[iside];
651  float fHad2 = m_calibAmplitude[iside][2] / m_calibModuleSum[iside];
652 
653  float EMCorrFact = 0;
654 
655  for (size_t i=0;i<m_NLcalibFactors[iside][0].size()-1;i++)
656  {
657  EMCorrFact += std::pow(fEM - m_NLcalibFactors[iside][0][0],i)*m_NLcalibFactors[iside][0][i+1];
658  }
659 
660  float Had1CorrFact = 0;
661  for (size_t i=0;i<m_NLcalibFactors[iside][1].size()-1;i++)
662  {
663  Had1CorrFact += std::pow(fHad1 - m_NLcalibFactors[iside][1][0],i)*m_NLcalibFactors[iside][1][i+1];
664  }
665 
666  float Had2CorrFact = 0;
667  for (size_t i=0;i<m_NLcalibFactors[iside][2].size()-1;i++)
668  {
669  Had2CorrFact += std::pow(fHad2 - m_NLcalibFactors[iside][2][0],i)*m_NLcalibFactors[iside][2][i+1];
670  }
671 
672  float ECorrEM = m_calibModuleSum[iside]/EMCorrFact;
673  float ECorrEMHad1 = ECorrEM/Had1CorrFact;
674  float ECorrEMHad1Had2 = ECorrEMHad1/Had2CorrFact;
675 
676 
677  m_NLcalibModuleSum[iside] = ECorrEMHad1Had2;
678  m_NLcalibModuleSumErrSq[iside] = 0.; // no error for now
679  }
680  else
681  {
682  m_NLcalibModuleSum[iside] = 0.;
683  m_NLcalibModuleSumErrSq[iside] = 0.; // no error for now
684  }
685  }
686 
687 }
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:370
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_NLcalibModuleSum
std::array< float, 2 > m_NLcalibModuleSum
Definition: ZDCDataAnalyzer.h:81
ZDCDataAnalyzer::m_haveNLcalib
bool m_haveNLcalib
Definition: ZDCDataAnalyzer.h:78
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:186
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:296
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:350
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:176
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:474
ZDCDataAnalyzer::m_fail
std::array< bool, 2 > m_fail
Definition: ZDCDataAnalyzer.h:86
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:248
ZDCDataAnalyzer::SetNLcalibParams
void SetNLcalibParams(std::array< std::array< std::array< float, 6 >, 3 >, 2 > &nlcalibParams)
Definition: ZDCDataAnalyzer.cxx:335
ZDCDataAnalyzer::m_averageTime
std::array< float, 2 > m_averageTime
Definition: ZDCDataAnalyzer.h:85
lumiFormat.i
int i
Definition: lumiFormat.py:85
ZDCDataAnalyzer::SetADCOverUnderflowValues
void SetADCOverUnderflowValues(const ZDCModuleFloatArray &HGOverflowADC, const ZDCModuleFloatArray &HGUnderflowADC, const ZDCModuleFloatArray &LGOverflowADC)
Definition: ZDCDataAnalyzer.cxx:286
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:265
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:236
ZDCDataAnalyzer::m_NLcalibFactors
std::array< std::array< std::array< float, 6 >, 3 >, 2 > m_NLcalibFactors
Definition: ZDCDataAnalyzer.h:79
ZDCDataAnalyzer::enableDelayed
void enableDelayed(float deltaT, const ZDCModuleFloatArray &undelayedDelayedPedestalDiff)
Definition: ZDCDataAnalyzer.cxx:113
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
ZDCDataAnalyzer::m_NLcalibModSumBkgdFrac
std::array< float, 2 > m_NLcalibModSumBkgdFrac
Definition: ZDCDataAnalyzer.h:83
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:157
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:361
ZDCDataAnalyzer::enablePreExclusion
void enablePreExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray &HGADCThresh, const ZDCModuleIntArray &LGADCThresh)
Definition: ZDCDataAnalyzer.cxx:139
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:322
ZDCDataAnalyzer::m_moduleStatus
std::array< std::array< unsigned int, 4 >, 2 > m_moduleStatus
Definition: ZDCDataAnalyzer.h:65
ZDCDataAnalyzer::DoNLcalibModuleSum
void DoNLcalibModuleSum()
Definition: ZDCDataAnalyzer.cxx:641
ZDCPulseAnalyzer::GetBkgdMaxFraction
float GetBkgdMaxFraction() const
Definition: ZDCPulseAnalyzer.h:676
ZDCDataAnalyzer::~ZDCDataAnalyzer
~ZDCDataAnalyzer()
Definition: ZDCDataAnalyzer.cxx:92
ZDCDataAnalyzer::disableModule
bool disableModule(size_t side, size_t module)
Definition: ZDCDataAnalyzer.cxx:96
ZDCDataAnalyzer::FinishEvent
bool FinishEvent()
Definition: ZDCDataAnalyzer.cxx:536
ZDCDataAnalyzer::ZDCModuleBoolArray
std::array< std::array< bool, 4 >, 2 > ZDCModuleBoolArray
Definition: ZDCDataAnalyzer.h:23
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
ZDCDataAnalyzer::m_currentECalibCoeff
ZDCModuleFloatArray m_currentECalibCoeff
Definition: ZDCDataAnalyzer.h:56
ZDCDataAnalyzer::m_NLcalibModuleSumErrSq
std::array< float, 2 > m_NLcalibModuleSumErrSq
Definition: ZDCDataAnalyzer.h:82
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:222
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:176
ZDCDataAnalyzer::m_moduleDisabled
ZDCModuleBoolArray m_moduleDisabled
Definition: ZDCDataAnalyzer.h:38
ZDCDataAnalyzer::SetPeak2ndDerivMinTolerances
void SetPeak2ndDerivMinTolerances(size_t tolerance)
Definition: ZDCDataAnalyzer.cxx:213
xAOD::lumiBlock
setTeId lumiBlock
Definition: L2StandAloneMuon_v1.cxx:328
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
ZDCDataAnalyzer::SetSaveFitFunc
void SetSaveFitFunc(bool save)
Definition: ZDCDataAnalyzer.cxx:231
ZDCDataAnalyzer::SetGainFactorsHGLG
void SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG)
Definition: ZDCDataAnalyzer.cxx:195
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:309
ZDCDataAnalyzer::StartEvent
void StartEvent(int lumiBlock)
Definition: ZDCDataAnalyzer.cxx:381
ZDCDataAnalyzer::m_moduleAmpFractionLG
std::array< std::array< float, 4 >, 2 > m_moduleAmpFractionLG
Definition: ZDCDataAnalyzer.h:88
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:257