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