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();
131 if (lepRecoPt >= 30 &&
std::abs(lepRecoEta) < 2.3 &&
tau.isTauIDAvailable(
"againstMuonLoose3") &&
132 tau.isTauIDAvailable(
"againstElectronVLooseMVA6")) {
133 isGoodTau = (
tau.tauID(
"againstElectronVLooseMVA6") &&
tau.tauID(
"againstMuonLoose3"));
137 predictions.matrix<
float>()(tau_index, 0) = -1;
141 std::vector<unsigned int> signalCandidateInds;
143 for (
const auto&
c :
tau.signalCands())
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());
159 std::sort(std::begin(sorted_inds),
std::end(sorted_inds), [&](
int i1,
int i2) {
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)
171 if (
p.fromPV() < 1 &&
p.charge() != 0)
174 pfCandPtRel =
p.pt() / lepRecoPt;
176 pfCandDr = deltaR_tau_p;
177 pfCandDEta =
std::abs(lepRecoEta -
p.eta());
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);
191 if (pfCandCharge != 0 and
p.hasTrackDetails()) {
193 pfCandDzErr =
p.dzError();
194 pfCandDzSig = (
std::abs(
p.dz()) + 0.000001) / (
p.dzError() + 0.00001);
196 pfCandD0Err =
p.dxyError();
197 pfCandD0Sig = (
std::abs(
p.dxy()) + 0.000001) / (
p.dxyError() + 0.00001);
198 pfCandPixHits =
p.numberOfPixelHits();
199 pfCandHits =
p.numberOfHits();
200 pfCandLostInnerHits =
p.lostInnerHits();
203 int psudorand =
p.pt() * 1000000;
204 if (psudorand % 2 == 0)
214 pfCandLostInnerHits = 2.;
221 pfCandPuppiWeight =
p.puppiWeight();
222 pfCandFromPV =
p.fromPV();
223 pfCandVtxQuality =
p.pvAssociationQuality();
224 pfCandHighPurityTrk =
p.trackHighPurity();
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);