441 {
442
443
444 std::map<std::string, FlavorTagInference::Inputs> gnn_input;
445
446
447
450
451 SG::ReadDecorHandle<xAOD::TrackParticleContainer, float> acc_dr_lepton{
m_acc_trk_dr_lepton, ctx};
453 SG::ReadDecorHandle<xAOD::TrackParticleContainer, float> acc_d0{
m_acc_trk_d0, ctx};
454 SG::ReadDecorHandle<xAOD::TrackParticleContainer, float> acc_z0SinTheta{
m_acc_trk_z0SinTheta, ctx};
458
459
463 float elec_ptvarcone30Rel = acc_ptvarcone30(electron) / elec_pt;
464 float elec_topoetcone30Rel = acc_topoetcone30(electron) / elec_pt;
465
466
467 float elec_caloClusterSumEtRel = 0.0;
468 float sumCoreEt_large = 0.0;
470 float elec_calEta =
electron.caloCluster()->eta();
471 float elec_calPhi =
electron.caloCluster()->phi();
472
474 float deta = elec_calEta - cluster->eta();
475 float dphi = TVector2::Phi_mpi_pi(elec_calPhi - cluster->phi());
476 float dr = std::sqrt(deta*deta + dphi*dphi);
477
479 sumCoreEt_large += cluster->pt();
480 }
481 }
482 }
483 elec_caloClusterSumEtRel = sumCoreEt_large / elec_pt;
484
485
488 if (bestmatchedGSFElTrack) {
490 }
491
492
493
494
495
496
497
498
499
500
501 std::vector<float> electron_feat = {
502 elec_pt,
503 elec_eta,
504 elec_phi,
505 elec_ptvarcone30Rel,
506 elec_topoetcone30Rel,
507 elec_caloClusterSumEtRel};
508 std::vector<int64_t> electron_feat_dim = {1, static_cast<int64_t>(electron_feat.size())};
509
510
512 gnn_input.insert({"jet_features", electron_info});
513
514
515 std::vector<const xAOD::IParticle *>
parts;
516 if (!
fillParticles(dec_trk_dr_lepton, dec_trk_dr_leptontrack, dec_trk_electron_track, dec_trk_muon_track,
517 parts, electron, electronTrack, tracks, ctx)) {
518 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to fill particles");
519 return StatusCode::FAILURE;
520 }
521
522
523 std::vector<float> track_feat;
524 track_feat.reserve(
parts.size() *
static_cast<int64_t
>(electron_feat.size()));
525
526 for (const xAOD::IParticle *part: parts) {
528 if (!track) {
530 continue;
531 }
532
533
534
535
537
539
540 float qoverp =
track->qOverP();
541
542 float d0 = acc_d0(*track);
543
545
547 float d0_significance = -99;
549
551 float z0SinTheta_significance = -99;
553
556 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerHits");
557 return StatusCode::FAILURE;
558 }
559
560 uint8_t pix_nextinnermosthits = 0;
562 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfNextToInnermostPixelLayerHits");
563 return StatusCode::FAILURE;
564 }
565
566 uint8_t pix_innermostsharedhits = 0;
568 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSharedHits");
569 return StatusCode::FAILURE;
570 }
571
572 uint8_t pix_innermostsplithits = 0;
574 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSplitHits");
575 return StatusCode::FAILURE;
576 }
577
580 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelHits");
581 return StatusCode::FAILURE;
582 }
583
586 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSharedHits");
587 return StatusCode::FAILURE;
588 }
589
592 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSplitHits");
593 return StatusCode::FAILURE;
594 }
595
598 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTHits");
599 return StatusCode::FAILURE;
600 }
601
604 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTSharedHits");
605 return StatusCode::FAILURE;
606 }
607
608 char electron_track = acc_electron_track(*track);
609
610
611
612 track_feat.push_back(deta_lepton);
613 track_feat.push_back(dphi_lepton);
614 track_feat.push_back(qoverp);
615 track_feat.push_back(d0);
616 track_feat.push_back(z0SinTheta);
617 track_feat.push_back(d0_significance);
618 track_feat.push_back(z0SinTheta_significance);
619 track_feat.push_back(pix_innermosthits);
620 track_feat.push_back(pix_nextinnermosthits);
621 track_feat.push_back(pix_innermostsharedhits);
622 track_feat.push_back(pix_innermostsplithits);
623 track_feat.push_back(pix_hits);
624 track_feat.push_back(pix_shared);
625 track_feat.push_back(pix_split);
626 track_feat.push_back(sct_hits);
627 track_feat.push_back(sct_shared);
628 track_feat.push_back(electron_track);
629 }
630
631
632 int num_cnsts =
parts.size();
634
636 gnn_input.insert({"track_features", track_info});
637
638 if (
msgLvl(MSG::VERBOSE)) {
640 for (auto& inp : gnn_input){
642 for (auto & dim: inp.second.second) {
644 }
646 for (auto & con: inp.second.first) {
648 }
649 }
650 }
651
652
653
654
655 auto [out_f, out_vc, out_vf] = (std::abs(elec_eta) < 1.37) ?
m_saltModel->runInference(gnn_input) :
m_saltModel_endcap->runInference(gnn_input);
656 if (
msgLvl(MSG::VERBOSE)) {
658
660 for (auto& singlefloat : out_f){
662 }
664 for (auto& vecchar : out_vc){
666 for (auto& cc : vecchar.second){
668 }
669 }
671 for (auto& vecfloat : out_vf){
673 for (auto& ff : vecfloat.second){
675 }
676 }
677 }
678
679 auto it_dec_el_plit_output = dec_el_plit_output.begin();
680 for (auto& singlefloat : out_f){
681 ATH_MSG_DEBUG(
"DecoratePLIT::execute - Electron output: " + singlefloat.first +
" = " + std::to_string(singlefloat.second));
682 (*it_dec_el_plit_output)(
electron) = singlefloat.second;
683 ++it_dec_el_plit_output;
684 }
685
686 return StatusCode::SUCCESS;
687 }
#define ATH_MSG_VERBOSE(x)
bool msgLvl(const MSG::Level lvl) const
Gaudi::Property< float > m_lepCalErelConeSize
StatusCode fillParticles(SG::WriteDecorHandle< xAOD::TrackParticleContainer, float > &dec_trk_dr_lepton, SG::WriteDecorHandle< xAOD::TrackParticleContainer, float > &dec_trk_dr_leptontrack, SG::WriteDecorHandle< xAOD::TrackParticleContainer, char > &dec_trk_electron_track, SG::WriteDecorHandle< xAOD::TrackParticleContainer, char > &dec_trk_muon_track, std::vector< const xAOD::IParticle * > &parts, const xAOD::IParticle &lepton, const xAOD::TrackParticle *trackLep, const xAOD::TrackParticleContainer &trackContainer, const EventContext &ctx) const
float z0SinTheta(const U &p)
const std::string d0Uncertainty
const std::string z0SinThetaUncertainty
const xAOD::TrackParticle * getOriginalTrackParticleFromGSF(const xAOD::TrackParticle *trkPar)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the GSF Track Particle...
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
@ numberOfPixelSplitHits
number of Pixel all-layer hits split by cluster splitting [unit8_t].
@ numberOfInnermostPixelLayerSharedHits
number of Pixel 0th layer barrel hits shared by several tracks.
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
@ numberOfInnermostPixelLayerSplitHits
number of Pixel 0th layer barrel hits split by cluster splitting
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer