ATLAS Offline Software
Loading...
Searching...
No Matches
FPGAOutputValidationAlg.cxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4
8
9namespace {
10
11 template <typename T>
12 struct ClusterPair {
13 std::pair<const T*, const T*> clusters;
14 size_t commonRDOs = 0;
15
16 ClusterPair(const T* cluster1, const T* cluster2, size_t commonRDOsCount)
17 : clusters(cluster1, cluster2), commonRDOs(commonRDOsCount) {};
18 };
19
27 template <typename T>
28 size_t compareClusters(const T* cluster1, const T* cluster2, size_t* nonCommonRdo1 = nullptr, size_t* nonCommonRdo2 = nullptr) {
29 const auto& rdoList1 = cluster1->rdoList();
30 const auto& rdoList2 = cluster2->rdoList();
31 std::unordered_set<Identifier> rdoSet1(rdoList1.begin(), rdoList1.end());
32 std::unordered_set<Identifier> rdoSet2(rdoList2.begin(), rdoList2.end());
33
34 size_t nCommonRdo = 0;
35 for (const auto& rdo : rdoList1) {
36 if (rdoSet2.count(rdo)) {
37 ++nCommonRdo;
38 }
39 }
40 if (nonCommonRdo1) *nonCommonRdo1 = rdoList1.size() - nCommonRdo;
41 if (nonCommonRdo2) *nonCommonRdo2 = rdoList2.size() - nCommonRdo;
42
43 return nCommonRdo;
44 }
45
55 template <typename T>
56 std::vector<const T*> findMatchingCluster(const T* cluster0,
57 const std::unordered_multimap<xAOD::DetectorIdentType, const T*>& clusterMap,
58 const std::unordered_multimap<xAOD::DetectorIDHashType, const T*>& clusterMapHashIdMap,
59 bool matchByID, const size_t& allowedMisses) {
60 std::vector<const T*> matchedClusters{};
61
62 std::unordered_set<Identifier> rdoSet0{};
63 for (const auto& rdo : cluster0->rdoList()) {
64 rdoSet0.insert(rdo);
65 }
66 const size_t rdoToMiss = (allowedMisses < rdoSet0.size()) ? allowedMisses : (rdoSet0.size()-1);
67 if (matchByID) {
68 auto range = clusterMap.equal_range(cluster0->identifier());
69 for (auto it = range.first; it != range.second; ++it) {
70 size_t nCommonRdo = compareClusters(cluster0, it->second);
71 if (nCommonRdo >= rdoSet0.size() - rdoToMiss) {
72 matchedClusters.push_back(it->second);
73 }
74 }
75 } else {
76 auto range = clusterMapHashIdMap.equal_range(cluster0->identifierHash());
77 for (auto it = range.first; it != range.second; ++it) {
78 const auto& cluster1 = it->second;
79 size_t nCommonRdo = compareClusters(cluster0, cluster1);
80 if (nCommonRdo >= rdoSet0.size() - rdoToMiss) {
81 matchedClusters.push_back(cluster1);
82 }
83 }
84 }
85 return matchedClusters;
86 }
87
88
100 template <typename T>
101 std::vector<ClusterPair<T>> findNonMergedClusters(const std::unordered_multimap<xAOD::DetectorIDHashType, const T*>& clusterMap) {
102 std::vector<ClusterPair<T>> clusterPairs;
103 std::unordered_set<xAOD::DetectorIDHashType> uniqueKeys;
104 for (const auto& pair : clusterMap) {
105 uniqueKeys.insert(pair.first);
106 }
107 for (const auto& key : uniqueKeys) {
108 auto range = clusterMap.equal_range(key);
109 for (auto it1 = range.first; it1 != range.second; ++it1) {
110 for (auto it2 = std::next(it1); it2 != range.second; ++it2) {
111 size_t nonCommonRdo1 = 0, nonCommonRdo2 = 0;
112 size_t nCommonRdo = compareClusters(it1->second, it2->second, &nonCommonRdo1, &nonCommonRdo2);
113 if (nCommonRdo > 0) {
114 clusterPairs.emplace_back(it1->second, it2->second, nCommonRdo);
115 }
116 }
117 }
118 }
119 return clusterPairs;
120 }
121
122 template <typename T>
123 std::string logMultipleClusterMatches(const std::vector<const T*>& matchedClusters) {
124 std::string out;
125
126 out += "Found " + std::to_string(matchedClusters.size()) + " FPGA ";
127 out += (matchedClusters[0]->type() == xAOD::UncalibMeasType::PixelClusterType ? "Pixel" : "Strip");
128 out += " clusters matching to the same offline cluster:\n";
129 for (const auto& cluster : matchedClusters) {
130 out += std::to_string(cluster->identifier()) + " x: " + std::to_string(cluster->globalPosition()[0]) +
131 " y: " + std::to_string(cluster->globalPosition()[1]) + " z: " + std::to_string(cluster->globalPosition()[2]) + "\n";
132 for (const auto& rdo : cluster->rdoList()) {
133 out += "\t" + std::to_string(rdo.get_compact()) + "\n";
134 }
135 out += "\n";
136 }
137 return out;
138 }
139}
140
142 const std::string& name,
143 ISvcLocator* pSvcLocator
144) : AthReentrantAlgorithm(name, pSvcLocator)
145{}
146
148 ATH_MSG_INFO("Initializing FPGAOutputValidationAlg");
149
150 ATH_CHECK(m_pixelKeys.initialize(!m_pixelKeys.empty()));
151 ATH_CHECK(m_stripKeys.initialize(!m_stripKeys.empty()));
152
153 ATH_CHECK(m_monitoringTool.retrieve());
154
155 ATH_CHECK(m_chrono.retrieve());
156
157 ATH_CHECK(detStore()->retrieve(m_pixelid, "PixelID"));
158 ATH_CHECK(detStore()->retrieve(m_stripid, "SCT_ID"));
159 ATH_CHECK(detStore()->retrieve(m_SCT_mgr, "ITkStrip"));
160 ATH_CHECK(detStore()->retrieve(m_PIX_mgr, "ITkPixel"));
161
162 return StatusCode::SUCCESS;
163}
164
165StatusCode FPGAOutputValidationAlg::execute(const EventContext& ctx) const {
166 if (m_pixelKeys.size() == 2 && m_doDiffHistograms) {
167 m_chrono->chronoStart("FPGAOutputValidationAlg::pixel diff");
171 ATH_CHECK(handle0.isValid());
173 ATH_CHECK(handle1.isValid());
174
175 if (m_checkClusterRdos) {
176 const auto& pixelClusters0 = *handle0;
177 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::PixelCluster*> pixelClustersHashIdMap0; // assumes that the first key is the FPGA one
178 for (const auto* cluster0 : pixelClusters0) {
179 const xAOD::DetectorIDHashType hashId0 = cluster0->identifierHash();
180 pixelClustersHashIdMap0.insert(std::make_pair(hashId0, cluster0));
181 }
182 const std::vector<ClusterPair<xAOD::PixelCluster>> pixelClusterPairsWithCommonRdos = findNonMergedClusters(pixelClustersHashIdMap0);
183 if (pixelClusterPairsWithCommonRdos.size() > 0) {
184 std::stringstream ss;
185 for (const auto& pair : pixelClusterPairsWithCommonRdos) {
186 ss << "Found " << pair.commonRDOs << " common RDOs between clusters with hash "
187 << pair.clusters.first->identifierHash() << ": "
188 << pair.clusters.first->identifier() << " and "
189 << pair.clusters.second->identifier() << "\n";
190 }
191 ATH_MSG_ERROR("Pixel cluster pairs with common RDOs:\n" << ss.str());
192 }
193 }
194
195 const xAOD::PixelClusterContainer pixelClusters1 = *handle1;
196 std::unordered_multimap<xAOD::DetectorIdentType, const xAOD::PixelCluster*> pixelClustersMap1;
197 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::PixelCluster*> pixelClustersHashIdMap1;
198 for (const auto* cluster1 : pixelClusters1) {
199 const xAOD::DetectorIdentType id1 = cluster1->identifier();
200 const xAOD::DetectorIDHashType hashId1 = cluster1->identifierHash();
201 pixelClustersMap1.insert(std::make_pair(id1, cluster1));
202 pixelClustersHashIdMap1.insert(std::make_pair(hashId1, cluster1));
203 }
204
205 for (auto cluster0 : *handle0) {
206 const std::vector<const xAOD::PixelCluster*> matchedClusters = findMatchingCluster(cluster0, pixelClustersMap1, pixelClustersHashIdMap1,
209
210 if (matchedClusters.size() == 0) {
211 std::vector<std::string> regions {"all"};
212 if(m_pixelid->barrel_ec(cluster0->rdoList()[0]) == 0) regions.push_back("barrel");
213 else regions.push_back("endcap");
214 for (const auto& region : regions) {
217 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_Z_" + region, cluster0->globalPosition()[2]),
218 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_R_" + region, sqrt(cluster0->globalPosition()[0]*cluster0->globalPosition()[0] +
219 cluster0->globalPosition()[1]*cluster0->globalPosition()[1])),
220 Monitored::Scalar<float>("nmatched_pixel_clusters_"+region, matchedClusters.size() - 0.5)
221 );
222 }
223 continue;
224 }
225 if (matchedClusters.size() > 1) {
226 ATH_MSG_ERROR(logMultipleClusterMatches(matchedClusters));
227 return StatusCode::FAILURE;
228 }
229
230 const xAOD::PixelCluster *cluster1 = matchedClusters[0];
231
232 std::vector<std::string> regions {"all"};
233 if(m_pixelid->barrel_ec(cluster0->rdoList()[0]) == 0) regions.push_back("barrel");
234 else regions.push_back("endcap");
235
236 for(auto const& region: regions)
237 {
240 Monitored::Scalar<float>("diff_pixel_locx_" +region , cluster0->localPosition<2>()[0] - cluster1->localPosition<2>()[0]),
241 Monitored::Scalar<float>("diff_pixel_locy_" +region , cluster0->localPosition<2>()[1] - cluster1->localPosition<2>()[1]),
242 Monitored::Scalar<float>("diff_pixel_covxx_" +region , cluster0->localCovariance<2>()(0, 0) - cluster1->localCovariance<2>()(0, 0)),
243 Monitored::Scalar<float>("diff_pixel_covyy_" +region , cluster0->localCovariance<2>()(1, 1) - cluster1->localCovariance<2>()(1, 1)),
244 Monitored::Scalar<float>("diff_pixel_globalx_" +region , cluster0->globalPosition()[0] - cluster1->globalPosition()[0]),
245 Monitored::Scalar<float>("diff_pixel_globaly_" +region , cluster0->globalPosition()[1] - cluster1->globalPosition()[1]),
246 Monitored::Scalar<float>("diff_pixel_globalz_" +region , cluster0->globalPosition()[2] - cluster1->globalPosition()[2]),
247 Monitored::Scalar<int>("diff_pixel_channelsphi_" +region , cluster0->channelsInPhi() - cluster1->channelsInPhi()),
248 Monitored::Scalar<int>("diff_pixel_channelseta_" +region , cluster0->channelsInEta() - cluster1->channelsInEta()),
249 Monitored::Scalar<float>("diff_pixel_widtheta_" +region , cluster0->widthInEta() - cluster1->widthInEta()),
251 Monitored::Scalar<int>("diff_pixel_rdos_" +region , cluster0->rdoList().size() - cluster1->rdoList().size()),
252 Monitored::Scalar<float>("pixel_globalR_ref_" + region, sqrt(cluster1->globalPosition()[0]*cluster1->globalPosition()[0] +
253 cluster1->globalPosition()[1]*cluster1->globalPosition()[1])),
254 Monitored::Scalar<float>("pixel_globalZ_ref_" + region, cluster1->globalPosition()[2]),
255 Monitored::Scalar<float>("nmatched_pixel_clusters_"+region, matchedClusters.size() - 0.5)
256 );
257 if(region != "all")
258 {
261 Monitored::Scalar<float>("diff_pixel_locx_"+region+"Layer" + std::to_string(m_pixelid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
262 cluster0->localPosition<2>()[0] - cluster1->localPosition<2>()[0]),
263 Monitored::Scalar<float>("diff_pixel_locy_"+region+"Layer" + std::to_string(m_pixelid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
264 cluster0->localPosition<2>()[1] - cluster1->localPosition<2>()[1]),
265 Monitored::Scalar<float>("diff_pixel_covxx_"+region+"Layer" + std::to_string(m_pixelid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
266 cluster0->localCovariance<2>()(0, 0) - cluster1->localCovariance<2>()(0, 0)),
267 Monitored::Scalar<float>("diff_pixel_covyy_"+region+"Layer" + std::to_string(m_pixelid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
268 cluster0->localCovariance<2>()(1, 1) - cluster1->localCovariance<2>()(1, 1)),
269 Monitored::Scalar<float>("diff_pixel_globalX_"+region+"Layer" + std::to_string(m_pixelid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
270 cluster0->globalPosition()[0] - cluster1->globalPosition()[0]),
271 Monitored::Scalar<float>("diff_pixel_globalY_"+region+"Layer" + std::to_string(m_pixelid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
272 cluster0->globalPosition()[1] - cluster1->globalPosition()[1]),
273 Monitored::Scalar<float>("diff_pixel_globalZ_"+region+"Layer" + std::to_string(m_pixelid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
274 cluster0->globalPosition()[2] - cluster1->globalPosition()[2]),
275 Monitored::Scalar<float>("nmatched_pixel_clusters_"+region, matchedClusters.size() - 0.5)
276 );
277 }
278 }
279 }
280 m_chrono->chronoStop("FPGAOutputValidationAlg::pixel diff");
281 }
282
283 if (m_stripKeys.size() == 2 && m_doDiffHistograms) {
284 m_chrono->chronoStart("FPGAOutputValidationAlg::strip diff");
288 ATH_CHECK(handle0.isValid());
290 ATH_CHECK(handle1.isValid());
291
292 if (m_checkClusterRdos) {
293 const xAOD::StripClusterContainer stripClusters0 = *handle0;
294 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::StripCluster*> stripClustersHashIdMap0; // assumes that the first key is the FPGA one
295 for (const auto* cluster0 : stripClusters0) {
296 const xAOD::DetectorIDHashType hashId0 = cluster0->identifierHash();
297 stripClustersHashIdMap0.insert(std::make_pair(hashId0, cluster0));
298 }
299
300 // Find all pairs of clusters within the same detector element that share at least one RDO
301 const std::vector<ClusterPair<xAOD::StripCluster>> stripPairsWithCommonRdos = findNonMergedClusters(stripClustersHashIdMap0);
302
303 // If any such pairs are found, log an error with details for debugging
304 if (stripPairsWithCommonRdos.size() > 0) {
305 std::stringstream ss;
306 for (const auto& pair : stripPairsWithCommonRdos) {
307 ss << "Found " << pair.commonRDOs << " common RDOs between clusters with hash "
308 << pair.clusters.first->identifierHash() << ": "
309 << pair.clusters.first->identifier() << " and "
310 << pair.clusters.second->identifier() << "\n";
311 }
312 ATH_MSG_ERROR("Strip cluster pairs with common RDOs:\n" << ss.str());
313 }
314 }
315 const xAOD::StripClusterContainer stripClusters1 = *handle1;
316 std::unordered_multimap<xAOD::DetectorIdentType, const xAOD::StripCluster*> stripClustersMap1;
317 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::StripCluster*> stripClustersHashIdMap1;
318 for (const auto *cluster1 : stripClusters1) {
319 const xAOD::DetectorIdentType id1 = cluster1->identifier();
320 const xAOD::DetectorIDHashType hashId1 = cluster1->identifierHash();
321 stripClustersMap1.insert(std::make_pair(id1, cluster1));
322 stripClustersHashIdMap1.insert(std::make_pair(hashId1, cluster1));
323 }
324
325
326 for (auto cluster0 : *handle0) {
327 const std::vector<const xAOD::StripCluster*> matchedClusters = findMatchingCluster(cluster0, stripClustersMap1, stripClustersHashIdMap1,
330
331 if (matchedClusters.size() == 0 && handle1->size() > 0) {
332 std::vector<std::string> regions {"all"};
333 if(m_stripid->barrel_ec(cluster0->rdoList()[0]) == 0) regions.push_back("barrel");
334 else regions.push_back("endcap");
335 for (const auto& region : regions) {
338 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_Z_" + region, cluster0->globalPosition()[2]),
339 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_R_" + region, sqrt(cluster0->globalPosition()[0]*cluster0->globalPosition()[0] +
340 cluster0->globalPosition()[1]*cluster0->globalPosition()[1])),
341 Monitored::Scalar<float>("nmatched_strip_clusters_"+region, matchedClusters.size() - 0.5)
342 );
343 }
344 continue;
345 }
346 if (matchedClusters.size() > 1) {
347 ATH_MSG_ERROR(logMultipleClusterMatches(matchedClusters));
348 return StatusCode::FAILURE;
349 }
350
351 const xAOD::StripCluster *cluster1 = matchedClusters[0];
352
353 std::vector<std::string> regions {"all"};
354 if(m_stripid->barrel_ec(cluster0->rdoList()[0]) == 0) regions.push_back("barrel");
355 else regions.push_back("endcap");
356
357 for(auto const& region: regions)
358 {
361 Monitored::Scalar<float>("diff_strip_locx_" + region, cluster0->localPosition<1>()[0] - cluster1->localPosition<1>()[0]),
362 Monitored::Scalar<float>("diff_strip_locxZoom_" + region, cluster0->localPosition<1>()[0] - cluster1->localPosition<1>()[0]),
363 Monitored::Scalar<float>("diff_strip_covxx_" + region, cluster0->localCovariance<1>()(0, 0) - cluster1->localCovariance<1>()(0, 0)),
364 Monitored::Scalar<float>("diff_strip_globalx_" + region, cluster0->globalPosition()[0] - cluster1->globalPosition()[0]),
365 Monitored::Scalar<float>("diff_strip_globaly_" + region, cluster0->globalPosition()[1] - cluster1->globalPosition()[1]),
366 Monitored::Scalar<float>("diff_strip_globalz_" + region, cluster0->globalPosition()[2] - cluster1->globalPosition()[2]),
367 Monitored::Scalar<float>("diff_strip_channelsphi_" + region, cluster0->channelsInPhi() - cluster1->channelsInPhi()),
368 Monitored::Scalar<int>("diff_strip_rdos_" +region , cluster0->rdoList().size() - cluster1->rdoList().size()),
369 Monitored::Scalar<float>("strip_globalR_ref_" + region, sqrt(cluster1->globalPosition()[0]*cluster1->globalPosition()[0] +
370 cluster1->globalPosition()[1]*cluster1->globalPosition()[1])),
371 Monitored::Scalar<float>("strip_globalZ_ref_" + region, cluster1->globalPosition()[2]),
372 Monitored::Scalar<float>("nmatched_strip_clusters_"+region, matchedClusters.size() - 0.5)
373 );
374 if(region != "all")
375 {
378 Monitored::Scalar<float>("diff_strip_locx_"+region+"Layer" + std::to_string(m_stripid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
379 cluster0->localPosition<1>()[0] - cluster1->localPosition<1>()[0]),
380 Monitored::Scalar<float>("diff_strip_locxZoom_"+region+"Layer" + std::to_string(m_stripid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
381 cluster0->localPosition<1>()[0] - cluster1->localPosition<1>()[0]),
382 Monitored::Scalar<float>("diff_strip_covxx_"+region+"Layer" + std::to_string(m_stripid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
383 cluster0->localCovariance<1>()(0, 0) - cluster1->localCovariance<1>()(0, 0)),
384 Monitored::Scalar<float>("diff_strip_globalX_"+region+"Layer" + std::to_string(m_stripid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
385 cluster0->globalPosition()[0] - cluster1->globalPosition()[0]),
386 Monitored::Scalar<float>("diff_strip_globalY_"+region+"Layer" + std::to_string(m_stripid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
387 cluster0->globalPosition()[1] - cluster1->globalPosition()[1]),
388 Monitored::Scalar<float>("diff_strip_globalZ_"+region+"Layer" + std::to_string(m_stripid->layer_disk(m_pixelid->wafer_id(cluster0->identifierHash()))),
389 cluster0->globalPosition()[2] - cluster1->globalPosition()[2]),
390 Monitored::Scalar<float>("nmatched_strip_clusters_"+region, matchedClusters.size() - 0.5)
391 );
392 }
393 }
394 }
395 m_chrono->chronoStop("FPGAOutputValidationAlg::strip diff");
396 }
397
398 for (std::size_t index = 0; index < m_pixelKeys.size(); index++) {
401 ATH_CHECK(handle.isValid());
402
403
404 for(auto cluster : *handle)
405 {
406 std::vector<std::string> regions {"all"};
407 if(m_pixelid->barrel_ec(cluster->rdoList()[0]) == 0) regions.push_back("barrel");
408 else regions.push_back("endcap");
409
410 for(auto const& region: regions)
411 {
414 Monitored::Scalar<float>(key.key() + "_LOCALPOSITION_X_" + region, cluster->localPosition<2>()[0]),
415 Monitored::Scalar<float>(key.key() + "_LOCALPOSITION_Y_" + region, cluster->localPosition<2>()[1]),
416 Monitored::Scalar<float>(key.key() + "_LOCALCOVARIANCE_XX_" + region, cluster->localCovariance<2>()(0, 0)),
417 Monitored::Scalar<float>(key.key() + "_LOCALCOVARIANCE_YY_" + region, cluster->localCovariance<2>()(1, 1)),
418 Monitored::Scalar<float>(key.key() + "_GLOBALPOSITION_X_" + region, cluster->globalPosition()[0]),
419 Monitored::Scalar<float>(key.key() + "_GLOBALPOSITION_Y_" + region, cluster->globalPosition()[1]),
420 Monitored::Scalar<float>(key.key() + "_GLOBALPOSITION_Z_" + region, cluster->globalPosition()[2]),
421 Monitored::Scalar<int>(key.key() + "_CHANNELS_IN_PHI_" + region, cluster->channelsInPhi()),
422 Monitored::Scalar<int>(key.key() + "_CHANNELS_IN_ETA_" + region, cluster->channelsInEta()),
423 Monitored::Scalar<float>(key.key() + "_WIDTH_IN_ETA_" + region, cluster->widthInEta()),
424 Monitored::Scalar<int>(key.key() + "_TOTAL_TOT_" + region, xAOD::xAODInDetMeasurement::Utilities::computeTotalToT(*cluster))
425 );
426 }
427 }
428 }
429
430 for (std::size_t index = 0; index < m_stripKeys.size(); index++) {
433 ATH_CHECK(handle.isValid());
434
435 for(auto cluster : *handle)
436 {
437 std::vector<std::string> regions {"all"};
438 if(m_stripid->barrel_ec(cluster->rdoList()[0]) == 0) regions.push_back("barrel");
439 else regions.push_back("endcap");
440
441 for(auto const& region: regions)
442 {
445 Monitored::Scalar<float>(key.key() + "_LOCALPOSITIONZOOM_X_" + region, cluster->localPosition<1>()(0,0)),
446 Monitored::Scalar<float>(key.key() + "_LOCALPOSITION_X_" + region, cluster->localPosition<1>()(0,0)),
447 Monitored::Scalar<float>(key.key() + "_LOCALCOVARIANCE_XX_" + region, cluster->localCovariance<1>()(0, 0)),
448 Monitored::Scalar<float>(key.key() + "_GLOBALPOSITION_X_" + region, cluster->globalPosition()[0]),
449 Monitored::Scalar<float>(key.key() + "_GLOBALPOSITION_Y_" + region, cluster->globalPosition()[1]),
450 Monitored::Scalar<float>(key.key() + "_GLOBALPOSITION_Z_" + region, cluster->globalPosition()[2]),
451 Monitored::Scalar<float>(key.key() + "_CHANNELS_IN_PHI_" + region, cluster->channelsInPhi())
452 );
453 }
454 }
455 }
456
457 return StatusCode::SUCCESS;
458}
459
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
static Double_t ss
static const std::vector< std::string > regions
const ServiceHandle< StoreGateSvc > & detStore() const
An algorithm that can be simultaneously executed in multiple threads.
SG::ReadHandleKeyArray< xAOD::PixelClusterContainer > m_pixelKeys
Gaudi::Property< size_t > m_allowedRdoMisses
const InDetDD::SiDetectorManager * m_SCT_mgr
Gaudi::Property< bool > m_checkClusterRdos
SG::ReadHandleKeyArray< xAOD::StripClusterContainer > m_stripKeys
const InDetDD::SiDetectorManager * m_PIX_mgr
Gaudi::Property< bool > m_doDiffHistograms
ToolHandle< GenericMonitoringTool > m_monitoringTool
FPGAOutputValidationAlg(const std::string &name, ISvcLocator *pSvcLocator)
ServiceHandle< IChronoStatSvc > m_chrono
virtual StatusCode execute(const EventContext &ctx) const override final
Gaudi::Property< bool > m_matchByID
virtual StatusCode initialize() override final
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
STL class.
int channelsInPhi() const
Returns the dimensions of the cluster in numbers of channels in phi (x) and eta (y) directions,...
const std::vector< Identifier > rdoList() const
Returns the list of identifiers of the channels building the cluster.
ConstVectorMap< 3 > globalPosition() const
Returns the global position of the pixel cluster.
int channelsInEta() const
float widthInEta() const
Returns the width of the cluster in phi (x) and eta (y) directions, respectively.
ConstVectorMap< 3 > globalPosition() const
Returns the global position of the strip cluster.
int channelsInPhi() const
Returns the dimensions of the cluster in numbers of channels in phi (x), respectively.
const std::vector< Identifier > rdoList() const
Returns the list of identifiers of the channels building the cluster.
ConstMatrixMap< N > localCovariance() const
Returns the local covariance of the measurement.
ConstVectorMap< N > localPosition() const
Returns the local position of the measurement.
Definition index.py:1
PixelClusterContainer_v1 PixelClusterContainer
Define the version of the pixel cluster container.
StripCluster_v1 StripCluster
Define the version of the strip cluster class.
long unsigned int DetectorIdentType
StripClusterContainer_v1 StripClusterContainer
Define the version of the strip cluster container.
PixelCluster_v1 PixelCluster
Define the version of the pixel cluster class.
unsigned int DetectorIDHashType
@ detector ID element hash