445 {
446
447
449
450
451
454
455 SG::ReadDecorHandle<xAOD::TrackParticleContainer, float> acc_dr_lepton{
m_acc_trk_dr_lepton, ctx};
457 SG::ReadDecorHandle<xAOD::TrackParticleContainer, float> acc_d0{
m_acc_trk_d0, ctx};
458 SG::ReadDecorHandle<xAOD::TrackParticleContainer, float> acc_z0SinTheta{
m_acc_trk_z0SinTheta, ctx};
462
463
467 float elec_ptvarcone30Rel = acc_ptvarcone30(electron) / elec_pt;
468 float elec_topoetcone30Rel = acc_topoetcone30(electron) / elec_pt;
469
470
471 float elec_caloClusterSumEtRel = 0.0;
472 float sumCoreEt_large = 0.0;
474 float elec_calEta =
electron.caloCluster()->eta();
475 float elec_calPhi =
electron.caloCluster()->phi();
476
478 float deta = elec_calEta - cluster->eta();
479 float dphi = TVector2::Phi_mpi_pi(elec_calPhi - cluster->phi());
480 float dr = std::sqrt(deta*deta + dphi*dphi);
481
483 sumCoreEt_large += cluster->pt();
484 }
485 }
486 }
487 elec_caloClusterSumEtRel = sumCoreEt_large / elec_pt;
488
489
492 if (bestmatchedGSFElTrack) {
494 }
495
496
497
498
499
500
501
502
503
504
505 std::vector<float> electron_feat = {
506 elec_pt,
507 elec_eta,
508 elec_phi,
509 elec_ptvarcone30Rel,
510 elec_topoetcone30Rel,
511 elec_caloClusterSumEtRel};
512 std::vector<int64_t> electron_feat_dim = {1, static_cast<int64_t>(electron_feat.size())};
513
514
515 FlavorTagInference::Inputs electron_info (electron_feat, electron_feat_dim);
516 gnn_input.insert({"jet_features", electron_info});
517
518
519 std::vector<const xAOD::IParticle *>
parts;
520 if (!
fillParticles(dec_trk_dr_lepton, dec_trk_dr_leptontrack, dec_trk_electron_track, dec_trk_muon_track,
521 parts, electron, electronTrack, tracks, ctx)) {
522 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to fill particles");
523 return StatusCode::FAILURE;
524 }
525
526
527 std::vector<float> track_feat;
528 track_feat.reserve(
parts.size() *
static_cast<int64_t
>(electron_feat.size()));
529
530 for (const xAOD::IParticle *part: parts) {
532 if (!track) {
534 return StatusCode::FAILURE;
535 }
536
537
538
539
541
543
544 float qoverp =
track->qOverP();
545
546 float d0 = acc_d0(*track);
547
549
551 float d0_significance = -99;
553
555 float z0SinTheta_significance = -99;
557
560 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerHits");
561 return StatusCode::FAILURE;
562 }
563
564 uint8_t pix_nextinnermosthits = 0;
566 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfNextToInnermostPixelLayerHits");
567 return StatusCode::FAILURE;
568 }
569
570 uint8_t pix_innermostsharedhits = 0;
572 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSharedHits");
573 return StatusCode::FAILURE;
574 }
575
576 uint8_t pix_innermostsplithits = 0;
578 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSplitHits");
579 return StatusCode::FAILURE;
580 }
581
584 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelHits");
585 return StatusCode::FAILURE;
586 }
587
590 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSharedHits");
591 return StatusCode::FAILURE;
592 }
593
596 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSplitHits");
597 return StatusCode::FAILURE;
598 }
599
602 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTHits");
603 return StatusCode::FAILURE;
604 }
605
608 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTSharedHits");
609 return StatusCode::FAILURE;
610 }
611
612 char electron_track = acc_electron_track(*track);
613
614
615
616 track_feat.push_back(deta_lepton);
617 track_feat.push_back(dphi_lepton);
618 track_feat.push_back(qoverp);
619 track_feat.push_back(d0);
620 track_feat.push_back(z0SinTheta);
621 track_feat.push_back(d0_significance);
622 track_feat.push_back(z0SinTheta_significance);
623 track_feat.push_back(pix_innermosthits);
624 track_feat.push_back(pix_nextinnermosthits);
625 track_feat.push_back(pix_innermostsharedhits);
626 track_feat.push_back(pix_innermostsplithits);
627 track_feat.push_back(pix_hits);
628 track_feat.push_back(pix_shared);
629 track_feat.push_back(pix_split);
630 track_feat.push_back(sct_hits);
631 track_feat.push_back(sct_shared);
632 track_feat.push_back(electron_track);
633 }
634
635
636 int num_cnsts =
parts.size();
638
639 FlavorTagInference::Inputs track_info (track_feat, track_feat_dim);
640 gnn_input.insert({"track_features", track_info});
641
642 if (
msgLvl(MSG::VERBOSE)) {
644 for (auto& inp : gnn_input){
646 for (auto & dim: inp.second.second) {
648 }
650 for (auto & con: inp.second.first) {
652 }
653 }
654 }
655
656
657
658
659 auto [out_f, out_vc, out_vf] = (std::abs(elec_eta) < 1.37) ?
m_saltModel->runInference(gnn_input) :
m_saltModel_endcap->runInference(gnn_input);
660 if (
msgLvl(MSG::VERBOSE)) {
662
664 for (auto& singlefloat : out_f){
666 }
668 for (auto& vecchar : out_vc){
670 for (auto& cc : vecchar.second){
672 }
673 }
675 for (auto& vecfloat : out_vf){
677 for (auto& ff : vecfloat.second){
679 }
680 }
681 }
682
683 auto it_dec_el_plit_output = dec_el_plit_output.begin();
684 for (auto& singlefloat : out_f){
685 ATH_MSG_DEBUG(
"DecoratePLIT::execute - Electron output: " + singlefloat.first +
" = " + std::to_string(singlefloat.second));
686 (*it_dec_el_plit_output)(
electron) = singlefloat.second;
687 ++it_dec_el_plit_output;
688 }
689
690 return StatusCode::SUCCESS;
691 }
#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