ATLAS Offline Software
Loading...
Searching...
No Matches
TrackAnalysisAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
7
8#include "TrackAnalysisAlg.h"
9
10template <>
11struct Monitored::detail::get_value_type<ActsTrk::TrackContainer> { typedef typename ActsTrk::TrackContainer::TrackProxy value_type; };
12
13
14namespace ActsTrk {
15
16 TrackAnalysisAlg::TrackAnalysisAlg(const std::string& name, ISvcLocator* pSvcLocator)
17 : AthMonitorAlgorithm(name, pSvcLocator)
18 {}
19
21 ATH_MSG_INFO("Initializing " << name() << " ...");
22
23 ATH_MSG_DEBUG("Properties:");
25
26 ATH_CHECK(m_tracksKey.initialize());
27
28 ATH_MSG_DEBUG("Monitoring settings ...");
30
31 ATH_CHECK(detStore()->retrieve(m_pixelID,"PixelID"));
32 ATH_CHECK(detStore()->retrieve(m_stripID,"SCT_ID"));
33
35 }
36
37 namespace {
38 std::array<uint8_t,static_cast<unsigned int>(xAOD::UncalibMeasType::nTypes)> countHits(
39 const ActsTrk::TrackContainer &tracksContainer,
40 const typename ActsTrk::TrackContainer::ConstTrackProxy& track) {
41 std::array<uint8_t,static_cast<unsigned int>(xAOD::UncalibMeasType::nTypes)> hit_counts_out{};
42 tracksContainer.trackStateContainer().visitBackwards(
43 track.tipIndex(),
44 [
45 &hit_counts_out
46 ](const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy &state) -> void
47 {
48 if (state.hasUncalibratedSourceLink()) {
49 try {
50 const xAOD::UncalibratedMeasurement *
51 measurement = &(ActsTrk::getUncalibratedMeasurement(state.getUncalibratedSourceLink().get<ATLASUncalibSourceLink>()));
52 assert( static_cast<unsigned int >(measurement->type() < xAOD::UncalibMeasType::nTypes));
53 ++hit_counts_out[static_cast<unsigned int >(measurement->type())];
54 }
55 catch (std::bad_any_cast &) {
56 }
57 }
58 });
59 return hit_counts_out;
60 }
61 }
62
63 StatusCode TrackAnalysisAlg::fillHistograms(const EventContext& ctx) const {
64 ATH_MSG_DEBUG( "Filling Histograms for " << name() << " ... " );
65
66 // Retrieve the tracks
68 ATH_CHECK(trackHandle.isValid());
69 const ActsTrk::TrackContainer *tracks = trackHandle.cptr();
70 using ConstTrackProxy = ActsTrk::TrackContainer::ConstTrackProxy;
71
72 // TODO this copy will be eliminated once the TrackContainer has [] operator
73 std::vector<ConstTrackProxy> proxies;
74 for (auto proxy: *tracks ) {
75 proxies.push_back(proxy);
76 }
77
78 std::vector<int> nSharedPerTrack {};
79 nSharedPerTrack.reserve(tracks->size());
80
81 std::vector<int> nSharedPixelBarrelLayer;
82 std::vector<int> nSharedPixelEndCapLayer;
83 std::vector<int> nSharedStripBarrelLayer;
84 std::vector<int> nSharedStripEndCapLayer;
85 nSharedPixelBarrelLayer.reserve(5*tracks->size());
86 nSharedPixelEndCapLayer.reserve(5*tracks->size());
87 nSharedStripBarrelLayer.reserve(5*tracks->size());
88 nSharedStripEndCapLayer.reserve(5*tracks->size());
89
90 for (const auto track_proxy : proxies) {
91 int nShared = 0;
92 track_proxy.container().trackStateContainer()
93 .visitBackwards(track_proxy.tipIndex(),
94 [this,
95 &nShared,
96 &nSharedPixelBarrelLayer, &nSharedPixelEndCapLayer,
97 &nSharedStripBarrelLayer, &nSharedStripEndCapLayer]
98 (const auto& state)
99 {
100 auto flags = state.typeFlags();
101 if (not flags.test(Acts::TrackStateFlag::SharedHitFlag)) return;
102 ++nShared;
103 // get measurement -> if barrel/endcap and layer number
104 auto sl = state.getUncalibratedSourceLink().template get<ATLASUncalibSourceLink>();
105 assert( sl != nullptr);
106 const xAOD::UncalibratedMeasurement &cluster = getUncalibratedMeasurement(sl);
107 xAOD::DetectorIDHashType idHash = cluster.identifierHash();
108
109 xAOD::UncalibMeasType clusterType = cluster.type();
110 if (clusterType == xAOD::UncalibMeasType::PixelClusterType) {
111 const Identifier& id = m_pixelID->wafer_id(idHash);
112 auto barrel_or_endcap = m_pixelID->barrel_ec(id);
113 auto layer = m_pixelID->layer_disk(id);
114 if (barrel_or_endcap == 0) {
115 nSharedPixelBarrelLayer.push_back(layer);
116 } else {
117 nSharedPixelEndCapLayer.push_back(layer);
118 }
119 } else if (clusterType == xAOD::UncalibMeasType::StripClusterType) {
120 const Identifier& id = m_stripID->wafer_id(idHash);
121 auto barrel_or_endcap = m_stripID->barrel_ec(id);
122 auto layer = m_stripID->layer_disk(id);
123 if (barrel_or_endcap == 0) {
124 nSharedStripBarrelLayer.push_back(layer);
125 } else {
126 nSharedStripEndCapLayer.push_back(layer);
127 }
128 }
129
130 } );
131 nSharedPerTrack.push_back(nShared);
132 }
133
134 auto monitor_nsharedpertrack = Monitored::Collection("nShared", nSharedPerTrack);
135 auto monitor_nsharedperlayer_pixelbarrel = Monitored::Collection("NsharedPerLayer_pixelBarrel", nSharedPixelBarrelLayer);
136 auto monitor_nsharedperlayer_pixelendcap = Monitored::Collection("NsharedPerLayer_pixelEndCap", nSharedPixelEndCapLayer);
137 auto monitor_nsharedperlayer_stripbarrel = Monitored::Collection("NsharedPerLayer_stripBarrel", nSharedStripBarrelLayer);
138 auto monitor_nsharedperlayer_stripendcap = Monitored::Collection("NsharedPerLayer_stripEndCap", nSharedStripEndCapLayer);
139
140 auto monitor_ntracks = Monitored::Scalar<int>("Ntracks", tracks->size());
141 auto monitor_theta = Monitored::Collection("theta", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.theta()); } );
142 auto monitor_eta = Monitored::Collection("eta", proxies,
143 [](const ConstTrackProxy& tp)
144 { return static_cast<double>( -std::log(std::tan(tp.theta() * 0.5)) ); } );
145 auto monitor_qoverp = Monitored::Collection("qoverp", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.qOverP()); } );
146 auto monitor_pt = Monitored::Collection("pt", proxies, [](const ConstTrackProxy& tp){ return tp.transverseMomentum(); } );
147 auto monitor_phi = Monitored::Collection("phi", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.phi()); } );
148 auto monitor_chi2 = Monitored::Collection("chi2", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.chi2()); } );
149 auto monitor_chi2OverNdof = Monitored::Collection("chi2OverNdof", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.chi2()/tp.nDoF()); } );
150 auto monitor_ndof = Monitored::Collection("ndof", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nDoF()); } );
151 auto monitor_nstates = Monitored::Collection("nStates", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nTrackStates()); } );
152 // @TODO not particular efficient to count the hits twice ...
153 auto monitor_nPixelHits = Monitored::Collection("nPixelHits", proxies, [&tracks](const ConstTrackProxy& tp){
154 return countHits(*tracks,tp)[static_cast<unsigned int>(xAOD::UncalibMeasType::PixelClusterType)]; } );
155 auto monitor_nStripHits = Monitored::Collection("nStripHits", proxies, [&tracks](const ConstTrackProxy& tp){
156 return countHits(*tracks,tp)[static_cast<unsigned int>(xAOD::UncalibMeasType::StripClusterType)]; } );
157 auto monitor_nmeas = Monitored::Collection("nMeasurements", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nMeasurements()); } );
158 auto monitor_noutliers = Monitored::Collection("nOutliers", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nOutliers()); } );
159 auto monitor_nholes = Monitored::Collection("nHoles", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nHoles()); } );
160 auto monitor_surftype = Monitored::Collection("surfaceType", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.referenceSurface().type()); } );
161
162
163 fill(m_monGroupName.value(),
164 monitor_nsharedpertrack,
165 monitor_nsharedperlayer_pixelbarrel, monitor_nsharedperlayer_pixelendcap,
166 monitor_nsharedperlayer_stripbarrel, monitor_nsharedperlayer_stripendcap,
167 monitor_ntracks, monitor_theta, monitor_eta, monitor_phi, monitor_pt,
168 monitor_qoverp, monitor_nstates, monitor_phi, monitor_chi2, monitor_chi2OverNdof,
169 monitor_ndof, monitor_nstates, monitor_nmeas, monitor_noutliers, monitor_nholes, monitor_surftype,
170 monitor_nPixelHits, monitor_nStripHits);
171
172 return StatusCode::SUCCESS;
173 }
174
175}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
if(febId1==febId2)
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Gaudi::Property< std::string > m_monGroupName
virtual StatusCode initialize() override
initialize
TrackAnalysisAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< ActsTrk::TrackContainer > m_tracksKey
const ServiceHandle< StoreGateSvc > & detStore() const
virtual StatusCode initialize() override
initialize
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Declare a monitored scalar variable.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Get element type for containers.
void fill(H5::Group &out_file, size_t iterations)