Line | Branch | Exec | Source |
---|---|---|---|
1 | #include "Validator.h" | ||
2 | |||
3 | #include <TCanvas.h> | ||
4 | #include <TLegend.h> | ||
5 | #include <TString.h> | ||
6 | #include <TPad.h> | ||
7 | #include <TROOT.h> | ||
8 | #include <TStyle.h> | ||
9 | #include <TH1.h> | ||
10 | |||
11 | #include <algorithm> | ||
12 | #include <array> | ||
13 | #include <cmath> | ||
14 | #include <set> | ||
15 | #include <string> | ||
16 | #include <unordered_map> | ||
17 | #include <unordered_set> | ||
18 | #include <vector> | ||
19 | |||
20 | namespace iguana::clas12 { | ||
21 | |||
22 | REGISTER_IGUANA_VALIDATOR(RGAFiducialFilterValidator); | ||
23 | |||
24 | 3 | static bool banklist_has(hipo::banklist& banks, const char* name) { | |
25 |
6/6✓ Branch 0 (6→7) taken 10 times.
✓ Branch 1 (6→9) taken 5 times.
✓ Branch 2 (11→12) taken 13 times.
✓ Branch 3 (11→14) taken 2 times.
✓ Branch 4 (13→3) taken 15 times.
✓ Branch 5 (13→14) taken 1 times.
|
46 | for (auto& b : banks) if (b.getSchema().getName() == name) return true; |
26 | return false; | ||
27 | } | ||
28 | |||
29 | 5 | static inline void SaveAndDisposeCanvas(TCanvas* c, const char* path_png) { | |
30 |
1/2✓ Branch 0 (2→3) taken 5 times.
✗ Branch 1 (2→13) not taken.
|
5 | if (!c) return; |
31 | 5 | c->Modified(); | |
32 | 5 | c->Update(); | |
33 | 5 | c->Print(path_png); | |
34 | // Remove from global list before deletion | ||
35 |
2/4✓ Branch 0 (7→8) taken 5 times.
✗ Branch 1 (7→12) not taken.
✓ Branch 2 (9→10) taken 5 times.
✗ Branch 3 (9→12) not taken.
|
5 | if (gROOT && gROOT->GetListOfCanvases()) |
36 | 5 | gROOT->GetListOfCanvases()->Remove(c); | |
37 | 5 | delete c; | |
38 | } | ||
39 | |||
40 | 1 | void RGAFiducialFilterValidator::BookIfNeeded() { | |
41 | // PCal: 0–45 cm with 4.5 cm bins (bar width) | ||
42 | const int nb = 10; | ||
43 | const double lo = 0.0, hi = 45.0; | ||
44 | |||
45 |
2/2✓ Branch 0 (35→3) taken 2 times.
✓ Branch 1 (35→36) taken 1 times.
|
3 | for (int pid : kPIDs) { |
46 | auto& P = m_cal[pid]; | ||
47 |
2/2✓ Branch 0 (33→4) taken 12 times.
✓ Branch 1 (33→34) taken 2 times.
|
14 | for (int s=1; s<=6; ++s) { |
48 |
1/2✓ Branch 0 (4→5) taken 12 times.
✗ Branch 1 (4→11) not taken.
|
12 | if (!P[s].lv_before) { |
49 |
1/2✓ Branch 0 (7→8) taken 12 times.
✗ Branch 1 (7→81) not taken.
|
12 | P[s].lv_before = new TH1D(Form("h_pcal_lv_before_pid%d_s%d", pid, s), |
50 |
2/4✓ Branch 0 (6→7) taken 12 times.
✗ Branch 1 (6→81) not taken.
✓ Branch 2 (8→9) taken 12 times.
✗ Branch 3 (8→81) not taken.
|
24 | Form("PID %d S%d;length (cm);counts", pid, s), nb, lo, hi); |
51 | 12 | P[s].lv_before->SetStats(0); | |
52 | 12 | P[s].lv_before->SetDirectory(nullptr); | |
53 | } | ||
54 |
1/2✓ Branch 0 (11→12) taken 12 times.
✗ Branch 1 (11→18) not taken.
|
12 | if (!P[s].lv_after) { |
55 |
1/2✓ Branch 0 (14→15) taken 12 times.
✗ Branch 1 (14→83) not taken.
|
12 | P[s].lv_after = new TH1D(Form("h_pcal_lv_after_pid%d_s%d", pid, s), |
56 |
2/4✓ Branch 0 (13→14) taken 12 times.
✗ Branch 1 (13→83) not taken.
✓ Branch 2 (15→16) taken 12 times.
✗ Branch 3 (15→83) not taken.
|
24 | Form("PID %d S%d;length (cm);counts", pid, s), nb, lo, hi); |
57 | 12 | P[s].lv_after->SetStats(0); | |
58 | 12 | P[s].lv_after->SetDirectory(nullptr); | |
59 | } | ||
60 |
1/2✓ Branch 0 (18→19) taken 12 times.
✗ Branch 1 (18→25) not taken.
|
12 | if (!P[s].lw_before) { |
61 |
1/2✓ Branch 0 (21→22) taken 12 times.
✗ Branch 1 (21→85) not taken.
|
12 | P[s].lw_before = new TH1D(Form("h_pcal_lw_before_pid%d_s%d", pid, s), |
62 |
2/4✓ Branch 0 (20→21) taken 12 times.
✗ Branch 1 (20→85) not taken.
✓ Branch 2 (22→23) taken 12 times.
✗ Branch 3 (22→85) not taken.
|
24 | Form("PID %d S%d;length (cm);counts", pid, s), nb, lo, hi); |
63 | 12 | P[s].lw_before->SetStats(0); | |
64 | 12 | P[s].lw_before->SetDirectory(nullptr); | |
65 | } | ||
66 |
1/2✓ Branch 0 (25→26) taken 12 times.
✗ Branch 1 (25→32) not taken.
|
12 | if (!P[s].lw_after) { |
67 |
1/2✓ Branch 0 (28→29) taken 12 times.
✗ Branch 1 (28→87) not taken.
|
12 | P[s].lw_after = new TH1D(Form("h_pcal_lw_after_pid%d_s%d", pid, s), |
68 |
2/4✓ Branch 0 (27→28) taken 12 times.
✗ Branch 1 (27→87) not taken.
✓ Branch 2 (29→30) taken 12 times.
✗ Branch 3 (29→87) not taken.
|
24 | Form("PID %d S%d;length (cm);counts", pid, s), nb, lo, hi); |
69 | 12 | P[s].lw_after->SetStats(0); | |
70 | 12 | P[s].lw_after->SetDirectory(nullptr); | |
71 | } | ||
72 | } | ||
73 | } | ||
74 | |||
75 | // FT: x,y in +/-20 cm | ||
76 |
2/2✓ Branch 0 (53→37) taken 2 times.
✓ Branch 1 (53→54) taken 1 times.
|
3 | for (int pid : kPIDs) { |
77 | auto& F = m_ft_h[pid]; | ||
78 |
1/2✓ Branch 0 (38→39) taken 2 times.
✗ Branch 1 (38→45) not taken.
|
2 | if (!F.before) { |
79 |
1/2✓ Branch 0 (41→42) taken 2 times.
✗ Branch 1 (41→89) not taken.
|
2 | F.before = new TH2F(Form("h_ft_before_pid%d", pid), |
80 |
2/4✓ Branch 0 (40→41) taken 2 times.
✗ Branch 1 (40→89) not taken.
✓ Branch 2 (42→43) taken 2 times.
✗ Branch 3 (42→89) not taken.
|
4 | Form("FT x-y before (PID %d);x (cm);y (cm)", pid), 120, -20, 20, 120, -20, 20); |
81 | 2 | F.before->SetStats(0); | |
82 | 2 | F.before->SetDirectory(nullptr); | |
83 | } | ||
84 |
1/2✓ Branch 0 (45→46) taken 2 times.
✗ Branch 1 (45→52) not taken.
|
2 | if (!F.after) { |
85 |
1/2✓ Branch 0 (48→49) taken 2 times.
✗ Branch 1 (48→91) not taken.
|
2 | F.after = new TH2F(Form("h_ft_after_pid%d", pid), |
86 |
2/4✓ Branch 0 (47→48) taken 2 times.
✗ Branch 1 (47→91) not taken.
✓ Branch 2 (49→50) taken 2 times.
✗ Branch 3 (49→91) not taken.
|
4 | Form("FT x-y after (PID %d);x (cm);y (cm)", pid), 120, -20, 20, 120, -20, 20); |
87 | 2 | F.after->SetStats(0); | |
88 | 2 | F.after->SetDirectory(nullptr); | |
89 | } | ||
90 | } | ||
91 | |||
92 | // CVT layer 12: phi (deg) vs theta (deg), hadrons only | ||
93 |
1/2✓ Branch 0 (54→55) taken 1 times.
✗ Branch 1 (54→59) not taken.
|
1 | if (!m_cvt_before) { |
94 | 1 | m_cvt_before = new TH2F("h_cvt_l12_phi_theta_before_all", | |
95 | "CVT layer 12 before (hadrons: #pm211,#pm321,#pm2212);phi (deg);theta (deg)", | ||
96 |
1/2✓ Branch 0 (56→57) taken 1 times.
✗ Branch 1 (56→93) not taken.
|
1 | 180, 0, 360, 90, 0, 90); |
97 | 1 | m_cvt_before->SetStats(0); | |
98 | 1 | m_cvt_before->SetDirectory(nullptr); | |
99 | } | ||
100 |
1/2✓ Branch 0 (59→60) taken 1 times.
✗ Branch 1 (59→64) not taken.
|
1 | if (!m_cvt_after) { |
101 | 1 | m_cvt_after = new TH2F("h_cvt_l12_phi_theta_after_all", | |
102 | "CVT layer 12 after (hadrons: #pm211,#pm321,#pm2212);phi (deg);theta (deg)", | ||
103 |
1/2✓ Branch 0 (61→62) taken 1 times.
✗ Branch 1 (61→95) not taken.
|
1 | 180, 0, 360, 90, 0, 90); |
104 | 1 | m_cvt_after->SetStats(0); | |
105 | 1 | m_cvt_after->SetDirectory(nullptr); | |
106 | } | ||
107 | |||
108 | // DC edges: 0–30 cm in 0.3 cm bins | ||
109 | 12 | auto mk = [](const char* name, const char* title){ | |
110 |
1/2✓ Branch 0 (3→4) taken 12 times.
✗ Branch 1 (3→7) not taken.
|
12 | auto* h = new TH1D(name, title, 100, 0.0, 30.0); |
111 | 12 | h->SetStats(0); | |
112 | 12 | h->SetDirectory(nullptr); | |
113 | 12 | return h; | |
114 | }; | ||
115 |
1/2✓ Branch 0 (64→65) taken 1 times.
✗ Branch 1 (64→72) not taken.
|
1 | if (!m_dc_pos.r1_before) { |
116 | 1 | m_dc_pos.r1_before = mk("h_dc_pos_r1_before", "DC R1 before (+);edge (cm);counts"); | |
117 | 1 | m_dc_pos.r2_before = mk("h_dc_pos_r2_before", "DC R2 before (+);edge (cm);counts"); | |
118 | 1 | m_dc_pos.r3_before = mk("h_dc_pos_r3_before", "DC R3 before (+);edge (cm);counts"); | |
119 | 1 | m_dc_pos.r1_after = mk("h_dc_pos_r1_after", "DC R1 after (+);edge (cm);counts"); | |
120 | 1 | m_dc_pos.r2_after = mk("h_dc_pos_r2_after", "DC R2 after (+);edge (cm);counts"); | |
121 | 1 | m_dc_pos.r3_after = mk("h_dc_pos_r3_after", "DC R3 after (+);edge (cm);counts"); | |
122 | } | ||
123 |
1/2✓ Branch 0 (72→73) taken 1 times.
✗ Branch 1 (72→80) not taken.
|
1 | if (!m_dc_neg.r1_before) { |
124 | 1 | m_dc_neg.r1_before = mk("h_dc_neg_r1_before", "DC R1 before (-);edge (cm);counts"); | |
125 | 1 | m_dc_neg.r2_before = mk("h_dc_neg_r2_before", "DC R2 before (-);edge (cm);counts"); | |
126 | 1 | m_dc_neg.r3_before = mk("h_dc_neg_r3_before", "DC R3 before (-);edge (cm);counts"); | |
127 | 1 | m_dc_neg.r1_after = mk("h_dc_neg_r1_after", "DC R1 after (-);edge (cm);counts"); | |
128 | 1 | m_dc_neg.r2_after = mk("h_dc_neg_r2_after", "DC R2 after (-);edge (cm);counts"); | |
129 | 1 | m_dc_neg.r3_after = mk("h_dc_neg_r3_after", "DC R3 after (-);edge (cm);counts"); | |
130 | } | ||
131 | 1 | } | |
132 | |||
133 | 1 | void RGAFiducialFilterValidator::Start(hipo::banklist& banks) { | |
134 | |||
135 |
1/2✓ Branch 0 (3→4) taken 1 times.
✗ Branch 1 (3→6) not taken.
|
1 | if (gROOT) gROOT->SetBatch(kTRUE); |
136 |
1/2✓ Branch 0 (6→7) taken 1 times.
✗ Branch 1 (6→8) not taken.
|
1 | if (gStyle) gStyle->SetOptStat(0); |
137 | 1 | TH1::AddDirectory(kFALSE); | |
138 | |||
139 |
2/4✓ Branch 0 (10→11) taken 1 times.
✗ Branch 1 (10→88) not taken.
✓ Branch 2 (11→12) taken 1 times.
✗ Branch 3 (11→14) not taken.
|
1 | b_particle = GetBankIndex(banks, "REC::Particle"); |
140 |
1/2✓ Branch 0 (17→18) taken 1 times.
✗ Branch 1 (17→26) not taken.
|
1 | if (banklist_has(banks, "REC::Calorimeter")) { |
141 |
2/4✓ Branch 0 (19→20) taken 1 times.
✗ Branch 1 (19→94) not taken.
✗ Branch 2 (20→21) not taken.
✓ Branch 3 (20→23) taken 1 times.
|
2 | b_calor = GetBankIndex(banks, "REC::Calorimeter"); m_have_calor=true; |
142 | } | ||
143 |
1/2✗ Branch 0 (27→28) not taken.
✓ Branch 1 (27→36) taken 1 times.
|
1 | if (banklist_has(banks, "REC::ForwardTagger")) { |
144 | ✗ | b_ft = GetBankIndex(banks, "REC::ForwardTagger"); m_have_ft=true; | |
145 | } | ||
146 |
1/2✓ Branch 0 (37→38) taken 1 times.
✗ Branch 1 (37→46) not taken.
|
1 | if (banklist_has(banks, "REC::Traj")) { |
147 |
2/4✓ Branch 0 (39→40) taken 1 times.
✗ Branch 1 (39→106) not taken.
✓ Branch 2 (40→41) taken 1 times.
✗ Branch 3 (40→43) not taken.
|
2 | b_traj = GetBankIndex(banks, "REC::Traj"); m_have_traj=true; |
148 | } else { | ||
149 | ✗ | m_log->Info("[RGAFID][VAL] REC::Traj not provided; CVT/DC plots disabled. " | |
150 | "Re-run with -b REC::Traj to enable trajectory-based plots."); | ||
151 | } | ||
152 |
2/4✓ Branch 0 (49→50) taken 1 times.
✗ Branch 1 (49→112) not taken.
✓ Branch 2 (50→51) taken 1 times.
✗ Branch 3 (50→53) not taken.
|
1 | b_config = GetBankIndex(banks, "RUN::config"); |
153 | |||
154 | 2 | m_algo_seq = std::make_unique<AlgorithmSequence>(); | |
155 |
3/8✓ Branch 0 (60→61) taken 1 times.
✗ Branch 1 (60→124) not taken.
✓ Branch 2 (61→62) taken 1 times.
✗ Branch 3 (61→118) not taken.
✓ Branch 4 (67→68) taken 1 times.
✗ Branch 5 (67→70) not taken.
✗ Branch 6 (124→125) not taken.
✗ Branch 7 (124→127) not taken.
|
2 | m_algo_seq->Add("clas12::RGAFiducialFilter"); |
156 | 1 | m_algo_seq->Start(banks); | |
157 | |||
158 | // Output | ||
159 |
1/2✓ Branch 0 (74→75) taken 1 times.
✗ Branch 1 (74→83) not taken.
|
1 | if (auto dir = GetOutputDirectory()) { |
160 |
1/2✓ Branch 0 (75→76) taken 1 times.
✗ Branch 1 (75→132) not taken.
|
1 | m_base.Form("%s/rga_fiducial", dir->c_str()); |
161 |
2/4✓ Branch 0 (80→81) taken 1 times.
✗ Branch 1 (80→130) not taken.
✓ Branch 2 (81→82) taken 1 times.
✗ Branch 3 (81→130) not taken.
|
1 | m_out = new TFile(Form("%s.root", m_base.Data()), "RECREATE"); |
162 | } else { | ||
163 | ✗ | m_base = "rga_fiducial"; | |
164 | ✗ | m_out = nullptr; | |
165 | } | ||
166 | |||
167 | 1 | BookIfNeeded(); | |
168 | 1 | } | |
169 | |||
170 | // DC pad margins | ||
171 | 12 | static inline void SetDCPadMargins() { | |
172 | 12 | gPad->SetLeftMargin(0.16); | |
173 | 12 | gPad->SetRightMargin(0.06); | |
174 | 12 | gPad->SetBottomMargin(0.12); | |
175 | 12 | gPad->SetTopMargin(0.08); | |
176 | 12 | } | |
177 | |||
178 | 1000 | void RGAFiducialFilterValidator::Run(hipo::banklist& banks) const { | |
179 |
1/2✓ Branch 0 (3→4) taken 1000 times.
✗ Branch 1 (3→455) not taken.
|
1000 | auto& particle = GetBank(banks, b_particle, "REC::Particle"); |
180 |
1/2✓ Branch 0 (10→11) taken 1000 times.
✗ Branch 1 (10→461) not taken.
|
1000 | auto& config = GetBank(banks, b_config, "RUN::config"); |
181 | |||
182 | // track torus polarity stats (labels for DC summary) | ||
183 | { | ||
184 | 1000 | bool e_out = (config.getFloat("torus", 0) == 1.0f); | |
185 |
1/2✗ Branch 0 (17→18) not taken.
✓ Branch 1 (17→19) taken 1000 times.
|
1000 | if (e_out) const_cast<RGAFiducialFilterValidator*>(this)->m_torus_out_events++; |
186 | 1000 | else const_cast<RGAFiducialFilterValidator*>(this)->m_torus_in_events++; | |
187 | } | ||
188 | |||
189 | // snapshot before sets of pindex | ||
190 | std::unordered_set<int> eorg_before; | ||
191 | std::unordered_set<int> had_before; | ||
192 | std::unordered_set<int> pos_before, neg_before; | ||
193 | |||
194 |
3/4✓ Branch 0 (20→21) taken 1000 times.
✗ Branch 1 (20→569) not taken.
✓ Branch 2 (34→22) taken 6993 times.
✓ Branch 3 (34→35) taken 1000 times.
|
7993 | for (auto const& row : particle.getRowList()) { |
195 | 6993 | int pidx = (int)row; | |
196 | 6993 | int pid = particle.getInt("pid", row); | |
197 |
2/2✓ Branch 0 (23→24) taken 2478 times.
✓ Branch 1 (23→25) taken 4515 times.
|
6993 | if (pid==11 || pid==22) eorg_before.insert(pidx); |
198 |
6/6✓ Branch 0 (25→26) taken 5950 times.
✓ Branch 1 (25→28) taken 1043 times.
✓ Branch 2 (26→27) taken 5268 times.
✓ Branch 3 (26→28) taken 682 times.
✓ Branch 4 (27→28) taken 43 times.
✓ Branch 5 (27→29) taken 5225 times.
|
6993 | if (pid==211 || pid==321 || pid==2212 || pid==-211 || pid==-321 || pid==-2212) |
199 | had_before.insert(pidx); | ||
200 |
2/2✓ Branch 0 (29→30) taken 5566 times.
✓ Branch 1 (29→31) taken 1427 times.
|
6993 | if (pid>0) pos_before.insert(pidx); |
201 |
2/2✓ Branch 0 (31→32) taken 500 times.
✓ Branch 1 (31→33) taken 927 times.
|
1427 | else if (pid<0) neg_before.insert(pidx); |
202 | } | ||
203 | |||
204 | std::unordered_map<int,int> pid_before; | ||
205 |
3/4✓ Branch 0 (35→36) taken 1000 times.
✗ Branch 1 (35→567) not taken.
✓ Branch 2 (40→37) taken 6993 times.
✓ Branch 3 (40→41) taken 1000 times.
|
7993 | for (auto const& row : particle.getRowList()) { |
206 |
1/2✓ Branch 0 (38→39) taken 6993 times.
✗ Branch 1 (38→567) not taken.
|
6993 | pid_before[(int)row] = particle.getInt("pid", row); |
207 | } | ||
208 | |||
209 | // run the algorithm to prune REC::Particle in place | ||
210 |
1/2✓ Branch 0 (41→42) taken 1000 times.
✗ Branch 1 (41→567) not taken.
|
1000 | m_algo_seq->Run(banks); |
211 | |||
212 | // Snapshot after sets | ||
213 | std::unordered_set<int> eorg_after; | ||
214 | std::unordered_set<int> had_after; | ||
215 | std::unordered_set<int> pos_after, neg_after; | ||
216 | |||
217 |
3/4✓ Branch 0 (42→43) taken 1000 times.
✗ Branch 1 (42→559) not taken.
✓ Branch 2 (56→44) taken 6643 times.
✓ Branch 3 (56→57) taken 1000 times.
|
7643 | for (auto const& row : particle.getRowList()) { |
218 | 6643 | int pidx = (int)row; | |
219 | 6643 | int pid = particle.getInt("pid", row); | |
220 |
2/2✓ Branch 0 (45→46) taken 2368 times.
✓ Branch 1 (45→47) taken 4275 times.
|
6643 | if (pid==11 || pid==22) eorg_after.insert(pidx); |
221 |
6/6✓ Branch 0 (47→48) taken 5711 times.
✓ Branch 1 (47→50) taken 932 times.
✓ Branch 2 (48→49) taken 5141 times.
✓ Branch 3 (48→50) taken 570 times.
✓ Branch 4 (49→50) taken 28 times.
✓ Branch 5 (49→51) taken 5113 times.
|
6643 | if (pid==211 || pid==321 || pid==2212 || pid==-211 || pid==-321 || pid==-2212) |
222 | had_after.insert(pidx); | ||
223 |
2/2✓ Branch 0 (51→52) taken 5311 times.
✓ Branch 1 (51→53) taken 1332 times.
|
6643 | if (pid>0) pos_after.insert(pidx); |
224 |
2/2✓ Branch 0 (53→54) taken 405 times.
✓ Branch 1 (53→55) taken 927 times.
|
1332 | else if (pid<0) neg_after.insert(pidx); |
225 | } | ||
226 | |||
227 |
1/2✓ Branch 0 (57→58) taken 1000 times.
✗ Branch 1 (57→559) not taken.
|
1000 | std::scoped_lock<std::mutex> lock(m_mutex); |
228 | |||
229 | // PCal before/after (electrons, photons) | ||
230 |
1/2✓ Branch 0 (58→59) taken 1000 times.
✗ Branch 1 (58→148) not taken.
|
1000 | if (m_have_calor) { |
231 |
2/4✓ Branch 0 (59→60) taken 1000 times.
✗ Branch 1 (59→557) not taken.
✓ Branch 2 (60→61) taken 1000 times.
✗ Branch 3 (60→467) not taken.
|
2000 | auto& cal = GetBank(banks, b_calor, "REC::Calorimeter"); |
232 | |||
233 | // unique pindex counters per sector (for survival %) | ||
234 | std::array<std::set<int>,7> be_e, af_e, be_g, af_g; | ||
235 | |||
236 | const int n = cal.getRows(); | ||
237 |
2/2✓ Branch 0 (125→76) taken 6129 times.
✓ Branch 1 (125→131) taken 1000 times.
|
7129 | for (int i=0;i<n;++i) { |
238 |
2/2✓ Branch 0 (77→78) taken 2983 times.
✓ Branch 1 (77→79) taken 3146 times.
|
7624 | if (cal.getInt("layer", i) != 1) continue; // PCal only |
239 |
2/2✓ Branch 0 (80→81) taken 1495 times.
✓ Branch 1 (80→83) taken 1651 times.
|
3146 | int pidx = cal.getInt("pindex", i); |
240 | 1495 | if (!eorg_before.count(pidx)) continue; | |
241 | |||
242 | 1651 | int sector = cal.getInt("sector", i); | |
243 |
1/2✗ Branch 0 (85→86) not taken.
✓ Branch 1 (85→87) taken 1651 times.
|
1651 | if (sector < 1 || sector > 6) continue; |
244 | |||
245 | 1651 | double lv = cal.getFloat("lv", i); | |
246 |
1/2✓ Branch 0 (89→90) taken 1651 times.
✗ Branch 1 (89→91) not taken.
|
1651 | double lw = cal.getFloat("lw", i); |
247 | |||
248 | // PID for this pindex (from before snapshot) | ||
249 | int pid = 0; | ||
250 | auto itpb = pid_before.find(pidx); | ||
251 |
1/2✗ Branch 0 (91→92) not taken.
✓ Branch 1 (91→93) taken 1651 times.
|
1651 | if (itpb == pid_before.end()) continue; |
252 | 1651 | pid = itpb->second; | |
253 |
1/2✗ Branch 0 (93→94) not taken.
✓ Branch 1 (93→95) taken 1651 times.
|
1651 | if (pid!=11 && pid!=22) continue; |
254 | |||
255 | 1651 | auto& H = const_cast<RGAFiducialFilterValidator*>(this)->m_cal[pid][sector]; | |
256 | |||
257 |
4/6✓ Branch 0 (96→97) taken 1651 times.
✗ Branch 1 (96→99) not taken.
✓ Branch 2 (97→98) taken 391 times.
✓ Branch 3 (97→99) taken 1260 times.
✓ Branch 4 (98→99) taken 391 times.
✗ Branch 5 (98→473) not taken.
|
1651 | if (lv >= 0.0 && lv <= 45.0) H.lv_before->Fill(lv); |
258 |
4/6✓ Branch 0 (99→100) taken 1651 times.
✗ Branch 1 (99→102) not taken.
✓ Branch 2 (100→101) taken 415 times.
✓ Branch 3 (100→102) taken 1236 times.
✓ Branch 4 (101→102) taken 415 times.
✗ Branch 5 (101→473) not taken.
|
1651 | if (lw >= 0.0 && lw <= 45.0) H.lw_before->Fill(lw); |
259 | |||
260 | const bool survived = eorg_after.count(pidx); | ||
261 | |||
262 | if (survived) { | ||
263 |
4/6✓ Branch 0 (106→107) taken 1541 times.
✗ Branch 1 (106→109) not taken.
✓ Branch 2 (107→108) taken 332 times.
✓ Branch 3 (107→109) taken 1209 times.
✓ Branch 4 (108→109) taken 332 times.
✗ Branch 5 (108→473) not taken.
|
1541 | if (lv >= 0.0 && lv <= 45.0) H.lv_after->Fill(lv); |
264 |
4/6✓ Branch 0 (109→110) taken 1541 times.
✗ Branch 1 (109→111) not taken.
✓ Branch 2 (110→111) taken 1218 times.
✓ Branch 3 (110→112) taken 323 times.
✓ Branch 4 (112→111) taken 323 times.
✗ Branch 5 (112→473) not taken.
|
1541 | if (lw >= 0.0 && lw <= 45.0) H.lw_after->Fill(lw); |
265 | } | ||
266 | |||
267 | // unique pindex per sector (counts) | ||
268 |
2/2✓ Branch 0 (113→114) taken 145 times.
✓ Branch 1 (113→118) taken 1506 times.
|
1651 | if (pid==11) { |
269 | be_e[sector].insert(pidx); | ||
270 |
2/2✓ Branch 0 (115→116) taken 117 times.
✓ Branch 1 (115→122) taken 28 times.
|
145 | if (survived) af_e[sector].insert(pidx); |
271 | } else { | ||
272 | be_g[sector].insert(pidx); | ||
273 |
2/2✓ Branch 0 (119→120) taken 1424 times.
✓ Branch 1 (119→122) taken 82 times.
|
1506 | if (survived) af_g[sector].insert(pidx); |
274 | } | ||
275 | } | ||
276 | |||
277 |
2/2✓ Branch 0 (131→126) taken 6000 times.
✓ Branch 1 (131→132) taken 1000 times.
|
7000 | for (int s=1;s<=6;++s) { |
278 |
2/4✓ Branch 0 (126→127) taken 6000 times.
✗ Branch 1 (126→473) not taken.
✓ Branch 2 (127→128) taken 6000 times.
✗ Branch 3 (127→473) not taken.
|
6000 | const_cast<RGAFiducialFilterValidator*>(this)->m_cal_counts[11][s].before += be_e[s].size(); |
279 |
2/4✓ Branch 0 (127→128) taken 6000 times.
✗ Branch 1 (127→473) not taken.
✓ Branch 2 (128→129) taken 6000 times.
✗ Branch 3 (128→473) not taken.
|
6000 | const_cast<RGAFiducialFilterValidator*>(this)->m_cal_counts[11][s].after += af_e[s].size(); |
280 |
2/4✓ Branch 0 (128→129) taken 6000 times.
✗ Branch 1 (128→473) not taken.
✓ Branch 2 (129→130) taken 6000 times.
✗ Branch 3 (129→473) not taken.
|
6000 | const_cast<RGAFiducialFilterValidator*>(this)->m_cal_counts[22][s].before += be_g[s].size(); |
281 |
1/2✓ Branch 0 (129→130) taken 6000 times.
✗ Branch 1 (129→473) not taken.
|
6000 | const_cast<RGAFiducialFilterValidator*>(this)->m_cal_counts[22][s].after += af_g[s].size(); |
282 | } | ||
283 | } | ||
284 | |||
285 | // FT XY before/after (e-/gamma) | ||
286 |
1/2✗ Branch 0 (148→149) not taken.
✓ Branch 1 (148→243) taken 1000 times.
|
1000 | if (m_have_ft) { |
287 | ✗ | auto& ft = GetBank(banks, b_ft, "REC::ForwardTagger"); | |
288 | |||
289 | std::set<int> seen_b_e, seen_a_e, seen_b_g, seen_a_g; | ||
290 | |||
291 | const int n = ft.getRows(); | ||
292 | ✗ | for (int i=0;i<n;++i) { | |
293 | ✗ | int pidx = ft.getInt("pindex", i); | |
294 | ✗ | if (!eorg_before.count(pidx)) continue; | |
295 | |||
296 | int pid = 0; | ||
297 | auto itpb = pid_before.find(pidx); | ||
298 | ✗ | if (itpb == pid_before.end()) continue; | |
299 | ✗ | pid = itpb->second; | |
300 | ✗ | if (pid!=11 && pid!=22) continue; | |
301 | |||
302 | auto& HH = const_cast<RGAFiducialFilterValidator*>(this)->m_ft_h.at(pid); | ||
303 | |||
304 | ✗ | double x = ft.getFloat("x", i); | |
305 | ✗ | double y = ft.getFloat("y", i); | |
306 | ✗ | if (pid==11) { | |
307 | ✗ | if (!seen_b_e.count(pidx)) { HH.before->Fill(x, y); seen_b_e.insert(pidx); } | |
308 | ✗ | if (eorg_after.count(pidx) && !seen_a_e.count(pidx)) { HH.after->Fill(x, y); seen_a_e.insert(pidx); } | |
309 | } else { | ||
310 | ✗ | if (!seen_b_g.count(pidx)) { HH.before->Fill(x, y); seen_b_g.insert(pidx); } | |
311 | ✗ | if (eorg_after.count(pidx) && !seen_a_g.count(pidx)) { HH.after->Fill(x, y); seen_a_g.insert(pidx); } | |
312 | } | ||
313 | } | ||
314 | |||
315 | ✗ | const_cast<RGAFiducialFilterValidator*>(this)->m_ft_before_n[11] += seen_b_e.size(); | |
316 | ✗ | const_cast<RGAFiducialFilterValidator*>(this)->m_ft_after_n [11] += seen_a_e.size(); | |
317 | ✗ | const_cast<RGAFiducialFilterValidator*>(this)->m_ft_before_n[22] += seen_b_g.size(); | |
318 | ✗ | const_cast<RGAFiducialFilterValidator*>(this)->m_ft_after_n [22] += seen_a_g.size(); | |
319 | } | ||
320 | |||
321 | // CVT layer 12 phi/theta before/after (hadrons) | ||
322 |
1/2✓ Branch 0 (243→244) taken 1000 times.
✗ Branch 1 (243→306) not taken.
|
1000 | if (m_have_traj) { |
323 |
2/4✓ Branch 0 (244→245) taken 1000 times.
✗ Branch 1 (244→557) not taken.
✓ Branch 2 (245→246) taken 1000 times.
✗ Branch 3 (245→507) not taken.
|
2000 | auto& traj = GetBank(banks, b_traj, "REC::Traj"); |
324 | |||
325 | std::set<int> b_seen, a_seen; | ||
326 | |||
327 | const int n = traj.getRows(); | ||
328 |
2/2✓ Branch 0 (302→252) taken 38201 times.
✓ Branch 1 (302→303) taken 1000 times.
|
39201 | for (int i=0; i<n; ++i) { |
329 |
2/2✓ Branch 0 (253→254) taken 33561 times.
✓ Branch 1 (253→255) taken 4640 times.
|
42481 | if (traj.getInt("detector", i) != 5) continue; // CVT |
330 |
2/2✓ Branch 0 (256→257) taken 3712 times.
✓ Branch 1 (256→258) taken 928 times.
|
4640 | if (traj.getInt("layer", i) != 12) continue; |
331 | |||
332 |
2/2✓ Branch 0 (259→260) taken 568 times.
✓ Branch 1 (259→262) taken 360 times.
|
928 | int pidx = traj.getInt("pindex", i); |
333 | 568 | if (!had_before.count(pidx)) continue; | |
334 | |||
335 | 360 | double x = traj.getFloat("x", i); | |
336 | 360 | double y = traj.getFloat("y", i); | |
337 | 360 | double z = traj.getFloat("z", i); | |
338 | |||
339 | constexpr double kPI = 3.14159; | ||
340 |
2/2✓ Branch 0 (266→267) taken 171 times.
✓ Branch 1 (266→268) taken 189 times.
|
360 | double phi = std::atan2(y, x) * (180.0/kPI); if (phi < 0) phi += 360.0; |
341 | 360 | double rho = std::sqrt(x*x + y*y); | |
342 |
1/2✗ Branch 0 (268→269) not taken.
✓ Branch 1 (268→270) taken 360 times.
|
360 | double theta = std::atan2(rho, (z==0.0 ? 1e-9 : z)) * (180.0/kPI); |
343 | |||
344 |
1/2✓ Branch 0 (280→281) taken 360 times.
✗ Branch 1 (280→513) not taken.
|
360 | if (!b_seen.count(pidx)) { m_cvt_before->Fill(phi, theta); b_seen.insert(pidx); } |
345 | if (had_after.count(pidx) && !a_seen.count(pidx)) { | ||
346 |
1/2✓ Branch 0 (296→297) taken 247 times.
✗ Branch 1 (296→513) not taken.
|
247 | m_cvt_after->Fill(phi, theta); a_seen.insert(pidx); |
347 | } | ||
348 | } | ||
349 | |||
350 | 1000 | const_cast<RGAFiducialFilterValidator*>(this)->m_cvt_before_n += (long long) b_seen.size(); | |
351 | 1000 | const_cast<RGAFiducialFilterValidator*>(this)->m_cvt_after_n += (long long) a_seen.size(); | |
352 | } | ||
353 | |||
354 | // DC edges pos/neg before/after (use last-seen edge per (track,region)) | ||
355 |
1/2✓ Branch 0 (306→307) taken 1000 times.
✗ Branch 1 (306→444) not taken.
|
1000 | if (m_have_traj) { |
356 |
2/4✓ Branch 0 (307→308) taken 1000 times.
✗ Branch 1 (307→557) not taken.
✓ Branch 2 (308→309) taken 1000 times.
✗ Branch 3 (308→517) not taken.
|
2000 | auto& traj = GetBank(banks, b_traj, "REC::Traj"); |
357 | |||
358 | std::unordered_map<int,double> pos_r1, pos_r2, pos_r3; | ||
359 | std::unordered_map<int,double> neg_r1, neg_r2, neg_r3; | ||
360 | |||
361 | const int n = traj.getRows(); | ||
362 |
2/2✓ Branch 0 (352→315) taken 38201 times.
✓ Branch 1 (352→353) taken 1000 times.
|
39201 | for (int i=0;i<n;++i) { |
363 |
2/2✓ Branch 0 (316→317) taken 32600 times.
✓ Branch 1 (316→318) taken 5601 times.
|
39017 | if (traj.getInt("detector", i) != 6) continue; // DC |
364 | |||
365 | 5601 | int pidx = traj.getInt("pindex", i); | |
366 | 5601 | double edge = traj.getFloat("edge", i); | |
367 | 5601 | int layer = traj.getInt("layer", i); | |
368 | |||
369 | bool is_pos_before = pos_before.count(pidx); | ||
370 | bool is_neg_before = neg_before.count(pidx); | ||
371 |
2/2✓ Branch 0 (327→329) taken 816 times.
✓ Branch 1 (327→330) taken 3618 times.
|
4434 | if (!is_pos_before && !is_neg_before) continue; |
372 | |||
373 |
2/2✓ Branch 0 (330→331) taken 3618 times.
✓ Branch 1 (330→340) taken 1167 times.
|
4785 | if (is_pos_before) { |
374 |
2/2✓ Branch 0 (331→332) taken 1206 times.
✓ Branch 1 (331→334) taken 2412 times.
|
4824 | if (layer== 6) pos_r1[pidx] = edge; |
375 |
2/2✓ Branch 0 (334→335) taken 1206 times.
✓ Branch 1 (334→337) taken 1206 times.
|
3618 | else if (layer==18) pos_r2[pidx] = edge; |
376 |
1/2✓ Branch 0 (337→338) taken 1206 times.
✗ Branch 1 (337→349) not taken.
|
2412 | else if (layer==36) pos_r3[pidx] = edge; |
377 | } else { // negative | ||
378 |
2/2✓ Branch 0 (340→341) taken 389 times.
✓ Branch 1 (340→343) taken 778 times.
|
1556 | if (layer== 6) neg_r1[pidx] = edge; |
379 |
2/2✓ Branch 0 (343→344) taken 389 times.
✓ Branch 1 (343→346) taken 389 times.
|
1167 | else if (layer==18) neg_r2[pidx] = edge; |
380 |
1/2✓ Branch 0 (346→347) taken 389 times.
✗ Branch 1 (346→349) not taken.
|
778 | else if (layer==36) neg_r3[pidx] = edge; |
381 | } | ||
382 | } | ||
383 | |||
384 |
8/12✓ Branch 0 (354→355) taken 1206 times.
✗ Branch 1 (354→356) not taken.
✓ Branch 2 (355→356) taken 1206 times.
✗ Branch 3 (355→545) not taken.
✓ Branch 4 (356→357) taken 99 times.
✓ Branch 5 (356→358) taken 1107 times.
✓ Branch 6 (359→360) taken 1107 times.
✗ Branch 7 (359→361) not taken.
✓ Branch 8 (360→361) taken 1107 times.
✗ Branch 9 (360→545) not taken.
✓ Branch 10 (362→354) taken 1206 times.
✓ Branch 11 (362→363) taken 1000 times.
|
3313 | for (auto& kv : pos_r1) { if (m_dc_pos.r1_before) m_dc_pos.r1_before->Fill(kv.second); if (pos_after.count(kv.first) && m_dc_pos.r1_after) m_dc_pos.r1_after->Fill(kv.second); } |
385 |
8/12✓ Branch 0 (364→365) taken 1206 times.
✗ Branch 1 (364→366) not taken.
✓ Branch 2 (365→366) taken 1206 times.
✗ Branch 3 (365→545) not taken.
✓ Branch 4 (366→367) taken 99 times.
✓ Branch 5 (366→368) taken 1107 times.
✓ Branch 6 (369→370) taken 1107 times.
✗ Branch 7 (369→371) not taken.
✓ Branch 8 (370→371) taken 1107 times.
✗ Branch 9 (370→545) not taken.
✓ Branch 10 (372→364) taken 1206 times.
✓ Branch 11 (372→373) taken 1000 times.
|
3313 | for (auto& kv : pos_r2) { if (m_dc_pos.r2_before) m_dc_pos.r2_before->Fill(kv.second); if (pos_after.count(kv.first) && m_dc_pos.r2_after) m_dc_pos.r2_after->Fill(kv.second); } |
386 |
8/12✓ Branch 0 (374→375) taken 1206 times.
✗ Branch 1 (374→376) not taken.
✓ Branch 2 (375→376) taken 1206 times.
✗ Branch 3 (375→545) not taken.
✓ Branch 4 (376→377) taken 99 times.
✓ Branch 5 (376→378) taken 1107 times.
✓ Branch 6 (379→380) taken 1107 times.
✗ Branch 7 (379→381) not taken.
✓ Branch 8 (380→381) taken 1107 times.
✗ Branch 9 (380→545) not taken.
✓ Branch 10 (382→374) taken 1206 times.
✓ Branch 11 (382→383) taken 1000 times.
|
3313 | for (auto& kv : pos_r3) { if (m_dc_pos.r3_before) m_dc_pos.r3_before->Fill(kv.second); if (pos_after.count(kv.first) && m_dc_pos.r3_after) m_dc_pos.r3_after->Fill(kv.second); } |
387 |
8/12✓ Branch 0 (384→385) taken 389 times.
✗ Branch 1 (384→386) not taken.
✓ Branch 2 (385→386) taken 389 times.
✗ Branch 3 (385→545) not taken.
✓ Branch 4 (386→387) taken 56 times.
✓ Branch 5 (386→388) taken 333 times.
✓ Branch 6 (389→390) taken 333 times.
✗ Branch 7 (389→391) not taken.
✓ Branch 8 (390→391) taken 333 times.
✗ Branch 9 (390→545) not taken.
✓ Branch 10 (392→384) taken 389 times.
✓ Branch 11 (392→393) taken 1000 times.
|
1722 | for (auto& kv : neg_r1) { if (m_dc_neg.r1_before) m_dc_neg.r1_before->Fill(kv.second); if (neg_after.count(kv.first) && m_dc_neg.r1_after) m_dc_neg.r1_after->Fill(kv.second); } |
388 |
8/12✓ Branch 0 (394→395) taken 389 times.
✗ Branch 1 (394→396) not taken.
✓ Branch 2 (395→396) taken 389 times.
✗ Branch 3 (395→545) not taken.
✓ Branch 4 (396→397) taken 56 times.
✓ Branch 5 (396→398) taken 333 times.
✓ Branch 6 (399→400) taken 333 times.
✗ Branch 7 (399→401) not taken.
✓ Branch 8 (400→401) taken 333 times.
✗ Branch 9 (400→545) not taken.
✓ Branch 10 (402→394) taken 389 times.
✓ Branch 11 (402→403) taken 1000 times.
|
1722 | for (auto& kv : neg_r2) { if (m_dc_neg.r2_before) m_dc_neg.r2_before->Fill(kv.second); if (neg_after.count(kv.first) && m_dc_neg.r2_after) m_dc_neg.r2_after->Fill(kv.second); } |
389 |
8/12✓ Branch 0 (404→405) taken 389 times.
✗ Branch 1 (404→406) not taken.
✓ Branch 2 (405→406) taken 389 times.
✗ Branch 3 (405→545) not taken.
✓ Branch 4 (406→407) taken 56 times.
✓ Branch 5 (406→408) taken 333 times.
✓ Branch 6 (409→410) taken 333 times.
✗ Branch 7 (409→411) not taken.
✓ Branch 8 (410→411) taken 333 times.
✗ Branch 9 (410→545) not taken.
✓ Branch 10 (412→404) taken 389 times.
✓ Branch 11 (412→413) taken 1000 times.
|
1722 | for (auto& kv : neg_r3) { if (m_dc_neg.r3_before) m_dc_neg.r3_before->Fill(kv.second); if (neg_after.count(kv.first) && m_dc_neg.r3_after) m_dc_neg.r3_after->Fill(kv.second); } |
390 | |||
391 | 6000 | auto set_from_keys = [](const std::unordered_map<int,double>& m){ | |
392 |
3/4✓ Branch 0 (3→4) taken 4785 times.
✗ Branch 1 (3→7) not taken.
✓ Branch 2 (5→3) taken 4785 times.
✓ Branch 3 (5→6) taken 6000 times.
|
10785 | std::set<int> s; for (auto& kv : m) s.insert(kv.first); return s; }; |
393 | |||
394 |
1/2✗ Branch 0 (2→3) not taken.
✓ Branch 1 (2→4) taken 4000 times.
|
4000 | auto inter3 = [](const std::set<int>& A, |
395 | const std::set<int>& B, const std::set<int>& C)->size_t { | ||
396 | const std::set<int>* smallest = &A; | ||
397 |
1/2✗ Branch 0 (2→3) not taken.
✓ Branch 1 (2→4) taken 4000 times.
|
4000 | if (B.size() < smallest->size()) smallest = &B; |
398 |
1/2✗ Branch 0 (4→5) not taken.
✓ Branch 1 (4→6) taken 4000 times.
|
4000 | if (C.size() < smallest->size()) smallest = &C; |
399 | size_t cnt=0; | ||
400 |
2/2✓ Branch 0 (39→7) taken 3035 times.
✓ Branch 1 (39→40) taken 4000 times.
|
10070 | for (int v : *smallest) if (A.count(v) && B.count(v) && C.count(v)) ++cnt; |
401 | 4000 | return cnt; | |
402 | }; | ||
403 | |||
404 | 6000 | auto keep_if_survived = [](const std::set<int>& S, const std::unordered_set<int>& survivors){ | |
405 |
4/4✓ Branch 0 (3→4) taken 465 times.
✓ Branch 1 (3→5) taken 4320 times.
✓ Branch 2 (8→3) taken 4785 times.
✓ Branch 3 (8→9) taken 6000 times.
|
10785 | std::set<int> out; for (int v : S) if (survivors.count(v)) out.insert(v); return out; }; |
406 | |||
407 |
3/6✓ Branch 0 (413→414) taken 1000 times.
✗ Branch 1 (413→545) not taken.
✓ Branch 2 (414→415) taken 1000 times.
✗ Branch 3 (414→543) not taken.
✓ Branch 4 (415→416) taken 1000 times.
✗ Branch 5 (415→541) not taken.
|
1000 | std::set<int> pos_b1 = set_from_keys(pos_r1), pos_b2 = set_from_keys(pos_r2), pos_b3 = set_from_keys(pos_r3); |
408 |
3/6✓ Branch 0 (416→417) taken 1000 times.
✗ Branch 1 (416→539) not taken.
✓ Branch 2 (417→418) taken 1000 times.
✗ Branch 3 (417→537) not taken.
✓ Branch 4 (418→419) taken 1000 times.
✗ Branch 5 (418→535) not taken.
|
1000 | std::set<int> neg_b1 = set_from_keys(neg_r1), neg_b2 = set_from_keys(neg_r2), neg_b3 = set_from_keys(neg_r3); |
409 | |||
410 |
1/2✓ Branch 0 (419→420) taken 1000 times.
✗ Branch 1 (419→533) not taken.
|
1000 | std::set<int> pos_a1 = keep_if_survived(pos_b1, pos_after); |
411 |
1/2✓ Branch 0 (420→421) taken 1000 times.
✗ Branch 1 (420→531) not taken.
|
1000 | std::set<int> pos_a2 = keep_if_survived(pos_b2, pos_after); |
412 |
1/2✓ Branch 0 (421→422) taken 1000 times.
✗ Branch 1 (421→529) not taken.
|
1000 | std::set<int> pos_a3 = keep_if_survived(pos_b3, pos_after); |
413 |
1/2✓ Branch 0 (422→423) taken 1000 times.
✗ Branch 1 (422→527) not taken.
|
1000 | std::set<int> neg_a1 = keep_if_survived(neg_b1, neg_after); |
414 |
1/2✓ Branch 0 (423→424) taken 1000 times.
✗ Branch 1 (423→525) not taken.
|
1000 | std::set<int> neg_a2 = keep_if_survived(neg_b2, neg_after); |
415 |
1/2✓ Branch 0 (424→425) taken 1000 times.
✗ Branch 1 (424→523) not taken.
|
1000 | std::set<int> neg_a3 = keep_if_survived(neg_b3, neg_after); |
416 | |||
417 | 1000 | const_cast<RGAFiducialFilterValidator*>(this)->m_dc_pos_before_n += (long long) inter3(pos_b1, pos_b2, pos_b3); | |
418 | 1000 | const_cast<RGAFiducialFilterValidator*>(this)->m_dc_pos_after_n += (long long) inter3(pos_a1, pos_a2, pos_a3); | |
419 | 1000 | const_cast<RGAFiducialFilterValidator*>(this)->m_dc_neg_before_n += (long long) inter3(neg_b1, neg_b2, neg_b3); | |
420 | 1000 | const_cast<RGAFiducialFilterValidator*>(this)->m_dc_neg_after_n += (long long) inter3(neg_a1, neg_a2, neg_a3); | |
421 | } | ||
422 | 1000 | } | |
423 | |||
424 | // plotting | ||
425 |
1/2✓ Branch 0 (2→3) taken 2 times.
✗ Branch 1 (2→4) not taken.
|
2 | void RGAFiducialFilterValidator::DrawCalCanvas(int pid, const char* title) { |
426 | auto it = m_cal.find(pid); | ||
427 |
1/2✓ Branch 0 (4→5) taken 2 times.
✗ Branch 1 (4→58) not taken.
|
2 | if (it == m_cal.end()) return; |
428 | |||
429 |
2/4✓ Branch 0 (6→7) taken 2 times.
✗ Branch 1 (6→59) not taken.
✓ Branch 2 (7→8) taken 2 times.
✗ Branch 3 (7→59) not taken.
|
2 | auto* c = new TCanvas(Form("rgafid_pcal_pid%d", pid), title, 1400, 900); |
430 | 2 | c->Divide(3,2); | |
431 | |||
432 |
2/2✓ Branch 0 (52→9) taken 12 times.
✓ Branch 1 (52→53) taken 2 times.
|
14 | for (int s=1; s<=6; ++s) { |
433 | 12 | c->cd(s); | |
434 | 12 | gPad->SetLeftMargin(0.12); gPad->SetRightMargin(0.04); | |
435 | 12 | gPad->SetBottomMargin(0.12); gPad->SetTopMargin(0.08); | |
436 | |||
437 | 12 | auto& H = it->second[s]; | |
438 |
1/2✗ Branch 0 (18→19) not taken.
✓ Branch 1 (18→20) taken 12 times.
|
12 | if (!H.lv_before) continue; |
439 | |||
440 | 12 | H.lv_before->SetLineColor(kBlue+1); H.lv_before->SetLineWidth(2); | |
441 | 12 | H.lw_before->SetLineColor(kRed+1); H.lw_before->SetLineWidth(2); | |
442 | 12 | H.lv_after ->SetLineColor(kBlue+1); H.lv_after ->SetLineWidth(2); H.lv_after ->SetLineStyle(2); | |
443 | 12 | H.lw_after ->SetLineColor(kRed+1); H.lw_after ->SetLineWidth(2); H.lw_after ->SetLineStyle(2); | |
444 | |||
445 | // survival % for this PID/sector (unique pindex) | ||
446 | 12 | long long b = m_cal_counts[pid][s].before; | |
447 | 12 | long long a = m_cal_counts[pid][s].after; | |
448 |
1/2✓ Branch 0 (32→33) taken 12 times.
✗ Branch 1 (32→34) not taken.
|
12 | double pct = (b>0) ? (100.0*double(a)/double(b)) : 0.0; |
449 | |||
450 |
2/2✓ Branch 0 (34→35) taken 6 times.
✓ Branch 1 (34→36) taken 6 times.
|
18 | H.lv_before->SetTitle(Form("%s - Sector %d [survive = %.3f%%];length (cm);counts", |
451 | pid==11?"Electrons":"Photons", s, pct)); | ||
452 | |||
453 | 12 | H.lv_before->Draw("HIST"); | |
454 | 12 | H.lw_before->Draw("HISTSAME"); | |
455 | 12 | H.lv_after ->Draw("HISTSAME"); | |
456 | 12 | H.lw_after ->Draw("HISTSAME"); | |
457 | |||
458 |
1/2✓ Branch 0 (43→44) taken 12 times.
✗ Branch 1 (43→61) not taken.
|
12 | auto* leg = new TLegend(0.55, 0.72, 0.88, 0.90); |
459 | 12 | leg->SetBorderSize(0); leg->SetFillStyle(0); | |
460 | 12 | leg->AddEntry(H.lv_before, "lv before", "l"); | |
461 | 12 | leg->AddEntry(H.lw_before, "lw before", "l"); | |
462 | 12 | leg->AddEntry(H.lv_after , "lv after", "l"); | |
463 | 12 | leg->AddEntry(H.lw_after , "lw after", "l"); | |
464 | leg->SetBit(TObject::kCanDelete); | ||
465 | 12 | leg->Draw(); | |
466 | } | ||
467 | |||
468 | 2 | SaveAndDisposeCanvas(c, Form("%s_pcal_lv_lw_pid%d.png", m_base.Data(), pid)); | |
469 | } | ||
470 | |||
471 | 1 | void RGAFiducialFilterValidator::DrawFTCanvas2x2() { | |
472 |
1/2✓ Branch 0 (2→3) taken 1 times.
✗ Branch 1 (2→4) not taken.
|
1 | if (!m_have_ft) return; |
473 | |||
474 | ✗ | auto* c = new TCanvas("rgafid_ft_xy_2x2", "FT x-y Before/After", 1200, 900); | |
475 | ✗ | c->Divide(2,2); | |
476 | |||
477 | ✗ | auto draw_pad = [&](int pad, TH2F* h, const char* ttl){ | |
478 | ✗ | c->cd(pad); | |
479 | ✗ | gPad->SetLeftMargin(0.12); gPad->SetRightMargin(0.04); | |
480 | ✗ | gPad->SetBottomMargin(0.12); gPad->SetTopMargin(0.08); | |
481 | ✗ | h->SetTitle(ttl); | |
482 | ✗ | h->Draw("COLZ"); | |
483 | ✗ | }; | |
484 | |||
485 | ✗ | auto pct = [&](int pid)->double{ | |
486 | ✗ | long long b = m_ft_before_n[pid]; | |
487 | ✗ | long long a = m_ft_after_n[pid]; | |
488 | ✗ | return (b>0) ? (100.0*double(a)/double(b)) : 0.0; | |
489 | ✗ | }; | |
490 | |||
491 | ✗ | draw_pad(1, m_ft_h.at(11).before, "Electrons (before);x (cm);y (cm)"); | |
492 | ✗ | draw_pad(2, m_ft_h.at(11).after, | |
493 | ✗ | Form("Electrons (after) [survive = %.3f%%];x (cm);y (cm)", pct(11))); | |
494 | |||
495 | ✗ | draw_pad(3, m_ft_h.at(22).before, "Photons (before);x (cm);y (cm)"); | |
496 | ✗ | draw_pad(4, m_ft_h.at(22).after, | |
497 | ✗ | Form("Photons (after) [survive = %.3f%%];x (cm);y (cm)", pct(22))); | |
498 | |||
499 | ✗ | SaveAndDisposeCanvas(c, Form("%s_ft_xy_2x2.png", m_base.Data())); | |
500 | } | ||
501 | |||
502 | 1 | void RGAFiducialFilterValidator::DrawCVTCanvas1x2(const char* title) { | |
503 |
3/6✓ Branch 0 (2→3) taken 1 times.
✗ Branch 1 (2→37) not taken.
✓ Branch 2 (3→4) taken 1 times.
✗ Branch 3 (3→37) not taken.
✓ Branch 4 (4→5) taken 1 times.
✗ Branch 5 (4→37) not taken.
|
1 | if (!m_have_traj || !m_cvt_before || !m_cvt_after) return; |
504 | |||
505 |
1/2✓ Branch 0 (6→7) taken 1 times.
✗ Branch 1 (6→38) not taken.
|
1 | auto* c = new TCanvas("rgafid_cvt_l12_all", title, 1200, 600); |
506 | 1 | c->Divide(2,1); | |
507 | |||
508 | const double left = 0.12; | ||
509 | const double right = 0.16; | ||
510 | const double bottom = 0.12; | ||
511 | const double top = 0.08; | ||
512 | |||
513 | double pct = 0.0; | ||
514 |
1/2✓ Branch 0 (8→9) taken 1 times.
✗ Branch 1 (8→10) not taken.
|
1 | if (m_cvt_before_n > 0) pct = 100.0 * double(m_cvt_after_n) / double(m_cvt_before_n); |
515 | |||
516 | 1 | c->cd(1); | |
517 | 1 | gPad->SetLeftMargin(left); | |
518 | 1 | gPad->SetRightMargin(right); | |
519 | 1 | gPad->SetBottomMargin(bottom); | |
520 | 1 | gPad->SetTopMargin(top); | |
521 | 1 | m_cvt_before->Draw("COLZ"); | |
522 | |||
523 | 1 | c->cd(2); | |
524 | 1 | gPad->SetLeftMargin(left); | |
525 | 1 | gPad->SetRightMargin(right); | |
526 | 1 | gPad->SetBottomMargin(bottom); | |
527 | 1 | gPad->SetTopMargin(top); | |
528 | 1 | m_cvt_after->SetTitle(Form("CVT layer 12 after (hadrons) [survive = %.3f%%];phi (deg);theta (deg)", pct)); | |
529 | 1 | m_cvt_after->Draw("COLZ"); | |
530 | |||
531 | 1 | SaveAndDisposeCanvas(c, Form("%s_cvt_l12_phi_theta_hadrons.png", m_base.Data())); | |
532 | } | ||
533 | |||
534 | 2 | void RGAFiducialFilterValidator::DrawDCCanvas2x3(const DCHists& H, | |
535 | const char* bend, double survive_pct) { | ||
536 | |||
537 |
5/8✓ Branch 0 (3→4) taken 2 times.
✗ Branch 1 (3→76) not taken.
✓ Branch 2 (4→5) taken 1 times.
✓ Branch 3 (4→6) taken 1 times.
✓ Branch 4 (6→7) taken 2 times.
✗ Branch 5 (6→76) not taken.
✓ Branch 6 (8→9) taken 2 times.
✗ Branch 7 (8→80) not taken.
|
3 | TString bendTitle = (TString(bend)=="inb") ? "Inb" : "Out"; |
538 | |||
539 |
1/2✓ Branch 0 (12→13) taken 2 times.
✗ Branch 1 (12→78) not taken.
|
2 | auto* c = new TCanvas(Form("rgafid_dc_%s_2x3", bend), |
540 |
2/4✓ Branch 0 (11→12) taken 2 times.
✗ Branch 1 (11→78) not taken.
✓ Branch 2 (13→14) taken 2 times.
✗ Branch 3 (13→78) not taken.
|
4 | Form("%s DC edges: before/after", bendTitle.Data()), 1500, 900); |
541 |
1/2✓ Branch 0 (14→15) taken 2 times.
✗ Branch 1 (14→80) not taken.
|
2 | c->Divide(3,2); |
542 | |||
543 | // before row | ||
544 |
3/6✓ Branch 0 (15→16) taken 2 times.
✗ Branch 1 (15→80) not taken.
✓ Branch 2 (16→17) taken 2 times.
✗ Branch 3 (16→80) not taken.
✓ Branch 4 (17→18) taken 2 times.
✗ Branch 5 (17→24) not taken.
|
2 | c->cd(1); SetDCPadMargins(); if (H.r1_before) { |
545 |
1/2✓ Branch 0 (18→19) taken 2 times.
✗ Branch 1 (18→80) not taken.
|
2 | H.r1_before->SetLineWidth(2); |
546 |
1/2✓ Branch 0 (19→20) taken 2 times.
✗ Branch 1 (19→80) not taken.
|
2 | H.r1_before->Draw("HIST"); |
547 |
3/6✗ Branch 0 (20→21) not taken.
✓ Branch 1 (20→22) taken 2 times.
✓ Branch 2 (22→23) taken 2 times.
✗ Branch 3 (22→80) not taken.
✓ Branch 4 (23→24) taken 2 times.
✗ Branch 5 (23→80) not taken.
|
2 | H.r1_before->SetTitle(Form("%s DC Region 1 (before);edge (cm);counts", bendTitle.Data())); } |
548 |
3/6✓ Branch 0 (24→25) taken 2 times.
✗ Branch 1 (24→80) not taken.
✓ Branch 2 (25→26) taken 2 times.
✗ Branch 3 (25→80) not taken.
✓ Branch 4 (26→27) taken 2 times.
✗ Branch 5 (26→33) not taken.
|
2 | c->cd(2); SetDCPadMargins(); if (H.r2_before) { |
549 |
1/2✓ Branch 0 (27→28) taken 2 times.
✗ Branch 1 (27→80) not taken.
|
2 | H.r2_before->SetLineWidth(2); |
550 |
1/2✓ Branch 0 (28→29) taken 2 times.
✗ Branch 1 (28→80) not taken.
|
2 | H.r2_before->Draw("HIST"); |
551 |
3/6✗ Branch 0 (29→30) not taken.
✓ Branch 1 (29→31) taken 2 times.
✓ Branch 2 (31→32) taken 2 times.
✗ Branch 3 (31→80) not taken.
✓ Branch 4 (32→33) taken 2 times.
✗ Branch 5 (32→80) not taken.
|
2 | H.r2_before->SetTitle(Form("%s DC Region 2 (before);edge (cm);counts", bendTitle.Data())); } |
552 |
3/6✓ Branch 0 (33→34) taken 2 times.
✗ Branch 1 (33→80) not taken.
✓ Branch 2 (34→35) taken 2 times.
✗ Branch 3 (34→80) not taken.
✓ Branch 4 (35→36) taken 2 times.
✗ Branch 5 (35→42) not taken.
|
2 | c->cd(3); SetDCPadMargins(); if (H.r3_before) { |
553 |
1/2✓ Branch 0 (36→37) taken 2 times.
✗ Branch 1 (36→80) not taken.
|
2 | H.r3_before->SetLineWidth(2); |
554 |
1/2✓ Branch 0 (37→38) taken 2 times.
✗ Branch 1 (37→80) not taken.
|
2 | H.r3_before->Draw("HIST"); |
555 |
3/6✗ Branch 0 (38→39) not taken.
✓ Branch 1 (38→40) taken 2 times.
✓ Branch 2 (40→41) taken 2 times.
✗ Branch 3 (40→80) not taken.
✓ Branch 4 (41→42) taken 2 times.
✗ Branch 5 (41→80) not taken.
|
2 | H.r3_before->SetTitle(Form("%s DC Region 3 (before);edge (cm);counts", bendTitle.Data())); } |
556 | |||
557 | // after row | ||
558 |
3/6✓ Branch 0 (42→43) taken 2 times.
✗ Branch 1 (42→80) not taken.
✓ Branch 2 (43→44) taken 2 times.
✗ Branch 3 (43→80) not taken.
✓ Branch 4 (44→45) taken 2 times.
✗ Branch 5 (44→51) not taken.
|
2 | c->cd(4); SetDCPadMargins(); if (H.r1_after) { |
559 |
1/2✓ Branch 0 (45→46) taken 2 times.
✗ Branch 1 (45→80) not taken.
|
2 | H.r1_after ->SetLineWidth(2); |
560 |
1/2✓ Branch 0 (46→47) taken 2 times.
✗ Branch 1 (46→80) not taken.
|
2 | H.r1_after ->Draw("HIST"); |
561 |
3/6✗ Branch 0 (47→48) not taken.
✓ Branch 1 (47→49) taken 2 times.
✓ Branch 2 (49→50) taken 2 times.
✗ Branch 3 (49→80) not taken.
✓ Branch 4 (50→51) taken 2 times.
✗ Branch 5 (50→80) not taken.
|
2 | H.r1_after ->SetTitle(Form("%s DC Region 1 (after) [survive = %.3f%%];edge (cm);counts", bendTitle.Data(), survive_pct)); } |
562 |
3/6✓ Branch 0 (51→52) taken 2 times.
✗ Branch 1 (51→80) not taken.
✓ Branch 2 (52→53) taken 2 times.
✗ Branch 3 (52→80) not taken.
✓ Branch 4 (53→54) taken 2 times.
✗ Branch 5 (53→60) not taken.
|
2 | c->cd(5); SetDCPadMargins(); if (H.r2_after) { |
563 |
1/2✓ Branch 0 (54→55) taken 2 times.
✗ Branch 1 (54→80) not taken.
|
2 | H.r2_after ->SetLineWidth(2); |
564 |
1/2✓ Branch 0 (55→56) taken 2 times.
✗ Branch 1 (55→80) not taken.
|
2 | H.r2_after ->Draw("HIST"); |
565 |
3/6✗ Branch 0 (56→57) not taken.
✓ Branch 1 (56→58) taken 2 times.
✓ Branch 2 (58→59) taken 2 times.
✗ Branch 3 (58→80) not taken.
✓ Branch 4 (59→60) taken 2 times.
✗ Branch 5 (59→80) not taken.
|
2 | H.r2_after ->SetTitle(Form("%s DC Region 2 (after) [survive = %.3f%%];edge (cm);counts", bendTitle.Data(), survive_pct)); } |
566 |
3/6✓ Branch 0 (60→61) taken 2 times.
✗ Branch 1 (60→80) not taken.
✓ Branch 2 (61→62) taken 2 times.
✗ Branch 3 (61→80) not taken.
✓ Branch 4 (62→63) taken 2 times.
✗ Branch 5 (62→69) not taken.
|
2 | c->cd(6); SetDCPadMargins(); if (H.r3_after) { |
567 |
1/2✓ Branch 0 (63→64) taken 2 times.
✗ Branch 1 (63→80) not taken.
|
2 | H.r3_after ->SetLineWidth(2); |
568 |
1/2✓ Branch 0 (64→65) taken 2 times.
✗ Branch 1 (64→80) not taken.
|
2 | H.r3_after ->Draw("HIST"); |
569 |
3/6✗ Branch 0 (65→66) not taken.
✓ Branch 1 (65→67) taken 2 times.
✓ Branch 2 (67→68) taken 2 times.
✗ Branch 3 (67→80) not taken.
✓ Branch 4 (68→69) taken 2 times.
✗ Branch 5 (68→80) not taken.
|
2 | H.r3_after ->SetTitle(Form("%s DC Region 3 (after) [survive = %.3f%%];edge (cm);counts", bendTitle.Data(), survive_pct)); } |
570 | |||
571 |
2/4✓ Branch 0 (72→73) taken 2 times.
✗ Branch 1 (72→80) not taken.
✓ Branch 2 (73→74) taken 2 times.
✗ Branch 3 (73→80) not taken.
|
2 | SaveAndDisposeCanvas(c, Form("%s_dc_%s_2x3.png", m_base.Data(), bend)); |
572 | 2 | } | |
573 | |||
574 | 1 | void RGAFiducialFilterValidator::Stop() { | |
575 | // PCAL canvases | ||
576 | 1 | DrawCalCanvas(11, "PCAL lv & lw (Electrons): before solid, after dashed"); | |
577 | 1 | DrawCalCanvas(22, "PCAL lv & lw (Photons): before solid, after dashed"); | |
578 | |||
579 | // FT 2x2 | ||
580 | 1 | DrawFTCanvas2x2(); | |
581 | |||
582 | // CVT 1x2 (combined hadrons) with survive % | ||
583 | 1 | DrawCVTCanvas1x2("CVT layer 12 (Hadrons): phi vs theta"); | |
584 | |||
585 | // Torus labels for DC summaries | ||
586 | 1 | bool electron_out = (m_torus_out_events >= m_torus_in_events); | |
587 |
1/2✓ Branch 0 (6→7) taken 1 times.
✗ Branch 1 (6→8) not taken.
|
1 | const char* pos_bend_id = electron_out ? "inb" : "out"; |
588 |
1/2✓ Branch 0 (8→9) taken 1 times.
✗ Branch 1 (8→10) not taken.
|
1 | const char* neg_bend_id = electron_out ? "out" : "inb"; |
589 | |||
590 | // DC canvases | ||
591 | 1 | double pos_pct = | |
592 |
1/2✓ Branch 0 (10→11) taken 1 times.
✗ Branch 1 (10→12) not taken.
|
1 | (m_dc_pos_before_n>0) ? (100.0*double(m_dc_pos_after_n)/double(m_dc_pos_before_n)) : 0.0; |
593 | 1 | double neg_pct = | |
594 |
1/2✓ Branch 0 (12→13) taken 1 times.
✗ Branch 1 (12→14) not taken.
|
1 | (m_dc_neg_before_n>0) ? (100.0*double(m_dc_neg_after_n)/double(m_dc_neg_before_n)) : 0.0; |
595 | 1 | DrawDCCanvas2x3(m_dc_pos, pos_bend_id, pos_pct); | |
596 | 1 | DrawDCCanvas2x3(m_dc_neg, neg_bend_id, neg_pct); | |
597 | |||
598 | // write all histograms into the ROOT file | ||
599 |
1/2✓ Branch 0 (16→17) taken 1 times.
✗ Branch 1 (16→52) not taken.
|
1 | if (m_out) { |
600 | 1 | m_out->cd(); | |
601 | |||
602 | 66 | auto write_obj = [&](TObject* o){ if (o) o->Write(); }; | |
603 | |||
604 | // PCAL (per PID, per sector) | ||
605 |
2/2✓ Branch 0 (30→31) taken 2 times.
✓ Branch 1 (30→32) taken 1 times.
|
3 | for (auto& kv : m_cal) { |
606 | auto& sectors = kv.second; | ||
607 |
2/2✓ Branch 0 (28→19) taken 12 times.
✓ Branch 1 (28→29) taken 2 times.
|
14 | for (int s=1; s<=6; ++s) { |
608 | 12 | auto& H = sectors[s]; | |
609 |
1/2✓ Branch 0 (19→20) taken 12 times.
✗ Branch 1 (19→21) not taken.
|
12 | write_obj(H.lv_before); |
610 |
1/2✓ Branch 0 (21→22) taken 12 times.
✗ Branch 1 (21→23) not taken.
|
12 | write_obj(H.lv_after); |
611 |
1/2✓ Branch 0 (23→24) taken 12 times.
✗ Branch 1 (23→25) not taken.
|
12 | write_obj(H.lw_before); |
612 |
1/2✓ Branch 0 (25→26) taken 12 times.
✗ Branch 1 (25→27) not taken.
|
12 | write_obj(H.lw_after); |
613 | } | ||
614 | } | ||
615 | |||
616 | // FT | ||
617 |
2/2✓ Branch 0 (38→33) taken 2 times.
✓ Branch 1 (38→39) taken 1 times.
|
3 | for (auto& kv : m_ft_h) { |
618 |
1/2✓ Branch 0 (33→34) taken 2 times.
✗ Branch 1 (33→35) not taken.
|
2 | write_obj(kv.second.before); |
619 |
1/2✓ Branch 0 (35→36) taken 2 times.
✗ Branch 1 (35→37) not taken.
|
2 | write_obj(kv.second.after); |
620 | } | ||
621 | |||
622 | // CVT | ||
623 |
1/2✓ Branch 0 (39→40) taken 1 times.
✗ Branch 1 (39→41) not taken.
|
1 | write_obj(m_cvt_before); |
624 |
1/2✓ Branch 0 (41→42) taken 1 times.
✗ Branch 1 (41→43) not taken.
|
1 | write_obj(m_cvt_after); |
625 | |||
626 | // DC | ||
627 | 2 | auto write_dc = [&](const DCHists& H){ | |
628 |
2/4✓ Branch 0 (2→3) taken 2 times.
✗ Branch 1 (2→4) not taken.
✓ Branch 2 (4→5) taken 2 times.
✗ Branch 3 (4→6) not taken.
|
4 | write_obj(H.r1_before); write_obj(H.r1_after); |
629 |
2/4✓ Branch 0 (6→7) taken 2 times.
✗ Branch 1 (6→8) not taken.
✓ Branch 2 (8→9) taken 2 times.
✗ Branch 3 (8→10) not taken.
|
4 | write_obj(H.r2_before); write_obj(H.r2_after); |
630 |
2/4✓ Branch 0 (10→11) taken 2 times.
✗ Branch 1 (10→12) not taken.
✓ Branch 2 (12→13) taken 2 times.
✗ Branch 3 (12→14) not taken.
|
4 | write_obj(H.r3_before); write_obj(H.r3_after); |
631 | 2 | }; | |
632 | 1 | write_dc(m_dc_pos); | |
633 | 1 | write_dc(m_dc_neg); | |
634 | |||
635 | 1 | m_out->Write(); | |
636 | 1 | m_log->Info("Wrote output file {}", m_out->GetName()); | |
637 | 1 | m_out->Close(); | |
638 |
1/2✓ Branch 0 (49→50) taken 1 times.
✗ Branch 1 (49→51) not taken.
|
1 | delete m_out; |
639 | 1 | m_out = nullptr; | |
640 | } | ||
641 | |||
642 | // explicitly delete all booked histograms | ||
643 |
12/24✓ Branch 0 (56→57) taken 12 times.
✗ Branch 1 (56→59) not taken.
✓ Branch 2 (59→60) taken 12 times.
✗ Branch 3 (59→62) not taken.
✓ Branch 4 (62→63) taken 12 times.
✗ Branch 5 (62→65) not taken.
✓ Branch 6 (72→73) taken 2 times.
✗ Branch 7 (72→75) not taken.
✓ Branch 8 (75→76) taken 2 times.
✗ Branch 9 (75→78) not taken.
✓ Branch 10 (81→82) taken 1 times.
✗ Branch 11 (81→84) not taken.
✓ Branch 12 (84→85) taken 1 times.
✗ Branch 13 (84→87) not taken.
✓ Branch 14 (5→6) taken 2 times.
✗ Branch 15 (5→8) not taken.
✓ Branch 16 (8→9) taken 2 times.
✗ Branch 17 (8→11) not taken.
✓ Branch 18 (11→12) taken 2 times.
✗ Branch 19 (11→14) not taken.
✓ Branch 20 (14→15) taken 2 times.
✗ Branch 21 (14→17) not taken.
✓ Branch 22 (17→18) taken 2 times.
✗ Branch 23 (17→20) not taken.
|
17 | auto zap = [&](auto*& p){ if (p) { delete p; p = nullptr; } }; |
644 | |||
645 | // PCAL | ||
646 |
2/2✓ Branch 0 (68→69) taken 2 times.
✓ Branch 1 (68→70) taken 1 times.
|
3 | for (auto& kv : m_cal) { |
647 | auto& sectors = kv.second; | ||
648 |
2/2✓ Branch 0 (66→53) taken 12 times.
✓ Branch 1 (66→67) taken 2 times.
|
14 | for (int s=1; s<=6; ++s) { |
649 |
1/2✓ Branch 0 (53→54) taken 12 times.
✗ Branch 1 (53→56) not taken.
|
12 | auto& H = sectors[s]; |
650 | zap(H.lv_before); zap(H.lv_after); | ||
651 | zap(H.lw_before); zap(H.lw_after); | ||
652 | } | ||
653 | } | ||
654 | m_cal.clear(); | ||
655 | |||
656 | // FT | ||
657 |
2/2✓ Branch 0 (79→72) taken 2 times.
✓ Branch 1 (79→80) taken 1 times.
|
3 | for (auto& kv : m_ft_h) { |
658 | zap(kv.second.before); | ||
659 | zap(kv.second.after); | ||
660 | } | ||
661 | m_ft_h.clear(); | ||
662 | |||
663 | // CVT | ||
664 | zap(m_cvt_before); | ||
665 | zap(m_cvt_after); | ||
666 | |||
667 | // DC | ||
668 |
1/2✓ Branch 0 (2→3) taken 2 times.
✗ Branch 1 (2→5) not taken.
|
2 | auto zap_dc = [&](DCHists& H){ |
669 | zap(H.r1_before); zap(H.r1_after); | ||
670 | zap(H.r2_before); zap(H.r2_after); | ||
671 | zap(H.r3_before); zap(H.r3_after); | ||
672 | 2 | }; | |
673 | 1 | zap_dc(m_dc_pos); | |
674 | 1 | zap_dc(m_dc_neg); | |
675 | |||
676 | // ensure no canvases linger globally | ||
677 |
2/4✓ Branch 0 (90→91) taken 1 times.
✗ Branch 1 (90→95) not taken.
✓ Branch 2 (92→93) taken 1 times.
✗ Branch 3 (92→95) not taken.
|
1 | if (gROOT && gROOT->GetListOfCanvases()) |
678 | 1 | gROOT->GetListOfCanvases()->Delete(); | |
679 | 1 | } | |
680 | |||
681 | } | ||
682 |