ATLAS Offline Software
Loading...
Searching...
No Matches
LArCalibTriggerAccumulator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include <cmath>
7
9
11 const std::vector<uint64_t>& sample2Sum,
12 uint32_t nTrigger) :
14
15
16
18 const size_t nS=digits.size();
19 if (nS==0) return WrongNSamples;
20
21 if (m_sampleSum.empty() && m_sample2Sum.empty()) {
22 m_sampleSum.resize(nS);
23 m_sample2Sum.resize(nS);
24 }
25 else if (m_sampleSum.size()!=nS || m_sample2Sum.size()!=nS)
26 return WrongNSamples; //Inconsistent number of samples
27
28 for (size_t i=0;i<nS;++i) {
29 const uint32_t& dg=digits[i];
30 if (m_sample2Sum[i]>=std::numeric_limits<uint64_t>::max()-dg) {
31 //ERROR: Numeric overflow
32 //Roll back changes:
33 for (size_t j=0;j<i;++j) {
34 m_sampleSum[j]-=digits[j];
35 m_sample2Sum[j]-=digits[j]*digits[j];
36 }
37 return NumericOverflow;
38 }
39
40 m_sampleSum[i]+=dg;
41 m_sample2Sum[i]+=dg*dg;
42 }
43 ++m_nTrigger;
44 return NoError;
45}
46
47
48
49double LArCalibTriggerAccumulator::mean(const size_t i) const {
50
51 if (i<m_sampleSum.size() && i<m_sample2Sum.size() && m_nTrigger>0)
52 return ((double)m_sampleSum[i])/((double)m_nTrigger);
53 else
54 return 0.0;
55}
56
57double LArCalibTriggerAccumulator::RMS(const size_t i) const {
58
59 if (i<m_sampleSum.size() && i<m_sample2Sum.size() && m_nTrigger>0) {
60 const double mean=((double)m_sampleSum[i])/((double)m_nTrigger);
61 return sqrt(((double)m_sample2Sum[i])/((double)m_nTrigger)-mean*mean);
62 }
63 else
64 return 0.0;
65}
66
67
68std::vector<float> LArCalibTriggerAccumulator::mean() const {
69
70 const size_t nS=m_sampleSum.size();
71 std::vector<float> mean;
72 if (m_nTrigger==0)
73 return mean;
74 else {
75 mean.resize(nS,0.0);
76 for (size_t i=0;i<nS;++i)
77 mean[i]=((double)m_sampleSum[i])/((double)m_nTrigger);
78 return mean;
79 }
80}
81
82std::vector<float> LArCalibTriggerAccumulator::RMS() const {
83 std::vector<float> rms;
84 const size_t nS=m_sampleSum.size();
85 if (m_sample2Sum.size()!=nS || m_nTrigger==0)
86 return rms;// ERROR, return emtpy vector
87
88 double mean;
89 rms.resize(nS,0.0);
90
91 for (size_t i=0;i<nS;++i) {
92 mean=((double)m_sampleSum[i])/((double)m_nTrigger);
93 rms[i]=sqrt(((double)m_sample2Sum[i])/((double)m_nTrigger)-mean*mean);
94 }
95 return rms;
96}
std::vector< float > mean() const
Calculates and returns the Mean value of each ADC sample.
const std::vector< uint64_t > & sample2Sum() const
return a reference to a stl vector containing the sum of the squares of the sample
std::vector< float > RMS() const
Calculates and returns the RMS value of each ADC sample.
std::vector< uint64_t > m_sample2Sum
sum of squares of samples
std::vector< uint64_t > m_sampleSum
sum of samples
uint32_t m_nTrigger
number of triggers
const std::vector< uint64_t > & sampleSum() const
return a reference to a stl vector containing the sample-sums
ERRTYPE add(const std::vector< short > &digits)
accumulated individual set of digits.