38 return StatusCode::SUCCESS;
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)
49 for (
int i=0;
i<header_1st->
towers().at(0).nHits();
i++) {
50 info->nMappedHits_1st_total++;
54 info->nClusters_1st_total = clusters_1st.size();
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++;
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;
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;
72 info->nTracks_1st_total = tracks_1st.size();
75 info->nTracks_1st_passChi2++;
76 pattID_nTracks_1st_passChi2[
t.getPatternID()]++;
77 sectID_nTracks_1st_passChi2[
t.getFirstSectorID()]++;
79 if (
t.passedOR() == 1) {
80 info->nTracks_1st_afterOR++;
81 pattID_nTracks_1st_afterOR[
t.getPatternID()]++;
82 sectID_nTracks_1st_afterOR[
t.getFirstSectorID()]++;
84 pattID_nTracks_1st[
t.getPatternID()]++;
85 sectID_nTracks_1st[
t.getFirstSectorID()]++;
87 for (
const auto& [
ID, ntrack]: pattID_nTracks_1st) {
88 info->nTracks_1st_per_patt_total.push_back(ntrack);
90 for (
const auto& [
ID, ntrack]: pattID_nTracks_1st_passChi2) {
91 info->nTracks_1st_per_patt_passChi2.push_back(ntrack);
93 for (
const auto& [
ID, ntrack]: pattID_nTracks_1st_afterOR) {
94 info->nTracks_1st_per_patt_afterOR.push_back(ntrack);
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();
102 info->nRoads_2nd_total = roads_2nd.size();
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;
108 info->nTracks_2nd_total = tracks_2nd.size();
111 info->nTracks_2nd_passChi2++;
112 sectID_nTracks_2nd_passChi2[
t.getSecondSectorID()]++;
114 if (
t.passedOR() == 1) {
115 info->nTracks_2nd_afterOR++;
116 sectID_nTracks_2nd_afterOR[
t.getSecondSectorID()]++;
118 sectID_nTracks_2nd[
t.getSecondSectorID()]++;
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();
131 if (
m_evtSel->passCuts(offline_t))
info->nOfflineTracks++;
134 if (
info->nOfflineTracks > 0) {
135 info->nTracks_1st_over_nOfflineTracks = (
float)tracks_1st.size() / (
float)
info->nOfflineTracks;
141 return StatusCode::SUCCESS;
168 for (
size_t n :
info.nTracks_1st_per_patt_total) {
171 for (
size_t n :
info.nTracks_1st_per_patt_passChi2) {
174 for (
size_t n :
info.nTracks_1st_per_patt_afterOR) {
198 if (
info.nOfflineTracks > 0) {
205 return StatusCode::SUCCESS;
220 m_dataFlowTeX <<
"\\documentclass[12pt]{article}" << std::endl;
224 m_dataFlowTeX <<
"\\begin{tabular}{|c|c|c|c|c|c|c|}" << std::endl;
226 m_dataFlowTeX <<
"Type & Stage & Mean & RMS & RMS95 & Min & Max \\\\" << std::endl;
292 std::string str_sample;
295 switch (
m_evtSel->getSampleType()) {
299 default : str_sample =
"";
break;
302 str_PU =
m_evtSel->checkPU() ?
" with pile-up" :
"";
318 return StatusCode::SUCCESS;
327 return StatusCode::SUCCESS;
367 std::string
hname =
"h_dataflow_" +
key;
374 h =
new TH1I(
hname.c_str(),
key.c_str(),
n + 1, -0.5,
n + 0.5);
391 h->SetBins(
max + 1, -0.5,
max + 0.5);
402 return StatusCode::SUCCESS;
413 return StatusCode::SUCCESS;
426 std::string str_stage =
"", str_key =
key;
427 if (
key.find(
"_1st") != std::string::npos) {
429 str_key.erase(
key.find(
"_1st"), std::string(
"_1st").length());
431 else if (
key.find(
"_2nd") != std::string::npos) {
432 str_stage =
"SECOND";
433 str_key.erase(
key.find(
"_2nd"), std::string(
"_2nd").length());
436 str_stage =
"UNKNOWN";
439 double mean =
h->GetMean() / div;
440 double rms =
h->GetRMS() / div;
441 double rms95_n =
rms95(
h) / div;
455 std::string key_tex = std::move(str_key);
464 return StatusCode::SUCCESS;
471 for (
unsigned i = 0;
i <
n;
i++) {
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());
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);
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;