GCC Code Coverage Report


Directory: ./
File: src/iguana/algorithms/clas12/RGAFiducialFilter/Validator.cc
Date: 2025-10-15 15:39:33
Exec Total Coverage
Lines: 345 388 88.9%
Functions: 17 19 89.5%
Branches: 383 676 56.7%

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