ATLAS Offline Software
Loading...
Searching...
No Matches
LArAccumulatedCalibDigit.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#include <iostream>
8#include <limits>
9
12= default;
13
14
15float LArAccumulatedCalibDigit::mean(const size_t i) const {
16
17 if (i<m_sampleSum.size() && i<m_sample2Sum.size() && m_nTriggers>0)
18 return ((double)m_sampleSum[i])/((double)m_nTriggers);
19 else
20 return 0.0;
21}
22
23float LArAccumulatedCalibDigit::RMS(const size_t i) const {
24
25 if (i<m_sampleSum.size() && i<m_sample2Sum.size() && m_nTriggers>0) {
26 const double mean=((double)m_sampleSum[i])/((double)m_nTriggers);
27 const double rms2=((double)m_sample2Sum[i])/((double)m_nTriggers)-mean*mean;
28 if (rms2<=0.0) return 0.0; //W.L 2010-12-07 protect against FPE due to rounding error
29 return sqrt(rms2);
30 }
31 else
32 return 0.0;
33}
34
35
36std::vector<float> LArAccumulatedCalibDigit::mean() const {
37
38 const size_t nS=m_sampleSum.size();
39 std::vector<float> mean;
40 if (m_nTriggers==0)
41 return mean;
42 else {
43 mean.resize(nS,0.0);
44 for (size_t i=0;i<nS;++i)
45 mean[i]=((double)m_sampleSum[i])/((double)m_nTriggers);
46 return mean;
47 }
48}
49
50std::vector<float> LArAccumulatedCalibDigit::RMS() const {
51 std::vector<float> rms;
52 const size_t nS=m_sampleSum.size();
53 if (m_sample2Sum.size()!=nS || m_nTriggers==0)
54 return rms;// ERROR, return emtpy vector
55
56 double mean=0;
57 double rms2=0;
58 rms.resize(nS,0.0);
59
60 for (size_t i=0;i<nS;++i) {
61 mean=((double)m_sampleSum[i])/((double)m_nTriggers);
62 rms2=((double)m_sample2Sum[i])/((double)m_nTriggers)-mean*mean;
63 if (rms2<=0.0) //W.L 2010-12-07 protect against FPE due to rounding error
64 rms[i]=0.0;
65 else
66 rms[i]=sqrt(rms2);
67 }
68 return rms;
69}
70
71
72
73void LArAccumulatedCalibDigit::setSampleSum(const std::vector < uint64_t >& sampleSum) {
75}
76
77void LArAccumulatedCalibDigit::setSample2Sum(const std::vector < uint64_t >& sample2Sum) {
79}
80
81
82bool LArAccumulatedCalibDigit::setAddDigit(const std::vector<short>& samples) {
83 const size_t nS=samples.size();
84 if (m_sampleSum.empty() && m_sample2Sum.empty()) {
85 m_sampleSum.resize(nS,0);
86 m_sample2Sum.resize(nS,0);
87 }
88 else
89 if (m_sampleSum.size() != nS || m_sample2Sum.size() != nS) {
90 return false; //ERROR, number of samples doesn't match!
91 }
92
93 for(size_t i=0;i<nS;++i) {
94 const uint64_t s2=samples[i]*samples[i];
95 if (m_sampleSum[i]>=std::numeric_limits<uint64_t>::max()-samples[i]) {
96 return false; //ERROR, overflow!
97 }
98 if (m_sample2Sum[i]>=std::numeric_limits<uint64_t>::max()-s2) {
99 return false; //ERROR, overflow!
100 }
101
102 m_sampleSum[i]+=samples[i];
103 m_sample2Sum[i]+=s2;
104 ++m_nTriggers;
105 }
106 return true;
107}
108
109
110
111
112bool LArAccumulatedCalibDigit::setAddSubStep(const std::vector < uint64_t >& sampleSum,
113 const std::vector < uint64_t >& sample2Sum, const uint32_t nTriggerPerStep) {
114
115
116 const size_t nS=sampleSum.size();
117
118 if (m_sampleSum.empty() && m_sample2Sum.empty()) {
119 m_sampleSum.resize(nS,0);
120 m_sample2Sum.resize(nS,0);
121 }
122 else
123 if (m_sampleSum.size() != nS || m_sample2Sum.size() != nS || sample2Sum.size() != nS) {
124 return false; //ERROR, number of samples doesn't match!
125 }
126
127 for(size_t is=0; is<nS; is++) {
128 if (m_sampleSum[is]>=std::numeric_limits<uint64_t>::max()-sampleSum[is]) {
129 return false; //ERROR, overflow!
130 }
131 if (m_sample2Sum[is]>=std::numeric_limits<uint64_t>::max()-sample2Sum[is]) {
132 return false; //ERROR, overflow!
133 }
134
135 m_sampleSum[is] += sampleSum[is];
136 m_sample2Sum[is] += sample2Sum[is];
137 }
138
139 m_nTriggers += nTriggerPerStep;
140 return true;
141}
142
std::vector< uint64_t > m_sampleSum
vector of sample sums
void setSample2Sum(const std::vector< uint64_t > &sample2Sum)
Set the sample2Sum.
bool setAddSubStep(const std::vector< uint64_t > &sampleSum, const std::vector< uint64_t > &sample2Sum, const uint32_t nTriggerPerStep)
Sum up with another substep.
virtual ~LArAccumulatedCalibDigit()
Destructor.
std::vector< uint64_t > m_sample2Sum
vector of sample square sums
const std::vector< uint64_t > & sampleSum() const
return a reference to a stl vector containing the sample-sums
std::vector< float > RMS() const
Calculates and returns the RMS value of each ADC sample.
std::vector< float > mean() const
Calculates and returns the Mean value of each ADC sample.
void setSampleSum(const std::vector< uint64_t > &sampleSum)
Set the sampleSum.
uint32_t m_nTriggers
number of samples
const std::vector< uint64_t > & sample2Sum() const
return a reference to a stl vector containing the sum of the squares of the sample
bool setAddDigit(const std::vector< short > &samples)
Sum up with another (individual) LArCalibDigit.