18 struct dnn_inputs_2017v1 {
23 hasSecondaryVertex, flightLength_r, flightLength_dEta, flightLength_dPhi,
24 flightLength_sig, leadChargedHadrCand_pt, leadChargedHadrCand_dEta,
27 leadingTrackNormChi2, e_ratio, gj_angle_diff, n_photons, emFraction,
28 has_gsf_track, inside_ecal_crack,
29 gsf_ele_matched, gsf_ele_pt, gsf_ele_dEta, gsf_ele_dPhi, gsf_ele_mass, gsf_ele_Ee,
30 gsf_ele_Egamma, gsf_ele_Pin, gsf_ele_Pout, gsf_ele_EtotOverPin, gsf_ele_Eecal,
31 gsf_ele_dEta_SeedClusterTrackAtCalo, gsf_ele_dPhi_SeedClusterTrackAtCalo, gsf_ele_mvaIn_sigmaEtaEta,
32 gsf_ele_mvaIn_hadEnergy,
33 gsf_ele_mvaIn_deltaEta, gsf_ele_Chi2NormGSF, gsf_ele_GSFNumHits, gsf_ele_GSFTrackResol,
34 gsf_ele_GSFTracklnPt, gsf_ele_Chi2NormKF, gsf_ele_KFNumHits,
35 leadChargedCand_etaAtEcalEntrance, leadChargedCand_pt, leadChargedHadrCand_HoP,
36 leadChargedHadrCand_EoP, tau_visMass_innerSigCone,
37 n_matched_muons, muon_pt, muon_dEta, muon_dPhi,
38 muon_n_matches_DT_1, muon_n_matches_DT_2, muon_n_matches_DT_3, muon_n_matches_DT_4,
39 muon_n_matches_CSC_1, muon_n_matches_CSC_2, muon_n_matches_CSC_3, muon_n_matches_CSC_4,
40 muon_n_hits_DT_2, muon_n_hits_DT_3, muon_n_hits_DT_4,
41 muon_n_hits_CSC_2, muon_n_hits_CSC_3, muon_n_hits_CSC_4,
42 muon_n_hits_RPC_2, muon_n_hits_RPC_3, muon_n_hits_RPC_4,
43 muon_n_stations_with_matches_03, muon_n_stations_with_hits_23,
44 signalChargedHadrCands_sum_innerSigCone_pt, signalChargedHadrCands_sum_innerSigCone_dEta,
45 signalChargedHadrCands_sum_innerSigCone_dPhi, signalChargedHadrCands_sum_innerSigCone_mass,
46 signalChargedHadrCands_sum_outerSigCone_pt, signalChargedHadrCands_sum_outerSigCone_dEta,
47 signalChargedHadrCands_sum_outerSigCone_dPhi, signalChargedHadrCands_sum_outerSigCone_mass,
48 signalChargedHadrCands_nTotal_innerSigCone, signalChargedHadrCands_nTotal_outerSigCone,
49 signalNeutrHadrCands_sum_innerSigCone_pt, signalNeutrHadrCands_sum_innerSigCone_dEta,
50 signalNeutrHadrCands_sum_innerSigCone_dPhi, signalNeutrHadrCands_sum_innerSigCone_mass,
51 signalNeutrHadrCands_sum_outerSigCone_pt, signalNeutrHadrCands_sum_outerSigCone_dEta,
52 signalNeutrHadrCands_sum_outerSigCone_dPhi, signalNeutrHadrCands_sum_outerSigCone_mass,
53 signalNeutrHadrCands_nTotal_innerSigCone, signalNeutrHadrCands_nTotal_outerSigCone,
54 signalGammaCands_sum_innerSigCone_pt, signalGammaCands_sum_innerSigCone_dEta,
55 signalGammaCands_sum_innerSigCone_dPhi, signalGammaCands_sum_innerSigCone_mass,
56 signalGammaCands_sum_outerSigCone_pt, signalGammaCands_sum_outerSigCone_dEta,
57 signalGammaCands_sum_outerSigCone_dPhi, signalGammaCands_sum_outerSigCone_mass,
58 signalGammaCands_nTotal_innerSigCone, signalGammaCands_nTotal_outerSigCone,
59 isolationChargedHadrCands_sum_pt, isolationChargedHadrCands_sum_dEta,
60 isolationChargedHadrCands_sum_dPhi, isolationChargedHadrCands_sum_mass,
61 isolationChargedHadrCands_nTotal,
62 isolationNeutrHadrCands_sum_pt, isolationNeutrHadrCands_sum_dEta,
63 isolationNeutrHadrCands_sum_dPhi, isolationNeutrHadrCands_sum_mass,
64 isolationNeutrHadrCands_nTotal,
65 isolationGammaCands_sum_pt, isolationGammaCands_sum_dEta,
66 isolationGammaCands_sum_dPhi, isolationGammaCands_sum_mass,
67 isolationGammaCands_nTotal,
75 constexpr int number_of_conv_features = 64;
76 namespace TauBlockInputs {
80 neutralIsoPtSum, neutralIsoPtSumWeight_over_neutralIsoPtSum, neutralIsoPtSumWeightdR03_over_neutralIsoPtSum,
82 tau_dxy_pca_x, tau_dxy_pca_y, tau_dxy_pca_z, tau_dxy_valid, tau_dxy, tau_dxy_sig,
83 tau_ip3d_valid, tau_ip3d, tau_ip3d_sig, tau_dz, tau_dz_sig_valid, tau_dz_sig,
84 tau_flightLength_x, tau_flightLength_y, tau_flightLength_z, tau_flightLength_sig,
85 tau_pt_weighted_deta_strip, tau_pt_weighted_dphi_strip, tau_pt_weighted_dr_signal,
86 tau_pt_weighted_dr_iso, tau_leadingTrackNormChi2, tau_e_ratio_valid, tau_e_ratio,
87 tau_gj_angle_diff_valid, tau_gj_angle_diff, tau_n_photons, tau_emFraction,
88 tau_inside_ecal_crack, leadChargedCand_etaAtEcalEntrance_minus_tau_eta, NumberOfInputs
92 namespace EgammaBlockInputs {
94 rho = 0,
tau_pt,
tau_eta, tau_inside_ecal_crack, pfCand_ele_valid, pfCand_ele_rel_pt,
95 pfCand_ele_deta, pfCand_ele_dphi, pfCand_ele_pvAssociationQuality, pfCand_ele_puppiWeight,
96 pfCand_ele_charge, pfCand_ele_lostInnerHits, pfCand_ele_numberOfPixelHits, pfCand_ele_vertex_dx,
97 pfCand_ele_vertex_dy, pfCand_ele_vertex_dz, pfCand_ele_vertex_dx_tauFL, pfCand_ele_vertex_dy_tauFL,
98 pfCand_ele_vertex_dz_tauFL, pfCand_ele_hasTrackDetails, pfCand_ele_dxy, pfCand_ele_dxy_sig,
99 pfCand_ele_dz, pfCand_ele_dz_sig, pfCand_ele_track_chi2_ndof, pfCand_ele_track_ndof,
100 ele_valid, ele_rel_pt, ele_deta, ele_dphi, ele_cc_valid, ele_cc_ele_rel_energy, ele_cc_gamma_rel_energy,
101 ele_cc_n_gamma, ele_rel_trackMomentumAtVtx, ele_rel_trackMomentumAtCalo, ele_rel_trackMomentumOut,
102 ele_rel_trackMomentumAtEleClus, ele_rel_trackMomentumAtVtxWithConstraint,
103 ele_rel_ecalEnergy, ele_ecalEnergy_sig, ele_eSuperClusterOverP,
104 ele_eSeedClusterOverP, ele_eSeedClusterOverPout, ele_eEleClusterOverPout,
105 ele_deltaEtaSuperClusterTrackAtVtx, ele_deltaEtaSeedClusterTrackAtCalo,
106 ele_deltaEtaEleClusterTrackAtCalo, ele_deltaPhiEleClusterTrackAtCalo,
107 ele_deltaPhiSuperClusterTrackAtVtx, ele_deltaPhiSeedClusterTrackAtCalo,
108 ele_mvaInput_earlyBrem, ele_mvaInput_lateBrem, ele_mvaInput_sigmaEtaEta,
109 ele_mvaInput_hadEnergy, ele_mvaInput_deltaEta, ele_gsfTrack_normalizedChi2,
110 ele_gsfTrack_numberOfValidHits, ele_rel_gsfTrack_pt, ele_gsfTrack_pt_sig,
111 ele_has_closestCtfTrack, ele_closestCtfTrack_normalizedChi2, ele_closestCtfTrack_numberOfValidHits,
112 pfCand_gamma_valid, pfCand_gamma_rel_pt, pfCand_gamma_deta, pfCand_gamma_dphi,
113 pfCand_gamma_pvAssociationQuality, pfCand_gamma_fromPV, pfCand_gamma_puppiWeight,
114 pfCand_gamma_puppiWeightNoLep, pfCand_gamma_lostInnerHits, pfCand_gamma_numberOfPixelHits,
115 pfCand_gamma_vertex_dx, pfCand_gamma_vertex_dy, pfCand_gamma_vertex_dz, pfCand_gamma_vertex_dx_tauFL,
116 pfCand_gamma_vertex_dy_tauFL, pfCand_gamma_vertex_dz_tauFL, pfCand_gamma_hasTrackDetails,
117 pfCand_gamma_dxy, pfCand_gamma_dxy_sig, pfCand_gamma_dz, pfCand_gamma_dz_sig,
118 pfCand_gamma_track_chi2_ndof, pfCand_gamma_track_ndof,
123 namespace MuonBlockInputs {
125 rho = 0,
tau_pt,
tau_eta, tau_inside_ecal_crack, pfCand_muon_valid, pfCand_muon_rel_pt,
126 pfCand_muon_deta, pfCand_muon_dphi, pfCand_muon_pvAssociationQuality, pfCand_muon_fromPV,
127 pfCand_muon_puppiWeight, pfCand_muon_charge, pfCand_muon_lostInnerHits, pfCand_muon_numberOfPixelHits,
128 pfCand_muon_vertex_dx, pfCand_muon_vertex_dy, pfCand_muon_vertex_dz, pfCand_muon_vertex_dx_tauFL,
129 pfCand_muon_vertex_dy_tauFL, pfCand_muon_vertex_dz_tauFL,pfCand_muon_hasTrackDetails, pfCand_muon_dxy,
130 pfCand_muon_dxy_sig, pfCand_muon_dz, pfCand_muon_dz_sig, pfCand_muon_track_chi2_ndof,
131 pfCand_muon_track_ndof, muon_valid, muon_rel_pt, muon_deta, muon_dphi, muon_dxy, muon_dxy_sig,
132 muon_normalizedChi2_valid, muon_normalizedChi2, muon_numberOfValidHits, muon_segmentCompatibility,
133 muon_caloCompatibility, muon_pfEcalEnergy_valid, muon_rel_pfEcalEnergy, muon_n_matches_DT_1,
134 muon_n_matches_DT_2, muon_n_matches_DT_3, muon_n_matches_DT_4, muon_n_matches_CSC_1,
135 muon_n_matches_CSC_2, muon_n_matches_CSC_3, muon_n_matches_CSC_4, muon_n_matches_RPC_1,
136 muon_n_matches_RPC_2, muon_n_matches_RPC_3, muon_n_matches_RPC_4, muon_n_hits_DT_1, muon_n_hits_DT_2,
137 muon_n_hits_DT_3, muon_n_hits_DT_4, muon_n_hits_CSC_1, muon_n_hits_CSC_2, muon_n_hits_CSC_3,
138 muon_n_hits_CSC_4, muon_n_hits_RPC_1, muon_n_hits_RPC_2, muon_n_hits_RPC_3, muon_n_hits_RPC_4,
143 namespace HadronBlockInputs {
145 rho = 0,
tau_pt,
tau_eta, tau_inside_ecal_crack, pfCand_chHad_valid,
146 pfCand_chHad_rel_pt, pfCand_chHad_deta, pfCand_chHad_dphi, pfCand_chHad_leadChargedHadrCand,
147 pfCand_chHad_pvAssociationQuality, pfCand_chHad_fromPV, pfCand_chHad_puppiWeight,
148 pfCand_chHad_puppiWeightNoLep, pfCand_chHad_charge, pfCand_chHad_lostInnerHits,
149 pfCand_chHad_numberOfPixelHits, pfCand_chHad_vertex_dx, pfCand_chHad_vertex_dy,
150 pfCand_chHad_vertex_dz, pfCand_chHad_vertex_dx_tauFL, pfCand_chHad_vertex_dy_tauFL,
151 pfCand_chHad_vertex_dz_tauFL, pfCand_chHad_hasTrackDetails, pfCand_chHad_dxy,
152 pfCand_chHad_dxy_sig, pfCand_chHad_dz, pfCand_chHad_dz_sig, pfCand_chHad_track_chi2_ndof,
153 pfCand_chHad_track_ndof, pfCand_chHad_hcalFraction, pfCand_chHad_rawCaloFraction,
154 pfCand_nHad_valid, pfCand_nHad_rel_pt, pfCand_nHad_deta, pfCand_nHad_dphi,
155 pfCand_nHad_puppiWeight, pfCand_nHad_puppiWeightNoLep, pfCand_nHad_hcalFraction, NumberOfInputs
160 template<
typename LVector1,
typename LVector2>
161 float dEta(
const LVector1&
p4,
const LVector2& tau_p4)
163 return static_cast<float>(p4.eta() - tau_p4.eta());
166 template<
typename LVector1,
typename LVector2>
167 float dPhi(
const LVector1& p4_1,
const LVector2& p4_2)
169 return static_cast<float>(
reco::deltaPhi(p4_2.phi(), p4_1.phi()));
172 struct MuonHitMatchV1 {
173 static constexpr int n_muon_stations = 4;
175 std::map<int, std::vector<UInt_t>> n_matches, n_hits;
177 const pat::Muon* best_matched_muon{
nullptr};
178 double deltaR2_best_match{-1};
196 if(!best_matched_muon || dR2 < deltaR2_best_match) {
197 best_matched_muon = &
muon;
198 deltaR2_best_match = dR2;
201 for(
const auto& segment : muon.
matches()) {
202 if(segment.segmentMatches.empty())
continue;
203 if(n_matches.count(segment.detector()))
204 ++n_matches.at(segment.detector()).at(segment.station() - 1);
208 const auto& hit_pattern = muon.
outerTrack()->hitPattern();
211 if(hit_id == 0)
break;
214 const int station = hit_pattern.getMuonStation(hit_id) - 1;
215 if(station > 0 && station < n_stations) {
216 std::vector<UInt_t>* muon_n_hits =
nullptr;
217 if(hit_pattern.muonDTHitFilter(hit_id))
219 else if(hit_pattern.muonCSCHitFilter(hit_id))
221 else if(hit_pattern.muonRPCHitFilter(hit_id))
225 ++muon_n_hits->at(station);
238 std::vector<const pat::Muon*> matched_muons;
239 const double dR2 = deltaR*
deltaR;
242 if(muon.
pt() <=
minPt)
continue;
243 if(reco_muon == hadr_cand_muon)
continue;
245 matched_muons.push_back(&muon);
247 return matched_muons;
250 template<
typename dnn,
typename TensorElemGet>
251 void fillTensor(
const TensorElemGet&
get,
const pat::Tau& tau,
float default_value)
const 253 get(dnn::n_matched_muons) = n_muons;
254 get(dnn::muon_pt) = best_matched_muon !=
nullptr ? best_matched_muon->p4().pt() : default_value;
255 get(dnn::muon_dEta) = best_matched_muon !=
nullptr 256 ?
dEta(best_matched_muon->p4(), tau.
p4()) : default_value;
257 get(dnn::muon_dPhi) = best_matched_muon !=
nullptr 258 ?
dPhi(best_matched_muon->p4(), tau.
p4()) : default_value;
276 get(dnn::muon_n_stations_with_matches_03) = countMuonStationsWithMatches(0, 3);
277 get(dnn::muon_n_stations_with_hits_23) = countMuonStationsWithHits(2, 3);
281 unsigned countMuonStationsWithMatches(
size_t first_station,
size_t last_station)
const 283 static const std::map<int, std::vector<bool>> masks = {
289 for(
unsigned n = first_station;
n <= last_station; ++
n) {
290 for(
const auto&
match : n_matches) {
291 if(!masks.at(
match.first).at(
n) &&
match.second.at(
n) > 0) ++cnt;
297 unsigned countMuonStationsWithHits(
size_t first_station,
size_t last_station)
const 299 static const std::map<int, std::vector<bool>> masks = {
306 for(
unsigned n = first_station;
n <= last_station; ++
n) {
307 for(
const auto&
hit : n_hits) {
308 if(!masks.at(
hit.first).at(
n) &&
hit.second.at(
n) > 0) ++cnt;
317 struct MuonHitMatchV2 {
319 static constexpr size_t n_muon_stations = 4;
320 static constexpr int first_station_id = 1;
321 static constexpr int last_station_id = first_station_id + n_muon_stations - 1;
322 using CountArray = std::array<unsigned, n_muon_stations>;
323 using CountMap = std::map<int, CountArray>;
325 const std::vector<int>& consideredSubdets()
333 static const std::map<int, std::string> subdet_names = {
336 if(!subdet_names.count(subdet))
337 throw cms::Exception(
"MuonHitMatch") <<
"Subdet name for subdet id " << subdet <<
" not found.";
338 return subdet_names.at(subdet);
341 size_t getStationIndex(
int station,
bool throw_exception)
const 343 if(station < first_station_id || station > last_station_id) {
345 throw cms::Exception(
"MuonHitMatch") <<
"Station id is out of range";
348 return static_cast<size_t>(station - 1);
353 for(
int subdet : consideredSubdets()) {
354 n_matches[subdet].fill(0);
355 n_hits[subdet].fill(0);
364 for(
const auto& segment : muon.
matches()) {
365 if(segment.segmentMatches.empty() && segment.rpcMatches.empty())
continue;
366 if(n_matches.count(segment.detector())) {
367 const size_t station_index = getStationIndex(segment.station(),
true);
368 ++n_matches.at(segment.detector()).at(station_index);
376 const auto& hit_pattern = muon.
outerTrack()->hitPattern();
379 if(hit_id == 0)
break;
382 const size_t station_index = getStationIndex(hit_pattern.getMuonStation(hit_id),
false);
383 if(station_index < n_muon_stations) {
384 CountArray* muon_n_hits =
nullptr;
385 if(hit_pattern.muonDTHitFilter(hit_id))
387 else if(hit_pattern.muonCSCHitFilter(hit_id))
389 else if(hit_pattern.muonRPCHitFilter(hit_id))
393 ++muon_n_hits->at(station_index);
400 unsigned nMatches(
int subdet,
int station)
const 402 if(!n_matches.count(subdet))
403 throw cms::Exception(
"MuonHitMatch") <<
"Subdet " << subdet <<
" not found.";
404 const size_t station_index = getStationIndex(station,
true);
405 return n_matches.at(subdet).at(station_index);
408 unsigned nHits(
int subdet,
int station)
const 410 if(!n_hits.count(subdet))
411 throw cms::Exception(
"MuonHitMatch") <<
"Subdet " << subdet <<
" not found.";
412 const size_t station_index = getStationIndex(station,
true);
413 return n_hits.at(subdet).at(station_index);
416 unsigned countMuonStationsWithMatches(
int first_station,
int last_station)
const 418 static const std::map<int, std::vector<bool>> masks = {
423 const size_t first_station_index = getStationIndex(first_station,
true);
424 const size_t last_station_index = getStationIndex(last_station,
true);
426 for(
size_t n = first_station_index;
n <= last_station_index; ++
n) {
427 for(
const auto&
match : n_matches) {
428 if(!masks.at(
match.first).at(
n) &&
match.second.at(
n) > 0) ++cnt;
434 unsigned countMuonStationsWithHits(
int first_station,
int last_station)
const 436 static const std::map<int, std::vector<bool>> masks = {
442 const size_t first_station_index = getStationIndex(first_station,
true);
443 const size_t last_station_index = getStationIndex(last_station,
true);
445 for(
size_t n = first_station_index;
n <= last_station_index; ++
n) {
446 for(
const auto&
hit : n_hits) {
447 if(!masks.at(
hit.first).at(
n) &&
hit.second.at(
n) > 0) ++cnt;
454 CountMap n_matches, n_hits;
457 enum class CellObjectType { PfCand_electron, PfCand_muon, PfCand_chargedHadron, PfCand_neutralHadron,
460 template<
typename Object>
470 static const std::map<int, CellObjectType> obj_types = {
471 { 11, CellObjectType::PfCand_electron },
472 { 13, CellObjectType::PfCand_muon },
473 { 22, CellObjectType::PfCand_gamma },
474 { 130, CellObjectType::PfCand_neutralHadron },
475 { 211, CellObjectType::PfCand_chargedHadron }
479 if(iter == obj_types.end())
480 return CellObjectType::Other;
485 using Cell = std::map<CellObjectType, size_t>;
491 if(eta != other.eta)
return eta < other.eta;
492 return phi < other.phi;
498 using Map = std::map<CellIndex, Cell>;
499 using const_iterator = Map::const_iterator;
501 CellGrid(
unsigned n_cells_eta,
unsigned n_cells_phi,
double cell_size_eta,
double cell_size_phi) :
502 nCellsEta(n_cells_eta), nCellsPhi(n_cells_phi), nTotal(nCellsEta * nCellsPhi),
503 cellSizeEta(cell_size_eta), cellSizePhi(cell_size_phi)
505 if(nCellsEta % 2 != 1 || nCellsEta < 1)
506 throw cms::Exception(
"DeepTauId") <<
"Invalid number of eta cells.";
507 if(nCellsPhi % 2 != 1 || nCellsPhi < 1)
508 throw cms::Exception(
"DeepTauId") <<
"Invalid number of phi cells.";
509 if(cellSizeEta <= 0 || cellSizePhi <= 0)
513 int maxEtaIndex()
const {
return static_cast<int>((nCellsEta - 1) / 2); }
514 int maxPhiIndex()
const {
return static_cast<int>((nCellsPhi - 1) / 2); }
515 double maxDeltaEta()
const {
return cellSizeEta * (0.5 + maxEtaIndex()); }
516 double maxDeltaPhi()
const {
return cellSizePhi * (0.5 + maxPhiIndex()); }
517 int getEtaTensorIndex(
const CellIndex& cellIndex)
const {
return cellIndex.eta + maxEtaIndex(); }
518 int getPhiTensorIndex(
const CellIndex& cellIndex)
const {
return cellIndex.phi + maxPhiIndex(); }
520 bool tryGetCellIndex(
double deltaEta,
double deltaPhi, CellIndex& cellIndex)
const 522 static auto getCellIndex = [](
double x,
double maxX,
double size,
int&
index) {
524 if(absX > maxX)
return false;
525 const double absIndex = std::floor(
std::abs(absX / size - 0.5));
526 index =
static_cast<int>(std::copysign(absIndex, x));
530 return getCellIndex(deltaEta, maxDeltaEta(), cellSizeEta, cellIndex.eta)
531 && getCellIndex(deltaPhi,
maxDeltaPhi(), cellSizePhi, cellIndex.phi);
534 Cell&
operator[](
const CellIndex& cellIndex) {
return cells[cellIndex]; }
535 const Cell& at(
const CellIndex& cellIndex)
const {
return cells.at(cellIndex); }
536 size_t count(
const CellIndex& cellIndex)
const {
return cells.count(cellIndex); }
537 const_iterator
find(
const CellIndex& cellIndex)
const {
return cells.find(cellIndex); }
538 const_iterator
begin()
const {
return cells.begin(); }
539 const_iterator
end()
const {
return cells.end(); }
542 const unsigned nCellsEta, nCellsPhi, nTotal;
543 const double cellSizeEta, cellSizePhi;
546 std::map<CellIndex, Cell>
cells;
558 static constexpr size_t e_index = 0, mu_index = 1, tau_index = 2, jet_index = 3;
560 {
"VSe",
Output({tau_index}, {e_index, tau_index}) },
561 {
"VSmu",
Output({tau_index}, {mu_index, tau_index}) },
562 {
"VSjet",
Output({tau_index}, {jet_index, tau_index}) },
576 desc.
add<std::vector<std::string>>(
"graph_file", {
"RecoTauTag/TrainingFiles/data/DeepTauId/deepTau_2017v2p6_e6.pb"});
577 desc.
add<
bool>(
"mem_mapped",
false);
578 desc.
add<
unsigned>(
"version", 2);
579 desc.
add<
int>(
"debug_level", 0);
580 desc.
add<
bool>(
"disable_dxy_pca",
false);
595 descriptions.
add(
"DeepTau", desc);
600 DeepTauBase(cfg, GetOutputs(), cache),
602 muons_token_(consumes<
MuonCollection>(cfg.getParameter<
edm::InputTag>(
"muons"))),
603 rho_token_(consumes<double>(cfg.getParameter<
edm::InputTag>(
"rho"))),
604 version(cfg.getParameter<unsigned>(
"version")),
605 debug_level(cfg.getParameter<
int>(
"debug_level")),
606 disable_dxy_pca_(cfg.getParameter<
bool>(
"disable_dxy_pca"))
609 input_layer_ = cache_->getGraph().node(0).name();
610 output_layer_ = cache_->getGraph().node(cache_->getGraph().node_size() - 1).
name();
611 const auto& shape = cache_->getGraph().node(0).attr().at(
"shape").shape();
612 if(shape.dim(1).size() != dnn_inputs_2017v1::NumberOfInputs)
613 throw cms::Exception(
"DeepTauId") <<
"number of inputs does not match the expected inputs for the given version";
615 tauBlockTensor_ = std::make_shared<tensorflow::Tensor>(tensorflow::DT_FLOAT, tensorflow::TensorShape{ 1,
616 dnn_inputs_2017_v2::TauBlockInputs::NumberOfInputs});
617 for(
size_t n = 0;
n < 2; ++
n) {
618 const bool is_inner =
n == 0;
619 const auto n_cells = is_inner ? dnn_inputs_2017_v2::number_of_inner_cell
620 : dnn_inputs_2017_v2::number_of_outer_cell;
621 eGammaTensor_[is_inner] = std::make_shared<tensorflow::Tensor>(tensorflow::DT_FLOAT,
622 tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::EgammaBlockInputs::NumberOfInputs});
623 muonTensor_[is_inner] = std::make_shared<tensorflow::Tensor>(tensorflow::DT_FLOAT,
624 tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::MuonBlockInputs::NumberOfInputs});
625 hadronsTensor_[is_inner] = std::make_shared<tensorflow::Tensor>(tensorflow::DT_FLOAT,
626 tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::HadronBlockInputs::NumberOfInputs});
627 convTensor_[is_inner] = std::make_shared<tensorflow::Tensor>(tensorflow::DT_FLOAT,
628 tensorflow::TensorShape{1, n_cells, n_cells, dnn_inputs_2017_v2::number_of_conv_features});
629 zeroOutputTensor_[is_inner] = std::make_shared<tensorflow::Tensor>(tensorflow::DT_FLOAT,
630 tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::number_of_conv_features});
633 eGammaTensor_[is_inner]->flat<
float>().setZero();
634 muonTensor_[is_inner]->flat<
float>().setZero();
635 hadronsTensor_[is_inner]->flat<
float>().setZero();
636 getPartialPredictions(*zeroOutputTensor_[is_inner], is_inner, 0, 0);
660 return std::isnormal(value) ?
static_cast<float>(
value) : 0.
f;
666 const float fixed_value =
getValue(value);
667 const float clamped_value = std::clamp(fixed_value, min_value, max_value);
668 float transformed_value = (clamped_value -
min_value) / (max_value - min_value);
670 transformed_value = transformed_value * 2 - 1;
671 return transformed_value;
677 const float fixed_value =
getValue(value);
678 const float norm_value = (fixed_value -
mean) / sigma;
679 return std::clamp(norm_value, -n_sigmas_max, n_sigmas_max);
685 cc_ele_energy = cc_gamma_energy = 0;
688 if(superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull()
689 && superCluster->clusters().isAvailable()) {
690 for(
auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
691 const float energy =
static_cast<float>((*iter)->energy());
692 if(iter == superCluster->clustersBegin())
693 cc_ele_energy += energy;
695 cc_gamma_energy += energy;
704 inline void checkInputs(
const tensorflow::Tensor&
inputs,
const char* block_name,
int n_inputs,
int n_eta = 1,
707 if(debug_level >= 1){
709 for(
int phi = 0; phi < n_phi; phi++){
710 for(
int k = 0;
k < n_inputs; ++
k) {
711 const float input = n_eta == 1 && n_phi == 1
712 ? inputs.matrix<
float>()(0,
k) : inputs.tensor<
float,4>()(0,
eta, phi,
k);
714 throw cms::Exception(
"DeepTauId") <<
"in the " << block_name <<
", input is not finite, i.e. infinite or NaN, for eta_index = " 715 << n_eta <<
", phi_index = " << n_phi <<
", input_index = " <<
k;
717 std::cout << block_name <<
"," <<
eta <<
","<< phi <<
"," << k <<
"," << std::setprecision(5) <<
std::fixed << input <<
'\n';
729 event.getByToken(electrons_token_, electrons);
732 event.getByToken(muons_token_, muons);
735 event.getByToken(pfcandToken_, pfCands);
738 event.getByToken(vtxToken_, vertices);
741 event.getByToken(rho_token_, rho);
743 tensorflow::Tensor predictions(tensorflow::DT_FLOAT, {
static_cast<int>(taus->size()),
745 for(
size_t tau_index = 0; tau_index < taus->size(); ++tau_index) {
746 std::vector<tensorflow::Tensor> pred_vector;
748 getPredictionsV1(taus->at(tau_index), *
electrons, *
muons, pred_vector);
750 getPredictionsV2(taus->at(tau_index), *
electrons, *
muons, *pfCands, vertices->at(0), *rho, pred_vector);
754 const float pred = pred_vector[0].flat<
float>()(
k);
755 if(!(pred >= 0 && pred <= 1))
756 throw cms::Exception(
"DeepTauId") <<
"invalid prediction = " << pred <<
" for tau_index = " 757 << tau_index <<
", pred_index = " <<
k;
758 predictions.matrix<
float>()(tau_index, k) = pred;
768 tensorflow::run(&(cache_->getSession()), { { input_layer_, inputs } }, { output_layer_ }, &pred_vector);
773 const reco::Vertex&
pv,
double rho, std::vector<tensorflow::Tensor>& pred_vector)
775 CellGrid inner_grid(dnn_inputs_2017_v2::number_of_inner_cell, dnn_inputs_2017_v2::number_of_inner_cell,
777 CellGrid outer_grid(dnn_inputs_2017_v2::number_of_outer_cell, dnn_inputs_2017_v2::number_of_outer_cell,
779 fillGrids(tau, electrons, inner_grid, outer_grid);
780 fillGrids(tau, muons, inner_grid, outer_grid);
781 fillGrids(tau, pfCands, inner_grid, outer_grid);
783 createTauBlockInputs(tau, pv, rho);
784 createConvFeatures(tau, pv, rho, electrons, muons, pfCands, inner_grid,
true);
785 createConvFeatures(tau, pv, rho, electrons, muons, pfCands, outer_grid,
false);
788 { {
"input_tau", *tauBlockTensor_ },
789 {
"input_inner", *convTensor_.at(
true)}, {
"input_outer", *convTensor_.at(
false) } },
790 {
"main_output/Softmax" }, &pred_vector);
793 template<
typename Collection>
796 static constexpr double outer_dR2 = 0.25;
797 const double inner_radius = getInnerSignalConeRadius(tau.
polarP4().pt());
798 const double inner_dR2 =
std::pow(inner_radius, 2);
800 const auto addObject = [&](
size_t n,
double deta,
double dphi, CellGrid&
grid) {
801 const auto&
obj = objects.at(n);
803 if(obj_type == CellObjectType::Other)
return;
804 CellIndex cell_index;
805 if(
grid.tryGetCellIndex(deta, dphi, cell_index)) {
806 Cell& cell =
grid[cell_index];
807 auto iter = cell.find(obj_type);
808 if(iter != cell.end()) {
809 const auto& prev_obj = objects.at(iter->second);
810 if(
obj.polarP4().pt() > prev_obj.polarP4().pt())
818 for(
size_t n = 0; n < objects.size(); ++
n) {
819 const auto&
obj = objects.at(n);
820 const double deta =
obj.polarP4().eta() - tau.
polarP4().eta();
824 addObject(n, deta, dphi, inner_grid);
826 addObject(n, deta, dphi, outer_grid);
832 std::vector<tensorflow::Tensor> pred_vector;
835 { {
"input_inner_egamma", *eGammaTensor_.at(is_inner) },
836 {
"input_inner_muon", *muonTensor_.at(is_inner) },
837 {
"input_inner_hadrons", *hadronsTensor_.at(is_inner) }, },
838 {
"inner_all_dropout_4/Identity" }, &pred_vector);
841 { {
"input_outer_egamma", *eGammaTensor_.at(is_inner) },
842 {
"input_outer_muon", *muonTensor_.at(is_inner) },
843 {
"input_outer_hadrons", *hadronsTensor_.at(is_inner) }, },
844 {
"outer_all_dropout_4/Identity" }, &pred_vector);
846 setCellConvFeatures(convTensor, pred_vector.at(0), eta_index, phi_index);
853 tensorflow::Tensor& convTensor = *convTensor_.at(is_inner);
854 for(
int eta = -grid.maxEtaIndex();
eta <= grid.maxEtaIndex(); ++
eta) {
855 for(
int phi = -grid.maxPhiIndex(); phi <= grid.maxPhiIndex(); ++phi) {
856 const CellIndex cell_index{
eta, phi};
857 const int eta_index = grid.getEtaTensorIndex(cell_index);
858 const int phi_index = grid.getPhiTensorIndex(cell_index);
860 const auto cell_iter = grid.find(cell_index);
861 if(cell_iter != grid.end()) {
862 const Cell& cell = cell_iter->second;
863 createEgammaBlockInputs(tau, pv, rho, electrons, pfCands, cell, is_inner);
864 createMuonBlockInputs(tau, pv, rho, muons, pfCands, cell, is_inner);
865 createHadronsBlockInputs(tau, pv, rho, pfCands, cell, is_inner);
866 getPartialPredictions(convTensor, is_inner, eta_index, phi_index);
868 setCellConvFeatures(convTensor, *zeroOutputTensor_[is_inner], eta_index, phi_index);
875 int eta_index,
int phi_index)
877 for(
int n = 0;
n < dnn_inputs_2017_v2::number_of_conv_features; ++
n)
878 convTensor.tensor<
float, 4>()(0, eta_index, phi_index,
n) = features.tensor<
float, 4>()(0, 0, 0,
n);
885 tensorflow::Tensor&
inputs = *tauBlockTensor_;
886 inputs.flat<
float>().setZero();
888 const auto&
get = [&](
int var_index) ->
float& {
return inputs.matrix<
float>()(0, var_index); };
892 get(
dnn::rho) = getValueNorm(rho, 21.49
f, 9.713
f);
897 get(dnn::tau_E_over_pt) = getValueLinear(tau.
p4().energy() / tau.
p4().pt(), 1.f, 5.2f,
true);
899 get(dnn::tau_n_charged_prongs) = getValueLinear(tau.
decayMode() / 5 + 1, 1, 3,
true);
900 get(dnn::tau_n_neutral_prongs) = getValueLinear(tau.
decayMode() % 5, 0, 2,
true);
902 get(dnn::chargedIsoPtSumdR03_over_dR05) =
getValue(tau.
tauID(
"chargedIsoPtSumdR03") / tau.
tauID(
"chargedIsoPtSum"));
905 get(dnn::neutralIsoPtSumWeight_over_neutralIsoPtSum) =
907 get(dnn::neutralIsoPtSumWeightdR03_over_neutralIsoPtSum) =
909 get(dnn::neutralIsoPtSumdR03_over_dR05) =
getValue(tau.
tauID(
"neutralIsoPtSumdR03") / tau.
tauID(
"neutralIsoPtSum"));
916 if(!disable_dxy_pca_) {
917 get(dnn::tau_dxy_pca_x) = getValueNorm(tau.
dxy_PCA().x(), -0.0241f, 0.0074f);
918 get(dnn::tau_dxy_pca_y) = getValueNorm(tau.
dxy_PCA().y(),0.0675f, 0.0128f);
919 get(dnn::tau_dxy_pca_z) = getValueNorm(tau.
dxy_PCA().z(), 0.7973f, 3.456f);
921 get(dnn::tau_dxy_pca_x) = 0;
922 get(dnn::tau_dxy_pca_y) = 0;
923 get(dnn::tau_dxy_pca_z) = 0;
925 const bool tau_dxy_valid = std::isnormal(tau.
dxy()) && tau.
dxy() > - 10 && std::isnormal(tau.
dxy_error())
928 get(dnn::tau_dxy_valid) = tau_dxy_valid;
929 get(dnn::tau_dxy) = getValueNorm(tau.
dxy(), 0.0018f, 0.0085f);
932 const bool tau_ip3d_valid = std::isnormal(tau.
ip3d()) && tau.
ip3d() > - 10 && std::isnormal(tau.
ip3d_error())
935 get(dnn::tau_ip3d_valid) = tau_ip3d_valid;
936 get(dnn::tau_ip3d) = getValueNorm(tau.
ip3d(), 0.0026f, 0.0114f);
939 if(leadChargedHadrCand){
940 get(dnn::tau_dz) = getValueNorm(leadChargedHadrCand->dz(), 0.f, 0.0190f);
941 const bool tau_dz_sig_valid = leadChargedHadrCand->hasTrackDetails() && std::isnormal(leadChargedHadrCand->dz())
942 && std::isnormal(leadChargedHadrCand->dzError()) && leadChargedHadrCand->dzError() > 0;
943 get(dnn::tau_dz_sig_valid) = tau_dz_sig_valid;
944 const double dzError = leadChargedHadrCand->hasTrackDetails() ? leadChargedHadrCand->dzError() : default_value;
945 get(dnn::tau_dz_sig) = getValueNorm(
std::abs(leadChargedHadrCand->dz()) / dzError, 4.717
f, 11.78
f);
947 get(dnn::tau_flightLength_x) = getValueNorm(tau.
flightLength().x(), -0.0003f, 0.7362f);
948 get(dnn::tau_flightLength_y) = getValueNorm(tau.
flightLength().y(), -0.0009f, 0.7354f);
949 get(dnn::tau_flightLength_z) = getValueNorm(tau.
flightLength().z(), -0.0022f, 1.993f);
951 get(dnn::tau_flightLength_sig) = 0.55756444;
959 const bool tau_e_ratio_valid = std::isnormal(
eratio) &&
eratio > 0.f;
960 get(dnn::tau_e_ratio_valid) = tau_e_ratio_valid;
961 get(dnn::tau_e_ratio) = tau_e_ratio_valid ? getValueLinear(
eratio, 0, 1,
true) : 0.f;
962 const double gj_angle_diff = calculateGottfriedJacksonAngleDifference(tau);
963 const bool tau_gj_angle_diff_valid = (std::isnormal(gj_angle_diff) || gj_angle_diff == 0) && gj_angle_diff >= 0;
964 get(dnn::tau_gj_angle_diff_valid) = tau_gj_angle_diff_valid;
965 get(dnn::tau_gj_angle_diff) = tau_gj_angle_diff_valid ? getValueLinear(gj_angle_diff, 0, pi,
true) : 0;
967 get(dnn::tau_emFraction) = getValueLinear(tau.
emFraction_MVA(), -1, 1,
false);
968 get(dnn::tau_inside_ecal_crack) =
getValue(isInEcalCrack(tau.
p4().eta()));
969 get(dnn::leadChargedCand_etaAtEcalEntrance_minus_tau_eta) =
972 checkInputs(inputs,
"tau_block", dnn::NumberOfInputs);
978 const Cell& cell_map,
bool is_inner)
982 tensorflow::Tensor&
inputs = *eGammaTensor_.at(is_inner);
983 inputs.flat<
float>().setZero();
985 const auto&
get = [&](
int var_index) ->
float& {
986 return inputs.tensor<
float,4>()(0, 0, 0, var_index);
989 const bool valid_index_pf_ele = cell_map.count(CellObjectType::PfCand_electron);
990 const bool valid_index_pf_gamma = cell_map.count(CellObjectType::PfCand_gamma);
993 if(!cell_map.empty()){
994 get(
dnn::rho) = getValueNorm(rho, 21.49
f, 9.713
f);
997 get(dnn::tau_inside_ecal_crack) =
getValue(isInEcalCrack(tau.
polarP4().eta()));
999 if(valid_index_pf_ele){
1000 size_t index_pf_ele = cell_map.at(CellObjectType::PfCand_electron);
1002 get(dnn::pfCand_ele_valid) = valid_index_pf_ele;
1003 get(dnn::pfCand_ele_rel_pt) = getValueNorm(pfCands.at(index_pf_ele).polarP4().pt() / tau.
polarP4().pt(),
1004 is_inner ? 0.9792f : 0.304f, is_inner ? 0.5383f : 1.845f);
1005 get(dnn::pfCand_ele_deta) = getValueLinear(pfCands.at(index_pf_ele).polarP4().eta() - tau.
polarP4().eta(),
1006 is_inner ? -0.1f : -0.5f, is_inner ? 0.1f : 0.5f,
false);
1007 get(dnn::pfCand_ele_dphi) = getValueLinear(
dPhi(tau.
polarP4(), pfCands.at(index_pf_ele).polarP4()),
1008 is_inner ? -0.1
f : -0.5
f, is_inner ? 0.1
f : 0.5
f,
false);
1009 get(dnn::pfCand_ele_pvAssociationQuality) = getValueLinear<int>(pfCands.at(index_pf_ele).pvAssociationQuality(), 0, 7,
true);
1010 get(dnn::pfCand_ele_puppiWeight) =
getValue(pfCands.at(index_pf_ele).puppiWeight());
1011 get(dnn::pfCand_ele_charge) =
getValue(pfCands.at(index_pf_ele).charge());
1012 get(dnn::pfCand_ele_lostInnerHits) = getValue<int>(pfCands.at(index_pf_ele).lostInnerHits());
1013 get(dnn::pfCand_ele_numberOfPixelHits) = getValueLinear(pfCands.at(index_pf_ele).numberOfPixelHits(), 0, 10,
true);
1014 get(dnn::pfCand_ele_vertex_dx) = getValueNorm(pfCands.at(index_pf_ele).vertex().x() - pv.
position().x(), 0.f, 0.1221f);
1015 get(dnn::pfCand_ele_vertex_dy) = getValueNorm(pfCands.at(index_pf_ele).vertex().y() - pv.
position().y(), 0.f, 0.1226f);
1016 get(dnn::pfCand_ele_vertex_dz) = getValueNorm(pfCands.at(index_pf_ele).vertex().z() - pv.
position().z(), 0.001f, 1.024f);
1017 get(dnn::pfCand_ele_vertex_dx_tauFL) = getValueNorm(pfCands.at(index_pf_ele).vertex().x() -
1019 get(dnn::pfCand_ele_vertex_dy_tauFL) = getValueNorm(pfCands.at(index_pf_ele).vertex().y() -
1021 get(dnn::pfCand_ele_vertex_dz_tauFL) = getValueNorm(pfCands.at(index_pf_ele).vertex().z() -
1024 const bool hasTrackDetails = pfCands.at(index_pf_ele).hasTrackDetails();
1025 if(hasTrackDetails){
1026 get(dnn::pfCand_ele_hasTrackDetails) = hasTrackDetails;
1027 get(dnn::pfCand_ele_dxy) = getValueNorm(pfCands.at(index_pf_ele).dxy(), 0.f, 0.171f);
1028 get(dnn::pfCand_ele_dxy_sig) = getValueNorm(
std::abs(pfCands.at(index_pf_ele).dxy()) /
1029 pfCands.at(index_pf_ele).dxyError(), 1.634f, 6.45f);
1030 get(dnn::pfCand_ele_dz) = getValueNorm(pfCands.at(index_pf_ele).dz(), 0.001f, 1.02f);
1031 get(dnn::pfCand_ele_dz_sig) = getValueNorm(
std::abs(pfCands.at(index_pf_ele).dz()) /
1032 pfCands.at(index_pf_ele).dzError(), 24.56f, 210.4f);
1033 get(dnn::pfCand_ele_track_chi2_ndof) = getValueNorm(pfCands.at(index_pf_ele).pseudoTrack().chi2() /
1034 pfCands.at(index_pf_ele).pseudoTrack().ndof(), 2.272f, 8.439f);
1035 get(dnn::pfCand_ele_track_ndof) = getValueNorm(pfCands.at(index_pf_ele).pseudoTrack().ndof(), 15.18f, 3.203f);
1038 if(valid_index_pf_gamma){
1039 size_t index_pf_gamma = cell_map.at(CellObjectType::PfCand_gamma);
1040 get(dnn::pfCand_gamma_valid) = valid_index_pf_gamma;
1041 get(dnn::pfCand_gamma_rel_pt) = getValueNorm(pfCands.at(index_pf_gamma).polarP4().pt() / tau.
polarP4().pt(),
1042 is_inner ? 0.6048f : 0.02576f, is_inner ? 1.669f : 0.3833f);
1043 get(dnn::pfCand_gamma_deta) = getValueLinear(pfCands.at(index_pf_gamma).polarP4().eta() - tau.
polarP4().eta(),
1044 is_inner ? -0.1f : -0.5f, is_inner ? 0.1f : 0.5f,
false);
1045 get(dnn::pfCand_gamma_dphi) = getValueLinear(
dPhi(tau.
polarP4(), pfCands.at(index_pf_gamma).polarP4()),
1046 is_inner ? -0.1
f : -0.5
f, is_inner ? 0.1
f : 0.5
f,
false);
1047 get(dnn::pfCand_gamma_pvAssociationQuality) =
1048 getValueLinear<int>(pfCands.at(index_pf_gamma).pvAssociationQuality(), 0, 7,
true);
1049 get(dnn::pfCand_gamma_fromPV) = getValueLinear<int>(pfCands.at(index_pf_gamma).fromPV(), 0, 3,
true);
1050 get(dnn::pfCand_gamma_puppiWeight) =
getValue(pfCands.at(index_pf_gamma).puppiWeight());
1051 get(dnn::pfCand_gamma_puppiWeightNoLep) =
getValue(pfCands.at(index_pf_gamma).puppiWeightNoLep());
1052 get(dnn::pfCand_gamma_lostInnerHits) = getValue<int>(pfCands.at(index_pf_gamma).lostInnerHits());
1053 get(dnn::pfCand_gamma_numberOfPixelHits) = getValueLinear(pfCands.at(index_pf_gamma).numberOfPixelHits(), 0, 7,
true);
1054 get(dnn::pfCand_gamma_vertex_dx) = getValueNorm(pfCands.at(index_pf_gamma).vertex().x() - pv.
position().x(), 0.f, 0.0067f);
1055 get(dnn::pfCand_gamma_vertex_dy) = getValueNorm(pfCands.at(index_pf_gamma).vertex().y() - pv.
position().y(), 0.f, 0.0069f);
1056 get(dnn::pfCand_gamma_vertex_dz) = getValueNorm(pfCands.at(index_pf_gamma).vertex().z() - pv.
position().z(), 0.f, 0.0578f);
1057 get(dnn::pfCand_gamma_vertex_dx_tauFL) = getValueNorm(pfCands.at(index_pf_gamma).vertex().x() -
1059 get(dnn::pfCand_gamma_vertex_dy_tauFL) = getValueNorm(pfCands.at(index_pf_gamma).vertex().y() -
1061 get(dnn::pfCand_gamma_vertex_dz_tauFL) = getValueNorm(pfCands.at(index_pf_gamma).vertex().z() -
1064 const bool hasTrackDetails = pfCands.at(index_pf_gamma).hasTrackDetails();
1065 if(hasTrackDetails){
1066 get(dnn::pfCand_gamma_hasTrackDetails) = hasTrackDetails;
1067 get(dnn::pfCand_gamma_dxy) = getValueNorm(pfCands.at(index_pf_gamma).dxy(), 0.0004f, 0.882f);
1068 get(dnn::pfCand_gamma_dxy_sig) = getValueNorm(
std::abs(pfCands.at(index_pf_gamma).dxy()) /
1069 pfCands.at(index_pf_gamma).dxyError(), 4.271f, 63.78f);
1070 get(dnn::pfCand_gamma_dz) = getValueNorm(pfCands.at(index_pf_gamma).dz(), 0.0071f, 5.285f);
1071 get(dnn::pfCand_gamma_dz_sig) = getValueNorm(
std::abs(pfCands.at(index_pf_gamma).dz()) /
1072 pfCands.at(index_pf_gamma).dzError(), 162.1f, 622.4f);
1073 get(dnn::pfCand_gamma_track_chi2_ndof) = pfCands.at(index_pf_gamma).pseudoTrack().ndof() > 0 ?
1074 getValueNorm(pfCands.at(index_pf_gamma).pseudoTrack().chi2() /
1075 pfCands.at(index_pf_gamma).pseudoTrack().ndof(), 4.268f, 15.47f) : 0;
1076 get(dnn::pfCand_gamma_track_ndof) = pfCands.at(index_pf_gamma).pseudoTrack().ndof() > 0 ?
1077 getValueNorm(pfCands.at(index_pf_gamma).pseudoTrack().ndof(), 12.25f, 4.774f) : 0;
1080 if(valid_index_ele){
1083 get(dnn::ele_valid) = valid_index_ele;
1084 get(dnn::ele_rel_pt) = getValueNorm(electrons.at(index_ele).polarP4().pt() / tau.
polarP4().pt(),
1085 is_inner ? 1.067f : 0.5111f, is_inner ? 1.521f : 2.765f);
1086 get(dnn::ele_deta) = getValueLinear(electrons.at(index_ele).polarP4().eta() - tau.
polarP4().eta(),
1087 is_inner ? -0.1f : -0.5f, is_inner ? 0.1f : 0.5f,
false);
1088 get(dnn::ele_dphi) = getValueLinear(
dPhi(tau.
polarP4(), electrons.at(index_ele).polarP4()),
1089 is_inner ? -0.1
f : -0.5
f, is_inner ? 0.1
f : 0.5
f,
false);
1091 float cc_ele_energy, cc_gamma_energy;
1093 const bool cc_valid = calculateElectronClusterVarsV2(electrons.at(index_ele), cc_ele_energy, cc_gamma_energy, cc_n_gamma);
1095 get(dnn::ele_cc_valid) = cc_valid;
1096 get(dnn::ele_cc_ele_rel_energy) = getValueNorm(cc_ele_energy / electrons.at(index_ele).polarP4().pt(), 1.729f, 1.644f);
1097 get(dnn::ele_cc_gamma_rel_energy) = getValueNorm(cc_gamma_energy / cc_ele_energy, 0.1439f, 0.3284f);
1098 get(dnn::ele_cc_n_gamma) = getValueNorm(cc_n_gamma, 1.794f, 2.079f);
1100 get(dnn::ele_rel_trackMomentumAtVtx) = getValueNorm(electrons.at(index_ele).trackMomentumAtVtx().R() /
1101 electrons.at(index_ele).polarP4().pt(), 1.531f, 1.424f);
1102 get(dnn::ele_rel_trackMomentumAtCalo) = getValueNorm(electrons.at(index_ele).trackMomentumAtCalo().R() /
1103 electrons.at(index_ele).polarP4().pt(), 1.531f, 1.424f);
1104 get(dnn::ele_rel_trackMomentumOut) = getValueNorm(electrons.at(index_ele).trackMomentumOut().R() /
1105 electrons.at(index_ele).polarP4().pt(), 0.7735f, 0.935f);
1106 get(dnn::ele_rel_trackMomentumAtEleClus) = getValueNorm(electrons.at(index_ele).trackMomentumAtEleClus().R() /
1107 electrons.at(index_ele).polarP4().pt(), 0.7735f, 0.935f);
1108 get(dnn::ele_rel_trackMomentumAtVtxWithConstraint) =
1109 getValueNorm(electrons.at(index_ele).trackMomentumAtVtxWithConstraint().R() /
1110 electrons.at(index_ele).polarP4().pt(), 1.625f, 1.581f);
1111 get(dnn::ele_rel_ecalEnergy) = getValueNorm(electrons.at(index_ele).ecalEnergy() /
1112 electrons.at(index_ele).polarP4().pt(), 1.993f, 1.308f);
1113 get(dnn::ele_ecalEnergy_sig) = getValueNorm(electrons.at(index_ele).ecalEnergy() /
1114 electrons.at(index_ele).ecalEnergyError(), 70.25f, 58.16f);
1115 get(dnn::ele_eSuperClusterOverP) = getValueNorm(electrons.at(index_ele).eSuperClusterOverP(), 2.432f, 15.13f);
1116 get(dnn::ele_eSeedClusterOverP) = getValueNorm(electrons.at(index_ele).eSeedClusterOverP(), 2.034f, 13.96f);
1117 get(dnn::ele_eSeedClusterOverPout) = getValueNorm(electrons.at(index_ele).eSeedClusterOverPout(), 6.64f, 36.8f);
1118 get(dnn::ele_eEleClusterOverPout) = getValueNorm(electrons.at(index_ele).eEleClusterOverPout(), 4.183f, 20.63f);
1119 get(dnn::ele_deltaEtaSuperClusterTrackAtVtx) =
1120 getValueNorm(electrons.at(index_ele).deltaEtaSuperClusterTrackAtVtx(),0.f, 0.0363f);
1121 get(dnn::ele_deltaEtaSeedClusterTrackAtCalo) =
1122 getValueNorm(electrons.at(index_ele).deltaEtaSeedClusterTrackAtCalo(), -0.0001f, 0.0512f);
1123 get(dnn::ele_deltaEtaEleClusterTrackAtCalo) =
1124 getValueNorm(electrons.at(index_ele).deltaEtaEleClusterTrackAtCalo(), -0.0001f, 0.0541f);
1125 get(dnn::ele_deltaPhiEleClusterTrackAtCalo) =
1126 getValueNorm(electrons.at(index_ele).deltaPhiEleClusterTrackAtCalo(), 0.0002f, 0.0553f);
1127 get(dnn::ele_deltaPhiSuperClusterTrackAtVtx) =
1128 getValueNorm(electrons.at(index_ele).deltaPhiSuperClusterTrackAtVtx(), 0.0001f, 0.0523f);
1129 get(dnn::ele_deltaPhiSeedClusterTrackAtCalo) =
1130 getValueNorm(electrons.at(index_ele).deltaPhiSeedClusterTrackAtCalo(), 0.0004f, 0.0777f);
1131 get(dnn::ele_mvaInput_earlyBrem) =
getValue(electrons.at(index_ele).mvaInput().earlyBrem);
1132 get(dnn::ele_mvaInput_lateBrem) =
getValue(electrons.at(index_ele).mvaInput().lateBrem);
1133 get(dnn::ele_mvaInput_sigmaEtaEta) = getValueNorm(electrons.at(index_ele).mvaInput().sigmaEtaEta,0.0008f, 0.0052f);
1134 get(dnn::ele_mvaInput_hadEnergy) = getValueNorm(electrons.at(index_ele).mvaInput().hadEnergy, 14.04f, 69.48f);
1135 get(dnn::ele_mvaInput_deltaEta) = getValueNorm(electrons.at(index_ele).mvaInput().deltaEta, 0.0099f, 0.0851f);
1137 const auto& gsfTrack = electrons.at(index_ele).gsfTrack();
1138 if(gsfTrack.isNonnull()){
1139 get(dnn::ele_gsfTrack_normalizedChi2) = getValueNorm(gsfTrack->normalizedChi2(), 3.049f, 10.39f);
1140 get(dnn::ele_gsfTrack_numberOfValidHits) = getValueNorm(gsfTrack->numberOfValidHits(), 16.52f, 2.806f);
1141 get(dnn::ele_rel_gsfTrack_pt) = getValueNorm(gsfTrack->pt() / electrons.at(index_ele).polarP4().pt(), 1.355f, 16.81f);
1142 get(dnn::ele_gsfTrack_pt_sig) = getValueNorm(gsfTrack->pt() / gsfTrack->ptError(), 5.046f, 3.119f);
1144 const auto& closestCtfTrack = electrons.at(index_ele).closestCtfTrackRef();
1145 const bool has_closestCtfTrack = closestCtfTrack.isNonnull();
1146 if(has_closestCtfTrack){
1147 get(dnn::ele_has_closestCtfTrack) = has_closestCtfTrack;
1148 get(dnn::ele_closestCtfTrack_normalizedChi2) = getValueNorm(closestCtfTrack->normalizedChi2(), 2.411f, 6.98f);
1149 get(dnn::ele_closestCtfTrack_numberOfValidHits) = getValueNorm(closestCtfTrack->numberOfValidHits(), 15.16f, 5.26f);
1152 checkInputs(inputs, is_inner ?
"egamma_inner_block" :
"egamma_outer_block", dnn::NumberOfInputs);
1158 const Cell& cell_map,
bool is_inner)
1162 tensorflow::Tensor&
inputs = *muonTensor_.at(is_inner);
1163 inputs.flat<
float>().setZero();
1165 const auto&
get = [&](
int var_index) ->
float& {
1166 return inputs.tensor<
float,4>()(0, 0, 0, var_index);
1169 const bool valid_index_pf_muon = cell_map.count(CellObjectType::PfCand_muon);
1172 if(!cell_map.empty()){
1173 get(
dnn::rho) = getValueNorm(rho, 21.49
f, 9.713
f);
1176 get(dnn::tau_inside_ecal_crack) =
getValue(isInEcalCrack(tau.
polarP4().eta()));
1178 if(valid_index_pf_muon){
1179 size_t index_pf_muon = cell_map.at(CellObjectType::PfCand_muon);
1181 get(dnn::pfCand_muon_valid) = valid_index_pf_muon;
1182 get(dnn::pfCand_muon_rel_pt) = getValueNorm(pfCands.at(index_pf_muon).polarP4().pt() / tau.
polarP4().pt(),
1183 is_inner ? 0.9509f : 0.0861f, is_inner ? 0.4294f : 0.4065f);
1184 get(dnn::pfCand_muon_deta) = getValueLinear(pfCands.at(index_pf_muon).polarP4().eta() - tau.
polarP4().eta(),
1185 is_inner ? -0.1f : -0.5f, is_inner ? 0.1f : 0.5f,
false);
1186 get(dnn::pfCand_muon_dphi) = getValueLinear(
dPhi(tau.
polarP4(), pfCands.at(index_pf_muon).polarP4()),
1187 is_inner ? -0.1
f : -0.5
f, is_inner ? 0.1
f : 0.5
f,
false);
1188 get(dnn::pfCand_muon_pvAssociationQuality) = getValueLinear<int>(pfCands.at(index_pf_muon).pvAssociationQuality(), 0, 7,
true);
1189 get(dnn::pfCand_muon_fromPV) = getValueLinear<int>(pfCands.at(index_pf_muon).fromPV(), 0, 3,
true);
1190 get(dnn::pfCand_muon_puppiWeight) =
getValue(pfCands.at(index_pf_muon).puppiWeight());
1191 get(dnn::pfCand_muon_charge) =
getValue(pfCands.at(index_pf_muon).charge());
1192 get(dnn::pfCand_muon_lostInnerHits) = getValue<int>(pfCands.at(index_pf_muon).lostInnerHits());
1193 get(dnn::pfCand_muon_numberOfPixelHits) = getValueLinear(pfCands.at(index_pf_muon).numberOfPixelHits(), 0, 11,
true);
1194 get(dnn::pfCand_muon_vertex_dx) = getValueNorm(pfCands.at(index_pf_muon).vertex().x() - pv.
position().x(), -0.0007f, 0.6869f);
1195 get(dnn::pfCand_muon_vertex_dy) = getValueNorm(pfCands.at(index_pf_muon).vertex().y() - pv.
position().y(), 0.0001f, 0.6784f);
1196 get(dnn::pfCand_muon_vertex_dz) = getValueNorm(pfCands.at(index_pf_muon).vertex().z() - pv.
position().z(), -0.0117f, 4.097f);
1197 get(dnn::pfCand_muon_vertex_dx_tauFL) = getValueNorm(pfCands.at(index_pf_muon).vertex().x() -
1199 get(dnn::pfCand_muon_vertex_dy_tauFL) = getValueNorm(pfCands.at(index_pf_muon).vertex().y() -
1201 get(dnn::pfCand_muon_vertex_dz_tauFL) = getValueNorm(pfCands.at(index_pf_muon).vertex().z() -
1204 const bool hasTrackDetails = pfCands.at(index_pf_muon).hasTrackDetails();
1205 if(hasTrackDetails){
1206 get(dnn::pfCand_muon_hasTrackDetails) = hasTrackDetails;
1207 get(dnn::pfCand_muon_dxy) = getValueNorm(pfCands.at(index_pf_muon).dxy(), -0.0045f, 0.9655f);
1208 get(dnn::pfCand_muon_dxy_sig) = getValueNorm(
std::abs(pfCands.at(index_pf_muon).dxy()) /
1209 pfCands.at(index_pf_muon).dxyError(), 4.575f, 42.36f);
1210 get(dnn::pfCand_muon_dz) = getValueNorm(pfCands.at(index_pf_muon).dz(), -0.0117f, 4.097f);
1211 get(dnn::pfCand_muon_dz_sig) = getValueNorm(
std::abs(pfCands.at(index_pf_muon).dz()) /
1212 pfCands.at(index_pf_muon).dzError(), 80.37f, 343.3f);
1213 get(dnn::pfCand_muon_track_chi2_ndof) = getValueNorm(pfCands.at(index_pf_muon).pseudoTrack().chi2() /
1214 pfCands.at(index_pf_muon).pseudoTrack().ndof(), 0.69f, 1.711f);
1215 get(dnn::pfCand_muon_track_ndof) = getValueNorm(pfCands.at(index_pf_muon).pseudoTrack().ndof(), 17.5f, 5.11f);
1218 if(valid_index_muon){
1221 get(dnn::muon_valid) = valid_index_muon;
1222 get(dnn::muon_rel_pt) = getValueNorm(muons.at(index_muon).polarP4().pt() / tau.
polarP4().pt(),
1223 is_inner ? 0.7966f : 0.2678f, is_inner ? 3.402f : 3.592f);
1224 get(dnn::muon_deta) = getValueLinear(muons.at(index_muon).polarP4().eta() - tau.
polarP4().eta(),
1225 is_inner ? -0.1f : -0.5f, is_inner ? 0.1f : 0.5f,
false);
1226 get(dnn::muon_dphi) = getValueLinear(
dPhi(tau.
polarP4(), muons.at(index_muon).polarP4()),
1227 is_inner ? -0.1
f : -0.5
f, is_inner ? 0.1
f : 0.5
f,
false);
1228 get(dnn::muon_dxy) = getValueNorm(muons.at(index_muon).dB(
pat::Muon::PV2D), 0.0019f, 1.039f);
1232 const bool normalizedChi2_valid = muons.at(index_muon).globalTrack().isNonnull() && muons.at(index_muon).normChi2() >= 0;
1233 if(normalizedChi2_valid){
1234 get(dnn::muon_normalizedChi2_valid) = normalizedChi2_valid;
1235 get(dnn::muon_normalizedChi2) = getValueNorm(muons.at(index_muon).normChi2(), 21.52f, 265.8f);
1236 if(muons.at(index_muon).innerTrack().isNonnull())
1237 get(dnn::muon_numberOfValidHits) = getValueNorm(muons.at(index_muon).numberOfValidHits(), 21.84f, 10.59f);
1239 get(dnn::muon_segmentCompatibility) =
getValue(muons.at(index_muon).segmentCompatibility());
1240 get(dnn::muon_caloCompatibility) =
getValue(muons.at(index_muon).caloCompatibility());
1242 const bool pfEcalEnergy_valid = muons.at(index_muon).pfEcalEnergy() >= 0;
1243 if(pfEcalEnergy_valid){
1244 get(dnn::muon_pfEcalEnergy_valid) = pfEcalEnergy_valid;
1245 get(dnn::muon_rel_pfEcalEnergy) = getValueNorm(muons.at(index_muon).pfEcalEnergy() /
1246 muons.at(index_muon).polarP4().pt(), 0.2273f, 0.4865f);
1249 MuonHitMatchV2 hit_match(muons.at(index_muon));
1250 static const std::map<int, std::pair<int, int>> muonMatchHitVars = {
1256 static const std::map<int, std::vector<float>> muonMatchVarLimits = {
1262 static const std::map<int, std::vector<float>> muonHitVarLimits = {
1268 for(
int subdet : hit_match.MuonHitMatchV2::consideredSubdets()) {
1269 const auto& matchHitVar = muonMatchHitVars.at(subdet);
1270 const auto& matchLimits = muonMatchVarLimits.at(subdet);
1271 const auto& hitLimits = muonHitVarLimits.at(subdet);
1272 for(
int station = MuonHitMatchV2::first_station_id;
station <= MuonHitMatchV2::last_station_id; ++
station) {
1273 const unsigned n_matches = hit_match.nMatches(subdet,
station);
1274 const unsigned n_hits = hit_match.nHits(subdet,
station);
1275 get(matchHitVar.first +
station - 1) = getValueLinear(n_matches, 0, matchLimits.at(
station - 1),
true);
1276 get(matchHitVar.second +
station - 1) = getValueLinear(n_hits, 0, hitLimits.at(
station - 1),
true);
1280 checkInputs(inputs, is_inner ?
"muon_inner_block" :
"muon_outer_block", dnn::NumberOfInputs);
1285 const Cell& cell_map,
bool is_inner)
1289 tensorflow::Tensor&
inputs = *hadronsTensor_.at(is_inner);
1290 inputs.flat<
float>().setZero();
1293 const auto&
get = [&](
int var_index) ->
float& {
1294 return inputs.tensor<
float,4>()(0, 0, 0, var_index);
1297 const bool valid_chH = cell_map.count(CellObjectType::PfCand_chargedHadron);
1298 const bool valid_nH = cell_map.count(CellObjectType::PfCand_neutralHadron);
1300 if(!cell_map.empty()){
1301 get(
dnn::rho) = getValueNorm(rho, 21.49
f, 9.713
f);
1304 get(dnn::tau_inside_ecal_crack) =
getValue(isInEcalCrack(tau.
polarP4().eta()));
1307 size_t index_chH = cell_map.at(CellObjectType::PfCand_chargedHadron);
1309 get(dnn::pfCand_chHad_valid) = valid_chH;
1310 get(dnn::pfCand_chHad_rel_pt) = getValueNorm(pfCands.at(index_chH).polarP4().pt() / tau.
polarP4().pt(),
1311 is_inner ? 0.2564f : 0.0194f, is_inner ? 0.8607f : 0.1865f);
1312 get(dnn::pfCand_chHad_deta) = getValueLinear(pfCands.at(index_chH).polarP4().eta() - tau.
polarP4().eta(),
1313 is_inner ? -0.1f : -0.5f, is_inner ? 0.1f : 0.5f,
false);
1314 get(dnn::pfCand_chHad_dphi) = getValueLinear(
dPhi(tau.
polarP4(),pfCands.at(index_chH).polarP4()),
1315 is_inner ? -0.1
f : -0.5
f, is_inner ? 0.1
f : 0.5
f,
false);
1316 get(dnn::pfCand_chHad_leadChargedHadrCand) =
getValue(&pfCands.at(index_chH) ==
1318 get(dnn::pfCand_chHad_pvAssociationQuality) =
1319 getValueLinear<int>(pfCands.at(index_chH).pvAssociationQuality(), 0, 7,
true);
1320 get(dnn::pfCand_chHad_fromPV) = getValueLinear<int>(pfCands.at(index_chH).fromPV(), 0, 3,
true);
1321 get(dnn::pfCand_chHad_puppiWeight) =
getValue(pfCands.at(index_chH).puppiWeight());
1322 get(dnn::pfCand_chHad_puppiWeightNoLep) =
getValue(pfCands.at(index_chH).puppiWeightNoLep());
1323 get(dnn::pfCand_chHad_charge) =
getValue(pfCands.at(index_chH).charge());
1324 get(dnn::pfCand_chHad_lostInnerHits) = getValue<int>(pfCands.at(index_chH).lostInnerHits());
1325 get(dnn::pfCand_chHad_numberOfPixelHits) = getValueLinear(pfCands.at(index_chH).numberOfPixelHits(), 0, 12,
true);
1326 get(dnn::pfCand_chHad_vertex_dx) = getValueNorm(pfCands.at(index_chH).vertex().x() - pv.
position().x(), 0.0005f, 1.735f);
1327 get(dnn::pfCand_chHad_vertex_dy) = getValueNorm(pfCands.at(index_chH).vertex().y() - pv.
position().y(), -0.0008f, 1.752f);
1328 get(dnn::pfCand_chHad_vertex_dz) = getValueNorm(pfCands.at(index_chH).vertex().z() - pv.
position().z(), -0.0201f, 8.333f);
1329 get(dnn::pfCand_chHad_vertex_dx_tauFL) = getValueNorm(pfCands.at(index_chH).vertex().x() - pv.
position().x()
1331 get(dnn::pfCand_chHad_vertex_dy_tauFL) = getValueNorm(pfCands.at(index_chH).vertex().y() - pv.
position().y()
1333 get(dnn::pfCand_chHad_vertex_dz_tauFL) = getValueNorm(pfCands.at(index_chH).vertex().z() - pv.
position().z()
1336 const bool hasTrackDetails = pfCands.at(index_chH).hasTrackDetails();
1337 if(hasTrackDetails){
1338 get(dnn::pfCand_chHad_hasTrackDetails) = hasTrackDetails;
1339 get(dnn::pfCand_chHad_dxy) = getValueNorm(pfCands.at(index_chH).dxy(), -0.012f, 2.386f);
1340 get(dnn::pfCand_chHad_dxy_sig) = getValueNorm(
std::abs(pfCands.at(index_chH).dxy()) /
1341 pfCands.at(index_chH).dxyError(), 6.417f, 36.28f);
1342 get(dnn::pfCand_chHad_dz) = getValueNorm(pfCands.at(index_chH).dz(), -0.0246f, 7.618f);
1343 get(dnn::pfCand_chHad_dz_sig) = getValueNorm(
std::abs(pfCands.at(index_chH).dz()) /
1344 pfCands.at(index_chH).dzError(), 301.3f, 491.1f);
1345 get(dnn::pfCand_chHad_track_chi2_ndof) = pfCands.at(index_chH).pseudoTrack().ndof() > 0 ?
1346 getValueNorm(pfCands.at(index_chH).pseudoTrack().chi2() /
1347 pfCands.at(index_chH).pseudoTrack().ndof(), 0.7876f, 3.694f) : 0;
1348 get(dnn::pfCand_chHad_track_ndof) = pfCands.at(index_chH).pseudoTrack().ndof() > 0 ?
1349 getValueNorm(pfCands.at(index_chH).pseudoTrack().ndof(), 13.92f, 6.581f) : 0;
1351 float hcal_fraction = 0.;
1352 if(pfCands.at(index_chH).pdgId() == 1 || pfCands.at(index_chH).pdgId() == 130) {
1353 hcal_fraction = pfCands.at(index_chH).hcalFraction();
1354 }
else if(pfCands.at(index_chH).isIsolatedChargedHadron()) {
1355 hcal_fraction = pfCands.at(index_chH).rawHcalFraction();
1357 get(dnn::pfCand_chHad_hcalFraction) =
getValue(hcal_fraction);
1358 get(dnn::pfCand_chHad_rawCaloFraction) = getValueLinear(pfCands.at(index_chH).rawCaloFraction(), 0.f, 2.6f,
true);
1361 size_t index_nH = cell_map.at(CellObjectType::PfCand_neutralHadron);
1363 get(dnn::pfCand_nHad_valid) = valid_nH;
1364 get(dnn::pfCand_nHad_rel_pt) = getValueNorm(pfCands.at(index_nH).polarP4().pt() / tau.
polarP4().pt(),
1365 is_inner ? 0.3163f : 0.0502f, is_inner ? 0.2769f : 0.4266f);
1366 get(dnn::pfCand_nHad_deta) = getValueLinear(pfCands.at(index_nH).polarP4().eta() - tau.
polarP4().eta(),
1367 is_inner ? -0.1f : -0.5f, is_inner ? 0.1f : 0.5f,
false);
1368 get(dnn::pfCand_nHad_dphi) = getValueLinear(
dPhi(tau.
polarP4(),pfCands.at(index_nH).polarP4()),
1369 is_inner ? -0.1
f : -0.5
f, is_inner ? 0.1
f : 0.5
f,
false);
1370 get(dnn::pfCand_nHad_puppiWeight) =
getValue(pfCands.at(index_nH).puppiWeight());
1371 get(dnn::pfCand_nHad_puppiWeightNoLep) =
getValue(pfCands.at(index_nH).puppiWeightNoLep());
1372 float hcal_fraction = 0.;
1373 if(pfCands.at(index_nH).pdgId() == 1 || pfCands.at(index_nH).pdgId() == 130) {
1374 hcal_fraction = pfCands.at(index_nH).hcalFraction();
1375 }
else if(pfCands.at(index_nH).isIsolatedChargedHadron()) {
1376 hcal_fraction = pfCands.at(index_nH).rawHcalFraction();
1378 get(dnn::pfCand_nHad_hcalFraction) =
getValue(hcal_fraction);
1380 checkInputs(inputs, is_inner ?
"hadron_inner_block" :
"hadron_outer_block", dnn::NumberOfInputs);
1383 template<
typename dnn>
1387 static constexpr bool check_all_set =
false;
1388 static constexpr float default_value_for_set_check = -42;
1390 tensorflow::Tensor
inputs(tensorflow::DT_FLOAT, { 1, dnn_inputs_2017v1::NumberOfInputs});
1391 const auto&
get = [&](
int var_index) ->
float& {
return inputs.matrix<
float>()(0, var_index); };
1395 for(
int var_index = 0; var_index < dnn::NumberOfInputs; ++var_index) {
1396 get(var_index) = default_value_for_set_check;
1410 get(dnn::dxy_sig) = tau.
dxy_Sig();
1411 get(
dnn::dz) = leadChargedHadrCand ? leadChargedHadrCand->dz() : default_value;
1413 get(dnn::ip3d_sig) = tau.
ip3d_Sig();
1419 get(dnn::leadChargedHadrCand_pt) = leadChargedHadrCand ? leadChargedHadrCand->p4().Pt() : default_value;
1420 get(dnn::leadChargedHadrCand_dEta) = leadChargedHadrCand
1421 ?
dEta(leadChargedHadrCand->p4(), tau.
p4()) : default_value;
1422 get(dnn::leadChargedHadrCand_dPhi) = leadChargedHadrCand
1423 ?
dPhi(leadChargedHadrCand->p4(), tau.
p4()) : default_value;
1424 get(dnn::leadChargedHadrCand_mass) = leadChargedHadrCand
1425 ? leadChargedHadrCand->p4().mass() : default_value;
1432 get(dnn::gj_angle_diff) = calculateGottfriedJacksonAngleDifference(tau);
1435 get(dnn::has_gsf_track) = leadChargedHadrCand &&
std::abs(leadChargedHadrCand->pdgId()) == 11;
1436 get(dnn::inside_ecal_crack) = isInEcalCrack(tau.
p4().Eta());
1437 auto gsf_ele = findMatchedElectron(tau, electrons, 0.3);
1438 get(dnn::gsf_ele_matched) = gsf_ele !=
nullptr;
1439 get(dnn::gsf_ele_pt) = gsf_ele !=
nullptr ? gsf_ele->p4().Pt() : default_value;
1440 get(dnn::gsf_ele_dEta) = gsf_ele !=
nullptr ?
dEta(gsf_ele->p4(), tau.
p4()) : default_value;
1441 get(dnn::gsf_ele_dPhi) = gsf_ele !=
nullptr ?
dPhi(gsf_ele->p4(), tau.
p4()) : default_value;
1442 get(dnn::gsf_ele_mass) = gsf_ele !=
nullptr ? gsf_ele->p4().mass() : default_value;
1443 calculateElectronClusterVars(gsf_ele,
get(dnn::gsf_ele_Ee),
get(dnn::gsf_ele_Egamma));
1444 get(dnn::gsf_ele_Pin) = gsf_ele !=
nullptr ? gsf_ele->trackMomentumAtVtx().R() : default_value;
1445 get(dnn::gsf_ele_Pout) = gsf_ele !=
nullptr ? gsf_ele->trackMomentumOut().R() : default_value;
1446 get(dnn::gsf_ele_EtotOverPin) =
get(dnn::gsf_ele_Pin) > 0
1447 ? (
get(dnn::gsf_ele_Ee) +
get(dnn::gsf_ele_Egamma)) /
get(dnn::gsf_ele_Pin)
1449 get(dnn::gsf_ele_Eecal) = gsf_ele !=
nullptr ? gsf_ele->ecalEnergy() : default_value;
1450 get(dnn::gsf_ele_dEta_SeedClusterTrackAtCalo) = gsf_ele !=
nullptr 1451 ? gsf_ele->deltaEtaSeedClusterTrackAtCalo() : default_value;
1452 get(dnn::gsf_ele_dPhi_SeedClusterTrackAtCalo) = gsf_ele !=
nullptr 1453 ? gsf_ele->deltaPhiSeedClusterTrackAtCalo() : default_value;
1454 get(dnn::gsf_ele_mvaIn_sigmaEtaEta) = gsf_ele !=
nullptr 1455 ? gsf_ele->mvaInput().sigmaEtaEta : default_value;
1456 get(dnn::gsf_ele_mvaIn_hadEnergy) = gsf_ele !=
nullptr ? gsf_ele->mvaInput().hadEnergy : default_value;
1457 get(dnn::gsf_ele_mvaIn_deltaEta) = gsf_ele !=
nullptr ? gsf_ele->mvaInput().deltaEta : default_value;
1459 get(dnn::gsf_ele_Chi2NormGSF) = default_value;
1460 get(dnn::gsf_ele_GSFNumHits) = default_value;
1461 get(dnn::gsf_ele_GSFTrackResol) = default_value;
1462 get(dnn::gsf_ele_GSFTracklnPt) = default_value;
1463 if(gsf_ele !=
nullptr && gsf_ele->gsfTrack().isNonnull()) {
1464 get(dnn::gsf_ele_Chi2NormGSF) = gsf_ele->gsfTrack()->normalizedChi2();
1465 get(dnn::gsf_ele_GSFNumHits) = gsf_ele->gsfTrack()->numberOfValidHits();
1466 if(gsf_ele->gsfTrack()->pt() > 0) {
1467 get(dnn::gsf_ele_GSFTrackResol) = gsf_ele->gsfTrack()->ptError() / gsf_ele->gsfTrack()->pt();
1468 get(dnn::gsf_ele_GSFTracklnPt) = std::log10(gsf_ele->gsfTrack()->pt());
1472 get(dnn::gsf_ele_Chi2NormKF) = default_value;
1473 get(dnn::gsf_ele_KFNumHits) = default_value;
1474 if(gsf_ele !=
nullptr && gsf_ele->closestCtfTrackRef().isNonnull()) {
1475 get(dnn::gsf_ele_Chi2NormKF) = gsf_ele->closestCtfTrackRef()->normalizedChi2();
1476 get(dnn::gsf_ele_KFNumHits) = gsf_ele->closestCtfTrackRef()->numberOfValidHits();
1481 get(dnn::leadChargedHadrCand_HoP) = default_value;
1482 get(dnn::leadChargedHadrCand_EoP) = default_value;
1490 MuonHitMatchV1 muon_hit_match;
1494 auto matched_muons = muon_hit_match.findMatchedMuons(tau, muons, 0.3, 5);
1495 for(
auto muon : matched_muons)
1496 muon_hit_match.addMatchedMuon(*
muon, tau);
1497 muon_hit_match.fillTensor<dnn>(
get,
tau, default_value);
1499 LorentzVectorXYZ signalChargedHadrCands_sumIn, signalChargedHadrCands_sumOut;
1500 processSignalPFComponents(tau, tau.signalChargedHadrCands(),
1501 signalChargedHadrCands_sumIn, signalChargedHadrCands_sumOut,
1502 get(dnn::signalChargedHadrCands_sum_innerSigCone_pt),
1503 get(dnn::signalChargedHadrCands_sum_innerSigCone_dEta),
1504 get(dnn::signalChargedHadrCands_sum_innerSigCone_dPhi),
1505 get(dnn::signalChargedHadrCands_sum_innerSigCone_mass),
1506 get(dnn::signalChargedHadrCands_sum_outerSigCone_pt),
1507 get(dnn::signalChargedHadrCands_sum_outerSigCone_dEta),
1508 get(dnn::signalChargedHadrCands_sum_outerSigCone_dPhi),
1509 get(dnn::signalChargedHadrCands_sum_outerSigCone_mass),
1510 get(dnn::signalChargedHadrCands_nTotal_innerSigCone),
1511 get(dnn::signalChargedHadrCands_nTotal_outerSigCone));
1514 processSignalPFComponents(tau, tau.signalNeutrHadrCands(),
1515 signalNeutrHadrCands_sumIn, signalNeutrHadrCands_sumOut,
1516 get(dnn::signalNeutrHadrCands_sum_innerSigCone_pt),
1517 get(dnn::signalNeutrHadrCands_sum_innerSigCone_dEta),
1518 get(dnn::signalNeutrHadrCands_sum_innerSigCone_dPhi),
1519 get(dnn::signalNeutrHadrCands_sum_innerSigCone_mass),
1520 get(dnn::signalNeutrHadrCands_sum_outerSigCone_pt),
1521 get(dnn::signalNeutrHadrCands_sum_outerSigCone_dEta),
1522 get(dnn::signalNeutrHadrCands_sum_outerSigCone_dPhi),
1523 get(dnn::signalNeutrHadrCands_sum_outerSigCone_mass),
1524 get(dnn::signalNeutrHadrCands_nTotal_innerSigCone),
1525 get(dnn::signalNeutrHadrCands_nTotal_outerSigCone));
1529 processSignalPFComponents(tau, tau.signalGammaCands(),
1530 signalGammaCands_sumIn, signalGammaCands_sumOut,
1531 get(dnn::signalGammaCands_sum_innerSigCone_pt),
1532 get(dnn::signalGammaCands_sum_innerSigCone_dEta),
1533 get(dnn::signalGammaCands_sum_innerSigCone_dPhi),
1534 get(dnn::signalGammaCands_sum_innerSigCone_mass),
1535 get(dnn::signalGammaCands_sum_outerSigCone_pt),
1536 get(dnn::signalGammaCands_sum_outerSigCone_dEta),
1537 get(dnn::signalGammaCands_sum_outerSigCone_dPhi),
1538 get(dnn::signalGammaCands_sum_outerSigCone_mass),
1539 get(dnn::signalGammaCands_nTotal_innerSigCone),
1540 get(dnn::signalGammaCands_nTotal_outerSigCone));
1543 processIsolationPFComponents(tau, tau.isolationChargedHadrCands(), isolationChargedHadrCands_sum,
1544 get(dnn::isolationChargedHadrCands_sum_pt),
1545 get(dnn::isolationChargedHadrCands_sum_dEta),
1546 get(dnn::isolationChargedHadrCands_sum_dPhi),
1547 get(dnn::isolationChargedHadrCands_sum_mass),
1548 get(dnn::isolationChargedHadrCands_nTotal));
1551 processIsolationPFComponents(tau, tau.isolationNeutrHadrCands(), isolationNeutrHadrCands_sum,
1552 get(dnn::isolationNeutrHadrCands_sum_pt),
1553 get(dnn::isolationNeutrHadrCands_sum_dEta),
1554 get(dnn::isolationNeutrHadrCands_sum_dPhi),
1555 get(dnn::isolationNeutrHadrCands_sum_mass),
1556 get(dnn::isolationNeutrHadrCands_nTotal));
1559 processIsolationPFComponents(tau, tau.isolationGammaCands(), isolationGammaCands_sum,
1560 get(dnn::isolationGammaCands_sum_pt),
1561 get(dnn::isolationGammaCands_sum_dEta),
1562 get(dnn::isolationGammaCands_sum_dPhi),
1563 get(dnn::isolationGammaCands_sum_mass),
1564 get(dnn::isolationGammaCands_nTotal));
1566 get(dnn::tau_visMass_innerSigCone) = (signalGammaCands_sumIn + signalChargedHadrCands_sumIn).mass();
1569 for(
int var_index = 0; var_index < dnn::NumberOfInputs; ++var_index) {
1570 if(
get(var_index) == default_value_for_set_check)
1571 throw cms::Exception(
"DeepTauId: variable with index = ") << var_index <<
" is not set.";
1581 elecEe = elecEgamma = 0;
1583 if(superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull()
1584 && superCluster->clusters().isAvailable()) {
1585 for(
auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
1586 const double energy = (*iter)->energy();
1587 if(iter == superCluster->clustersBegin()) elecEe += energy;
1588 else elecEgamma += energy;
1592 elecEe = elecEgamma = default_value;
1596 template<
typename Cand
idateCollection>
1599 float& pt_inner,
float& dEta_inner,
float& dPhi_inner,
float& m_inner,
1600 float& pt_outer,
float& dEta_outer,
float& dPhi_outer,
float& m_outer,
1601 float& n_inner,
float& n_outer)
1608 const double innerSigCone_radius = getInnerSignalConeRadius(tau.
pt());
1609 for(
const auto&
cand : candidates) {
1611 const bool isInside_innerSigCone = dR < innerSigCone_radius;
1612 if(isInside_innerSigCone) {
1613 p4_inner +=
cand->p4();
1616 p4_outer +=
cand->p4();
1621 pt_inner = n_inner != 0 ? p4_inner.Pt() : default_value;
1622 dEta_inner = n_inner != 0 ?
dEta(p4_inner, tau.
p4()) : default_value;
1623 dPhi_inner = n_inner != 0 ?
dPhi(p4_inner, tau.
p4()) : default_value;
1624 m_inner = n_inner != 0 ? p4_inner.mass() : default_value;
1626 pt_outer = n_outer != 0 ? p4_outer.Pt() : default_value;
1627 dEta_outer = n_outer != 0 ?
dEta(p4_outer, tau.
p4()) : default_value;
1628 dPhi_outer = n_outer != 0 ?
dPhi(p4_outer, tau.
p4()) : default_value;
1629 m_outer = n_outer != 0 ? p4_outer.mass() : default_value;
1632 template<
typename Cand
idateCollection>
1640 for(
const auto&
cand : candidates) {
1645 pt = n != 0 ? p4.Pt() : default_value;
1646 d_eta = n != 0 ?
dEta(p4, tau.
p4()) : default_value;
1647 d_phi = n != 0 ?
dPhi(p4, tau.
p4()) : default_value;
1648 m = n != 0 ? p4.mass() : default_value;
1653 static constexpr double min_pt = 30., min_radius = 0.05, cone_opening_coef = 3.;
1663 const double mAOne = tau.
p4().M();
1664 const double pAOneMag = tau.
p();
1665 const double argumentThetaGJmax = (
std::pow(mTau,2) -
std::pow(mAOne,2) ) / ( 2 * mTau * pAOneMag );
1666 const double argumentThetaGJmeasured = tau.
p4().Vect().Dot(tau.
flightLength())
1668 if (
std::abs(argumentThetaGJmax) <= 1. &&
std::abs(argumentThetaGJmeasured) <= 1. ) {
1669 double thetaGJmax = std::asin( argumentThetaGJmax );
1670 double thetaGJmeasured = std::acos( argumentThetaGJmeasured );
1671 gj_diff = thetaGJmeasured - thetaGJmax;
1681 if(calculateGottfriedJacksonAngleDifference(tau, gj_diff))
1682 return static_cast<float>(gj_diff);
1683 return default_value;
1688 const double abs_eta =
std::abs(eta);
1689 return abs_eta > 1.46 && abs_eta < 1.558;
1695 const double dR2 = deltaR*
deltaR;
1697 for(
const auto& ele : electrons) {
1698 if(
reco::deltaR2(tau.
p4(), ele.p4()) < dR2 && (!matched_ele || matched_ele->
pt() < ele.pt())) {
1714 std::array<std::shared_ptr<tensorflow::Tensor>, 2> eGammaTensor_, muonTensor_, hadronsTensor_,
constexpr double deltaPhi(double phi1, double phi2)
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 ...
bool isNonnull() const
Checks for non-null.
edm::EDGetTokenT< ElectronCollection > electrons_token_
const PolarLorentzVector & polarP4() const final
four-momentum Lorentz vector
void createHadronsBlockInputs(const TauType &tau, const reco::Vertex &pv, double rho, const pat::PackedCandidateCollection &pfCands, const Cell &cell_map, bool is_inner)
static std::unique_ptr< deep_tau::DeepTauCache > initializeGlobalCache(const edm::ParameterSet &cfg)
void createConvFeatures(const TauType &tau, const reco::Vertex &pv, double rho, const pat::ElectronCollection &electrons, const pat::MuonCollection &muons, const pat::PackedCandidateCollection &pfCands, const CellGrid &grid, bool is_inner)
int pdgId() const override
PDG identifier.
float pt_weighted_dr_signal(const reco::PFTau &tau, int dm)
float hcalEnergyLeadChargedHadrCand() const
return hcal energy from LeadChargedHadrCand
const bool disable_dxy_pca_
static float getValueLinear(T value, float min_value, float max_value, bool positive)
constexpr bool isNotFinite(T x)
void getPredictionsV2(const TauType &tau, const pat::ElectronCollection &electrons, const pat::MuonCollection &muons, const pat::PackedCandidateCollection &pfCands, const reco::Vertex &pv, double rho, std::vector< tensorflow::Tensor > &pred_vector)
T const * get() const
Returns C++ pointer to the item.
static double getInnerSignalConeRadius(double pt)
std::vector< pat::PackedCandidate > PackedCandidateCollection
const reco::PFCandidatePtr leadPFChargedHadrCand() const
static void globalEndJob(const DeepTauCache *cache)
static bool isInEcalCrack(double eta)
double pt() const final
transverse momentum
int charge() const final
electric charge
static void processIsolationPFComponents(const pat::Tau &tau, const CandidateCollection &candidates, LorentzVectorXYZ &p4, float &pt, float &d_eta, float &d_phi, float &m, float &n)
void createTauBlockInputs(const TauType &tau, const reco::Vertex &pv, double rho)
float tauID(const std::string &name) const
void countMatches(const reco::Muon &muon, std::vector< int > &numMatchesDT, std::vector< int > &numMatchesCSC, std::vector< int > &numMatchesRPC)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
const std::map< ValueQuantityType, double > min_value
const Point & position() const
position
std::map< std::string, Output > OutputCollection
static const double deltaEta
static const OutputCollection & GetOutputs()
static std::string const input
DeepTauId(const edm::ParameterSet &cfg, const deep_tau::DeepTauCache *cache)
void fillGrids(const TauType &tau, const Collection &objects, CellGrid &inner_grid, CellGrid &outer_grid)
#define DEFINE_FWK_MODULE(type)
std::string output_layer_
std::vector< Electron > ElectronCollection
tensorflow::Tensor createInputsV1(const TauType &tau, const ElectronCollection &electrons, const MuonCollection &muons) const
static float getValue(T value)
reco::TrackRef outerTrack() const override
reference to Track reconstructed in the muon detector only (reimplemented from reco::Muon) ...
static float calculateGottfriedJacksonAngleDifference(const pat::Tau &tau)
float pt_weighted_deta_strip(const reco::PFTau &tau, int dm)
const pat::tau::TauPFEssential::Vector & flightLength() const
std::array< std::shared_ptr< tensorflow::Tensor >, 2 > zeroOutputTensor_
float ecalEnergyLeadChargedHadrCand() const
static float getValueNorm(T value, float mean, float sigma, float n_sigmas_max=5)
void getPredictionsV1(const TauType &tau, const pat::ElectronCollection &electrons, const pat::MuonCollection &muons, std::vector< tensorflow::Tensor > &pred_vector)
pat::ElectronCollection ElectronCollection
Abs< T >::type abs(const T &t)
float pt_weighted_dr_iso(const reco::PFTau &tau, int dm)
T operator[](int i) const
const LorentzVector & p4() const final
four-momentum Lorentz vector
static void globalEndJob(const deep_tau::DeepTauCache *cache_)
bool hasSecondaryVertex() const
const reco::CandidatePtr leadChargedHadrCand() const
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Analysis-level tau class.
void getPartialPredictions(tensorflow::Tensor &convTensor, bool is_inner, int eta_index, int phi_index)
std::shared_ptr< tensorflow::Tensor > tauBlockTensor_
photonPtSumOutsideSignalCone
bool isNonnull() const
Checks for non-null.
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
float ptLeadChargedCand() const
return pt from LeadChargedCand
const pat::tau::TauPFEssential::Point & dxy_PCA() const
tensorflow::Tensor getPredictions(edm::Event &event, const edm::EventSetup &es, edm::Handle< TauCollection > taus) override
double p() const final
magnitude of momentum vector
pat::MuonCollection MuonCollection
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
float pt_weighted_dphi_strip(const reco::PFTau &tau, int dm)
int decayMode() const
reconstructed tau decay mode (specific to PFTau)
float eratio(const reco::PFTau &tau)
return ratio of energy in ECAL over sum of energy in ECAL and HCAL
void createEgammaBlockInputs(const TauType &tau, const reco::Vertex &pv, double rho, const pat::ElectronCollection &electrons, const pat::PackedCandidateCollection &pfCands, const Cell &cell_map, bool is_inner)
void checkInputs(const tensorflow::Tensor &inputs, const char *block_name, int n_inputs, int n_eta=1, int n_phi=1) const
Analysis-level electron class.
std::vector< MuonChamberMatch > & matches()
get muon matching information
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static std::unique_ptr< DeepTauCache > initializeGlobalCache(const edm::ParameterSet &cfg)
std::vector< Muon > MuonCollection
static void processSignalPFComponents(const pat::Tau &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)
void setCellConvFeatures(tensorflow::Tensor &convTensor, const tensorflow::Tensor &features, int eta_index, int phi_index)
static bool calculateGottfriedJacksonAngleDifference(const pat::Tau &tau, double &gj_diff)
float emFraction_MVA() const
return emFraction_MVA
bool operator<(DTCELinkId const &lhs, DTCELinkId const &rhs)
static bool calculateElectronClusterVarsV2(const pat::Electron &ele, float &cc_ele_energy, float &cc_gamma_energy, int &cc_n_gamma)
float flightLengthSig() const
edm::EDGetTokenT< MuonCollection > muons_token_
float leadingTrackNormChi2() const
return normalized chi2 of leading track
const std::map< ValueQuantityType, double > max_value
static const pat::Electron * findMatchedElectron(const pat::Tau &tau, const pat::ElectronCollection &electrons, double deltaR)
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, const std::vector< std::string > &targetNodes, std::vector< Tensor > *outputs)
const JetExtendedData & getValue(const Container &, const reco::JetBaseRef &)
get value for the association. Throw exception if no association found
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
float etaAtEcalEntranceLeadChargedCand() const
return etaAtEcalEntrance from LeadChargedCand
edm::OwnVector< Candidate > CandidateCollection
collection of Candidate objects
edm::EDGetTokenT< double > rho_token_
static void calculateElectronClusterVars(const pat::Electron *ele, float &elecEe, float &elecEgamma)
static const std::string subdets[7]
Analysis-level muon class.
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double >> LorentzVectorXYZ
reco::SuperClusterRef superCluster() const override
override the reco::GsfElectron::superCluster method, to access the internal storage of the superclust...
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)
void createMuonBlockInputs(const TauType &tau, const reco::Vertex &pv, double rho, const pat::MuonCollection &muons, const pat::PackedCandidateCollection &pfCands, const Cell &cell_map, bool is_inner)