ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimGenScanMonitoring.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
9
14#include "TH1D.h"
15#include "TH2D.h"
16#include "TTree.h"
17#include <bit>
18
20
21FPGATrackSimGenScanMonitoring::FPGATrackSimGenScanMonitoring(const std::string& algname, const std::string &name, const IInterface *ifc) :
22 AthAlgTool(algname, name, ifc)
23{
24}
25
27{
28 // Dump the configuration to make sure it propagated through right
29 auto props = this->getProperties();
30 for( Gaudi::Details::PropertyBase* prop : props ) {
31 if (prop->ownerTypeName()==this->type()) {
32 ATH_MSG_DEBUG("Property:\t" << prop->name() << "\t : \t" << prop->toString());
33 }
34 }
35
36 ATH_CHECK(m_tHistSvc.retrieve());
37
39
40 return StatusCode::SUCCESS;
41
42}
43
45{
46 m_binnedhits = binnedhits;
47 const FPGATrackSimBinTool &bintool = m_binnedhits->getBinTool();
48 const IFPGATrackSimBinDesc* bindesc = bintool.binDesc();
49 int nLyrs = m_binnedhits->getNLayers();
50
51 // This is because if you change the binning class you can change what axis
52 // ranges you need for the plotting
53 ATH_MSG_INFO("Hist scales phi: " << m_phiScale << " eta: " << m_etaScale << " dr:" << m_drScale);
54
56
57 // Truth Parameter distributions, bounds should cover 3x nominal range
58 for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++) {
60 m_truthpars_hists[i], ("truth" + bindesc->parNames(i)).c_str(),
61 (";" + m_binnedhits->getBinTool().binDesc()->parNames(i) + ";").c_str(), 200,
62 -2 * m_binnedhits->getBinTool().parRange(i),
63 2 * m_binnedhits->getBinTool().parRange(i)));
64 }
65
66 // All Hit level histograms
68 "RZ_allhits", "; Z [mm] ; R [mm] ", 500, -2000, 2000, 500, 0, 500));
69
71 "phiResidual", "phi residual [mm]", 1000, -10, 10));
73 "etaResidual", "eta residual [mm]", 1000, -10, 10));
74
76 "phiTrueBinShift", "phi TrueBinShift [mm]", 1000, -10, 10));
78 "etaTrueBinShift", "eta TrueBinShift [mm]", 1000, -10, 10));
79
80 // Data flow hists
82 makeAndRegHist(m_inputHits, "InputHits", ";Input Hits", 200, 0, 100000));
84 &bintool.stepNames(), "hitsPerStepBin_",
85 "; Hits per bin in step", 1000, 0, 1000));
86 ATH_CHECK(makeAndRegHist(m_pairs, "pairs", ";pairs;", 100, 0, 500));
87 ATH_CHECK(makeAndRegHist(m_pairinghits, "pairinghits", ";Pairing Hits;", 50,
88 0, 50));
89 ATH_CHECK(makeAndRegHist(m_filteredpairs, "filteredpairs", "filteredpairs",
90 100, 0, 500));
91 ATH_CHECK(makeAndRegHist(m_pairsets, "pairsets", ";pairsets;", 100, 0, 100));
93 ";#Hit Layers per Bin", nLyrs + 1, 0, nLyrs + 1));
94 ATH_CHECK(makeAndRegHist(m_hitsPerLayer, "hitsPerLayer", "; Layer ; Hits ",
95 nLyrs, 0, nLyrs));
97 "; Layer ; Hits ", nLyrs, 0, nLyrs, 20, 0,
98 m_isSingleParticle ? 20 : 10000));
99
100
101 // Road statistics
102 ATH_CHECK(makeAndRegHist(m_roadFilterFlow , "roadFilterFlow" , "road filter flow", 10, 0, 10));
103 ATH_CHECK(makeAndRegHist(m_phiShift_road, "phiShift_road", ";Phi Shift", 2000, -1.0*m_phiScale, m_phiScale));
104 ATH_CHECK(makeAndRegHist(m_etaShift_road, "etaShift_road", ";Eta Shift", 2000, -1.0*m_etaScale, m_etaScale));
105 ATH_CHECK(makeAndRegHist(m_phiShift2D_road, "phiShift2D_road", ";Phi Shift; R",
106 400, -1.0*m_phiScale, m_phiScale, 100, 0, 400));
107 ATH_CHECK(makeAndRegHist(m_etaShift2D_road, "etaShift2D_road", ";Phi Shift; R",
108 400, -1.0*m_etaScale, m_etaScale, 100, 0, 400));
109
110 ATH_CHECK(makeAndRegHist(m_hitsPerLayer_bin, "HitsPerLayer_bin",
111 "; Layer; Hits in Bin Passing Threshold",
112 nLyrs, 0, nLyrs, 20, 0, 20));
113
114
115 // Pair Filter Cuts
116 ATH_CHECK(makeAndRegHist(m_phiOutExtrap, "PhiOutExtrap", ";Phi Out Extrap", 2000, -1.0*m_phiScale, m_phiScale));
117 ATH_CHECK(makeAndRegHist(m_phiInExtrap, "PhiInExtrap", ";Phi In Extrap", 2000, -1.0*m_phiScale, m_phiScale));
118 ATH_CHECK(makeAndRegHist(m_phiOutExtrapCurveLimit, "PhiOutExtrapCurveLimit",
119 ";Phi Out Extrap w/ Curve Limit", 2000, -1.0*m_phiScale, m_phiScale));
120 ATH_CHECK(makeAndRegHist(m_phiInExtrapCurveLimit, "PhiInExtrapCurveLimit",
121 ";Phi In Extrap w/ Curve Limit", 2000, -1.0*m_phiScale, m_phiScale));
122 ATH_CHECK(makeAndRegHist(m_etaOutExtrap, "EtaOutExtrap", ";Eta Out Extrap", 2000, -1.0*m_etaScale, m_etaScale));
123 ATH_CHECK(makeAndRegHist(m_etaInExtrap, "EtaInExtrap", ";Eta In Extrap", 2000, -1.0* m_etaScale, m_etaScale));
124 ATH_CHECK(makeAndRegHist(m_deltaPhi, "DeltaPhi", ";Delta Phi [rad]", 2000, -1.0*m_phiScale, m_phiScale));
125 ATH_CHECK(makeAndRegHist(m_deltaEta, "DeltaEta", ";Delta Eta [rad]", 2000, -1.0*m_etaScale, m_etaScale));
126 ATH_CHECK(makeAndRegHist(m_deltaPhiDR, "DeltaPhiDR", ";Delta Phi / Delta R", 2000, -0.1 * m_phiScale, 0.1 * m_phiScale));
127 ATH_CHECK(makeAndRegHist(m_deltaEtaDR, "DeltaEtaDR", ";Delta Eta / Delta R", 2000, -0.1 * m_phiScale, 0.1 * m_phiScale));
128 ATH_CHECK(makeAndRegHistVector(m_deltaPhiByLyr, nLyrs, NULL, "DeltaPhiDR", ";Delta Phi / Delta R", 2000, -0.1 * m_phiScale, 0.1 * m_phiScale));
129 ATH_CHECK(makeAndRegHistVector(m_deltaEtaByLyr, nLyrs, NULL, "DeltaEtaDR", ";Delta Eta / Delta R", 2000, -0.1 * m_phiScale, 0.1 * m_phiScale));
130
131 // Pair Match Cuts
134 "PairSetMatchPhi", ";PairSet Match Phi [mm]", 500,
138 "PairSetMatchEta", ";PairSet Match Eta [mm]", 500,
142 "DeltaDeltaPhi", ";DeltaDelta Phi [mm]", 500, -1.0*m_phiScale / m_drScale,
146 "DeltaDeltaEta", ";DeltaDelta Eta [mm]", 500, -1.0 * m_etaScale / m_drScale,
147 1.0 * m_etaScale / m_drScale));
149 &m_twoPairClasses, "PhiCurvature",
150 ";Phi Curvature ", 5000,
151 -1.0 * m_phiScale / m_drScale / m_drScale,
152 1.0 * m_phiScale / m_drScale / m_drScale));
154 &m_twoPairClasses, "EtaCurvature",
155 ";Eta Curvature ", 5000,
156 -1.0 * m_etaScale / m_drScale / m_drScale,
157 1.0 * m_etaScale / m_drScale / m_drScale));
159 &m_twoPairClasses, "DeltaPhiCurvature",
160 ";Delta Phi Curvature ", 5000,
161 -1.0 * m_phiScale / m_drScale / m_drScale,
162 1.0 * m_phiScale / m_drScale / m_drScale));
164 &m_twoPairClasses, "DeltaEtaCurvature",
165 ";Delta Eta Curvature ", 500,
166 -0.1 * m_etaScale / m_drScale / m_drScale,
167 0.1 * m_etaScale / m_drScale / m_drScale));
169 &m_twoPairClasses, "PhiOutExtrapCurved",
170 ";Phi Out Extrap Curved", 2000, -1.0*m_phiScale,
171 m_phiScale));
173 &m_twoPairClasses, "PhiInExtrapCurved",
174 ";Phi In Extrap Curved ", 2000, -1.0*m_phiScale,
175 m_phiScale));
176 ATH_CHECK(makeAndRegHist(m_pairMatchPhi2D, "PairSetMatchPhi2D",
177 ";PairSet Match Phi vs dRin [mm]", 100, 0, 100, 500,
178 -100.0 * m_phiScale, 100.0 * m_phiScale));
179 ATH_CHECK(makeAndRegHist(m_pairMatchEta2D, "PairSetMatchEta2D",
180 ";PairSet Match Eta vs dRin [mm]", 100, 0, 100, 500,
181 -100.0 * m_etaScale, 100.0 * m_etaScale));
182
183 ATH_CHECK(makeAndRegHist(m_unpairedHits, "UnpairedHits", "; Stage ; Unpaired Hits" , nLyrs+1, 0, nLyrs+1, 20, 0, 20));
184 ATH_CHECK(makeAndRegHist(m_pairsetsIncr, "PairSetsIncr", "; Stage ; Pairsets" , nLyrs+1, 0, nLyrs+1, 20, 0, 20));
185 ATH_CHECK(makeAndRegHist(m_pairsetsHits, "PairSetsHits", "; Stage ; Hits in Pairsets" , nLyrs+1, 0, nLyrs+1, 20, 0, 20));
186 ATH_CHECK(makeAndRegHist(m_totalInputIncr, "TotalInputIncr", "; Stage ; Pairsets+Unpaired" , nLyrs+1, 0, nLyrs+1, 20, 0, 20));
187 ATH_CHECK(makeAndRegHist(m_binStagesIncr, "BinStagesIncr", "; Stage ; Bins at this point" , nLyrs+1, 0, nLyrs+1, 20, 0, 20));
188
189 return StatusCode::SUCCESS;
190}
191
192
194 ATH_MSG_DEBUG("Booking Layers Study Tree");
195 m_bin_module_tree = new TTree("LayerStudy","LayerStudy");
196 m_bin_module_tree->Branch("bin", &m_tree_bin);
197 m_bin_module_tree->Branch("r", &m_tree_r);
198 m_bin_module_tree->Branch("z", &m_tree_z);
199 m_bin_module_tree->Branch("id", &m_tree_id);
200 m_bin_module_tree->Branch("hash", &m_tree_hash);
201 m_bin_module_tree->Branch("layer", &m_tree_layer);
202 m_bin_module_tree->Branch("side", &m_tree_side);
203 m_bin_module_tree->Branch("etamod", &m_tree_etamod);
204 m_bin_module_tree->Branch("phimod", &m_tree_phimod);
205 m_bin_module_tree->Branch("dettype", &m_tree_dettype);
206 m_bin_module_tree->Branch("detzone", &m_tree_detzone);
207
209 return StatusCode::SUCCESS;
210}
212{
213 m_tree_r.clear();
214 m_tree_z.clear();
215 m_tree_id.clear();
216 m_tree_hash.clear();
217 m_tree_layer.clear();
218 m_tree_side.clear();
219 m_tree_etamod.clear();
220 m_tree_phimod.clear();
221 m_tree_dettype.clear();
222 m_tree_detzone.clear();
223}
224
225
229
233
234
235// This is done at the end of event execution to store any graphs that were created
237{
238 // Make a vector of pointers to all the eventDispSet instances...
239 std::vector<FPGATrackSimGenScanMonitoring::eventDispSet *> allsets(
243
244 // Then loop to register them all
245 for (auto& set : allsets) {
246 ATH_CHECK(set->registerGraphs(this));
247 }
248
249 return StatusCode::SUCCESS;
250}
251
252
255{
257
258 m_roadGraph.addEvent(data.hits);
259
260 if (m_binPlotsActive) {
261 for (auto& hit : data.hits) {
262 m_phiShift_road->Fill(hit.phiShift);
263 m_etaShift_road->Fill(hit.etaShift);
264 m_phiShift2D_road->Fill(hit.phiShift, hit.hitptr->getR());
265 m_etaShift2D_road->Fill(hit.etaShift, hit.hitptr->getR());
266 }
267
268 // Module mapping and Layer definition studies
269 // first sort hits by r+z radii
270 std::vector<FPGATrackSimBinUtil::StoredHit> sorted_hits = data.hits;
271 std::sort(sorted_hits.begin(), sorted_hits.end(),
272 [](const auto &hit1, const auto &hit2) {
273 return hit1.rzrad() < hit2.rzrad();
274 });
275
276 // Fill tree
277 m_tree_bin = std::vector<unsigned>(idx);
279 for (auto &hit : sorted_hits) {
280 m_tree_r.push_back(hit.hitptr->getR());
281 m_tree_z.push_back(hit.hitptr->getZ());
282 m_tree_id.push_back(hit.hitptr->getIdentifier());
283 m_tree_hash.push_back(hit.hitptr->getIdentifierHash());
284 m_tree_layer.push_back(hit.hitptr->getLayerDisk());
285 m_tree_side.push_back(hit.hitptr->getSide());
286 m_tree_etamod.push_back(hit.hitptr->getEtaModule());
287 m_tree_phimod.push_back(hit.hitptr->getPhiModule());
288 m_tree_dettype.push_back((int)hit.hitptr->getDetType());
289 m_tree_detzone.push_back((int)hit.hitptr->getDetectorZone());
290 }
291 ATH_MSG_DEBUG("For tree, bin=" << idx << " mods=" << m_tree_hash);
292 m_bin_module_tree->Fill();
293 }
294}
295
297 const std::vector<std::vector<const FPGATrackSimBinUtil::StoredHit *> > & hitsByLayer)
298{
299 for (unsigned lyr = 0; lyr < m_binnedhits->getNLayers(); lyr++)
300 {
301 m_hitsPerLayer_bin->Fill(lyr, hitsByLayer[lyr].size());
302 }
303}
304
306 const FPGATrackSimHit *hit) {
307 const IFPGATrackSimBinDesc* bindesc = m_binnedhits->getBinTool().binDesc();
308 m_rZ_allhits[m_binnedhits->getNLayers()]->Fill(hit->getZ(), hit->getR()); // all layer plot
309 m_rZ_allhits[hit->getLayer()]->Fill(hit->getZ(), hit->getR()); // layer specific plot
310 if (m_truthIsValid)
311 {
312 m_etaResidual[m_binnedhits->getNLayers()]->Fill(bindesc->etaResidual(m_truthparset, hit));
313 m_etaResidual[hit->getLayer()]->Fill(bindesc->etaResidual(m_truthparset, hit));
314 m_phiResidual[m_binnedhits->getNLayers()]->Fill(bindesc->phiResidual(m_truthparset, hit));
315 m_phiResidual[hit->getLayer()]->Fill(bindesc->phiResidual(m_truthparset, hit));
316
318 FPGATrackSimBinUtil::ParSet binCenter = m_binnedhits->getBinTool().lastStep()->binCenter(m_truthbin.back());
319 m_etaTrueBinShift[m_binnedhits->getNLayers()]->Fill(bindesc->etaResidual(binCenter, hit));
320 m_etaTrueBinShift[hit->getLayer()]->Fill(bindesc->etaResidual(binCenter, hit));
321 m_phiTrueBinShift[m_binnedhits->getNLayers()]->Fill(bindesc->phiResidual(binCenter, hit));
322 m_phiTrueBinShift[hit->getLayer()]->Fill(bindesc->phiResidual(binCenter, hit));
323 }
324 }
325}
326
327
330 const FPGATrackSimGenScanTool::HitPairSet &filteredpairs,
331 bool passedPairFilter) {
332
333 m_roadFilterFlow->Fill(0);
334 m_pairs->Fill(pairs.pairList.size());
335 m_filteredpairs->Fill(filteredpairs.pairList.size());
336
337 if (passedPairFilter) {
338 // if passed mark progress in flow histogram and make passed Histogram
339 m_roadFilterFlow->Fill(1);
340 m_passPairFilterGraph.addEvent(filteredpairs.hitlist);
341 } else {
342 // If the true bin didn't pass print some debug and make a lost event
343 // display
344 if (m_binPlotsActive) {
345 ATH_MSG_INFO("lost at pair filter : hit layers = "
346 << filteredpairs.lyrCnt() << " "
347 << std::bitset<16>(filteredpairs.hitLayers));
348 m_lostPairFilterGraph.addEvent(pairs.hitlist);
349 }
350 }
351}
352
354 const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits)
355{
356 m_inputHits->Fill(hits.size());
357 m_allHitsGraph.addEvent(hits);
358
359 for (auto &step : m_binnedhits->getBinTool().steps()) {
360 for (auto bin : m_binnedhits->binnedHits()[step->stepNum()])
361 m_hitsPerStepBin[step->stepNum()]->Fill(bin.data().hitCnt);
362 }
363
364 for (auto bin :m_binnedhits->binnedHits()[m_binnedhits->getBinTool().lastStep()->stepNum()]) {
365 for (unsigned lyr = 0; lyr < m_binnedhits->getNLayers(); lyr++) {
366 unsigned cnt = bin.data().hitsInLyr(lyr);
367 m_hitsPerLayer->Fill(lyr, cnt);
368 m_hitsPerLayer2D->Fill(lyr, cnt);
369 }
370 }
371}
372
373
375 std::vector<FPGATrackSimTruthTrack> const * truthtracks, bool isSingleParticle)
376{
377 ATH_MSG_DEBUG("In parseTruthInfo ptr = " << truthtracks
378 << " size = " << (truthtracks ? truthtracks->size() : 0));
379 m_isSingleParticle = isSingleParticle;
380 m_truthtracks = truthtracks;
381 m_truthIsValid = false;
382
383 const IFPGATrackSimBinDesc* bindesc = m_binnedhits->getBinTool().binDesc();
384
385 if (!m_truthtracks) return;
386 if (m_truthtracks->size() == 0) return;
387
388 // Convert to binning parameters and find truth bin for each step
389 m_truthpars = (*m_truthtracks)[0].getPars();
393 m_truthbin.clear();
394 for (auto &step : m_binnedhits->getBinTool().steps()) {
395 m_truthbin.push_back(step->binIdx(m_truthparset));
396 }
397
398 // histogram parameters
399 for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++) {
400 m_truthpars_hists[i]->Fill(m_truthparset[i]);
401 }
402
403 // a closure test
405 ATH_MSG_DEBUG("truth parset:" << m_truthparset << " " << m_truthpars
406 << " ?= " << recovered << " closure:"
412
413 // print if there are multiple tracks for debugging single track MC
414 if (m_truthtracks->size() > 1) {
415 for (unsigned i = 0; i < m_truthtracks->size(); i++) {
416 ATH_MSG_DEBUG("Multiple truth" << i << " of " << m_truthtracks->size()
417 << " " << (*m_truthtracks)[i].getPars());
418 }
419 }
420
421 // find truth bin for later plotting selections
422 ATH_MSG_DEBUG("truthbin " << m_truthtracks << " " << m_truthtracks->size()
423 << " " << m_truthpars << " " << m_truthbin);
424
425 // Check if the truth track falls in the binning range
426 if (!m_binnedhits->getBinTool().inRange(m_truthparset)) {
427 ATH_MSG_INFO("Truth out of range");
428 return;
429 }
430
431 // Check that truth track falls in an actual bin
432 // this should alway pass, except for weird events
433 m_truthIsValid = true;
434 for (auto &step : m_binnedhits->getBinTool().steps()) {
435 if (!step->validBinsFull()[m_truthbin[step->stepNum()]]) {
436 ATH_MSG_INFO("Truth Bin not valid! Step " << step->stepName() << " "
437 << m_truthbin[step->stepNum()]
438 << " : " << m_truthpars);
439 std::vector<FPGATrackSimBinUtil::IdxSet> idxsets =
441 std::vector<unsigned>({0, 1, 2, 3, 4}),
442 m_truthbin[step->stepNum()]);
443 for (FPGATrackSimBinUtil::IdxSet &idxset : idxsets) {
444 ATH_MSG_INFO("Truth Box "
445 << bindesc->parSetToTrackPars(step->binLowEdge(idxset)));
446 }
447 m_truthIsValid = false;
448 }
449 }
450}
451
453 std::vector<const FPGATrackSimBinUtil::StoredHit *> const *lastlyr,
454 std::vector<const FPGATrackSimBinUtil::StoredHit *> const *lastlastlyr) {
455
456 auto size_if_nonzero_ptr =
457 [](std::vector<const FPGATrackSimBinUtil::StoredHit *> const *ptr) {
458 if (ptr) {
459 return int(ptr->size());
460 } else {
461 return 0;
462 }
463 };
464
465 m_pairinghits->Fill(size_if_nonzero_ptr(lastlyr) +
466 size_if_nonzero_ptr(lastlastlyr));
467}
468
470 const FPGATrackSimGenScanTool::HitPair &pair, double r_in, double r_out) {
471 // m_pairs->Fill(pairs.pairList.size());
472 if (m_binPlotsActive) {
473 int lyr = pair.first->hitptr->getLayer();
474 m_deltaPhi->Fill(pair.dPhi());
475 m_deltaEta->Fill(pair.dEta());
476 m_deltaPhiDR->Fill(pair.dPhi() / pair.dR());
477 m_deltaEtaDR->Fill(pair.dEta() / pair.dR());
478 m_deltaPhiByLyr[lyr]->Fill(pair.dPhi());
479 m_deltaEtaByLyr[lyr]->Fill(pair.dEta());
480 m_phiInExtrap->Fill(pair.PhiInExtrap(r_in));
481 m_phiOutExtrap->Fill(pair.PhiOutExtrap(r_out));
482 m_etaInExtrap->Fill(pair.EtaInExtrap(r_in));
483 m_etaOutExtrap->Fill(pair.EtaOutExtrap(r_out));
484 }
485}
486
487// This classifies a pair of pairs into a category for plotting
488// e.g. are they bewtween hits in the same layer, are there three layers,
489// if there are three layers are they sequential,...
490// This is to try to understand some of the structure of the
491// pair matching distributions
494 const FPGATrackSimGenScanTool::HitPair &lastpair) const {
495 unsigned minlyr = std::min(lastpair.first->layer, lastpair.second->layer);
496 minlyr = std::min(minlyr, pair.first->layer);
497 minlyr = std::min(minlyr, pair.second->layer);
498
499 unsigned hitbits =
500 ((1 << lastpair.first->layer) | (1 << lastpair.second->layer) |
501 (1 << pair.first->layer) | (1 << pair.second->layer));
502 hitbits = hitbits >> minlyr; // now bit list starts with lowest hit layer
503
504 int hitlyrs = std::popcount(hitbits);
505
506 assert(hitbits & 0x1);
507
508 unsigned retv = 0;
509 if (hitlyrs == 2) // must be same layers
510 {
511 retv = 1;
512 } else if (hitlyrs == 3) {
513 if (hitbits == 0b111) // 3 bits in a row -> adjacent layers
514 {
515 if ((lastpair.first->layer == pair.second->layer) ||
516 (pair.first->layer == lastpair.second->layer)) {
517 retv = 2; // sequential
518 } else {
519 retv = 3; // one is a skip and the other isn't
520 }
521 } else if ((hitbits == 0b1101) || (hitbits == 0b1011)) // skips 1 layer
522 {
523 retv = 4;
524 }
525 } else {
526 retv = 5;
527 }
528
529 ATH_MSG_VERBOSE("pairpairCat "
530 << m_twoPairClasses[retv] << " " << lastpair.first->layer
531 << " " << lastpair.second->layer << " "
532 << pair.first->layer << " " << pair.second->layer << " : "
533 << minlyr << " " << std::bitset<16>(hitbits));
534
535 return retv;
536}
537
539 std::vector<TH1D *> & histset, double val,
541 const FPGATrackSimGenScanTool::HitPair &lastpair, bool nminus1) {
542
543 if (m_binPlotsActive) {
544 unsigned ppcat = pairpairCategory(pair, lastpair);
545 histset[0]->Fill(val); // 0 is "all"
546 histset[ppcat]->Fill(val); // 0 is "all"
547 if (nminus1)
548 histset[m_nminus1_idx]->Fill(val);
549 }
550}
551
553 const FPGATrackSimGenScanTool::HitPairSet &filteredpairs,
554 const std::vector<FPGATrackSimGenScanTool::HitPairSet> &pairsets,
555 unsigned threshold) {
556 m_pairsets->Fill(pairsets.size());
557
558 for (const auto &pairset : pairsets) {
559 // if over threshold add it to the output
560 if (pairset.lyrCnt() >= threshold) {
561 m_roadFilterFlow->Fill(3);
562 m_passPairSetFilterGraph.addEvent(pairset.hitlist);
563 } else {
564 m_lostPairSetFilterGraph.addEvent(filteredpairs.hitlist);
565 }
566 }
567}
568
570 const std::vector<FPGATrackSimGenScanTool::IntermediateState> &states,
571 unsigned allowed_misses) {
572
573 for (unsigned i = 0; i < states.size(); i++) {
574 m_unpairedHits->Fill(i, states[i].unpairedHits.size());
575 m_pairsetsIncr->Fill(i, states[i].pairsets.size());
576 for (auto &pair : states[i].pairsets) {
577 m_pairsetsHits->Fill(i, pair.hitlist.size());
578 }
579 unsigned totalInput =
580 states[i].pairsets.size() + states[i].unpairedHits.size();
581 m_totalInputIncr->Fill(i, totalInput);
582 m_binStagesIncr->Fill(i, (i <= allowed_misses) || (totalInput > 0));
583 }
584}
585
586// Event Disply Implementation
589 const std::string &name) {
590 TGraph *retv = new TGraph();
591 retv->SetName(name.c_str());
592 return retv;
593}
594
596 TGraph * g, double x, double y) {
597 g->SetPoint(g->GetN(), x, y);
598}
599
600
601void FPGATrackSimGenScanMonitoring::eventDispSet::addEvent(const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits) {
602 unsigned int count = m_rZ.size(); // both graph sets should have the same size
603
604 // If over limit on number of event displays just return
605 if (count > m_maxEvts)
606 return;
607
608 m_rZ.push_back(initGraph("EventDisp_RZ_" + m_name + std::to_string(count)));
609 m_xY.push_back(initGraph("EventDisp_XY_" + m_name + std::to_string(count)));
610
611 for (auto &hit : hits) {
612 AddPoint(m_rZ.back(), hit->getZ(), hit->getR());
613 AddPoint(m_xY.back(), hit->getX(), hit->getY());
614 }
615}
616
617void FPGATrackSimGenScanMonitoring::eventDispSet::addEvent(const std::vector<FPGATrackSimBinUtil::StoredHit> &hits) {
618 // If over limit on number of event displays just return
619 if (m_rZ.size() > m_maxEvts) return;
620
621 // convert vector of instances to vector of pointers to instances
622 std::vector<const FPGATrackSimBinUtil::StoredHit *> ptrvec;
623 for (auto &hit : hits) {
624 ptrvec.push_back(&hit);
625 }
626
627 // then just call pointer-based implementation
628 return addEvent(ptrvec);
629}
630
631void FPGATrackSimGenScanMonitoring::eventDispSet::addEvent(const std::vector<const FPGATrackSimBinUtil::StoredHit *> &hits) {
632 unsigned int count = m_rZ.size(); // all four graph sets should have the same size
633
634 // If over limit on number of event displays just return
635 if (count > m_maxEvts) return;
636
637 // make the graphs to store the event display points
638 m_rZ.push_back(initGraph("EventDisp_RZ_" + m_name + std::to_string(count)));
639 m_xY.push_back(initGraph("EventDisp_XY_" + m_name + std::to_string(count)));
640 m_rPhi.push_back(initGraph("EventDisp_RPhi_" + m_name + std::to_string(count)));
641 m_rEta.push_back(initGraph("EventDisp_REta_" + m_name + std::to_string(count)));
642
643 for (auto &hit : hits) {
644 AddPoint(m_rZ.back(), hit->hitptr->getZ(), hit->hitptr->getR());
645 AddPoint(m_xY.back(), hit->hitptr->getX(), hit->hitptr->getY());
646 AddPoint(m_rEta.back(), hit->etaShift, hit->hitptr->getR());
647 AddPoint(m_rPhi.back(), hit->phiShift, hit->hitptr->getR());
648 }
649}
650
652 // Make a vector of all the vectors of graphs and then loop to register
653 // them all...
654 for (auto &graphs : std::vector<std::vector<TGraph *> *>({&m_rZ, &m_xY, &m_rPhi, &m_rEta})) {
655 for (auto &g : *graphs) {
656 ATH_CHECK(parent->regGraph(g));
657 }
658 }
659 return StatusCode::SUCCESS;
660}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Binning Utilities for GenScanTool.
Binning Classes for GenScanTool.
This is the monitoring for the FPGATrackSimGenScanTool.
Implements a generalized 5d scan which filters pair of hits in bins linearized about nominal trajecto...
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:
const std::vector< std::string > & stepNames() const
const IFPGATrackSimBinDesc * binDesc() const
const ToolHandleArray< FPGATrackSimBinStep > & steps() const
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)
float getZ() const
float getR() const
virtual double phiResidual(const FPGATrackSimBinUtil::ParSet &parset, FPGATrackSimHit const *hit) const =0
virtual double etaResidual(const FPGATrackSimBinUtil::ParSet &parset, FPGATrackSimHit const *hit) const =0
virtual const std::string & parNames(unsigned i) const =0
virtual const FPGATrackSimTrackPars parSetToTrackPars(const FPGATrackSimBinUtil::ParSet &parset) const =0
virtual const FPGATrackSimBinUtil::ParSet trackParsToParSet(const FPGATrackSimTrackPars &pars) const =0
STL class.
STL class.
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
std::vector< IdxSet > makeVariationSet(const std::vector< unsigned > &scanpars, const IdxSet &idx)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
StatusCode registerGraphs(FPGATrackSimGenScanMonitoring *parent)
void addEvent(const std::vector< std::shared_ptr< const FPGATrackSimHit > > &hits)
std::vector< const StoredHit * > hitlist