ATLAS Offline Software
Loading...
Searching...
No Matches
MuonTrackPerformanceAlg.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef MUONTRACKPERFORMANCEALG_H
6#define MUONTRACKPERFORMANCEALG_H
7
8#include <fstream>
9#include <iostream>
10#include <set>
11#include <string>
12#include <vector>
13
15#include "GaudiKernel/ServiceHandle.h"
16#include "GaudiKernel/ToolHandle.h"
34
35class TFile;
36class TruthTrajectory;
37
39
40namespace Trk {
41 class Track;
42 class TrackSummary;
43} // namespace Trk
44
45namespace Muon {
47 class MuonSegment;
48} // namespace Muon
49
51public:
52 struct ChamberData {
54 std::set<Identifier> hits;
55 };
56
57 struct TrackData {
59 truthTrack(nullptr),
60 motherPdg(-1),
61 chi2Ndof(0.),
62 productionVertex(nullptr),
63 momentumAtProduction(nullptr),
64 truthTrajectory(nullptr),
65 trackPars(nullptr),
66 trackSummary(nullptr) {}
67
69 delete trackPars;
70 delete trackSummary;
71 delete truthTrack;
72 delete truthTrajectory;
73 delete productionVertex;
75 }
76
78 motherPdg = data.motherPdg;
79 chi2Ndof = data.chi2Ndof;
80 trackPars = data.trackPars ? new Trk::Perigee(*data.trackPars) : 0;
81 trackSummary = data.trackSummary ? new Trk::TrackSummary(*data.trackSummary) : 0;
82 truthTrack = data.truthTrack ? new TrackRecord(*data.truthTrack) : 0;
83 productionVertex = data.productionVertex ? new Amg::Vector3D(*data.productionVertex) : 0;
84 momentumAtProduction = data.momentumAtProduction ? new Amg::Vector3D(*data.momentumAtProduction) : 0;
85 }
86 // no copying
87 TrackData& operator=(const TrackData&) = delete;
88
90 int motherPdg{};
91 double chi2Ndof{};
97
98 std::vector<ChamberData> missingChambers;
99 std::vector<ChamberData> wrongChambers;
100
101 std::set<Muon::MuonStationIndex::StIndex> layers;
102 std::set<Muon::MuonStationIndex::StIndex> missingLayers;
103 std::set<Muon::MuonStationIndex::StIndex> missingCscLayers;
104 std::set<Muon::MuonStationIndex::StIndex> wrongLayers;
105
106 std::set<Muon::MuonStationIndex::StIndex> layersTrigger;
107 std::set<Muon::MuonStationIndex::StIndex> missingLayersTrigger;
108 std::set<Muon::MuonStationIndex::StIndex> wrongLayersTrigger;
109
110 bool isEndcapSLTrack() const {
111 if (layers.size() == 1 && layers.count(Muon::MuonStationIndex::StIndex::EM)) return true;
112 if (layers.size() == 2 && layers.count(Muon::MuonStationIndex::StIndex::EM) &&
113 layers.count(Muon::MuonStationIndex::StIndex::EO)) return true;
114 return false;
115 }
116
117 bool hasMissingChambers() const { return !missingChambers.empty(); }
118
119 bool hasWrongChambers() const { return !wrongChambers.empty(); }
120
121 bool hasMissingLayers() const { return !missingLayers.empty(); }
122
123 bool hasWrongLayers() const { return !wrongLayers.empty(); }
124
125 bool hasMissingLayersTrigger() const { return !missingLayersTrigger.empty(); }
126
127 bool hasWrongLayersTrigger() const { return !wrongLayersTrigger.empty(); }
128
129 bool isMissingInner() const {
130 if (missingLayers.count(Muon::MuonStationIndex::StIndex::EI) ||
131 missingLayers.count(Muon::MuonStationIndex::StIndex::BI)) return true;
132 return false;
133 }
134
135 bool hasWrongInner() const {
136 if (wrongLayers.count(Muon::MuonStationIndex::StIndex::EI) ||
137 wrongLayers.count(Muon::MuonStationIndex::StIndex::BI)) return true;
138 return false;
139 }
140
141 bool allOk() const {
142 if (!missingChambers.empty() || !wrongChambers.empty()) return false;
143 if (!missingLayers.empty() || !wrongLayers.empty()) return false;
144 if (!missingLayersTrigger.empty() || !wrongLayersTrigger.empty()) return false;
145 return true;
146 }
147
148 private:
149
150 };
151
152 struct EventData {
153 unsigned int eventNumber{};
154 unsigned int eventPosition{};
155 std::vector<TrackData*> missingTruthTracks;
156 std::vector<TrackData*> missingTruthTracksOneStation;
157
158 std::vector<TrackData*> missingStationMomLoss;
159
160 std::vector<TrackData*> missingStationLayer;
161 std::vector<TrackData*> missingCscStationLayer;
162 std::vector<TrackData*> missingStation;
163
164 std::vector<TrackData*> wrongStationLayer;
165 std::vector<TrackData*> wrongStation;
166
167 std::vector<TrackData*> missingStationLayerTrigger;
168 std::vector<TrackData*> wrongStationLayerTrigger;
169
170 std::vector<TrackData*> fakeTracks;
171 std::vector<TrackData*> fakeTracksLowPt;
172 std::vector<TrackData*> fakeTracksSL;
173
174 bool goodEvent() const {
175 return missingTruthTracks.empty() && missingTruthTracksOneStation.empty() && missingStationMomLoss.empty() &&
176 missingStationLayer.empty() && missingStation.empty() && wrongStationLayer.empty() && wrongStation.empty() &&
177 fakeTracks.empty() && fakeTracksLowPt.empty() && fakeTracksSL.empty();
178 }
179 };
180
181 MuonTrackPerformanceAlg(const std::string& name, ISvcLocator* pSvcLocator);
182
183public:
184 virtual ~MuonTrackPerformanceAlg();
185
186 virtual StatusCode initialize() override;
187 virtual StatusCode execute() override;
188 virtual StatusCode finalize() override;
189
190 virtual unsigned int cardinality() const override final { return 1;}
191
192private:
193 void extractEtaPhiCounts(const std::set<Identifier>& ids, int& neta, int& nphi, int& netaCh, int& nphiCh) const;
194
195 bool handleTracks();
196 bool handleTrackTruth(const TrackCollection& trackCollection);
197
199
200 void doSummary(const TrackCollection& tracks) const;
201 void doSummary(const Muon::IMuonTrackTruthTool::TruthTree& truthTracks) const;
202
203 std::string print(const Muon::IMuonTrackTruthTool::TruthTreeEntry& trackTruth) const;
204
205 std::string eventInfo() const;
206 int eventNumber() const;
207
208 void printMissingChambers() const;
209 void printMissingTracks() const;
210 void printFakeTracks() const;
211
213 std::pair<int, int> countHitsInChamber(const Identifier& chId, const std::set<Identifier>& hitIds) const;
214
216 bool insertChamber(const Identifier& chId, const std::set<Identifier>& hits, int minEtaHits, int minPhiHits,
217 ChamberData& chamberData) const;
218
220 bool insertTechnology(const std::set<Identifier>& chIds, const std::set<Identifier>& hits, int minEtaHits, int minPhiHits,
221 std::vector<ChamberData>& chamberData) const;
222
224 bool insertStationLayers(const std::set<Identifier>& chIds, const std::set<Muon::MuonStationIndex::StIndex>& exclusionList,
225 std::set<Muon::MuonStationIndex::StIndex>& layers) const;
226
228 bool insertStationLayers(const std::vector<ChamberData>& chambers, const std::set<Muon::MuonStationIndex::StIndex>& exclusionList,
229 std::set<Muon::MuonStationIndex::StIndex>& layers, bool usePrecision) const;
230
233
236
237 void addTrackToTrackData(const Trk::Track& track, TrackData& trackData) const;
238
240 std::string print(const TrackData& trackData) const;
241
242 std::string print(const EventData& event, const std::vector<TrackData*>& tracks, const std::string& message) const;
243 std::string print(const EventData& event, const std::vector<const Trk::Track*>& tracks, const std::string& message) const;
244
246 std::string printTrackCounters(bool doSecondaries = true) const;
247
248 void clearTracks(std::vector<const Trk::Track*> tracks);
249 void clearTracks(std::vector<TrackData*> tracks);
250 void clearEvent(EventData& event);
251
254
256 bool isSecondary(const Muon::MuonTrackTruth& truthTrack) const;
258 bool isSecondary(const TruthTrajectory& truthTrajectory) const;
259
260 bool selectPdg(int pdg) const { return m_selectedPdgs.count(pdg); }
261
262 SG::ReadHandleKey<TrackCollection> m_trackKey{this, "TrackInputLocation", "MuonSpectrometerTracks",
263 "input tracks"};
264 SG::ReadHandleKey<xAOD::MuonContainer> m_muons{this, "MuonLocation", "Muons", "input muons"}; // muons for cases other than MS tracks
265 SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey{this, "EventInfoKey", "EventInfo", "EventInfo key"};
267
268 // truth readHandles
269 SG::ReadHandleKey<McEventCollection> m_mcEventColl{this, "McEventCollectionKey", "TruthEvent", "McEventCollection"};
271 this, "MuonSimDataNames", {"MDT_SDO", "RPC_SDO", "TGC_SDO", "sTGC_SDO", "MM_SDO"}, "Muon SDO maps"};
272 SG::ReadHandleKey<CscSimDataCollection> m_cscSimData{this, "CSC_SDO_Container", "CSC_SDO", "CSC SDO"};
273 SG::ReadHandleKey<TrackRecordCollection> m_trackRecord{this, "TrackRecord", "MuonEntryLayerFilter", "Track Record Collection"};
274
275 // member set by Joboptions
279 bool m_doTruth{};
287 bool m_doStau{};
288
289 ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
290
291 PublicToolHandle<Muon::MuonEDMPrinterTool> m_printer{this, "Printer", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"};
292
293 ServiceHandle<Muon::IMuonEDMHelperSvc> m_edmHelperSvc{this, "edmHelper", "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
294 "Handle to the service providing the IMuonEDMHelperSvc interface"};
295
296
297 ToolHandle<Muon::IMuonTrackTruthTool> m_truthTool{this, "TrackTruthTool",""};
298 ToolHandle<Trk::ITrackSummaryHelperTool> m_summaryHelperTool{this, "SummaryHelperTool", ""};
302
313
314 unsigned int m_nevents{};
315 unsigned int m_ntracks{};
316
317 unsigned int m_nmatchedTracks{};
319 unsigned int m_nmatchedFakeTracks{};
320
321 unsigned int m_nfakeTracks{};
322 unsigned int m_nfakeTracksHighPt{};
323 unsigned int m_nfakeTracksLowPt{};
324 unsigned int m_nfakeTracksSL{};
325
326 unsigned int m_nmissedTracks{};
328
331
336 unsigned int m_nmissingStation{};
337
338 unsigned int m_nwrongStationLayer{};
340 unsigned int m_nwrongStation{};
341
342 unsigned int m_ntruthTracks{};
344
346 std::string trackPars;
347 std::string chambers;
348 std::vector<std::string> missingChambers;
349 };
350
352 std::string eventNumber;
353 std::vector<TrackSummary> trackSummary;
354 };
355
356 void printSummary(const std::vector<EventSummary>& summary, std::string typeName) const;
357
358 std::vector<EventData> m_badEvents;
359
361 std::string m_fileName;
362
364 std::ofstream m_fileOutput;
365
366 IntegerArrayProperty m_pdgsToBeConsidered;
367 std::set<int> m_selectedPdgs; // set storing particle PDG's considered for matching
368
369 // type of track (based on enum defined in Muon_v1.h)
371 std::string m_trackTypeString;
372};
373
374#endif // MUONTRACKPERFORMANCEALG_H
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
Property holding a SG store/key/clid from which a ReadHandle is made.
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
HepMC::ConstGenParticlePtr getMother(const TruthTrajectory &traj) const
void addTrackToTrackData(const Trk::Track &track, TrackData &trackData) const
void printSummary(const std::vector< EventSummary > &summary, std::string typeName) const
SG::ReadHandleKey< McEventCollection > m_mcEventColl
ToolHandle< Trk::ITrackSummaryHelperTool > m_summaryHelperTool
void clearTracks(std::vector< const Trk::Track * > tracks)
TrackData * createTrackData(const Muon::IMuonTrackTruthTool::TruthTreeEntry &trackTruth) const
create track data object for truth track
void extractEtaPhiCounts(const std::set< Identifier > &ids, int &neta, int &nphi, int &netaCh, int &nphiCh) const
std::string print(const Muon::IMuonTrackTruthTool::TruthTreeEntry &trackTruth) const
std::pair< int, int > countHitsInChamber(const Identifier &chId, const std::set< Identifier > &hitIds) const
counts number of eta (first number) and phi (second number in pair) hits in the set of hit IDs in the...
ServiceHandle< Muon::IMuonEDMHelperSvc > m_edmHelperSvc
bool insertChamber(const Identifier &chId, const std::set< Identifier > &hits, int minEtaHits, int minPhiHits, ChamberData &chamberData) const
insert chamber information into ChamberData if hits counts pass cuts, returns true if anything was in...
ToolHandle< Muon::IMuonTrackTruthTool > m_truthTool
bool isSecondary(const Muon::MuonTrackTruth &truthTrack) const
IntegerArrayProperty m_pdgsToBeConsidered
bool goodTruthTrack(const Muon::IMuonTrackTruthTool::TruthTreeEntry &entry) const
std::string m_fileName
name of external file to write statistics
bool handleTrackTruth(const TrackCollection &trackCollection)
SG::ReadHandleKeyArray< MuonSimDataCollection > m_muonSimData
const xAOD::EventInfo * m_eventInfo
pointer to the event info
void doSummary(const TrackCollection &tracks) const
virtual StatusCode finalize() override
virtual StatusCode execute() override
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
SG::ReadHandleKey< TrackRecordCollection > m_trackRecord
SG::ReadHandleKey< CscSimDataCollection > m_cscSimData
MuonTrackPerformanceAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::MuonContainer > m_muons
PublicToolHandle< Muon::MuonEDMPrinterTool > m_printer
SG::ReadHandleKey< TrackCollection > m_trackKey
Location of the input tracks.
bool insertStationLayers(const std::set< Identifier > &chIds, const std::set< Muon::MuonStationIndex::StIndex > &exclusionList, std::set< Muon::MuonStationIndex::StIndex > &layers) const
insert station layers into layer set if they are not in exclusion list
TrackData * evaluateTrackTruthOverlap(const Muon::MuonTrackTruth &truthTrack) const
evaluate track/truth overlap and create the corresponding overlap description object
bool handleSegmentCombi(const Muon::MuonSegmentCombination &combi)
bool insertTechnology(const std::set< Identifier > &chIds, const std::set< Identifier > &hits, int minEtaHits, int minPhiHits, std::vector< ChamberData > &chamberData) const
insert set of chambers into chamber data if hits counts pass cuts, returns true if anything was inser...
virtual StatusCode initialize() override
std::ofstream m_fileOutput
output file
HepMC::ConstGenParticlePtr getInitialState(const TruthTrajectory &traj) const
virtual unsigned int cardinality() const override final
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
std::vector< EventData > m_badEvents
std::string printTrackCounters(bool doSecondaries=true) const
print all the track counters to a string to provide a summary
std::map< int, TruthTreeEntry > TruthTree
Class to hold a set of MuonSegments belonging together.
This is the common class for 3D segments used in the muon spectrometer.
Property holding a SG store/key/clid from which a ReadHandle is made.
A summary of the information contained by a track.
A TruthTrajectory is a chain of charged MC particles connected through the mother-daughter relationsh...
Eigen::Matrix< double, 3, 1 > Vector3D
const GenParticle * ConstGenParticlePtr
Definition GenParticle.h:38
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
HandleKeyArray< ReadHandle< T >, ReadHandleKey< T >, Gaudi::DataHandle::Reader > ReadHandleKeyArray
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
EventInfo_v1 EventInfo
Definition of the latest event info version.
std::vector< TrackData * > missingStationLayerTrigger
std::vector< TrackData * > missingStationMomLoss
std::vector< TrackData * > wrongStationLayer
std::vector< TrackData * > missingCscStationLayer
std::vector< TrackData * > missingStationLayer
std::vector< TrackData * > missingTruthTracksOneStation
std::vector< TrackData * > wrongStationLayerTrigger
std::vector< TrackData * > missingTruthTracks
std::set< Muon::MuonStationIndex::StIndex > wrongLayers
std::set< Muon::MuonStationIndex::StIndex > layersTrigger
std::set< Muon::MuonStationIndex::StIndex > missingLayers
std::set< Muon::MuonStationIndex::StIndex > missingCscLayers
std::set< Muon::MuonStationIndex::StIndex > missingLayersTrigger
std::set< Muon::MuonStationIndex::StIndex > layers
std::set< Muon::MuonStationIndex::StIndex > wrongLayersTrigger
std::vector< ChamberData > missingChambers
TrackData & operator=(const TrackData &)=delete