41 m_saltModel = std::make_shared<FlavorTagInference::SaltModel>(fullPathToOnnxFile);
44 m_saltModel_endcap = std::make_shared<FlavorTagInference::SaltModel>(fullPathToOnnxFile_endcap);
50 std::map<std::string, FlavorTagInference::Inputs> gnn_input;
53 std::vector<int64_t> elec_feat_dim = {1,
static_cast<int64_t
>(elec_feat.size())};
55 gnn_input.insert({
"jet_features", elec_info});
60 gnn_input.insert({
"track_features", track_info});
62 auto [out_f, out_vc, out_vf] =
m_saltModel->runInference(gnn_input);
64 std::vector<std::string> output_names;
65 for (
auto& singlefloat : out_f){
69 output_names.push_back(
outname);
76 m_saltModel = std::make_shared<FlavorTagInference::SaltModel>(fullPathToOnnxFile);
82 std::map<std::string, FlavorTagInference::Inputs> gnn_input;
85 std::vector<int64_t> muon_feat_dim = {1,
static_cast<int64_t
>(muon_feat.size())};
87 gnn_input.insert({
"jet_features", muon_info});
92 gnn_input.insert({
"track_features", track_info});
94 auto [out_f, out_vc, out_vf] =
m_saltModel->runInference(gnn_input);
96 std::vector<std::string> output_names;
97 for (
auto& singlefloat : out_f){
99 std::string
outname =
m_muonsKey.
key()+
"." +
m_TaggerName +
"_" + (singlefloat.first.find(
"muxpromp") != std::string::npos ?
"TPLTmu_pmuxpromp" :
"TPLTmu_pnpxall" );
101 output_names.push_back(
outname);
108 return StatusCode::FAILURE;
113 return StatusCode::SUCCESS;
128 dec_trk_dr_lepton(*
track) = -999.0;
129 dec_trk_dr_leptontrack(*
track) = -999.0;
130 dec_trk_electron_track(*
track) =
static_cast<char>(
false);
131 dec_trk_muon_track(*
track) =
static_cast<char>(
false);
137 std::vector<SG::WriteDecorHandle<xAOD::ElectronContainer, float>> dec_el_plit_output;
139 dec_el_plit_output.emplace_back(wdhk, ctx);
143 if (!
predictElec(dec_trk_dr_lepton, dec_trk_dr_leptontrack, dec_trk_electron_track, dec_trk_muon_track,
144 *elec, *tracks, *caloclusters, dec_el_plit_output, ctx)) {
145 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to predict electron");
146 return StatusCode::FAILURE;
152 std::vector<SG::WriteDecorHandle<xAOD::MuonContainer, float>> dec_mu_plit_output;
154 dec_mu_plit_output.emplace_back(wdhk, ctx);
158 if (!
predictMuon(dec_trk_dr_lepton, dec_trk_dr_leptontrack, dec_trk_electron_track, dec_trk_muon_track,
159 *
muon, *tracks, dec_mu_plit_output, ctx)) {
160 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to predict muon");
161 return StatusCode::FAILURE;
166 return StatusCode::SUCCESS;
191 return StatusCode::SUCCESS;
203 const EventContext& ctx)
const {
219 std::map<std::string, FlavorTagInference::Inputs> gnn_input;
222 float muon_pt =
muon.pt();
223 float muon_eta =
muon.eta();
224 float muon_phi =
muon.phi();
226 float muon_ptvarcone30TTVARel = acc_ptvarcone30TTVA(
muon) / muon_pt;
227 float muon_topoetcone30Rel = acc_topoetcone30(
muon) / muon_pt;
229 float muon_caloClusterERel = -99;
232 float energyloss = 0;
233 if (!
muon.parameter(energyloss,xAOD::Muon::EnergyLoss)) {
234 ATH_MSG_WARNING(
"DecoratePLIT::execute - failed to retrieve energy loss");
235 return StatusCode::FAILURE;
237 float calE = cluster->
calE();
241 if (std::abs(energyloss) != 0)
242 muon_caloClusterERel = calE / energyloss;
246 std::vector<float> muon_feat = {
250 muon_ptvarcone30TTVARel,
251 muon_topoetcone30Rel,
252 muon_caloClusterERel};
253 std::vector<int64_t> muon_feat_dim = {1,
static_cast<int64_t
>(muon_feat.size())};
257 gnn_input.insert({
"jet_features", muon_info});
261 std::vector<const xAOD::IParticle *>
parts;
263 if(!
fillParticles(dec_trk_dr_lepton, dec_trk_dr_leptontrack, dec_trk_electron_track, dec_trk_muon_track,
265 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to fill particles");
266 return StatusCode::FAILURE;
270 std::vector<float> track_feat;
271 track_feat.reserve(
parts.size() *
static_cast<int64_t
>(muon_feat.size()));
278 float deta_lepton =
track->p4().Eta() -
muon.eta();
280 float dphi_lepton =
track->p4().DeltaPhi(
muon.p4());
282 float qoverp =
track->qOverP();
292 float d0_significance = -99;
295 float z0SinTheta_significance = -99;
300 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelHits");
301 return StatusCode::FAILURE;
306 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerHits");
307 return StatusCode::FAILURE;
310 uint8_t pix_nextinnermosthits = 0;
312 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfNextToInnermostPixelLayerHits");
313 return StatusCode::FAILURE;
316 uint8_t pix_innermostsharedhits = 0;
318 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSharedHits");
319 return StatusCode::FAILURE;
322 uint8_t pix_innermostsplithits = 0;
324 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSplitHits");
325 return StatusCode::FAILURE;
330 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSharedHits");
331 return StatusCode::FAILURE;
336 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSplitHits");
337 return StatusCode::FAILURE;
342 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTHits");
343 return StatusCode::FAILURE;
348 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTSharedHits");
349 return StatusCode::FAILURE;
352 char muon_track = acc_muon_track(*
track);
354 track_feat.push_back(deta_lepton);
355 track_feat.push_back(dphi_lepton);
356 track_feat.push_back(qoverp);
357 track_feat.push_back(
d0);
361 track_feat.push_back(d0_significance);
362 track_feat.push_back(z0SinTheta_significance);
363 track_feat.push_back(pix_hits);
364 track_feat.push_back(pix_innermosthits);
365 track_feat.push_back(pix_nextinnermosthits);
366 track_feat.push_back(pix_innermostsharedhits);
367 track_feat.push_back(pix_innermostsplithits);
368 track_feat.push_back(pix_shared);
369 track_feat.push_back(pix_split);
370 track_feat.push_back(sct_hits);
371 track_feat.push_back(sct_shared);
372 track_feat.push_back(muon_track);
376 int num_cnsts =
parts.size();
380 gnn_input.insert({
"track_features", track_info});
384 for (
auto& inp : gnn_input){
386 for (
auto &
dim: inp.second.second) {
390 for (
auto & con: inp.second.first) {
398 auto [out_f, out_vc, out_vf] =
m_saltModel->runInference(gnn_input);
403 for (
auto& singlefloat : out_f){
407 for (
auto& vecchar : out_vc){
409 for (
auto&
cc : vecchar.second){
414 for (
auto& vecfloat : out_vf){
416 for (
auto&
ff : vecfloat.second){
422 auto it_dec_mu_plit_output = dec_mu_plit_output.begin();
423 for (
auto& singlefloat : out_f){
425 (*it_dec_mu_plit_output)(
muon) = singlefloat.second;
426 ++it_dec_mu_plit_output;
429 return StatusCode::SUCCESS;
441 const EventContext& ctx)
const {
444 std::map<std::string, FlavorTagInference::Inputs> gnn_input;
463 float elec_ptvarcone30Rel = acc_ptvarcone30(
electron) / elec_pt;
464 float elec_topoetcone30Rel = acc_topoetcone30(
electron) / elec_pt;
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();
474 float deta = elec_calEta - cluster->eta();
476 float dr = std::sqrt(deta*deta + dphi*dphi);
479 sumCoreEt_large += cluster->pt();
483 elec_caloClusterSumEtRel = sumCoreEt_large / elec_pt;
488 if (bestmatchedGSFElTrack) {
501 std::vector<float> electron_feat = {
506 elec_topoetcone30Rel,
507 elec_caloClusterSumEtRel};
508 std::vector<int64_t> electron_feat_dim = {1,
static_cast<int64_t
>(electron_feat.size())};
512 gnn_input.insert({
"jet_features", electron_info});
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,
518 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to fill particles");
519 return StatusCode::FAILURE;
523 std::vector<float> track_feat;
524 track_feat.reserve(
parts.size() *
static_cast<int64_t
>(electron_feat.size()));
540 float qoverp =
track->qOverP();
547 float d0_significance = -99;
551 float z0SinTheta_significance = -99;
556 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerHits");
557 return StatusCode::FAILURE;
560 uint8_t pix_nextinnermosthits = 0;
562 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfNextToInnermostPixelLayerHits");
563 return StatusCode::FAILURE;
566 uint8_t pix_innermostsharedhits = 0;
568 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSharedHits");
569 return StatusCode::FAILURE;
572 uint8_t pix_innermostsplithits = 0;
574 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSplitHits");
575 return StatusCode::FAILURE;
580 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelHits");
581 return StatusCode::FAILURE;
586 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSharedHits");
587 return StatusCode::FAILURE;
592 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSplitHits");
593 return StatusCode::FAILURE;
598 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTHits");
599 return StatusCode::FAILURE;
604 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTSharedHits");
605 return StatusCode::FAILURE;
608 char electron_track = acc_electron_track(*
track);
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);
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);
632 int num_cnsts =
parts.size();
636 gnn_input.insert({
"track_features", track_info});
640 for (
auto& inp : gnn_input){
642 for (
auto &
dim: inp.second.second) {
646 for (
auto & con: inp.second.first) {
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);
660 for (
auto& singlefloat : out_f){
664 for (
auto& vecchar : out_vc){
666 for (
auto&
cc : vecchar.second){
671 for (
auto& vecfloat : out_vf){
673 for (
auto&
ff : vecfloat.second){
679 auto it_dec_el_plit_output = dec_el_plit_output.begin();
680 for (
auto& singlefloat : out_f){
682 (*it_dec_el_plit_output)(
electron) = singlefloat.second;
683 ++it_dec_el_plit_output;
686 return StatusCode::SUCCESS;
692 constexpr
float pt_minimum = 500;
693 constexpr
float abs_eta_maximum = 2.5;
694 constexpr
float d0_maximum = 3.5;
695 constexpr
float z0_maximum= 5.0;
696 constexpr
unsigned char si_hits_minimum = 8;
697 constexpr
unsigned char si_shared_maximum = 1;
698 constexpr
unsigned char si_holes_maximum = 2;
699 constexpr
unsigned char pix_holes_maximum = 1;
708 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelSharedHits");
713 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTSharedHits");
718 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelHits");
723 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTHits");
728 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelDeadSensors");
733 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTDeadSensors");
738 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelHoles");
743 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTHoles");
747 if (std::abs(
tp.eta()) > abs_eta_maximum)
749 double n_module_shared = (pix_shared + sct_shared / 2);
750 if (n_module_shared > si_shared_maximum)
752 if (
tp.pt() <= pt_minimum)
754 if (std::isfinite(d0_maximum) &&
755 std::abs(acc_d0(
tp)) >= d0_maximum)
757 if (std::isfinite(z0_maximum) &&
758 std::abs(acc_z0SinTheta(
tp)) >= z0_maximum)
760 if (pix_hits + pix_dead + sct_hits + sct_dead < si_hits_minimum)
762 if ((pix_holes + sct_holes) > si_holes_maximum)
764 if (pix_holes > pix_holes_maximum)
774 std::vector<const xAOD::IParticle *> &
parts,
778 const EventContext& ctx)
const
784 std::set<const xAOD::TrackParticle*> tracksUsedForElectron;
785 std::set<const xAOD::TrackParticle*> tracksUsedForMuon;
786 if (
const auto* elec =
dynamic_cast<const xAOD::Electron*
>(&lepton)) {
788 }
else if (
const auto*
muon =
dynamic_cast<const xAOD::Muon*
>(&lepton)) {
790 tracksUsedForMuon.insert(*(
muon->inDetTrackParticleLink()));
797 ATH_MSG_ERROR(
"DecoratePLIT::fillParticles - null track pointer");
804 float dr_lepton = (lepton.
p4().Pt() > 0.) ?
track->p4().DeltaR(lepton.
p4()) : -99;
809 bool isUsedForElectron = tracksUsedForElectron.count(
track);
810 bool isUsedForMuon = tracksUsedForMuon.count(
track);
812 if (!
decorateTrack(dec_trk_dr_lepton, dec_trk_dr_leptontrack, dec_trk_electron_track, dec_trk_muon_track,
813 *
track, dr_lepton, isUsedForElectron, isUsedForMuon, trackLep)) {
814 ATH_MSG_ERROR(
"DecoratePLIT::fillParticles - failed to decorate track");
815 return StatusCode::FAILURE;
823 return a->p4().DeltaR(lepton_p4) <
b->p4().DeltaR(lepton_p4);
825 std::sort(
parts.begin(),
parts.end(), SORT_TRACKLEP);
827 return StatusCode::SUCCESS;
837 bool isUsedForElectron,
842 dec_trk_dr_lepton(
track) = dr_lepton;
843 dec_trk_electron_track(
track) =
static_cast<char>(isUsedForElectron);
844 dec_trk_muon_track(
track) =
static_cast<char>(isUsedForMuon);
846 float dr_leptontrack = -99;
848 if (trackLep->
pt() > 0.) {
849 dr_leptontrack =
track.p4().DeltaR(trackLep->
p4());
852 dec_trk_dr_leptontrack(
track) = dr_leptontrack;
854 return StatusCode::SUCCESS;