16 #include "oneapi/tbb/concurrent_unordered_set.h"
24 struct dnn_inputs_2017v1 {
32 neutralIsoPtSumWeight,
33 photonPtSumOutsideSignalCone,
45 leadChargedHadrCand_pt,
46 leadChargedHadrCand_dEta,
47 leadChargedHadrCand_dPhi,
48 leadChargedHadrCand_mass,
71 gsf_ele_dEta_SeedClusterTrackAtCalo,
72 gsf_ele_dPhi_SeedClusterTrackAtCalo,
73 gsf_ele_mvaIn_sigmaEtaEta,
74 gsf_ele_mvaIn_hadEnergy,
75 gsf_ele_mvaIn_deltaEta,
78 gsf_ele_GSFTrackResol,
82 leadChargedCand_etaAtEcalEntrance,
84 leadChargedHadrCand_HoP,
85 leadChargedHadrCand_EoP,
86 tau_visMass_innerSigCone,
108 muon_n_stations_with_matches_03,
109 muon_n_stations_with_hits_23,
110 signalChargedHadrCands_sum_innerSigCone_pt,
111 signalChargedHadrCands_sum_innerSigCone_dEta,
112 signalChargedHadrCands_sum_innerSigCone_dPhi,
113 signalChargedHadrCands_sum_innerSigCone_mass,
114 signalChargedHadrCands_sum_outerSigCone_pt,
115 signalChargedHadrCands_sum_outerSigCone_dEta,
116 signalChargedHadrCands_sum_outerSigCone_dPhi,
117 signalChargedHadrCands_sum_outerSigCone_mass,
118 signalChargedHadrCands_nTotal_innerSigCone,
119 signalChargedHadrCands_nTotal_outerSigCone,
120 signalNeutrHadrCands_sum_innerSigCone_pt,
121 signalNeutrHadrCands_sum_innerSigCone_dEta,
122 signalNeutrHadrCands_sum_innerSigCone_dPhi,
123 signalNeutrHadrCands_sum_innerSigCone_mass,
124 signalNeutrHadrCands_sum_outerSigCone_pt,
125 signalNeutrHadrCands_sum_outerSigCone_dEta,
126 signalNeutrHadrCands_sum_outerSigCone_dPhi,
127 signalNeutrHadrCands_sum_outerSigCone_mass,
128 signalNeutrHadrCands_nTotal_innerSigCone,
129 signalNeutrHadrCands_nTotal_outerSigCone,
130 signalGammaCands_sum_innerSigCone_pt,
131 signalGammaCands_sum_innerSigCone_dEta,
132 signalGammaCands_sum_innerSigCone_dPhi,
133 signalGammaCands_sum_innerSigCone_mass,
134 signalGammaCands_sum_outerSigCone_pt,
135 signalGammaCands_sum_outerSigCone_dEta,
136 signalGammaCands_sum_outerSigCone_dPhi,
137 signalGammaCands_sum_outerSigCone_mass,
138 signalGammaCands_nTotal_innerSigCone,
139 signalGammaCands_nTotal_outerSigCone,
140 isolationChargedHadrCands_sum_pt,
141 isolationChargedHadrCands_sum_dEta,
142 isolationChargedHadrCands_sum_dPhi,
143 isolationChargedHadrCands_sum_mass,
144 isolationChargedHadrCands_nTotal,
145 isolationNeutrHadrCands_sum_pt,
146 isolationNeutrHadrCands_sum_dEta,
147 isolationNeutrHadrCands_sum_dPhi,
148 isolationNeutrHadrCands_sum_mass,
149 isolationNeutrHadrCands_nTotal,
150 isolationGammaCands_sum_pt,
151 isolationGammaCands_sum_dEta,
152 isolationGammaCands_sum_dPhi,
153 isolationGammaCands_sum_mass,
154 isolationGammaCands_nTotal,
159 namespace dnn_inputs_2017_v2 {
160 constexpr
int number_of_inner_cell = 11;
161 constexpr
int number_of_outer_cell = 21;
162 constexpr
int number_of_conv_features = 64;
163 namespace TauBlockInputs {
172 tau_n_charged_prongs,
173 tau_n_neutral_prongs,
175 chargedIsoPtSumdR03_over_dR05,
178 neutralIsoPtSumWeight_over_neutralIsoPtSum,
179 neutralIsoPtSumWeightdR03_over_neutralIsoPtSum,
180 neutralIsoPtSumdR03_over_dR05,
181 photonPtSumOutsideSignalCone,
198 tau_flightLength_sig,
199 tau_pt_weighted_deta_strip,
200 tau_pt_weighted_dphi_strip,
201 tau_pt_weighted_dr_signal,
202 tau_pt_weighted_dr_iso,
203 tau_leadingTrackNormChi2,
206 tau_gj_angle_diff_valid,
210 tau_inside_ecal_crack,
211 leadChargedCand_etaAtEcalEntrance_minus_tau_eta,
216 namespace EgammaBlockInputs {
221 tau_inside_ecal_crack,
226 pfCand_ele_pvAssociationQuality,
227 pfCand_ele_puppiWeight,
229 pfCand_ele_lostInnerHits,
230 pfCand_ele_numberOfPixelHits,
231 pfCand_ele_vertex_dx,
232 pfCand_ele_vertex_dy,
233 pfCand_ele_vertex_dz,
234 pfCand_ele_vertex_dx_tauFL,
235 pfCand_ele_vertex_dy_tauFL,
236 pfCand_ele_vertex_dz_tauFL,
237 pfCand_ele_hasTrackDetails,
242 pfCand_ele_track_chi2_ndof,
243 pfCand_ele_track_ndof,
249 ele_cc_ele_rel_energy,
250 ele_cc_gamma_rel_energy,
252 ele_rel_trackMomentumAtVtx,
253 ele_rel_trackMomentumAtCalo,
254 ele_rel_trackMomentumOut,
255 ele_rel_trackMomentumAtEleClus,
256 ele_rel_trackMomentumAtVtxWithConstraint,
259 ele_eSuperClusterOverP,
260 ele_eSeedClusterOverP,
261 ele_eSeedClusterOverPout,
262 ele_eEleClusterOverPout,
263 ele_deltaEtaSuperClusterTrackAtVtx,
264 ele_deltaEtaSeedClusterTrackAtCalo,
265 ele_deltaEtaEleClusterTrackAtCalo,
266 ele_deltaPhiEleClusterTrackAtCalo,
267 ele_deltaPhiSuperClusterTrackAtVtx,
268 ele_deltaPhiSeedClusterTrackAtCalo,
269 ele_mvaInput_earlyBrem,
270 ele_mvaInput_lateBrem,
271 ele_mvaInput_sigmaEtaEta,
272 ele_mvaInput_hadEnergy,
273 ele_mvaInput_deltaEta,
274 ele_gsfTrack_normalizedChi2,
275 ele_gsfTrack_numberOfValidHits,
278 ele_has_closestCtfTrack,
279 ele_closestCtfTrack_normalizedChi2,
280 ele_closestCtfTrack_numberOfValidHits,
285 pfCand_gamma_pvAssociationQuality,
287 pfCand_gamma_puppiWeight,
288 pfCand_gamma_puppiWeightNoLep,
289 pfCand_gamma_lostInnerHits,
290 pfCand_gamma_numberOfPixelHits,
291 pfCand_gamma_vertex_dx,
292 pfCand_gamma_vertex_dy,
293 pfCand_gamma_vertex_dz,
294 pfCand_gamma_vertex_dx_tauFL,
295 pfCand_gamma_vertex_dy_tauFL,
296 pfCand_gamma_vertex_dz_tauFL,
297 pfCand_gamma_hasTrackDetails,
299 pfCand_gamma_dxy_sig,
302 pfCand_gamma_track_chi2_ndof,
303 pfCand_gamma_track_ndof,
308 namespace MuonBlockInputs {
313 tau_inside_ecal_crack,
318 pfCand_muon_pvAssociationQuality,
320 pfCand_muon_puppiWeight,
322 pfCand_muon_lostInnerHits,
323 pfCand_muon_numberOfPixelHits,
324 pfCand_muon_vertex_dx,
325 pfCand_muon_vertex_dy,
326 pfCand_muon_vertex_dz,
327 pfCand_muon_vertex_dx_tauFL,
328 pfCand_muon_vertex_dy_tauFL,
329 pfCand_muon_vertex_dz_tauFL,
330 pfCand_muon_hasTrackDetails,
335 pfCand_muon_track_chi2_ndof,
336 pfCand_muon_track_ndof,
343 muon_normalizedChi2_valid,
345 muon_numberOfValidHits,
346 muon_segmentCompatibility,
347 muon_caloCompatibility,
348 muon_pfEcalEnergy_valid,
349 muon_rel_pfEcalEnergy,
354 muon_n_matches_CSC_1,
355 muon_n_matches_CSC_2,
356 muon_n_matches_CSC_3,
357 muon_n_matches_CSC_4,
358 muon_n_matches_RPC_1,
359 muon_n_matches_RPC_2,
360 muon_n_matches_RPC_3,
361 muon_n_matches_RPC_4,
378 namespace HadronBlockInputs {
383 tau_inside_ecal_crack,
388 pfCand_chHad_leadChargedHadrCand,
389 pfCand_chHad_pvAssociationQuality,
391 pfCand_chHad_puppiWeight,
392 pfCand_chHad_puppiWeightNoLep,
394 pfCand_chHad_lostInnerHits,
395 pfCand_chHad_numberOfPixelHits,
396 pfCand_chHad_vertex_dx,
397 pfCand_chHad_vertex_dy,
398 pfCand_chHad_vertex_dz,
399 pfCand_chHad_vertex_dx_tauFL,
400 pfCand_chHad_vertex_dy_tauFL,
401 pfCand_chHad_vertex_dz_tauFL,
402 pfCand_chHad_hasTrackDetails,
404 pfCand_chHad_dxy_sig,
407 pfCand_chHad_track_chi2_ndof,
408 pfCand_chHad_track_ndof,
409 pfCand_chHad_hcalFraction,
410 pfCand_chHad_rawCaloFraction,
415 pfCand_nHad_puppiWeight,
416 pfCand_nHad_puppiWeightNoLep,
417 pfCand_nHad_hcalFraction,
424 static tbb::concurrent_unordered_set<std::string> isFirstWarning;
426 return tau.
tauID(tauID);
430 <<
"Exception in <getTauID>: No tauID '" << tauID <<
"' available in pat::Tau given as function argument.";
432 if (isFirstWarning.insert(tauID).second) {
433 edm::LogWarning(
"DeepTauID") <<
"Warning in <getTauID>: No tauID '" << tauID
434 <<
"' available in pat::Tau given as function argument."
435 <<
" Using default_value = " << default_value <<
" instead." << std::endl;
437 return default_value;
448 std::map<BasicDiscr, size_t> indexMap;
449 std::map<BasicDiscr, size_t> indexMapdR03;
452 return (*basicTauDiscriminatorCollection)[tau_ref].rawValues.at(indexMap.at(BasicDiscr::ChargedIsoPtSum));
455 return getTauID(tau,
"chargedIsoPtSum");
458 return (*basicTauDiscriminatordR03Collection)[tau_ref].rawValues.at(indexMapdR03.at(BasicDiscr::ChargedIsoPtSum));
461 return getTauID(tau,
"chargedIsoPtSumdR03");
464 return (*basicTauDiscriminatordR03Collection)[tau_ref].rawValues.at(
465 indexMapdR03.at(BasicDiscr::FootprintCorrection));
468 return getTauID(tau,
"footprintCorrectiondR03");
471 return (*basicTauDiscriminatorCollection)[tau_ref].rawValues.at(indexMap.at(BasicDiscr::NeutralIsoPtSum));
474 return getTauID(tau,
"neutralIsoPtSum");
477 return (*basicTauDiscriminatordR03Collection)[tau_ref].rawValues.at(indexMapdR03.at(BasicDiscr::NeutralIsoPtSum));
480 return getTauID(tau,
"neutralIsoPtSumdR03");
483 return (*basicTauDiscriminatorCollection)[tau_ref].rawValues.at(indexMap.at(BasicDiscr::NeutralIsoPtSumWeight));
486 return getTauID(tau,
"neutralIsoPtSumWeight");
488 const float getNeutralIsoPtSumdR03Weight(
const reco::PFTau& tau,
490 return (*basicTauDiscriminatordR03Collection)[tau_ref].rawValues.at(
491 indexMapdR03.at(BasicDiscr::NeutralIsoPtSumWeight));
494 return getTauID(tau,
"neutralIsoPtSumWeightdR03");
496 const float getPhotonPtSumOutsideSignalCone(
const reco::PFTau& tau,
498 return (*basicTauDiscriminatorCollection)[tau_ref].rawValues.at(
499 indexMap.at(BasicDiscr::PhotonPtSumOutsideSignalCone));
501 const float getPhotonPtSumOutsideSignalCone(
const pat::Tau& tau,
503 return getTauID(tau,
"photonPtSumOutsideSignalCone");
505 const float getPhotonPtSumOutsideSignalConedR03(
const reco::PFTau& tau,
507 return (*basicTauDiscriminatordR03Collection)[tau_ref].rawValues.at(
508 indexMapdR03.at(BasicDiscr::PhotonPtSumOutsideSignalCone));
510 const float getPhotonPtSumOutsideSignalConedR03(
const pat::Tau& tau,
512 return getTauID(tau,
"photonPtSumOutsideSignalConedR03");
515 return (*basicTauDiscriminatorCollection)[tau_ref].rawValues.at(indexMap.at(BasicDiscr::PUcorrPtSum));
518 return getTauID(tau,
"puCorrPtSum");
521 auto getdxyPCA(
const reco::PFTau& tau,
const size_t tau_index)
const {
524 auto getdxyPCA(
const pat::Tau& tau,
const size_t tau_index)
const {
return tau.
dxy_PCA(); }
525 auto getdxy(
const reco::PFTau& tau,
const size_t tau_index)
const {
528 auto getdxy(
const pat::Tau& tau,
const size_t tau_index)
const {
return tau.
dxy(); }
529 auto getdxyError(
const reco::PFTau& tau,
const size_t tau_index)
const {
532 auto getdxyError(
const pat::Tau& tau,
const size_t tau_index)
const {
return tau.
dxy_error(); }
533 auto getdxySig(
const reco::PFTau& tau,
const size_t tau_index)
const {
536 auto getdxySig(
const pat::Tau& tau,
const size_t tau_index)
const {
return tau.
dxy_Sig(); }
537 auto getip3d(
const reco::PFTau& tau,
const size_t tau_index)
const {
540 auto getip3d(
const pat::Tau& tau,
const size_t tau_index)
const {
return tau.
ip3d(); }
541 auto getip3dError(
const reco::PFTau& tau,
const size_t tau_index)
const {
544 auto getip3dError(
const pat::Tau& tau,
const size_t tau_index)
const {
return tau.
ip3d_error(); }
545 auto getip3dSig(
const reco::PFTau& tau,
const size_t tau_index)
const {
548 auto getip3dSig(
const pat::Tau& tau,
const size_t tau_index)
const {
return tau.
ip3d_Sig(); }
549 auto getHasSecondaryVertex(
const reco::PFTau& tau,
const size_t tau_index)
const {
553 auto getFlightLength(
const reco::PFTau& tau,
const size_t tau_index)
const {
556 auto getFlightLength(
const pat::Tau& tau,
const size_t tau_index)
const {
return tau.
flightLength(); }
557 auto getFlightLengthSig(
const reco::PFTau& tau,
const size_t tau_index)
const {
567 auto getEtaAtEcalEntrance(
const reco::PFTau& tau) {
575 template <
typename PreDiscrType>
576 bool passPrediscriminants(
const PreDiscrType prediscriminants,
577 const size_t andPrediscriminants,
579 bool passesPrediscriminants = (andPrediscriminants ? 1 : 0);
581 size_t nPrediscriminants = prediscriminants.size();
582 for (
size_t iDisc = 0; iDisc < nPrediscriminants; ++iDisc) {
584 double discResult = (*prediscriminants[iDisc].handle)[tau_ref];
585 uint8_t thisPasses = (discResult > prediscriminants[iDisc].cut) ? 1 : 0;
602 if (thisPasses ^ andPrediscriminants)
604 passesPrediscriminants = (andPrediscriminants ? 0 : 1);
608 return passesPrediscriminants;
626 auto getPuppiWeight(
const reco::PFCandidate& cand,
const float aod_value) {
return aod_value; }
628 auto getPuppiWeightNoLep(
const reco::PFCandidate& cand,
const float aod_value) {
return aod_value; }
656 float hcal_fraction = 0.;
657 if (disable_hcalFraction_workaround) {
663 if (cand.
pdgId() == 1 || cand.
pdgId() == 130) {
669 return hcal_fraction;
677 template <
typename LVector1,
typename LVector2>
678 float dEta(
const LVector1& p4,
const LVector2& tau_p4) {
679 return static_cast<float>(p4.eta() - tau_p4.eta());
682 template <
typename LVector1,
typename LVector2>
683 float dPhi(
const LVector1& p4_1,
const LVector2& p4_2) {
684 return static_cast<float>(
reco::deltaPhi(p4_2.phi(), p4_1.phi()));
687 struct MuonHitMatchV1 {
688 static constexpr
int n_muon_stations = 4;
690 std::map<int, std::vector<UInt_t>> n_matches, n_hits;
692 const pat::Muon* best_matched_muon{
nullptr};
693 double deltaR2_best_match{-1};
705 static constexpr
int n_stations = 4;
709 if (!best_matched_muon || dR2 < deltaR2_best_match) {
710 best_matched_muon = &
muon;
711 deltaR2_best_match = dR2;
714 for (
const auto& segment : muon.
matches()) {
715 if (segment.segmentMatches.empty())
717 if (n_matches.count(segment.detector()))
718 ++n_matches.at(segment.detector()).at(segment.station() - 1);
722 const auto& hit_pattern = muon.
outerTrack()->hitPattern();
729 const int station = hit_pattern.getMuonStation(hit_id) - 1;
730 if (station > 0 && station < n_stations) {
731 std::vector<UInt_t>* muon_n_hits =
nullptr;
732 if (hit_pattern.muonDTHitFilter(hit_id))
734 else if (hit_pattern.muonCSCHitFilter(hit_id))
736 else if (hit_pattern.muonRPCHitFilter(hit_id))
740 ++muon_n_hits->at(station);
747 template <
typename TauCastType>
748 static std::vector<const pat::Muon*> findMatchedMuons(
const TauCastType& tau,
749 const std::vector<pat::Muon>*
muons,
753 if (tau.leadPFChargedHadrCand().isNonnull() && tau.leadPFChargedHadrCand()->muonRef().isNonnull())
754 hadr_cand_muon = tau.leadPFChargedHadrCand()->muonRef().
get();
755 std::vector<const pat::Muon*> matched_muons;
756 const double dR2 = deltaR *
deltaR;
761 if (reco_muon == hadr_cand_muon)
765 matched_muons.push_back(&muon);
767 return matched_muons;
770 template <
typename dnn,
typename TensorElemGet,
typename TauCastType>
771 void fillTensor(
const TensorElemGet&
get,
const TauCastType& tau,
float default_value)
const {
772 get(dnn::n_matched_muons) = n_muons;
773 get(dnn::muon_pt) = best_matched_muon !=
nullptr ? best_matched_muon->p4().pt() : default_value;
774 get(dnn::muon_dEta) = best_matched_muon !=
nullptr ? dEta(best_matched_muon->p4(), tau.p4()) : default_value;
775 get(dnn::muon_dPhi) = best_matched_muon !=
nullptr ? dPhi(best_matched_muon->p4(), tau.p4()) : default_value;
793 get(dnn::muon_n_stations_with_matches_03) = countMuonStationsWithMatches(0, 3);
794 get(dnn::muon_n_stations_with_hits_23) = countMuonStationsWithHits(2, 3);
798 unsigned countMuonStationsWithMatches(
size_t first_station,
size_t last_station)
const {
799 static const std::map<int, std::vector<bool>> masks = {
805 for (
unsigned n = first_station;
n <= last_station; ++
n) {
806 for (
const auto&
match : n_matches) {
807 if (!masks.at(
match.first).at(
n) &&
match.second.at(
n) > 0)
814 unsigned countMuonStationsWithHits(
size_t first_station,
size_t last_station)
const {
815 static const std::map<int, std::vector<bool>> masks = {
822 for (
unsigned n = first_station;
n <= last_station; ++
n) {
823 for (
const auto&
hit : n_hits) {
824 if (!masks.at(
hit.first).at(
n) &&
hit.second.at(
n) > 0)
832 struct MuonHitMatchV2 {
833 static constexpr
size_t n_muon_stations = 4;
834 static constexpr
int first_station_id = 1;
835 static constexpr
int last_station_id = first_station_id + n_muon_stations - 1;
836 using CountArray = std::array<unsigned, n_muon_stations>;
837 using CountMap = std::map<int, CountArray>;
839 const std::vector<int>& consideredSubdets() {
845 static const std::map<int, std::string> subdet_names = {
847 if (!subdet_names.count(subdet))
848 throw cms::Exception(
"MuonHitMatch") <<
"Subdet name for subdet id " << subdet <<
" not found.";
849 return subdet_names.at(subdet);
852 size_t getStationIndex(
int station,
bool throw_exception)
const {
853 if (station < first_station_id || station > last_station_id) {
855 throw cms::Exception(
"MuonHitMatch") <<
"Station id is out of range";
858 return static_cast<size_t>(station - 1);
862 for (
int subdet : consideredSubdets()) {
863 n_matches[subdet].fill(0);
864 n_hits[subdet].fill(0);
872 for (
const auto& segment : muon.
matches()) {
873 if (segment.segmentMatches.empty() && segment.rpcMatches.empty())
875 if (n_matches.count(segment.detector())) {
876 const size_t station_index = getStationIndex(segment.station(),
true);
877 ++n_matches.at(segment.detector()).at(station_index);
884 const auto& hit_pattern = muon.
outerTrack()->hitPattern();
891 const size_t station_index = getStationIndex(hit_pattern.getMuonStation(hit_id),
false);
892 if (station_index < n_muon_stations) {
893 CountArray* muon_n_hits =
nullptr;
894 if (hit_pattern.muonDTHitFilter(hit_id))
896 else if (hit_pattern.muonCSCHitFilter(hit_id))
898 else if (hit_pattern.muonRPCHitFilter(hit_id))
902 ++muon_n_hits->at(station_index);
909 unsigned nMatches(
int subdet,
int station)
const {
910 if (!n_matches.count(subdet))
911 throw cms::Exception(
"MuonHitMatch") <<
"Subdet " << subdet <<
" not found.";
912 const size_t station_index = getStationIndex(station,
true);
913 return n_matches.at(subdet).at(station_index);
916 unsigned nHits(
int subdet,
int station)
const {
917 if (!n_hits.count(subdet))
918 throw cms::Exception(
"MuonHitMatch") <<
"Subdet " << subdet <<
" not found.";
919 const size_t station_index = getStationIndex(station,
true);
920 return n_hits.at(subdet).at(station_index);
923 unsigned countMuonStationsWithMatches(
int first_station,
int last_station)
const {
924 static const std::map<int, std::vector<bool>> masks = {
929 const size_t first_station_index = getStationIndex(first_station,
true);
930 const size_t last_station_index = getStationIndex(last_station,
true);
932 for (
size_t n = first_station_index;
n <= last_station_index; ++
n) {
933 for (
const auto&
match : n_matches) {
934 if (!masks.at(
match.first).at(
n) &&
match.second.at(
n) > 0)
941 unsigned countMuonStationsWithHits(
int first_station,
int last_station)
const {
942 static const std::map<int, std::vector<bool>> masks = {
948 const size_t first_station_index = getStationIndex(first_station,
true);
949 const size_t last_station_index = getStationIndex(last_station,
true);
951 for (
size_t n = first_station_index;
n <= last_station_index; ++
n) {
952 for (
const auto&
hit : n_hits) {
953 if (!masks.at(
hit.first).at(
n) &&
hit.second.at(
n) > 0)
961 CountMap n_matches, n_hits;
967 PfCand_chargedHadron,
968 PfCand_neutralHadron,
975 template <
typename Object>
988 static const std::map<int, CellObjectType> obj_types = {{11, CellObjectType::PfCand_electron},
989 {13, CellObjectType::PfCand_muon},
990 {22, CellObjectType::PfCand_gamma},
991 {130, CellObjectType::PfCand_neutralHadron},
992 {211, CellObjectType::PfCand_chargedHadron}};
995 if (iter == obj_types.end())
996 return CellObjectType::Other;
1000 using Cell = std::map<CellObjectType, size_t>;
1004 bool operator<(
const CellIndex& other)
const {
1005 if (
eta != other.eta)
1006 return eta < other.eta;
1007 return phi < other.phi;
1013 using Map = std::map<CellIndex, Cell>;
1014 using const_iterator = Map::const_iterator;
1016 CellGrid(
unsigned n_cells_eta,
1017 unsigned n_cells_phi,
1018 double cell_size_eta,
1019 double cell_size_phi,
1021 : nCellsEta(n_cells_eta),
1022 nCellsPhi(n_cells_phi),
1023 nTotal(nCellsEta * nCellsPhi),
1024 cellSizeEta(cell_size_eta),
1025 cellSizePhi(cell_size_phi),
1026 disable_CellIndex_workaround_(disable_CellIndex_workaround) {
1027 if (nCellsEta % 2 != 1 || nCellsEta < 1)
1028 throw cms::Exception(
"DeepTauId") <<
"Invalid number of eta cells.";
1029 if (nCellsPhi % 2 != 1 || nCellsPhi < 1)
1030 throw cms::Exception(
"DeepTauId") <<
"Invalid number of phi cells.";
1031 if (cellSizeEta <= 0 || cellSizePhi <= 0)
1035 int maxEtaIndex()
const {
return static_cast<int>((nCellsEta - 1) / 2); }
1036 int maxPhiIndex()
const {
return static_cast<int>((nCellsPhi - 1) / 2); }
1037 double maxDeltaEta()
const {
return cellSizeEta * (0.5 + maxEtaIndex()); }
1038 double maxDeltaPhi()
const {
return cellSizePhi * (0.5 + maxPhiIndex()); }
1039 int getEtaTensorIndex(
const CellIndex& cellIndex)
const {
return cellIndex.eta + maxEtaIndex(); }
1040 int getPhiTensorIndex(
const CellIndex& cellIndex)
const {
return cellIndex.phi + maxPhiIndex(); }
1042 bool tryGetCellIndex(
double deltaEta,
double deltaPhi, CellIndex& cellIndex)
const {
1043 const auto getCellIndex = [
this](
double x,
double maxX,
double size,
int&
index) {
1048 if (disable_CellIndex_workaround_) {
1051 absIndex = std::floor(absX / size + 0.5);
1054 absIndex = std::floor(
std::abs(absX / size - 0.5));
1056 index =
static_cast<int>(std::copysign(absIndex, x));
1060 return getCellIndex(deltaEta,
maxDeltaEta(), cellSizeEta, cellIndex.eta) &&
1061 getCellIndex(deltaPhi,
maxDeltaPhi(), cellSizePhi, cellIndex.phi);
1064 size_t num_valid_cells()
const {
return cells.size(); }
1066 const Cell& at(
const CellIndex& cellIndex)
const {
return cells.at(cellIndex); }
1067 size_t count(
const CellIndex& cellIndex)
const {
return cells.count(cellIndex); }
1068 const_iterator
find(
const CellIndex& cellIndex)
const {
return cells.find(cellIndex); }
1069 const_iterator
begin()
const {
return cells.begin(); }
1070 const_iterator
end()
const {
return cells.end(); }
1073 const unsigned nCellsEta, nCellsPhi, nTotal;
1074 const double cellSizeEta, cellSizePhi;
1077 std::map<CellIndex, Cell>
cells;
1078 const bool disable_CellIndex_workaround_;
1084 {bd::ChargedIsoPtSum,
"ChargedIsoPtSum"},
1085 {bd::NeutralIsoPtSum,
"NeutralIsoPtSum"},
1086 {bd::NeutralIsoPtSumWeight,
"NeutralIsoPtSumWeight"},
1087 {bd::FootprintCorrection,
"TauFootprintCorrection"},
1088 {bd::PhotonPtSumOutsideSignalCone,
"PhotonPtSumOutsideSignalCone"},
1089 {bd::PUcorrPtSum,
"PUcorrPtSum"}};
1091 bd::NeutralIsoPtSum,
1092 bd::NeutralIsoPtSumWeight,
1093 bd::PhotonPtSumOutsideSignalCone,
1096 bd::NeutralIsoPtSum,
1097 bd::NeutralIsoPtSumWeight,
1098 bd::PhotonPtSumOutsideSignalCone,
1099 bd::FootprintCorrection};
1103 static constexpr
float default_value = -999.;
1106 static constexpr
size_t e_index = 0, mu_index = 1, tau_index = 2, jet_index = 3;
1108 {
"VSe",
Output({tau_index}, {e_index, tau_index})},
1109 {
"VSmu",
Output({tau_index}, {mu_index, tau_index})},
1110 {
"VSjet",
Output({tau_index}, {jet_index, tau_index})},
1118 std::vector<BasicDiscriminator> requiredDiscr) {
1119 std::map<std::string, size_t> discrIndexMapStr;
1120 auto const aHandle =
event.getHandle(discriminatorContainerToken);
1121 auto const aProv = aHandle.provenance();
1122 if (aProv ==
nullptr)
1123 aHandle.whyFailed()->raise();
1124 const auto& psetsFromProvenance =
edm::parameterSet(aProv->stable(),
event.processHistory());
1125 auto const idlist = psetsFromProvenance.
getParameter<std::vector<edm::ParameterSet>>(
"IDdefinitions");
1126 for (
size_t j = 0;
j < idlist.size(); ++
j) {
1128 if (discrIndexMapStr.count(idname)) {
1130 <<
"basic discriminator " << idname <<
" appears more than once in the input.";
1132 discrIndexMapStr[idname] =
j;
1136 std::map<BasicDiscriminator, size_t> discrIndexMap;
1137 for (
size_t i = 0;
i < requiredDiscr.size();
i++) {
1140 <<
" was not provided in the config file.";
1144 return discrIndexMap;
1155 desc.
add<std::vector<std::string>>(
"graph_file",
1156 {
"RecoTauTag/TrainingFiles/data/DeepTauId/deepTau_2017v2p6_e6.pb"});
1157 desc.
add<
bool>(
"mem_mapped",
false);
1158 desc.
add<
unsigned>(
"version", 2);
1159 desc.
add<
int>(
"debug_level", 0);
1160 desc.
add<
bool>(
"disable_dxy_pca",
false);
1161 desc.
add<
bool>(
"disable_hcalFraction_workaround",
false);
1162 desc.
add<
bool>(
"disable_CellIndex_workaround",
false);
1163 desc.
add<
bool>(
"save_inputs",
false);
1164 desc.
add<
bool>(
"is_online",
false);
1166 desc.
add<std::vector<std::string>>(
"VSeWP", {
"-1."});
1167 desc.
add<std::vector<std::string>>(
"VSmuWP", {
"-1."});
1168 desc.
add<std::vector<std::string>>(
"VSjetWP", {
"-1."});
1176 pset_Prediscriminants.
add<
std::string>(
"BooleanOperator",
"and");
1179 psd1.
add<
double>(
"cut");
1186 descriptions.
add(
"DeepTau", desc);
1196 cfg.getUntrackedParameter<edm::
InputTag>(
"basicTauDiscriminators"))),
1198 cfg.getUntrackedParameter<edm::
InputTag>(
"basicTauDiscriminatorsdR03"))),
1201 cfg.getParameter<edm::
InputTag>(
"pfTauTransverseImpactParameters"))),
1202 version_(cfg.getParameter<unsigned>(
"version")),
1203 debug_level(cfg.getParameter<int>(
"debug_level")),
1213 const auto& shape =
cache_->
getGraph().node(0).attr().at(
"shape").shape();
1214 if (shape.dim(1).size() != dnn_inputs_2017v1::NumberOfInputs)
1216 <<
"number of inputs does not match the expected inputs for the given version";
1219 tensorflow::DT_FLOAT, tensorflow::TensorShape{1, dnn_inputs_2017_v2::TauBlockInputs::NumberOfInputs});
1220 for (
size_t n = 0;
n < 2; ++
n) {
1221 const bool is_inner =
n == 0;
1222 const auto n_cells =
1223 is_inner ? dnn_inputs_2017_v2::number_of_inner_cell : dnn_inputs_2017_v2::number_of_outer_cell;
1224 eGammaTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1225 tensorflow::DT_FLOAT,
1226 tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::EgammaBlockInputs::NumberOfInputs});
1227 muonTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1228 tensorflow::DT_FLOAT,
1229 tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::MuonBlockInputs::NumberOfInputs});
1231 tensorflow::DT_FLOAT,
1232 tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::HadronBlockInputs::NumberOfInputs});
1233 convTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1234 tensorflow::DT_FLOAT,
1235 tensorflow::TensorShape{1, n_cells, n_cells, dnn_inputs_2017_v2::number_of_conv_features});
1237 tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::number_of_conv_features});
1240 muonTensor_[is_inner]->flat<
float>().setZero();
1241 hadronsTensor_[is_inner]->flat<
float>().setZero();
1251 return DeepTauBase::initializeGlobalCache(cfg);
1259 template <
typename T>
1261 return std::isnormal(value) ?
static_cast<float>(
value) : 0.
f;
1264 template <
typename T>
1266 const float fixed_value =
getValue(value);
1267 const float clamped_value = std::clamp(fixed_value, min_value, max_value);
1268 float transformed_value = (clamped_value -
min_value) / (max_value - min_value);
1270 transformed_value = transformed_value * 2 - 1;
1271 return transformed_value;
1274 template <
typename T>
1276 const float fixed_value =
getValue(value);
1277 const float norm_value = (fixed_value -
mean) / sigma;
1278 return std::clamp(norm_value, -n_sigmas_max, n_sigmas_max);
1284 float& cc_ele_energy,
1285 float& cc_gamma_energy,
1287 cc_ele_energy = cc_gamma_energy = 0;
1290 if (superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull() &&
1291 superCluster->clusters().isAvailable()) {
1292 for (
auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
1293 const float energy =
static_cast<float>((*iter)->energy());
1294 if (iter == superCluster->clustersBegin())
1295 cc_ele_energy += energy;
1297 cc_gamma_energy +=
energy;
1309 const CellGrid*
grid =
nullptr)
const {
1311 std::cout <<
"<checkInputs>: block_name = " << block_name << std::endl;
1312 if (block_name ==
"input_tau") {
1313 for (
int input_index = 0; input_index < n_inputs; ++input_index) {
1314 float input = inputs.matrix<
float>()(0, input_index);
1317 <<
"in the " << block_name
1318 <<
", input is not finite, i.e. infinite or NaN, for input_index = " << input_index;
1321 std::cout << block_name <<
"[var = " << input_index <<
"] = " << std::setprecision(5) << std::fixed << input
1328 if (block_name.find(
"input_inner") != std::string::npos) {
1331 }
else if (block_name.find(
"input_outer") != std::string::npos) {
1336 int eta_phi_index = 0;
1337 for (
int eta = -n_eta;
eta <= n_eta; ++
eta) {
1338 for (
int phi = -n_phi;
phi <= n_phi; ++
phi) {
1339 const CellIndex cell_index{
eta,
phi};
1340 const auto cell_iter =
grid->find(cell_index);
1341 if (cell_iter !=
grid->end()) {
1342 for (
int input_index = 0; input_index < n_inputs; ++input_index) {
1343 float input = inputs.tensor<float, 4>()(eta_phi_index, 0, 0, input_index);
1346 <<
"in the " << block_name <<
", input is not finite, i.e. infinite or NaN, for eta = " <<
eta
1347 <<
", phi = " <<
phi <<
", input_index = " << input_index;
1350 std::cout << block_name <<
"[eta = " <<
eta <<
"][phi = " <<
phi <<
"][var = " << input_index
1351 <<
"] = " << std::setprecision(5) << std::fixed << input << std::endl;
1365 const CellGrid*
grid =
nullptr) {
1367 std::cout <<
"<saveInputs>: block_name = " << block_name << std::endl;
1370 (*json_file_) <<
", ";
1371 (*json_file_) <<
"\"" << block_name <<
"\": [";
1372 if (block_name ==
"input_tau") {
1373 for (
int input_index = 0; input_index < n_inputs; ++input_index) {
1374 float input = inputs.matrix<
float>()(0, input_index);
1375 if (input_index != 0)
1376 (*json_file_) <<
", ";
1377 (*json_file_) <<
input;
1382 if (block_name.find(
"input_inner") != std::string::npos) {
1385 }
else if (block_name.find(
"input_outer") != std::string::npos) {
1390 int eta_phi_index = 0;
1391 for (
int eta = -n_eta;
eta <= n_eta; ++
eta) {
1393 (*json_file_) <<
", ";
1394 (*json_file_) <<
"[";
1395 for (
int phi = -n_phi;
phi <= n_phi; ++
phi) {
1397 (*json_file_) <<
", ";
1398 (*json_file_) <<
"[";
1399 const CellIndex cell_index{
eta,
phi};
1400 const auto cell_iter =
grid->find(cell_index);
1401 for (
int input_index = 0; input_index < n_inputs; ++input_index) {
1403 if (cell_iter !=
grid->end()) {
1404 input = inputs.tensor<float, 4>()(eta_phi_index, 0, 0, input_index);
1406 if (input_index != 0)
1407 (*json_file_) <<
", ";
1408 (*json_file_) <<
input;
1410 if (cell_iter !=
grid->end()) {
1413 (*json_file_) <<
"]";
1415 (*json_file_) <<
"]";
1418 (*json_file_) <<
"]";
1425 const std::vector<pat::Electron> electron_collection_default;
1426 const std::vector<pat::Muon> muon_collection_default;
1430 pfTauTransverseImpactParameters_default;
1432 const std::vector<pat::Electron>* electron_collection;
1433 const std::vector<pat::Muon>* muon_collection;
1442 pfTauTransverseImpactParameters = &pfTauTransverseImpactParameters_default;
1443 basicTauDiscriminators = &basicTauDiscriminators_default;
1444 basicTauDiscriminatorsdR03 = &basicTauDiscriminatorsdR03_default;
1446 electron_collection = &electron_collection_default;
1447 muon_collection = &muon_collection_default;
1479 for (
size_t tau_index = 0; tau_index < taus->size(); ++tau_index) {
1482 std::vector<tensorflow::Tensor> pred_vector;
1484 bool passesPrediscriminants;
1486 passesPrediscriminants = tauIDs.passPrediscriminants<std::vector<TauDiscInfo<reco::PFTauDiscriminator>>>(
1489 passesPrediscriminants = tauIDs.passPrediscriminants<std::vector<TauDiscInfo<pat::PATTauDiscriminator>>>(
1493 if (passesPrediscriminants) {
1496 getPredictionsV1<reco::PFCandidate, reco::PFTau>(
1497 taus->at(tau_index), tau_index, tauRef, electron_collection, muon_collection, pred_vector, tauIDs);
1499 getPredictionsV1<pat::PackedCandidate, pat::Tau>(
1500 taus->at(tau_index), tau_index, tauRef, electron_collection, muon_collection, pred_vector, tauIDs);
1503 getPredictionsV2<reco::PFCandidate, reco::PFTau>(taus->at(tau_index),
1506 electron_collection,
1514 getPredictionsV2<pat::PackedCandidate, pat::Tau>(taus->at(tau_index),
1517 electron_collection,
1529 const float pred = pred_vector[0].flat<
float>()(
k);
1530 if (!(pred >= 0 && pred <= 1))
1532 <<
"invalid prediction = " << pred <<
" for tau_index = " << tau_index <<
", pred_index = " <<
k;
1533 predictions.matrix<
float>()(tau_index, k) = pred;
1542 predictions.matrix<
float>()(tau_index,
k) = (
k == 2) ? -1.
f : 2.
f;
1549 template <
typename Cand
idateCastType,
typename TauCastType>
1551 const size_t tau_index,
1553 const std::vector<pat::Electron>*
electrons,
1554 const std::vector<pat::Muon>* muons,
1555 std::vector<tensorflow::Tensor>& pred_vector,
1556 TauFunc tau_funcs) {
1557 const tensorflow::Tensor&
inputs = createInputsV1<dnn_inputs_2017v1, const CandidateCastType>(
1558 dynamic_cast<const TauCastType&
>(
tau), tau_index, tau_ref, electrons, muons, tau_funcs);
1562 template <
typename Cand
idateCastType,
typename TauCastType>
1564 const size_t tau_index,
1566 const std::vector<pat::Electron>*
electrons,
1567 const std::vector<pat::Muon>* muons,
1571 std::vector<tensorflow::Tensor>& pred_vector,
1572 TauFunc tau_funcs) {
1574 std::cout <<
"<DeepTauId::getPredictionsV2 (moduleLabel = " << moduleDescription().moduleLabel()
1575 <<
")>:" << std::endl;
1576 std::cout <<
" tau: pT = " << tau.pt() <<
", eta = " << tau.eta() <<
", phi = " << tau.phi() << std::endl;
1578 CellGrid inner_grid(dnn_inputs_2017_v2::number_of_inner_cell,
1579 dnn_inputs_2017_v2::number_of_inner_cell,
1583 CellGrid outer_grid(dnn_inputs_2017_v2::number_of_outer_cell,
1584 dnn_inputs_2017_v2::number_of_outer_cell,
1588 fillGrids(dynamic_cast<const TauCastType&>(tau), *electrons, inner_grid, outer_grid);
1589 fillGrids(dynamic_cast<const TauCastType&>(tau), *muons, inner_grid, outer_grid);
1590 fillGrids(dynamic_cast<const TauCastType&>(tau), pfCands, inner_grid, outer_grid);
1592 createTauBlockInputs<CandidateCastType>(
1593 dynamic_cast<const TauCastType&
>(
tau), tau_index, tau_ref, pv, rho, tau_funcs);
1594 using namespace dnn_inputs_2017_v2;
1596 createConvFeatures<CandidateCastType>(
dynamic_cast<const TauCastType&
>(
tau),
1610 createConvFeatures<CandidateCastType>(
dynamic_cast<const TauCastType&
>(
tau),
1627 json_file_ =
new std::ofstream(json_file_name.data());
1629 (*json_file_) <<
"{";
1632 "input_inner_egamma",
1633 dnn_inputs_2017_v2::EgammaBlockInputs::NumberOfInputs,
1636 *
muonTensor_[
true],
"input_inner_muon", dnn_inputs_2017_v2::MuonBlockInputs::NumberOfInputs, &inner_grid);
1638 "input_inner_hadrons",
1639 dnn_inputs_2017_v2::HadronBlockInputs::NumberOfInputs,
1642 "input_outer_egamma",
1643 dnn_inputs_2017_v2::EgammaBlockInputs::NumberOfInputs,
1646 *
muonTensor_[
false],
"input_outer_muon", dnn_inputs_2017_v2::MuonBlockInputs::NumberOfInputs, &outer_grid);
1648 "input_outer_hadrons",
1649 dnn_inputs_2017_v2::HadronBlockInputs::NumberOfInputs,
1651 (*json_file_) <<
"}";
1660 {
"main_output/Softmax"},
1678 std::cout << label <<
" = " << pred_vector[0].flat<
float>()(idx);
1684 template <
typename Collection,
typename TauCastType>
1685 void fillGrids(
const TauCastType& tau,
const Collection&
objects, CellGrid& inner_grid, CellGrid& outer_grid) {
1686 static constexpr
double outer_dR2 = 0.25;
1688 const double inner_dR2 =
std::pow(inner_radius, 2);
1690 const auto addObject = [&](
size_t n,
double deta,
double dphi, CellGrid&
grid) {
1691 const auto&
obj = objects.at(n);
1693 if (obj_type == CellObjectType::Other)
1695 CellIndex cell_index;
1696 if (
grid.tryGetCellIndex(deta, dphi, cell_index)) {
1698 auto iter = cell.find(obj_type);
1699 if (iter != cell.end()) {
1700 const auto& prev_obj = objects.at(iter->second);
1701 if (
obj.polarP4().pt() > prev_obj.polarP4().pt())
1709 for (
size_t n = 0; n < objects.size(); ++
n) {
1710 const auto&
obj = objects.at(n);
1711 const double deta =
obj.polarP4().eta() - tau.polarP4().eta();
1714 if (dR2 < inner_dR2)
1715 addObject(n, deta, dphi, inner_grid);
1716 if (dR2 < outer_dR2)
1717 addObject(n, deta, dphi, outer_grid);
1722 std::vector<tensorflow::Tensor> pred_vector;
1730 {
"inner_all_dropout_4/Identity"},
1739 {
"outer_all_dropout_4/Identity"},
1742 return pred_vector.at(0);
1745 template <
typename Cand
idateCastType,
typename TauCastType>
1747 const size_t tau_index,
1751 const std::vector<pat::Electron>*
electrons,
1752 const std::vector<pat::Muon>* muons,
1754 const CellGrid&
grid,
1758 std::cout <<
"<DeepTauId::createConvFeatures (is_inner = " << is_inner <<
")>:" << std::endl;
1760 tensorflow::Tensor& convTensor = *
convTensor_.at(is_inner);
1761 eGammaTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1762 tensorflow::DT_FLOAT,
1763 tensorflow::TensorShape{
1764 (
long long int)grid.num_valid_cells(), 1, 1, dnn_inputs_2017_v2::EgammaBlockInputs::NumberOfInputs});
1765 muonTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1766 tensorflow::DT_FLOAT,
1767 tensorflow::TensorShape{
1768 (
long long int)grid.num_valid_cells(), 1, 1, dnn_inputs_2017_v2::MuonBlockInputs::NumberOfInputs});
1770 tensorflow::DT_FLOAT,
1771 tensorflow::TensorShape{
1772 (
long long int)grid.num_valid_cells(), 1, 1, dnn_inputs_2017_v2::HadronBlockInputs::NumberOfInputs});
1775 muonTensor_[is_inner]->flat<
float>().setZero();
1776 hadronsTensor_[is_inner]->flat<
float>().setZero();
1779 for (
int eta = -grid.maxEtaIndex();
eta <= grid.maxEtaIndex(); ++
eta) {
1780 for (
int phi = -grid.maxPhiIndex();
phi <= grid.maxPhiIndex(); ++
phi) {
1782 std::cout <<
"processing ( eta = " <<
eta <<
", phi = " <<
phi <<
" )" << std::endl;
1784 const CellIndex cell_index{
eta,
phi};
1785 const auto cell_iter = grid.find(cell_index);
1786 if (cell_iter != grid.end()) {
1788 std::cout <<
" creating inputs for ( eta = " <<
eta <<
", phi = " <<
phi <<
" ): idx = " << idx
1791 const Cell& cell = cell_iter->second;
1792 createEgammaBlockInputs<CandidateCastType>(
1793 idx,
tau, tau_index, tau_ref,
pv,
rho,
electrons, pfCands, cell, tau_funcs, is_inner);
1794 createMuonBlockInputs<CandidateCastType>(
1795 idx,
tau, tau_index, tau_ref,
pv,
rho,
muons, pfCands, cell, tau_funcs, is_inner);
1796 createHadronsBlockInputs<CandidateCastType>(
1797 idx,
tau, tau_index, tau_ref,
pv,
rho, pfCands, cell, tau_funcs, is_inner);
1801 std::cout <<
" skipping creation of inputs, because ( eta = " <<
eta <<
", phi = " <<
phi
1802 <<
" ) is not in the grid !!" << std::endl;
1810 for (
int eta = -grid.maxEtaIndex();
eta <= grid.maxEtaIndex(); ++
eta) {
1811 for (
int phi = -grid.maxPhiIndex();
phi <= grid.maxPhiIndex(); ++
phi) {
1812 const CellIndex cell_index{
eta,
phi};
1813 const int eta_index = grid.getEtaTensorIndex(cell_index);
1814 const int phi_index = grid.getPhiTensorIndex(cell_index);
1816 const auto cell_iter = grid.find(cell_index);
1817 if (cell_iter != grid.end()) {
1828 const tensorflow::Tensor&
features,
1832 for (
int n = 0;
n < dnn_inputs_2017_v2::number_of_conv_features; ++
n) {
1833 convTensor.tensor<float, 4>()(0, eta_index, phi_index,
n) = features.tensor<float, 4>()(batch_idx, 0, 0,
n);
1837 template <
typename Cand
idateCastType,
typename TauCastType>
1839 const size_t& tau_index,
1843 TauFunc tau_funcs) {
1844 namespace dnn = dnn_inputs_2017_v2::TauBlockInputs;
1847 inputs.flat<
float>().setZero();
1849 const auto&
get = [&](
int var_index) ->
float& {
return inputs.matrix<
float>()(0, var_index); };
1851 auto leadChargedHadrCand =
dynamic_cast<const CandidateCastType*
>(tau.leadChargedHadrCand().get());
1858 get(dnn::tau_E_over_pt) =
getValueLinear(tau.p4().energy() / tau.p4().pt(), 1.f, 5.2f,
true);
1859 get(dnn::tau_charge) =
getValue(tau.charge());
1860 get(dnn::tau_n_charged_prongs) =
getValueLinear(tau.decayMode() / 5 + 1, 1, 3,
true);
1861 get(dnn::tau_n_neutral_prongs) =
getValueLinear(tau.decayMode() % 5, 0, 2,
true);
1862 get(dnn::chargedIsoPtSum) =
getValueNorm(tau_funcs.getChargedIsoPtSum(tau, tau_ref), 47.78f, 123.5f);
1863 get(dnn::chargedIsoPtSumdR03_over_dR05) =
1864 getValue(tau_funcs.getChargedIsoPtSumdR03(tau, tau_ref) / tau_funcs.getChargedIsoPtSum(tau, tau_ref));
1865 get(dnn::footprintCorrection) =
getValueNorm(tau_funcs.getFootprintCorrectiondR03(tau, tau_ref), 9.029f, 26.42f);
1866 get(dnn::neutralIsoPtSum) =
getValueNorm(tau_funcs.getNeutralIsoPtSum(tau, tau_ref), 57.59f, 155.3f);
1867 get(dnn::neutralIsoPtSumWeight_over_neutralIsoPtSum) =
1868 getValue(tau_funcs.getNeutralIsoPtSumWeight(tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(tau, tau_ref));
1869 get(dnn::neutralIsoPtSumWeightdR03_over_neutralIsoPtSum) =
1870 getValue(tau_funcs.getNeutralIsoPtSumdR03Weight(tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(tau, tau_ref));
1871 get(dnn::neutralIsoPtSumdR03_over_dR05) =
1872 getValue(tau_funcs.getNeutralIsoPtSumdR03(tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(tau, tau_ref));
1873 get(dnn::photonPtSumOutsideSignalCone) =
1874 getValueNorm(tau_funcs.getPhotonPtSumOutsideSignalCone(tau, tau_ref), 1.731f, 6.846f);
1875 get(dnn::puCorrPtSum) =
getValueNorm(tau_funcs.getPuCorrPtSum(tau, tau_ref), 22.38f, 16.34f);
1881 auto const pca = tau_funcs.getdxyPCA(tau, tau_index);
1882 get(dnn::tau_dxy_pca_x) =
getValueNorm(pca.x(), -0.0241f, 0.0074f);
1883 get(dnn::tau_dxy_pca_y) =
getValueNorm(pca.y(), 0.0675f, 0.0128f);
1884 get(dnn::tau_dxy_pca_z) =
getValueNorm(pca.z(), 0.7973f, 3.456f);
1886 get(dnn::tau_dxy_pca_x) = 0;
1887 get(dnn::tau_dxy_pca_y) = 0;
1888 get(dnn::tau_dxy_pca_z) = 0;
1890 const bool tau_dxy_valid =
1891 isAbove(tau_funcs.getdxy(tau, tau_index), -10) &&
isAbove(tau_funcs.getdxyError(tau, tau_index), 0);
1892 if (tau_dxy_valid) {
1893 get(dnn::tau_dxy_valid) = tau_dxy_valid;
1894 get(dnn::tau_dxy) =
getValueNorm(tau_funcs.getdxy(tau, tau_index), 0.0018f, 0.0085f);
1896 std::abs(tau_funcs.getdxy(tau, tau_index)) / tau_funcs.getdxyError(tau, tau_index), 2.26f, 4.191f);
1898 const bool tau_ip3d_valid =
1899 isAbove(tau_funcs.getip3d(tau, tau_index), -10) &&
isAbove(tau_funcs.getip3dError(tau, tau_index), 0);
1900 if (tau_ip3d_valid) {
1901 get(dnn::tau_ip3d_valid) = tau_ip3d_valid;
1902 get(dnn::tau_ip3d) =
getValueNorm(tau_funcs.getip3d(tau, tau_index), 0.0026f, 0.0114f);
1904 std::abs(tau_funcs.getip3d(tau, tau_index)) / tau_funcs.getip3dError(tau, tau_index), 2.928f, 4.466f);
1906 if (leadChargedHadrCand) {
1907 const bool hasTrackDetails = candFunc::getHasTrackDetails(*leadChargedHadrCand);
1908 const float tau_dz = (
is_online_ && !hasTrackDetails) ? 0 : candFunc::getTauDz(*leadChargedHadrCand);
1910 get(dnn::tau_dz_sig_valid) = candFunc::getTauDZSigValid(*leadChargedHadrCand);
1911 const double dzError = hasTrackDetails ? leadChargedHadrCand->dzError() : -999.;
1914 get(dnn::tau_flightLength_x) =
getValueNorm(tau_funcs.getFlightLength(tau, tau_index).x(), -0.0003f, 0.7362f);
1915 get(dnn::tau_flightLength_y) =
getValueNorm(tau_funcs.getFlightLength(tau, tau_index).y(), -0.0009f, 0.7354f);
1916 get(dnn::tau_flightLength_z) =
getValueNorm(tau_funcs.getFlightLength(tau, tau_index).z(), -0.0022f, 1.993f);
1917 get(dnn::tau_flightLength_sig) = 0.55756444;
1918 get(dnn::tau_pt_weighted_deta_strip) =
1921 get(dnn::tau_pt_weighted_dphi_strip) =
1923 get(dnn::tau_pt_weighted_dr_signal) =
1926 get(dnn::tau_leadingTrackNormChi2) =
getValueNorm(tau_funcs.getLeadingTrackNormChi2(tau), 1.538f, 4.401f);
1928 const bool tau_e_ratio_valid = std::isnormal(
eratio) &&
eratio > 0.f;
1929 get(dnn::tau_e_ratio_valid) = tau_e_ratio_valid;
1932 const bool tau_gj_angle_diff_valid = (std::isnormal(gj_angle_diff) || gj_angle_diff == 0) && gj_angle_diff >= 0;
1933 get(dnn::tau_gj_angle_diff_valid) = tau_gj_angle_diff_valid;
1934 get(dnn::tau_gj_angle_diff) = tau_gj_angle_diff_valid ?
getValueLinear(gj_angle_diff, 0, pi,
true) : 0;
1936 get(dnn::tau_emFraction) =
getValueLinear(tau_funcs.getEmFraction(tau), -1, 1,
false);
1939 get(dnn::leadChargedCand_etaAtEcalEntrance_minus_tau_eta) =
1940 getValueNorm(tau_funcs.getEtaAtEcalEntrance(tau) - tau.p4().eta(), 0.0042f, 0.0323f);
1943 template <
typename Cand
idateCastType,
typename TauCastType>
1945 const TauCastType& tau,
1946 const size_t tau_index,
1950 const std::vector<pat::Electron>*
electrons,
1952 const Cell& cell_map,
1955 namespace dnn = dnn_inputs_2017_v2::EgammaBlockInputs;
1959 const auto&
get = [&](
int var_index) ->
float& {
return inputs.tensor<float, 4>()(idx, 0, 0, var_index); };
1961 const bool valid_index_pf_ele = cell_map.count(CellObjectType::PfCand_electron);
1962 const bool valid_index_pf_gamma = cell_map.count(CellObjectType::PfCand_gamma);
1965 if (!cell_map.empty()) {
1971 if (valid_index_pf_ele) {
1972 size_t index_pf_ele = cell_map.at(CellObjectType::PfCand_electron);
1973 const auto& ele_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_pf_ele));
1975 get(dnn::pfCand_ele_valid) = valid_index_pf_ele;
1976 get(dnn::pfCand_ele_rel_pt) =
getValueNorm(pfCands.
at(index_pf_ele).polarP4().pt() / tau.polarP4().pt(),
1977 is_inner ? 0.9792f : 0.304f,
1978 is_inner ? 0.5383f : 1.845f);
1979 get(dnn::pfCand_ele_deta) =
getValueLinear(pfCands.
at(index_pf_ele).polarP4().eta() - tau.polarP4().eta(),
1980 is_inner ? -0.1f : -0.5f,
1981 is_inner ? 0.1f : 0.5f,
1983 get(dnn::pfCand_ele_dphi) =
getValueLinear(dPhi(tau.polarP4(), pfCands.
at(index_pf_ele).polarP4()),
1984 is_inner ? -0.1
f : -0.5
f,
1985 is_inner ? 0.1
f : 0.5
f,
1987 get(dnn::pfCand_ele_pvAssociationQuality) =
1988 getValueLinear<int>(candFunc::getPvAssocationQuality(ele_cand), 0, 7,
true);
1989 get(dnn::pfCand_ele_puppiWeight) = is_inner ?
getValue(candFunc::getPuppiWeight(ele_cand, 0.9906834f))
1990 :
getValue(candFunc::getPuppiWeight(ele_cand, 0.9669586f));
1991 get(dnn::pfCand_ele_charge) =
getValue(ele_cand.charge());
1992 get(dnn::pfCand_ele_lostInnerHits) = getValue<int>(candFunc::getLostInnerHits(ele_cand, 0));
1993 get(dnn::pfCand_ele_numberOfPixelHits) =
getValueLinear(candFunc::getNumberOfPixelHits(ele_cand, 0), 0, 10,
true);
1994 get(dnn::pfCand_ele_vertex_dx) =
1996 get(dnn::pfCand_ele_vertex_dy) =
1998 get(dnn::pfCand_ele_vertex_dz) =
2001 pfCands.
at(index_pf_ele).vertex().x() - pv.
position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2005 pfCands.
at(index_pf_ele).vertex().y() - pv.
position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2009 pfCands.
at(index_pf_ele).vertex().z() - pv.
position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2013 const bool hasTrackDetails = candFunc::getHasTrackDetails(ele_cand);
2014 if (hasTrackDetails) {
2015 get(dnn::pfCand_ele_hasTrackDetails) = hasTrackDetails;
2016 get(dnn::pfCand_ele_dxy) =
getValueNorm(candFunc::getTauDxy(ele_cand), 0.f, 0.171f);
2017 get(dnn::pfCand_ele_dxy_sig) =
2018 getValueNorm(
std::abs(candFunc::getTauDxy(ele_cand)) / pfCands.
at(index_pf_ele).dxyError(), 1.634f, 6.45f);
2019 get(dnn::pfCand_ele_dz) =
getValueNorm(candFunc::getTauDz(ele_cand), 0.001f, 1.02f);
2020 get(dnn::pfCand_ele_dz_sig) =
2023 candFunc::getPseudoTrack(ele_cand).chi2() / candFunc::getPseudoTrack(ele_cand).ndof(), 2.272f, 8.439f);
2024 get(dnn::pfCand_ele_track_ndof) =
getValueNorm(candFunc::getPseudoTrack(ele_cand).ndof(), 15.18f, 3.203f);
2027 if (valid_index_pf_gamma) {
2028 size_t index_pf_gamma = cell_map.at(CellObjectType::PfCand_gamma);
2029 const auto& gamma_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_pf_gamma));
2031 get(dnn::pfCand_gamma_valid) = valid_index_pf_gamma;
2032 get(dnn::pfCand_gamma_rel_pt) =
getValueNorm(pfCands.
at(index_pf_gamma).polarP4().pt() / tau.polarP4().pt(),
2033 is_inner ? 0.6048f : 0.02576f,
2034 is_inner ? 1.669f : 0.3833f);
2035 get(dnn::pfCand_gamma_deta) =
getValueLinear(pfCands.
at(index_pf_gamma).polarP4().eta() - tau.polarP4().eta(),
2036 is_inner ? -0.1f : -0.5f,
2037 is_inner ? 0.1f : 0.5f,
2039 get(dnn::pfCand_gamma_dphi) =
getValueLinear(dPhi(tau.polarP4(), pfCands.
at(index_pf_gamma).polarP4()),
2040 is_inner ? -0.1
f : -0.5
f,
2041 is_inner ? 0.1
f : 0.5
f,
2043 get(dnn::pfCand_gamma_pvAssociationQuality) =
2044 getValueLinear<int>(candFunc::getPvAssocationQuality(gamma_cand), 0, 7,
true);
2045 get(dnn::pfCand_gamma_fromPV) = getValueLinear<int>(candFunc::getFromPV(gamma_cand), 0, 3,
true);
2046 get(dnn::pfCand_gamma_puppiWeight) = is_inner ?
getValue(candFunc::getPuppiWeight(gamma_cand, 0.9084110f))
2047 :
getValue(candFunc::getPuppiWeight(gamma_cand, 0.4211567f));
2048 get(dnn::pfCand_gamma_puppiWeightNoLep) = is_inner
2049 ?
getValue(candFunc::getPuppiWeightNoLep(gamma_cand, 0.8857716f))
2050 :
getValue(candFunc::getPuppiWeightNoLep(gamma_cand, 0.3822604f));
2051 get(dnn::pfCand_gamma_lostInnerHits) = getValue<int>(candFunc::getLostInnerHits(gamma_cand, 0));
2052 get(dnn::pfCand_gamma_numberOfPixelHits) =
2053 getValueLinear(candFunc::getNumberOfPixelHits(gamma_cand, 0), 0, 7,
true);
2054 get(dnn::pfCand_gamma_vertex_dx) =
2056 get(dnn::pfCand_gamma_vertex_dy) =
2058 get(dnn::pfCand_gamma_vertex_dz) =
2061 pfCands.
at(index_pf_gamma).vertex().x() - pv.
position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2065 pfCands.
at(index_pf_gamma).vertex().y() - pv.
position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2069 pfCands.
at(index_pf_gamma).vertex().z() - pv.
position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2072 const bool hasTrackDetails = candFunc::getHasTrackDetails(gamma_cand);
2073 if (hasTrackDetails) {
2074 get(dnn::pfCand_gamma_hasTrackDetails) = hasTrackDetails;
2075 get(dnn::pfCand_gamma_dxy) =
getValueNorm(candFunc::getTauDxy(gamma_cand), 0.0004f, 0.882f);
2076 get(dnn::pfCand_gamma_dxy_sig) =
2077 getValueNorm(
std::abs(candFunc::getTauDxy(gamma_cand)) / gamma_cand.dxyError(), 4.271f, 63.78f);
2078 get(dnn::pfCand_gamma_dz) =
getValueNorm(candFunc::getTauDz(gamma_cand), 0.0071f, 5.285f);
2079 get(dnn::pfCand_gamma_dz_sig) =
2081 get(dnn::pfCand_gamma_track_chi2_ndof) = candFunc::getPseudoTrack(gamma_cand).ndof() > 0
2083 candFunc::getPseudoTrack(gamma_cand).
ndof(),
2087 get(dnn::pfCand_gamma_track_ndof) =
2088 candFunc::getPseudoTrack(gamma_cand).ndof() > 0
2089 ?
getValueNorm(candFunc::getPseudoTrack(gamma_cand).
ndof(), 12.25f, 4.774f)
2093 if (valid_index_ele) {
2096 get(dnn::ele_valid) = valid_index_ele;
2097 get(dnn::ele_rel_pt) =
getValueNorm(electrons->at(index_ele).polarP4().pt() / tau.polarP4().pt(),
2098 is_inner ? 1.067f : 0.5111f,
2099 is_inner ? 1.521f : 2.765f);
2100 get(dnn::ele_deta) =
getValueLinear(electrons->at(index_ele).polarP4().eta() - tau.polarP4().eta(),
2101 is_inner ? -0.1f : -0.5f,
2102 is_inner ? 0.1f : 0.5f,
2104 get(dnn::ele_dphi) =
getValueLinear(dPhi(tau.polarP4(), electrons->at(index_ele).polarP4()),
2105 is_inner ? -0.1
f : -0.5
f,
2106 is_inner ? 0.1
f : 0.5
f,
2109 float cc_ele_energy, cc_gamma_energy;
2111 const bool cc_valid =
2114 get(dnn::ele_cc_valid) = cc_valid;
2115 get(dnn::ele_cc_ele_rel_energy) =
2116 getValueNorm(cc_ele_energy / electrons->at(index_ele).polarP4().pt(), 1.729f, 1.644f);
2117 get(dnn::ele_cc_gamma_rel_energy) =
getValueNorm(cc_gamma_energy / cc_ele_energy, 0.1439f, 0.3284f);
2118 get(dnn::ele_cc_n_gamma) =
getValueNorm(cc_n_gamma, 1.794f, 2.079f);
2121 electrons->at(index_ele).trackMomentumAtVtx().R() / electrons->at(index_ele).polarP4().pt(), 1.531f, 1.424f);
2123 electrons->at(index_ele).trackMomentumAtCalo().R() / electrons->at(index_ele).polarP4().pt(), 1.531f, 1.424f);
2125 electrons->at(index_ele).trackMomentumOut().R() / electrons->at(index_ele).polarP4().pt(), 0.7735f, 0.935f);
2126 get(dnn::ele_rel_trackMomentumAtEleClus) =
2127 getValueNorm(electrons->at(index_ele).trackMomentumAtEleClus().R() / electrons->at(index_ele).polarP4().pt(),
2130 get(dnn::ele_rel_trackMomentumAtVtxWithConstraint) =
getValueNorm(
2131 electrons->at(index_ele).trackMomentumAtVtxWithConstraint().R() / electrons->at(index_ele).polarP4().pt(),
2134 get(dnn::ele_rel_ecalEnergy) =
2135 getValueNorm(electrons->at(index_ele).ecalEnergy() / electrons->at(index_ele).polarP4().pt(), 1.993f, 1.308f);
2137 electrons->at(index_ele).ecalEnergy() / electrons->at(index_ele).ecalEnergyError(), 70.25f, 58.16f);
2138 get(dnn::ele_eSuperClusterOverP) =
getValueNorm(electrons->at(index_ele).eSuperClusterOverP(), 2.432f, 15.13f);
2139 get(dnn::ele_eSeedClusterOverP) =
getValueNorm(electrons->at(index_ele).eSeedClusterOverP(), 2.034f, 13.96f);
2140 get(dnn::ele_eSeedClusterOverPout) =
getValueNorm(electrons->at(index_ele).eSeedClusterOverPout(), 6.64f, 36.8f);
2141 get(dnn::ele_eEleClusterOverPout) =
getValueNorm(electrons->at(index_ele).eEleClusterOverPout(), 4.183f, 20.63f);
2142 get(dnn::ele_deltaEtaSuperClusterTrackAtVtx) =
2143 getValueNorm(electrons->at(index_ele).deltaEtaSuperClusterTrackAtVtx(), 0.f, 0.0363f);
2144 get(dnn::ele_deltaEtaSeedClusterTrackAtCalo) =
2145 getValueNorm(electrons->at(index_ele).deltaEtaSeedClusterTrackAtCalo(), -0.0001f, 0.0512f);
2146 get(dnn::ele_deltaEtaEleClusterTrackAtCalo) =
2147 getValueNorm(electrons->at(index_ele).deltaEtaEleClusterTrackAtCalo(), -0.0001f, 0.0541f);
2148 get(dnn::ele_deltaPhiEleClusterTrackAtCalo) =
2149 getValueNorm(electrons->at(index_ele).deltaPhiEleClusterTrackAtCalo(), 0.0002f, 0.0553f);
2150 get(dnn::ele_deltaPhiSuperClusterTrackAtVtx) =
2151 getValueNorm(electrons->at(index_ele).deltaPhiSuperClusterTrackAtVtx(), 0.0001f, 0.0523f);
2152 get(dnn::ele_deltaPhiSeedClusterTrackAtCalo) =
2153 getValueNorm(electrons->at(index_ele).deltaPhiSeedClusterTrackAtCalo(), 0.0004f, 0.0777f);
2154 get(dnn::ele_mvaInput_earlyBrem) =
getValue(electrons->at(index_ele).mvaInput().earlyBrem);
2155 get(dnn::ele_mvaInput_lateBrem) =
getValue(electrons->at(index_ele).mvaInput().lateBrem);
2156 get(dnn::ele_mvaInput_sigmaEtaEta) =
2157 getValueNorm(electrons->at(index_ele).mvaInput().sigmaEtaEta, 0.0008f, 0.0052f);
2158 get(dnn::ele_mvaInput_hadEnergy) =
getValueNorm(electrons->at(index_ele).mvaInput().hadEnergy, 14.04f, 69.48f);
2159 get(dnn::ele_mvaInput_deltaEta) =
getValueNorm(electrons->at(index_ele).mvaInput().deltaEta, 0.0099f, 0.0851f);
2160 const auto& gsfTrack = electrons->at(index_ele).gsfTrack();
2161 if (gsfTrack.isNonnull()) {
2162 get(dnn::ele_gsfTrack_normalizedChi2) =
getValueNorm(gsfTrack->normalizedChi2(), 3.049f, 10.39f);
2163 get(dnn::ele_gsfTrack_numberOfValidHits) =
getValueNorm(gsfTrack->numberOfValidHits(), 16.52f, 2.806f);
2164 get(dnn::ele_rel_gsfTrack_pt) =
2165 getValueNorm(gsfTrack->pt() / electrons->at(index_ele).polarP4().pt(), 1.355f, 16.81f);
2166 get(dnn::ele_gsfTrack_pt_sig) =
getValueNorm(gsfTrack->pt() / gsfTrack->ptError(), 5.046f, 3.119f);
2168 const auto& closestCtfTrack = electrons->at(index_ele).closestCtfTrackRef();
2169 const bool has_closestCtfTrack = closestCtfTrack.isNonnull();
2170 if (has_closestCtfTrack) {
2171 get(dnn::ele_has_closestCtfTrack) = has_closestCtfTrack;
2172 get(dnn::ele_closestCtfTrack_normalizedChi2) =
getValueNorm(closestCtfTrack->normalizedChi2(), 2.411f, 6.98f);
2173 get(dnn::ele_closestCtfTrack_numberOfValidHits) =
2174 getValueNorm(closestCtfTrack->numberOfValidHits(), 15.16f, 5.26f);
2179 template <
typename Cand
idateCastType,
typename TauCastType>
2181 const TauCastType& tau,
2182 const size_t tau_index,
2186 const std::vector<pat::Muon>* muons,
2188 const Cell& cell_map,
2191 namespace dnn = dnn_inputs_2017_v2::MuonBlockInputs;
2195 const auto&
get = [&](
int var_index) ->
float& {
return inputs.tensor<float, 4>()(idx, 0, 0, var_index); };
2197 const bool valid_index_pf_muon = cell_map.count(CellObjectType::PfCand_muon);
2200 if (!cell_map.empty()) {
2206 if (valid_index_pf_muon) {
2207 size_t index_pf_muon = cell_map.at(CellObjectType::PfCand_muon);
2208 const auto& muon_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_pf_muon));
2210 get(dnn::pfCand_muon_valid) = valid_index_pf_muon;
2211 get(dnn::pfCand_muon_rel_pt) =
getValueNorm(pfCands.
at(index_pf_muon).polarP4().pt() / tau.polarP4().pt(),
2212 is_inner ? 0.9509f : 0.0861f,
2213 is_inner ? 0.4294f : 0.4065f);
2214 get(dnn::pfCand_muon_deta) =
getValueLinear(pfCands.
at(index_pf_muon).polarP4().eta() - tau.polarP4().eta(),
2215 is_inner ? -0.1f : -0.5f,
2216 is_inner ? 0.1f : 0.5f,
2218 get(dnn::pfCand_muon_dphi) =
getValueLinear(dPhi(tau.polarP4(), pfCands.
at(index_pf_muon).polarP4()),
2219 is_inner ? -0.1
f : -0.5
f,
2220 is_inner ? 0.1
f : 0.5
f,
2222 get(dnn::pfCand_muon_pvAssociationQuality) =
2223 getValueLinear<int>(candFunc::getPvAssocationQuality(muon_cand), 0, 7,
true);
2224 get(dnn::pfCand_muon_fromPV) = getValueLinear<int>(candFunc::getFromPV(muon_cand), 0, 3,
true);
2225 get(dnn::pfCand_muon_puppiWeight) = is_inner ?
getValue(candFunc::getPuppiWeight(muon_cand, 0.9786588f))
2226 :
getValue(candFunc::getPuppiWeight(muon_cand, 0.8132477f));
2227 get(dnn::pfCand_muon_charge) =
getValue(muon_cand.charge());
2228 get(dnn::pfCand_muon_lostInnerHits) = getValue<int>(candFunc::getLostInnerHits(muon_cand, 0));
2229 get(dnn::pfCand_muon_numberOfPixelHits) =
2230 getValueLinear(candFunc::getNumberOfPixelHits(muon_cand, 0), 0, 11,
true);
2231 get(dnn::pfCand_muon_vertex_dx) =
2233 get(dnn::pfCand_muon_vertex_dy) =
2235 get(dnn::pfCand_muon_vertex_dz) =
2238 pfCands.
at(index_pf_muon).vertex().x() - pv.
position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2242 pfCands.
at(index_pf_muon).vertex().y() - pv.
position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2246 pfCands.
at(index_pf_muon).vertex().z() - pv.
position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2250 const bool hasTrackDetails = candFunc::getHasTrackDetails(muon_cand);
2251 if (hasTrackDetails) {
2252 get(dnn::pfCand_muon_hasTrackDetails) = hasTrackDetails;
2253 get(dnn::pfCand_muon_dxy) =
getValueNorm(candFunc::getTauDxy(muon_cand), -0.0045f, 0.9655f);
2254 get(dnn::pfCand_muon_dxy_sig) =
2256 get(dnn::pfCand_muon_dz) =
getValueNorm(candFunc::getTauDz(muon_cand), -0.0117f, 4.097f);
2257 get(dnn::pfCand_muon_dz_sig) =
2260 candFunc::getPseudoTrack(muon_cand).chi2() / candFunc::getPseudoTrack(muon_cand).ndof(), 0.69f, 1.711f);
2261 get(dnn::pfCand_muon_track_ndof) =
getValueNorm(candFunc::getPseudoTrack(muon_cand).ndof(), 17.5f, 5.11f);
2264 if (valid_index_muon) {
2267 get(dnn::muon_valid) = valid_index_muon;
2268 get(dnn::muon_rel_pt) =
getValueNorm(muons->at(index_muon).polarP4().pt() / tau.polarP4().pt(),
2269 is_inner ? 0.7966f : 0.2678f,
2270 is_inner ? 3.402f : 3.592f);
2271 get(dnn::muon_deta) =
getValueLinear(muons->at(index_muon).polarP4().eta() - tau.polarP4().eta(),
2272 is_inner ? -0.1f : -0.5f,
2273 is_inner ? 0.1f : 0.5f,
2275 get(dnn::muon_dphi) =
getValueLinear(dPhi(tau.polarP4(), muons->at(index_muon).polarP4()),
2276 is_inner ? -0.1
f : -0.5
f,
2277 is_inner ? 0.1
f : 0.5
f,
2280 get(dnn::muon_dxy_sig) =
2285 const bool normalizedChi2_valid =
2286 muons->at(index_muon).globalTrack().isNonnull() && muons->at(index_muon).normChi2() >= 0;
2287 if (normalizedChi2_valid) {
2288 get(dnn::muon_normalizedChi2_valid) = normalizedChi2_valid;
2289 get(dnn::muon_normalizedChi2) =
getValueNorm(muons->at(index_muon).normChi2(), 21.52f, 265.8f);
2290 if (muons->at(index_muon).innerTrack().isNonnull())
2291 get(dnn::muon_numberOfValidHits) =
getValueNorm(muons->at(index_muon).numberOfValidHits(), 21.84f, 10.59f);
2293 get(dnn::muon_segmentCompatibility) =
getValue(muons->at(index_muon).segmentCompatibility());
2294 get(dnn::muon_caloCompatibility) =
getValue(muons->at(index_muon).caloCompatibility());
2296 const bool pfEcalEnergy_valid = muons->at(index_muon).pfEcalEnergy() >= 0;
2297 if (pfEcalEnergy_valid) {
2298 get(dnn::muon_pfEcalEnergy_valid) = pfEcalEnergy_valid;
2299 get(dnn::muon_rel_pfEcalEnergy) =
2300 getValueNorm(muons->at(index_muon).pfEcalEnergy() / muons->at(index_muon).polarP4().pt(), 0.2273f, 0.4865f);
2303 MuonHitMatchV2 hit_match(muons->at(index_muon));
2304 static const std::map<int, std::pair<int, int>> muonMatchHitVars = {
2309 static const std::map<int, std::vector<float>> muonMatchVarLimits = {
2310 {
MuonSubdetId::DT, {2, 2, 2, 2}}, {
MuonSubdetId::CSC, {6, 2, 2, 2}}, {
MuonSubdetId::RPC, {7, 6, 4, 4}}};
2312 static const std::map<int, std::vector<float>> muonHitVarLimits = {{
MuonSubdetId::DT, {12, 12, 12, 8}},
2316 for (
int subdet : hit_match.MuonHitMatchV2::consideredSubdets()) {
2317 const auto& matchHitVar = muonMatchHitVars.at(subdet);
2318 const auto& matchLimits = muonMatchVarLimits.at(subdet);
2319 const auto& hitLimits = muonHitVarLimits.at(subdet);
2320 for (
int station = MuonHitMatchV2::first_station_id; station <= MuonHitMatchV2::last_station_id; ++
station) {
2321 const unsigned n_matches = hit_match.nMatches(subdet, station);
2322 const unsigned n_hits = hit_match.nHits(subdet, station);
2323 get(matchHitVar.first + station - 1) =
getValueLinear(n_matches, 0, matchLimits.at(station - 1),
true);
2324 get(matchHitVar.second + station - 1) =
getValueLinear(n_hits, 0, hitLimits.at(station - 1),
true);
2330 template <
typename Cand
idateCastType,
typename TauCastType>
2332 const TauCastType& tau,
2333 const size_t tau_index,
2338 const Cell& cell_map,
2341 namespace dnn = dnn_inputs_2017_v2::HadronBlockInputs;
2345 const auto&
get = [&](
int var_index) ->
float& {
return inputs.tensor<float, 4>()(idx, 0, 0, var_index); };
2347 const bool valid_chH = cell_map.count(CellObjectType::PfCand_chargedHadron);
2348 const bool valid_nH = cell_map.count(CellObjectType::PfCand_neutralHadron);
2350 if (!cell_map.empty()) {
2357 size_t index_chH = cell_map.at(CellObjectType::PfCand_chargedHadron);
2358 const auto& chH_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_chH));
2360 get(dnn::pfCand_chHad_valid) = valid_chH;
2361 get(dnn::pfCand_chHad_rel_pt) =
getValueNorm(pfCands.
at(index_chH).polarP4().pt() / tau.polarP4().pt(),
2362 is_inner ? 0.2564f : 0.0194f,
2363 is_inner ? 0.8607f : 0.1865f);
2364 get(dnn::pfCand_chHad_deta) =
getValueLinear(pfCands.
at(index_chH).polarP4().eta() - tau.polarP4().eta(),
2365 is_inner ? -0.1f : -0.5f,
2366 is_inner ? 0.1f : 0.5f,
2368 get(dnn::pfCand_chHad_dphi) =
getValueLinear(dPhi(tau.polarP4(), pfCands.
at(index_chH).polarP4()),
2369 is_inner ? -0.1
f : -0.5
f,
2370 is_inner ? 0.1
f : 0.5
f,
2372 get(dnn::pfCand_chHad_leadChargedHadrCand) =
2373 getValue(&chH_cand == dynamic_cast<const CandidateCastType*>(tau.leadChargedHadrCand().get()));
2374 get(dnn::pfCand_chHad_pvAssociationQuality) =
2375 getValueLinear<int>(candFunc::getPvAssocationQuality(chH_cand), 0, 7,
true);
2376 get(dnn::pfCand_chHad_fromPV) = getValueLinear<int>(candFunc::getFromPV(chH_cand), 0, 3,
true);
2377 const float default_chH_pw_inner = 0.7614090f;
2378 const float default_chH_pw_outer = 0.1974930f;
2379 get(dnn::pfCand_chHad_puppiWeight) = is_inner
2380 ?
getValue(candFunc::getPuppiWeight(chH_cand, default_chH_pw_inner))
2381 :
getValue(candFunc::getPuppiWeight(chH_cand, default_chH_pw_outer));
2382 get(dnn::pfCand_chHad_puppiWeightNoLep) =
2383 is_inner ?
getValue(candFunc::getPuppiWeightNoLep(chH_cand, default_chH_pw_inner))
2384 :
getValue(candFunc::getPuppiWeightNoLep(chH_cand, default_chH_pw_outer));
2385 get(dnn::pfCand_chHad_charge) =
getValue(chH_cand.charge());
2386 get(dnn::pfCand_chHad_lostInnerHits) = getValue<int>(candFunc::getLostInnerHits(chH_cand, 0));
2387 get(dnn::pfCand_chHad_numberOfPixelHits) =
2388 getValueLinear(candFunc::getNumberOfPixelHits(chH_cand, 0), 0, 12,
true);
2389 get(dnn::pfCand_chHad_vertex_dx) =
2391 get(dnn::pfCand_chHad_vertex_dy) =
2393 get(dnn::pfCand_chHad_vertex_dz) =
2396 pfCands.
at(index_chH).vertex().x() - pv.
position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2400 pfCands.
at(index_chH).vertex().y() - pv.
position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2404 pfCands.
at(index_chH).vertex().z() - pv.
position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2408 const bool hasTrackDetails = candFunc::getHasTrackDetails(chH_cand);
2409 if (hasTrackDetails) {
2410 get(dnn::pfCand_chHad_hasTrackDetails) = hasTrackDetails;
2411 get(dnn::pfCand_chHad_dxy) =
getValueNorm(candFunc::getTauDxy(chH_cand), -0.012f, 2.386f);
2412 get(dnn::pfCand_chHad_dxy_sig) =
2414 get(dnn::pfCand_chHad_dz) =
getValueNorm(candFunc::getTauDz(chH_cand), -0.0246f, 7.618f);
2415 get(dnn::pfCand_chHad_dz_sig) =
2417 get(dnn::pfCand_chHad_track_chi2_ndof) =
2418 candFunc::getPseudoTrack(chH_cand).ndof() > 0
2419 ?
getValueNorm(candFunc::getPseudoTrack(chH_cand).
chi2() / candFunc::getPseudoTrack(chH_cand).
ndof(),
2423 get(dnn::pfCand_chHad_track_ndof) =
2424 candFunc::getPseudoTrack(chH_cand).ndof() > 0
2429 get(dnn::pfCand_chHad_hcalFraction) =
getValue(hcal_fraction);
2430 get(dnn::pfCand_chHad_rawCaloFraction) =
getValueLinear(candFunc::getRawCaloFraction(chH_cand), 0.f, 2.6f,
true);
2433 size_t index_nH = cell_map.at(CellObjectType::PfCand_neutralHadron);
2434 const auto& nH_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_nH));
2436 get(dnn::pfCand_nHad_valid) = valid_nH;
2437 get(dnn::pfCand_nHad_rel_pt) =
getValueNorm(pfCands.
at(index_nH).polarP4().pt() / tau.polarP4().pt(),
2438 is_inner ? 0.3163f : 0.0502f,
2439 is_inner ? 0.2769f : 0.4266f);
2440 get(dnn::pfCand_nHad_deta) =
getValueLinear(pfCands.
at(index_nH).polarP4().eta() - tau.polarP4().eta(),
2441 is_inner ? -0.1f : -0.5f,
2442 is_inner ? 0.1f : 0.5f,
2445 dPhi(tau.polarP4(), pfCands.
at(index_nH).polarP4()), is_inner ? -0.1
f : -0.5
f, is_inner ? 0.1
f : 0.5
f,
false);
2446 get(dnn::pfCand_nHad_puppiWeight) = is_inner ?
getValue(candFunc::getPuppiWeight(nH_cand, 0.9798355f))
2447 :
getValue(candFunc::getPuppiWeight(nH_cand, 0.7813260f));
2448 get(dnn::pfCand_nHad_puppiWeightNoLep) = is_inner ?
getValue(candFunc::getPuppiWeightNoLep(nH_cand, 0.9046796f))
2449 :
getValue(candFunc::getPuppiWeightNoLep(nH_cand, 0.6554860f));
2451 get(dnn::pfCand_nHad_hcalFraction) =
getValue(hcal_fraction);
2455 template <
typename dnn,
typename Cand
idateCastType,
typename TauCastType>
2457 const size_t tau_index,
2459 const std::vector<pat::Electron>*
electrons,
2460 const std::vector<pat::Muon>* muons,
2461 TauFunc tau_funcs)
const {
2462 static constexpr
bool check_all_set =
false;
2463 static constexpr
float default_value_for_set_check = -42;
2465 tensorflow::Tensor
inputs(tensorflow::DT_FLOAT, {1, dnn_inputs_2017v1::NumberOfInputs});
2466 const auto&
get = [&](
int var_index) ->
float& {
return inputs.matrix<
float>()(0, var_index); };
2467 auto leadChargedHadrCand =
dynamic_cast<const CandidateCastType*
>(tau.leadChargedHadrCand().get());
2469 if (check_all_set) {
2470 for (
int var_index = 0; var_index < dnn::NumberOfInputs; ++var_index) {
2471 get(var_index) = default_value_for_set_check;
2478 get(dnn::decayMode) = tau.decayMode();
2479 get(dnn::chargedIsoPtSum) = tau_funcs.getChargedIsoPtSum(tau, tau_ref);
2480 get(dnn::neutralIsoPtSum) = tau_funcs.getNeutralIsoPtSum(tau, tau_ref);
2481 get(dnn::neutralIsoPtSumWeight) = tau_funcs.getNeutralIsoPtSumWeight(tau, tau_ref);
2482 get(dnn::photonPtSumOutsideSignalCone) = tau_funcs.getPhotonPtSumOutsideSignalCone(tau, tau_ref);
2483 get(dnn::puCorrPtSum) = tau_funcs.getPuCorrPtSum(tau, tau_ref);
2484 get(
dnn::dxy) = tau_funcs.getdxy(tau, tau_index);
2485 get(dnn::dxy_sig) = tau_funcs.getdxySig(tau, tau_index);
2487 get(dnn::ip3d) = tau_funcs.getip3d(tau, tau_index);
2488 get(dnn::ip3d_sig) = tau_funcs.getip3dSig(tau, tau_index);
2489 get(dnn::hasSecondaryVertex) = tau_funcs.getHasSecondaryVertex(tau, tau_index);
2490 get(dnn::flightLength_r) = tau_funcs.getFlightLength(tau, tau_index).R();
2491 get(dnn::flightLength_dEta) = dEta(tau_funcs.getFlightLength(tau, tau_index), tau.p4());
2492 get(dnn::flightLength_dPhi) = dPhi(tau_funcs.getFlightLength(tau, tau_index), tau.p4());
2493 get(dnn::flightLength_sig) = tau_funcs.getFlightLengthSig(tau, tau_index);
2494 get(dnn::leadChargedHadrCand_pt) = leadChargedHadrCand ? leadChargedHadrCand->p4().Pt() :
default_value;
2495 get(dnn::leadChargedHadrCand_dEta) =
2496 leadChargedHadrCand ? dEta(leadChargedHadrCand->p4(), tau.p4()) : default_value;
2497 get(dnn::leadChargedHadrCand_dPhi) =
2498 leadChargedHadrCand ? dPhi(leadChargedHadrCand->p4(), tau.p4()) : default_value;
2499 get(dnn::leadChargedHadrCand_mass) = leadChargedHadrCand ? leadChargedHadrCand->p4().mass() :
default_value;
2504 get(dnn::leadingTrackNormChi2) = tau_funcs.getLeadingTrackNormChi2(tau);
2508 get(dnn::emFraction) = tau_funcs.getEmFraction(tau);
2509 get(dnn::has_gsf_track) = leadChargedHadrCand &&
std::abs(leadChargedHadrCand->pdgId()) == 11;
2510 get(dnn::inside_ecal_crack) =
isInEcalCrack(tau.p4().Eta());
2512 get(dnn::gsf_ele_matched) = gsf_ele !=
nullptr;
2513 get(dnn::gsf_ele_pt) = gsf_ele !=
nullptr ? gsf_ele->p4().Pt() :
default_value;
2514 get(dnn::gsf_ele_dEta) = gsf_ele !=
nullptr ? dEta(gsf_ele->p4(), tau.p4()) : default_value;
2515 get(dnn::gsf_ele_dPhi) = gsf_ele !=
nullptr ? dPhi(gsf_ele->p4(), tau.p4()) : default_value;
2516 get(dnn::gsf_ele_mass) = gsf_ele !=
nullptr ? gsf_ele->p4().mass() :
default_value;
2518 get(dnn::gsf_ele_Pin) = gsf_ele !=
nullptr ? gsf_ele->trackMomentumAtVtx().R() :
default_value;
2519 get(dnn::gsf_ele_Pout) = gsf_ele !=
nullptr ? gsf_ele->trackMomentumOut().R() :
default_value;
2520 get(dnn::gsf_ele_EtotOverPin) =
get(dnn::gsf_ele_Pin) > 0
2521 ? (
get(dnn::gsf_ele_Ee) +
get(dnn::gsf_ele_Egamma)) /
get(dnn::gsf_ele_Pin)
2523 get(dnn::gsf_ele_Eecal) = gsf_ele !=
nullptr ? gsf_ele->ecalEnergy() :
default_value;
2524 get(dnn::gsf_ele_dEta_SeedClusterTrackAtCalo) =
2525 gsf_ele !=
nullptr ? gsf_ele->deltaEtaSeedClusterTrackAtCalo() :
default_value;
2526 get(dnn::gsf_ele_dPhi_SeedClusterTrackAtCalo) =
2527 gsf_ele !=
nullptr ? gsf_ele->deltaPhiSeedClusterTrackAtCalo() :
default_value;
2528 get(dnn::gsf_ele_mvaIn_sigmaEtaEta) = gsf_ele !=
nullptr ? gsf_ele->mvaInput().sigmaEtaEta :
default_value;
2529 get(dnn::gsf_ele_mvaIn_hadEnergy) = gsf_ele !=
nullptr ? gsf_ele->mvaInput().hadEnergy :
default_value;
2530 get(dnn::gsf_ele_mvaIn_deltaEta) = gsf_ele !=
nullptr ? gsf_ele->mvaInput().deltaEta :
default_value;
2532 get(dnn::gsf_ele_Chi2NormGSF) = default_value;
2533 get(dnn::gsf_ele_GSFNumHits) = default_value;
2534 get(dnn::gsf_ele_GSFTrackResol) = default_value;
2535 get(dnn::gsf_ele_GSFTracklnPt) = default_value;
2536 if (gsf_ele !=
nullptr && gsf_ele->gsfTrack().isNonnull()) {
2537 get(dnn::gsf_ele_Chi2NormGSF) = gsf_ele->gsfTrack()->normalizedChi2();
2538 get(dnn::gsf_ele_GSFNumHits) = gsf_ele->gsfTrack()->numberOfValidHits();
2539 if (gsf_ele->gsfTrack()->pt() > 0) {
2540 get(dnn::gsf_ele_GSFTrackResol) = gsf_ele->gsfTrack()->ptError() / gsf_ele->gsfTrack()->pt();
2541 get(dnn::gsf_ele_GSFTracklnPt) = std::log10(gsf_ele->gsfTrack()->pt());
2545 get(dnn::gsf_ele_Chi2NormKF) = default_value;
2546 get(dnn::gsf_ele_KFNumHits) = default_value;
2547 if (gsf_ele !=
nullptr && gsf_ele->closestCtfTrackRef().isNonnull()) {
2548 get(dnn::gsf_ele_Chi2NormKF) = gsf_ele->closestCtfTrackRef()->normalizedChi2();
2549 get(dnn::gsf_ele_KFNumHits) = gsf_ele->closestCtfTrackRef()->numberOfValidHits();
2551 get(dnn::leadChargedCand_etaAtEcalEntrance) = tau_funcs.getEtaAtEcalEntrance(tau);
2552 get(dnn::leadChargedCand_pt) = leadChargedHadrCand->pt();
2554 get(dnn::leadChargedHadrCand_HoP) = default_value;
2555 get(dnn::leadChargedHadrCand_EoP) = default_value;
2556 if (leadChargedHadrCand->pt() > 0) {
2557 get(dnn::leadChargedHadrCand_HoP) = tau_funcs.getEcalEnergyLeadingChargedHadr(tau) / leadChargedHadrCand->pt();
2558 get(dnn::leadChargedHadrCand_EoP) = tau_funcs.getHcalEnergyLeadingChargedHadr(tau) / leadChargedHadrCand->pt();
2561 MuonHitMatchV1 muon_hit_match;
2562 if (tau.leadPFChargedHadrCand().isNonnull() && tau.leadPFChargedHadrCand()->muonRef().isNonnull())
2563 muon_hit_match.addMatchedMuon(*tau.leadPFChargedHadrCand()->muonRef(),
tau);
2565 auto matched_muons = muon_hit_match.findMatchedMuons(tau, muons, 0.3, 5);
2566 for (
auto muon : matched_muons)
2567 muon_hit_match.addMatchedMuon(*muon, tau);
2570 LorentzVectorXYZ signalChargedHadrCands_sumIn, signalChargedHadrCands_sumOut;
2572 tau.signalChargedHadrCands(),
2573 signalChargedHadrCands_sumIn,
2574 signalChargedHadrCands_sumOut,
2575 get(dnn::signalChargedHadrCands_sum_innerSigCone_pt),
2576 get(dnn::signalChargedHadrCands_sum_innerSigCone_dEta),
2577 get(dnn::signalChargedHadrCands_sum_innerSigCone_dPhi),
2578 get(dnn::signalChargedHadrCands_sum_innerSigCone_mass),
2579 get(dnn::signalChargedHadrCands_sum_outerSigCone_pt),
2580 get(dnn::signalChargedHadrCands_sum_outerSigCone_dEta),
2581 get(dnn::signalChargedHadrCands_sum_outerSigCone_dPhi),
2582 get(dnn::signalChargedHadrCands_sum_outerSigCone_mass),
2583 get(dnn::signalChargedHadrCands_nTotal_innerSigCone),
2584 get(dnn::signalChargedHadrCands_nTotal_outerSigCone));
2588 tau.signalNeutrHadrCands(),
2589 signalNeutrHadrCands_sumIn,
2590 signalNeutrHadrCands_sumOut,
2591 get(dnn::signalNeutrHadrCands_sum_innerSigCone_pt),
2592 get(dnn::signalNeutrHadrCands_sum_innerSigCone_dEta),
2593 get(dnn::signalNeutrHadrCands_sum_innerSigCone_dPhi),
2594 get(dnn::signalNeutrHadrCands_sum_innerSigCone_mass),
2595 get(dnn::signalNeutrHadrCands_sum_outerSigCone_pt),
2596 get(dnn::signalNeutrHadrCands_sum_outerSigCone_dEta),
2597 get(dnn::signalNeutrHadrCands_sum_outerSigCone_dPhi),
2598 get(dnn::signalNeutrHadrCands_sum_outerSigCone_mass),
2599 get(dnn::signalNeutrHadrCands_nTotal_innerSigCone),
2600 get(dnn::signalNeutrHadrCands_nTotal_outerSigCone));
2604 tau.signalGammaCands(),
2605 signalGammaCands_sumIn,
2606 signalGammaCands_sumOut,
2607 get(dnn::signalGammaCands_sum_innerSigCone_pt),
2608 get(dnn::signalGammaCands_sum_innerSigCone_dEta),
2609 get(dnn::signalGammaCands_sum_innerSigCone_dPhi),
2610 get(dnn::signalGammaCands_sum_innerSigCone_mass),
2611 get(dnn::signalGammaCands_sum_outerSigCone_pt),
2612 get(dnn::signalGammaCands_sum_outerSigCone_dEta),
2613 get(dnn::signalGammaCands_sum_outerSigCone_dPhi),
2614 get(dnn::signalGammaCands_sum_outerSigCone_mass),
2615 get(dnn::signalGammaCands_nTotal_innerSigCone),
2616 get(dnn::signalGammaCands_nTotal_outerSigCone));
2620 tau.isolationChargedHadrCands(),
2621 isolationChargedHadrCands_sum,
2622 get(dnn::isolationChargedHadrCands_sum_pt),
2623 get(dnn::isolationChargedHadrCands_sum_dEta),
2624 get(dnn::isolationChargedHadrCands_sum_dPhi),
2625 get(dnn::isolationChargedHadrCands_sum_mass),
2626 get(dnn::isolationChargedHadrCands_nTotal));
2630 tau.isolationNeutrHadrCands(),
2631 isolationNeutrHadrCands_sum,
2632 get(dnn::isolationNeutrHadrCands_sum_pt),
2633 get(dnn::isolationNeutrHadrCands_sum_dEta),
2634 get(dnn::isolationNeutrHadrCands_sum_dPhi),
2635 get(dnn::isolationNeutrHadrCands_sum_mass),
2636 get(dnn::isolationNeutrHadrCands_nTotal));
2640 tau.isolationGammaCands(),
2641 isolationGammaCands_sum,
2642 get(dnn::isolationGammaCands_sum_pt),
2643 get(dnn::isolationGammaCands_sum_dEta),
2644 get(dnn::isolationGammaCands_sum_dPhi),
2645 get(dnn::isolationGammaCands_sum_mass),
2646 get(dnn::isolationGammaCands_nTotal));
2648 get(dnn::tau_visMass_innerSigCone) = (signalGammaCands_sumIn + signalChargedHadrCands_sumIn).mass();
2650 if (check_all_set) {
2651 for (
int var_index = 0; var_index < dnn::NumberOfInputs; ++var_index) {
2652 if (
get(var_index) == default_value_for_set_check)
2653 throw cms::Exception(
"DeepTauId: variable with index = ") << var_index <<
" is not set.";
2662 elecEe = elecEgamma = 0;
2664 if (superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull() &&
2665 superCluster->clusters().isAvailable()) {
2666 for (
auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
2667 const double energy = (*iter)->energy();
2668 if (iter == superCluster->clustersBegin())
2679 template <
typename Cand
idateCollection,
typename TauCastType>
2700 for (
const auto& cand : candidates) {
2701 const double dR =
reco::deltaR(cand->
p4(), tau.leadChargedHadrCand()->p4());
2702 const bool isInside_innerSigCone = dR < innerSigCone_radius;
2703 if (isInside_innerSigCone) {
2704 p4_inner += cand->
p4();
2707 p4_outer += cand->
p4();
2713 dEta_inner = n_inner != 0 ? dEta(p4_inner, tau.p4()) : default_value;
2714 dPhi_inner = n_inner != 0 ? dPhi(p4_inner, tau.p4()) : default_value;
2718 dEta_outer = n_outer != 0 ? dEta(p4_outer, tau.p4()) : default_value;
2719 dPhi_outer = n_outer != 0 ? dPhi(p4_outer, tau.p4()) : default_value;
2723 template <
typename Cand
idateCollection,
typename TauCastType>
2735 for (
const auto& cand : candidates) {
2741 d_eta = n != 0 ? dEta(p4, tau.p4()) : default_value;
2742 d_phi = n != 0 ? dPhi(p4, tau.p4()) : default_value;
2747 static constexpr
double min_pt = 30., min_radius = 0.05, cone_opening_coef = 3.;
2753 template <
typename TauCastType>
2755 const size_t tau_index,
2757 TauFunc tau_funcs) {
2758 if (tau_funcs.getHasSecondaryVertex(tau, tau_index)) {
2759 static constexpr
double mTau = 1.77682;
2760 const double mAOne = tau.p4().M();
2761 const double pAOneMag = tau.p();
2762 const double argumentThetaGJmax = (
std::pow(mTau, 2) -
std::pow(mAOne, 2)) / (2 * mTau * pAOneMag);
2763 const double argumentThetaGJmeasured = tau.p4().Vect().Dot(tau_funcs.getFlightLength(tau, tau_index)) /
2764 (pAOneMag * tau_funcs.getFlightLength(tau, tau_index).R());
2765 if (
std::abs(argumentThetaGJmax) <= 1. &&
std::abs(argumentThetaGJmeasured) <= 1.) {
2766 double thetaGJmax = std::asin(argumentThetaGJmax);
2767 double thetaGJmeasured = std::acos(argumentThetaGJmeasured);
2768 gj_diff = thetaGJmeasured - thetaGJmax;
2775 template <
typename TauCastType>
2777 const size_t tau_index,
2778 TauFunc tau_funcs) {
2781 return static_cast<float>(gj_diff);
2786 const double abs_eta =
std::abs(eta);
2787 return abs_eta > 1.46 && abs_eta < 1.558;
2790 template <
typename TauCastType>
2792 const std::vector<pat::Electron>*
electrons,
2794 const double dR2 = deltaR *
deltaR;
2796 for (
const auto& ele : *electrons) {
2797 if (
reco::deltaR2(tau.p4(), ele.p4()) < dR2 && (!matched_ele || matched_ele->
pt() < ele.pt())) {
float puppiWeight() const
void createConvFeatures(const TauCastType &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, const std::vector< pat::Electron > *electrons, const std::vector< pat::Muon > *muons, const edm::View< reco::Candidate > &pfCands, const CellGrid &grid, TauFunc tau_funcs, bool is_inner)
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
static constexpr float default_value
constexpr double deltaPhi(double phi1, double phi2)
void createMuonBlockInputs(unsigned idx, const TauCastType &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, const std::vector< pat::Muon > *muons, const edm::View< reco::Candidate > &pfCands, const Cell &cell_map, TauFunc tau_funcs, bool is_inner)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
unsigned int n_photons_total(const reco::PFTau &tau)
return total number of pf photon candidates with pT>500 MeV, which are associated to signal ...
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
std::map< BasicDiscriminator, size_t > basicDiscrdR03IndexMap_
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
bool isNonnull() const
Checks for non-null.
static void processIsolationPFComponents(const TauCastType &tau, const CandidateCollection &candidates, LorentzVectorXYZ &p4, float &pt, float &d_eta, float &d_phi, float &m, float &n)
void checkInputs(const tensorflow::Tensor &inputs, const std::string &block_name, int n_inputs, const CellGrid *grid=nullptr) const
double rawEcalEnergy() const
return corrected Ecal energy
static std::unique_ptr< deep_tau::DeepTauCache > initializeGlobalCache(const edm::ParameterSet &cfg)
double pt() const final
transverse momentum
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
float puppiWeightNoLep() const
Weight from full PUPPI.
static void processSignalPFComponents(const TauCastType &tau, const CandidateCollection &candidates, LorentzVectorXYZ &p4_inner, LorentzVectorXYZ &p4_outer, float &pt_inner, float &dEta_inner, float &dPhi_inner, float &m_inner, float &pt_outer, float &dEta_outer, float &dPhi_outer, float &m_outer, float &n_inner, float &n_outer)
float pt_weighted_dr_signal(const reco::PFTau &tau, int dm)
float hcalEnergyLeadChargedHadrCand() const
return hcal energy from LeadChargedHadrCand
float hcalFraction() const
const bool disable_dxy_pca_
static float getValueLinear(T value, float min_value, float max_value, bool positive)
static const pat::Electron * findMatchedElectron(const TauCastType &tau, const std::vector< pat::Electron > *electrons, double deltaR)
constexpr bool isNotFinite(T x)
void createHadronsBlockInputs(unsigned idx, const TauCastType &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, const edm::View< reco::Candidate > &pfCands, const Cell &cell_map, TauFunc tau_funcs, bool is_inner)
void fillGrids(const TauCastType &tau, const Collection &objects, CellGrid &inner_grid, CellGrid &outer_grid)
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > zeroOutputTensor_
std::map< BasicDiscriminator, size_t > basicDiscrIndexMap_
const reco::Track * bestTrack() const override
#define DEFINE_FWK_MODULE(type)
const DeepTauCache * cache_
float dzError() const override
uncertainty on dz
tuple disable_hcalFraction_workaround
static double getInnerSignalConeRadius(double pt)
std::ofstream * json_file_
const tensorflow::GraphDef & getGraph(const std::string &name="") const
static bool isAbove(double value, double min)
static bool isInEcalCrack(double eta)
std::string to_string(const V &value)
void setCellConvFeatures(tensorflow::Tensor &convTensor, const tensorflow::Tensor &features, unsigned batch_idx, int eta_index, int phi_index)
float tauID(const std::string &name) const
reco::SuperClusterRef superCluster() const override
override the reco::GsfElectron::superCluster method, to access the internal storage of the superclust...
void countMatches(const reco::Muon &muon, std::vector< int > &numMatchesDT, std::vector< int > &numMatchesCSC, std::vector< int > &numMatchesRPC)
int pdgId() const override
PDG identifier.
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
edm::RefProd< PFTauCollection > PFTauRefProd
references to PFTau collection
const std::map< ValueQuantityType, double > min_value
tensorflow::Tensor createInputsV1(const TauCastType &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const std::vector< pat::Electron > *electrons, const std::vector< pat::Muon > *muons, TauFunc tau_funcs) const
const Point & position() const
position
std::map< std::string, Output > OutputCollection
static const double deltaEta
static const OutputCollection & GetOutputs()
static std::string const input
static const std::vector< BasicDiscriminator > requiredBasicDiscriminatorsdR03_
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > convTensor_
DeepTauId(const edm::ParameterSet &cfg, const deep_tau::DeepTauCache *cache)
OutputCollection outputs_
tuple disable_CellIndex_workaround
std::string output_layer_
static constexpr float pi
static float getValue(T value)
const PVAssociationQuality pvAssociationQuality() const
std::vector< float > features(const reco::PreId &ecal, const reco::PreId &hcal, double rho, const reco::BeamSpot &spot, noZS::EcalClusterLazyTools &ecalTools)
float pt_weighted_deta_strip(const reco::PFTau &tau, int dm)
const PVAssoc fromPV(size_t ipv=0) const
reco::TrackRef outerTrack() const override
reference to Track reconstructed in the muon detector only (reimplemented from reco::Muon) ...
float dzError() const override
uncertainty on dz
const pat::tau::TauPFEssential::Vector & flightLength() const
const std::map< BasicDiscriminator, size_t > matchDiscriminatorIndices(edm::Event &event, edm::EDGetTokenT< reco::TauDiscriminatorContainer > discriminatorContainerToken, std::vector< BasicDiscriminator > requiredDiscr)
ParameterSet const & parameterSet(StableProvenance const &provenance, ProcessHistory const &history)
LostInnerHits lostInnerHits() const
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
void saveInputs(const tensorflow::Tensor &inputs, const std::string &block_name, int n_inputs, const CellGrid *grid=nullptr)
const bool disable_CellIndex_workaround_
float ecalEnergyLeadChargedHadrCand() const
static float getValueNorm(T value, float mean, float sigma, float n_sigmas_max=5)
T get() const
get a component
Abs< T >::type abs(const T &t)
float pt_weighted_dr_iso(const reco::PFTau &tau, int dm)
T operator[](int i) const
virtual const reco::Track & pseudoTrack() const
void createEgammaBlockInputs(unsigned idx, const TauCastType &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, const std::vector< pat::Electron > *electrons, const edm::View< reco::Candidate > &pfCands, const Cell &cell_map, TauFunc tau_funcs, bool is_inner)
static void globalEndJob(const deep_tau::DeepTauCache *cache_)
bool hasSecondaryVertex() const
static const std::vector< BasicDiscriminator > requiredBasicDiscriminators_
DeepTauBase(const edm::ParameterSet &cfg, const OutputCollection &outputs, const DeepTauCache *cache)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const_reference_type get(ProductID id, size_t idx) const
int numberOfPixelHits() const
Analysis-level tau class.
float rawHcalFraction() const
Set the fraction of Hcal needed isolated charged hadrons.
bool hasTrackDetails() const
Return true if a bestTrack can be extracted from this Candidate.
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
tensorflow::Tensor getPredictions(edm::Event &event, edm::Handle< TauCollection > taus) override
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
bool isTauIDAvailable(const std::string &name) const
Returns true if a specific ID is available in this pat::Tau.
virtual int pdgId() const =0
PDG identifier.
caConstants::TupleMultiplicity const CAHitNtupletGeneratorKernelsGPU::HitToTuple const cms::cuda::AtomicPairCounter GPUCACell const *__restrict__ cells
tensorflow::Tensor getPartialPredictions(bool is_inner)
const pat::tau::TauPFEssential::Point & dxy_PCA() const
static bool calculateGottfriedJacksonAngleDifference(const TauCastType &tau, const size_t tau_index, double &gj_diff, TauFunc tau_funcs)
edm::EDGetTokenT< edm::AssociationVector< reco::PFTauRefProd, std::vector< reco::PFTauTransverseImpactParameterRef > > > pfTauTransverseImpactParameters_token_
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
edm::ValueMap< SingleTauDiscriminatorContainer > TauDiscriminatorContainer
void createTauBlockInputs(const TauCastType &tau, const size_t &tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, TauFunc tau_funcs)
float pt_weighted_dphi_strip(const reco::PFTau &tau, int dm)
void getPredictionsV2(TauCollection::const_reference &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const std::vector< pat::Electron > *electrons, const std::vector< pat::Muon > *muons, const edm::View< reco::Candidate > &pfCands, const reco::Vertex &pv, double rho, std::vector< tensorflow::Tensor > &pred_vector, TauFunc tau_funcs)
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
float eratio(const reco::PFTau &tau)
return ratio of energy in ECAL over sum of energy in ECAL and HCAL
uint8_t andPrediscriminants_
T getParameter(std::string const &) const
Analysis-level electron class.
std::vector< MuonChamberMatch > & matches()
get muon matching information
void add(std::string const &label, ParameterSetDescription const &psetDescription)
caConstants::TupleMultiplicity const CAHitNtupletGeneratorKernelsGPU::HitToTuple const cms::cuda::AtomicPairCounter GPUCACell const *__restrict__ uint32_t const *__restrict__ gpuPixelDoublets::CellNeighborsVector const gpuPixelDoublets::CellTracksVector const GPUCACell::OuterHitOfCell const int32_t nHits
edm::Ref< PFTauTransverseImpactParameterCollection > PFTauTransverseImpactParameterRef
presistent reference to a PFTauTransverseImpactParameter
static const std::map< BasicDiscriminator, std::string > stringFromDiscriminator_
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminators_inputToken_
int numberOfLostHits(HitCategory category) const
float emFraction_MVA() const
return emFraction_MVA
bool operator<(DTCELinkId const &lhs, DTCELinkId const &rhs)
float rawCaloFraction() const
static float calculateGottfriedJacksonAngleDifference(const TauCastType &tau, const size_t tau_index, TauFunc tau_funcs)
static bool calculateElectronClusterVarsV2(const pat::Electron &ele, float &cc_ele_energy, float &cc_gamma_energy, int &cc_n_gamma)
Particle reconstructed by the particle flow algorithm.
float flightLengthSig() const
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
const bool disable_hcalFraction_workaround_
float leadingTrackNormChi2() const
return normalized chi2 of leading track
tuple pfTauTransverseImpactParameters
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminatorsdR03_inputToken_
const std::map< ValueQuantityType, double > max_value
const_reference at(size_type pos) const
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
float lead_track_chi2(const reco::PFTau &tau)
return chi2 of the leading track ==> deprecated? <==
std::vector< TauDiscInfo< pat::PATTauDiscriminator > > patPrediscriminants_
const PFCandidatePtr leadPFChargedHadrCand() const
Getters for different PFCandidates for PFTaus made from PFCandidates.
tuple basicTauDiscriminators
constexpr char Electron[]
Log< level::Warning, false > LogWarning
float etaAtEcalEntranceLeadChargedCand() const
return etaAtEcalEntrance from LeadChargedCand
virtual float dxy() const
dxy with respect to the PV ref
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
edm::EDGetTokenT< std::vector< pat::Electron > > electrons_token_
edm::EDGetTokenT< std::vector< pat::Muon > > muons_token_
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
tuple basicTauDiscriminatorsdR03
edm::EDGetTokenT< double > rho_token_
bool isIsolatedChargedHadron() const
static void calculateElectronClusterVars(const pat::Electron *ele, float &elecEe, float &elecEgamma)
T const & const_reference
static const std::string subdets[7]
edm::EDGetTokenT< CandidateCollection > pfcandToken_
void getPredictionsV1(TauCollection::const_reference &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const std::vector< pat::Electron > *electrons, const std::vector< pat::Muon > *muons, std::vector< tensorflow::Tensor > &pred_vector, TauFunc tau_funcs)
Analysis-level muon class.
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double >> LorentzVectorXYZ
std::vector< TauDiscInfo< reco::PFTauDiscriminator > > recoPrediscriminants_
tuple size
Write out results.
void countHits(const reco::Muon &muon, std::vector< int > &numHitsDT, std::vector< int > &numHitsCSC, std::vector< int > &numHitsRPC)
Power< A, B >::type pow(const A &a, const B &b)
double rawHcalEnergy() const
return raw Hcal energy
constexpr int NumberOfOutputs
std::unique_ptr< tensorflow::Tensor > tauBlockTensor_
tensorflow::Session & getSession(const std::string &name="") const
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector
double energy() const final
energy
edm::EDGetTokenT< reco::VertexCollection > vtxToken_