231 if(m_eventStat.m_events<=0)
return StatusCode::SUCCESS;
232 const auto & w13 = std::setw(13);
233 const auto & p5 = std::setprecision(5);
234 const auto topNtail=[](
const std::string &
str){
return "|" +
str +
"|";};
235 const std::string lineSeparator(83,
'-');
236 const std::string spaceSeparator(83,
' ');
237 std::stringstream
out;
239 out<<topNtail(lineSeparator)<<
"\n";
240 out<<
"| TrackClusterAssValidation statistic for charge truth particles with |\n";
241 out<<topNtail(spaceSeparator)<<
"\n";
242 out<<
"| pT >="<<w13<<p5<<
m_ptcut<<
" MeV"<<
" |\n";
247 out<<
"| max vertex radius <="<<w13<<p5<<
m_rmax<<
" mm"<<
" |\n";
248 out<<
"| min vertex radius >="<<w13<<p5<<
m_rmin<<
" mm"<<
" |\n";
249 out<<
"| particles pdg ="<<std::setw(8)<<
m_pdg<<
" |\n";
251 auto yesNo=[](
const bool predicate){
return predicate ?
"yes" :
"no ";};
252 out<<
"| use Pixels information "<<yesNo(
m_usePIX)<<
" |\n";
253 out<<
"| use SCT information "<<yesNo(
m_useSCT)<<
" |\n";
254 out<<
"| use TRT information "<<yesNo(
m_useTRT)<<
" |\n";
256 out<<topNtail(spaceSeparator)<<
"\n";
259 auto incrementArray=[](
auto &
array,
const int idx){
for (
int j{};j!=NRegions;++j)
array[
idx][j] +=
array[
idx+1][j];};
260 for(
int i=48;
i>=0; --
i) {
261 m_eventStat.m_particleClusters [
i] +=m_eventStat.m_particleClusters [
i+1];
262 incrementArray(m_eventStat.m_particleClustersBTE,
i);
263 m_eventStat.m_particleSpacePoints [
i] +=m_eventStat.m_particleSpacePoints [
i+1];
264 incrementArray(m_eventStat.m_particleSpacePointsBTE,
i);
266 auto coerceToOne=[](
const double & initialVal)->
double {
return (initialVal<1.) ? 1. : initialVal; };
273 double pa = coerceToOne(m_eventStat.m_particleClusters[0]);
274 std::array<double, 10> pc2ff{};
275 size_t clusterIdx = 2;
276 for (
auto & thisCluster: pc2ff){
277 thisCluster =
double(m_eventStat.m_particleClusters[ clusterIdx++ ])/ pa;
280 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][
Barrel]);
281 std::array<double, 10> pcBarrel2ff{};
282 size_t clusterBarrelIdx = 2;
283 for (
auto & thisClusterB: pcBarrel2ff){
284 thisClusterB =
double(m_eventStat.m_particleClustersBTE[ clusterBarrelIdx++ ][
Barrel])/ pa;
287 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Transition]);
288 std::array<double, 10> pcTransition2ff{};
289 size_t clusterTransitionIdx = 2;
290 for (
auto & thisClusterT: pcTransition2ff){
291 thisClusterT =
double(m_eventStat.m_particleClustersBTE[ clusterTransitionIdx++ ][Transition])/ pa;
294 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][
Endcap]);
295 std::array<double, 10> pcEndcap2ff{};
296 size_t clusterEndcapIdx = 2;
297 for (
auto & thisClusterE: pcEndcap2ff){
298 thisClusterE =
double(m_eventStat.m_particleClustersBTE[ clusterEndcapIdx++ ][
Endcap])/ pa;
301 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][3]);
302 std::array<double, 10> pcFwd2ff{};
303 size_t clusterFwdIdx = 2;
304 for (
auto & thisClusterD: pcFwd2ff){
305 thisClusterD =
double(m_eventStat.m_particleClustersBTE[ clusterFwdIdx++ ][Forward])/ pa;
311 pa = coerceToOne(m_eventStat.m_particleSpacePoints[0]);
312 std::array<double, 10> sp2ff{};
313 size_t spacepointIdx = 2;
314 for (
auto & thisSpacepoint: sp2ff){
315 thisSpacepoint =
double(m_eventStat.m_particleSpacePoints[ spacepointIdx++ ])/ pa;
318 pa = coerceToOne(m_eventStat.m_particleSpacePointsBTE[0][
Barrel]);
319 std::array<double, 10> spBarrel2ff{};
320 size_t spacepointBarrelIdx = 2;
321 for (
auto & thisSpacepoint: spBarrel2ff){
322 thisSpacepoint =
double(m_eventStat.m_particleSpacePointsBTE[ spacepointBarrelIdx++ ][
Barrel])/ pa;
325 pa = coerceToOne(m_eventStat.m_particleSpacePointsBTE[0][Transition]);
326 std::array<double, 10> spTransition2ff{};
327 size_t spacepointTransitionIdx = 2;
328 for (
auto & thisSpacepoint: spTransition2ff){
329 thisSpacepoint =
double(m_eventStat.m_particleSpacePointsBTE[ spacepointTransitionIdx++ ][Transition])/ pa;
332 pa = coerceToOne(m_eventStat.m_particleSpacePointsBTE[0][
Endcap]);
333 std::array<double, 10> spEndcap2ff{};
334 size_t spacepointEndcapIdx = 2;
335 for (
auto & thisSpacepoint: spEndcap2ff){
336 thisSpacepoint =
double(m_eventStat.m_particleSpacePointsBTE[ spacepointEndcapIdx++ ][
Endcap])/ pa;
339 pa = coerceToOne(m_eventStat.m_particleSpacePointsBTE[0][Forward]);
340 std::array<double, 10> spFwd2ff{};
341 size_t spacepointFwdIdx = 2;
342 for (
auto & thisSpacepoint: spFwd2ff){
343 thisSpacepoint =
double(m_eventStat.m_particleSpacePointsBTE[ spacepointFwdIdx++ ][Forward])/ pa;
345 auto w8=std::setw(8);
346 out<<
"| Probability for such charge particles to have some number silicon |\n";
347 out<<
"| clusters | space points |\n";
348 out<<
"| Total Barrel Transi Endcap Forward | Total Barrel Transi Endcap Forward |\n";
351 out<<
"| >= "<<
idx+2<< std::string((
idx<8)?
" ":
" ")
353 <<w8<<p5<<pcBarrel2ff[
idx]
354 <<w8<<p5<<pcTransition2ff[
idx]
355 <<w8<<p5<<pcEndcap2ff[
idx]
356 <<w8<<p5<<pcFwd2ff[
idx]<<
" | "
359 <<w8<<p5<<spBarrel2ff[
idx]
360 <<w8<<p5<<spTransition2ff[
idx]
361 <<w8<<p5<<spEndcap2ff[
idx]
362 <<w8<<p5<<spFwd2ff[
idx]
366 out<<topNtail(spaceSeparator)<<
"\n";
367 out<<
"| Additional cuts for truth particles are |\n";
368 out<<
"| number silicon clusters >="<<w13<<
m_clcut<<
" |\n";
370 out<<
"| number space points >="<<w13<<
m_spcut<<
" |\n";
372 pa = coerceToOne(m_eventStat.m_particleClusters[0]);
373 out<<
"| Probability find truth particles with this cuts is "<<w8<<p5<<
double(m_eventStat.m_events)/pa<<
" |\n";
374 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][
Barrel]);
375 out<<
"| For barrel region "<<w8<<p5<<
double(m_eventStat.m_eventsBTE[
Barrel])/pa<<
" |\n";
376 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Transition]);
377 out<<
"| For transition region "<<w8<<p5<<
double(m_eventStat.m_eventsBTE[Transition])/pa<<
" |\n";
378 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][
Endcap]);
379 out<<
"| For endcap region "<<w8<<p5<<
double(m_eventStat.m_eventsBTE[
Endcap])/pa<<
" |\n";
380 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Forward]);
381 out<<
"| For forward region "<<w8<<p5<<
double(m_eventStat.m_eventsBTE[Forward])/pa<<
" |\n";
383 pa = coerceToOne(m_eventStat.m_nclustersNegBP);
384 double ratio =
double(m_eventStat.m_nclustersPosBP)/pa;
386 out<<
"| Ratio barrel pixels clusters for +/- particles ="<<w8<<p5<<
ratio<<
" +-"<<w8<<p5<<
eratio<<
" |\n";
387 pa = coerceToOne(m_eventStat.m_nclustersNegEP);
390 out<<
"| Ratio endcap pixels clusters for +/- particles ="<<w8<<p5<<
ratio<<
" +-"<<w8<<p5<<
eratio<<
" |\n";
391 pa = coerceToOne(m_eventStat.m_nclustersNegBS);
394 out<<
"| Ratio barrel SCT clusters for +/- particles ="<<w8<<p5<<
ratio<<
" +-"<<w8<<p5<<
eratio<<
" |\n";
395 pa = coerceToOne(m_eventStat.m_nclustersNegES);
398 out<<
"| Ratio endcap SCT clusters for +/- particles ="<<w8<<p5<<
ratio<<
" +-"<<w8<<p5<<
eratio<<
" |\n";
399 pa =
double(m_eventStat.m_eventsNEG);
if(pa < 1.) pa = 1.;
402 out<<
"| Number truth particles and +/- ratio ="<<std::setw(10)<<m_eventStat.m_events<<w8<<p5<<
ratio<<
" +-"<<w8<<p5<<
eratio<<
" |\n";
404 if(m_eventStat.m_nclustersPTOT!=0)
ratio =
double(m_eventStat.m_nclustersPTOTt)/
double(m_eventStat.m_nclustersPTOT);
406 out<<
"| Number pix clusters, truth clusters and ratio = "
407 <<std::setw(10)<<m_eventStat.m_nclustersPTOT
408 <<std::setw(10)<<m_eventStat.m_nclustersPTOTt
409 <<std::setw(12)<<std::setprecision(5)<<
ratio<<
" |\n";
411 if(m_eventStat.m_nclustersSTOT!=0)
ratio =
double(m_eventStat.m_nclustersSTOTt)/
double(m_eventStat.m_nclustersSTOT);
412 out<<
"| Number sct clusters, truth clusters and ratio = "
413 <<std::setw(10)<<m_eventStat.m_nclustersSTOT
414 <<std::setw(10)<<m_eventStat.m_nclustersSTOTt
415 <<std::setw(12)<<std::setprecision(5)<<
ratio<<
" |\n";
417 out<<
"|-----------------------------------------------------------------------------------|\n\n";
422 int n = 47-(
t->key().size());
423 std::string
s1;
for(
int i=0;
i<
n; ++
i)
s1.append(
" ");
s1.append(
"|");
426 out<<
"|-----------------------------------------------------------------------------------|\n";
427 out<<
"| Statistic for "<<(
t->key())<<
s1<<
"\n";
429 double ne =
double(m_eventStat.m_events);
if(ne < 1.) ne = 1.;
430 double ef [6];
for(
int i=0;
i!=6; ++
i)
ef [
i] =
double(m_trackCollectionStat[
nc].m_efficiency [
i]) /ne;
431 double ef0[6];
for(
int i=0;
i!=6; ++
i) ef0[
i] =
double(m_trackCollectionStat[
nc].m_efficiencyN [
i][0])/ne;
432 double ef1[6];
for(
int i=0;
i!=6; ++
i) ef1[
i] =
double(m_trackCollectionStat[
nc].m_efficiencyN [
i][1])/ne;
433 double ef2[6];
for(
int i=0;
i!=6; ++
i) ef2[
i] =
double(m_trackCollectionStat[
nc].m_efficiencyN [
i][2])/ne;
436 using EffArray_t = std::array<double, 6>;
438 auto makeEffArray = [](
const auto & threeDimArray,
const size_t secondIdx,
const size_t thirdIdx,
const double denom){
441 auto invDenom = 1./
denom;
443 entry = threeDimArray[
idx++][secondIdx][thirdIdx]*invDenom;
448 const auto & efficiencyArrayInput = m_trackCollectionStat[
nc].m_efficiencyBTE;
450 double neBTE = coerceToOne(m_eventStat.m_eventsBTE[
Barrel]);
451 const EffArray_t efB0 = makeEffArray(efficiencyArrayInput,0,
Barrel,neBTE);
452 const EffArray_t efB1 = makeEffArray(efficiencyArrayInput,1,
Barrel,neBTE);
453 const EffArray_t efB2 = makeEffArray(efficiencyArrayInput,2,
Barrel,neBTE);
454 const EffArray_t efB3 = makeEffArray(efficiencyArrayInput,3,
Barrel,neBTE);
455 const EffArray_t efB4 = makeEffArray(efficiencyArrayInput,4,
Barrel,neBTE);
457 neBTE = coerceToOne(m_eventStat.m_eventsBTE[Transition]);
458 const EffArray_t efT0 = makeEffArray(efficiencyArrayInput,0,Transition,neBTE);
459 const EffArray_t efT1 = makeEffArray(efficiencyArrayInput,1,Transition,neBTE);
460 const EffArray_t efT2 = makeEffArray(efficiencyArrayInput,2,Transition,neBTE);
461 const EffArray_t efT3 = makeEffArray(efficiencyArrayInput,3,Transition,neBTE);
462 const EffArray_t efT4 = makeEffArray(efficiencyArrayInput,4,Transition,neBTE);
464 neBTE = coerceToOne(m_eventStat.m_eventsBTE[
Endcap]);
465 const EffArray_t efE0 = makeEffArray(efficiencyArrayInput,0,
Endcap,neBTE);
466 const EffArray_t efE1 = makeEffArray(efficiencyArrayInput,1,
Endcap,neBTE);
467 const EffArray_t efE2 = makeEffArray(efficiencyArrayInput,2,
Endcap,neBTE);
468 const EffArray_t efE3 = makeEffArray(efficiencyArrayInput,3,
Endcap,neBTE);
469 const EffArray_t efE4 = makeEffArray(efficiencyArrayInput,4,
Endcap,neBTE);
471 neBTE = coerceToOne(m_eventStat.m_eventsBTE[Forward]);
472 const EffArray_t efD0 = makeEffArray(efficiencyArrayInput,0,Forward,neBTE);
473 const EffArray_t efD1 = makeEffArray(efficiencyArrayInput,1,Forward,neBTE);
474 const EffArray_t efD2 = makeEffArray(efficiencyArrayInput,2,Forward,neBTE);
475 const EffArray_t efD3 = makeEffArray(efficiencyArrayInput,3,Forward,neBTE);
476 const EffArray_t efD4 = makeEffArray(efficiencyArrayInput,4,Forward,neBTE);
479 double efrec = ef0[0]+ef0[1]+ef0[2]+ef1[0]+ef1[1]+ef2[0];
480 double efrecB = efB0[0]+efB0[1]+efB0[2]+efB1[0]+efB1[1]+efB2[0];
481 double efrecT = efT0[0]+efT0[1]+efT0[2]+efT1[0]+efT1[1]+efT2[0];
482 double efrecE = efE0[0]+efE0[1]+efE0[2]+efE1[0]+efE1[1]+efE2[0];
483 double efrecD = efD0[0]+efD0[1]+efD0[2]+efD1[0]+efD1[1]+efD2[0];
485 ne = coerceToOne(m_eventStat.m_eventsPOS);
486 double efP[6];
for(
int i=0;
i!=6; ++
i) efP[
i] =
double(m_trackCollectionStat[
nc].m_efficiencyPOS[
i])/ne;
487 ne = coerceToOne(m_eventStat.m_eventsNEG);
488 double efN[6];
for(
int i=0;
i!=6; ++
i) efN[
i] =
double(m_trackCollectionStat[
nc].m_efficiencyNEG[
i])/ne;
490 out<<
"|-----------------------------------------------------------------------------------|\n";
491 out<<
"| Probability to lose 0 1 2 3 4 >=5 clusters |\n";
492 out<<
"|-----------------------------------------------------------------------------------|\n";
494 auto formattedOutput=[&
out](
auto & effArray){
495 for (
size_t i{};
i!=6;++
i){
496 out<<std::setw(9)<<std::setprecision(4)<<effArray[
i];
501 out<<
"| For all particles ";
503 out<<
"| For + particles ";
504 formattedOutput(efP);
505 out<<
"| For - particles ";
506 formattedOutput(efN);
507 out<<
"|-----------------------------------------------------------------------------------|\n";
508 out<<
"| Barrel region |\n";
509 out<<
"| 0 wrong clusters ";
510 formattedOutput(efB0);
511 out<<
"| 1 wrong clusters ";
512 formattedOutput(efB1);
513 out<<
"| 2 wrong clusters ";
514 formattedOutput(efB2);
515 out<<
"| 3 wrong clusters ";
516 formattedOutput(efB3);
517 out<<
"| >=4 wrong clusters ";
518 formattedOutput(efB4);
519 out<<
"|-----------------------------------------------------------------------------------|\n";
520 out<<
"| Transition region |\n";
521 out<<
"| 0 wrong clusters ";
522 formattedOutput(efT0);
523 out<<
"| 1 wrong clusters ";
524 formattedOutput(efT1);
525 out<<
"| 2 wrong clusters ";
526 formattedOutput(efT2);
527 out<<
"| 3 wrong clusters ";
528 formattedOutput(efT3);
529 out<<
"| >=4 wrong clusters ";
530 formattedOutput(efT4);
531 out<<
"|-----------------------------------------------------------------------------------|\n";
532 out<<
"| Endcap region |\n";
533 out<<
"| 0 wrong clusters ";
534 formattedOutput(efE0);
535 out<<
"| 1 wrong clusters ";
536 formattedOutput(efE1);
537 out<<
"| 2 wrong clusters ";
538 formattedOutput(efE2);
539 out<<
"| 3 wrong clusters ";
540 formattedOutput(efE3);
541 out<<
"| >=4 wrong clusters ";
542 formattedOutput(efE4);
543 out<<
"|-----------------------------------------------------------------------------------|\n";
544 out<<
"| Forward region |\n";
545 out<<
"| 0 wrong clusters ";
546 formattedOutput(efD0);
547 out<<
"| 1 wrong clusters ";
548 formattedOutput(efD1);
549 out<<
"| 2 wrong clusters ";
550 formattedOutput(efD2);
551 out<<
"| 3 wrong clusters ";
552 formattedOutput(efD3);
553 out<<
"| >=4 wrong clusters ";
554 formattedOutput(efD4);
556 out<<
"|-----------------------------------------------------------------------------------|\n";
557 pa = coerceToOne(m_eventStat.m_particleClusters[0]);
558 out<<
"| Efficiency reconstruction (number lose+wrong < 3) = "
559 <<std::setw(9)<<std::setprecision(5)<<efrec
561 <<std::setw(9)<<std::setprecision(5)<<efrec*
double(m_eventStat.m_events)/pa
564 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][
Barrel]);
565 out<<
"| For barrel region = "
566 <<std::setw(9)<<std::setprecision(5)<<efrecB
568 <<std::setw(9)<<std::setprecision(5)<<efrecB*
double(m_eventStat.m_eventsBTE[
Barrel])/pa
571 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Transition]);
572 out<<
"| For transition region = "
573 <<std::setw(9)<<std::setprecision(5)<<efrecT
575 <<std::setw(9)<<std::setprecision(5)<<efrecT*
double(m_eventStat.m_eventsBTE[Transition])/pa
578 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][
Endcap]);
579 out<<
"| For endcap region = "
580 <<std::setw(9)<<std::setprecision(5)<<efrecE
582 <<std::setw(9)<<std::setprecision(5)<<efrecE*
double(m_eventStat.m_eventsBTE[
Endcap])/pa
585 pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Forward]);
586 out<<
"| For forward region = "
587 <<std::setw(9)<<std::setprecision(5)<<efrecD
589 <<std::setw(9)<<std::setprecision(5)<<efrecD*
double(m_eventStat.m_eventsBTE[Forward])/pa
593 out<<
"|-----------------------------------------------------------------------------------|\n";
594 out<<
"| Reconstructed tracks + - +/-ratio error |\n";
595 out<<
"|-----------------------------------------------------------------------------------|\n";
597 pa = coerceToOne(m_trackCollectionStat[
nc].m_ntracksNEGB);
602 <<std::setw(10)<<m_trackCollectionStat[
nc].m_ntracksPOSB
603 <<std::setw(11)<<m_trackCollectionStat[
nc].m_ntracksNEGB
604 <<std::setw(11)<<std::setprecision(5)<<
ratio
605 <<std::setw(11)<<std::setprecision(5)<<
eratio<<
" |\n";
606 pa = coerceToOne(m_trackCollectionStat[
nc].m_ntracksNEGE);
611 <<std::setw(10)<<m_trackCollectionStat[
nc].m_ntracksPOSE
612 <<std::setw(11)<<m_trackCollectionStat[
nc].m_ntracksNEGE
613 <<std::setw(11)<<std::setprecision(5)<<
ratio
614 <<std::setw(11)<<std::setprecision(5)<<
eratio<<
" |\n";
615 pa = coerceToOne(m_trackCollectionStat[
nc].m_ntracksNEGFWD);
616 ratio =
double(m_trackCollectionStat[
nc].m_ntracksPOSFWD)/pa;
620 <<std::setw(10)<<m_trackCollectionStat[
nc].m_ntracksPOSFWD
621 <<std::setw(11)<<m_trackCollectionStat[
nc].m_ntracksNEGFWD
622 <<std::setw(11)<<std::setprecision(5)<<
ratio
623 <<std::setw(11)<<std::setprecision(5)<<
eratio<<
" |\n";
630 for(
int k = 0;
k!=50; ++
k) {
631 nt+=m_trackCollectionStat[
nc].m_total[
k];
632 ft+=m_trackCollectionStat[
nc].m_fake [
k];
633 if(!kf &&
nt) kf =
k;
638 out<<
"|-----------------------------------------------------------------------------------|\n";
639 out<<
"| Fake tracks rate for different number of clusters on track |\n";
640 out<<
"|-----------------------------------------------------------------------------------|\n";
642 for(
int k = kf;
k!=kf+6; ++
k) {
643 out<<
"| >= "<<std::setw(2)<<
k<<
" ";
647 for(
int k = kf;
k!=kf+6; ++
k) {
649 out<<
"|"<<std::setw(12)<<std::setprecision(5)<<
eff<<
" ";
650 nt-=m_trackCollectionStat[
nc].m_total[
k];
651 ft-=m_trackCollectionStat[
nc].m_fake [
k];
654 out<<
"|-----------------------------------------------------------------------------------|\n";
659 return StatusCode::SUCCESS;