ATLAS Offline Software
TrackParticleAnalysisAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
8 #include <iostream>
9 #include <sstream>
10 #include <iomanip>
11 
12 namespace {
13  int getSummaryValue(const xAOD::TrackParticle &track_particle, xAOD::SummaryType summary_type) {
14  uint8_t tmp;
15  return track_particle.summaryValue(tmp, summary_type) ? static_cast<int>(tmp) : -1;
16  }
17 }
18 
19 
20 namespace ActsTrk {
21 
22  TrackParticleAnalysisAlg::TrackParticleAnalysisAlg(const std::string& name, ISvcLocator* pSvcLocator)
23  : AthMonitorAlgorithm(name, pSvcLocator)
24  {}
25 
27  ATH_MSG_DEBUG("Initializing " << name() << " ...");
28 
29  ATH_MSG_VERBOSE("Properties:");
31 
33 
34  ATH_MSG_VERBOSE("Monitoring settings ...");
36 
38  }
39 
40  StatusCode TrackParticleAnalysisAlg::fillHistograms(const EventContext& ctx) const {
41  ATH_MSG_DEBUG( "Filling Histograms for " << name() << " ... " );
42 
43  // Retrieve the tracks
45  ATH_CHECK(trackParticleskHandle.isValid());
46  const xAOD::TrackParticleContainer *track_particles = trackParticleskHandle.cptr();
47 
49  for (const xAOD::TrackParticle *track_particle : *track_particles) {
50  ATH_CHECK( monitorTrackStateCounts(*track_particle) );
51  }
52  }
53  auto monitor_pt = Monitored::Collection("pt", *track_particles,
54  [](const xAOD::TrackParticle *tp){return static_cast<double>(tp->pt()); } );
55  auto monitor_eta = Monitored::Collection("eta", *track_particles,
56  [](const xAOD::TrackParticle *tp){return static_cast<double>(tp->eta()); } );
57 
58  auto monitor_pixelHits = Monitored::Collection("pixelHits", *track_particles,
59  [](const xAOD::TrackParticle *tp){
60  return getSummaryValue(*tp,xAOD::numberOfPixelHits); });
61 
62  auto monitor_innermostHits = Monitored::Collection("innermostHits", *track_particles,
63  [](const xAOD::TrackParticle *tp){
64  return getSummaryValue(*tp,xAOD::numberOfInnermostPixelLayerHits); });
65 
66  auto monitor_nextToInnermostHits = Monitored::Collection("nextToInnermostHits", *track_particles,
67  [](const xAOD::TrackParticle *tp){
68  return getSummaryValue(*tp,xAOD::numberOfNextToInnermostPixelLayerHits);});
69 
70  auto monitor_expectInnermost = Monitored::Collection("expectInnermostHit", *track_particles,
71  [](const xAOD::TrackParticle *tp){
72  return getSummaryValue(*tp,xAOD::expectInnermostPixelLayerHit); });
73 
74  auto monitor_expectNextToInnermost = Monitored::Collection("expectNextToInnermostHit", *track_particles,
75  [](const xAOD::TrackParticle *tp){
76  return getSummaryValue(*tp,xAOD::expectNextToInnermostPixelLayerHit); });
77 
78  fill(m_monGroupName.value(),monitor_pt,monitor_eta, monitor_pixelHits, monitor_innermostHits, monitor_nextToInnermostHits,
79  monitor_expectInnermost, monitor_expectNextToInnermost);
80  return StatusCode::SUCCESS;
81  }
82 
84  static const SG::AuxElement::ConstAccessor<ElementLink<ActsTrk::TrackContainer> > actsTrackLink("actsTrack");
85 
86  ElementLink<ActsTrk::TrackContainer> link_to_track = actsTrackLink(track_particle);
87  ATH_CHECK(link_to_track.isValid());
88 
89  // to ensure that the code does not suggest something stupid (i.e. creating an unnecessary copy)
91  std::optional<ActsTrk::TrackContainer::ConstTrackProxy> >::value);
92  std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = *link_to_track;
93 
94  if ( not optional_track.has_value() ) {
95  ATH_MSG_WARNING("Invalid track link for particle " << track_particle.index());
96  return StatusCode::SUCCESS;
97  }
98 
99  ActsTrk::TrackContainer::ConstTrackProxy track = optional_track.value();
100  std::array<uint8_t, Acts::NumTrackStateFlags+1> counts{};
101 
103  lastMeasurementIndex = track.tipIndex();
104 
105  track.container().trackStateContainer().visitBackwards(lastMeasurementIndex,
106  [&counts] (const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy &state) -> void
107  {
108  Acts::ConstTrackStateType flag = state.typeFlags();
109  ++counts[Acts::NumTrackStateFlags];
110 
111  for (unsigned int flag_i=0; flag_i<Acts::NumTrackStateFlags; ++flag_i) {
112  if (flag.test(flag_i)) {
113  if (flag_i == Acts::TrackStateFlag::HoleFlag) {
114  if (!state.hasReferenceSurface() || !state.referenceSurface().associatedDetectorElement()) continue;
115  }
116  ++counts[flag_i];
117  }
118  }
119  });
120 
121  auto monitor_states = Monitored::Scalar<int>("States",counts[Acts::TrackStateFlag::NumTrackStateFlags]);
122  auto monitor_measurement = Monitored::Scalar<int>("Measurements",counts[Acts::TrackStateFlag::MeasurementFlag]);
123  auto monitor_parameter = Monitored::Scalar<int>("Parameters",counts[Acts::TrackStateFlag::ParameterFlag]);
124  auto monitor_outlier = Monitored::Scalar<int>("Outliers",counts[Acts::TrackStateFlag::OutlierFlag]);
125  auto monitor_hole = Monitored::Scalar<int>("Holes",counts[Acts::TrackStateFlag::HoleFlag]);
126  auto monitor_material = Monitored::Scalar<int>("MaterialStates",counts[Acts::TrackStateFlag::MaterialFlag]);
127  auto monitor_sharedHit = Monitored::Scalar<int>("SharedHits",counts[Acts::TrackStateFlag::SharedHitFlag]);
128 
129  fill(m_monGroupName.value(),
130  monitor_states, monitor_measurement, monitor_parameter, monitor_outlier, monitor_hole,
131  monitor_material, monitor_sharedHit);
132  return StatusCode::SUCCESS;
133  }
134 
135 }
CurrentEventStore.h
Hold a pointer to the current event store.
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
xAOD::TrackParticle_v1::summaryValue
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
Definition: TrackParticle_v1.cxx:736
ParticleTest.tp
tp
Definition: ParticleTest.py:25
athena.value
value
Definition: athena.py:122
xAOD::numberOfPixelHits
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
Definition: TrackingPrimitives.h:259
xAOD::expectInnermostPixelLayerHit
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
Definition: TrackingPrimitives.h:236
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:54
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:269
ActsTrk::IndexType
std::uint32_t IndexType
Definition: Decoration.h:13
xAOD::SummaryType
SummaryType
Enumerates the different types of information stored in Summary.
Definition: TrackingPrimitives.h:228
xAOD::expectNextToInnermostPixelLayerHit
@ expectNextToInnermostPixelLayerHit
Do we expect a 1st-layer barrel hit for this track?
Definition: TrackingPrimitives.h:247
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
master.flag
bool flag
Definition: master.py:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ActsTrk::TrackParticleAnalysisAlg::initialize
virtual StatusCode initialize() override
initialize
Definition: TrackParticleAnalysisAlg.cxx:26
ActsTrk::TrackParticleAnalysisAlg::m_tracksKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_tracksKey
Definition: TrackParticleAnalysisAlg.h:26
TrackParticleAnalysisAlg.h
AthMonitorAlgorithm::fill
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable >> &&variables) const
Fills a vector of variables to a group by reference.
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
SG::AuxElement::index
size_t index() const
Return the index of this element within its container.
DataVector< xAOD::TrackParticle_v1 >
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::numberOfNextToInnermostPixelLayerHits
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
Definition: TrackingPrimitives.h:248
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ActsTrk::TrackParticleAnalysisAlg::m_monitorTrackStateCounts
Gaudi::Property< bool > m_monitorTrackStateCounts
Definition: TrackParticleAnalysisAlg.h:32
ActsTrk::TrackParticleAnalysisAlg::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: TrackParticleAnalysisAlg.cxx:40
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
lumiFormat.fill
fill
Definition: lumiFormat.py:111
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:34
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
ActsTrk::TrackParticleAnalysisAlg::TrackParticleAnalysisAlg
TrackParticleAnalysisAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TrackParticleAnalysisAlg.cxx:22
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
ActsTrk::TrackParticleAnalysisAlg::monitorTrackStateCounts
StatusCode monitorTrackStateCounts(const xAOD::TrackParticle &track_particle) const
Definition: TrackParticleAnalysisAlg.cxx:83
ActsTrk::TrackParticleAnalysisAlg::m_monGroupName
Gaudi::Property< std::string > m_monGroupName
Definition: TrackParticleAnalysisAlg.h:29
TrackContainer.h
xAOD::numberOfInnermostPixelLayerHits
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
Definition: TrackingPrimitives.h:237