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;
121 if (!tracks->
empty()) {
131 std::vector<SG::WriteDecorHandle<xAOD::ElectronContainer, float>> dec_el_plit_output;
133 dec_el_plit_output.emplace_back(wdhk, ctx);
137 if (!
predictElec(*elec, *tracks, *caloclusters, dec_el_plit_output, ctx)) {
138 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to predict electron");
139 return StatusCode::FAILURE;
145 std::vector<SG::WriteDecorHandle<xAOD::MuonContainer, float>> dec_mu_plit_output;
147 dec_mu_plit_output.emplace_back(wdhk, ctx);
151 if (!
predictMuon(*muon, *tracks, dec_mu_plit_output, ctx)) {
152 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to predict muon");
153 return StatusCode::FAILURE;
158 return StatusCode::SUCCESS;
178 return StatusCode::SUCCESS;
185 const EventContext& ctx)
const {
201 std::map<std::string, FlavorTagInference::Inputs> gnn_input;
204 float muon_pt = muon.pt();
205 float muon_eta = muon.eta();
206 float muon_phi = muon.phi();
208 float muon_ptvarcone30TTVARel = acc_ptvarcone30TTVA(muon) / muon_pt;
209 float muon_topoetcone30Rel = acc_topoetcone30(muon) / muon_pt;
211 float muon_caloClusterERel = -99;
214 float energyloss = 0;
215 if (!muon.parameter(energyloss,xAOD::Muon::MeasEnergyLoss)) {
216 ATH_MSG_WARNING(
"DecoratePLIT::execute - failed to retrieve energy loss");
217 return StatusCode::FAILURE;
219 float calE = cluster->calE();
220 if (std::abs(energyloss) > 0)
221 muon_caloClusterERel = calE / energyloss;
225 std::vector<float> muon_feat = {
229 muon_ptvarcone30TTVARel,
230 muon_topoetcone30Rel,
231 muon_caloClusterERel};
232 std::vector<int64_t> muon_feat_dim = {1,
static_cast<int64_t
>(muon_feat.size())};
236 gnn_input.insert({
"jet_features", muon_info});
240 std::vector<const xAOD::IParticle *>
parts;
243 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to fill particles");
244 return StatusCode::FAILURE;
248 std::vector<float> track_feat;
249 track_feat.reserve(
parts.size() *
static_cast<int64_t
>(muon_feat.size()));
256 float deta_lepton = track->p4().Eta() - muon.eta();
258 float dphi_lepton = track->p4().DeltaPhi(muon.p4());
260 float qoverp = track->qOverP();
262 float d0 = acc_d0(*track);
270 float d0_significance = -99;
273 float z0SinTheta_significance = -99;
278 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelHits");
279 return StatusCode::FAILURE;
284 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerHits");
285 return StatusCode::FAILURE;
288 uint8_t pix_nextinnermosthits = 0;
290 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfNextToInnermostPixelLayerHits");
291 return StatusCode::FAILURE;
294 uint8_t pix_innermostsharedhits = 0;
296 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSharedHits");
297 return StatusCode::FAILURE;
300 uint8_t pix_innermostsplithits = 0;
302 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSplitHits");
303 return StatusCode::FAILURE;
308 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSharedHits");
309 return StatusCode::FAILURE;
314 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSplitHits");
315 return StatusCode::FAILURE;
320 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTHits");
321 return StatusCode::FAILURE;
326 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTSharedHits");
327 return StatusCode::FAILURE;
330 char muon_track = acc_muon_track(*track);
332 track_feat.push_back(deta_lepton);
333 track_feat.push_back(dphi_lepton);
334 track_feat.push_back(qoverp);
335 track_feat.push_back(
d0);
339 track_feat.push_back(d0_significance);
340 track_feat.push_back(z0SinTheta_significance);
341 track_feat.push_back(pix_hits);
342 track_feat.push_back(pix_innermosthits);
343 track_feat.push_back(pix_nextinnermosthits);
344 track_feat.push_back(pix_innermostsharedhits);
345 track_feat.push_back(pix_innermostsplithits);
346 track_feat.push_back(pix_shared);
347 track_feat.push_back(pix_split);
348 track_feat.push_back(sct_hits);
349 track_feat.push_back(sct_shared);
350 track_feat.push_back(muon_track);
354 int num_cnsts =
parts.size();
358 gnn_input.insert({
"track_features", track_info});
362 for (
auto& inp : gnn_input){
364 for (
auto &
dim: inp.second.second) {
368 for (
auto & con: inp.second.first) {
376 auto [out_f, out_vc, out_vf] =
m_saltModel->runInference(gnn_input);
381 for (
auto& singlefloat : out_f){
385 for (
auto& vecchar : out_vc){
387 for (
auto&
cc : vecchar.second){
392 for (
auto& vecfloat : out_vf){
394 for (
auto&
ff : vecfloat.second){
400 auto it_dec_mu_plit_output = dec_mu_plit_output.begin();
401 for (
auto& singlefloat : out_f){
402 (*it_dec_mu_plit_output)(muon) = singlefloat.second;
403 ++it_dec_mu_plit_output;
406 return StatusCode::SUCCESS;
414 const EventContext& ctx)
const {
417 std::map<std::string, FlavorTagInference::Inputs> gnn_input;
433 float elec_pt = electron.pt();
434 float elec_eta = electron.eta();
435 float elec_phi = electron.phi();
436 float elec_ptvarcone30Rel = acc_ptvarcone30(electron) / elec_pt;
437 float elec_topoetcone30Rel = acc_topoetcone30(electron) / elec_pt;
440 float elec_caloClusterSumEtRel = 0.0;
441 float sumCoreEt_large = 0.0;
442 if (electron.caloCluster()) {
443 float elec_calEta = electron.caloCluster()->eta();
444 float elec_calPhi = electron.caloCluster()->phi();
447 float deta = elec_calEta - cluster->eta();
449 float dr = std::sqrt(deta*deta + dphi*dphi);
452 sumCoreEt_large += cluster->pt();
456 elec_caloClusterSumEtRel = sumCoreEt_large / elec_pt;
461 if (bestmatchedGSFElTrack) {
474 std::vector<float> electron_feat = {
479 elec_topoetcone30Rel,
480 elec_caloClusterSumEtRel};
481 std::vector<int64_t> electron_feat_dim = {1,
static_cast<int64_t
>(electron_feat.size())};
485 gnn_input.insert({
"jet_features", electron_info});
488 std::vector<const xAOD::IParticle *>
parts;
490 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to fill particles");
491 return StatusCode::FAILURE;
495 std::vector<float> track_feat;
496 track_feat.reserve(
parts.size() *
static_cast<int64_t
>(electron_feat.size()));
508 float deta_lepton = track->p4().Eta() - electron.eta();
510 float dphi_lepton = track->p4().DeltaPhi(electron.p4());
512 float qoverp = track->qOverP();
514 float d0 = acc_d0(*track);
519 float d0_significance = -99;
523 float z0SinTheta_significance = -99;
528 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerHits");
529 return StatusCode::FAILURE;
532 uint8_t pix_nextinnermosthits = 0;
534 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfNextToInnermostPixelLayerHits");
535 return StatusCode::FAILURE;
538 uint8_t pix_innermostsharedhits = 0;
540 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSharedHits");
541 return StatusCode::FAILURE;
544 uint8_t pix_innermostsplithits = 0;
546 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSplitHits");
547 return StatusCode::FAILURE;
552 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelHits");
553 return StatusCode::FAILURE;
558 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSharedHits");
559 return StatusCode::FAILURE;
564 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSplitHits");
565 return StatusCode::FAILURE;
570 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTHits");
571 return StatusCode::FAILURE;
576 ATH_MSG_ERROR(
"DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTSharedHits");
577 return StatusCode::FAILURE;
580 char electron_track = acc_electron_track(*track);
584 track_feat.push_back(deta_lepton);
585 track_feat.push_back(dphi_lepton);
586 track_feat.push_back(qoverp);
587 track_feat.push_back(
d0);
589 track_feat.push_back(d0_significance);
590 track_feat.push_back(z0SinTheta_significance);
591 track_feat.push_back(pix_innermosthits);
592 track_feat.push_back(pix_nextinnermosthits);
593 track_feat.push_back(pix_innermostsharedhits);
594 track_feat.push_back(pix_innermostsplithits);
595 track_feat.push_back(pix_hits);
596 track_feat.push_back(pix_shared);
597 track_feat.push_back(pix_split);
598 track_feat.push_back(sct_hits);
599 track_feat.push_back(sct_shared);
600 track_feat.push_back(electron_track);
604 int num_cnsts =
parts.size();
608 gnn_input.insert({
"track_features", track_info});
612 for (
auto& inp : gnn_input){
614 for (
auto &
dim: inp.second.second) {
618 for (
auto & con: inp.second.first) {
627 auto [out_f, out_vc, out_vf] = (std::abs(elec_eta) < 1.37) ?
m_saltModel->runInference(gnn_input) :
m_saltModel_endcap->runInference(gnn_input);
632 for (
auto& singlefloat : out_f){
636 for (
auto& vecchar : out_vc){
638 for (
auto&
cc : vecchar.second){
643 for (
auto& vecfloat : out_vf){
645 for (
auto&
ff : vecfloat.second){
651 auto it_dec_el_plit_output = dec_el_plit_output.begin();
652 for (
auto& singlefloat : out_f){
653 (*it_dec_el_plit_output)(electron) = singlefloat.second;
654 ++it_dec_el_plit_output;
657 return StatusCode::SUCCESS;
663 constexpr
float pt_minimum = 500;
664 constexpr
float abs_eta_maximum = 2.5;
665 constexpr
float d0_maximum = 3.5;
666 constexpr
float z0_maximum= 5.0;
667 constexpr
unsigned char si_hits_minimum = 8;
668 constexpr
unsigned char si_shared_maximum = 1;
669 constexpr
unsigned char si_holes_maximum = 2;
670 constexpr
unsigned char pix_holes_maximum = 1;
679 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelSharedHits");
684 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTSharedHits");
689 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelHits");
694 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTHits");
699 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelDeadSensors");
704 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTDeadSensors");
709 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelHoles");
714 ATH_MSG_ERROR(
"DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTHoles");
718 if (std::abs(
tp.eta()) > abs_eta_maximum)
720 double n_module_shared = (pix_shared + sct_shared / 2);
721 if (n_module_shared > si_shared_maximum)
723 if (
tp.pt() <= pt_minimum)
725 if (std::isfinite(d0_maximum) &&
726 std::abs(acc_d0(
tp)) >= d0_maximum)
728 if (std::isfinite(z0_maximum) &&
729 std::abs(acc_z0SinTheta(
tp)) >= z0_maximum)
731 if (pix_hits + pix_dead + sct_hits + sct_dead < si_hits_minimum)
733 if ((pix_holes + sct_holes) > si_holes_maximum)
735 if (pix_holes > pix_holes_maximum)
741 std::vector<const xAOD::IParticle *> &
parts,
745 const EventContext& ctx)
const
751 std::set<const xAOD::TrackParticle*> tracksUsedForElectron;
752 std::set<const xAOD::TrackParticle*> tracksUsedForMuon;
753 if (
const auto* elec =
dynamic_cast<const xAOD::Electron*
>(&lepton)) {
755 }
else if (
const auto* muon =
dynamic_cast<const xAOD::Muon*
>(&lepton)) {
757 tracksUsedForMuon.insert(muon->primaryTrackParticle());
764 ATH_MSG_ERROR(
"DecoratePLIT::fillParticles - null track pointer");
771 float dr_lepton = (lepton.
p4().Pt() > 0.) ? track->p4().DeltaR(lepton.
p4()) : -99;
776 bool isUsedForElectron = tracksUsedForElectron.count(track);
777 bool isUsedForMuon = tracksUsedForMuon.count(track);
779 if (!
decorateTrack(*track, dr_lepton, isUsedForElectron, isUsedForMuon, trackLep)) {
780 ATH_MSG_ERROR(
"DecoratePLIT::fillParticles - failed to decorate track");
781 return StatusCode::FAILURE;
784 parts.push_back(track);
789 return a->p4().DeltaR(lepton_p4) <
b->p4().DeltaR(lepton_p4);
791 std::sort(
parts.begin(),
parts.end(), SORT_TRACKLEP);
793 return StatusCode::SUCCESS;
799 bool isUsedForElectron,
808 float dr_leptontrack = -99;
810 if (trackLep->
pt() > 0.) {
811 dr_leptontrack = track.p4().DeltaR(trackLep->
p4());
816 return StatusCode::SUCCESS;