Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
18 FPGATrackSimDataFlowTool::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());
30  ATH_CHECK(m_FPGATrackSimMapping.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 
228  addTableBreak();
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 
235  addTableBreak();
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 
242  addTableBreak();
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 
248  addTableBreak();
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 
254  addTableBreak();
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 
260  addTableBreak();
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 
266  addTableBreak();
267 
268  if (m_runSecondStage) {
269  ATH_CHECK(printDataFlow("nRoads_2nd(Total)"));
270 
271  addTableBreak();
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 
277  addTableBreak();
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 
284  addTableBreak();
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 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
332 StatusCode 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 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
407 StatusCode 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 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
479 void 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 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
490 void 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 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
505 double 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 
grepfile.info
info
Definition: grepfile.py:38
beamspotman.r
def r
Definition: beamspotman.py:676
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
getMenu.algname
algname
Definition: getMenu.py:54
FPGATrackSimLogicalEventInputHeader
Definition: FPGATrackSimLogicalEventInputHeader.h:21
FPGATrackSimOptionalEventInfo::getOfflineTracks
const std::vector< FPGATrackSimOfflineTrack > & getOfflineTracks() const
Definition: FPGATrackSimOptionalEventInfo.h:32
mean
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="")
Definition: dependence.cxx:254
FPGATrackSimDataFlowTool::m_nLayers_1st
unsigned m_nLayers_1st
Definition: FPGATrackSimDataFlowTool.h:80
FPGATrackSimDataFlowTool.h
FPGATrackSimDataFlowTool::FPGATrackSimDataFlowTool
FPGATrackSimDataFlowTool(std::string const &, std::string const &, IInterface const *)
Definition: FPGATrackSimDataFlowTool.cxx:18
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ID
std::vector< Identifier > ID
Definition: CalibHitIDCheck.h:24
FPGATrackSimDataFlowTool::m_FPGATrackSimMapping
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
Definition: FPGATrackSimDataFlowTool.h:62
FPGATrackSimTrack
Definition: FPGATrackSimTrack.h:18
FPGATrackSimPlaneMap.h
Maps physical layers to logical layers.
dqt_zlumi_pandas.hname
string hname
Definition: dqt_zlumi_pandas.py:279
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
IFPGATrackSimMappingSvc.h
FPGATrackSimTruthTrack
Definition: FPGATrackSimTruthTrack.h:14
FPGATrackSimDataFlowTool::makeDataFlowTable
StatusCode makeDataFlowTable()
Definition: FPGATrackSimDataFlowTool.cxx:210
MuonGM::round
float round(const float toRound, const unsigned int decimals)
Definition: Mdt.cxx:27
FPGATrackSimDataFlowTool::m_dataFlowDataI_max
std::unordered_map< std::string, int > m_dataFlowDataI_max
Definition: FPGATrackSimDataFlowTool.h:89
FPGATrackSimDataFlowTool::m_dataFlowHistsI
std::unordered_map< std::string, TH1I * > m_dataFlowHistsI
Definition: FPGATrackSimDataFlowTool.h:93
FPGATrackSimDataFlowTool::addTableBreak
void addTableBreak(unsigned const n=1)
Definition: FPGATrackSimDataFlowTool.cxx:469
SampleType::singleElectrons
@ singleElectrons
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
FPGATrackSimDataFlowTool::m_evtSel
ServiceHandle< IFPGATrackSimEventSelectionSvc > m_evtSel
Definition: FPGATrackSimDataFlowTool.h:63
FPGATrackSimDataFlowTool::m_tHistSvc
ServiceHandle< ITHistSvc > m_tHistSvc
Definition: FPGATrackSimDataFlowTool.h:61
FPGATrackSimOptionalEventInfo::getTruthTracks
const std::vector< FPGATrackSimTruthTrack > & getTruthTracks() const
Definition: FPGATrackSimOptionalEventInfo.h:37
FPGATrackSimDataFlowTool::m_dataFlowTeXName
std::string const m_dataFlowTeXName
Definition: FPGATrackSimDataFlowTool.h:72
FPGATrackSimDataFlowTool::m_tableDataWidth
unsigned const m_tableDataWidth
Definition: FPGATrackSimDataFlowTool.h:85
FPGATrackSimLogicalEventInputHeader::optional
FPGATrackSimOptionalEventInfo const & optional() const
Definition: FPGATrackSimLogicalEventInputHeader.h:32
FPGATrackSimDataFlowTool::initialize
virtual StatusCode initialize() override
Definition: FPGATrackSimDataFlowTool.cxx:25
FPGATrackSimDataFlowTool::getHistDir
std::string const & getHistDir()
Definition: FPGATrackSimDataFlowTool.h:57
FPGATrackSimDataFlowTool::roundTo
double roundTo(double const v, int const nSigDigits) const
Definition: FPGATrackSimDataFlowTool.cxx:505
FPGATrackSimDataFlowTool::addDataFlow
StatusCode addDataFlow(float const n, std::string const &key, bool const isInt=true)
Definition: FPGATrackSimDataFlowTool.cxx:332
FPGATrackSimDataFlowInfo
Definition: FPGATrackSimDataFlowInfo.h:18
FPGATrackSimDataFlowTool::m_cut_chi2ndof
Gaudi::Property< float > m_cut_chi2ndof
Definition: FPGATrackSimDataFlowTool.h:68
lumiFormat.i
int i
Definition: lumiFormat.py:85
FPGATrackSimDataFlowTool::m_runSecondStage
Gaudi::Property< bool > m_runSecondStage
Definition: FPGATrackSimDataFlowTool.h:66
FPGATrackSimDataFlowTool::clearHistDir
void clearHistDir()
Definition: FPGATrackSimDataFlowTool.h:58
FPGATrackSimDataFlowTool::getDataFlowInfo
StatusCode getDataFlowInfo(FPGATrackSimDataFlowInfo const &info)
Definition: FPGATrackSimDataFlowTool.cxx:146
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
extractSporadic.h
list h
Definition: extractSporadic.py:97
FPGATrackSimDataFlowTool::setMaxAcceptance
void setMaxAcceptance(TH1 *h, double const max_frac, double &max_value) const
Definition: FPGATrackSimDataFlowTool.cxx:490
FPGATrackSimDataFlowInfo.h
Structs that store the data flow information per event.
FPGATrackSimDataFlowTool::finalize
virtual StatusCode finalize() override
Definition: FPGATrackSimDataFlowTool.cxx:323
FPGATrackSimDataFlowTool::m_tableTypeWidth
unsigned const m_tableTypeWidth
Definition: FPGATrackSimDataFlowTool.h:84
FPGATrackSimDataFlowTool::m_dataFlowDataF_max
std::unordered_map< std::string, float > m_dataFlowDataF_max
Definition: FPGATrackSimDataFlowTool.h:91
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
FPGATrackSimDataFlowTool::regHist
StatusCode regHist(std::string const &dir, TH1 *h)
Definition: FPGATrackSimDataFlowTool.h:59
FPGATrackSimDataFlowTool::m_dataFlowHistsF
std::unordered_map< std::string, TH1F * > m_dataFlowHistsF
Definition: FPGATrackSimDataFlowTool.h:94
FPGATrackSimOfflineTrack
Definition: FPGATrackSimOfflineTrack.h:12
FPGATrackSimDataFlowTool::setHistDir
void setHistDir(std::string const &dir)
Definition: FPGATrackSimDataFlowTool.h:56
FPGATrackSimDataFlowTool::m_max_frac
double const m_max_frac
Definition: FPGATrackSimDataFlowTool.h:86
FPGATrackSimDataFlowTool::calculateDataFlow
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)
Definition: FPGATrackSimDataFlowTool.cxx:43
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
FPGATrackSimDataFlowTool::m_outputtag
Gaudi::Property< std::string > m_outputtag
Definition: FPGATrackSimDataFlowTool.h:67
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
FPGATrackSimDataFlowTool::printDataFlow
StatusCode printDataFlow(std::string const &key, int const div=1)
Definition: FPGATrackSimDataFlowTool.cxx:407
FPGATrackSimFunctions.h
FPGATrackSimDataFlowTool::m_dataFlowTxtName
std::string const m_dataFlowTxtName
Definition: FPGATrackSimDataFlowTool.h:71
rms95
double rms95(TH1 const *h)
This function is used to calculate RMS95 value for 1D histograms.
Definition: FPGATrackSimFunctions.cxx:60
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
FPGATrackSimDataFlowTool::findAndReplaceAll
void findAndReplaceAll(std::string &data, std::string const &toFind, std::string const &replaceStr) const
Definition: FPGATrackSimDataFlowTool.cxx:479
python.PyAthena.v
v
Definition: PyAthena.py:154
FPGATrackSimDataFlowTool::m_dataFlowTxt
std::ofstream m_dataFlowTxt
Definition: FPGATrackSimDataFlowTool.h:73
python.CaloAddPedShiftConfig.default
default
Definition: CaloAddPedShiftConfig.py:43
h
IFPGATrackSimEventSelectionSvc.h
FPGATrackSimDataFlowTool::m_dataFlowDataI_min
std::unordered_map< std::string, int > m_dataFlowDataI_min
Definition: FPGATrackSimDataFlowTool.h:88
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
beamspotnt.rms
rms
Definition: bin/beamspotnt.py:1266
FPGATrackSimDataFlowTool::m_nSigDigits
unsigned const m_nSigDigits
Definition: FPGATrackSimDataFlowTool.h:83
FPGATrackSimLogicalEventInputHeader::towers
const std::vector< FPGATrackSimTowerInputHeader > & towers() const
Definition: FPGATrackSimLogicalEventInputHeader.h:36
python.TrigEgammaMonitorHelper.TH1F
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:24
FPGATrackSimRoad.h
Defines a class for roads.
AthAlgTool
Definition: AthAlgTool.h:26
FPGATrackSimDataFlowTool::m_nEvents
size_t m_nEvents
Definition: FPGATrackSimDataFlowTool.h:79
SampleType::singlePions
@ singlePions
FPGATrackSimLogicalEventInputHeader.h
FPGATrackSimDataFlowTool::m_dataFlowTeX
std::ofstream m_dataFlowTeX
Definition: FPGATrackSimDataFlowTool.h:74
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
SampleType::singleMuons
@ singleMuons
FPGATrackSimTrack.h
FPGATrackSimCluster.h
FPGATrackSimDataFlowTool::m_dataFlowDataF_min
std::unordered_map< std::string, float > m_dataFlowDataF_min
Definition: FPGATrackSimDataFlowTool.h:90
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37