ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimGenScanMonitoring.h
Go to the documentation of this file.
1// Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3#ifndef FPGATrackSimGenScanMonitoring_H
4#define FPGATrackSimGenScanMonitoring_H
5
18
20#include "GaudiKernel/ServiceHandle.h"
21#include "GaudiKernel/ITHistSvc.h"
23
24#include "TGraph.h"
25class TH1D;
26class TH2D;
27
31
33
35
36
38 {
39 public:
40
42 // AthAlgTool
43
44 FPGATrackSimGenScanMonitoring(const std::string &, const std::string &, const IInterface *);
45
46 virtual StatusCode initialize() override;
47
48 // This is done at the start of execution to create all the graphs
49 // ... also stores some of the configuration parameters for later use
50 StatusCode registerHistograms(const FPGATrackSimBinnedHits* binnedhits);
53
54 // This is done at the end of event execution to store any graphs that were created
55 StatusCode registerGraphs();
56
57 // Simple accessors for directory
58 const std::string dir() const {return m_dir;}
59
60 // Takes the truthtracks as input and parses it into a useful form for later use
61 // (e.g. stores which bin the true track is in)
62 void parseTruthInfo(std::vector<FPGATrackSimTruthTrack> const * truthtracks, bool isSingleParticle);
63
64 // Fill methods
65 void fillHitLevelInput(const FPGATrackSimHit* hit);
69 void fillHitsByLayer(const std::vector<
70 std::vector<const FPGATrackSimBinUtil::StoredHit *>>
71 &hitsByLayer);
72 void fillPairingHits(std::vector<const FPGATrackSimBinUtil::StoredHit *> const *lastlyr,
73 std::vector<const FPGATrackSimBinUtil::StoredHit *> const *lastlastlyr);
74 void fillPairFilterCuts(const FPGATrackSimGenScanTool::HitPair &pair, double r_in, double r_out);
75 void fillPairSetFilterCut(std::vector<TH1D *> &histset, double val,
77 const FPGATrackSimGenScanTool::HitPair &lastpair,
78 bool nminus1);
79
80
81 void fillBinningSummary(const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits);
82
83 void fillBuildGroupsWithPairs(const std::vector<FPGATrackSimGenScanTool::IntermediateState>& states, unsigned allowed_misses);
84
85 // Error Checks
86 void sliceCheck();
88 const FPGATrackSimGenScanTool::HitPairSet& filteredpairs,
89 bool passedPairFilter);
91 const FPGATrackSimGenScanTool::HitPairSet &filteredpairs,
92 const std::vector<FPGATrackSimGenScanTool::HitPairSet> &pairsets,
93 unsigned threshold);
94
95 private:
97 // Handles
98 ServiceHandle<ITHistSvc> m_tHistSvc{this, "THistSvc", "THistSvc"};
99
101 // Properties
102 Gaudi::Property<std::string> m_dir{this, "dir", {"/GENSCAN/"}, "String name of output directory"};
103 Gaudi::Property<double> m_phiScale{this, "phiScale", {}, "Scale for Delta Phi variable"};
104 Gaudi::Property<double> m_etaScale{this, "etaScale", {}, "Scale for Delta Eta variable"};
105 Gaudi::Property<double> m_drScale{this, "drScale", {}, "Scale for radius differences"};
106
108 // Pointer to binned hits
110
111
113 // Parsed truth/info
114 std::vector<FPGATrackSimTruthTrack> const *m_truthtracks{nullptr};
115 bool m_isSingleParticle = false;
116 bool m_truthIsValid = false;
118 std::vector<FPGATrackSimBinUtil::IdxSet> m_truthbin;
120
121 // plots are only filled for the truth bin if single particle sample
122 // this gives the distributions of the cut variables when they are
123 // reconstructed in the right bin
126 // this flag governs if pair filter and pairset filter plots filled
127 bool m_binPlotsActive = false;
128
130 // Data Flow Counters
131 std::vector<unsigned> m_hitsCntByLayer;
132
134 // Histograms
135 std::vector<TH2D *> m_rZ_allhits;
136 TH1D *m_truthpars_hists[5] = {0, 0, 0, 0, 0};
137 std::vector<TH1D *> m_phiResidual;
138 std::vector<TH1D *> m_etaResidual;
139 std::vector<TH1D *> m_phiTrueBinShift;
140 std::vector<TH1D *> m_etaTrueBinShift;
141
142 TH1D *m_inputHits = 0;
143
144 // step-by-step plot
145 std::vector<TH1D *> m_hitsPerStepBin;
146 TH1D * m_hitsPerLayer = 0;
147 TH2D * m_hitsPerLayer2D = 0;
148 TH1D * m_numLyrsPerBin = 0;
149
151
156
157
158 TH1D *m_pairs = 0;
160 TH1D *m_pairsets = 0;
161
162 // Build Pairs with Groups
163 TH2D* m_unpairedHits = 0;
164 TH2D* m_pairsetsIncr = 0;
165 TH2D* m_pairsetsHits = 0;
168
169 TH1D *m_pairinghits = 0;
170
172
173 TH1D *m_deltaPhi = 0;
174 TH1D *m_deltaEta = 0;
175 TH1D *m_deltaPhiDR = 0;
176 TH1D *m_deltaEtaDR = 0;
177 TH1D *m_phiOutExtrap = 0;
178 TH1D *m_phiInExtrap = 0;
181 TH1D *m_etaOutExtrap = 0;
182 TH1D *m_etaInExtrap = 0;
183 std::vector<TH1D *> m_deltaPhiByLyr;
184 std::vector<TH1D *> m_deltaEtaByLyr;
185
186 // This classifies a pair of pairs into categories (described by m_twoPairClasses)
187 // for plotting the pair matching variables
188 // an extra category is tacked on the end to make n-1 plots
189 unsigned pairpairCategory(
191 const FPGATrackSimGenScanTool::HitPair &lastpair) const;
192 const static inline std::vector<std::string> m_twoPairClasses = {
193 "", "_same", "_sequential", "_sameend", "_skip1", "_skip2", "_nm1"};
194 unsigned m_nminus1_idx = 6;
195
196 public:
197 // These are exposed because of the fill mechanism
198 // FGPATrackSimGenScanTool needs to be pointers to all
199 // of them (not worth writing a bunch of accessors)
200 std::vector<TH1D *> m_deltaDeltaPhi;
201 std::vector<TH1D *> m_deltaDeltaEta;
202 std::vector<TH1D *> m_pairSetMatchPhi;
203 std::vector<TH1D *> m_pairSetMatchEta;
204 std::vector<TH1D *> m_phiCurvature;
205 std::vector<TH1D *> m_etaCurvature;
206 std::vector<TH1D *> m_deltaPhiCurvature;
207 std::vector<TH1D *> m_deltaEtaCurvature;
208 std::vector<TH1D *> m_phiCurvatureMax;
209 std::vector<TH1D *> m_etaCurvatureMax;
210 std::vector<TH1D *> m_phiInExtrapCurved;
211 std::vector<TH1D *> m_phiOutExtrapCurved;
212
213 private:
216
218 // Event Displays
219
220 // this struct creates, stores, and fills a set of TGraphs
221 // that act as event displays saving hits in 2-d plane variables
222 // both the standard FPGATrackSimHit R-Z and X-Y are saved,
223 // and for StoredHits in bins, R-Phi and R-Eta are stored using
224 // the FPGATrackSimGenScanTool phiShift and etaShift variables
225 // to show the distance from the bin's center to the hit
227 eventDispSet(std::string name, int maxevts)
228 : m_name(std::move(name)), m_maxEvts(maxevts) {}
229
230 TGraph *initGraph(const std::string &name);
231 void AddPoint(TGraph *g, double x, double y);
232
233 void addEvent(const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits);
234 void addEvent(const std::vector<FPGATrackSimBinUtil::StoredHit> &hits);
235 void addEvent(const std::vector<const FPGATrackSimBinUtil::StoredHit *> &hits);
236
238
239 private:
240 const std::string m_name;
241 const unsigned m_maxEvts{};
242
243 std::vector<TGraph *> m_rZ; // detector coordinates
244 std::vector<TGraph *> m_xY; // detector coordinates
245 std::vector<TGraph *> m_rEta; // road coordinates
246 std::vector<TGraph *> m_rPhi; // road coordinates
247 };
248
249 // Instantiate event displays for various points in the logical flow
250 eventDispSet m_allHitsGraph{std::string("allHits"), 10};
251 eventDispSet m_roadGraph{std::string("road"), 10};
252 eventDispSet m_lostPairFilterGraph{std::string("lostpairfilter"), 10};
253 eventDispSet m_passPairFilterGraph{std::string("passpairfilter"), 10};
254 eventDispSet m_lostPairSetFilterGraph{std::string("lostpairsetfilter"), 10};
255 eventDispSet m_passPairSetFilterGraph{std::string("passpairsetfilter"), 10};
256
257 // TTree for layer definitions studies
258 StatusCode bookTree();
259 void ClearTreeVectors();
260 TTree *m_bin_module_tree = nullptr; // output tree
261 std::vector<unsigned> m_tree_bin; // 5 tracks parameter bin
262 std::vector<float> m_tree_r;
263 std::vector<float> m_tree_z;
264 std::vector<int> m_tree_id;
265 std::vector<int> m_tree_hash;
266 std::vector<int> m_tree_layer;
267 std::vector<int> m_tree_side;
268 std::vector<int> m_tree_etamod;
269 std::vector<int> m_tree_phimod;
270 std::vector<int> m_tree_dettype;
271 std::vector<int> m_tree_detzone;
272
274 // make and register histogram or vector of histograms in one line...
275 template <typename HistType, typename... HistDef>
276 StatusCode makeAndRegHist(HistType *&ptr, const HistDef & ... histargs)
277 {
278 ptr = new HistType(histargs...);
279 ATH_MSG_DEBUG("Booking Hist: " << ptr->GetName() << " min=" << ptr->GetXaxis()->GetXmin() << " max=" << ptr->GetXaxis()->GetXmax());
280 ATH_CHECK(m_tHistSvc->regHist(m_dir + ptr->GetName(), ptr));
281 return StatusCode::SUCCESS;
282 }
283
284
285 template <typename HistType, typename... HistDef>
286 StatusCode makeAndRegHistVector(std::vector<HistType*>& vec, unsigned len, const std::vector<std::string>* namevec, const char* namebase, const HistDef & ... histargs)
287 {
288 if (vec.size()==0){
289 for (unsigned i = 0; i < len; i++) {
290 HistType *ptr = 0;
291 std::string name = std::string(namebase);
292 if (!namevec) {
293 name += std::to_string(i);
294 } else {
295 if (namevec->size()==len) {
296 name += (*namevec)[i];
297 } else {
298 return StatusCode::FAILURE;
299 }
300 }
301 ATH_CHECK(makeAndRegHist(ptr, name.c_str(), histargs...));
302 vec.push_back(ptr);
303 }
304 }
305 return StatusCode::SUCCESS;
306 }
307
308 // Register a graph
309 StatusCode regGraph(TGraph *g) const { return m_tHistSvc->regGraph(m_dir + g->GetName(), g);}
310
311 };
312
313#endif // FPGATrackSimGenScanMonitoring_H
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
std::vector< size_t > vec
Binning Utilities for GenScanTool.
Binning Classes for GenScanTool.
Implements a generalized 5d scan which filters pair of hits in bins linearized about nominal trajecto...
: FPGATrackSim-specific class to represent an hit in the detector.
Structs that store the 5 track parameters.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
#define y
#define x
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
void fillBinLevelOutput(const FPGATrackSimBinUtil::IdxSet &idx, const FPGATrackSimBinnedHits::BinEntry &data)
unsigned pairpairCategory(const FPGATrackSimGenScanTool::HitPair &pair, const FPGATrackSimGenScanTool::HitPair &lastpair) const
std::vector< FPGATrackSimBinUtil::IdxSet > m_truthbin
void fillPairingHits(std::vector< const FPGATrackSimBinUtil::StoredHit * > const *lastlyr, std::vector< const FPGATrackSimBinUtil::StoredHit * > const *lastlastlyr)
StatusCode makeAndRegHist(HistType *&ptr, const HistDef &... histargs)
FPGATrackSimGenScanMonitoring(const std::string &, const std::string &, const IInterface *)
const FPGATrackSimBinnedHits * m_binnedhits
void parseTruthInfo(std::vector< FPGATrackSimTruthTrack > const *truthtracks, bool isSingleParticle)
void fillPairFilterCuts(const FPGATrackSimGenScanTool::HitPair &pair, double r_in, double r_out)
void fillHitsByLayer(const std::vector< std::vector< const FPGATrackSimBinUtil::StoredHit * > > &hitsByLayer)
void fillBuildGroupsWithPairs(const std::vector< FPGATrackSimGenScanTool::IntermediateState > &states, unsigned allowed_misses)
void fillHitLevelInput(const FPGATrackSimHit *hit)
void pairSetFilterCheck(const FPGATrackSimGenScanTool::HitPairSet &filteredpairs, const std::vector< FPGATrackSimGenScanTool::HitPairSet > &pairsets, unsigned threshold)
void setBinPlotsActive(const FPGATrackSimBinUtil::IdxSet &idx)
static const std::vector< std::string > m_twoPairClasses
StatusCode makeAndRegHistVector(std::vector< HistType * > &vec, unsigned len, const std::vector< std::string > *namevec, const char *namebase, const HistDef &... histargs)
void fillBinningSummary(const std::vector< std::shared_ptr< const FPGATrackSimHit > > &hits)
std::vector< FPGATrackSimTruthTrack > const * m_truthtracks
StatusCode registerHistograms(const FPGATrackSimBinnedHits *binnedhits)
void pairFilterCheck(const FPGATrackSimGenScanTool::HitPairSet &pairs, const FPGATrackSimGenScanTool::HitPairSet &filteredpairs, bool passedPairFilter)
void fillPairSetFilterCut(std::vector< TH1D * > &histset, double val, const FPGATrackSimGenScanTool::HitPair &pair, const FPGATrackSimGenScanTool::HitPair &lastpair, bool nminus1)
STL class.
STL namespace.
void addEvent(const std::vector< std::shared_ptr< const FPGATrackSimHit > > &hits)