ATLAS Offline Software
Loading...
Searching...
No Matches
FPGAOutputValidationAlg Class Reference

#include <FPGAOutputValidationAlg.h>

Inheritance diagram for FPGAOutputValidationAlg:
Collaboration diagram for FPGAOutputValidationAlg:

Public Member Functions

 FPGAOutputValidationAlg (const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode initialize () override final
virtual StatusCode execute (const EventContext &ctx) const override final
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
virtual void setFilterPassed (bool state, const EventContext &ctx) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

Gaudi::Property< std::string > m_outputRootFilePath
Gaudi::Property< bool > m_doDiffHistograms
Gaudi::Property< bool > m_matchByID {this, "matchByID", false, "Use hash to match clusters. If false, use only the rdo list."}
Gaudi::Property< size_t > m_allowedRdoMisses {this, "allowedRdoMisses", 0, "Allowed number of RDOs that don't have to match between clusters. Setting this to a very large number means essentially that 1 common RDO is enough to match clusters."}
Gaudi::Property< bool > m_checkClusterRdos {this, "checkClusterRdos", false, "If true, check if FPGA clusters share any RDOs"}
SG::ReadHandleKeyArray< xAOD::PixelClusterContainerm_pixelKeys {this, "pixelKeys", {}}
SG::ReadHandleKeyArray< xAOD::StripClusterContainerm_stripKeys {this, "stripKeys", {}}
ToolHandle< GenericMonitoringToolm_monitoringTool {this, "monitoringTool", "", "Monitoring tool"}
ServiceHandle< IChronoStatSvc > m_chrono {this,"ChronoStatSvc","ChronoStatSvc"}
const PixelIDm_pixelid {nullptr}
const SCT_IDm_stripid {nullptr}
const InDetDD::SiDetectorManagerm_PIX_mgr = nullptr
const InDetDD::SiDetectorManagerm_SCT_mgr = nullptr
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 24 of file FPGAOutputValidationAlg.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ FPGAOutputValidationAlg()

FPGAOutputValidationAlg::FPGAOutputValidationAlg ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 141 of file FPGAOutputValidationAlg.cxx.

144 : AthReentrantAlgorithm(name, pSvcLocator)
145{}

Member Function Documentation

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode FPGAOutputValidationAlg::execute ( const EventContext & ctx) const
finaloverridevirtual

just compare two for now

just compare two for now

Definition at line 165 of file FPGAOutputValidationAlg.cxx.

165 {
166 if (m_pixelKeys.size() == 2 && m_doDiffHistograms) {
167 m_chrono->chronoStart("FPGAOutputValidationAlg::pixel diff");
168 const SG::ReadHandleKey<xAOD::PixelClusterContainer>& key0 = m_pixelKeys[0];
169 const SG::ReadHandleKey<xAOD::PixelClusterContainer>& key1 = m_pixelKeys[1];
170 SG::ReadHandle<xAOD::PixelClusterContainer> handle0{key0, ctx};
171 ATH_CHECK(handle0.isValid());
172 SG::ReadHandle<xAOD::PixelClusterContainer> handle1{key1, ctx};
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) {
215 Monitored::Group(
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 {
238 Monitored::Group(
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()),
250 Monitored::Scalar<int>("diff_pixel_tot_" +region , xAOD::xAODInDetMeasurement::Utilities::computeTotalToT(*cluster0) - xAOD::xAODInDetMeasurement::Utilities::computeTotalToT(*cluster1)),
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 {
259 Monitored::Group(
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");
285 const SG::ReadHandleKey<xAOD::StripClusterContainer>& key0 = m_stripKeys[0];
286 const SG::ReadHandleKey<xAOD::StripClusterContainer>& key1 = m_stripKeys[1];
287 SG::ReadHandle<xAOD::StripClusterContainer> handle0{key0, ctx};
288 ATH_CHECK(handle0.isValid());
289 SG::ReadHandle<xAOD::StripClusterContainer> handle1{key1, ctx};
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) {
336 Monitored::Group(
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 {
359 Monitored::Group(
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 {
376 Monitored::Group(
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++) {
399 const SG::ReadHandleKey<xAOD::PixelClusterContainer>& key = m_pixelKeys[index];
400 SG::ReadHandle<xAOD::PixelClusterContainer> handle{key, ctx};
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 {
412 Monitored::Group(
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++) {
431 const SG::ReadHandleKey<xAOD::StripClusterContainer>& key = m_stripKeys[index];
432 SG::ReadHandle<xAOD::StripClusterContainer> handle{key, ctx};
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 {
443 Monitored::Group(
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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
static Double_t ss
static const std::vector< std::string > regions
SG::ReadHandleKeyArray< xAOD::PixelClusterContainer > m_pixelKeys
Gaudi::Property< size_t > m_allowedRdoMisses
Gaudi::Property< bool > m_checkClusterRdos
SG::ReadHandleKeyArray< xAOD::StripClusterContainer > m_stripKeys
Gaudi::Property< bool > m_doDiffHistograms
ToolHandle< GenericMonitoringTool > m_monitoringTool
ServiceHandle< IChronoStatSvc > m_chrono
Gaudi::Property< bool > m_matchByID
virtual bool isValid() override final
Can the handle be successfully dereferenced?
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.
DetectorIDHashType identifierHash() const
Returns the IdentifierHash of the measurement (corresponds to the detector element IdentifierHash)
DetectorIdentType identifier() const
Returns the full Identifier of the measurement.
ConstVectorMap< N > localPosition() const
Returns the local position of the measurement.
str index
Definition DeMoScan.py:362
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

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonReentrantAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ filterPassed()

virtual bool AthCommonReentrantAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ initialize()

StatusCode FPGAOutputValidationAlg::initialize ( )
finaloverridevirtual

Definition at line 147 of file FPGAOutputValidationAlg.cxx.

147 {
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}
#define ATH_MSG_INFO(x)
const ServiceHandle< StoreGateSvc > & detStore() const
const InDetDD::SiDetectorManager * m_SCT_mgr
const InDetDD::SiDetectorManager * m_PIX_mgr

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

virtual void AthCommonReentrantAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in HypoBase, and InputMakerBase.

Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.

107 {
109
110 if (sc.isFailure()) {
111 return sc;
112 }
113
114 ServiceHandle<ICondSvc> cs("CondSvc",name());
115 for (auto h : outputHandles()) {
116 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
117 // do this inside the loop so we don't create the CondSvc until needed
118 if ( cs.retrieve().isFailure() ) {
119 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
120 return StatusCode::SUCCESS;
121 }
122 if (cs->regHandle(this,*h).isFailure()) {
124 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
125 << " with CondSvc");
126 }
127 }
128 }
129 return sc;
130}
#define ATH_MSG_WARNING(x)
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ m_allowedRdoMisses

Gaudi::Property<size_t> FPGAOutputValidationAlg::m_allowedRdoMisses {this, "allowedRdoMisses", 0, "Allowed number of RDOs that don't have to match between clusters. Setting this to a very large number means essentially that 1 common RDO is enough to match clusters."}
private

Definition at line 40 of file FPGAOutputValidationAlg.h.

40{this, "allowedRdoMisses", 0, "Allowed number of RDOs that don't have to match between clusters. Setting this to a very large number means essentially that 1 common RDO is enough to match clusters."};

◆ m_checkClusterRdos

Gaudi::Property<bool> FPGAOutputValidationAlg::m_checkClusterRdos {this, "checkClusterRdos", false, "If true, check if FPGA clusters share any RDOs"}
private

Definition at line 41 of file FPGAOutputValidationAlg.h.

41{this, "checkClusterRdos", false, "If true, check if FPGA clusters share any RDOs"};

◆ m_chrono

ServiceHandle<IChronoStatSvc> FPGAOutputValidationAlg::m_chrono {this,"ChronoStatSvc","ChronoStatSvc"}
private

Definition at line 49 of file FPGAOutputValidationAlg.h.

49{this,"ChronoStatSvc","ChronoStatSvc"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doDiffHistograms

Gaudi::Property<bool> FPGAOutputValidationAlg::m_doDiffHistograms
private
Initial value:
{
this,
"doDiffHistograms",
false,
"Create extra histograms for cluster parameter diffs between matched clusters."
}

Definition at line 33 of file FPGAOutputValidationAlg.h.

33 {
34 this,
35 "doDiffHistograms",
36 false,
37 "Create extra histograms for cluster parameter diffs between matched clusters."
38 };

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonReentrantAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_matchByID

Gaudi::Property<bool> FPGAOutputValidationAlg::m_matchByID {this, "matchByID", false, "Use hash to match clusters. If false, use only the rdo list."}
private

Definition at line 39 of file FPGAOutputValidationAlg.h.

39{this, "matchByID", false, "Use hash to match clusters. If false, use only the rdo list."};

◆ m_monitoringTool

ToolHandle<GenericMonitoringTool> FPGAOutputValidationAlg::m_monitoringTool {this, "monitoringTool", "", "Monitoring tool"}
private

Definition at line 46 of file FPGAOutputValidationAlg.h.

46{this, "monitoringTool", "", "Monitoring tool"};

◆ m_outputRootFilePath

Gaudi::Property<std::string> FPGAOutputValidationAlg::m_outputRootFilePath
private
Initial value:
{
this,
"outputRootFilePath",
"fpgaOutputValidation.root",
"Path to output root file containing histograms."
}

Definition at line 26 of file FPGAOutputValidationAlg.h.

26 {
27 this,
28 "outputRootFilePath",
29 "fpgaOutputValidation.root",
30 "Path to output root file containing histograms."
31 };

◆ m_PIX_mgr

const InDetDD::SiDetectorManager* FPGAOutputValidationAlg::m_PIX_mgr = nullptr
private

Definition at line 53 of file FPGAOutputValidationAlg.h.

◆ m_pixelid

const PixelID* FPGAOutputValidationAlg::m_pixelid {nullptr}
private

Definition at line 51 of file FPGAOutputValidationAlg.h.

51{nullptr};

◆ m_pixelKeys

SG::ReadHandleKeyArray<xAOD::PixelClusterContainer> FPGAOutputValidationAlg::m_pixelKeys {this, "pixelKeys", {}}
private

Definition at line 43 of file FPGAOutputValidationAlg.h.

43{this, "pixelKeys", {}};

◆ m_SCT_mgr

const InDetDD::SiDetectorManager* FPGAOutputValidationAlg::m_SCT_mgr = nullptr
private

Definition at line 54 of file FPGAOutputValidationAlg.h.

◆ m_stripid

const SCT_ID* FPGAOutputValidationAlg::m_stripid {nullptr}
private

Definition at line 52 of file FPGAOutputValidationAlg.h.

52{nullptr};

◆ m_stripKeys

SG::ReadHandleKeyArray<xAOD::StripClusterContainer> FPGAOutputValidationAlg::m_stripKeys {this, "stripKeys", {}}
private

Definition at line 44 of file FPGAOutputValidationAlg.h.

44{this, "stripKeys", {}};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: