14 for (
unsigned int i = 0;
i < pfcands->size(); ++
i) {
25 const size_t tau_index = 0;
31 static const std::map<unsigned, unsigned> nparticles{{0, 60}, {1, 36}};
32 return nparticles.at(graphVersion);
36 static const std::map<unsigned, unsigned> nfeatures{{0, 47}, {1, 51}};
37 return nfeatures.at(graphVersion);
45 desc.
add<
std::string>(
"graph_file",
"RecoTauTag/TrainingFiles/data/DPFTauId/DPFIsolation_2017v0_quantized.pb");
46 desc.
add<
unsigned>(
"version", 0);
47 desc.
add<
bool>(
"mem_mapped",
false);
60 descriptions.
add(
"DPFTau2016v0", desc);
65 const auto& shape =
cache_->
getGraph().node(0).attr().at(
"shape").shape();
68 throw cms::Exception(
"DPFIsolation") <<
"unknown version of the graph file.";
73 <<
"number of inputs does not match the expected inputs for the given version";
84 tensorflow::Tensor tensor(
88 tensorflow::Tensor predictions(tensorflow::DT_FLOAT, {
static_cast<int>(taus->size()), 1});
90 std::vector<tensorflow::Tensor>
outputs_;
92 float pfCandPt, pfCandPz, pfCandPtRel, pfCandPzRel, pfCandDr, pfCandDEta, pfCandDPhi, pfCandEta, pfCandDz,
93 pfCandDzErr, pfCandD0, pfCandD0D0, pfCandD0Dz, pfCandD0Dphi, pfCandPuppiWeight, pfCandPixHits, pfCandHits,
94 pfCandLostInnerHits, pfCandPdgID, pfCandCharge, pfCandFromPV, pfCandVtxQuality, pfCandHighPurityTrk,
95 pfCandTauIndMatch, pfCandDzSig, pfCandD0Sig, pfCandD0Err, pfCandPtRelPtRel, pfCandDzDz, pfCandDVx_1,
96 pfCandDVy_1, pfCandDVz_1, pfCandD_1;
97 float pvx = !vertices->empty() ? (*vertices)[0].x() : -1;
98 float pvy = !vertices->empty() ? (*vertices)[0].y() : -1;
99 float pvz = !vertices->empty() ? (*vertices)[0].z() : -1;
104 static constexpr
float pfCandPt_max = 500.f;
105 static constexpr
float pfCandPz_max = 1000.f;
106 static constexpr
float pfCandPtRel_max = 1.f;
107 static constexpr
float pfCandPzRel_max = 100.f;
108 static constexpr
float pfCandPtRelPtRel_max = 1.f;
109 static constexpr
float pfCandD0_max = 5.f;
110 static constexpr
float pfCandDz_max = 5.f;
111 static constexpr
float pfCandDVx_y_z_1_max = 0.05f;
112 static constexpr
float pfCandD_1_max = 0.1f;
113 static constexpr
float pfCandD0_z_Err_max = 1.f;
114 static constexpr
float pfCandDzSig_max = 3.f;
115 static constexpr
float pfCandD0Sig_max = 1.f;
116 static constexpr
float pfCandDr_max = 0.5f;
117 static constexpr
float pfCandEta_max = 2.75f;
118 static constexpr
float pfCandDEta_max = 0.5f;
119 static constexpr
float pfCandDPhi_max = 0.5f;
120 static constexpr
float pfCandPixHits_max = 7.f;
121 static constexpr
float pfCandHits_max = 30.f;
123 for (
size_t tau_index = 0; tau_index < taus->size(); tau_index++) {
125 bool isGoodTau =
false;
126 const float lepRecoPt = tau.
pt();
128 const float lepRecoEta = tau.
eta();
129 const float lepRecoPhi = tau.
phi();
133 isGoodTau = (tau.
tauID(
"againstElectronVLooseMVA6") && tau.
tauID(
"againstMuonLoose3"));
137 predictions.matrix<
float>()(tau_index, 0) = -1;
141 std::vector<unsigned int> signalCandidateInds;
144 signalCandidateInds.push_back(getPFCandidateIndex(pfcands,
c));
149 for (
unsigned input_idx = 0; input_idx < n_inputs; ++input_idx)
150 tensor.flat<
float>()(input_idx) = 0;
152 unsigned int iPF = 0;
155 std::vector<unsigned int> sorted_inds(pfcands->size());
160 return pfcands->at(i1).pt() > pfcands->at(i2).pt();
163 for (
size_t pf_index = 0; pf_index < pfcands->size() && iPF < max_iPF; pf_index++) {
165 float deltaR_tau_p =
deltaR(p.
p4(), tau.
p4());
169 if (deltaR_tau_p > 0.5)
174 pfCandPtRel = p.
pt() / lepRecoPt;
176 pfCandDr = deltaR_tau_p;
180 pfCandIsBarrel = (
std::abs(pfCandEta) < 1.4);
181 pfCandPz =
std::abs(std::sinh(pfCandEta) * pfCandPt);
182 pfCandPzRel = pfCandPz / lepRecoPz;
184 pfCandCharge = p.
charge();
185 pfCandDVx_1 = p.
vx() - pvx;
186 pfCandDVy_1 = p.
vy() - pvy;
187 pfCandDVz_1 = p.
vz() - pvz;
189 pfCandD_1 =
std::sqrt(pfCandDVx_1 * pfCandDVx_1 + pfCandDVy_1 * pfCandDVy_1 + pfCandDVz_1 * pfCandDVz_1);
203 int psudorand = p.
pt() * 1000000;
204 if (psudorand % 2 == 0)
214 pfCandLostInnerHits = 2.;
222 pfCandFromPV = p.
fromPV();
225 float pfCandTauIndMatch_temp = 0;
227 for (
auto i : signalCandidateInds) {
228 if (
i == sorted_inds.at(pf_index))
229 pfCandTauIndMatch_temp = 1;
232 pfCandTauIndMatch = pfCandTauIndMatch_temp;
233 pfCandPtRelPtRel = pfCandPtRel * pfCandPtRel;
234 pfCandPt =
std::min(pfCandPt, pfCandPt_max);
235 pfCandPt = pfCandPt / pfCandPt_max;
237 pfCandPz =
std::min(pfCandPz, pfCandPz_max);
238 pfCandPz = pfCandPz / pfCandPz_max;
240 pfCandPtRel =
std::min(pfCandPtRel, pfCandPtRel_max);
241 pfCandPzRel =
std::min(pfCandPzRel, pfCandPzRel_max);
242 pfCandPzRel = pfCandPzRel / pfCandPzRel_max;
243 pfCandDr = pfCandDr / pfCandDr_max;
244 pfCandEta = pfCandEta / pfCandEta_max;
245 pfCandDEta = pfCandDEta / pfCandDEta_max;
246 pfCandDPhi = pfCandDPhi / pfCandDPhi_max;
247 pfCandPixHits = pfCandPixHits / pfCandPixHits_max;
248 pfCandHits = pfCandHits / pfCandHits_max;
250 pfCandPtRelPtRel =
std::min(pfCandPtRelPtRel, pfCandPtRelPtRel_max);
252 pfCandD0 = std::clamp(pfCandD0, -pfCandD0_max, pfCandD0_max);
253 pfCandD0 = pfCandD0 / pfCandD0_max;
255 pfCandDz = std::clamp(pfCandDz, -pfCandDz_max, pfCandDz_max);
256 pfCandDz = pfCandDz / pfCandDz_max;
258 pfCandD0Err =
std::min(pfCandD0Err, pfCandD0_z_Err_max);
259 pfCandDzErr =
std::min(pfCandDzErr, pfCandD0_z_Err_max);
260 pfCandDzSig =
std::min(pfCandDzSig, pfCandDzSig_max);
261 pfCandDzSig = pfCandDzSig / pfCandDzSig_max;
263 pfCandD0Sig =
std::min(pfCandD0Sig, pfCandD0Sig_max);
264 pfCandD0D0 = pfCandD0 * pfCandD0;
265 pfCandDzDz = pfCandDz * pfCandDz;
266 pfCandD0Dz = pfCandD0 * pfCandDz;
267 pfCandD0Dphi = pfCandD0 * pfCandDPhi;
269 pfCandDVx_1 = std::clamp(pfCandDVx_1, -pfCandDVx_y_z_1_max, pfCandDVx_y_z_1_max);
270 pfCandDVx_1 = pfCandDVx_1 / pfCandDVx_y_z_1_max;
272 pfCandDVy_1 = std::clamp(pfCandDVy_1, -pfCandDVx_y_z_1_max, pfCandDVx_y_z_1_max);
273 pfCandDVy_1 = pfCandDVy_1 / pfCandDVx_y_z_1_max;
275 pfCandDVz_1 = std::clamp(pfCandDVz_1, -pfCandDVx_y_z_1_max, pfCandDVx_y_z_1_max);
276 pfCandDVz_1 = pfCandDVz_1 / pfCandDVx_y_z_1_max;
278 pfCandD_1 = std::clamp(pfCandD_1, -pfCandD_1_max, pfCandD_1_max);
279 pfCandD_1 = pfCandD_1 / pfCandD_1_max;
282 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 0) = pfCandPt;
283 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 1) = pfCandPz;
284 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 2) = pfCandPtRel;
285 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 3) = pfCandPzRel;
286 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 4) = pfCandDr;
287 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 5) = pfCandDEta;
288 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 6) = pfCandDPhi;
289 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 7) = pfCandEta;
290 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 8) = pfCandDz;
291 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 9) = pfCandDzSig;
292 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 10) = pfCandD0;
293 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 11) = pfCandD0Sig;
294 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 12) = pfCandDzErr;
295 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 13) = pfCandD0Err;
296 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 14) = pfCandD0D0;
297 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 15) = pfCandCharge == 0;
298 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 16) = pfCandCharge == 1;
299 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 17) = pfCandCharge == -1;
300 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 18) = pfCandPdgID > 22;
301 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 19) = pfCandPdgID == 22;
302 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 20) = pfCandDzDz;
303 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 21) = pfCandD0Dz;
304 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 22) = pfCandD0Dphi;
305 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 23) = pfCandPtRelPtRel;
306 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 24) = pfCandPixHits;
307 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 25) = pfCandHits;
308 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 26) = pfCandLostInnerHits == -1;
309 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 27) = pfCandLostInnerHits == 0;
310 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 28) = pfCandLostInnerHits == 1;
311 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 29) = pfCandLostInnerHits == 2;
312 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 30) = pfCandPuppiWeight;
313 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 31) = (pfCandVtxQuality == 1);
314 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 32) = (pfCandVtxQuality == 5);
315 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 33) = (pfCandVtxQuality == 6);
316 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 34) = (pfCandVtxQuality == 7);
317 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 35) = (pfCandFromPV == 1);
318 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 36) = (pfCandFromPV == 2);
319 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 37) = (pfCandFromPV == 3);
320 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 38) = pfCandIsBarrel;
321 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 39) = pfCandHighPurityTrk;
322 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 40) = pfCandPdgID == 1;
323 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 41) = pfCandPdgID == 2;
324 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 42) = pfCandPdgID == 11;
325 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 43) = pfCandPdgID == 13;
326 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 44) = pfCandPdgID == 130;
327 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 45) = pfCandPdgID == 211;
328 tensor.tensor<float, 3>()(0, 60 - 1 - iPF, 46) = pfCandTauIndMatch;
332 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 0) = pfCandPt;
333 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 1) = pfCandPz;
334 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 2) = pfCandPtRel;
335 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 3) = pfCandPzRel;
336 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 4) = pfCandDr;
337 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 5) = pfCandDEta;
338 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 6) = pfCandDPhi;
339 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 7) = pfCandEta;
340 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 8) = pfCandDz;
341 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 9) = pfCandDzSig;
342 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 10) = pfCandD0;
343 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 11) = pfCandD0Sig;
344 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 12) = pfCandDzErr;
345 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 13) = pfCandD0Err;
346 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 14) = pfCandD0D0;
347 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 15) = pfCandCharge == 0;
348 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 16) = pfCandCharge == 1;
349 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 17) = pfCandCharge == -1;
350 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 18) = pfCandPdgID > 22;
351 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 19) = pfCandPdgID == 22;
352 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 20) = pfCandDVx_1;
353 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 21) = pfCandDVy_1;
354 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 22) = pfCandDVz_1;
355 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 23) = pfCandD_1;
356 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 24) = pfCandDzDz;
357 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 25) = pfCandD0Dz;
358 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 26) = pfCandD0Dphi;
359 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 27) = pfCandPtRelPtRel;
360 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 28) = pfCandPixHits;
361 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 29) = pfCandHits;
362 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 30) = pfCandLostInnerHits == -1;
363 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 31) = pfCandLostInnerHits == 0;
364 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 32) = pfCandLostInnerHits == 1;
365 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 33) = pfCandLostInnerHits == 2;
366 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 34) = pfCandPuppiWeight;
367 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 35) = (pfCandVtxQuality == 1);
368 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 36) = (pfCandVtxQuality == 5);
369 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 37) = (pfCandVtxQuality == 6);
370 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 38) = (pfCandVtxQuality == 7);
371 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 39) = (pfCandFromPV == 1);
372 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 40) = (pfCandFromPV == 2);
373 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 41) = (pfCandFromPV == 3);
374 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 42) = pfCandIsBarrel;
375 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 43) = pfCandHighPurityTrk;
376 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 44) = pfCandPdgID == 1;
377 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 45) = pfCandPdgID == 2;
378 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 46) = pfCandPdgID == 11;
379 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 47) = pfCandPdgID == 13;
380 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 48) = pfCandPdgID == 130;
381 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 49) = pfCandPdgID == 211;
382 tensor.tensor<float, 3>()(0, 36 - 1 - iPF, 50) = pfCandTauIndMatch;
387 predictions.matrix<
float>()(tau_index, 0) = outputs_[0].flat<
float>()(0);
float puppiWeight() const
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
const edm::EventSetup & c
double pz() const final
z coordinate of momentum vector
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double pt() const final
transverse momentum
tensorflow::Tensor getPredictions(edm::Event &event, edm::Handle< TauCollection > taus) override
int charge() const override
electric charge
static unsigned getNumberOfParticles(unsigned graphVersion)
#define DEFINE_FWK_MODULE(type)
const DeepTauCache * cache_
const tensorflow::GraphDef & getGraph(const std::string &name="") const
float tauID(const std::string &name) const
reco::CandidatePtrVector signalCands() const
int pdgId() const override
PDG identifier.
std::map< std::string, Output > OutputCollection
double vy() const override
y coordinate of vertex position
OutputCollection outputs_
void generate(uint32_t const nbins, float const *initValues, std::vector< float > &values)
static unsigned GetNumberOfFeatures(unsigned graphVersion)
double eta() const override
momentum pseudorapidity
const PVAssociationQuality pvAssociationQuality() const
const PVAssoc fromPV(size_t ipv=0) const
float dzError() const override
uncertainty on dz
bool trackHighPurity() const
true if the track had the highPurity quality bit
LostInnerHits lostInnerHits() const
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Abs< T >::type abs(const T &t)
DeepTauBase(const edm::ParameterSet &cfg, const OutputCollection &outputs, const DeepTauCache *cache)
float dxyError() const override
uncertainty on dxy
double vz() const override
z coordinate of vertex position
ParameterDescriptionBase * add(U const &iLabel, T const &value)
int numberOfPixelHits() const
Analysis-level tau class.
bool hasTrackDetails() const
Return true if a bestTrack can be extracted from this Candidate.
bool isTauIDAvailable(const std::string &name) const
Returns true if a specific ID is available in this pat::Tau.
double pt() const override
transverse momentum
DPFIsolation(const edm::ParameterSet &cfg, const deep_tau::DeepTauCache *cache)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
double vx() const override
x coordinate of vertex position
static const OutputCollection & GetOutputs()
virtual float dxy() const
dxy with respect to the PV ref
double phi() const final
momentum azimuthal angle
const LorentzVector & p4() const override
four-momentum Lorentz vecto r
edm::EDGetTokenT< CandidateCollection > pfcandToken_
double phi() const override
momentum azimuthal angle
tensorflow::Session & getSession(const std::string &name="") const
double eta() const final
momentum pseudorapidity
edm::EDGetTokenT< reco::VertexCollection > vtxToken_