10 #include <Math/VectorUtil.h> 14 #include "tensorflow/core/util/memmapped_file_system.h" 38 #include "oneapi/tbb/concurrent_unordered_set.h" 53 bool simple_value =
false;
57 simple_value = (
pos == cut_str.size());
58 }
catch (std::invalid_argument&) {
59 }
catch (std::out_of_range&) {
63 "[&](double *x, double *p) { const int decayMode = p[0];" 64 "const double pt = p[1]; const double eta = p[2];";
65 static const int n_params = 3;
66 static const auto handler = [](
int, Bool_t,
const char*,
const char*) ->
void {};
69 if (cut_str.find(
"return") == std::string::npos)
70 fn_str +=
" return " + cut_str +
";}";
72 fn_str += cut_str +
"}";
73 auto old_handler = SetErrorHandler(handler);
74 fn_ = std::make_unique<TF1>(
"fn_", fn_str.c_str(), 0, 1, n_params);
75 SetErrorHandler(old_handler);
77 throw cms::Exception(
"TauWPThreshold: invalid formula") <<
"Invalid WP cut formula = '" << cut_str <<
"'.";
86 fn_->SetParameter(0, dynamic_cast<const reco::PFTau&>(
tau).
decayMode());
89 fn_->SetParameter(1,
tau.pt());
90 fn_->SetParameter(2,
tau.eta());
95 std::unique_ptr<TF1>
fn_;
101 using GraphPtr = std::shared_ptr<tensorflow::GraphDef>;
104 for (
const auto& graph_entry : graph_names) {
113 if (!mmap_status.ok()) {
114 throw cms::Exception(
"DeepTauCache: unable to initalize memmapped environment for ")
116 << mmap_status.ToString();
119 graphs_[entry_name] = std::make_unique<tensorflow::GraphDef>();
122 tensorflow::MemmappedFileSystem::kMemmappedPackageDefaultGraphDef,
124 if (!load_graph_status.ok())
126 << load_graph_status.ToString();
128 options.getSessionOptions().config.mutable_graph_options()->mutable_optimizer_options()->set_opt_level(
129 ::tensorflow::OptimizerOptions::L0);
153 std::map<std::string, std::unique_ptr<tensorflow::MemmappedEnv>>
memmappedEnv_;
162 constexpr
int number_of_inner_cell = 11;
163 constexpr
int number_of_outer_cell = 21;
164 constexpr
int number_of_conv_features = 64;
165 namespace TauBlockInputs {
174 tau_n_charged_prongs,
175 tau_n_neutral_prongs,
177 chargedIsoPtSumdR03_over_dR05,
180 neutralIsoPtSumWeight_over_neutralIsoPtSum,
181 neutralIsoPtSumWeightdR03_over_neutralIsoPtSum,
182 neutralIsoPtSumdR03_over_dR05,
183 photonPtSumOutsideSignalCone,
200 tau_flightLength_sig,
201 tau_pt_weighted_deta_strip,
202 tau_pt_weighted_dphi_strip,
203 tau_pt_weighted_dr_signal,
204 tau_pt_weighted_dr_iso,
205 tau_leadingTrackNormChi2,
208 tau_gj_angle_diff_valid,
212 tau_inside_ecal_crack,
213 leadChargedCand_etaAtEcalEntrance_minus_tau_eta,
216 std::vector<int> varsToDrop = {
217 tau_phi, tau_dxy_pca_x, tau_dxy_pca_y, tau_dxy_pca_z};
220 namespace EgammaBlockInputs {
225 tau_inside_ecal_crack,
230 pfCand_ele_pvAssociationQuality,
231 pfCand_ele_puppiWeight,
233 pfCand_ele_lostInnerHits,
234 pfCand_ele_numberOfPixelHits,
235 pfCand_ele_vertex_dx,
236 pfCand_ele_vertex_dy,
237 pfCand_ele_vertex_dz,
238 pfCand_ele_vertex_dx_tauFL,
239 pfCand_ele_vertex_dy_tauFL,
240 pfCand_ele_vertex_dz_tauFL,
241 pfCand_ele_hasTrackDetails,
246 pfCand_ele_track_chi2_ndof,
247 pfCand_ele_track_ndof,
253 ele_cc_ele_rel_energy,
254 ele_cc_gamma_rel_energy,
256 ele_rel_trackMomentumAtVtx,
257 ele_rel_trackMomentumAtCalo,
258 ele_rel_trackMomentumOut,
259 ele_rel_trackMomentumAtEleClus,
260 ele_rel_trackMomentumAtVtxWithConstraint,
263 ele_eSuperClusterOverP,
264 ele_eSeedClusterOverP,
265 ele_eSeedClusterOverPout,
266 ele_eEleClusterOverPout,
267 ele_deltaEtaSuperClusterTrackAtVtx,
268 ele_deltaEtaSeedClusterTrackAtCalo,
269 ele_deltaEtaEleClusterTrackAtCalo,
270 ele_deltaPhiEleClusterTrackAtCalo,
271 ele_deltaPhiSuperClusterTrackAtVtx,
272 ele_deltaPhiSeedClusterTrackAtCalo,
273 ele_mvaInput_earlyBrem,
274 ele_mvaInput_lateBrem,
275 ele_mvaInput_sigmaEtaEta,
276 ele_mvaInput_hadEnergy,
277 ele_mvaInput_deltaEta,
278 ele_gsfTrack_normalizedChi2,
279 ele_gsfTrack_numberOfValidHits,
282 ele_has_closestCtfTrack,
283 ele_closestCtfTrack_normalizedChi2,
284 ele_closestCtfTrack_numberOfValidHits,
289 pfCand_gamma_pvAssociationQuality,
291 pfCand_gamma_puppiWeight,
292 pfCand_gamma_puppiWeightNoLep,
293 pfCand_gamma_lostInnerHits,
294 pfCand_gamma_numberOfPixelHits,
295 pfCand_gamma_vertex_dx,
296 pfCand_gamma_vertex_dy,
297 pfCand_gamma_vertex_dz,
298 pfCand_gamma_vertex_dx_tauFL,
299 pfCand_gamma_vertex_dy_tauFL,
300 pfCand_gamma_vertex_dz_tauFL,
301 pfCand_gamma_hasTrackDetails,
303 pfCand_gamma_dxy_sig,
306 pfCand_gamma_track_chi2_ndof,
307 pfCand_gamma_track_ndof,
312 namespace MuonBlockInputs {
317 tau_inside_ecal_crack,
322 pfCand_muon_pvAssociationQuality,
324 pfCand_muon_puppiWeight,
326 pfCand_muon_lostInnerHits,
327 pfCand_muon_numberOfPixelHits,
328 pfCand_muon_vertex_dx,
329 pfCand_muon_vertex_dy,
330 pfCand_muon_vertex_dz,
331 pfCand_muon_vertex_dx_tauFL,
332 pfCand_muon_vertex_dy_tauFL,
333 pfCand_muon_vertex_dz_tauFL,
334 pfCand_muon_hasTrackDetails,
339 pfCand_muon_track_chi2_ndof,
340 pfCand_muon_track_ndof,
347 muon_normalizedChi2_valid,
349 muon_numberOfValidHits,
350 muon_segmentCompatibility,
351 muon_caloCompatibility,
352 muon_pfEcalEnergy_valid,
353 muon_rel_pfEcalEnergy,
358 muon_n_matches_CSC_1,
359 muon_n_matches_CSC_2,
360 muon_n_matches_CSC_3,
361 muon_n_matches_CSC_4,
362 muon_n_matches_RPC_1,
363 muon_n_matches_RPC_2,
364 muon_n_matches_RPC_3,
365 muon_n_matches_RPC_4,
382 namespace HadronBlockInputs {
387 tau_inside_ecal_crack,
392 pfCand_chHad_leadChargedHadrCand,
393 pfCand_chHad_pvAssociationQuality,
395 pfCand_chHad_puppiWeight,
396 pfCand_chHad_puppiWeightNoLep,
398 pfCand_chHad_lostInnerHits,
399 pfCand_chHad_numberOfPixelHits,
400 pfCand_chHad_vertex_dx,
401 pfCand_chHad_vertex_dy,
402 pfCand_chHad_vertex_dz,
403 pfCand_chHad_vertex_dx_tauFL,
404 pfCand_chHad_vertex_dy_tauFL,
405 pfCand_chHad_vertex_dz_tauFL,
406 pfCand_chHad_hasTrackDetails,
408 pfCand_chHad_dxy_sig,
411 pfCand_chHad_track_chi2_ndof,
412 pfCand_chHad_track_ndof,
413 pfCand_chHad_hcalFraction,
414 pfCand_chHad_rawCaloFraction,
419 pfCand_nHad_puppiWeight,
420 pfCand_nHad_puppiWeightNoLep,
421 pfCand_nHad_hcalFraction,
428 static tbb::concurrent_unordered_set<std::string> isFirstWarning;
434 <<
"Exception in <getTauID>: No tauID '" <<
tauID <<
"' available in pat::Tau given as function argument.";
436 if (isFirstWarning.insert(
tauID).second) {
438 <<
"' available in pat::Tau given as function argument." 439 <<
" Using default_value = " << default_value <<
" instead." << std::endl;
441 return default_value;
452 std::map<BasicDiscr, size_t> indexMap;
453 std::map<BasicDiscr, size_t> indexMapdR03;
459 return getTauID(
tau,
"chargedIsoPtSum");
465 return getTauID(
tau,
"chargedIsoPtSumdR03");
468 return (*basicTauDiscriminatordR03Collection)[tau_ref].rawValues.at(
472 return getTauID(
tau,
"footprintCorrectiondR03");
475 return getTauID(
tau,
"footprintCorrection");
481 return getTauID(
tau,
"neutralIsoPtSum");
487 return getTauID(
tau,
"neutralIsoPtSumdR03");
493 return getTauID(
tau,
"neutralIsoPtSumWeight");
497 return (*basicTauDiscriminatordR03Collection)[tau_ref].rawValues.at(
501 return getTauID(
tau,
"neutralIsoPtSumWeightdR03");
503 const float getPhotonPtSumOutsideSignalCone(
const reco::PFTau&
tau,
505 return (*basicTauDiscriminatorCollection)[tau_ref].rawValues.at(
508 const float getPhotonPtSumOutsideSignalCone(
const pat::Tau&
tau,
510 return getTauID(
tau,
"photonPtSumOutsideSignalCone");
512 const float getPhotonPtSumOutsideSignalConedR03(
const reco::PFTau&
tau,
514 return (*basicTauDiscriminatordR03Collection)[tau_ref].rawValues.at(
517 const float getPhotonPtSumOutsideSignalConedR03(
const pat::Tau&
tau,
519 return getTauID(
tau,
"photonPtSumOutsideSignalConedR03");
525 return getTauID(
tau,
"puCorrPtSum");
528 auto getdxyPCA(
const reco::PFTau&
tau,
const size_t tau_index)
const {
531 auto getdxyPCA(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.dxy_PCA(); }
532 auto getdxy(
const reco::PFTau&
tau,
const size_t tau_index)
const {
535 auto getdxy(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.dxy(); }
536 auto getdxyError(
const reco::PFTau&
tau,
const size_t tau_index)
const {
539 auto getdxyError(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.dxy_error(); }
540 auto getdxySig(
const reco::PFTau&
tau,
const size_t tau_index)
const {
543 auto getdxySig(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.dxy_Sig(); }
544 auto getip3d(
const reco::PFTau&
tau,
const size_t tau_index)
const {
547 auto getip3d(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.ip3d(); }
548 auto getip3dError(
const reco::PFTau&
tau,
const size_t tau_index)
const {
551 auto getip3dError(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.ip3d_error(); }
552 auto getip3dSig(
const reco::PFTau&
tau,
const size_t tau_index)
const {
555 auto getip3dSig(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.ip3d_Sig(); }
556 auto getHasSecondaryVertex(
const reco::PFTau&
tau,
const size_t tau_index)
const {
559 auto getHasSecondaryVertex(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.hasSecondaryVertex(); }
560 auto getFlightLength(
const reco::PFTau&
tau,
const size_t tau_index)
const {
563 auto getFlightLength(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.flightLength(); }
564 auto getFlightLengthSig(
const reco::PFTau&
tau,
const size_t tau_index)
const {
567 auto getFlightLengthSig(
const pat::Tau&
tau,
const size_t tau_index)
const {
return tau.flightLengthSig(); }
570 auto getLeadingTrackNormChi2(
const pat::Tau&
tau) {
return tau.leadingTrackNormChi2(); }
571 auto getEmFraction(
const pat::Tau&
tau) {
return tau.emFraction_MVA(); }
573 auto getEtaAtEcalEntrance(
const pat::Tau&
tau) {
return tau.etaAtEcalEntranceLeadChargedCand(); }
575 return tau.leadPFChargedHadrCand()->positionAtECALEntrance().eta();
577 auto getEcalEnergyLeadingChargedHadr(
const reco::PFTau&
tau) {
return tau.leadPFChargedHadrCand()->ecalEnergy(); }
578 auto getEcalEnergyLeadingChargedHadr(
const pat::Tau&
tau) {
return tau.ecalEnergyLeadChargedHadrCand(); }
579 auto getHcalEnergyLeadingChargedHadr(
const reco::PFTau&
tau) {
return tau.leadPFChargedHadrCand()->hcalEnergy(); }
580 auto getHcalEnergyLeadingChargedHadr(
const pat::Tau&
tau) {
return tau.hcalEnergyLeadChargedHadrCand(); }
582 template <
typename PreDiscrType>
583 bool passPrediscriminants(
const PreDiscrType prediscriminants,
584 const size_t andPrediscriminants,
586 bool passesPrediscriminants = (andPrediscriminants ? 1 : 0);
588 size_t nPrediscriminants = prediscriminants.size();
589 for (
size_t iDisc = 0; iDisc < nPrediscriminants; ++iDisc) {
591 double discResult = (*prediscriminants[iDisc].handle)[tau_ref];
592 uint8_t thisPasses = (discResult > prediscriminants[iDisc].cut) ? 1 : 0;
609 if (thisPasses ^ andPrediscriminants)
611 passesPrediscriminants = (andPrediscriminants ? 0 : 1);
615 return passesPrediscriminants;
623 return cand.bestTrack() !=
nullptr && std::isnormal(
cand.bestTrack()->dz()) && std::isnormal(
cand.dzError()) &&
627 return cand.hasTrackDetails() && std::isnormal(
cand.dz()) && std::isnormal(
cand.dzError()) &&
cand.dzError() > 0;
637 return cand.puppiWeightNoLep();
640 return cand.bestTrack() !=
nullptr 646 return cand.bestTrack() !=
nullptr 651 return cand.numberOfPixelHits();
660 return cand.rawHcalEnergy() / (
cand.rawHcalEnergy() +
cand.rawEcalEnergy());
663 float hcal_fraction = 0.;
667 hcal_fraction =
cand.hcalFraction();
670 if (
cand.pdgId() == 1 ||
cand.pdgId() == 130) {
671 hcal_fraction =
cand.hcalFraction();
672 }
else if (
cand.isIsolatedChargedHadron()) {
673 hcal_fraction =
cand.rawHcalFraction();
676 return hcal_fraction;
679 return (
cand.rawEcalEnergy() +
cand.rawHcalEnergy()) /
cand.energy();
684 template <
typename LVector1,
typename LVector2>
685 float dEta(
const LVector1& p4,
const LVector2& tau_p4) {
686 return static_cast<float>(p4.eta() - tau_p4.eta());
689 template <
typename LVector1,
typename LVector2>
690 float dPhi(
const LVector1& p4_1,
const LVector2& p4_2) {
691 return static_cast<float>(
reco::deltaPhi(p4_2.phi(), p4_1.phi()));
694 struct MuonHitMatchV2 {
695 static constexpr
size_t n_muon_stations = 4;
696 static constexpr
int first_station_id = 1;
697 static constexpr
int last_station_id = first_station_id + n_muon_stations - 1;
698 using CountArray = std::array<unsigned, n_muon_stations>;
699 using CountMap = std::map<int, CountArray>;
701 const std::vector<int>& consideredSubdets() {
707 static const std::map<int, std::string> subdet_names = {
709 if (!subdet_names.count(subdet))
710 throw cms::Exception(
"MuonHitMatch") <<
"Subdet name for subdet id " << subdet <<
" not found.";
711 return subdet_names.at(subdet);
714 size_t getStationIndex(
int station,
bool throw_exception)
const {
715 if (station < first_station_id || station > last_station_id) {
717 throw cms::Exception(
"MuonHitMatch") <<
"Station id is out of range";
720 return static_cast<size_t>(
station - 1);
724 for (
int subdet : consideredSubdets()) {
725 n_matches[subdet].fill(0);
726 n_hits[subdet].fill(0);
734 for (
const auto& segment :
muon.matches()) {
735 if (segment.segmentMatches.empty() && segment.rpcMatches.empty())
737 if (n_matches.count(segment.detector())) {
738 const size_t station_index = getStationIndex(segment.station(),
true);
739 ++n_matches.at(segment.detector()).at(station_index);
745 if (
muon.outerTrack().isNonnull()) {
746 const auto& hit_pattern =
muon.outerTrack()->hitPattern();
753 const size_t station_index = getStationIndex(hit_pattern.getMuonStation(hit_id),
false);
754 if (station_index < n_muon_stations) {
755 CountArray* muon_n_hits =
nullptr;
756 if (hit_pattern.muonDTHitFilter(hit_id))
758 else if (hit_pattern.muonCSCHitFilter(hit_id))
760 else if (hit_pattern.muonRPCHitFilter(hit_id))
764 ++muon_n_hits->at(station_index);
771 unsigned nMatches(
int subdet,
int station)
const {
772 if (!n_matches.count(subdet))
773 throw cms::Exception(
"MuonHitMatch") <<
"Subdet " << subdet <<
" not found.";
774 const size_t station_index = getStationIndex(
station,
true);
775 return n_matches.at(subdet).at(station_index);
779 if (!n_hits.count(subdet))
780 throw cms::Exception(
"MuonHitMatch") <<
"Subdet " << subdet <<
" not found.";
781 const size_t station_index = getStationIndex(
station,
true);
782 return n_hits.at(subdet).at(station_index);
785 unsigned countMuonStationsWithMatches(
int first_station,
int last_station)
const {
786 static const std::map<int, std::vector<bool>> masks = {
791 const size_t first_station_index = getStationIndex(first_station,
true);
792 const size_t last_station_index = getStationIndex(last_station,
true);
794 for (
size_t n = first_station_index;
n <= last_station_index; ++
n) {
795 for (
const auto&
match : n_matches) {
796 if (!masks.at(
match.first).at(
n) &&
match.second.at(
n) > 0)
803 unsigned countMuonStationsWithHits(
int first_station,
int last_station)
const {
804 static const std::map<int, std::vector<bool>> masks = {
810 const size_t first_station_index = getStationIndex(first_station,
true);
811 const size_t last_station_index = getStationIndex(last_station,
true);
813 for (
size_t n = first_station_index;
n <= last_station_index; ++
n) {
814 for (
const auto&
hit : n_hits) {
815 if (!masks.at(
hit.first).at(
n) &&
hit.second.at(
n) > 0)
823 CountMap n_matches, n_hits;
829 PfCand_chargedHadron,
830 PfCand_neutralHadron,
837 template <
typename Object>
850 static const std::map<int, CellObjectType> obj_types = {{11, CellObjectType::PfCand_electron},
851 {13, CellObjectType::PfCand_muon},
852 {22, CellObjectType::PfCand_gamma},
853 {130, CellObjectType::PfCand_neutralHadron},
854 {211, CellObjectType::PfCand_chargedHadron}};
857 if (iter == obj_types.end())
858 return CellObjectType::Other;
862 using Cell = std::map<CellObjectType, size_t>;
875 using Map = std::map<CellIndex, Cell>;
876 using const_iterator = Map::const_iterator;
878 CellGrid(
unsigned n_cells_eta,
879 unsigned n_cells_phi,
880 double cell_size_eta,
881 double cell_size_phi,
883 : nCellsEta(n_cells_eta),
884 nCellsPhi(n_cells_phi),
885 nTotal(nCellsEta * nCellsPhi),
886 cellSizeEta(cell_size_eta),
887 cellSizePhi(cell_size_phi),
889 if (nCellsEta % 2 != 1 || nCellsEta < 1)
890 throw cms::Exception(
"DeepTauId") <<
"Invalid number of eta cells.";
891 if (nCellsPhi % 2 != 1 || nCellsPhi < 1)
892 throw cms::Exception(
"DeepTauId") <<
"Invalid number of phi cells.";
893 if (cellSizeEta <= 0 || cellSizePhi <= 0)
897 int maxEtaIndex()
const {
return static_cast<int>((nCellsEta - 1) / 2); }
898 int maxPhiIndex()
const {
return static_cast<int>((nCellsPhi - 1) / 2); }
899 double maxDeltaEta()
const {
return cellSizeEta * (0.5 + maxEtaIndex()); }
900 double maxDeltaPhi()
const {
return cellSizePhi * (0.5 + maxPhiIndex()); }
901 int getEtaTensorIndex(
const CellIndex& cellIndex)
const {
return cellIndex.eta + maxEtaIndex(); }
902 int getPhiTensorIndex(
const CellIndex& cellIndex)
const {
return cellIndex.phi + maxPhiIndex(); }
904 bool tryGetCellIndex(
double deltaEta,
double deltaPhi, CellIndex& cellIndex)
const {
905 const auto getCellIndex = [
this](
double x,
double maxX,
double size,
int&
index) {
910 if (disable_CellIndex_workaround_) {
913 absIndex = std::floor(absX /
size + 0.5);
918 index =
static_cast<int>(std::copysign(absIndex,
x));
926 size_t num_valid_cells()
const {
return cells.size(); }
928 const Cell& at(
const CellIndex& cellIndex)
const {
return cells.at(cellIndex); }
929 size_t count(
const CellIndex& cellIndex)
const {
return cells.count(cellIndex); }
930 const_iterator
find(
const CellIndex& cellIndex)
const {
return cells.find(cellIndex); }
931 const_iterator
begin()
const {
return cells.begin(); }
932 const_iterator
end()
const {
return cells.end(); }
935 const unsigned nCellsEta, nCellsPhi, nTotal;
936 const double cellSizeEta, cellSizePhi;
939 std::map<CellIndex, Cell>
cells;
940 const bool disable_CellIndex_workaround_;
964 const tensorflow::Tensor& pred,
967 std::vector<reco::SingleTauDiscriminatorContainer> outputbuffer(
taus->size());
969 for (
size_t tau_index = 0; tau_index <
taus->size(); ++tau_index) {
971 for (
size_t num_elem :
num_)
972 x += pred.matrix<
float>()(tau_index, num_elem);
973 if (
x != 0 && !
den_.empty()) {
975 for (
size_t den_elem :
den_)
976 den_val += pred.matrix<
float>()(tau_index, den_elem);
979 outputbuffer[tau_index].rawValues.push_back(
x);
983 outputbuffer[tau_index].workingPoints.push_back(pass);
987 std::unique_ptr<TauDiscriminator>
output = std::make_unique<TauDiscriminator>();
989 filler.insert(
taus, outputbuffer.begin(), outputbuffer.end());
1000 static constexpr
size_t e_index = 0, mu_index = 1, tau_index = 2, jet_index = 3;
1002 {
"VSe",
Output({tau_index}, {e_index, tau_index})},
1003 {
"VSmu",
Output({tau_index}, {mu_index, tau_index})},
1004 {
"VSjet",
Output({tau_index}, {jet_index, tau_index})},
1014 std::vector<BasicDiscriminator> requiredDiscr) {
1015 std::map<std::string, size_t> discrIndexMapStr;
1016 auto const aHandle =
event.getHandle(discriminatorContainerToken);
1017 auto const aProv = aHandle.provenance();
1018 if (aProv ==
nullptr)
1019 aHandle.whyFailed()->raise();
1020 const auto& psetsFromProvenance =
edm::parameterSet(aProv->stable(),
event.processHistory());
1021 auto const idlist = psetsFromProvenance.
getParameter<std::vector<edm::ParameterSet>>(
"IDdefinitions");
1022 for (
size_t j = 0;
j < idlist.size(); ++
j) {
1024 if (discrIndexMapStr.count(idname)) {
1026 <<
"basic discriminator " << idname <<
" appears more than once in the input.";
1028 discrIndexMapStr[idname] =
j;
1032 std::map<BasicDiscriminator, size_t> discrIndexMap;
1033 for (
size_t i = 0;
i < requiredDiscr.size();
i++) {
1036 <<
" was not provided in the config file.";
1040 return discrIndexMap;
1051 desc.add<std::vector<std::string>>(
"graph_file",
1052 {
"RecoTauTag/TrainingFiles/data/DeepTauId/deepTau_2017v2p6_e6.pb"});
1053 desc.add<
bool>(
"mem_mapped",
false);
1054 desc.add<
unsigned>(
"year", 2017);
1055 desc.add<
unsigned>(
"version", 2);
1056 desc.add<
unsigned>(
"sub_version", 1);
1057 desc.add<
int>(
"debug_level", 0);
1058 desc.add<
bool>(
"disable_dxy_pca",
false);
1059 desc.add<
bool>(
"disable_hcalFraction_workaround",
false);
1060 desc.add<
bool>(
"disable_CellIndex_workaround",
false);
1061 desc.add<
bool>(
"save_inputs",
false);
1062 desc.add<
bool>(
"is_online",
false);
1064 desc.add<std::vector<std::string>>(
"VSeWP", {
"-1."});
1065 desc.add<std::vector<std::string>>(
"VSmuWP", {
"-1."});
1066 desc.add<std::vector<std::string>>(
"VSjetWP", {
"-1."});
1074 pset_Prediscriminants.
add<
std::string>(
"BooleanOperator",
"and");
1077 psd1.
add<
double>(
"cut");
1084 descriptions.
add(
"DeepTau",
desc);
1099 cfg.getUntrackedParameter<
edm::
InputTag>(
"basicTauDiscriminators"))),
1101 cfg.getUntrackedParameter<
edm::
InputTag>(
"basicTauDiscriminatorsdR03"))),
1104 cfg.getParameter<
edm::
InputTag>(
"pfTauTransverseImpactParameters"))),
1105 year_(
cfg.getParameter<unsigned>(
"year")),
1115 for (
const auto& output_desc :
outputs_) {
1116 produces<TauDiscriminator>(output_desc.first);
1117 const auto& cut_list =
cfg.getParameter<std::vector<std::string>>(output_desc.first +
"WP");
1119 workingPoints_[output_desc.first].push_back(std::make_unique<Cutter>(cut_str));
1130 transform(pdBoolOperator.begin(), pdBoolOperator.end(), pdBoolOperator.begin(), ::tolower);
1132 if (pdBoolOperator ==
"and") {
1134 }
else if (pdBoolOperator ==
"or") {
1138 <<
"PrediscriminantBooleanOperator defined incorrectly, options are: AND,OR";
1142 std::vector<std::string> prediscriminantsNames =
1145 for (
auto const& iDisc : prediscriminantsNames) {
1153 thisDiscriminator.
cut =
cut;
1154 thisDiscriminator.
disc_token = consumes<reco::PFTauDiscriminator>(
label);
1159 thisDiscriminator.
cut =
cut;
1160 thisDiscriminator.
disc_token = consumes<pat::PATTauDiscriminator>(
label);
1172 tensorflow::DT_FLOAT, tensorflow::TensorShape{1, TauBlockInputs::NumberOfInputs});
1175 std::sort(TauBlockInputs::varsToDrop.begin(), TauBlockInputs::varsToDrop.
end());
1176 for (
auto v : TauBlockInputs::varsToDrop) {
1178 for (std::size_t
i =
v + 1;
i < TauBlockInputs::NumberOfInputs; ++
i)
1182 tensorflow::DT_FLOAT,
1183 tensorflow::TensorShape{1,
1184 static_cast<int>(TauBlockInputs::NumberOfInputs) -
1185 static_cast<int>(TauBlockInputs::varsToDrop.
size())});
1186 if (
year_ == 2026) {
1194 std::map<std::vector<bool>, std::vector<sc::FeatureT>> GridFeatureTypes_map = {
1195 {{
false}, {sc::FeatureT::TauFlat, sc::FeatureT::GridGlobal}},
1197 {sc::FeatureT::PfCand_electron,
1198 sc::FeatureT::PfCand_muon,
1199 sc::FeatureT::PfCand_chHad,
1200 sc::FeatureT::PfCand_nHad,
1201 sc::FeatureT::PfCand_gamma,
1206 for (
const auto&
p : GridFeatureTypes_map) {
1207 for (
auto is_inner :
p.first) {
1208 for (
auto featureType :
p.second) {
1209 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(featureType, is_inner));
1210 if (!(sp.mean_.size() == sp.std_.size() && sp.mean_.size() == sp.lim_min_.size() &&
1211 sp.mean_.size() == sp.lim_max_.size()))
1212 throw cms::Exception(
"DeepTauId") <<
"sizes of scaling parameter vectors do not match between each other";
1217 for (
size_t n = 0;
n < 2; ++
n) {
1218 const bool is_inner =
n == 0;
1219 const auto n_cells = is_inner ? number_of_inner_cell : number_of_outer_cell;
1220 eGammaTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1221 tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, EgammaBlockInputs::NumberOfInputs});
1222 muonTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1223 tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, MuonBlockInputs::NumberOfInputs});
1225 tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, HadronBlockInputs::NumberOfInputs});
1226 convTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1227 tensorflow::DT_FLOAT, tensorflow::TensorShape{1, n_cells, n_cells, number_of_conv_features});
1229 tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, number_of_conv_features});
1247 if (
taus->empty()) {
1256 size_t nPrediscriminants =
1258 for (
size_t iDisc = 0; iDisc < nPrediscriminants; ++iDisc) {
1270 if (tauProductID != discKeyId) {
1272 <<
"The tau collection has product ID: " << tauProductID
1273 <<
" but the pre-discriminator is keyed with product ID: " << discKeyId << std::endl;
1282 const auto graph_name_vector =
cfg.getParameter<std::vector<std::string>>(
"graph_file");
1283 std::map<std::string, std::string> graph_names;
1284 for (
const auto&
entry : graph_name_vector) {
1285 const size_t sep_pos =
entry.find(
':');
1287 if (sep_pos != std::string::npos) {
1288 entry_name =
entry.substr(0, sep_pos);
1295 if (graph_names.count(entry_name))
1296 throw cms::Exception(
"DeepTauCache") <<
"Duplicated graph entries";
1300 return std::make_unique<deep_tau::DeepTauCache>(graph_names,
mem_mapped);
1305 template <
typename ConsumeType>
1323 for (
const auto& output_desc :
outputs_) {
1333 template <
typename T>
1335 return std::isnormal(
value) ?
static_cast<float>(
value) : 0.
f;
1338 template <
typename T>
1344 transformed_value = transformed_value * 2 - 1;
1345 return transformed_value;
1348 template <
typename T>
1351 const float norm_value = (fixed_value -
mean) / sigma;
1352 return std::clamp(norm_value, -n_sigmas_max, n_sigmas_max);
1358 float& cc_ele_energy,
1359 float& cc_gamma_energy,
1361 cc_ele_energy = cc_gamma_energy = 0;
1364 if (superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull() &&
1365 superCluster->clusters().isAvailable()) {
1366 for (
auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
1367 const float energy =
static_cast<float>((*iter)->energy());
1368 if (iter == superCluster->clustersBegin())
1371 cc_gamma_energy +=
energy;
1383 const CellGrid*
grid =
nullptr)
const {
1385 std::cout <<
"<checkInputs>: block_name = " << block_name << std::endl;
1386 if (block_name ==
"input_tau") {
1387 for (
int input_index = 0; input_index < n_inputs; ++input_index) {
1388 float input =
inputs.matrix<
float>()(0, input_index);
1391 <<
"in the " << block_name
1392 <<
", input is not finite, i.e. infinite or NaN, for input_index = " << input_index;
1402 if (block_name.find(
"input_inner") != std::string::npos) {
1405 }
else if (block_name.find(
"input_outer") != std::string::npos) {
1410 int eta_phi_index = 0;
1411 for (
int eta = -n_eta;
eta <= n_eta; ++
eta) {
1412 for (
int phi = -n_phi;
phi <= n_phi; ++
phi) {
1413 const CellIndex cell_index{
eta,
phi};
1414 const auto cell_iter =
grid->find(cell_index);
1415 if (cell_iter !=
grid->end()) {
1416 for (
int input_index = 0; input_index < n_inputs; ++input_index) {
1420 <<
"in the " << block_name <<
", input is not finite, i.e. infinite or NaN, for eta = " <<
eta 1421 <<
", phi = " <<
phi <<
", input_index = " << input_index;
1424 std::cout << block_name <<
"[eta = " <<
eta <<
"][phi = " <<
phi <<
"][var = " << input_index
1425 <<
"] = " << std::setprecision(5) <<
std::fixed <<
input << std::endl;
1439 const CellGrid*
grid =
nullptr) {
1441 std::cout <<
"<saveInputs>: block_name = " << block_name << std::endl;
1444 (*json_file_) <<
", ";
1445 (*json_file_) <<
"\"" << block_name <<
"\": [";
1446 if (block_name ==
"input_tau") {
1447 for (
int input_index = 0; input_index < n_inputs; ++input_index) {
1448 float input =
inputs.matrix<
float>()(0, input_index);
1449 if (input_index != 0)
1450 (*json_file_) <<
", ";
1451 (*json_file_) <<
input;
1456 if (block_name.find(
"input_inner") != std::string::npos) {
1459 }
else if (block_name.find(
"input_outer") != std::string::npos) {
1464 int eta_phi_index = 0;
1465 for (
int eta = -n_eta;
eta <= n_eta; ++
eta) {
1467 (*json_file_) <<
", ";
1468 (*json_file_) <<
"[";
1469 for (
int phi = -n_phi;
phi <= n_phi; ++
phi) {
1471 (*json_file_) <<
", ";
1472 (*json_file_) <<
"[";
1473 const CellIndex cell_index{
eta,
phi};
1474 const auto cell_iter =
grid->find(cell_index);
1475 for (
int input_index = 0; input_index < n_inputs; ++input_index) {
1477 if (cell_iter !=
grid->end()) {
1480 if (input_index != 0)
1481 (*json_file_) <<
", ";
1482 (*json_file_) <<
input;
1484 if (cell_iter !=
grid->end()) {
1487 (*json_file_) <<
"]";
1489 (*json_file_) <<
"]";
1492 (*json_file_) <<
"]";
1499 const std::vector<pat::Electron> electron_collection_default;
1500 const std::vector<pat::Muon> muon_collection_default;
1504 pfTauTransverseImpactParameters_default;
1506 const std::vector<pat::Electron>* electron_collection;
1507 const std::vector<pat::Muon>* muon_collection;
1520 electron_collection = &electron_collection_default;
1521 muon_collection = &muon_collection_default;
1551 auto const& eventnr =
event.id().event();
1555 for (
size_t tau_index = 0; tau_index <
taus->size(); ++tau_index) {
1558 std::vector<tensorflow::Tensor> pred_vector;
1560 bool passesPrediscriminants;
1562 passesPrediscriminants = tauIDs.passPrediscriminants<std::vector<TauDiscInfo<reco::PFTauDiscriminator>>>(
1565 passesPrediscriminants = tauIDs.passPrediscriminants<std::vector<TauDiscInfo<pat::PATTauDiscriminator>>>(
1569 if (passesPrediscriminants) {
1572 getPredictionsV2<reco::PFCandidate, reco::PFTau>(
taus->at(tau_index),
1575 electron_collection,
1584 getPredictionsV2<pat::PackedCandidate, pat::Tau>(
taus->at(tau_index),
1587 electron_collection,
1600 const float pred = pred_vector[0].flat<
float>()(
k);
1601 if (!(pred >= 0 && pred <= 1))
1603 <<
"invalid prediction = " << pred <<
" for tau_index = " << tau_index <<
", pred_index = " <<
k;
1604 predictions.matrix<
float>()(tau_index,
k) = pred;
1613 predictions.matrix<
float>()(tau_index,
k) = (
k == 2) ? -1.
f : 2.
f;
1620 template <
typename Cand
idateCastType,
typename TauCastType>
1622 const size_t tau_index,
1624 const std::vector<pat::Electron>*
electrons,
1625 const std::vector<pat::Muon>*
muons,
1630 std::vector<tensorflow::Tensor>& pred_vector,
1631 TauFunc tau_funcs) {
1634 std::cout <<
"<DeepTauId::getPredictionsV2 (moduleLabel = " << moduleDescription().moduleLabel()
1635 <<
")>:" << std::endl;
1636 std::cout <<
" tau: pT = " <<
tau.pt() <<
", eta = " <<
tau.eta() <<
", phi = " <<
tau.phi()
1637 <<
", eventnr = " << eventnr << std::endl;
1642 fillGrids(dynamic_cast<const TauCastType&>(
tau), *
muons, inner_grid, outer_grid);
1643 fillGrids(dynamic_cast<const TauCastType&>(
tau), pfCands, inner_grid, outer_grid);
1645 createTauBlockInputs<CandidateCastType>(
1646 dynamic_cast<const TauCastType&
>(
tau), tau_index, tau_ref,
pv,
rho, tau_funcs);
1648 createConvFeatures<CandidateCastType>(
dynamic_cast<const TauCastType&
>(
tau),
1662 createConvFeatures<CandidateCastType>(
dynamic_cast<const TauCastType&
>(
tau),
1679 json_file_ =
new std::ofstream(json_file_name.data());
1681 (*json_file_) <<
"{";
1684 *
eGammaTensor_[
true],
"input_inner_egamma", dnn_inputs_v2::EgammaBlockInputs::NumberOfInputs, &inner_grid);
1685 saveInputs(*
muonTensor_[
true],
"input_inner_muon", dnn_inputs_v2::MuonBlockInputs::NumberOfInputs, &inner_grid);
1687 *
hadronsTensor_[
true],
"input_inner_hadrons", dnn_inputs_v2::HadronBlockInputs::NumberOfInputs, &inner_grid);
1689 *
eGammaTensor_[
false],
"input_outer_egamma", dnn_inputs_v2::EgammaBlockInputs::NumberOfInputs, &outer_grid);
1690 saveInputs(*
muonTensor_[
false],
"input_outer_muon", dnn_inputs_v2::MuonBlockInputs::NumberOfInputs, &outer_grid);
1692 *
hadronsTensor_[
false],
"input_outer_hadrons", dnn_inputs_v2::HadronBlockInputs::NumberOfInputs, &outer_grid);
1693 (*json_file_) <<
"}";
1702 {
"main_output/Softmax"},
1726 template <
typename Collection,
typename TauCastType>
1727 void fillGrids(
const TauCastType&
tau,
const Collection&
objects, CellGrid& inner_grid, CellGrid& outer_grid) {
1728 static constexpr
double outer_dR2 = 0.25;
1730 const double inner_dR2 =
std::pow(inner_radius, 2);
1732 const auto addObject = [&](
size_t n,
double deta,
double dphi, CellGrid&
grid) {
1735 if (obj_type == CellObjectType::Other)
1737 CellIndex cell_index;
1738 if (
grid.tryGetCellIndex(deta, dphi, cell_index)) {
1740 auto iter = cell.find(obj_type);
1741 if (iter != cell.end()) {
1742 const auto& prev_obj =
objects.at(iter->second);
1743 if (
obj.polarP4().pt() > prev_obj.polarP4().pt())
1751 for (
size_t n = 0;
n <
objects.size(); ++
n) {
1753 const double deta =
obj.polarP4().eta() -
tau.polarP4().eta();
1756 if (dR2 < inner_dR2)
1757 addObject(
n, deta, dphi, inner_grid);
1758 if (dR2 < outer_dR2)
1759 addObject(
n, deta, dphi, outer_grid);
1764 std::vector<tensorflow::Tensor> pred_vector;
1772 {
"inner_all_dropout_4/Identity"},
1781 {
"outer_all_dropout_4/Identity"},
1784 return pred_vector.at(0);
1787 template <
typename Cand
idateCastType,
typename TauCastType>
1789 const size_t tau_index,
1793 const std::vector<pat::Electron>*
electrons,
1794 const std::vector<pat::Muon>*
muons,
1796 const CellGrid&
grid,
1800 std::cout <<
"<DeepTauId::createConvFeatures (is_inner = " << is_inner <<
")>:" << std::endl;
1802 tensorflow::Tensor& convTensor = *
convTensor_.at(is_inner);
1803 eGammaTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1804 tensorflow::DT_FLOAT,
1805 tensorflow::TensorShape{
1806 (
long long int)
grid.num_valid_cells(), 1, 1, dnn_inputs_v2::EgammaBlockInputs::NumberOfInputs});
1807 muonTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1808 tensorflow::DT_FLOAT,
1809 tensorflow::TensorShape{
1810 (
long long int)
grid.num_valid_cells(), 1, 1, dnn_inputs_v2::MuonBlockInputs::NumberOfInputs});
1812 tensorflow::DT_FLOAT,
1813 tensorflow::TensorShape{
1814 (
long long int)
grid.num_valid_cells(), 1, 1, dnn_inputs_v2::HadronBlockInputs::NumberOfInputs});
1824 std::cout <<
"processing ( eta = " <<
eta <<
", phi = " <<
phi <<
" )" << std::endl;
1826 const CellIndex cell_index{
eta,
phi};
1827 const auto cell_iter =
grid.find(cell_index);
1828 if (cell_iter !=
grid.end()) {
1830 std::cout <<
" creating inputs for ( eta = " <<
eta <<
", phi = " <<
phi <<
" ): idx = " <<
idx 1833 const Cell& cell = cell_iter->second;
1834 createEgammaBlockInputs<CandidateCastType>(
1835 idx,
tau, tau_index, tau_ref,
pv,
rho,
electrons, pfCands, cell, tau_funcs, is_inner);
1836 createMuonBlockInputs<CandidateCastType>(
1837 idx,
tau, tau_index, tau_ref,
pv,
rho,
muons, pfCands, cell, tau_funcs, is_inner);
1838 createHadronsBlockInputs<CandidateCastType>(
1839 idx,
tau, tau_index, tau_ref,
pv,
rho, pfCands, cell, tau_funcs, is_inner);
1843 std::cout <<
" skipping creation of inputs, because ( eta = " <<
eta <<
", phi = " <<
phi 1844 <<
" ) is not in the grid !!" << std::endl;
1854 const CellIndex cell_index{
eta,
phi};
1855 const int eta_index =
grid.getEtaTensorIndex(cell_index);
1856 const int phi_index =
grid.getPhiTensorIndex(cell_index);
1858 const auto cell_iter =
grid.find(cell_index);
1859 if (cell_iter !=
grid.end()) {
1870 const tensorflow::Tensor&
features,
1874 for (
int n = 0;
n < dnn_inputs_v2::number_of_conv_features; ++
n) {
1875 convTensor.tensor<
float, 4>()(0, eta_index, phi_index,
n) =
features.tensor<
float, 4>()(batch_idx, 0, 0,
n);
1879 template <
typename Cand
idateCastType,
typename TauCastType>
1881 const size_t& tau_index,
1885 TauFunc tau_funcs) {
1892 inputs.flat<
float>().setZero();
1894 const auto&
get = [&](
int var_index) ->
float& {
1898 auto leadChargedHadrCand =
dynamic_cast<const CandidateCastType*
>(
tau.leadChargedHadrCand().get());
1909 get(dnn::tau_n_charged_prongs) = sp.scale(
tau.decayMode() / 5 + 1,
tauInputs_indices_[dnn::tau_n_charged_prongs]);
1910 get(dnn::tau_n_neutral_prongs) = sp.scale(
tau.decayMode() % 5,
tauInputs_indices_[dnn::tau_n_neutral_prongs]);
1911 get(dnn::chargedIsoPtSum) =
1913 get(dnn::chargedIsoPtSumdR03_over_dR05) =
1914 sp.scale(tau_funcs.getChargedIsoPtSumdR03(
tau, tau_ref) / tau_funcs.getChargedIsoPtSum(
tau, tau_ref),
1917 get(dnn::footprintCorrection) =
1918 sp.scale(tau_funcs.getFootprintCorrectiondR03(
tau, tau_ref),
tauInputs_indices_[dnn::footprintCorrection]);
1920 get(dnn::footprintCorrection) =
1921 sp.scale(tau_funcs.getFootprintCorrection(
tau, tau_ref),
tauInputs_indices_[dnn::footprintCorrection]);
1923 get(dnn::neutralIsoPtSum) =
1925 get(dnn::neutralIsoPtSumWeight_over_neutralIsoPtSum) =
1926 sp.scale(tau_funcs.getNeutralIsoPtSumWeight(
tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(
tau, tau_ref),
1928 get(dnn::neutralIsoPtSumWeightdR03_over_neutralIsoPtSum) =
1929 sp.scale(tau_funcs.getNeutralIsoPtSumdR03Weight(
tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(
tau, tau_ref),
1931 get(dnn::neutralIsoPtSumdR03_over_dR05) =
1932 sp.scale(tau_funcs.getNeutralIsoPtSumdR03(
tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(
tau, tau_ref),
1934 get(dnn::photonPtSumOutsideSignalCone) = sp.scale(tau_funcs.getPhotonPtSumOutsideSignalCone(
tau, tau_ref),
1936 get(dnn::puCorrPtSum) = sp.scale(tau_funcs.getPuCorrPtSum(
tau, tau_ref),
tauInputs_indices_[dnn::puCorrPtSum]);
1943 auto const pca = tau_funcs.getdxyPCA(
tau, tau_index);
1948 get(dnn::tau_dxy_pca_x) = 0;
1949 get(dnn::tau_dxy_pca_y) = 0;
1950 get(dnn::tau_dxy_pca_z) = 0;
1954 const bool tau_dxy_valid =
1955 isAbove(tau_funcs.getdxy(
tau, tau_index), -10) &&
isAbove(tau_funcs.getdxyError(
tau, tau_index), 0);
1956 if (tau_dxy_valid) {
1957 get(dnn::tau_dxy_valid) = sp.scale(tau_dxy_valid,
tauInputs_indices_[dnn::tau_dxy_valid]);
1959 get(dnn::tau_dxy_sig) =
1960 sp.scale(
std::abs(tau_funcs.getdxy(
tau, tau_index)) / tau_funcs.getdxyError(
tau, tau_index),
1963 const bool tau_ip3d_valid =
1964 isAbove(tau_funcs.getip3d(
tau, tau_index), -10) &&
isAbove(tau_funcs.getip3dError(
tau, tau_index), 0);
1965 if (tau_ip3d_valid) {
1966 get(dnn::tau_ip3d_valid) = sp.scale(tau_ip3d_valid,
tauInputs_indices_[dnn::tau_ip3d_valid]);
1967 get(dnn::tau_ip3d) = sp.scale(tau_funcs.getip3d(
tau, tau_index),
tauInputs_indices_[dnn::tau_ip3d]);
1968 get(dnn::tau_ip3d_sig) =
1969 sp.scale(
std::abs(tau_funcs.getip3d(
tau, tau_index)) / tau_funcs.getip3dError(
tau, tau_index),
1972 if (leadChargedHadrCand) {
1973 const bool hasTrackDetails = candFunc::getHasTrackDetails(*leadChargedHadrCand);
1974 const float tau_dz = (
is_online_ && !hasTrackDetails) ? 0 : candFunc::getTauDz(*leadChargedHadrCand);
1976 get(dnn::tau_dz_sig_valid) =
1977 sp.scale(candFunc::getTauDZSigValid(*leadChargedHadrCand),
tauInputs_indices_[dnn::tau_dz_sig_valid]);
1978 const double dzError = hasTrackDetails ? leadChargedHadrCand->dzError() : -999.;
1981 get(dnn::tau_flightLength_x) =
1982 sp.scale(tau_funcs.getFlightLength(
tau, tau_index).x(),
tauInputs_indices_[dnn::tau_flightLength_x]);
1983 get(dnn::tau_flightLength_y) =
1984 sp.scale(tau_funcs.getFlightLength(
tau, tau_index).y(),
tauInputs_indices_[dnn::tau_flightLength_y]);
1985 get(dnn::tau_flightLength_z) =
1986 sp.scale(tau_funcs.getFlightLength(
tau, tau_index).z(),
tauInputs_indices_[dnn::tau_flightLength_z]);
1988 get(dnn::tau_flightLength_sig) = 0.55756444;
1990 get(dnn::tau_flightLength_sig) =
1991 sp.scale(tau_funcs.getFlightLengthSig(
tau, tau_index),
tauInputs_indices_[dnn::tau_flightLength_sig]);
2000 get(dnn::tau_pt_weighted_dr_iso) =
2002 get(dnn::tau_leadingTrackNormChi2) =
2003 sp.scale(tau_funcs.getLeadingTrackNormChi2(
tau),
tauInputs_indices_[dnn::tau_leadingTrackNormChi2]);
2005 const bool tau_e_ratio_valid = std::isnormal(
eratio) &&
eratio > 0.f;
2006 get(dnn::tau_e_ratio_valid) = sp.scale(tau_e_ratio_valid,
tauInputs_indices_[dnn::tau_e_ratio_valid]);
2009 const bool tau_gj_angle_diff_valid = (std::isnormal(gj_angle_diff) || gj_angle_diff == 0) && gj_angle_diff >= 0;
2010 get(dnn::tau_gj_angle_diff_valid) =
2012 get(dnn::tau_gj_angle_diff) =
2013 tau_gj_angle_diff_valid ? sp.scale(gj_angle_diff,
tauInputs_indices_[dnn::tau_gj_angle_diff]) : 0;
2015 get(dnn::tau_emFraction) = sp.scale(tau_funcs.getEmFraction(
tau),
tauInputs_indices_[dnn::tau_emFraction]);
2017 get(dnn::tau_inside_ecal_crack) =
2019 get(dnn::leadChargedCand_etaAtEcalEntrance_minus_tau_eta) =
2020 sp.scale(tau_funcs.getEtaAtEcalEntrance(
tau) -
tau.p4().eta(),
2024 template <
typename Cand
idateCastType,
typename TauCastType>
2026 const TauCastType&
tau,
2027 const size_t tau_index,
2031 const std::vector<pat::Electron>*
electrons,
2033 const Cell& cell_map,
2044 int PFe_index_offset =
scalingParamsMap_->at(std::make_pair(ft_global,
false)).mean_.size();
2045 int e_index_offset = PFe_index_offset +
scalingParamsMap_->at(std::make_pair(ft_PFe,
false)).mean_.size();
2046 int PFg_index_offset = e_index_offset +
scalingParamsMap_->at(std::make_pair(ft_e,
false)).mean_.size();
2049 int fill_index_offset_e = 0;
2050 int fill_index_offset_PFg = 0;
2052 fill_index_offset_e =
2054 fill_index_offset_PFg =
2060 const auto&
get = [&](
int var_index) ->
float& {
return inputs.tensor<
float, 4>()(
idx, 0, 0, var_index); };
2062 const bool valid_index_pf_ele = cell_map.count(CellObjectType::PfCand_electron);
2063 const bool valid_index_pf_gamma = cell_map.count(CellObjectType::PfCand_gamma);
2066 if (!cell_map.empty()) {
2067 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_global,
false));
2071 get(dnn::tau_inside_ecal_crack) = sp.scale(
isInEcalCrack(
tau.polarP4().eta()), dnn::tau_inside_ecal_crack);
2073 if (valid_index_pf_ele) {
2074 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_PFe, is_inner));
2075 size_t index_pf_ele = cell_map.at(CellObjectType::PfCand_electron);
2076 const auto& ele_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_pf_ele));
2078 get(dnn::pfCand_ele_valid) = sp.scale(valid_index_pf_ele, dnn::pfCand_ele_valid - PFe_index_offset);
2079 get(dnn::pfCand_ele_rel_pt) =
2080 sp.scale(ele_cand.polarP4().pt() /
tau.polarP4().pt(), dnn::pfCand_ele_rel_pt - PFe_index_offset);
2081 get(dnn::pfCand_ele_deta) =
2082 sp.scale(ele_cand.polarP4().eta() -
tau.polarP4().eta(), dnn::pfCand_ele_deta - PFe_index_offset);
2083 get(dnn::pfCand_ele_dphi) =
2084 sp.scale(
dPhi(
tau.polarP4(), ele_cand.polarP4()), dnn::pfCand_ele_dphi - PFe_index_offset);
2085 get(dnn::pfCand_ele_pvAssociationQuality) = sp.scale<
int>(
2086 candFunc::getPvAssocationQuality(ele_cand), dnn::pfCand_ele_pvAssociationQuality - PFe_index_offset);
2087 get(dnn::pfCand_ele_puppiWeight) = is_inner ? sp.scale(candFunc::getPuppiWeight(ele_cand, 0.9906834f),
2088 dnn::pfCand_ele_puppiWeight - PFe_index_offset)
2089 : sp.scale(candFunc::getPuppiWeight(ele_cand, 0.9669586
f),
2090 dnn::pfCand_ele_puppiWeight - PFe_index_offset);
2091 get(dnn::pfCand_ele_charge) = sp.scale(ele_cand.charge(), dnn::pfCand_ele_charge - PFe_index_offset);
2092 get(dnn::pfCand_ele_lostInnerHits) =
2093 sp.scale<
int>(candFunc::getLostInnerHits(ele_cand, 0), dnn::pfCand_ele_lostInnerHits - PFe_index_offset);
2094 get(dnn::pfCand_ele_numberOfPixelHits) =
2095 sp.scale(candFunc::getNumberOfPixelHits(ele_cand, 0), dnn::pfCand_ele_numberOfPixelHits - PFe_index_offset);
2096 get(dnn::pfCand_ele_vertex_dx) =
2097 sp.scale(ele_cand.vertex().x() -
pv.position().x(), dnn::pfCand_ele_vertex_dx - PFe_index_offset);
2098 get(dnn::pfCand_ele_vertex_dy) =
2099 sp.scale(ele_cand.vertex().y() -
pv.position().y(), dnn::pfCand_ele_vertex_dy - PFe_index_offset);
2100 get(dnn::pfCand_ele_vertex_dz) =
2101 sp.scale(ele_cand.vertex().z() -
pv.position().z(), dnn::pfCand_ele_vertex_dz - PFe_index_offset);
2102 get(dnn::pfCand_ele_vertex_dx_tauFL) =
2103 sp.scale(ele_cand.vertex().x() -
pv.position().x() - tau_funcs.getFlightLength(
tau, tau_index).x(),
2104 dnn::pfCand_ele_vertex_dx_tauFL - PFe_index_offset);
2105 get(dnn::pfCand_ele_vertex_dy_tauFL) =
2106 sp.scale(ele_cand.vertex().y() -
pv.position().y() - tau_funcs.getFlightLength(
tau, tau_index).y(),
2107 dnn::pfCand_ele_vertex_dy_tauFL - PFe_index_offset);
2108 get(dnn::pfCand_ele_vertex_dz_tauFL) =
2109 sp.scale(ele_cand.vertex().z() -
pv.position().z() - tau_funcs.getFlightLength(
tau, tau_index).z(),
2110 dnn::pfCand_ele_vertex_dz_tauFL - PFe_index_offset);
2112 const bool hasTrackDetails = candFunc::getHasTrackDetails(ele_cand);
2113 if (hasTrackDetails) {
2114 get(dnn::pfCand_ele_hasTrackDetails) =
2115 sp.scale(hasTrackDetails, dnn::pfCand_ele_hasTrackDetails - PFe_index_offset);
2116 get(dnn::pfCand_ele_dxy) = sp.scale(candFunc::getTauDxy(ele_cand), dnn::pfCand_ele_dxy - PFe_index_offset);
2117 get(dnn::pfCand_ele_dxy_sig) = sp.scale(
std::abs(candFunc::getTauDxy(ele_cand)) / ele_cand.dxyError(),
2118 dnn::pfCand_ele_dxy_sig - PFe_index_offset);
2119 get(dnn::pfCand_ele_dz) = sp.scale(candFunc::getTauDz(ele_cand), dnn::pfCand_ele_dz - PFe_index_offset);
2120 get(dnn::pfCand_ele_dz_sig) = sp.scale(
std::abs(candFunc::getTauDz(ele_cand)) / ele_cand.dzError(),
2121 dnn::pfCand_ele_dz_sig - PFe_index_offset);
2122 get(dnn::pfCand_ele_track_chi2_ndof) =
2123 candFunc::getPseudoTrack(ele_cand).ndof() > 0
2124 ? sp.scale(candFunc::getPseudoTrack(ele_cand).
chi2() / candFunc::getPseudoTrack(ele_cand).
ndof(),
2125 dnn::pfCand_ele_track_chi2_ndof - PFe_index_offset)
2127 get(dnn::pfCand_ele_track_ndof) =
2128 candFunc::getPseudoTrack(ele_cand).ndof() > 0
2129 ? sp.scale(candFunc::getPseudoTrack(ele_cand).
ndof(), dnn::pfCand_ele_track_ndof - PFe_index_offset)
2133 if (valid_index_pf_gamma) {
2134 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_PFg, is_inner));
2135 size_t index_pf_gamma = cell_map.at(CellObjectType::PfCand_gamma);
2136 const auto& gamma_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_pf_gamma));
2138 get(dnn::pfCand_gamma_valid + fill_index_offset_PFg) =
2139 sp.scale(valid_index_pf_gamma, dnn::pfCand_gamma_valid - PFg_index_offset);
2140 get(dnn::pfCand_gamma_rel_pt + fill_index_offset_PFg) =
2141 sp.scale(gamma_cand.polarP4().pt() /
tau.polarP4().pt(), dnn::pfCand_gamma_rel_pt - PFg_index_offset);
2142 get(dnn::pfCand_gamma_deta + fill_index_offset_PFg) =
2143 sp.scale(gamma_cand.polarP4().eta() -
tau.polarP4().eta(), dnn::pfCand_gamma_deta - PFg_index_offset);
2144 get(dnn::pfCand_gamma_dphi + fill_index_offset_PFg) =
2145 sp.scale(
dPhi(
tau.polarP4(), gamma_cand.polarP4()), dnn::pfCand_gamma_dphi - PFg_index_offset);
2146 get(dnn::pfCand_gamma_pvAssociationQuality + fill_index_offset_PFg) = sp.scale<
int>(
2147 candFunc::getPvAssocationQuality(gamma_cand), dnn::pfCand_gamma_pvAssociationQuality - PFg_index_offset);
2148 get(dnn::pfCand_gamma_fromPV + fill_index_offset_PFg) =
2149 sp.scale<
int>(candFunc::getFromPV(gamma_cand), dnn::pfCand_gamma_fromPV - PFg_index_offset);
2150 get(dnn::pfCand_gamma_puppiWeight + fill_index_offset_PFg) =
2151 is_inner ? sp.scale(candFunc::getPuppiWeight(gamma_cand, 0.9084110f),
2152 dnn::pfCand_gamma_puppiWeight - PFg_index_offset)
2153 : sp.scale(candFunc::getPuppiWeight(gamma_cand, 0.4211567
f),
2154 dnn::pfCand_gamma_puppiWeight - PFg_index_offset);
2155 get(dnn::pfCand_gamma_puppiWeightNoLep + fill_index_offset_PFg) =
2156 is_inner ? sp.scale(candFunc::getPuppiWeightNoLep(gamma_cand, 0.8857716f),
2157 dnn::pfCand_gamma_puppiWeightNoLep - PFg_index_offset)
2158 : sp.scale(candFunc::getPuppiWeightNoLep(gamma_cand, 0.3822604
f),
2159 dnn::pfCand_gamma_puppiWeightNoLep - PFg_index_offset);
2160 get(dnn::pfCand_gamma_lostInnerHits + fill_index_offset_PFg) =
2161 sp.scale<
int>(candFunc::getLostInnerHits(gamma_cand, 0), dnn::pfCand_gamma_lostInnerHits - PFg_index_offset);
2162 get(dnn::pfCand_gamma_numberOfPixelHits + fill_index_offset_PFg) = sp.scale(
2163 candFunc::getNumberOfPixelHits(gamma_cand, 0), dnn::pfCand_gamma_numberOfPixelHits - PFg_index_offset);
2164 get(dnn::pfCand_gamma_vertex_dx + fill_index_offset_PFg) =
2165 sp.scale(gamma_cand.vertex().x() -
pv.position().x(), dnn::pfCand_gamma_vertex_dx - PFg_index_offset);
2166 get(dnn::pfCand_gamma_vertex_dy + fill_index_offset_PFg) =
2167 sp.scale(gamma_cand.vertex().y() -
pv.position().y(), dnn::pfCand_gamma_vertex_dy - PFg_index_offset);
2168 get(dnn::pfCand_gamma_vertex_dz + fill_index_offset_PFg) =
2169 sp.scale(gamma_cand.vertex().z() -
pv.position().z(), dnn::pfCand_gamma_vertex_dz - PFg_index_offset);
2170 get(dnn::pfCand_gamma_vertex_dx_tauFL + fill_index_offset_PFg) =
2171 sp.scale(gamma_cand.vertex().x() -
pv.position().x() - tau_funcs.getFlightLength(
tau, tau_index).x(),
2172 dnn::pfCand_gamma_vertex_dx_tauFL - PFg_index_offset);
2173 get(dnn::pfCand_gamma_vertex_dy_tauFL + fill_index_offset_PFg) =
2174 sp.scale(gamma_cand.vertex().y() -
pv.position().y() - tau_funcs.getFlightLength(
tau, tau_index).y(),
2175 dnn::pfCand_gamma_vertex_dy_tauFL - PFg_index_offset);
2176 get(dnn::pfCand_gamma_vertex_dz_tauFL + fill_index_offset_PFg) =
2177 sp.scale(gamma_cand.vertex().z() -
pv.position().z() - tau_funcs.getFlightLength(
tau, tau_index).z(),
2178 dnn::pfCand_gamma_vertex_dz_tauFL - PFg_index_offset);
2179 const bool hasTrackDetails = candFunc::getHasTrackDetails(gamma_cand);
2180 if (hasTrackDetails) {
2181 get(dnn::pfCand_gamma_hasTrackDetails + fill_index_offset_PFg) =
2182 sp.scale(hasTrackDetails, dnn::pfCand_gamma_hasTrackDetails - PFg_index_offset);
2183 get(dnn::pfCand_gamma_dxy + fill_index_offset_PFg) =
2184 sp.scale(candFunc::getTauDxy(gamma_cand), dnn::pfCand_gamma_dxy - PFg_index_offset);
2185 get(dnn::pfCand_gamma_dxy_sig + fill_index_offset_PFg) =
2186 sp.scale(
std::abs(candFunc::getTauDxy(gamma_cand)) / gamma_cand.dxyError(),
2187 dnn::pfCand_gamma_dxy_sig - PFg_index_offset);
2188 get(dnn::pfCand_gamma_dz + fill_index_offset_PFg) =
2189 sp.scale(candFunc::getTauDz(gamma_cand), dnn::pfCand_gamma_dz - PFg_index_offset);
2190 get(dnn::pfCand_gamma_dz_sig + fill_index_offset_PFg) =
2191 sp.scale(
std::abs(candFunc::getTauDz(gamma_cand)) / gamma_cand.dzError(),
2192 dnn::pfCand_gamma_dz_sig - PFg_index_offset);
2193 get(dnn::pfCand_gamma_track_chi2_ndof + fill_index_offset_PFg) =
2194 candFunc::getPseudoTrack(gamma_cand).ndof() > 0
2195 ? sp.scale(candFunc::getPseudoTrack(gamma_cand).
chi2() / candFunc::getPseudoTrack(gamma_cand).
ndof(),
2196 dnn::pfCand_gamma_track_chi2_ndof - PFg_index_offset)
2198 get(dnn::pfCand_gamma_track_ndof + fill_index_offset_PFg) =
2199 candFunc::getPseudoTrack(gamma_cand).ndof() > 0
2200 ? sp.scale(candFunc::getPseudoTrack(gamma_cand).
ndof(), dnn::pfCand_gamma_track_ndof - PFg_index_offset)
2204 if (valid_index_ele) {
2205 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_e, is_inner));
2207 const auto& ele =
electrons->at(index_ele);
2209 get(dnn::ele_valid + fill_index_offset_e) = sp.scale(valid_index_ele, dnn::ele_valid - e_index_offset);
2210 get(dnn::ele_rel_pt + fill_index_offset_e) =
2211 sp.scale(ele.polarP4().pt() /
tau.polarP4().pt(), dnn::ele_rel_pt - e_index_offset);
2212 get(dnn::ele_deta + fill_index_offset_e) =
2213 sp.scale(ele.polarP4().eta() -
tau.polarP4().eta(), dnn::ele_deta - e_index_offset);
2214 get(dnn::ele_dphi + fill_index_offset_e) =
2215 sp.scale(
dPhi(
tau.polarP4(), ele.polarP4()), dnn::ele_dphi - e_index_offset);
2217 float cc_ele_energy, cc_gamma_energy;
2221 get(dnn::ele_cc_valid + fill_index_offset_e) = sp.scale(cc_valid, dnn::ele_cc_valid - e_index_offset);
2222 get(dnn::ele_cc_ele_rel_energy + fill_index_offset_e) =
2223 sp.scale(cc_ele_energy / ele.polarP4().pt(), dnn::ele_cc_ele_rel_energy - e_index_offset);
2224 get(dnn::ele_cc_gamma_rel_energy + fill_index_offset_e) =
2225 sp.scale(cc_gamma_energy / cc_ele_energy, dnn::ele_cc_gamma_rel_energy - e_index_offset);
2226 get(dnn::ele_cc_n_gamma + fill_index_offset_e) = sp.scale(cc_n_gamma, dnn::ele_cc_n_gamma - e_index_offset);
2228 get(dnn::ele_rel_trackMomentumAtVtx + fill_index_offset_e) =
2229 sp.scale(ele.trackMomentumAtVtx().R() / ele.polarP4().pt(), dnn::ele_rel_trackMomentumAtVtx - e_index_offset);
2230 get(dnn::ele_rel_trackMomentumAtCalo + fill_index_offset_e) = sp.scale(
2231 ele.trackMomentumAtCalo().R() / ele.polarP4().pt(), dnn::ele_rel_trackMomentumAtCalo - e_index_offset);
2232 get(dnn::ele_rel_trackMomentumOut + fill_index_offset_e) =
2233 sp.scale(ele.trackMomentumOut().R() / ele.polarP4().pt(), dnn::ele_rel_trackMomentumOut - e_index_offset);
2234 get(dnn::ele_rel_trackMomentumAtEleClus + fill_index_offset_e) = sp.scale(
2235 ele.trackMomentumAtEleClus().R() / ele.polarP4().pt(), dnn::ele_rel_trackMomentumAtEleClus - e_index_offset);
2236 get(dnn::ele_rel_trackMomentumAtVtxWithConstraint + fill_index_offset_e) =
2237 sp.scale(ele.trackMomentumAtVtxWithConstraint().R() / ele.polarP4().pt(),
2238 dnn::ele_rel_trackMomentumAtVtxWithConstraint - e_index_offset);
2239 get(dnn::ele_rel_ecalEnergy + fill_index_offset_e) =
2240 sp.scale(ele.ecalEnergy() / ele.polarP4().pt(), dnn::ele_rel_ecalEnergy - e_index_offset);
2241 get(dnn::ele_ecalEnergy_sig + fill_index_offset_e) =
2242 sp.scale(ele.ecalEnergy() / ele.ecalEnergyError(), dnn::ele_ecalEnergy_sig - e_index_offset);
2243 get(dnn::ele_eSuperClusterOverP + fill_index_offset_e) =
2244 sp.scale(ele.eSuperClusterOverP(), dnn::ele_eSuperClusterOverP - e_index_offset);
2245 get(dnn::ele_eSeedClusterOverP + fill_index_offset_e) =
2246 sp.scale(ele.eSeedClusterOverP(), dnn::ele_eSeedClusterOverP - e_index_offset);
2247 get(dnn::ele_eSeedClusterOverPout + fill_index_offset_e) =
2248 sp.scale(ele.eSeedClusterOverPout(), dnn::ele_eSeedClusterOverPout - e_index_offset);
2249 get(dnn::ele_eEleClusterOverPout + fill_index_offset_e) =
2250 sp.scale(ele.eEleClusterOverPout(), dnn::ele_eEleClusterOverPout - e_index_offset);
2251 get(dnn::ele_deltaEtaSuperClusterTrackAtVtx + fill_index_offset_e) =
2252 sp.scale(ele.deltaEtaSuperClusterTrackAtVtx(), dnn::ele_deltaEtaSuperClusterTrackAtVtx - e_index_offset);
2253 get(dnn::ele_deltaEtaSeedClusterTrackAtCalo + fill_index_offset_e) =
2254 sp.scale(ele.deltaEtaSeedClusterTrackAtCalo(), dnn::ele_deltaEtaSeedClusterTrackAtCalo - e_index_offset);
2255 get(dnn::ele_deltaEtaEleClusterTrackAtCalo + fill_index_offset_e) =
2256 sp.scale(ele.deltaEtaEleClusterTrackAtCalo(), dnn::ele_deltaEtaEleClusterTrackAtCalo - e_index_offset);
2257 get(dnn::ele_deltaPhiEleClusterTrackAtCalo + fill_index_offset_e) =
2258 sp.scale(ele.deltaPhiEleClusterTrackAtCalo(), dnn::ele_deltaPhiEleClusterTrackAtCalo - e_index_offset);
2259 get(dnn::ele_deltaPhiSuperClusterTrackAtVtx + fill_index_offset_e) =
2260 sp.scale(ele.deltaPhiSuperClusterTrackAtVtx(), dnn::ele_deltaPhiSuperClusterTrackAtVtx - e_index_offset);
2261 get(dnn::ele_deltaPhiSeedClusterTrackAtCalo + fill_index_offset_e) =
2262 sp.scale(ele.deltaPhiSeedClusterTrackAtCalo(), dnn::ele_deltaPhiSeedClusterTrackAtCalo - e_index_offset);
2263 const bool mva_valid =
2264 (ele.mvaInput().earlyBrem > -2) ||
2268 get(dnn::ele_mvaInput_earlyBrem + fill_index_offset_e) =
2269 sp.scale(ele.mvaInput().earlyBrem, dnn::ele_mvaInput_earlyBrem - e_index_offset);
2270 get(dnn::ele_mvaInput_lateBrem + fill_index_offset_e) =
2271 sp.scale(ele.mvaInput().lateBrem, dnn::ele_mvaInput_lateBrem - e_index_offset);
2272 get(dnn::ele_mvaInput_sigmaEtaEta + fill_index_offset_e) =
2273 sp.scale(ele.mvaInput().sigmaEtaEta, dnn::ele_mvaInput_sigmaEtaEta - e_index_offset);
2274 get(dnn::ele_mvaInput_hadEnergy + fill_index_offset_e) =
2275 sp.scale(ele.mvaInput().hadEnergy, dnn::ele_mvaInput_hadEnergy - e_index_offset);
2276 get(dnn::ele_mvaInput_deltaEta + fill_index_offset_e) =
2277 sp.scale(ele.mvaInput().deltaEta, dnn::ele_mvaInput_deltaEta - e_index_offset);
2279 const auto& gsfTrack = ele.gsfTrack();
2280 if (gsfTrack.isNonnull()) {
2281 get(dnn::ele_gsfTrack_normalizedChi2 + fill_index_offset_e) =
2282 sp.scale(gsfTrack->normalizedChi2(), dnn::ele_gsfTrack_normalizedChi2 - e_index_offset);
2283 get(dnn::ele_gsfTrack_numberOfValidHits + fill_index_offset_e) =
2284 sp.scale(gsfTrack->numberOfValidHits(), dnn::ele_gsfTrack_numberOfValidHits - e_index_offset);
2285 get(dnn::ele_rel_gsfTrack_pt + fill_index_offset_e) =
2286 sp.scale(gsfTrack->pt() / ele.polarP4().pt(), dnn::ele_rel_gsfTrack_pt - e_index_offset);
2287 get(dnn::ele_gsfTrack_pt_sig + fill_index_offset_e) =
2288 sp.scale(gsfTrack->pt() / gsfTrack->ptError(), dnn::ele_gsfTrack_pt_sig - e_index_offset);
2290 const auto& closestCtfTrack = ele.closestCtfTrackRef();
2291 const bool has_closestCtfTrack = closestCtfTrack.isNonnull();
2292 if (has_closestCtfTrack) {
2293 get(dnn::ele_has_closestCtfTrack + fill_index_offset_e) =
2294 sp.scale(has_closestCtfTrack, dnn::ele_has_closestCtfTrack - e_index_offset);
2295 get(dnn::ele_closestCtfTrack_normalizedChi2 + fill_index_offset_e) =
2296 sp.scale(closestCtfTrack->normalizedChi2(), dnn::ele_closestCtfTrack_normalizedChi2 - e_index_offset);
2297 get(dnn::ele_closestCtfTrack_numberOfValidHits + fill_index_offset_e) =
2298 sp.scale(closestCtfTrack->numberOfValidHits(), dnn::ele_closestCtfTrack_numberOfValidHits - e_index_offset);
2303 template <
typename Cand
idateCastType,
typename TauCastType>
2305 const TauCastType&
tau,
2306 const size_t tau_index,
2310 const std::vector<pat::Muon>*
muons,
2312 const Cell& cell_map,
2322 int PFmu_index_offset =
scalingParamsMap_->at(std::make_pair(ft_global,
false)).mean_.size();
2323 int mu_index_offset = PFmu_index_offset +
scalingParamsMap_->at(std::make_pair(ft_PFmu,
false)).mean_.size();
2327 const auto&
get = [&](
int var_index) ->
float& {
return inputs.tensor<
float, 4>()(
idx, 0, 0, var_index); };
2329 const bool valid_index_pf_muon = cell_map.count(CellObjectType::PfCand_muon);
2332 if (!cell_map.empty()) {
2333 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_global,
false));
2337 get(dnn::tau_inside_ecal_crack) = sp.scale(
isInEcalCrack(
tau.polarP4().eta()), dnn::tau_inside_ecal_crack);
2339 if (valid_index_pf_muon) {
2340 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_PFmu, is_inner));
2341 size_t index_pf_muon = cell_map.at(CellObjectType::PfCand_muon);
2342 const auto& muon_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_pf_muon));
2344 get(dnn::pfCand_muon_valid) = sp.scale(valid_index_pf_muon, dnn::pfCand_muon_valid - PFmu_index_offset);
2345 get(dnn::pfCand_muon_rel_pt) =
2346 sp.scale(muon_cand.polarP4().pt() /
tau.polarP4().pt(), dnn::pfCand_muon_rel_pt - PFmu_index_offset);
2347 get(dnn::pfCand_muon_deta) =
2348 sp.scale(muon_cand.polarP4().eta() -
tau.polarP4().eta(), dnn::pfCand_muon_deta - PFmu_index_offset);
2349 get(dnn::pfCand_muon_dphi) =
2350 sp.scale(
dPhi(
tau.polarP4(), muon_cand.polarP4()), dnn::pfCand_muon_dphi - PFmu_index_offset);
2351 get(dnn::pfCand_muon_pvAssociationQuality) = sp.scale<
int>(
2352 candFunc::getPvAssocationQuality(muon_cand), dnn::pfCand_muon_pvAssociationQuality - PFmu_index_offset);
2353 get(dnn::pfCand_muon_fromPV) =
2354 sp.scale<
int>(candFunc::getFromPV(muon_cand), dnn::pfCand_muon_fromPV - PFmu_index_offset);
2355 get(dnn::pfCand_muon_puppiWeight) = is_inner ? sp.scale(candFunc::getPuppiWeight(muon_cand, 0.9786588f),
2356 dnn::pfCand_muon_puppiWeight - PFmu_index_offset)
2357 : sp.scale(candFunc::getPuppiWeight(muon_cand, 0.8132477
f),
2358 dnn::pfCand_muon_puppiWeight - PFmu_index_offset);
2359 get(dnn::pfCand_muon_charge) = sp.scale(muon_cand.charge(), dnn::pfCand_muon_charge - PFmu_index_offset);
2360 get(dnn::pfCand_muon_lostInnerHits) =
2361 sp.scale<
int>(candFunc::getLostInnerHits(muon_cand, 0), dnn::pfCand_muon_lostInnerHits - PFmu_index_offset);
2362 get(dnn::pfCand_muon_numberOfPixelHits) = sp.scale(candFunc::getNumberOfPixelHits(muon_cand, 0),
2363 dnn::pfCand_muon_numberOfPixelHits - PFmu_index_offset);
2364 get(dnn::pfCand_muon_vertex_dx) =
2365 sp.scale(muon_cand.vertex().x() -
pv.position().x(), dnn::pfCand_muon_vertex_dx - PFmu_index_offset);
2366 get(dnn::pfCand_muon_vertex_dy) =
2367 sp.scale(muon_cand.vertex().y() -
pv.position().y(), dnn::pfCand_muon_vertex_dy - PFmu_index_offset);
2368 get(dnn::pfCand_muon_vertex_dz) =
2369 sp.scale(muon_cand.vertex().z() -
pv.position().z(), dnn::pfCand_muon_vertex_dz - PFmu_index_offset);
2370 get(dnn::pfCand_muon_vertex_dx_tauFL) =
2371 sp.scale(muon_cand.vertex().x() -
pv.position().x() - tau_funcs.getFlightLength(
tau, tau_index).x(),
2372 dnn::pfCand_muon_vertex_dx_tauFL - PFmu_index_offset);
2373 get(dnn::pfCand_muon_vertex_dy_tauFL) =
2374 sp.scale(muon_cand.vertex().y() -
pv.position().y() - tau_funcs.getFlightLength(
tau, tau_index).y(),
2375 dnn::pfCand_muon_vertex_dy_tauFL - PFmu_index_offset);
2376 get(dnn::pfCand_muon_vertex_dz_tauFL) =
2377 sp.scale(muon_cand.vertex().z() -
pv.position().z() - tau_funcs.getFlightLength(
tau, tau_index).z(),
2378 dnn::pfCand_muon_vertex_dz_tauFL - PFmu_index_offset);
2380 const bool hasTrackDetails = candFunc::getHasTrackDetails(muon_cand);
2381 if (hasTrackDetails) {
2382 get(dnn::pfCand_muon_hasTrackDetails) =
2383 sp.scale(hasTrackDetails, dnn::pfCand_muon_hasTrackDetails - PFmu_index_offset);
2384 get(dnn::pfCand_muon_dxy) = sp.scale(candFunc::getTauDxy(muon_cand), dnn::pfCand_muon_dxy - PFmu_index_offset);
2385 get(dnn::pfCand_muon_dxy_sig) = sp.scale(
std::abs(candFunc::getTauDxy(muon_cand)) / muon_cand.dxyError(),
2386 dnn::pfCand_muon_dxy_sig - PFmu_index_offset);
2387 get(dnn::pfCand_muon_dz) = sp.scale(candFunc::getTauDz(muon_cand), dnn::pfCand_muon_dz - PFmu_index_offset);
2388 get(dnn::pfCand_muon_dz_sig) = sp.scale(
std::abs(candFunc::getTauDz(muon_cand)) / muon_cand.dzError(),
2389 dnn::pfCand_muon_dz_sig - PFmu_index_offset);
2390 get(dnn::pfCand_muon_track_chi2_ndof) =
2391 candFunc::getPseudoTrack(muon_cand).ndof() > 0
2392 ? sp.scale(candFunc::getPseudoTrack(muon_cand).
chi2() / candFunc::getPseudoTrack(muon_cand).
ndof(),
2393 dnn::pfCand_muon_track_chi2_ndof - PFmu_index_offset)
2395 get(dnn::pfCand_muon_track_ndof) =
2396 candFunc::getPseudoTrack(muon_cand).ndof() > 0
2397 ? sp.scale(candFunc::getPseudoTrack(muon_cand).
ndof(), dnn::pfCand_muon_track_ndof - PFmu_index_offset)
2401 if (valid_index_muon) {
2402 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_mu, is_inner));
2404 const auto&
muon =
muons->at(index_muon);
2406 get(dnn::muon_valid) = sp.scale(valid_index_muon, dnn::muon_valid - mu_index_offset);
2407 get(dnn::muon_rel_pt) = sp.scale(
muon.polarP4().pt() /
tau.polarP4().pt(), dnn::muon_rel_pt - mu_index_offset);
2408 get(dnn::muon_deta) = sp.scale(
muon.polarP4().eta() -
tau.polarP4().eta(), dnn::muon_deta - mu_index_offset);
2409 get(dnn::muon_dphi) = sp.scale(
dPhi(
tau.polarP4(),
muon.polarP4()), dnn::muon_dphi - mu_index_offset);
2411 get(dnn::muon_dxy_sig) =
2414 const bool normalizedChi2_valid =
muon.globalTrack().isNonnull() &&
muon.normChi2() >= 0;
2415 if (normalizedChi2_valid) {
2416 get(dnn::muon_normalizedChi2_valid) =
2417 sp.scale(normalizedChi2_valid, dnn::muon_normalizedChi2_valid - mu_index_offset);
2418 get(dnn::muon_normalizedChi2) = sp.scale(
muon.normChi2(), dnn::muon_normalizedChi2 - mu_index_offset);
2419 if (
muon.innerTrack().isNonnull())
2420 get(dnn::muon_numberOfValidHits) =
2421 sp.scale(
muon.numberOfValidHits(), dnn::muon_numberOfValidHits - mu_index_offset);
2423 get(dnn::muon_segmentCompatibility) =
2424 sp.scale(
muon.segmentCompatibility(), dnn::muon_segmentCompatibility - mu_index_offset);
2425 get(dnn::muon_caloCompatibility) =
2426 sp.scale(
muon.caloCompatibility(), dnn::muon_caloCompatibility - mu_index_offset);
2428 const bool pfEcalEnergy_valid =
muon.pfEcalEnergy() >= 0;
2429 if (pfEcalEnergy_valid) {
2430 get(dnn::muon_pfEcalEnergy_valid) =
2431 sp.scale(pfEcalEnergy_valid, dnn::muon_pfEcalEnergy_valid - mu_index_offset);
2432 get(dnn::muon_rel_pfEcalEnergy) =
2433 sp.scale(
muon.pfEcalEnergy() /
muon.polarP4().pt(), dnn::muon_rel_pfEcalEnergy - mu_index_offset);
2436 MuonHitMatchV2 hit_match(
muon);
2437 static const std::map<int, std::pair<int, int>> muonMatchHitVars = {
2442 for (
int subdet : hit_match.MuonHitMatchV2::consideredSubdets()) {
2443 const auto& matchHitVar = muonMatchHitVars.at(subdet);
2444 for (
int station = MuonHitMatchV2::first_station_id;
station <= MuonHitMatchV2::last_station_id; ++
station) {
2445 const unsigned n_matches = hit_match.nMatches(subdet,
station);
2446 const unsigned n_hits = hit_match.nHits(subdet,
station);
2447 get(matchHitVar.first +
station - 1) = sp.scale(n_matches, matchHitVar.first +
station - 1 - mu_index_offset);
2448 get(matchHitVar.second +
station - 1) = sp.scale(n_hits, matchHitVar.second +
station - 1 - mu_index_offset);
2454 template <
typename Cand
idateCastType,
typename TauCastType>
2456 const TauCastType&
tau,
2457 const size_t tau_index,
2462 const Cell& cell_map,
2472 int PFchH_index_offset =
scalingParamsMap_->at(std::make_pair(ft_global,
false)).mean_.size();
2473 int PFnH_index_offset = PFchH_index_offset +
scalingParamsMap_->at(std::make_pair(ft_PFchH,
false)).mean_.size();
2477 const auto&
get = [&](
int var_index) ->
float& {
return inputs.tensor<
float, 4>()(
idx, 0, 0, var_index); };
2479 const bool valid_chH = cell_map.count(CellObjectType::PfCand_chargedHadron);
2480 const bool valid_nH = cell_map.count(CellObjectType::PfCand_neutralHadron);
2482 if (!cell_map.empty()) {
2483 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_global,
false));
2487 get(dnn::tau_inside_ecal_crack) = sp.scale(
isInEcalCrack(
tau.polarP4().eta()), dnn::tau_inside_ecal_crack);
2490 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_PFchH, is_inner));
2491 size_t index_chH = cell_map.at(CellObjectType::PfCand_chargedHadron);
2492 const auto& chH_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_chH));
2494 get(dnn::pfCand_chHad_valid) = sp.scale(valid_chH, dnn::pfCand_chHad_valid - PFchH_index_offset);
2495 get(dnn::pfCand_chHad_rel_pt) =
2496 sp.scale(chH_cand.polarP4().pt() /
tau.polarP4().pt(), dnn::pfCand_chHad_rel_pt - PFchH_index_offset);
2497 get(dnn::pfCand_chHad_deta) =
2498 sp.scale(chH_cand.polarP4().eta() -
tau.polarP4().eta(), dnn::pfCand_chHad_deta - PFchH_index_offset);
2499 get(dnn::pfCand_chHad_dphi) =
2500 sp.scale(
dPhi(
tau.polarP4(), chH_cand.polarP4()), dnn::pfCand_chHad_dphi - PFchH_index_offset);
2501 get(dnn::pfCand_chHad_leadChargedHadrCand) =
2502 sp.scale(&chH_cand == dynamic_cast<const CandidateCastType*>(
tau.leadChargedHadrCand().get()),
2503 dnn::pfCand_chHad_leadChargedHadrCand - PFchH_index_offset);
2504 get(dnn::pfCand_chHad_pvAssociationQuality) = sp.scale<
int>(
2505 candFunc::getPvAssocationQuality(chH_cand), dnn::pfCand_chHad_pvAssociationQuality - PFchH_index_offset);
2506 get(dnn::pfCand_chHad_fromPV) =
2507 sp.scale<
int>(candFunc::getFromPV(chH_cand), dnn::pfCand_chHad_fromPV - PFchH_index_offset);
2508 const float default_chH_pw_inner = 0.7614090f;
2509 const float default_chH_pw_outer = 0.1974930f;
2510 get(dnn::pfCand_chHad_puppiWeight) = is_inner ? sp.scale(candFunc::getPuppiWeight(chH_cand, default_chH_pw_inner),
2511 dnn::pfCand_chHad_puppiWeight - PFchH_index_offset)
2512 : sp.scale(candFunc::getPuppiWeight(chH_cand, default_chH_pw_outer),
2513 dnn::pfCand_chHad_puppiWeight - PFchH_index_offset);
2514 get(dnn::pfCand_chHad_puppiWeightNoLep) =
2515 is_inner ? sp.scale(candFunc::getPuppiWeightNoLep(chH_cand, default_chH_pw_inner),
2516 dnn::pfCand_chHad_puppiWeightNoLep - PFchH_index_offset)
2517 : sp.scale(candFunc::getPuppiWeightNoLep(chH_cand, default_chH_pw_outer),
2518 dnn::pfCand_chHad_puppiWeightNoLep - PFchH_index_offset);
2519 get(dnn::pfCand_chHad_charge) = sp.scale(chH_cand.charge(), dnn::pfCand_chHad_charge - PFchH_index_offset);
2520 get(dnn::pfCand_chHad_lostInnerHits) =
2521 sp.scale<
int>(candFunc::getLostInnerHits(chH_cand, 0), dnn::pfCand_chHad_lostInnerHits - PFchH_index_offset);
2522 get(dnn::pfCand_chHad_numberOfPixelHits) = sp.scale(candFunc::getNumberOfPixelHits(chH_cand, 0),
2523 dnn::pfCand_chHad_numberOfPixelHits - PFchH_index_offset);
2524 get(dnn::pfCand_chHad_vertex_dx) =
2525 sp.scale(chH_cand.vertex().x() -
pv.position().x(), dnn::pfCand_chHad_vertex_dx - PFchH_index_offset);
2526 get(dnn::pfCand_chHad_vertex_dy) =
2527 sp.scale(chH_cand.vertex().y() -
pv.position().y(), dnn::pfCand_chHad_vertex_dy - PFchH_index_offset);
2528 get(dnn::pfCand_chHad_vertex_dz) =
2529 sp.scale(chH_cand.vertex().z() -
pv.position().z(), dnn::pfCand_chHad_vertex_dz - PFchH_index_offset);
2530 get(dnn::pfCand_chHad_vertex_dx_tauFL) =
2531 sp.scale(chH_cand.vertex().x() -
pv.position().x() - tau_funcs.getFlightLength(
tau, tau_index).x(),
2532 dnn::pfCand_chHad_vertex_dx_tauFL - PFchH_index_offset);
2533 get(dnn::pfCand_chHad_vertex_dy_tauFL) =
2534 sp.scale(chH_cand.vertex().y() -
pv.position().y() - tau_funcs.getFlightLength(
tau, tau_index).y(),
2535 dnn::pfCand_chHad_vertex_dy_tauFL - PFchH_index_offset);
2536 get(dnn::pfCand_chHad_vertex_dz_tauFL) =
2537 sp.scale(chH_cand.vertex().z() -
pv.position().z() - tau_funcs.getFlightLength(
tau, tau_index).z(),
2538 dnn::pfCand_chHad_vertex_dz_tauFL - PFchH_index_offset);
2540 const bool hasTrackDetails = candFunc::getHasTrackDetails(chH_cand);
2541 if (hasTrackDetails) {
2542 get(dnn::pfCand_chHad_hasTrackDetails) =
2543 sp.scale(hasTrackDetails, dnn::pfCand_chHad_hasTrackDetails - PFchH_index_offset);
2544 get(dnn::pfCand_chHad_dxy) =
2545 sp.scale(candFunc::getTauDxy(chH_cand), dnn::pfCand_chHad_dxy - PFchH_index_offset);
2546 get(dnn::pfCand_chHad_dxy_sig) = sp.scale(
std::abs(candFunc::getTauDxy(chH_cand)) / chH_cand.dxyError(),
2547 dnn::pfCand_chHad_dxy_sig - PFchH_index_offset);
2548 get(dnn::pfCand_chHad_dz) = sp.scale(candFunc::getTauDz(chH_cand), dnn::pfCand_chHad_dz - PFchH_index_offset);
2549 get(dnn::pfCand_chHad_dz_sig) = sp.scale(
std::abs(candFunc::getTauDz(chH_cand)) / chH_cand.dzError(),
2550 dnn::pfCand_chHad_dz_sig - PFchH_index_offset);
2551 get(dnn::pfCand_chHad_track_chi2_ndof) =
2552 candFunc::getPseudoTrack(chH_cand).ndof() > 0
2553 ? sp.scale(candFunc::getPseudoTrack(chH_cand).
chi2() / candFunc::getPseudoTrack(chH_cand).
ndof(),
2554 dnn::pfCand_chHad_track_chi2_ndof - PFchH_index_offset)
2556 get(dnn::pfCand_chHad_track_ndof) =
2557 candFunc::getPseudoTrack(chH_cand).ndof() > 0
2558 ? sp.scale(candFunc::getPseudoTrack(chH_cand).
ndof(), dnn::pfCand_chHad_track_ndof - PFchH_index_offset)
2562 get(dnn::pfCand_chHad_hcalFraction) =
2563 sp.scale(hcal_fraction, dnn::pfCand_chHad_hcalFraction - PFchH_index_offset);
2564 get(dnn::pfCand_chHad_rawCaloFraction) =
2565 sp.scale(candFunc::getRawCaloFraction(chH_cand), dnn::pfCand_chHad_rawCaloFraction - PFchH_index_offset);
2568 const sc::ScalingParams& sp =
scalingParamsMap_->at(std::make_pair(ft_PFnH, is_inner));
2569 size_t index_nH = cell_map.at(CellObjectType::PfCand_neutralHadron);
2570 const auto& nH_cand =
dynamic_cast<const CandidateCastType&
>(pfCands.
at(index_nH));
2572 get(dnn::pfCand_nHad_valid) = sp.scale(valid_nH, dnn::pfCand_nHad_valid - PFnH_index_offset);
2573 get(dnn::pfCand_nHad_rel_pt) =
2574 sp.scale(nH_cand.polarP4().pt() /
tau.polarP4().pt(), dnn::pfCand_nHad_rel_pt - PFnH_index_offset);
2575 get(dnn::pfCand_nHad_deta) =
2576 sp.scale(nH_cand.polarP4().eta() -
tau.polarP4().eta(), dnn::pfCand_nHad_deta - PFnH_index_offset);
2577 get(dnn::pfCand_nHad_dphi) =
2578 sp.scale(
dPhi(
tau.polarP4(), nH_cand.polarP4()), dnn::pfCand_nHad_dphi - PFnH_index_offset);
2579 get(dnn::pfCand_nHad_puppiWeight) = is_inner ? sp.scale(candFunc::getPuppiWeight(nH_cand, 0.9798355f),
2580 dnn::pfCand_nHad_puppiWeight - PFnH_index_offset)
2581 : sp.scale(candFunc::getPuppiWeight(nH_cand, 0.7813260
f),
2582 dnn::pfCand_nHad_puppiWeight - PFnH_index_offset);
2583 get(dnn::pfCand_nHad_puppiWeightNoLep) = is_inner
2584 ? sp.scale(candFunc::getPuppiWeightNoLep(nH_cand, 0.9046796f),
2585 dnn::pfCand_nHad_puppiWeightNoLep - PFnH_index_offset)
2586 : sp.scale(candFunc::getPuppiWeightNoLep(nH_cand, 0.6554860
f),
2587 dnn::pfCand_nHad_puppiWeightNoLep - PFnH_index_offset);
2589 get(dnn::pfCand_nHad_hcalFraction) = sp.scale(hcal_fraction, dnn::pfCand_nHad_hcalFraction - PFnH_index_offset);
2595 elecEe = elecEgamma = 0;
2597 if (superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull() &&
2598 superCluster->clusters().isAvailable()) {
2599 for (
auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
2600 const double energy = (*iter)->energy();
2601 if (iter == superCluster->clustersBegin())
2612 template <
typename Cand
idateCollection,
typename TauCastType>
2635 const bool isInside_innerSigCone =
dR < innerSigCone_radius;
2636 if (isInside_innerSigCone) {
2637 p4_inner +=
cand->p4();
2640 p4_outer +=
cand->p4();
2656 template <
typename Cand
idateCollection,
typename TauCastType>
2680 static constexpr
double min_pt = 30., min_radius = 0.05, cone_opening_coef = 3.;
2686 template <
typename TauCastType>
2688 const size_t tau_index,
2690 TauFunc tau_funcs) {
2691 if (tau_funcs.getHasSecondaryVertex(
tau, tau_index)) {
2692 static constexpr
double mTau = 1.77682;
2693 const double mAOne =
tau.p4().M();
2694 const double pAOneMag =
tau.p();
2695 const double argumentThetaGJmax = (
std::pow(mTau, 2) -
std::pow(mAOne, 2)) / (2 * mTau * pAOneMag);
2696 const double argumentThetaGJmeasured =
tau.p4().Vect().Dot(tau_funcs.getFlightLength(
tau, tau_index)) /
2697 (pAOneMag * tau_funcs.getFlightLength(
tau, tau_index).R());
2698 if (
std::abs(argumentThetaGJmax) <= 1. &&
std::abs(argumentThetaGJmeasured) <= 1.) {
2699 double thetaGJmax = std::asin(argumentThetaGJmax);
2700 double thetaGJmeasured = std::acos(argumentThetaGJmeasured);
2701 gj_diff = thetaGJmeasured - thetaGJmax;
2708 template <
typename TauCastType>
2710 const size_t tau_index,
2711 TauFunc tau_funcs) {
2714 return static_cast<float>(gj_diff);
2720 return abs_eta > 1.46 && abs_eta < 1.558;
2723 template <
typename TauCastType>
2725 const std::vector<pat::Electron>*
electrons,
2730 if (
reco::deltaR2(
tau.p4(), ele.p4()) < dR2 && (!matched_ele || matched_ele->
pt() < ele.pt())) {
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)
static constexpr float default_value
constexpr double deltaPhi(double phi1, double phi2)
std::unique_ptr< Cutter > CutterPtr
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)
tensorflow::Tensor getPredictions(edm::Event &event, edm::Handle< TauCollection > taus)
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 ...
T getParameter(std::string const &) const
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
std::map< BasicDiscriminator, size_t > basicDiscrdR03IndexMap_
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
std::map< std::string, WPList > workingPoints_
static void processIsolationPFComponents(const TauCastType &tau, const CandidateCollection &candidates, LorentzVectorXYZ &p4, float &pt, float &d_eta, float &d_phi, float &m, float &n)
static std::unique_ptr< deep_tau::DeepTauCache > initializeGlobalCache(const edm::ParameterSet &cfg)
double pt() const final
transverse momentum
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)
DeepTauCache(const std::map< std::string, std::string > &graph_names, bool mem_mapped)
float pt_weighted_dr_signal(const reco::PFTau &tau, int dm)
std::string fullPath() const
bool operator<(IOVSyncValue const &iLHS, IOVSyncValue const &iRHS)
std::unique_ptr< TF1 > fn_
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_
std::map< std::string, tensorflow::Session * > sessions_
edm::EDGetTokenT< reco::VertexCollection > vtxToken_
GraphDef * loadGraphDef(const std::string &pbFile)
static double getInnerSignalConeRadius(double pt)
std::vector< TauDiscInfo< reco::PFTauDiscriminator > > recoPrediscriminants_
uint8_t andPrediscriminants_
std::ofstream * json_file_
unsigned long long EventNumber_t
OutputCollection outputs_
static bool isAbove(double value, double min)
static bool isInEcalCrack(double eta)
void setCellConvFeatures(tensorflow::Tensor &convTensor, const tensorflow::Tensor &features, unsigned batch_idx, int eta_index, int phi_index)
std::vector< TauDiscInfo< pat::PATTauDiscriminator > > patPrediscriminants_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
pat::ElectronCollection ElectronCollection
const unsigned sub_version_
pfTauTransverseImpactParameters
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)
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, const edm::EventNumber_t &eventnr, std::vector< tensorflow::Tensor > &pred_vector, TauFunc tau_funcs)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
std::vector< Vertex > VertexCollection
edm::RefProd< PFTauCollection > PFTauRefProd
references to PFTau collection
const std::map< ValueQuantityType, double > min_value
ParameterSet const & parameterSet(StableProvenance const &provenance, ProcessHistory const &history)
edm::EDGetTokenT< TauCollection > tausToken_
static const double deltaEta
static std::string to_string(const XMLCh *ch)
const std::map< std::pair< deep_tau::Scaling::FeatureT, bool >, deep_tau::Scaling::ScalingParams > * scalingParamsMap_
static const OutputCollection & GetOutputs()
static std::string const input
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > convTensor_
DeepTauId(const edm::ParameterSet &cfg, const deep_tau::DeepTauCache *cache)
const std::map< std::pair< FeatureT, bool >, ScalingParams > scalingParamsMap_v2p5
std::unique_ptr< TauDiscriminator > get_value(const edm::Handle< TauCollection > &taus, const tensorflow::Tensor &pred, const WPList *working_points, bool is_online) const
void fill(const edm::Event &evt)
const deep_tau::DeepTauCache * cache_
edm::EDGetTokenT< CandidateCollection > pfcandToken_
std::string output_layer_
std::vector< Electron > ElectronCollection
std::shared_ptr< tensorflow::GraphDef > GraphPtr
static constexpr float pi
static float getValue(T value)
const tensorflow::GraphDef & getGraph(const std::string &name="") const
float pt_weighted_deta_strip(const reco::PFTau &tau, int dm)
std::vector< float > features(const reco::PreId &ecal, const reco::PreId &hcal, double rho, const reco::BeamSpot &spot, noZS::EcalClusterLazyTools &ecalTools)
const std::map< BasicDiscriminator, size_t > matchDiscriminatorIndices(edm::Event &event, edm::EDGetTokenT< reco::TauDiscriminatorContainer > discriminatorContainerToken, std::vector< BasicDiscriminator > requiredDiscr)
TauWPThreshold(const std::string &cut_str)
edm::Handle< ConsumeType > handle
std::vector< std::string > getParameterNamesForType(bool trackiness=true) 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_
bool closeSession(Session *&session)
static float getValueNorm(T value, float mean, float sigma, float n_sigmas_max=5)
Abs< T >::type abs(const T &t)
float pt_weighted_dr_iso(const reco::PFTau &tau, int dm)
basicTauDiscriminatorsdR03
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)
#define DEFINE_FWK_MODULE(type)
static void globalEndJob(const deep_tau::DeepTauCache *cache_)
std::vector< size_t > den_
std::vector< size_t > num_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void checkInputs(const tensorflow::Tensor &inputs, const std::string &block_name, int n_inputs, const CellGrid *grid=nullptr) const
tensorflow::Session & getSession(const std::string &name="") const
const_reference at(size_type pos) const
Analysis-level tau class.
const std::map< std::pair< FeatureT, bool >, ScalingParams > scalingParamsMap_v2p1
Session * createSession()
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
const std::vector< BasicDiscriminator > requiredBasicDiscriminators_
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > LorentzVectorXYZ
tensorflow::Tensor getPartialPredictions(bool is_inner)
const std::vector< BasicDiscriminator > requiredBasicDiscriminatorsdR03_
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)
double operator()(const reco::BaseTau &tau, bool isPFTau) const
float eratio(const reco::PFTau &tau)
return ratio of energy in ECAL over sum of energy in ECAL and HCAL
void createOutputs(edm::Event &event, const tensorflow::Tensor &pred, edm::Handle< TauCollection > taus)
Analysis-level electron class.
void add(std::string const &label, ParameterSetDescription const &psetDescription)
disable_CellIndex_workaround
pat::MuonCollection MuonCollection
edm::Ref< PFTauTransverseImpactParameterCollection > PFTauTransverseImpactParameterRef
presistent reference to a PFTauTransverseImpactParameter
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminators_inputToken_
std::vector< Muon > MuonCollection
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.
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
const bool disable_hcalFraction_workaround_
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminatorsdR03_inputToken_
std::map< std::string, GraphPtr > graphs_
const std::map< ValueQuantityType, double > max_value
disable_hcalFraction_workaround
const std::map< BasicDiscriminator, std::string > stringFromDiscriminator_
std::vector< int > tauInputs_indices_
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::map< std::string, std::unique_ptr< tensorflow::MemmappedEnv > > memmappedEnv_
Log< level::Warning, false > LogWarning
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
edm::EDGetTokenT< std::vector< pat::Electron > > electrons_token_
TupleMultiplicity< TrackerTraits > const *__restrict__ uint32_t nHits
Output(const std::vector< size_t > &num, const std::vector< size_t > &den)
void produce(edm::Event &event, const edm::EventSetup &es) override
edm::EDGetTokenT< std::vector< pat::Muon > > muons_token_
T operator[](int i) const
edm::EDGetTokenT< double > rho_token_
static void calculateElectronClusterVars(const pat::Electron *ele, float &elecEe, float &elecEgamma)
T const & const_reference
static const std::string subdets[7]
const std::map< std::pair< FeatureT, bool >, ScalingParams > scalingParamsMap_PhaseIIv2p5
Analysis-level muon class.
std::map< std::string, Output > OutputCollection
void countHits(const reco::Muon &muon, std::vector< int > &numHitsDT, std::vector< int > &numHitsCSC, std::vector< int > &numHitsRPC)
std::vector< CutterPtr > WPList
edm::EDGetTokenT< ConsumeType > disc_token
constexpr int NumberOfOutputs
std::unique_ptr< tensorflow::Tensor > tauBlockTensor_