ATLAS Offline Software
RPDDataAnalyzer.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include "TLinearFitter.h"
8 #include "TMath.h"
9 #include <limits>
10 
11 namespace ZDC {
12 
13 float nullPileupFunc(unsigned int /* sample */) {
14  return 0;
15 }
16 
17 void helpResetFuncs(std::span<std::function<float(unsigned int)>> v) {
18  std::function<float(unsigned int)> f (nullPileupFunc);
19  std::fill(v.begin(), v.end(), f);
20 }
21 
23  ZDCMsg::MessageFunctionPtr messageFunc_p,
24  std::string tag,
25  RPDConfig const& config,
26  std::vector<float> const& calibFactors
27 ) : m_msgFunc_p(std::move(messageFunc_p)),
28  m_tag(std::move(tag)),
29  m_nSamples(config.nSamples),
30  m_nBaselineSamples(config.nBaselineSamples),
31  m_endSignalSample(config.endSignalSample),
32  m_pulse2ndDerivThresh(config.pulse2ndDerivThresh),
33  m_postPulseFracThresh(config.postPulseFracThresh),
34  m_goodPulseSampleStart(config.goodPulseSampleStart),
35  m_goodPulseSampleStop(config.goodPulseSampleStop),
36  m_nominalBaseline(config.nominalBaseline),
37  m_pileupBaselineSumThresh(config.pileupBaselineSumThresh),
38  m_pileupBaselineStdDevThresh(config.pileupBaselineStdDevThresh),
39  m_nNegativesAllowed(config.nNegativesAllowed),
40  m_AdcOverflow(config.ADCOverflow)
41 {
42  if (m_endSignalSample == 0) m_endSignalSample = m_nSamples; // sentinel value 0 -> go to end of waveform
43  if (m_outputCalibFactors.size() != s_nChannels) {
44  (*m_msgFunc_p)(ZDCMsg::Fatal,
45  "RPDDataAnalyzer::RPDDataAnalyzer: received incorrect number of channels in calibration factors ("
47  );
48  }
49  std::copy(calibFactors.begin(), calibFactors.end(), m_outputCalibFactors.data());
50  m_chFADCData.fill(std::vector<uint16_t>(m_nSamples, 0));
51  m_chCorrectedFadcData.fill(std::vector<float>(m_nSamples, 0));
52  m_chPileupExpFitParams.fill(std::vector<float>(2, 0));
53  m_chPileupStretchedExpFitParams.fill(std::vector<float>(3, 0));
54  m_chPileupExpFitParamErrs.fill(std::vector<float>(2, 0));
55  m_chPileupStretchedExpFitParamErrs.fill(std::vector<float>(3, 0));
59 
60  m_sideStatus.reset();
61  m_sideStatus.set(ValidBit, true);
62  for (auto& status : m_chStatus) {
63  status.reset();
64  status.set(ValidBit, true);
65  }
66 }
67 
71 void RPDDataAnalyzer::loadChannelData(unsigned int channel, const std::vector<uint16_t>& FadcData)
72 {
73  if (FadcData.size() != m_nSamples) {
74  (*m_msgFunc_p)(ZDCMsg::Fatal,
75  "RPDDataAnalyzer::loadChannelData: received incorrect number of samples "
76  "in FADC data (" + std::to_string(FadcData.size()) + ", expected " + std::to_string(m_nSamples) + ")"
77  );
78  }
79  m_chFADCData.at(channel) = FadcData;
81 }
82 
87 {
88  // reset status bits; valid bit is true by default
89  m_sideStatus.reset();
90  m_sideStatus.set(ValidBit, true);
91  for (auto& status : m_chStatus) {
92  status.reset();
93  status.set(ValidBit, true);
94  }
95 
103 
106 
109 
110  m_nChannelsLoaded = 0;
118 }
119 
125 {
126  for (unsigned int sample = 0; sample < m_nSamples; sample++) {
127  if (m_chFADCData.at(channel).at(sample) >= m_AdcOverflow) {
128  m_chStatus.at(channel).set(OverflowBit, true);
129  return false; // overflow - not good
130  }
131  }
132  return true; // all good
133 }
134 
141  float prePulseSize = 0;
142  unsigned int prePulseSample = 0;
143  float goodPulseSize = 0;
144  unsigned int goodPulseSample = 0;
145  float postPulseSize = 0;
146  unsigned int postPulseSample = 0;
147  for (unsigned int sample = 1; sample < m_nSamples - 1; sample++) {
148  float const secondDiff = m_chFADCData.at(channel).at(sample + 1) - 2*m_chFADCData.at(channel).at(sample) + m_chFADCData.at(channel).at(sample - 1);
149  if (secondDiff > m_pulse2ndDerivThresh) continue; // no pulse here
150  if (sample < m_goodPulseSampleStart && secondDiff < prePulseSize) {
151  prePulseSize = secondDiff;
152  prePulseSample = sample;
153  } else if (sample >= m_goodPulseSampleStart && sample <= m_goodPulseSampleStop && secondDiff < goodPulseSize) {
154  goodPulseSize = secondDiff;
155  goodPulseSample = sample;
156  } else if (sample > m_goodPulseSampleStop && secondDiff < postPulseSize) {
157  postPulseSize = secondDiff;
158  postPulseSample = sample;
159  }
160  }
161 
162  bool hasPrePulse = prePulseSample;
163  bool hasGoodPulse = goodPulseSample;
164  bool hasPostPulse = postPulseSample;
165 
166  // we need to accomodate side A, which has dips in second derivative after good pulse range
167  // if post-pulses are sufficiently small, we ignore them
168  // we expect these anomolies at ~ sample 11 or 12
169  if (hasGoodPulse && hasPostPulse && postPulseSize/goodPulseSize <= m_postPulseFracThresh) hasPostPulse = false;
170 
171  bool hasNoPulse = !hasPrePulse && !hasGoodPulse && !hasPostPulse;
172 
173  if (hasPrePulse) m_chStatus.at(channel).set(PrePulseBit, true);
174  if (hasPostPulse) m_chStatus.at(channel).set(PostPulseBit, true);
175  if (hasNoPulse) m_chStatus.at(channel).set(NoPulseBit, true);
176 
177  return !hasPrePulse && !hasPostPulse; // true if there is a only good pulse or if there is no pulse
178 }
179 
183 float RPDDataAnalyzer::calculateBaselineSamplesMSE(unsigned int channel, std::function<float(unsigned int)> const& fit) const
184 {
185  float MSE = 0;
186  for (unsigned int sample = 0; sample < m_nBaselineSamples; sample++) {
187  MSE += std::pow(m_chFADCData.at(channel).at(sample) - m_chBaseline.at(channel) - fit(sample), 2);
188  }
189  MSE /= m_nBaselineSamples;
190  return MSE;
191 }
192 
197 bool RPDDataAnalyzer::doPileupExpFit(unsigned int channel, std::vector<std::pair<unsigned int, float>> const& pileupFitPoints)
198 {
199  auto pFitter = std::make_unique<TLinearFitter>(1, "1 ++ x");
200  double x {};
201  for (auto const& [sample, y] : pileupFitPoints) {
202  x = sample;
203  pFitter->AddPoint(&x, std::log(y));
204  }
205  if (pFitter->Eval()) {
206  (*m_msgFunc_p)(ZDCMsg::Warn, "RPDDataAnalyzer::doPileupExpFit: there was an error while evaluating TLinearFitter!");
207  m_chStatus.at(channel).set(PileupExpFitFailBit, true);
208  return false;
209  }
210  m_chPileupExpFitParams.at(channel) = {static_cast<float>(pFitter->GetParameter(0)), static_cast<float>(pFitter->GetParameter(1))};
211  m_chPileupExpFitParamErrs.at(channel) = {static_cast<float>(pFitter->GetParError(0)), static_cast<float>(pFitter->GetParError(1))};
212  m_chExpPileupFuncs.at(channel) = [intercept = pFitter->GetParameter(0), slope = pFitter->GetParameter(1)](unsigned int sample) { return std::exp(intercept + slope*sample); };
214 
215  // check for exponential growth in parameters - we definitely don't want that for a function that describes pileup
216  if (pFitter->GetParameter(1) >= 0) {
217  (*m_msgFunc_p)(ZDCMsg::Debug, "RPDDataAnalyzer::doPileupExpFit: p1 is " + std::to_string(pFitter->GetParameter(1)) + " > 0 -> there is exponential growth in fit function!");
218  m_chStatus.at(channel).set(PileupExpGrowthBit, true);
219  return false;
220  }
221  return true; // all good
222 }
223 
228 bool RPDDataAnalyzer::doPileupStretchedExpFit(unsigned int channel, std::vector<std::pair<unsigned int, float>> const& pileupFitPoints)
229 {
230  auto pFitter = std::make_unique<TLinearFitter>(1, "1 ++ (x + 4)**(0.5) ++ (x + 4)**(-0.5)");
231  double x {};
232  for (auto const& [sample, y] : pileupFitPoints) {
233  x = sample;
234  pFitter->AddPoint(&x, std::log(y));
235  }
236  if (pFitter->Eval()) {
237  (*m_msgFunc_p)(ZDCMsg::Warn, "RPDDataAnalyzer::doPileupStretchedExpFit: there was an error while evaluating TLinearFitter!");
239  return false;
240  }
241  auto getFitParam = [&pFitter](int i){return pFitter->GetParameter(i);};
242  auto fGetFitErr = [&pFitter](int i){return static_cast<float>(pFitter->GetParError(i));};
243  auto fGetFitParam = [&pFitter](int i){return static_cast<float>(pFitter->GetParameter(i));};
244  //
245  m_chPileupStretchedExpFitParams.at(channel) = {fGetFitParam(0), fGetFitParam(1), fGetFitParam(2)};
246  m_chPileupStretchedExpFitParamErrs.at(channel) = {fGetFitErr(0), fGetFitErr(1), fGetFitErr(2)};
247  m_ch2ndOrderStretchedExpPileupFuncs.at(channel) = [p0 = getFitParam(0), p1 = getFitParam(1), p2 = getFitParam(2)](unsigned int sample) {
248  return std::exp(p0 + p1*std::pow(sample + 4, 0.5) + p2*std::pow(sample + 4, -0.5));
249  };
251 
252  // check for exponential growth in parameters - we definitely don't want that for a function that describes pileup
253  if (getFitParam(1) >= 0) {
254  (*m_msgFunc_p)(ZDCMsg::Debug, "RPDDataAnalyzer::doPileupStretchedExpFit: p1 is " + std::to_string(getFitParam(1)) + " > 0 -> there is exponential growth in fit function!");
256  return false;
257  }
258  if (getFitParam(2)/getFitParam(1) - 4 > 0) {
259  (*m_msgFunc_p)(ZDCMsg::Debug, "RPDDataAnalyzer::doPileupStretchedExpFit: 1st deriv max occurs at sample " + std::to_string(getFitParam(1)) + " > 0 -> fit probably looks like a pulse (and not like pileup)");
261  // analysis remains valid (for now)
262  }
263  return true; // all good
264 }
265 
269 unsigned int RPDDataAnalyzer::countSignalRangeNegatives(std::vector<float> const& values) const
270 {
271  unsigned int nNegatives = 0;
272  for (unsigned int sample = m_nBaselineSamples; sample < m_endSignalSample; sample++) {
273  if (values.at(sample) < 0) nNegatives++;
274  }
275  return nNegatives;
276 }
277 
283  float nominalBaselineSubtrSum = 0;
285  std::vector<std::pair<unsigned int, float>> pileupFitPoints;
286  for (unsigned int sample = 0; sample < m_nBaselineSamples; sample++) {
287  float const& adc = m_chFADCData.at(channel).at(sample);
288  float const adcBaselineSubtr = adc - m_nominalBaseline;
289  nominalBaselineSubtrSum += adcBaselineSubtr;
290  if (adcBaselineSubtr > 0) {
291  // this sample is a candidate for pileup fit
292  pileupFitPoints.emplace_back(sample, adcBaselineSubtr);
293  }
294  }
295  float baselineStdDev = TMath::StdDev(m_chFADCData.at(channel).begin(), std::next(m_chFADCData.at(channel).begin(), m_nBaselineSamples));
296 
297  if (nominalBaselineSubtrSum < m_pileupBaselineSumThresh || baselineStdDev < m_pileupBaselineStdDevThresh) {
298  // there is NO pileup, we will trust the average of baseline samples as a good baseline estimate
300  // calculate fadc data with baseline subtracted
301  for (unsigned int sample = 0; sample < m_nSamples; sample++) {
303  }
306  return false;
307  }
308  return true; // all good
309  }
310 
311  // we suspect that there is pileup - use nominal baseline
313 
314  if (pileupFitPoints.size() < s_minPileupFitPoints) {
316  // there are not enough points to do fit, so just use nominal baseline and call it a day
317  for (unsigned int sample = 0; sample < m_nSamples; sample++) {
319  }
320  return true; // all good
321  }
322 
323  // there is OOT pileup in this channel => expect approx. negative exponential in baseline samples
324  m_chStatus.at(channel).set(OutOfTimePileupBit, true);
325  // fit (approximately) to exponential and stretched exponential in baseline samples
326  bool expFitSuccess = doPileupExpFit(channel, pileupFitPoints);
327  bool stretchedExpFitSuccess = doPileupStretchedExpFit(channel, pileupFitPoints);
328 
329  if (stretchedExpFitSuccess) {
330  // calculate fadc data with baseline and pileup contribution subtracted
331  for (unsigned int sample = 0; sample < m_nSamples; sample++) {
333  }
336  // fallback to exponential fit
337  } else {
339  return true; // all good
340  }
341  }
342 
343  if (expFitSuccess) {
344  // calculate fadc data with baseline and pileup contribution subtracted
345  for (unsigned int sample = 0; sample < m_nSamples; sample++) {
347  }
349  m_chStatus.at(channel).set(PileupBadExpSubtrBit, true);
350  return false;
351  }
353  return true; // all good
354  }
355 
356  return false; // both fits are bad...we have no measure of pileup!
357 }
358 
363 {
364  if (m_chStatus.at(channel)[NoPulseBit]) {
365  m_chMaxAdc.at(channel) = 0;
366  m_chMaxAdcCalib.at(channel) = 0;
367  m_chMaxSample.at(channel) = -1;
368  return;
369  }
370  float maxAdc = -std::numeric_limits<float>::infinity();
371  unsigned int maxSample = 0;
372  for (unsigned int sample = m_nBaselineSamples; sample < m_endSignalSample; sample++) {
373  float adc = m_chCorrectedFadcData.at(channel).at(sample);
374  if (adc > maxAdc) {
375  maxAdc = adc;
376  maxSample = sample;
377  }
378  }
379  m_chMaxAdc.at(channel) = maxAdc;
381  m_chMaxSample.at(channel) = maxSample;
382 }
383 
388  if (m_chStatus.at(channel)[NoPulseBit]) {
389  m_chSumAdc.at(channel) = 0;
390  m_chSumAdcCalib.at(channel) = 0;
391  return;
392  }
393  // sum range is after baseline until end of signal
394  float signalRangeAdcSum = 0;
395  for (unsigned int sample = m_nBaselineSamples; sample < m_endSignalSample; sample++) {
396  signalRangeAdcSum += m_chCorrectedFadcData.at(channel).at(sample);
397  }
398  m_chSumAdc.at(channel) = signalRangeAdcSum;
399  m_chSumAdcCalib.at(channel) = signalRangeAdcSum*m_outputCalibFactors.at(channel);
400 
402  // there is pileup in this channel, calculate fraction of baseline-subtracted raw signal
403  // that is pileup (beginning of window until end of signal)
404  std::function<float(unsigned int)> pileupFunc;
405  switch (m_chPileupFuncType.at(channel)) {
408  break;
410  pileupFunc = m_chExpPileupFuncs.at(channel);
411  break;
412  default:
413  break;
414  }
415 
416  float totalAdcSum = 0;
417  float pileupTotalAdcSum = 0;
418  for (unsigned int sample = 0; sample < m_endSignalSample; sample++) {
419  totalAdcSum += m_chFADCData.at(channel).at(sample) - m_nominalBaseline;
420  pileupTotalAdcSum += pileupFunc(sample);
421  }
422  if (totalAdcSum > 0) {
423  m_chPileupFrac.at(channel) = pileupTotalAdcSum/totalAdcSum;
424  } else {
425  // avoid dividing by zero or negative, return sentinel value of -1
426  m_chPileupFrac.at(channel) = -1;
427  }
428  } // else fractional pileup is zero initialized, and this is what we want for no pileup
429 }
430 
435 {
436  for (unsigned int channel = 0; channel < s_nChannels; channel++) {
437  if (!m_chStatus.at(channel)[ValidBit]) m_sideStatus.set(ValidBit, false);
438 
443  if (m_chStatus.at(channel)[NoPulseBit]) m_sideStatus.set(NoPulseBit, true);
453  }
454 }
455 
460 {
462  (*m_msgFunc_p)(ZDCMsg::Warn,
463  "RPDDataAnalyzer::analyzeData: analyzing data with " + std::to_string(m_nChannelsLoaded) + " of "
464  + std::to_string(s_nChannels) + " channels loaded"
465  );
466  }
467  for (unsigned int channel = 0; channel < s_nChannels; channel++) {
468  if (!checkOverflow(channel)) {
469  // there was overflow, stop analysis
470  m_chStatus.at(channel).set(ValidBit, false);
471  continue;
472  }
473  if (!checkPulses(channel)) {
474  // there was a pre-pulse or post-pulse, stop analysis
475  m_chStatus.at(channel).set(ValidBit, false);
476  continue;
477  }
478  // there is either only a good pulse or no pulse
479  // only do baseline and pileup subtraction if there is a pulse!
480  if (!m_chStatus.at(channel)[NoPulseBit] /* there is a pulse -> */ && !doBaselinePileupSubtraction(channel)) {
481  // there was a pulse and a problem with baseline/pileup subtraction, stop analysis
482  m_chStatus.at(channel).set(ValidBit, false);
483  continue;
484  }
487  }
489 }
490 
494 unsigned int RPDDataAnalyzer::getChMaxSample(unsigned int channel) const
495 {
496  return m_chMaxSample.at(channel);
497 }
498 
502 float RPDDataAnalyzer::getChSumAdc(unsigned int channel) const
503 {
504  return m_chSumAdc.at(channel);
505 }
506 
511 {
512  return m_chSumAdcCalib.at(channel);
513 }
514 
518 float RPDDataAnalyzer::getChMaxAdc(unsigned int channel) const
519 {
520  return m_chMaxAdc.at(channel);
521 }
522 
527 {
528  return m_chMaxAdcCalib.at(channel);
529 }
530 
534 float RPDDataAnalyzer::getChPileupFrac(unsigned int channel) const
535 {
536  return m_chPileupFrac.at(channel);
537 }
538 
542 float RPDDataAnalyzer::getChBaseline(unsigned int channel) const {
543  return m_chBaseline.at(channel);
544 }
545 
549 const std::vector<float>& RPDDataAnalyzer::getChPileupExpFitParams(unsigned int channel) const {
550  return m_chPileupExpFitParams.at(channel);
551 }
552 
556 const std::vector<float>& RPDDataAnalyzer::getChPileupStretchedExpFitParams(unsigned int channel) const {
558 }
559 
563 const std::vector<float>& RPDDataAnalyzer::getChPileupExpFitParamErrs(unsigned int channel) const {
565 }
566 
570 const std::vector<float>& RPDDataAnalyzer::getChPileupStretchedExpFitParamErrs(unsigned int channel) const {
572 }
573 
578  return m_chExpPileupMSE.at(channel);
579 }
580 
586 }
587 
591 unsigned int RPDDataAnalyzer::getChStatus(unsigned int channel) const
592 {
593  return static_cast<unsigned int>(m_chStatus.at(channel).to_ulong());
594 }
595 
599 unsigned int RPDDataAnalyzer::getSideStatus() const
600 {
601  return static_cast<unsigned int>(m_sideStatus.to_ulong());
602 }
603 
604 } // namespace ZDC
ZDC::RPDDataAnalyzer::m_nChannelsLoaded
unsigned int m_nChannelsLoaded
Definition: RPDDataAnalyzer.h:107
CxxUtils::span
span(T *ptr, std::size_t sz) -> span< T >
A couple needed deduction guides.
ZDC::RPDDataAnalyzer::m_nBaselineSamples
unsigned int m_nBaselineSamples
Definition: RPDDataAnalyzer.h:109
ZDC::RPDDataAnalyzer::m_chCorrectedFadcData
std::array< std::vector< float >, s_nChannels > m_chCorrectedFadcData
raw RPD data; index channel then sample
Definition: RPDDataAnalyzer.h:123
ZDC::RPDDataAnalyzer::PileupExpGrowthBit
@ PileupExpGrowthBit
Definition: RPDDataAnalyzer.h:49
ZDC::RPDDataAnalyzer::getChMaxSample
unsigned int getChMaxSample(unsigned int channel) const
Get sample of max of RPD data in signal range after pileup subtraction.
Definition: RPDDataAnalyzer.cxx:494
ZDC::RPDDataAnalyzer::m_ch2ndOrderStretchedExpPileupFuncs
std::array< std::function< float(unsigned int)>, s_nChannels > m_ch2ndOrderStretchedExpPileupFuncs
pileup exponential fit function (if pileup was detected and fit did not fail); per channel
Definition: RPDDataAnalyzer.h:137
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:24
ZDC::RPDDataAnalyzer::m_nominalBaseline
float m_nominalBaseline
Pulses after this sample are considered post-pulses.
Definition: RPDDataAnalyzer.h:115
python.xAODTrackSummaryFiller.StdDev
string StdDev
Definition: xAODTrackSummaryFiller.py:30
ZDC::nullPileupFunc
float nullPileupFunc(unsigned int)
Definition: RPDDataAnalyzer.cxx:13
ZDCMsg::Warn
@ Warn
Definition: ZDCMsg.h:21
ZDC::RPDDataAnalyzer::m_goodPulseSampleStop
unsigned int m_goodPulseSampleStop
Pulses before this sample are considered pre-pulses.
Definition: RPDDataAnalyzer.h:114
ZDC::RPDDataAnalyzer::m_goodPulseSampleStart
unsigned int m_goodPulseSampleStart
If there is a good pulse and post-pulse and size of post-pulse as a fraction of good pulse is less th...
Definition: RPDDataAnalyzer.h:113
ZDC::RPDDataAnalyzer::PileupBadStretchedExpSubtrBit
@ PileupBadStretchedExpSubtrBit
Definition: RPDDataAnalyzer.h:47
ZDC::RPDDataAnalyzer::doBaselinePileupSubtraction
bool doBaselinePileupSubtraction(unsigned int channel)
Determine if there is pileup, subtract baseline and pileup, and set relevant status bits.
Definition: RPDDataAnalyzer.cxx:282
TRTCalib_cfilter.p1
p1
Definition: TRTCalib_cfilter.py:130
ZDC::RPDDataAnalyzer::OverflowBit
@ OverflowBit
Definition: RPDDataAnalyzer.h:39
ZDC::RPDDataAnalyzer::analyzeData
void analyzeData()
Analyze RPD data.
Definition: RPDDataAnalyzer.cxx:459
ZDC::RPDDataAnalyzer::m_chPileupExpFitParamErrs
std::array< std::vector< float >, s_nChannels > m_chPileupExpFitParamErrs
parameters for pileup stretched exponential fit (if pileup was detected and fit did not fail): exp( [...
Definition: RPDDataAnalyzer.h:133
ZDC::RPDDataAnalyzer::getChPileupStretchedExpFitParams
const std::vector< float > & getChPileupStretchedExpFitParams(unsigned int channel) const
Get parameters for pileup stretched exponential fit (if pileup was detected and fit did not fail): ex...
Definition: RPDDataAnalyzer.cxx:556
ZDC::RPDDataAnalyzer::ValidBit
@ ValidBit
Definition: RPDDataAnalyzer.h:37
ZDC::RPDDataAnalyzer::getChBaseline
float getChBaseline(unsigned int channel) const
Get baseline used in baseline subtraction.
Definition: RPDDataAnalyzer.cxx:542
ZDC::RPDDataAnalyzer::m_chMaxAdcCalib
std::array< float, s_nChannels > m_chMaxAdcCalib
max of RPD data in signal range after baseline and pileup subtraction; per channel
Definition: RPDDataAnalyzer.h:128
ZDC::RPDDataAnalyzer::PrePulseBit
@ PrePulseBit
Definition: RPDDataAnalyzer.h:40
ZDC::RPDDataAnalyzer::getChPileupExpFitMSE
float getChPileupExpFitMSE(unsigned int channel) const
Get mean squared error of pileup exponential fit in baseline samples (if pileup was detected and fit ...
Definition: RPDDataAnalyzer.cxx:577
ZDC::RPDDataAnalyzer::calculateBaselineSamplesMSE
float calculateBaselineSamplesMSE(unsigned int channel, std::function< float(unsigned int)> const &fit) const
Calculate the mean squared error of the fit function in the baseline samples.
Definition: RPDDataAnalyzer.cxx:183
ZDC::RPDDataAnalyzer::checkPulses
bool checkPulses(unsigned int channel)
Calculate 2nd difference, identify pulses, and set relevant status bits.
Definition: RPDDataAnalyzer.cxx:140
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
ZDC::RPDDataAnalyzer::m_nNegativesAllowed
unsigned int m_nNegativesAllowed
Baseline standard deviations less than this number indicate there is not pileup.
Definition: RPDDataAnalyzer.h:118
ZDC::RPDDataAnalyzer::m_chFADCData
std::array< std::vector< uint16_t >, s_nChannels > m_chFADCData
multiplicative calibration factors to apply to output, e.g., max and sum ADC; per channel
Definition: RPDDataAnalyzer.h:122
x
#define x
ZDC::RPDDataAnalyzer::calculateMaxSampleMaxAdc
void calculateMaxSampleMaxAdc(unsigned int channel)
Calculate max ADC and max sample.
Definition: RPDDataAnalyzer.cxx:362
ZDC::RPDDataAnalyzer::m_chPileupStretchedExpFitParams
std::array< std::vector< float >, s_nChannels > m_chPileupStretchedExpFitParams
parameters for pileup exponential fit (if pileup was detected and fit did not fail): exp( [0] + [1]*s...
Definition: RPDDataAnalyzer.h:132
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
ZDC::RPDDataAnalyzer::getChPileupStretchedExpFitMSE
float getChPileupStretchedExpFitMSE(unsigned int channel) const
Get mean squared error of pileup stretched exponential fit in baseline samples (if pileup was detecte...
Definition: RPDDataAnalyzer.cxx:584
python.Bindings.values
values
Definition: Control/AthenaPython/python/Bindings.py:808
ZDC::RPDDataAnalyzer::getChSumAdc
float getChSumAdc(unsigned int channel) const
Get sum of RPD data in signal range after baseline and pileup subtraction.
Definition: RPDDataAnalyzer.cxx:502
ZDC::RPDDataAnalyzer::m_AdcOverflow
unsigned int m_AdcOverflow
Maximum number of negative ADC values after baseline and pileup subtraction allowed in signal range.
Definition: RPDDataAnalyzer.h:119
ZDC::RPDDataAnalyzer::getChPileupStretchedExpFitParamErrs
const std::vector< float > & getChPileupStretchedExpFitParamErrs(unsigned int channel) const
Get parameter errors for pileup stretched exponential fit (if pileup was detected and fit did not fai...
Definition: RPDDataAnalyzer.cxx:570
ZDC::RPDDataAnalyzer::RPDDataAnalyzer
RPDDataAnalyzer(ZDCMsg::MessageFunctionPtr messageFunc_p, std::string tag, RPDConfig const &config, std::vector< float > const &calibFactors)
Definition: RPDDataAnalyzer.cxx:22
TRTCalib_cfilter.p2
p2
Definition: TRTCalib_cfilter.py:131
ZDC::RPDDataAnalyzer::m_chPileupExpFitParams
std::array< std::vector< float >, s_nChannels > m_chPileupExpFitParams
baseline used in baseline subtraction; per channel
Definition: RPDDataAnalyzer.h:131
ZDC::RPDDataAnalyzer::getChMaxAdcCalib
float getChMaxAdcCalib(unsigned int channel) const
Get max of RPD data in signal range after baseline and pileup subtraction, with output calibration fa...
Definition: RPDDataAnalyzer.cxx:526
ZDC::RPDDataAnalyzer::NoPulseBit
@ NoPulseBit
Definition: RPDDataAnalyzer.h:42
ZDC::RPDDataAnalyzer::reset
void reset()
Reset all member variables to default values.
Definition: RPDDataAnalyzer.cxx:86
ZDC::RPDDataAnalyzer::m_sideStatus
std::bitset< N_STATUS_BITS > m_sideStatus
status bits per channel
Definition: RPDDataAnalyzer.h:141
FullCPAlgorithmsTest_eljob.sample
sample
Definition: FullCPAlgorithmsTest_eljob.py:116
fillPileUpNoiseLumi.next
next
Definition: fillPileUpNoiseLumi.py:52
ZDC::RPDDataAnalyzer::s_minPileupFitPoints
static unsigned constexpr int s_minPileupFitPoints
status bits for side
Definition: RPDDataAnalyzer.h:149
ZDC::RPDDataAnalyzer::m_pileupBaselineSumThresh
float m_pileupBaselineSumThresh
The global nominal baseline; used when pileup is detected.
Definition: RPDDataAnalyzer.h:116
lumiFormat.i
int i
Definition: lumiFormat.py:85
ZDC::RPDDataAnalyzer::PileupFitFuncType::Exp
@ Exp
ZDC::RPDDataAnalyzer::m_chExpPileupFuncs
std::array< std::function< float(unsigned int)>, s_nChannels > m_chExpPileupFuncs
enum indicating type of pileup fit function; per channel
Definition: RPDDataAnalyzer.h:136
ZDC::RPDDataAnalyzer::PostPulseBit
@ PostPulseBit
Definition: RPDDataAnalyzer.h:41
ZDC::RPDDataAnalyzer::m_postPulseFracThresh
float m_postPulseFracThresh
Second differences less than or equal to this number indicate a pulse.
Definition: RPDDataAnalyzer.h:112
ZDC::RPDDataAnalyzer::doPileupExpFit
bool doPileupExpFit(unsigned int channel, std::vector< std::pair< unsigned int, float >> const &pileupFitPoints)
Perform an exponential fit in baseline-subtracted baseline samples and set relevant status bits.
Definition: RPDDataAnalyzer.cxx:197
hist_file_dump.f
f
Definition: hist_file_dump.py:140
ZDC::RPDDataAnalyzer::m_ch2ndOrderStretchedExpPileupMSE
std::array< float, s_nChannels > m_ch2ndOrderStretchedExpPileupMSE
mean squared error of pileup exponential fit in baseline samples (if pileup was detected and fit did ...
Definition: RPDDataAnalyzer.h:139
ZDC::RPDDataAnalyzer::m_outputCalibFactors
std::array< float, s_nChannels > m_outputCalibFactors
ADC values greater than or equal to this number are considered overflow.
Definition: RPDDataAnalyzer.h:120
ZDC::RPDDataAnalyzer::getChPileupFrac
float getChPileupFrac(unsigned int channel) const
Get OOT pileup sum as a fraction of non-pileup sum in entire window (0 if no OOT pileup,...
Definition: RPDDataAnalyzer.cxx:534
ZDC::RPDDataAnalyzer::getSideStatus
unsigned int getSideStatus() const
Get status word for side.
Definition: RPDDataAnalyzer.cxx:599
ZDC::RPDDataAnalyzer::m_chPileupFrac
std::array< float, s_nChannels > m_chPileupFrac
max of RPD data in signal range after baseline and pileup subtraction, with output calibration factor...
Definition: RPDDataAnalyzer.h:129
MuonValidation_CreateResolutionProfiles.fit
def fit(h, emin, emax)
Definition: MuonValidation_CreateResolutionProfiles.py:69
ZDC::RPDDataAnalyzer::countSignalRangeNegatives
unsigned int countSignalRangeNegatives(std::vector< float > const &values) const
Calculate the number of negative values in signal range.
Definition: RPDDataAnalyzer.cxx:269
ZDC::RPDDataAnalyzer::getChStatus
unsigned int getChStatus(unsigned int channel) const
Get status word for channel.
Definition: RPDDataAnalyzer.cxx:591
ZDC::RPDDataAnalyzer::setSideStatusBits
void setSideStatusBits()
Set side status bits according to channel status bits.
Definition: RPDDataAnalyzer.cxx:434
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
ZDC::RPDDataAnalyzer::m_chSumAdcCalib
std::array< float, s_nChannels > m_chSumAdcCalib
sum of RPD data in signal range after baseline and pileup subtraction; per channel
Definition: RPDDataAnalyzer.h:126
ZDCMsg::MessageFunctionPtr
std::shared_ptr< MessageFunction > MessageFunctionPtr
Definition: ZDCMsg.h:14
RPDDataAnalyzer.h
ZDC::RPDDataAnalyzer::PileupExpFitFailBit
@ PileupExpFitFailBit
Definition: RPDDataAnalyzer.h:48
ZDC::RPDDataAnalyzer::getChPileupExpFitParams
const std::vector< float > & getChPileupExpFitParams(unsigned int channel) const
Get parameters for pileup exponential fit (if pileup was detected and fit did not fail): exp( [0] + [...
Definition: RPDDataAnalyzer.cxx:549
ZDC::RPDDataAnalyzer::loadChannelData
void loadChannelData(unsigned int channel, const std::vector< uint16_t > &FadcData)
Load a single channel's FADC data into member variable.
Definition: RPDDataAnalyzer.cxx:71
ZDC::RPDDataAnalyzer::checkOverflow
bool checkOverflow(unsigned int channel)
Check for overflow and set relevant status bit.
Definition: RPDDataAnalyzer.cxx:124
ZDC::RPDDataAnalyzer::BadAvgBaselineSubtrBit
@ BadAvgBaselineSubtrBit
Definition: RPDDataAnalyzer.h:43
python.PyAthena.v
v
Definition: PyAthena.py:154
ZDC::RPDDataAnalyzer::s_nChannels
static unsigned constexpr int s_nChannels
Definition: RPDDataAnalyzer.h:105
ZDC::RPDDataAnalyzer::m_endSignalSample
unsigned int m_endSignalSample
Number of baseline samples; the sample equal to this number is the start of signal region.
Definition: RPDDataAnalyzer.h:110
ZDC::RPDDataAnalyzer::m_chExpPileupMSE
std::array< float, s_nChannels > m_chExpPileupMSE
pileup stretched exponential fit function (if pileup was detected and fit did not fail); per channel
Definition: RPDDataAnalyzer.h:138
ZDC::RPDDataAnalyzer::InsufficientPileupFitPointsBit
@ InsufficientPileupFitPointsBit
Definition: RPDDataAnalyzer.h:44
ZDC::RPDDataAnalyzer::doPileupStretchedExpFit
bool doPileupStretchedExpFit(unsigned int channel, std::vector< std::pair< unsigned int, float >> const &pileupFitPoints)
Perform a stretched exponential fit in baseline-subtracted baseline samples and set relevant status b...
Definition: RPDDataAnalyzer.cxx:228
y
#define y
ZDC::RPDDataAnalyzer::calculateSumAdc
void calculateSumAdc(unsigned int channel)
Calculate sum ADC and if there is pileup, calculate fractional pileup.
Definition: RPDDataAnalyzer.cxx:387
ZDC::RPDDataAnalyzer::m_chPileupFuncType
std::array< PileupFitFuncType, s_nChannels > m_chPileupFuncType
parameter errors for pileup stretched exponential fit (if pileup was detected and fit did not fail); ...
Definition: RPDDataAnalyzer.h:135
ZDC::RPDDataAnalyzer::getChSumAdcCalib
float getChSumAdcCalib(unsigned int channel) const
Get sum of RPD data in signal range after baseline and pileup subtraction, with output calibration fa...
Definition: RPDDataAnalyzer.cxx:510
ReadFloatFromCool.adc
adc
Definition: ReadFloatFromCool.py:48
lumiFormat.fill
fill
Definition: lumiFormat.py:104
ZDC::RPDDataAnalyzer::PileupBadExpSubtrBit
@ PileupBadExpSubtrBit
Definition: RPDDataAnalyzer.h:50
ZDC::RPDDataAnalyzer::PileupStretchedExpFitFailBit
@ PileupStretchedExpFitFailBit
Definition: RPDDataAnalyzer.h:45
ZDC::RPDDataAnalyzer::getChPileupExpFitParamErrs
const std::vector< float > & getChPileupExpFitParamErrs(unsigned int channel) const
Get parameter errors for pileup exponential fit (if pileup was detected and fit did not fail).
Definition: RPDDataAnalyzer.cxx:563
ZDC::RPDDataAnalyzer::m_chSumAdc
std::array< float, s_nChannels > m_chSumAdc
sample of max of RPD data in signal range after pileup subtraction; per channel
Definition: RPDDataAnalyzer.h:125
ZDC::helpResetFuncs
void helpResetFuncs(std::span< std::function< float(unsigned int)>> v)
Definition: RPDDataAnalyzer.cxx:17
ZDC
Definition: RPDAnalysisTool.cxx:12
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
ZDC::RPDConfig
Definition: RPDDataAnalyzer.h:19
ZDC::RPDDataAnalyzer::m_chStatus
std::array< std::bitset< N_STATUS_BITS >, s_nChannels > m_chStatus
mean squared error of pileup stretched exponential fit in baseline samples (if pileup was detected an...
Definition: RPDDataAnalyzer.h:140
ZDC::RPDDataAnalyzer::PileupStretchedExpPulseLikeBit
@ PileupStretchedExpPulseLikeBit
Definition: RPDDataAnalyzer.h:51
ZDCMsg::Debug
@ Debug
Definition: ZDCMsg.h:19
ZDCMsg::Fatal
@ Fatal
Definition: ZDCMsg.h:23
ZDC::RPDDataAnalyzer::m_pileupBaselineStdDevThresh
float m_pileupBaselineStdDevThresh
Baseline sums less than this number indicate there is not pileup.
Definition: RPDDataAnalyzer.h:117
LArDigits2NtupleDumper.nSamples
nSamples
Definition: LArDigits2NtupleDumper.py:85
merge.status
status
Definition: merge.py:16
ZDC::RPDDataAnalyzer::PileupStretchedExpGrowthBit
@ PileupStretchedExpGrowthBit
Definition: RPDDataAnalyzer.h:46
calibdata.copy
bool copy
Definition: calibdata.py:26
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:23
ZDC::RPDDataAnalyzer::m_nSamples
unsigned int m_nSamples
Definition: RPDDataAnalyzer.h:108
ZDC::RPDDataAnalyzer::m_chMaxSample
std::array< unsigned int, s_nChannels > m_chMaxSample
RPD data with baseline and pileup subtracted; index channel then sample.
Definition: RPDDataAnalyzer.h:124
ZDC::RPDDataAnalyzer::m_chPileupStretchedExpFitParamErrs
std::array< std::vector< float >, s_nChannels > m_chPileupStretchedExpFitParamErrs
parameter errors for pileup exponential fit (if pileup was detected and fit did not fail); per channe...
Definition: RPDDataAnalyzer.h:134
ZDC::RPDDataAnalyzer::PileupFitFuncType::None
@ None
ZDC::RPDDataAnalyzer::m_chBaseline
std::array< float, s_nChannels > m_chBaseline
OOT pileup sum as a fraction of non-pileup sum in entire window (0 if no OOT pileup,...
Definition: RPDDataAnalyzer.h:130
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
ZDC::RPDDataAnalyzer::OutOfTimePileupBit
@ OutOfTimePileupBit
Definition: RPDDataAnalyzer.h:38
ZDC::RPDDataAnalyzer::m_pulse2ndDerivThresh
float m_pulse2ndDerivThresh
Samples before (not including) this sample are the signal region; nSamples goes to end of window.
Definition: RPDDataAnalyzer.h:111
ZDC::RPDDataAnalyzer::m_chMaxAdc
std::array< float, s_nChannels > m_chMaxAdc
sum of RPD data in signal range after baseline and pileup subtraction, with output calibration factor...
Definition: RPDDataAnalyzer.h:127
LArMonTransforms.Mean
def Mean(inputs)
Definition: LArMonTransforms.py:438
RPDUtils::helpZero
void helpZero(Range &v) requires(std
Definition: RPDUtils.h:27
TRTCalib_cfilter.p0
p0
Definition: TRTCalib_cfilter.py:129
ZDC::RPDDataAnalyzer::getChMaxAdc
float getChMaxAdc(unsigned int channel) const
Get max of RPD data in signal range after baseline and pileup subtraction.
Definition: RPDDataAnalyzer.cxx:518
ZDC::RPDDataAnalyzer::PileupFitFuncType::SecondOrderStretchedExp
@ SecondOrderStretchedExp
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65