16#include <TEfficiency.h>
23 unsigned int nMajorityHits;
24 unsigned int nMeasurements;
28 ULong64_t particleId = 0;
42 void getEntry(
unsigned int i)
const {
51 TTree* tree =
nullptr;
68 tree->SetBranchAddress(
"event_nr", &eventId);
69 tree->SetBranchAddress(
"eLOC0_prt", &
LOC0_prt);
70 tree->SetBranchAddress(
"eLOC1_prt", &
LOC1_prt);
71 tree->SetBranchAddress(
"ePHI_prt", &
PHI_prt);
72 tree->SetBranchAddress(
"eTHETA_prt", &
THETA_prt);
73 tree->SetBranchAddress(
"eQOP_prt", &
QOP_prt);
74 tree->SetBranchAddress(
"eT_prt", &
T_prt);
75 tree->SetBranchAddress(
"eLOC0_flt", &
LOC0_flt);
76 tree->SetBranchAddress(
"eLOC1_flt", &
LOC1_flt);
77 tree->SetBranchAddress(
"ePHI_flt", &
PHI_flt);
78 tree->SetBranchAddress(
"eTHETA_flt", &
THETA_flt);
79 tree->SetBranchAddress(
"eQOP_flt", &
QOP_flt);
80 tree->SetBranchAddress(
"eT_flt", &
T_flt);
81 tree->SetBranchAddress(
"eLOC0_smt", &
LOC0_smt);
82 tree->SetBranchAddress(
"eLOC1_smt", &
LOC1_smt);
83 tree->SetBranchAddress(
"ePHI_smt", &
PHI_smt);
84 tree->SetBranchAddress(
"eTHETA_smt", &
THETA_smt);
85 tree->SetBranchAddress(
"eQOP_smt", &
QOP_smt);
86 tree->SetBranchAddress(
"eT_smt", &
T_smt);
90 tree->SetBranchAddress(
"res_ePHI_prt", &
res_PHI_prt);
92 tree->SetBranchAddress(
"res_eQOP_prt", &
res_QOP_prt);
93 tree->SetBranchAddress(
"res_eT_prt", &
res_T_prt);
96 tree->SetBranchAddress(
"res_ePHI_flt", &
res_PHI_flt);
98 tree->SetBranchAddress(
"res_eQOP_flt", &
res_QOP_flt);
99 tree->SetBranchAddress(
"res_eT_flt", &
res_T_flt);
102 tree->SetBranchAddress(
"res_ePHI_smt", &
res_PHI_smt);
104 tree->SetBranchAddress(
"res_eQOP_smt", &
res_QOP_smt);
105 tree->SetBranchAddress(
"res_eT_smt", &
res_T_smt);
112 tree->SetBranchAddress(
"pull_eT_prt", &
pull_T_prt);
118 tree->SetBranchAddress(
"pull_eT_flt", &
pull_T_flt);
124 tree->SetBranchAddress(
"pull_eT_smt", &
pull_T_smt);
126 tree->SetBranchAddress(
"g_x_prt", &g_x_prt);
127 tree->SetBranchAddress(
"g_y_prt", &g_y_prt);
128 tree->SetBranchAddress(
"g_z_prt", &g_z_prt);
129 tree->SetBranchAddress(
"g_x_flt", &g_x_flt);
130 tree->SetBranchAddress(
"g_y_flt", &g_y_flt);
131 tree->SetBranchAddress(
"g_z_flt", &g_z_flt);
132 tree->SetBranchAddress(
"g_x_smt", &g_x_smt);
133 tree->SetBranchAddress(
"g_y_smt", &g_y_smt);
134 tree->SetBranchAddress(
"g_z_smt", &g_z_smt);
136 tree->SetBranchAddress(
"nStates", &nStates);
137 tree->SetBranchAddress(
"nMeasurements", &nMeasurements);
138 tree->SetBranchAddress(
"volume_id", &
volume_id);
139 tree->SetBranchAddress(
"layer_id", &
layer_id);
140 tree->SetBranchAddress(
"module_id", &
module_id);
141 tree->SetBranchAddress(
"predicted", &
predicted);
142 tree->SetBranchAddress(
"filtered", &
filtered);
143 tree->SetBranchAddress(
"smoothed", &
smoothed);
149 tree->Draw(
"event_nr",
"",
"goff");
151 TMath::Sort(tree->GetEntries(), tree->GetV1(),
entryNumbers.data(),
157 std::uint32_t eventId = 0;
159 new std::vector<float>;
161 new std::vector<float>;
163 new std::vector<float>;
165 new std::vector<float>;
167 new std::vector<float>;
169 new std::vector<float>;
171 new std::vector<float>;
173 new std::vector<float>;
175 new std::vector<float>;
177 new std::vector<float>;
179 new std::vector<float>;
180 std::vector<float>*
T_flt =
new std::vector<float>;
182 new std::vector<float>;
184 new std::vector<float>;
186 new std::vector<float>;
188 new std::vector<float>;
190 new std::vector<float>;
191 std::vector<float>*
T_smt =
new std::vector<float>;
194 new std::vector<float>;
196 new std::vector<float>;
198 new std::vector<float>;
200 new std::vector<float>;
202 new std::vector<float>;
204 new std::vector<float>;
206 new std::vector<float>;
208 new std::vector<float>;
210 new std::vector<float>;
212 new std::vector<float>;
214 new std::vector<float>;
216 new std::vector<float>;
218 new std::vector<float>;
220 new std::vector<float>;
222 new std::vector<float>;
224 new std::vector<float>;
226 new std::vector<float>;
228 new std::vector<float>;
231 new std::vector<float>;
233 new std::vector<float>;
235 new std::vector<float>;
237 new std::vector<float>;
239 new std::vector<float>;
241 new std::vector<float>;
243 new std::vector<float>;
245 new std::vector<float>;
247 new std::vector<float>;
249 new std::vector<float>;
251 new std::vector<float>;
253 new std::vector<float>;
255 new std::vector<float>;
257 new std::vector<float>;
259 new std::vector<float>;
261 new std::vector<float>;
263 new std::vector<float>;
265 new std::vector<float>;
267 std::vector<float>* g_x_prt =
new std::vector<float>;
268 std::vector<float>* g_y_prt =
new std::vector<float>;
269 std::vector<float>* g_z_prt =
new std::vector<float>;
270 std::vector<float>* g_x_flt =
new std::vector<float>;
271 std::vector<float>* g_y_flt =
new std::vector<float>;
272 std::vector<float>* g_z_flt =
new std::vector<float>;
273 std::vector<float>* g_x_smt =
new std::vector<float>;
274 std::vector<float>* g_y_smt =
new std::vector<float>;
275 std::vector<float>* g_z_smt =
new std::vector<float>;
282 std::vector<bool>*
filtered =
new std::vector<bool>;
283 std::vector<bool>*
smoothed =
new std::vector<bool>;
285 unsigned int nStates = 0, nMeasurements = 0;
297 tree->SetBranchAddress(
"event_nr", &eventId);
298 tree->SetBranchAddress(
"nStates", &nStates);
299 tree->SetBranchAddress(
"nMeasurements", &nMeasurements);
300 tree->SetBranchAddress(
"nOutliers", &nOutliers);
301 tree->SetBranchAddress(
"nHoles", &nHoles);
302 tree->SetBranchAddress(
"chi2Sum", &chi2Sum);
303 tree->SetBranchAddress(
"measurementChi2", &measurementChi2);
304 tree->SetBranchAddress(
"NDF", &NDF);
305 tree->SetBranchAddress(
"measurementVolume", &measurementVolume);
306 tree->SetBranchAddress(
"measurementLayer", &measurementLayer);
307 tree->SetBranchAddress(
"outlierVolume", &outlierVolume);
308 tree->SetBranchAddress(
"outlierLayer", &outlierLayer);
309 tree->SetBranchAddress(
"nMajorityHits", &nMajorityHits);
310 tree->SetBranchAddress(
"nSharedHits", &nSharedHits);
311 tree->SetBranchAddress(
"majorityParticleId", &majorityParticleId);
313 tree->SetBranchAddress(
"hasFittedParams", &hasFittedParams);
315 tree->SetBranchAddress(
"t_theta", &t_theta);
316 tree->SetBranchAddress(
"t_phi", &t_phi);
317 tree->SetBranchAddress(
"t_eta", &t_eta);
318 tree->SetBranchAddress(
"t_p", &t_p);
319 tree->SetBranchAddress(
"t_pT", &t_pT);
320 tree->SetBranchAddress(
"t_d0", &t_d0);
321 tree->SetBranchAddress(
"t_z0", &t_z0);
322 tree->SetBranchAddress(
"t_charge", &t_charge);
323 tree->SetBranchAddress(
"t_time", &t_time);
325 tree->SetBranchAddress(
"eLOC0_fit", &eLOC0_fit);
326 tree->SetBranchAddress(
"eLOC1_fit", &eLOC1_fit);
327 tree->SetBranchAddress(
"ePHI_fit", &ePHI_fit);
328 tree->SetBranchAddress(
"eTHETA_fit", &eTHETA_fit);
329 tree->SetBranchAddress(
"eQOP_fit", &eQOP_fit);
330 tree->SetBranchAddress(
"eT_fit", &eT_fit);
331 tree->SetBranchAddress(
"err_eLOC0_fit", &err_eLOC0_fit);
332 tree->SetBranchAddress(
"err_eLOC1_fit", &err_eLOC1_fit);
333 tree->SetBranchAddress(
"err_ePHI_fit", &err_ePHI_fit);
334 tree->SetBranchAddress(
"err_eTHETA_fit", &err_eTHETA_fit);
335 tree->SetBranchAddress(
"err_eQOP_fit", &err_eQOP_fit);
336 tree->SetBranchAddress(
"err_eT_fit", &err_eT_fit);
342 tree->Draw(
"event_nr",
"",
"goff");
344 TMath::Sort(tree->GetEntries(), tree->GetV1(),
entryNumbers.data(),
350 std::uint32_t eventId = 0;
351 std::vector<unsigned int>* nStates =
new std::vector<unsigned int>;
352 std::vector<unsigned int>* nMeasurements =
new std::vector<unsigned int>;
353 std::vector<unsigned int>* nOutliers =
new std::vector<unsigned int>;
354 std::vector<unsigned int>* nHoles =
new std::vector<unsigned int>;
355 std::vector<unsigned int>* nSharedHits =
new std::vector<unsigned int>;
356 std::vector<float>* chi2Sum =
new std::vector<float>;
357 std::vector<unsigned int>* NDF =
new std::vector<unsigned int>;
358 std::vector<std::vector<double>>* measurementChi2 =
359 new std::vector<std::vector<double>>;
360 std::vector<std::vector<double>>* outlierChi2 =
361 new std::vector<std::vector<double>>;
362 std::vector<std::vector<double>>* measurementVolume =
363 new std::vector<std::vector<double>>;
364 std::vector<std::vector<double>>* measurementLayer =
365 new std::vector<std::vector<double>>;
366 std::vector<std::vector<double>>* outlierVolume =
367 new std::vector<std::vector<double>>;
368 std::vector<std::vector<double>>* outlierLayer =
369 new std::vector<std::vector<double>>;
370 std::vector<unsigned int>* nMajorityHits =
new std::vector<unsigned int>;
371 std::vector<std::uint64_t>* majorityParticleId =
new std::vector<std::uint64_t>;
373 std::vector<bool>* hasFittedParams =
new std::vector<bool>;
376 std::vector<float>* t_d0 =
new std::vector<float>;
377 std::vector<float>* t_z0 =
new std::vector<float>;
378 std::vector<float>* t_phi =
new std::vector<float>;
379 std::vector<float>* t_theta =
new std::vector<float>;
380 std::vector<float>* t_eta =
new std::vector<float>;
381 std::vector<float>* t_p =
new std::vector<float>;
382 std::vector<float>* t_pT =
new std::vector<float>;
383 std::vector<float>* t_time =
new std::vector<float>;
384 std::vector<int>* t_charge =
new std::vector<int>;
387 std::vector<float>* eLOC0_fit =
new std::vector<float>;
388 std::vector<float>* eLOC1_fit =
new std::vector<float>;
389 std::vector<float>* ePHI_fit =
new std::vector<float>;
390 std::vector<float>* eTHETA_fit =
new std::vector<float>;
391 std::vector<float>* eQOP_fit =
new std::vector<float>;
392 std::vector<float>* eT_fit =
new std::vector<float>;
394 std::vector<float>* err_eLOC0_fit =
new std::vector<float>;
395 std::vector<float>* err_eLOC1_fit =
new std::vector<float>;
396 std::vector<float>* err_ePHI_fit =
new std::vector<float>;
397 std::vector<float>* err_eTHETA_fit =
new std::vector<float>;
398 std::vector<float>* err_eQOP_fit =
new std::vector<float>;
399 std::vector<float>* err_eT_fit =
new std::vector<float>;
411 tree->SetBranchAddress(
"event_id", &eventId);
412 tree->SetBranchAddress(
"particle_id", &particleId);
413 tree->SetBranchAddress(
"particle_type", &particleType);
414 tree->SetBranchAddress(
"vx", &vx);
415 tree->SetBranchAddress(
"vy", &vy);
416 tree->SetBranchAddress(
"vz", &vz);
417 tree->SetBranchAddress(
"vt", &vt);
418 tree->SetBranchAddress(
"px", &px);
419 tree->SetBranchAddress(
"py", &py);
420 tree->SetBranchAddress(
"pz", &pz);
421 tree->SetBranchAddress(
"m", &m);
422 tree->SetBranchAddress(
"q", &q);
423 tree->SetBranchAddress(
"nhits", &nHits);
424 tree->SetBranchAddress(
"ntracks", &nTracks);
425 tree->SetBranchAddress(
"ntracks_majority", &nTracksMajority);
431 tree->Draw(
"event_id",
"",
"goff");
433 TMath::Sort(tree->GetEntries(), tree->GetV1(),
entryNumbers.data(),
439 std::vector<ParticleInfo> getParticles(
const std::uint32_t& eventNumber)
const {
441 std::string eventNumberStr = std::to_string(eventNumber);
442 std::string findStartEntry =
"event_id<" + eventNumberStr;
443 std::string findParticlesSize =
"event_id==" + eventNumberStr;
444 std::size_t startEntry = tree->GetEntries(findStartEntry.c_str());
445 std::size_t nParticles = tree->GetEntries(findParticlesSize.c_str());
446 if (nParticles == 0) {
447 throw std::invalid_argument(
448 "No particles found. Please check the input file.");
450 std::vector<ParticleInfo> particles;
451 particles.reserve(nParticles);
452 for (
unsigned int i = 0; i < nParticles; ++i) {
453 getEntry(startEntry + i);
454 auto pt = std::hypot(px, py);
455 auto p = std::hypot(pt, pz);
456 auto eta = std::atanh(pz / p * 1.);
457 particles.push_back({particleId, eta, p, pt, nHits});
463 ULong64_t eventId = 0;
464 ULong64_t particleId = 0;
465 Int_t particleType = 0;
466 float vx = 0, vy = 0, vz = 0;
468 float px = 0, py = 0, pz = 0;
472 UShort_t nTracks = 0;
473 UShort_t nTracksMajority = 0;
Struct used for reading particles written out by the TrackFinderPerformanceWriter.
Struct used for reading track states written out by the RootTrackStatesWriter.
std::vector< float > * pull_THETA_prt
pull of predicted parameter theta
std::vector< float > * LOC0_flt
filtered parameter local x
std::vector< float > * res_T_prt
residual of predicted parameter t
std::vector< int > * volume_id
volume_id
std::vector< float > * LOC1_smt
smoothed parameter local y
std::vector< float > * QOP_smt
smoothed parameter q/p
std::vector< bool > * smoothed
smoothing status
std::vector< float > * res_PHI_flt
residual of filtered parameter phi
std::vector< float > * pull_LOC0_flt
pull of filtered parameter local x
std::vector< float > * LOC0_smt
smoothed parameter local x
std::vector< float > * res_THETA_prt
residual of predicted parameter theta
std::vector< float > * PHI_flt
filtered parameter phi
std::vector< float > * res_LOC1_smt
residual of smoothed parameter local y
std::vector< float > * res_T_smt
residual of smoothed parameter t
std::vector< float > * QOP_flt
filtered parameter q/p
std::vector< float > * QOP_prt
predicted parameter q/p
std::vector< float > * pull_LOC0_smt
pull of smoothed parameter local x
std::vector< float > * LOC0_prt
predicted parameter local x
std::vector< float > * pull_PHI_smt
pull of smoothed parameter phi
std::vector< float > * T_prt
predicted parameter t
std::vector< float > * LOC1_prt
predicted parameter local y
std::vector< float > * T_flt
filtered parameter t
std::vector< int > * layer_id
layer_id
std::vector< float > * res_PHI_prt
residual of predicted parameter phi
std::vector< float > * res_LOC1_prt
residual of predicted parameter local y
std::vector< float > * T_smt
smoothed parameter t
std::vector< float > * res_LOC0_smt
residual of smoothed parameter local x
std::vector< float > * res_LOC1_flt
residual of filtered parameter local y
std::vector< float > * res_QOP_flt
residual of filtered parameter q/p
std::vector< float > * LOC1_flt
filtered parameter local y
std::vector< float > * res_T_flt
residual of filtered parameter t
std::vector< float > * THETA_prt
predicted parameter theta
std::vector< float > * pull_T_smt
pull of smoothed parameter t
std::vector< float > * res_LOC0_flt
residual of filtered parameter local x
std::vector< float > * pull_PHI_flt
pull of filtered parameter phi
std::vector< float > * pull_QOP_flt
pull of filtered parameter q/p
std::vector< float > * pull_T_prt
pull of predicted parameter t
std::vector< float > * pull_PHI_prt
pull of predicted parameter phi
std::vector< float > * pull_THETA_smt
pull of smoothed parameter theta
std::vector< float > * pull_QOP_smt
pull of smoothed parameter q/p
std::vector< float > * res_QOP_prt
residual of predicted parameter q/p
std::vector< float > * THETA_flt
filtered parameter theta
std::vector< float > * res_QOP_smt
residual of smoothed parameter q/p
std::vector< float > * pull_THETA_flt
pull of filtered parameter theta
std::vector< float > * pull_LOC1_prt
pull of predicted parameter local y
std::vector< float > * pull_LOC1_smt
pull of smoothed parameter local y
std::vector< bool > * predicted
prediction status
std::vector< float > * pull_LOC0_prt
pull of predicted parameter local x
std::vector< float > * pull_QOP_prt
pull of predicted parameter q/p
std::vector< float > * res_THETA_flt
residual of filtered parameter theta
std::vector< float > * THETA_smt
smoothed parameter theta
std::vector< int > * module_id
module_id
std::vector< float > * res_THETA_smt
residual of smoothed parameter theta
std::vector< float > * PHI_prt
predicted parameter phi
std::vector< float > * res_LOC0_prt
residual of predicted parameter local x
std::vector< float > * pull_T_flt
pull of filtered parameter t
std::vector< float > * res_PHI_smt
residual of smoothed parameter phi
std::vector< float > * PHI_smt
smoothed parameter phi
std::vector< bool > * filtered
filtering status
std::vector< float > * pull_LOC1_flt
pull of filtered parameter local y
Struct used for reading track summary info written out by the RootTrackSummaryWriter.
std::vector< long long > entryNumbers
The entry numbers for accessing events in increased order (there could be multiple entries correspond...