ATLAS Offline Software
Loading...
Searching...
No Matches
TileDigitsFlxMonitorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Tile includes
9
10// Athena includes
12
13#include <cmath>
14#include <algorithm>
15
16
18
20
21 ATH_MSG_INFO("in initialize()");
22
23 ATH_CHECK( detStore()->retrieve(m_tileHWID) );
25 ATH_CHECK( m_digitsContainerKeyFlx.initialize() );
26
27 std::ostringstream os;
28
29 if ( m_fragIDsToCompare.size() != 0) {
31 for (int fragID : m_fragIDsToCompare) {
32 unsigned int ros = fragID >> 8;
33 unsigned int drawer = fragID & 0xFF;
34 std::string module = TileCalibUtils::getDrawerString(ros, drawer);
35 os << " " << module << "/0x" << std::hex << fragID << std::dec;
36 }
37 } else {
38 os << "NONE";
39 }
40 m_firstFelix = static_cast<unsigned int>(m_firstSample) + m_felixOffset;
42
43 ATH_MSG_INFO("Monitored modules/frag ID:" << os.str());
44
45 return StatusCode::SUCCESS;
46}
47
48
49StatusCode TileDigitsFlxMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
50
51 // In case you want to measure the execution time
52 auto timer = Monitored::Timer("TIME_execute");
53
55 ATH_CHECK( digitsContainerLegacy.isValid() );
56
58 ATH_CHECK( digitsContainerFlx.isValid() );
59
60 std::array<std::string, 2> gainName{"_LG", "_HG"};
61
62 std::vector<float>digitsLegacy[TileCalibUtils::MAX_CHAN][TileCalibUtils::MAX_GAIN];
63 std::vector<float>digitsFlx[TileCalibUtils::MAX_CHAN][TileCalibUtils::MAX_GAIN];
65
66 const TileFragHash& hashFunc = digitsContainerFlx->hashFunc();
67
68 for (int fragID : m_fragIDsToCompare) {
69
70 memset(found,0,sizeof(found));
71
72 IdentifierHash hash = static_cast<IdentifierHash>(hashFunc(fragID));
73 unsigned int drawer = (fragID & 0x3F);
74 unsigned int ros = fragID >> 8;
75 std::string module = TileCalibUtils::getDrawerString(ros, drawer);
76 std::array<std::string, 2> moduleName{module+gainName[0], module+gainName[1]};
77
78 // Legacy digits
79 const TileDigitsCollection* digitsCollectionLegacy = digitsContainerLegacy->indexFindPtr(hash);
80 for (const TileDigits* tile_digits : *digitsCollectionLegacy) {
81
82 ATH_MSG_VERBOSE((std::string) *tile_digits);
83
84 unsigned int nSamples = tile_digits->nsamples();
85 if (m_firstSample < nSamples) {
86
87 HWIdentifier adcId = tile_digits->adc_HWID();
88 int channel = m_tileHWID->channel(adcId);
89 int gain = m_tileHWID->adc(adcId);
90
91 std::string sampleName = module + "_ch_" + std::to_string(channel) + gainName[gain] + "_samples";
92 auto channelSample = Monitored::Scalar<float>(std::move(sampleName), 0.0F);
93
94 std::vector<float> digits_monitored;
95 auto it = tile_digits->samples().begin() + m_firstSample;
96 auto end = tile_digits->samples().end();
97 for(auto i = m_nSamples; it != end && i-->0; ++it) {
98 float sample = (*it);
99 channelSample = sample;
100 fill("TileLegacyMonSamples", channelSample);
101 digits_monitored.push_back(sample);
102 }
103
104 nSamples = digits_monitored.size();
105 if (nSamples>0) {
106
107 auto monitoredChannel = Monitored::Scalar<float>(moduleName[gain] + "_channel", channel);
108 auto pedestal = Monitored::Scalar<float>(moduleName[gain] + "_Pedestal", digits_monitored[0]);
109 fill("TileLegacyMonPed", monitoredChannel, pedestal);
110
111 if (nSamples>1) {
112
113 double sampleSum = std::accumulate( digits_monitored.begin(), digits_monitored.end(), 0.0);
114
115 double sampleRMS = std::accumulate( digits_monitored.begin(), digits_monitored.end(), 0.0, [] (double acc, float sample) {
116 return acc + sample * sample;
117 });
118 sampleRMS -= sampleSum * sampleSum / nSamples;
119 sampleRMS = (sampleRMS > 0.0) ? std::sqrt(sampleRMS / (nSamples - 1)) : 0.0;
120
121 auto hfn = Monitored::Scalar<float>(moduleName[gain] + "_HFN", sampleRMS);
122 fill("TileLegacyMonHFN", monitoredChannel, hfn);
123 }
124
125 found[channel][gain] |= 1;
126 digitsLegacy[channel][gain].swap(digits_monitored);
127 }
128 }
129 }
130
131 // FELIX digits
132 const TileDigitsCollection* digitsCollectionFlx = digitsContainerFlx->indexFindPtr(hash);
133 for (const TileDigits* tile_digits : *digitsCollectionFlx) {
134
135 ATH_MSG_VERBOSE((std::string) *tile_digits);
136
137 unsigned int nSamples = tile_digits->nsamples();
138 if (m_firstFelix < nSamples) {
139
140 HWIdentifier adcId = tile_digits->adc_HWID();
141 int channel = m_tileHWID->channel(adcId);
142 int gain = m_tileHWID->adc(adcId);
143
144 std::string sampleName = module + "_ch_" + std::to_string(channel) + gainName[gain] + "_samples";
145 auto channelSample = Monitored::Scalar<float>(std::move(sampleName), 0.0F);
146
147 std::vector<float> digits_monitored;
148 auto it = tile_digits->samples().begin() + m_firstFelix;
149 auto end = tile_digits->samples().end();
150
151 for(auto i = m_nSamples; it != end && i-->0; ++it) {
152 float sample = (*it);
153 channelSample = sample;
154 fill("TileFlxMonSamples", channelSample);
155 digits_monitored.push_back(sample);
156 }
157
158 nSamples = digits_monitored.size();
159 if (nSamples>0) {
160
161 auto monitoredChannel = Monitored::Scalar<float>(moduleName[gain] + "_channel", channel);
162 auto pedestal = Monitored::Scalar<float>(moduleName[gain] + "_Pedestal", digits_monitored[0]);
163 fill("TileFlxMonPed", monitoredChannel, pedestal);
164
165 if (nSamples>1) {
166
167 double sampleSum = std::accumulate( digits_monitored.begin(), digits_monitored.end(), 0.0);
168
169 double sampleRMS = std::accumulate( digits_monitored.begin(), digits_monitored.end(), 0.0, [] (double acc, float sample) {
170 return acc + sample * sample;
171 });
172 sampleRMS -= sampleSum * sampleSum / nSamples;
173 sampleRMS = (sampleRMS > 0.0) ? std::sqrt(sampleRMS / (nSamples - 1)) : 0.0;
174
175 auto hfn = Monitored::Scalar<float>(moduleName[gain] + "_HFN", sampleRMS);
176 fill("TileFlxMonHFN", monitoredChannel, hfn);
177 }
178
179 found[channel][gain] |= 2;
180 digitsFlx[channel][gain].swap(digits_monitored);
181 }
182 }
183 }
184
185 // Compare digits from Legacy and FELIX
186 for(unsigned int gain = 0; gain<TileCalibUtils::MAX_GAIN; ++gain) {
187 auto monitoredChannel = Monitored::Scalar<float>(moduleName[gain] + "_channel", 0.0F);
188 auto moduleSampleDiff = Monitored::Scalar<float>(moduleName[gain] + "_samples_diff", 0.0F);
189
190 for(unsigned int channel = 0; channel<TileCalibUtils::MAX_CHAN; ++channel) {
191
192 if (found[channel][gain] == 3) {
193
194 monitoredChannel = channel;
195
196 std::string sampleName = module + "_ch_" + std::to_string(channel) + gainName[gain] + "_samples_diff";
197 auto channelSampleDiff = Monitored::Scalar<float>(std::move(sampleName), 0.0F);
198
199 for (auto it1=digitsLegacy[channel][gain].begin(), it2=digitsFlx[channel][gain].begin();
200 it1!=digitsLegacy[channel][gain].end() && it2!=digitsFlx[channel][gain].end(); ++it1, ++it2) {
201
202 float diff = (*it2)- (*it1)*m_felixScale;
203 channelSampleDiff = diff;
204 moduleSampleDiff = diff;
205
206 fill("TileChannelAllSamplesDiff", channelSampleDiff);
207 fill("TileModuleAllSamplesDiff", moduleSampleDiff);
208 fill("TileModuleSamplesDiff", monitoredChannel, moduleSampleDiff);
209 }
210 }
211 }
212 }
213 }
214
215 fill("TileDigitsFlxMonExecuteTime", timer);
216
217 return StatusCode::SUCCESS;
218}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
void diff(const Jet &rJet1, const Jet &rJet2, std::map< std::string, double > varDiff)
Difference between jets - Non-Class function required by trigger.
Definition Jet.cxx:631
Handle class for reading from StoreGate.
const ServiceHandle< StoreGateSvc > & detStore() const
virtual StatusCode initialize() override
initialize
This is a "hash" representation of an Identifier.
Declare a monitored scalar variable.
A monitored timer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
static std::string getDrawerString(unsigned int ros, unsigned int drawer)
Return the drawer name, e.g.
static const unsigned int MAX_GAIN
Number of gains per channel.
static const unsigned int MAX_CHAN
Number of channels in drawer.
Gaudi::Property< unsigned int > m_felixOffset
Gaudi::Property< unsigned int > m_lastSample
Gaudi::Property< unsigned int > m_felixScale
SG::ReadHandleKey< TileDigitsContainer > m_digitsContainerKeyFlx
virtual StatusCode initialize() override
initialize
Gaudi::Property< std::vector< int > > m_fragIDsToCompare
SG::ReadHandleKey< TileDigitsContainer > m_digitsContainerKeyLegacy
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Gaudi::Property< unsigned int > m_firstSample
Hash table for Tile fragments (==drawers ==collections in StoreGate)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
void fill(H5::Group &out_file, size_t iterations)