Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 
10 template <>
11 struct Monitored::detail::get_value_type<ActsTrk::TrackContainer> { typedef typename ActsTrk::TrackContainer::TrackProxy value_type; };
12 
13 
14 namespace 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 
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
67  SG::ReadHandle<ActsTrk::TrackContainer> trackHandle = SG::makeHandle(m_tracksKey, ctx);
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_phi = Monitored::Collection("phi", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.phi()); } );
147  auto monitor_chi2 = Monitored::Collection("chi2", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.chi2()); } );
148  auto monitor_chi2OverNdof = Monitored::Collection("chi2OverNdof", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.chi2()/tp.nDoF()); } );
149  auto monitor_ndof = Monitored::Collection("ndof", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nDoF()); } );
150  auto monitor_nstates = Monitored::Collection("nStates", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nTrackStates()); } );
151  // @TODO not particular efficient to count the hits twice ...
152  auto monitor_nPixelHits = Monitored::Collection("nPixelHits", proxies, [&tracks](const ConstTrackProxy& tp){
153  return countHits(*tracks,tp)[static_cast<unsigned int>(xAOD::UncalibMeasType::PixelClusterType)]; } );
154  auto monitor_nStripHits = Monitored::Collection("nStripHits", proxies, [&tracks](const ConstTrackProxy& tp){
155  return countHits(*tracks,tp)[static_cast<unsigned int>(xAOD::UncalibMeasType::StripClusterType)]; } );
156  auto monitor_nmeas = Monitored::Collection("nMeasurements", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nMeasurements()); } );
157  auto monitor_noutliers = Monitored::Collection("nOutliers", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nOutliers()); } );
158  auto monitor_nholes = Monitored::Collection("nHoles", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nHoles()); } );
159  auto monitor_surftype = Monitored::Collection("surfaceType", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.referenceSurface().type()); } );
160 
161 
162  fill(m_monGroupName.value(),
163  monitor_nsharedpertrack,
164  monitor_nsharedperlayer_pixelbarrel, monitor_nsharedperlayer_pixelendcap,
165  monitor_nsharedperlayer_stripbarrel, monitor_nsharedperlayer_stripendcap,
166  monitor_ntracks, monitor_theta, monitor_eta, monitor_phi,
167  monitor_qoverp, monitor_nstates, monitor_phi, monitor_chi2, monitor_chi2OverNdof,
168  monitor_ndof, monitor_nstates, monitor_nmeas, monitor_noutliers, monitor_nholes, monitor_surftype,
169  monitor_nPixelHits, monitor_nStripHits);
170 
171  return StatusCode::SUCCESS;
172  }
173 
174 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
ActsTrk::TrackContainer
Definition: TrackContainer.h:31
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:392
ActsTrk::TrackAnalysisAlg::m_pixelID
const PixelID * m_pixelID
Definition: TrackAnalysisAlg.h:32
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
Monitored::detail::get_value_type< ActsTrk::TrackContainer >::value_type
ActsTrk::TrackContainer::TrackProxy value_type
Definition: TrackAnalysisAlg.cxx:11
ActsTrk::TrackAnalysisAlg::m_tracksKey
SG::ReadHandleKey< ActsTrk::TrackContainer > m_tracksKey
Definition: TrackAnalysisAlg.h:26
ActsTrk::TrackAnalysisAlg::m_stripID
const SCT_ID * m_stripID
Definition: TrackAnalysisAlg.h:33
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
xAOD::UncalibMeasType::StripClusterType
@ StripClusterType
ParticleTest.tp
tp
Definition: ParticleTest.py:25
ActsTrk::TrackAnalysisAlg::initialize
virtual StatusCode initialize() override
initialize
Definition: TrackAnalysisAlg.cxx:20
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
Monitored::detail::get_value_type
Get element type for containers.
Definition: MonitoredCollection.h:162
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
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:270
MonitoredCollection.h
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
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
TrackAnalysisAlg.h
UncalibratedMeasurementContainer.h
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
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
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
fill
void fill(H5::Group &out_file, size_t iterations)
Definition: test-hdf5-writer.cxx:95
xAOD::UncalibMeasType::nTypes
@ nTypes
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:55
ActsTrk::TrackAnalysisAlg::TrackAnalysisAlg
TrackAnalysisAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TrackAnalysisAlg.cxx:16
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
ActsTrk::TrackAnalysisAlg::m_monGroupName
Gaudi::Property< std::string > m_monGroupName
Definition: TrackAnalysisAlg.h:30
xAOD::UncalibMeasType::PixelClusterType
@ PixelClusterType
Identifier
Definition: IdentifierFieldParser.cxx:14