GCC Code Coverage Report


Directory: ./
File: src/iguana/algorithms/clas12/SectorFinder/Validator.cc
Date: 2025-11-25 17:57:04
Coverage Exec Excl Total
Lines: 98.8% 81 0 82
Functions: 100.0% 3 0 3
Branches: 50.0% 100 0 200

Line Branch Exec Source
1 #include "Validator.h"
2
3 #include <TProfile.h>
4
5 namespace iguana::clas12 {
6
7 REGISTER_IGUANA_VALIDATOR(SectorFinderValidator);
8
9 1 void SectorFinderValidator::Start(hipo::banklist& banks)
10 {
11 // define the algorithm sequence
12 2 m_algo_seq = std::make_unique<AlgorithmSequence>();
13
3/8
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 181 not taken.
✓ Branch 8 → 9 taken 1 time.
✗ Branch 8 → 175 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 17 not taken.
✗ Branch 181 → 182 not taken.
✗ Branch 181 → 184 not taken.
2 m_algo_seq->Add("clas12::EventBuilderFilter");
14
3/8
✓ Branch 20 → 21 taken 1 time.
✗ Branch 20 → 193 not taken.
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 187 not taken.
✓ Branch 27 → 28 taken 1 time.
✗ Branch 27 → 30 not taken.
✗ Branch 193 → 194 not taken.
✗ Branch 193 → 196 not taken.
2 m_algo_seq->Add("clas12::SectorFinder");
15
5/14
✓ Branch 33 → 34 taken 1 time.
✗ Branch 33 → 211 not taken.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 205 not taken.
✓ Branch 35 → 36 taken 1 time.
✗ Branch 35 → 199 not taken.
✓ Branch 41 → 42 taken 1 time.
✗ Branch 41 → 44 not taken.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 49 not taken.
✗ Branch 205 → 206 not taken.
✗ Branch 205 → 208 not taken.
✗ Branch 211 → 212 not taken.
✗ Branch 211 → 214 not taken.
4 m_algo_seq->SetOption<std::vector<int>>("clas12::EventBuilderFilter", "pids", u_pdg_list);
16
5/14
✓ Branch 50 → 51 taken 1 time.
✗ Branch 50 → 227 not taken.
✓ Branch 51 → 52 taken 1 time.
✗ Branch 51 → 221 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 215 not taken.
✓ Branch 58 → 59 taken 1 time.
✗ Branch 58 → 61 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 66 not taken.
✗ Branch 221 → 222 not taken.
✗ Branch 221 → 224 not taken.
✗ Branch 227 → 228 not taken.
✗ Branch 227 → 230 not taken.
4 m_algo_seq->SetOption<std::string>("clas12::SectorFinder", "bank_charged", "REC::Track");
17
5/14
✓ Branch 69 → 70 taken 1 time.
✗ Branch 69 → 245 not taken.
✓ Branch 70 → 71 taken 1 time.
✗ Branch 70 → 239 not taken.
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 233 not taken.
✓ Branch 77 → 78 taken 1 time.
✗ Branch 77 → 80 not taken.
✓ Branch 82 → 83 taken 1 time.
✗ Branch 82 → 85 not taken.
✗ Branch 239 → 240 not taken.
✗ Branch 239 → 242 not taken.
✗ Branch 245 → 246 not taken.
✗ Branch 245 → 248 not taken.
4 m_algo_seq->SetOption<std::string>("clas12::SectorFinder", "bank_uncharged", "default");
18 1 m_algo_seq->Start(banks);
19
20
21
2/4
✓ Branch 89 → 90 taken 1 time.
✗ Branch 89 → 251 not taken.
✓ Branch 90 → 91 taken 1 time.
✗ Branch 90 → 93 not taken.
1 b_particle = GetBankIndex(banks, "REC::Particle");
22
2/4
✓ Branch 96 → 97 taken 1 time.
✗ Branch 96 → 257 not taken.
✗ Branch 97 → 98 not taken.
✓ Branch 97 → 100 taken 1 time.
1 b_cal = GetBankIndex(banks, "REC::Calorimeter");
23
2/4
✓ Branch 103 → 104 taken 1 time.
✗ Branch 103 → 263 not taken.
✗ Branch 104 → 105 not taken.
✓ Branch 104 → 107 taken 1 time.
1 b_sector = GetBankIndex(banks, "REC::Particle::Sector");
24
25 // set an output file
26 1 auto output_dir = GetOutputDirectory();
27
1/2
✓ Branch 110 → 111 taken 1 time.
✗ Branch 110 → 125 not taken.
1 if(output_dir) {
28
3/6
✓ Branch 111 → 112 taken 1 time.
✗ Branch 111 → 312 not taken.
✓ Branch 112 → 113 taken 1 time.
✗ Branch 112 → 269 not taken.
✓ Branch 118 → 119 taken 1 time.
✗ Branch 118 → 312 not taken.
2 m_output_file_basename = output_dir.value() + "/sector_finder";
29
2/4
✓ Branch 119 → 120 taken 1 time.
✗ Branch 119 → 277 not taken.
✓ Branch 122 → 123 taken 1 time.
✗ Branch 122 → 275 not taken.
2 m_output_file = new TFile(m_output_file_basename + ".root", "RECREATE");
30 }
31
32 // define plots
33
2/2
✓ Branch 170 → 126 taken 2 times.
✓ Branch 170 → 171 taken 1 time.
3 for(auto const& pdg : u_pdg_list) {
34 std::vector<TH2D*> YvsX;
35
2/6
✓ Branch 126 → 127 taken 2 times.
✗ Branch 126 → 306 not taken.
✓ Branch 127 → 128 taken 2 times.
✗ Branch 127 → 306 not taken.
✗ Branch 306 → 307 not taken.
✗ Branch 306 → 309 not taken.
2 TString particle_name = particle::name.at(particle::PDG(pdg));
36
2/4
✓ Branch 128 → 129 taken 2 times.
✗ Branch 128 → 304 not taken.
✓ Branch 129 → 130 taken 2 times.
✗ Branch 129 → 304 not taken.
2 TString particle_title = particle::title.at(particle::PDG(pdg));
37
2/2
✓ Branch 157 → 131 taken 12 times.
✓ Branch 157 → 158 taken 2 times.
14 for(int sec = 1; sec <= 6; sec++) {
38
2/4
✓ Branch 131 → 132 taken 12 times.
✗ Branch 131 → 302 not taken.
✓ Branch 132 → 133 taken 12 times.
✗ Branch 132 → 302 not taken.
12 TString sector_name = Form("sec%d", sec);
39
2/4
✓ Branch 133 → 134 taken 12 times.
✗ Branch 133 → 296 not taken.
✓ Branch 134 → 135 taken 12 times.
✗ Branch 134 → 296 not taken.
12 TString sector_title = Form("sector %d", sec);
40
1/2
✓ Branch 147 → 148 taken 12 times.
✗ Branch 147 → 279 not taken.
12 YvsX.push_back(new TH2D(
41
3/6
✓ Branch 141 → 142 taken 12 times.
✗ Branch 141 → 285 not taken.
✓ Branch 142 → 143 taken 12 times.
✗ Branch 142 → 283 not taken.
✓ Branch 143 → 144 taken 12 times.
✗ Branch 143 → 281 not taken.
24 "YvsX_" + particle_name + "_" + sector_name,
42
3/8
✓ Branch 136 → 137 taken 12 times.
✗ Branch 136 → 291 not taken.
✓ Branch 137 → 138 taken 12 times.
✗ Branch 137 → 289 not taken.
✓ Branch 138 → 139 taken 12 times.
✗ Branch 138 → 287 not taken.
✗ Branch 291 → 292 not taken.
✗ Branch 291 → 293 not taken.
24 particle_title + " Calorimeter Hit Position, " + sector_title + ";X [cm];Y [cm]",
43 50, -500, 500,
44
1/2
✓ Branch 146 → 147 taken 12 times.
✗ Branch 146 → 279 not taken.
12 50, -500, 500));
45 12 }
46 2 u_YvsX.insert({pdg, YvsX});
47 2 }
48 1 u_IsInFD = new TH1D(
49 "IsInFD",
50 "e^{-} with #theta>6.5^{o} Sector; e^{-} Sector",
51
1/2
✓ Branch 172 → 173 taken 1 time.
✗ Branch 172 → 310 not taken.
1 7, -0.5, 6.5);
52 1 }
53
54 1000 bool SectorFinderValidator::Run(hipo::banklist& banks) const
55 {
56
57
1/2
✓ Branch 3 → 4 taken 1000 times.
✗ Branch 3 → 58 not taken.
1000 auto& particle_bank = GetBank(banks, b_particle, "REC::Particle");
58
2/4
✓ Branch 9 → 10 taken 1000 times.
✗ Branch 9 → 70 not taken.
✓ Branch 10 → 11 taken 1000 times.
✗ Branch 10 → 64 not taken.
1000 auto& sector_bank = GetBank(banks, b_sector, "REC::Particle::Sector");
59
2/4
✓ Branch 16 → 17 taken 1000 times.
✗ Branch 16 → 77 not taken.
✓ Branch 17 → 18 taken 1000 times.
✗ Branch 17 → 71 not taken.
2000 auto& cal_bank = GetBank(banks, b_cal, "REC::Calorimeter");
60
61
62 1000 m_algo_seq->Run(banks);
63
64 // lock the mutex, so we can mutate plots
65 1000 std::scoped_lock<std::mutex> lock(m_mutex);
66 // fill the plots
67
3/4
✓ Branch 25 → 26 taken 1000 times.
✗ Branch 25 → 78 not taken.
✓ Branch 55 → 27 taken 2478 times.
✓ Branch 55 → 56 taken 1000 times.
3478 for(auto const& row : particle_bank.getRowList()) {
68
69 2478 auto pdg = particle_bank.getInt("pid", row);
70 2478 auto sector = sector_bank.getInt("sector", row);
71
72 double x = 0, y = 0;
73
3/4
✓ Branch 29 → 30 taken 2478 times.
✗ Branch 29 → 78 not taken.
✓ Branch 37 → 31 taken 18264 times.
✓ Branch 37 → 38 taken 2478 times.
20742 for(auto const& rowcal : cal_bank.getRowList()) {
74
2/2
✓ Branch 32 → 33 taken 2509 times.
✓ Branch 32 → 36 taken 15755 times.
18264 if(cal_bank.getShort("pindex", rowcal) == row) {
75 2509 x = cal_bank.getFloat("x", rowcal);
76 2509 y = cal_bank.getFloat("y", rowcal);
77 }
78 }
79
80
2/2
✓ Branch 38 → 39 taken 639 times.
✓ Branch 38 → 47 taken 1839 times.
2478 if(pdg == 11) {
81 639 double Px = particle_bank.getFloat("px", row);
82 639 double Py = particle_bank.getFloat("py", row);
83 639 double Pz = particle_bank.getFloat("pz", row);
84 639 double P = sqrt(Px * Px + Py * Py + Pz * Pz);
85 639 double Theta = acos(Pz / P) * 180. / M_PI;
86 // electrons are in FT or FD
87 // sector should always be 1 if theta is larger than 5.5 degrees
88
2/2
✓ Branch 42 → 43 taken 149 times.
✓ Branch 42 → 47 taken 490 times.
639 if(Theta > 6.5) {
89
1/2
✓ Branch 43 → 44 taken 149 times.
✗ Branch 43 → 78 not taken.
149 u_IsInFD->Fill(sector);
90
1/2
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 47 taken 149 times.
149 if(sector == 0) {
91 m_log->Trace("e' with theta={} and sector==0, this should not happen", Theta);
92 }
93 }
94 }
95
96 // skip central particle, or unknown sector
97
2/2
✓ Branch 47 → 48 taken 827 times.
✓ Branch 47 → 49 taken 1651 times.
2478 if(!IsValidSector(sector))
98 827 continue;
99
2/4
✓ Branch 49 → 50 taken 1651 times.
✗ Branch 49 → 78 not taken.
✓ Branch 50 → 51 taken 1651 times.
✗ Branch 50 → 78 not taken.
1651 m_log->Trace("Filling SectorFinder Validator, pdg {} sector {} pindex {}", pdg, sector, row);
100
2/4
✓ Branch 51 → 52 taken 1651 times.
✗ Branch 51 → 78 not taken.
✓ Branch 52 → 53 taken 1651 times.
✗ Branch 52 → 78 not taken.
1651 u_YvsX.at(pdg).at(sector - 1)->Fill(x, y);
101 }
102
103 1000 return true;
104 }
105
106
107 1 void SectorFinderValidator::Stop()
108 {
109
1/2
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 55 not taken.
2 if(GetOutputDirectory()) {
110
2/2
✓ Branch 42 → 6 taken 2 times.
✓ Branch 42 → 43 taken 1 time.
3 for(auto const& [pdg, plots] : u_YvsX) {
111 int n_cols = 3;
112 int n_rows = 2;
113 2 TString canv_name = Form("canv%d", pdg);
114
1/2
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 56 not taken.
2 auto canv = new TCanvas(canv_name, canv_name, n_cols * 800, n_rows * 600);
115
1/2
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 72 not taken.
2 canv->Divide(n_cols, n_rows);
116 int pad_num = 0;
117
2/2
✓ Branch 22 → 14 taken 12 times.
✓ Branch 22 → 23 taken 2 times.
14 for(auto const& plot : plots) {
118
1/2
✓ Branch 14 → 15 taken 12 times.
✗ Branch 14 → 72 not taken.
12 auto pad = canv->GetPad(++pad_num);
119
1/2
✓ Branch 15 → 16 taken 12 times.
✗ Branch 15 → 72 not taken.
12 pad->cd();
120
1/2
✓ Branch 16 → 17 taken 12 times.
✗ Branch 16 → 72 not taken.
12 pad->SetGrid(1, 1);
121
1/2
✓ Branch 17 → 18 taken 12 times.
✗ Branch 17 → 72 not taken.
12 pad->SetLeftMargin(0.12);
122
1/2
✓ Branch 18 → 19 taken 12 times.
✗ Branch 18 → 72 not taken.
12 pad->SetRightMargin(0.12);
123
1/2
✓ Branch 19 → 20 taken 12 times.
✗ Branch 19 → 72 not taken.
12 pad->SetBottomMargin(0.12);
124
1/2
✓ Branch 20 → 21 taken 12 times.
✗ Branch 20 → 72 not taken.
12 plot->Draw("colz");
125 }
126
5/10
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 66 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 64 not taken.
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 62 not taken.
✓ Branch 27 → 28 taken 2 times.
✗ Branch 27 → 60 not taken.
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 58 not taken.
4 canv->SaveAs(m_output_file_basename + "_" + std::to_string(pdg) + ".png");
127 2 }
128
129
1/2
✓ Branch 44 → 45 taken 1 time.
✗ Branch 44 → 74 not taken.
1 auto canv1D = new TCanvas("1D canvas", "1D canvas", 800, 600);
130 1 u_IsInFD->Draw();
131
1/2
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 76 not taken.
2 canv1D->SaveAs(m_output_file_basename + "_elIsInFD.png");
132
133 1 m_output_file->Write();
134 1 m_log->Info("Wrote output file {}", m_output_file->GetName());
135 1 m_output_file->Close();
136 }
137 1 }
138
139 }
140