446 {
447
448
449 std::map<std::string, FlavorTagInference::Inputs> gnn_input;
450
451
452
455
456 SG::ReadDecorHandle<xAOD::TrackParticleContainer, float> acc_dr_lepton{
m_acc_trk_dr_lepton, ctx};
458 SG::ReadDecorHandle<xAOD::TrackParticleContainer, float> acc_d0{
m_acc_trk_d0, ctx};
459 SG::ReadDecorHandle<xAOD::TrackParticleContainer, float> acc_z0SinTheta{
m_acc_trk_z0SinTheta, ctx};
463
464
468 float elec_ptvarcone30Rel = acc_ptvarcone30(electron) / elec_pt;
469 float elec_topoetcone30Rel = acc_topoetcone30(electron) / elec_pt;
470
471
472 float elec_caloClusterSumEtRel = 0.0;
473 float sumCoreEt_large = 0.0;
475 float elec_calEta =
electron.caloCluster()->eta();
476 float elec_calPhi =
electron.caloCluster()->phi();
477
479 float deta = elec_calEta - cluster->eta();
480 float dphi = TVector2::Phi_mpi_pi(elec_calPhi - cluster->phi());
481 float dr = std::sqrt(deta*deta + dphi*dphi);
482
484 sumCoreEt_large += cluster->pt();
485 }
486 }
487 }
488 elec_caloClusterSumEtRel = sumCoreEt_large / elec_pt;
489
490
493 if (bestmatchedGSFElTrack) {
495 }
496
497
498
499
500
501
502
503
504
505
506 std::vector<float> electron_feat = {
507 elec_pt,
508 elec_eta,
509 elec_phi,
510 elec_ptvarcone30Rel,
511 elec_topoetcone30Rel,
512 elec_caloClusterSumEtRel};
513 std::vector<int64_t> electron_feat_dim = {1, static_cast<int64_t>(electron_feat.size())};
514
515
517 gnn_input.insert({"jet_features", electron_info});
518
519
520 std::vector<const xAOD::IParticle *>
parts;
521 if (!
fillParticles(dec_trk_dr_lepton, dec_trk_dr_leptontrack, dec_trk_electron_track, dec_trk_muon_track,
522 parts, electron, electronTrack, tracks, ctx)) {
523 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to fill particles");
524 return StatusCode::FAILURE;
525 }
526
527
528 std::vector<float> track_feat;
529 track_feat.reserve(
parts.size() *
static_cast<int64_t
>(electron_feat.size()));
530
531 for (const xAOD::IParticle *part: parts) {
533 if (!track) {
535 continue;
536 }
537
538
539
540
542
544
545 float qoverp =
track->qOverP();
546
547 float d0 = acc_d0(*track);
548
550
552 float d0_significance = -99;
554
556 float z0SinTheta_significance = -99;
558
561 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerHits");
562 return StatusCode::FAILURE;
563 }
564
565 uint8_t pix_nextinnermosthits = 0;
567 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfNextToInnermostPixelLayerHits");
568 return StatusCode::FAILURE;
569 }
570
571 uint8_t pix_innermostsharedhits = 0;
573 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSharedHits");
574 return StatusCode::FAILURE;
575 }
576
577 uint8_t pix_innermostsplithits = 0;
579 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSplitHits");
580 return StatusCode::FAILURE;
581 }
582
585 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelHits");
586 return StatusCode::FAILURE;
587 }
588
591 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSharedHits");
592 return StatusCode::FAILURE;
593 }
594
597 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSplitHits");
598 return StatusCode::FAILURE;
599 }
600
603 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTHits");
604 return StatusCode::FAILURE;
605 }
606
609 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTSharedHits");
610 return StatusCode::FAILURE;
611 }
612
613 char electron_track = acc_electron_track(*track);
614
615
616
617 track_feat.push_back(deta_lepton);
618 track_feat.push_back(dphi_lepton);
619 track_feat.push_back(qoverp);
620 track_feat.push_back(d0);
621 track_feat.push_back(z0SinTheta);
622 track_feat.push_back(d0_significance);
623 track_feat.push_back(z0SinTheta_significance);
624 track_feat.push_back(pix_innermosthits);
625 track_feat.push_back(pix_nextinnermosthits);
626 track_feat.push_back(pix_innermostsharedhits);
627 track_feat.push_back(pix_innermostsplithits);
628 track_feat.push_back(pix_hits);
629 track_feat.push_back(pix_shared);
630 track_feat.push_back(pix_split);
631 track_feat.push_back(sct_hits);
632 track_feat.push_back(sct_shared);
633 track_feat.push_back(electron_track);
634 }
635
636
637 int num_cnsts =
parts.size();
639
641 gnn_input.insert({"track_features", track_info});
642
643 if (
msgLvl(MSG::VERBOSE)) {
645 for (auto& inp : gnn_input){
647 for (auto & dim: inp.second.second) {
649 }
651 for (auto & con: inp.second.first) {
653 }
654 }
655 }
656
657
658
659
660 auto [out_f, out_vc, out_vf] = (std::abs(elec_eta) < 1.37) ?
m_saltModel->runInference(gnn_input) :
m_saltModel_endcap->runInference(gnn_input);
661 if (
msgLvl(MSG::VERBOSE)) {
663
665 for (auto& singlefloat : out_f){
667 }
669 for (auto& vecchar : out_vc){
671 for (auto& cc : vecchar.second){
673 }
674 }
676 for (auto& vecfloat : out_vf){
678 for (auto& ff : vecfloat.second){
680 }
681 }
682 }
683
684 auto it_dec_el_plit_output = dec_el_plit_output.begin();
685 for (auto& singlefloat : out_f){
686 ATH_MSG_DEBUG(
"DecoratePLIT::execute - Electron output: " + singlefloat.first +
" = " + std::to_string(singlefloat.second));
687 (*it_dec_el_plit_output)(
electron) = singlefloat.second;
688 ++it_dec_el_plit_output;
689 }
690
691 return StatusCode::SUCCESS;
692 }
#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