ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimDataFlowTool.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
4
12
15#include <bit>
16
17// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
18FPGATrackSimDataFlowTool::FPGATrackSimDataFlowTool(std::string const & algname, std::string const & name, IInterface const * ifc) :
19 AthAlgTool(algname, name, ifc)
20{
21}
22
23
24// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
26{
27 ATH_MSG_INFO("FPGATrackSimDataFlowTool::initialize()");
28
29 ATH_CHECK(m_tHistSvc.retrieve());
31 ATH_CHECK(m_evtSel.retrieve());
32
33 m_nLayers_1st = m_FPGATrackSimMapping->PlaneMap_1st(0)->getNLogiLayers();
34
37
38 return StatusCode::SUCCESS;
39}
40
41
42// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
44 std::vector<FPGATrackSimCluster> const & clusters_1st,
45 const std::vector<std::shared_ptr<const FPGATrackSimRoad>> & roads_1st, std::vector<FPGATrackSimTrack> const & tracks_1st,
46 const std::vector<std::shared_ptr<const FPGATrackSimRoad>> & roads_2nd, std::vector<FPGATrackSimTrack> const & tracks_2nd)
47{
48 info->nMappedHits_1st_layer.resize(m_nLayers_1st);
49 for (int i=0; i<header_1st->towers().at(0).nHits(); i++) {
50 info->nMappedHits_1st_total++;
51 }
52
53 info->nClusters_1st_layer.resize(m_nLayers_1st);
54 info->nClusters_1st_total = clusters_1st.size();
55
56 info->nRoads_1st_total = roads_1st.size();
57 for (const auto & r : roads_1st) {
58 if (std::popcount(r->getHitLayers()) == static_cast<int>(m_nLayers_1st) - 1)
59 info->nRoads_1st_7hits++;
60 if (std::popcount(r->getHitLayers()) == static_cast<int>(m_nLayers_1st))
61 info->nRoads_1st_8hits++;
62 }
63
64 std::unordered_map<int, size_t> pattID_nTracks_1st;
65 std::unordered_map<int, size_t> pattID_nTracks_1st_passChi2;
66 std::unordered_map<int, size_t> pattID_nTracks_1st_afterOR;
67
68 std::unordered_map<int, size_t> sectID_nTracks_1st;
69 std::unordered_map<int, size_t> sectID_nTracks_1st_passChi2;
70 std::unordered_map<int, size_t> sectID_nTracks_1st_afterOR;
71
72 info->nTracks_1st_total = tracks_1st.size();
73 for (FPGATrackSimTrack const & t : tracks_1st) {
74 if (t.getChi2ndof() <= m_cut_chi2ndof) {
75 info->nTracks_1st_passChi2++;
76 pattID_nTracks_1st_passChi2[t.getPatternID()]++;
77 sectID_nTracks_1st_passChi2[t.getFirstSectorID()]++;
78 }
79 if (t.passedOR() == 1) {
80 info->nTracks_1st_afterOR++;
81 pattID_nTracks_1st_afterOR[t.getPatternID()]++;
82 sectID_nTracks_1st_afterOR[t.getFirstSectorID()]++;
83 }
84 pattID_nTracks_1st[t.getPatternID()]++;
85 sectID_nTracks_1st[t.getFirstSectorID()]++;
86 }
87 for (const auto& [ID, ntrack]: pattID_nTracks_1st) {
88 info->nTracks_1st_per_patt_total.push_back(ntrack);
89 }
90 for (const auto& [ID, ntrack]: pattID_nTracks_1st_passChi2) {
91 info->nTracks_1st_per_patt_passChi2.push_back(ntrack);
92 }
93 for (const auto& [ID, ntrack]: pattID_nTracks_1st_afterOR) {
94 info->nTracks_1st_per_patt_afterOR.push_back(ntrack);
95 }
96
97 info->nConstants_1st_fitter = sectID_nTracks_1st.size();
98 info->nConstants_1st_passChi2 = sectID_nTracks_1st_passChi2.size();
99 info->nConstants_1st_afterOR = sectID_nTracks_1st_afterOR.size();
100
101 if (m_runSecondStage) {
102 info->nRoads_2nd_total = roads_2nd.size();
103
104 std::unordered_map<int, size_t> sectID_nTracks_2nd;
105 std::unordered_map<int, size_t> sectID_nTracks_2nd_passChi2;
106 std::unordered_map<int, size_t> sectID_nTracks_2nd_afterOR;
107
108 info->nTracks_2nd_total = tracks_2nd.size();
109 for (FPGATrackSimTrack const & t : tracks_2nd) {
110 if (t.getChi2ndof() <= m_cut_chi2ndof) {
111 info->nTracks_2nd_passChi2++;
112 sectID_nTracks_2nd_passChi2[t.getSecondSectorID()]++;
113 }
114 if (t.passedOR() == 1) {
115 info->nTracks_2nd_afterOR++;
116 sectID_nTracks_2nd_afterOR[t.getSecondSectorID()]++;
117 }
118 sectID_nTracks_2nd[t.getSecondSectorID()]++;
119 }
120
121 info->nConstants_2nd_fitter = sectID_nTracks_2nd.size();
122 info->nConstants_2nd_passChi2 = sectID_nTracks_2nd_passChi2.size();
123 info->nConstants_2nd_afterOR = sectID_nTracks_2nd_afterOR.size();
124 }
125
126 for (FPGATrackSimTruthTrack const & truth_t : header_1st->optional().getTruthTracks()) {
127 if (m_evtSel->passCuts(truth_t)) info->nTruthTracks++;
128 }
129
130 for (FPGATrackSimOfflineTrack const & offline_t : header_1st->optional().getOfflineTracks()) {
131 if (m_evtSel->passCuts(offline_t)) info->nOfflineTracks++;
132 }
133
134 if (info->nOfflineTracks > 0) {
135 info->nTracks_1st_over_nOfflineTracks = (float)tracks_1st.size() / (float)info->nOfflineTracks;
136 if (m_runSecondStage) info->nTracks_2nd_over_nOfflineTracks = (float)tracks_2nd.size() / (float)info->nOfflineTracks;
137 }
138
140
141 return StatusCode::SUCCESS;
142}
143
144
145// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
147{
148 m_nEvents++;
149
150 for (size_t i = 0; i < m_nLayers_1st; i++) {
151 ATH_CHECK(addDataFlow(info.nMappedHits_1st_layer[i], "nMappedHitsL" + std::to_string(i) + "_1st"));
152 }
153 ATH_CHECK(addDataFlow(info.nMappedHits_1st_total, "nMappedHits_1st per layer")); // We fill the total number here. It will be divided by the number of layers later.
154
155 for (size_t i = 0; i < m_nLayers_1st; i++) {
156 ATH_CHECK(addDataFlow(info.nClusters_1st_layer[i], "nClustersL" + std::to_string(i) + "_1st"));
157 }
158 ATH_CHECK(addDataFlow(info.nClusters_1st_total, "nClusters_1st per layer")); // We fill the total number here. It will be divided by the number of layers later.
159
160 ATH_CHECK(addDataFlow(info.nRoads_1st_total, "nRoads_1st(Total)"));
161 ATH_CHECK(addDataFlow(info.nRoads_1st_7hits, "nRoads_1st(7/8)"));
162 ATH_CHECK(addDataFlow(info.nRoads_1st_8hits, "nRoads_1st(8/8)"));
163
164 ATH_CHECK(addDataFlow(info.nTracks_1st_total, "nTracks_1st(Total)"));
165 ATH_CHECK(addDataFlow(info.nTracks_1st_passChi2, "nTracks_1st(Chi2ndof<40)"));
166 ATH_CHECK(addDataFlow(info.nTracks_1st_afterOR, "nTracks_1st(passing OR)"));
167
168 for (size_t n : info.nTracks_1st_per_patt_total) {
169 ATH_CHECK(addDataFlow(n, "nTracks_1st per patt(Total)"));
170 }
171 for (size_t n : info.nTracks_1st_per_patt_passChi2) {
172 ATH_CHECK(addDataFlow(n, "nTracks_1st per patt(Chi2ndof<40)"));
173 }
174 for (size_t n : info.nTracks_1st_per_patt_afterOR) {
175 ATH_CHECK(addDataFlow(n, "nTracks_1st per patt(passing OR)"));
176 }
177
178 ATH_CHECK(addDataFlow(info.nConstants_1st_fitter, "nConstants_1st(Fitter)"));
179 ATH_CHECK(addDataFlow(info.nConstants_1st_passChi2, "nConstants_1st(Chi2ndof<40)"));
180 ATH_CHECK(addDataFlow(info.nConstants_1st_afterOR, "nConstants_1st(after OR)"));
181
182 if (m_runSecondStage) {
183 ATH_CHECK(addDataFlow(info.nRoads_2nd_total, "nRoads_2nd(Total)"));
184
185 ATH_CHECK(addDataFlow(info.nTracks_2nd_total, "nTracks_2nd(Total)"));
186 ATH_CHECK(addDataFlow(info.nTracks_2nd_passChi2, "nTracks_2nd(Chi2ndof<40)"));
187 ATH_CHECK(addDataFlow(info.nTracks_2nd_afterOR, "nTracks_2nd(passing OR)"));
188
189 ATH_CHECK(addDataFlow(info.nConstants_2nd_extrapolate, "nConstants_2nd(Extrapolate)"));
190 ATH_CHECK(addDataFlow(info.nConstants_2nd_fitter, "nConstants_2nd(Fitter)"));
191 ATH_CHECK(addDataFlow(info.nConstants_2nd_passChi2, "nConstants_2nd(Chi2ndof<40)"));
192 ATH_CHECK(addDataFlow(info.nConstants_2nd_afterOR, "nConstants_2nd(after OR)"));
193 }
194
195 ATH_CHECK(addDataFlow(info.nTruthTracks, "nTruthTracks"));
196 ATH_CHECK(addDataFlow(info.nOfflineTracks, "nOfflineTracks"));
197
198 if (info.nOfflineTracks > 0) {
199 ATH_CHECK(addDataFlow(info.nTracks_1st_over_nOfflineTracks, "nTracks_1st(Total)/nOfflineTracks", false));
200 if (m_runSecondStage) {
201 ATH_CHECK(addDataFlow(info.nTracks_2nd_over_nOfflineTracks, "nTracks_2nd(Total)/nOfflineTracks", false));
202 }
203 }
204
205 return StatusCode::SUCCESS;
206}
207
208
209// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
211{
212 m_dataFlowTxt << std::left << std::setw(m_tableTypeWidth) << "Type"
213 << std::setw(m_tableDataWidth) << "Stage"
214 << std::setw(m_tableDataWidth) << "Mean"
215 << std::setw(m_tableDataWidth) << "RMS"
216 << std::setw(m_tableDataWidth) << "RMS95"
217 << std::setw(m_tableDataWidth) << "Min"
218 << std::setw(m_tableDataWidth) << "Max" << std::endl;
219
220 m_dataFlowTeX << "\\documentclass[12pt]{article}" << std::endl;
221 m_dataFlowTeX << "\\begin{document}" << std::endl;
222 m_dataFlowTeX << "\\begin{table}" << std::endl;
223 m_dataFlowTeX << "\\makebox[\\linewidth]{" << std::endl;
224 m_dataFlowTeX << "\\begin{tabular}{|c|c|c|c|c|c|c|}" << std::endl;
225 m_dataFlowTeX << "\\hline" << std::endl;
226 m_dataFlowTeX << "Type & Stage & Mean & RMS & RMS95 & Min & Max \\\\" << std::endl;
227
229
230 for (size_t i = 0; i < m_nLayers_1st; i++) {
231 ATH_CHECK(printDataFlow("nMappedHitsL" + std::to_string(i) + "_1st"));
232 }
233 ATH_CHECK(printDataFlow("nMappedHits_1st per layer", m_nLayers_1st));
234
236
237 for (size_t i = 0; i < m_nLayers_1st; i++) {
238 ATH_CHECK(printDataFlow("nClustersL" + std::to_string(i) + "_1st"));
239 }
240 ATH_CHECK(printDataFlow("nClusters_1st per layer", m_nLayers_1st));
241
243
244 ATH_CHECK(printDataFlow("nRoads_1st(Total)"));
245 ATH_CHECK(printDataFlow("nRoads_1st(7/8)"));
246 ATH_CHECK(printDataFlow("nRoads_1st(8/8)"));
247
249
250 ATH_CHECK(printDataFlow("nTracks_1st(Total)"));
251 ATH_CHECK(printDataFlow("nTracks_1st(Chi2ndof<40)"));
252 ATH_CHECK(printDataFlow("nTracks_1st(passing OR)"));
253
255
256 ATH_CHECK(printDataFlow("nTracks_1st per patt(Total)"));
257 ATH_CHECK(printDataFlow("nTracks_1st per patt(Chi2ndof<40)"));
258 ATH_CHECK(printDataFlow("nTracks_1st per patt(passing OR)"));
259
261
262 ATH_CHECK(printDataFlow("nConstants_1st(Fitter)"));
263 ATH_CHECK(printDataFlow("nConstants_1st(Chi2ndof<40)"));
264 ATH_CHECK(printDataFlow("nConstants_1st(after OR)"));
265
267
268 if (m_runSecondStage) {
269 ATH_CHECK(printDataFlow("nRoads_2nd(Total)"));
270
272
273 ATH_CHECK(printDataFlow("nTracks_2nd(Total)"));
274 ATH_CHECK(printDataFlow("nTracks_2nd(Chi2ndof<40)"));
275 ATH_CHECK(printDataFlow("nTracks_2nd(passing OR)"));
276
278
279 ATH_CHECK(printDataFlow("nConstants_2nd(Extrapolate)"));
280 ATH_CHECK(printDataFlow("nConstants_2nd(Fitter)"));
281 ATH_CHECK(printDataFlow("nConstants_2nd(Chi2ndof<40)"));
282 ATH_CHECK(printDataFlow("nConstants_2nd(after OR)"));
283
285 }
286
287 ATH_CHECK(printDataFlow("nTruthTracks"));
288 ATH_CHECK(printDataFlow("nOfflineTracks"));
289 ATH_CHECK(printDataFlow("nTracks_1st(Total)/nOfflineTracks"));
290 if (m_runSecondStage) ATH_CHECK(printDataFlow("nTracks_2nd(Total)/nOfflineTracks"));
291
292 std::string str_sample;
293 std::string str_PU;
294
295 switch (m_evtSel->getSampleType()) {
296 case SampleType::singleElectrons : str_sample = " single electron"; break;
297 case SampleType::singleMuons : str_sample = " single muon"; break;
298 case SampleType::singlePions : str_sample = " single pion"; break;
299 default : str_sample = ""; break;
300 }
301
302 str_PU = m_evtSel->checkPU() ? " with pile-up" : "";
303
304 m_dataFlowTxt << "--------------" << std::endl;
305 m_dataFlowTxt << "Data flow for " << m_nEvents << str_sample << " events" << str_PU << ". "
306 << "(" << roundTo(100. * m_max_frac, m_nSigDigits) << "%" << " acceptance)" << std::endl;
307
308 m_dataFlowTeX << "\\hline" << std::endl;
309 m_dataFlowTeX << "\\end{tabular}}" << std::endl;
310 m_dataFlowTeX << "\\caption{Data flow for " << m_nEvents << str_sample << " events" << str_PU << ". "
311 << "(" << roundTo(100. * m_max_frac, m_nSigDigits) << "\\%" << " acceptance)} " << std::endl;
312 m_dataFlowTeX << "\\end{table}" << std::endl;
313 m_dataFlowTeX << "\\end{document}" << std::endl;
314
315 m_dataFlowTxt.close();
316 m_dataFlowTeX.close();
317
318 return StatusCode::SUCCESS;
319}
320
321
322// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
324{
325 ATH_MSG_INFO("FPGATrackSimDataFlowTool::finalize()");
327 return StatusCode::SUCCESS;
328}
329
330
331// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
332StatusCode FPGATrackSimDataFlowTool::addDataFlow(float const n, std::string const & key, bool const isInt)
333{
334 if (isInt) {
335 if (m_dataFlowDataI_min.find(key) == m_dataFlowDataI_min.end()) {
336 m_dataFlowDataI_min.insert({key, n});
337 }
338 else if (n < m_dataFlowDataI_min.find(key)->second) {
339 m_dataFlowDataI_min.find(key)->second = n;
340 }
341
342 if (m_dataFlowDataI_max.find(key) == m_dataFlowDataI_max.end()) {
343 m_dataFlowDataI_max.insert({key, n});
344 }
345 else if (n > m_dataFlowDataI_max.find(key)->second) {
346 m_dataFlowDataI_max.find(key)->second = n;
347 }
348 }
349 else {
350 if (m_dataFlowDataF_min.find(key) == m_dataFlowDataF_min.end()) {
351 m_dataFlowDataF_min.insert({key, n});
352 }
353 else if (n < m_dataFlowDataF_min.find(key)->second) {
354 m_dataFlowDataF_min.find(key)->second = n;
355 }
356
357 if (m_dataFlowDataF_max.find(key) == m_dataFlowDataF_max.end()) {
358 m_dataFlowDataF_max.insert({key, n});
359 }
360 else if (n > m_dataFlowDataF_max.find(key)->second) {
361 m_dataFlowDataF_max.find(key)->second = n;
362 }
363 }
364
365 if ((isInt && m_dataFlowHistsI.find(key) == m_dataFlowHistsI.end()) ||
366 (!isInt && m_dataFlowHistsF.find(key) == m_dataFlowHistsF.end())) {
367 std::string hname = "h_dataflow_" + key;
368 if (!m_outputtag.value().empty()) hname += ("_" + m_outputtag.value());
369 findAndReplaceAll(hname, "/", "_over_");
370
371 setHistDir("/DataFlowHist/");
372 TH1* h;
373 if (isInt)
374 h = new TH1I(hname.c_str(), key.c_str(), n + 1, -0.5, n + 0.5);
375 else
376 h = new TH1F(hname.c_str(), key.c_str(), (round(n) + 1) * 100, -0.5, round(n) + 0.5);
378 clearHistDir();
379
380 h->Fill(n);
381
382 if (isInt)
383 m_dataFlowHistsI.insert({key, dynamic_cast<TH1I*>(h)});
384 else
385 m_dataFlowHistsF.insert({key, dynamic_cast<TH1F*>(h)});
386 }
387 else {
388 if (m_dataFlowDataI_max.find(key) != m_dataFlowDataI_max.end()) {
389 int max = m_dataFlowDataI_max.find(key)->second;
390 TH1I* h = m_dataFlowHistsI.find(key)->second;
391 h->SetBins(max + 1, -0.5, max + 0.5);
392 h->Fill(n);
393 }
394 else if (m_dataFlowDataF_max.find(key) != m_dataFlowDataF_max.end()) {
395 float max = m_dataFlowDataF_max.find(key)->second;
396 TH1F* h = m_dataFlowHistsF.find(key)->second;
397 h->SetBins((round(max) + 1) * 100, -0.5, round(max) + 0.5);
398 h->Fill(n);
399 }
400 }
401
402 return StatusCode::SUCCESS;
403}
404
405
406// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
407StatusCode FPGATrackSimDataFlowTool::printDataFlow(std::string const & key, int const div)
408{
409 bool isInt = false;
410 if (m_dataFlowHistsI.find(key) != m_dataFlowHistsI.end())
411 isInt = true;
412 else if (m_dataFlowHistsF.find(key) == m_dataFlowHistsF.end())
413 return StatusCode::SUCCESS;
414
415 double min = isInt ? m_dataFlowDataI_min.find(key)->second : m_dataFlowDataF_min.find(key)->second;
416 double max = isInt ? m_dataFlowDataI_max.find(key)->second : m_dataFlowDataF_max.find(key)->second;
417
418 TH1* h;
419 if (isInt)
420 h = m_dataFlowHistsI.find(key)->second;
421 else
422 h = m_dataFlowHistsF.find(key)->second;
423
425
426 std::string str_stage = "", str_key = key;
427 if (key.find("_1st") != std::string::npos) {
428 str_stage = "FIRST";
429 str_key.erase(key.find("_1st"), std::string("_1st").length());
430 }
431 else if (key.find("_2nd") != std::string::npos) {
432 str_stage = "SECOND";
433 str_key.erase(key.find("_2nd"), std::string("_2nd").length());
434 }
435 else {
436 str_stage = "UNKNOWN";
437 }
438
439 double mean = h->GetMean() / div;
440 double rms = h->GetRMS() / div;
441 double rms95_n = rms95(h) / div;
442 min = min / div;
443 max = max / div;
444
445 m_dataFlowTxt << std::left << std::setw(m_tableTypeWidth) << str_key
446 << std::setw(m_tableDataWidth) << str_stage
447 << std::setw(m_tableDataWidth) << roundTo(mean, m_nSigDigits)
448 << std::setw(m_tableDataWidth) << roundTo(rms, m_nSigDigits)
449 << std::setw(m_tableDataWidth) << roundTo(rms95_n, m_nSigDigits)
450 << std::setw(m_tableDataWidth) << roundTo(min, m_nSigDigits)
451 << std::setw(m_tableDataWidth) << roundTo(max, m_nSigDigits) << std::endl;
452
453 // Replace all "<" by "$<$" in the key to make the type text for tex.
454 // If there are other characters in the future, we can make a vector to store all of them.
455 std::string key_tex = std::move(str_key);
456 findAndReplaceAll(key_tex, "<", "$<$");
457
458 m_dataFlowTeX << key_tex << " & " << str_stage << " & " << roundTo(mean, m_nSigDigits)
459 << " & " << roundTo(rms, m_nSigDigits)
460 << " & " << roundTo(rms95(h), m_nSigDigits)
461 << " & " << roundTo(min, m_nSigDigits)
462 << " & " << roundTo(max, m_nSigDigits) << " \\\\" << std::endl;
463
464 return StatusCode::SUCCESS;
465}
466
467
468// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
470{
471 for (unsigned i = 0; i < n; i++) {
472 m_dataFlowTxt << "--------------" << std::endl;
473 m_dataFlowTeX << "\\hline" << std::endl;
474 }
475}
476
477
478// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
479void FPGATrackSimDataFlowTool::findAndReplaceAll(std::string & data, std::string const & toFind, std::string const & replaceStr) const
480{
481 size_t pos = data.find(toFind);
482 while (pos != std::string::npos) {
483 data.replace(pos, toFind.size(), replaceStr);
484 pos = data.find(toFind, pos + replaceStr.size());
485 }
486}
487
488
489// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
490void FPGATrackSimDataFlowTool::setMaxAcceptance(TH1* h, double const max_frac, double& max_value) const
491{
492 double total = h->Integral();
493 for (int i = 1; i <= h->GetNbinsX(); i++) {
494 double partial = h->Integral(1, i);
495 if (partial / total > max_frac) {
496 max_value = h->GetBinCenter(i);
497 h->GetXaxis()->SetRange(1, i);
498 break;
499 }
500 }
501}
502
503
504// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
505double FPGATrackSimDataFlowTool::roundTo(double const v, int const nSigDigits) const
506{
507 int sigDigit = v != 0 ? trunc(log10(fabs(v))) : 0;
508 if (nSigDigits >= 1) {
509 double factor = pow(10., nSigDigits - sigDigit - 1);
510 return round(v * factor) / factor;
511 }
512
513 return v;
514}
515
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
std::vector< Identifier > ID
Structs that store the data flow information per event.
double rms95(TH1 const *h)
This function is used to calculate RMS95 value for 1D histograms.
Maps physical layers to logical layers.
Defines a class for roads.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static const uint32_t nHits
constexpr int pow(int base, int exp) noexcept
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Header file for AthHistogramAlgorithm.
Gaudi::Property< bool > m_runSecondStage
StatusCode addDataFlow(float const n, std::string const &key, bool const isInt=true)
StatusCode calculateDataFlow(FPGATrackSimDataFlowInfo *info, FPGATrackSimLogicalEventInputHeader const *header_1st, std::vector< FPGATrackSimCluster > const &clusters_1st, const std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads_1st, std::vector< FPGATrackSimTrack > const &tracks_1st, const std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads_2nd, std::vector< FPGATrackSimTrack > const &tracks_2nd)
std::unordered_map< std::string, TH1I * > m_dataFlowHistsI
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
void setMaxAcceptance(TH1 *h, double const max_frac, double &max_value) const
StatusCode getDataFlowInfo(FPGATrackSimDataFlowInfo const &info)
ServiceHandle< IFPGATrackSimEventSelectionSvc > m_evtSel
Gaudi::Property< float > m_cut_chi2ndof
std::unordered_map< std::string, int > m_dataFlowDataI_min
virtual StatusCode initialize() override
std::unordered_map< std::string, float > m_dataFlowDataF_max
std::unordered_map< std::string, float > m_dataFlowDataF_min
StatusCode printDataFlow(std::string const &key, int const div=1)
double roundTo(double const v, int const nSigDigits) const
void addTableBreak(unsigned const n=1)
virtual StatusCode finalize() override
FPGATrackSimDataFlowTool(std::string const &, std::string const &, IInterface const *)
ServiceHandle< ITHistSvc > m_tHistSvc
std::unordered_map< std::string, int > m_dataFlowDataI_max
void setHistDir(std::string const &dir)
Gaudi::Property< std::string > m_outputtag
void findAndReplaceAll(std::string &data, std::string const &toFind, std::string const &replaceStr) const
std::unordered_map< std::string, TH1F * > m_dataFlowHistsF
StatusCode regHist(std::string const &dir, TH1 *h)
const std::vector< FPGATrackSimTowerInputHeader > & towers() const
FPGATrackSimOptionalEventInfo const & optional() const
const std::vector< FPGATrackSimTruthTrack > & getTruthTracks() const
const std::vector< FPGATrackSimOfflineTrack > & getOfflineTracks() const
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
int r
Definition globals.cxx:22