ATLAS Offline Software
Loading...
Searching...
No Matches
DiTauIDVarCalculator.cxx
Go to the documentation of this file.
1
4
7
8using namespace DiTauRecTools;
9
10using TrackParticleLinks_t = std::vector<ElementLink<xAOD::TrackParticleContainer>>;
11
12//=================================PUBLIC-PART==================================
13//______________________________________________________________________________
14DiTauIDVarCalculator::DiTauIDVarCalculator( const std::string& name )
15 : AsgTool(name)
16{
17}
18
19//______________________________________________________________________________
21= default;
22
23//______________________________________________________________________________
25{
26 ATH_MSG_INFO( "Initializing DiTauIDVarCalculator" );
27
28 return StatusCode::SUCCESS;
29}
30
32// Wrapper functions //
34
36 return execute(xDiTau);
37}
38
39StatusCode DiTauIDVarCalculator::execute(const xAOD::DiTauJet& xDiTau) const
40{
41
42 ATH_MSG_DEBUG("Calculate DiTau ID variables");
43
44 static const SG::Decorator< int > n_subjetsDec("n_subjets");
45 n_subjetsDec(xDiTau) = n_subjets(xDiTau);
46 ATH_CHECK( decorNtracks(xDiTau) );
47
48 static const SG::Decorator< float > ditau_ptDec("ditau_pt");
49 static const SG::Decorator< float > f_core_leadDec("f_core_lead");
50 static const SG::Decorator< float > f_core_sublDec("f_core_subl");
51 static const SG::Decorator< float > f_subjet_leadDec("f_subjet_lead");
52 static const SG::Decorator< float > f_subjet_sublDec("f_subjet_subl");
53 static const SG::Decorator< float > f_subjetsDec("f_subjets");
54 static const SG::Decorator< float > f_track_leadDec("f_track_lead");
55 static const SG::Decorator< float > f_track_sublDec("f_track_subl");
56 static const SG::Decorator< float > R_max_leadDec("R_max_lead");
57 static const SG::Decorator< float > R_max_sublDec("R_max_subl");
58 static const SG::Decorator< int > n_trackDec("n_track");
59 static const SG::Decorator< int > n_tracks_leadDec("n_tracks_lead");
60 static const SG::Decorator< int > n_tracks_sublDec("n_tracks_subl");
61 static const SG::Decorator< int > n_isotrackDec("n_isotrack");
62 static const SG::Decorator< float > R_trackDec("R_track");
63 static const SG::Decorator< float > R_track_coreDec("R_track_core");
64 static const SG::Decorator< float > R_track_allDec("R_track_all");
65 static const SG::Decorator< float > R_isotrackDec("R_isotrack");
66 static const SG::Decorator< float > R_core_leadDec("R_core_lead");
67 static const SG::Decorator< float > R_core_sublDec("R_core_subl");
68 static const SG::Decorator< float > R_tracks_leadDec("R_tracks_lead");
69 static const SG::Decorator< float > R_tracks_sublDec("R_tracks_subl");
70 static const SG::Decorator< float > M_trackDec("m_track");
71 static const SG::Decorator< float > M_track_coreDec("m_track_core");
72 static const SG::Decorator< float > M_core_leadDec("m_core_lead");
73 static const SG::Decorator< float > M_core_sublDec("m_core_subl");
74 static const SG::Decorator< float > M_track_allDec("m_track_all");
75 static const SG::Decorator< float > M_tracks_leadDec("m_tracks_lead");
76 static const SG::Decorator< float > M_tracks_sublDec("m_tracks_subl");
77 static const SG::Decorator< float > E_frac_sublDec("E_frac_subl");
78 static const SG::Decorator< float > E_frac_subsublDec("E_frac_subsubl");
79 static const SG::Decorator< float > R_subjets_sublDec("R_subjets_subl");
80 static const SG::Decorator< float > R_subjets_subsublDec("R_subjets_subsubl");
81 static const SG::Decorator< float > d0_leadtrack_leadDec("d0_leadtrack_lead");
82 static const SG::Decorator< float > d0_leadtrack_sublDec("d0_leadtrack_subl");
83 static const SG::Decorator< float > f_isotracksDec("f_isotracks");
84
85 ditau_ptDec(xDiTau) = ditau_pt(xDiTau);
86 f_core_leadDec(xDiTau) = f_core(xDiTau, 0);
87 f_core_sublDec(xDiTau) = f_core(xDiTau, 1);
88 f_subjet_leadDec(xDiTau) = f_subjet(xDiTau, 0);
89 f_subjet_sublDec(xDiTau) = f_subjet(xDiTau, 1);
90 f_subjetsDec(xDiTau) = f_subjets(xDiTau);
91 f_track_leadDec(xDiTau) = f_track(xDiTau, 0);
92 f_track_sublDec(xDiTau) = f_track(xDiTau, 1);
93 R_max_leadDec(xDiTau) = R_max(xDiTau, 0);
94 R_max_sublDec(xDiTau) = R_max(xDiTau, 1);
95 n_trackDec(xDiTau) = n_track(xDiTau);
96 n_tracks_leadDec(xDiTau) = n_tracks(xDiTau, 0);
97 n_tracks_sublDec(xDiTau) = n_tracks(xDiTau, 1);
98 n_isotrackDec(xDiTau) = n_isotrack(xDiTau);
99 R_trackDec(xDiTau) = R_track(xDiTau);
100 R_track_coreDec(xDiTau) = R_track_core(xDiTau);
101 R_track_allDec(xDiTau) = R_track_all(xDiTau);
102 R_isotrackDec(xDiTau) = R_isotrack(xDiTau);
103 R_core_leadDec(xDiTau) = R_core(xDiTau, 0);
104 R_core_sublDec(xDiTau) = R_core(xDiTau, 1);
105 R_tracks_leadDec(xDiTau) = R_tracks(xDiTau, 0);
106 R_tracks_sublDec(xDiTau) = R_tracks(xDiTau, 1);
107 M_trackDec(xDiTau) = mass_track(xDiTau);
108 M_track_coreDec(xDiTau) = mass_track_core(xDiTau);
109 M_core_leadDec(xDiTau) = mass_core(xDiTau, 0);
110 M_core_sublDec(xDiTau) = mass_core(xDiTau, 1);
111 M_track_allDec(xDiTau) = mass_track_all(xDiTau);
112 M_tracks_leadDec(xDiTau) = mass_tracks(xDiTau, 0);
113 M_tracks_sublDec(xDiTau) = mass_tracks(xDiTau, 1);
114 E_frac_sublDec(xDiTau) = E_frac(xDiTau,1);
115 E_frac_subsublDec(xDiTau) = E_frac(xDiTau, 2);
116 R_subjets_sublDec(xDiTau) = R_subjets(xDiTau, 1);
117 R_subjets_subsublDec(xDiTau) = R_subjets(xDiTau, 2);
118 d0_leadtrack_leadDec(xDiTau) = d0_leadtrack(xDiTau, 0);
119 d0_leadtrack_sublDec(xDiTau) = d0_leadtrack(xDiTau, 1);
120 f_isotracksDec(xDiTau) = f_isotracks(xDiTau);
121
122 return StatusCode::SUCCESS;
123}
124
125//=================================PRIVATE-PART=================================
126//______________________________________________________________________________
127
129{
130 int nSubjet = 0;
131 while (xDiTau.subjetPt(nSubjet) > 0. )
132 {
133 nSubjet++;
134 }
135
136 return nSubjet;
137}
138
139
141{
142 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
143 if (n_subjetsAcc(xDiTau) < 2 ) {
144 return m_dDefault;
145 }
146
147 return xDiTau.subjetPt(0)+xDiTau.subjetPt(1);
148}
149
150
151//______________________________________________________________________________;
152float DiTauIDVarCalculator::f_core(const xAOD::DiTauJet& xDiTau, int iSubjet) const
153{
154 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
155 if (iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
156 return m_dDefault;
157 }
158
159 return xDiTau.fCore(iSubjet);
160}
161
162
163//______________________________________________________________________________;
164float DiTauIDVarCalculator::f_subjet(const xAOD::DiTauJet& xDiTau, int iSubjet) const
165{
166 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
167 if (iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
168 return m_dDefault;
169 }
170
171 return xDiTau.subjetPt(iSubjet) / xDiTau.pt();
172}
173
174
175//______________________________________________________________________________;
177{
178 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
179 if (n_subjetsAcc(xDiTau) < 2 ) {
180 return m_dDefault;
181 }
182
183 return (xDiTau.subjetPt(0) + xDiTau.subjetPt(1))/ xDiTau.pt();
184}
185
186
187//______________________________________________________________________________;
188float DiTauIDVarCalculator::f_track(const xAOD::DiTauJet& xDiTau, int iSubjet) const
189{
190 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
191 if (iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
192 return m_dDefault;
193 }
194
195 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
196 if (!trackLinksAcc.isAvailable(xDiTau) )
197 {
198 ATH_MSG_WARNING("Link not available");
199 }
200
201 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
202
203 TLorentzVector tlvSubjet;
204 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(iSubjet),
205 xDiTau.subjetEta(iSubjet),
206 xDiTau.subjetPhi(iSubjet),
207 xDiTau.subjetE(iSubjet) );
208
209 TLorentzVector tlvTrack;
210 TLorentzVector tlvLeadTrack;
211 tlvLeadTrack.SetPtEtaPhiE( 0,0,0, 0);
212
213 for (const auto &xTrack: xTracks)
214 {
215 if (!xTrack)
216 {
217 ATH_MSG_ERROR("Could not read Track");
218 continue;
219 }
220 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
221 (*xTrack)->eta(),
222 (*xTrack)->phi(),
223 (*xTrack)->e() );
224
225 if ( tlvSubjet.DeltaR(tlvTrack) < 0.2 )
226 {
227 if (tlvLeadTrack.Pt() < tlvTrack.Pt())
228 {
229 tlvLeadTrack = tlvTrack;
230 }
231 }
232 }
233
234 return tlvLeadTrack.Pt() / tlvSubjet.Pt();
235}
236
237
238//______________________________________________________________________________;
239float DiTauIDVarCalculator::R_max(const xAOD::DiTauJet& xDiTau, int iSubjet) const
240{
241 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
242 if (iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
243 return m_dDefault;
244 }
245
246 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
247
248 TLorentzVector tlvSubjet;
249 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(iSubjet),
250 xDiTau.subjetEta(iSubjet),
251 xDiTau.subjetPhi(iSubjet),
252 xDiTau.subjetE(iSubjet) );
253
254 TLorentzVector tlvTrack;
255 TLorentzVector tlvRmaxTrack;
256 double Rmax = 0;
257
258 for (const auto &xTrack: xTracks)
259 {
260 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
261 (*xTrack)->eta(),
262 (*xTrack)->phi(),
263 (*xTrack)->e() );
264
265 if ( tlvSubjet.DeltaR(tlvTrack) < m_Rsubjet )
266 {
267 if (tlvTrack.DeltaR(tlvSubjet) > Rmax)
268 {
269 Rmax = tlvTrack.DeltaR(tlvSubjet);
270 }
271 }
272 }
273
274 return Rmax;
275}
276
277
278//______________________________________________________________________________;
280{
281 return xDiTau.nTracks();
282}
283
284//______________________________________________________________________________;
285int DiTauIDVarCalculator::n_tracks(const xAOD::DiTauJet& xDiTau, int iSubjet) const
286{
287 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
288 if (iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
289 return m_dDefault;
290 }
291
292 static const SG::ConstAccessor<std::vector<int> > n_tracksAcc("n_tracks");
293 if (!n_tracksAcc.isAvailable(xDiTau))
294 {
295 ATH_MSG_DEBUG("n_tracks decoration not available. Try with track links.");
296
297 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
298 if (!trackLinksAcc.isAvailable(xDiTau) )
299 {
300 ATH_MSG_WARNING("Track links not available. Return 0.");
301 return (int)m_dDefault;
302 }
303
304 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
305
306 TLorentzVector tlvSubjet;
307 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(iSubjet),
308 xDiTau.subjetEta(iSubjet),
309 xDiTau.subjetPhi(iSubjet),
310 xDiTau.subjetE(iSubjet) );
311
312 TLorentzVector tlvTrack;
313 int nTracks = 0;
314 for (const auto &xTrack: xTracks)
315 {
316 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
317 (*xTrack)->eta(),
318 (*xTrack)->phi(),
319 (*xTrack)->e() );
320 if ( tlvSubjet.DeltaR(tlvTrack) < 0.2 ) nTracks++;
321 }
322
323 return nTracks;
324 }
325
326 return n_tracksAcc(xDiTau).at(iSubjet);
327
328}
329
330//______________________________________________________________________________;
332{
333 return xDiTau.nIsoTracks();
334}
335
336//______________________________________________________________________________;
337float DiTauIDVarCalculator::R_tracks(const xAOD::DiTauJet& xDiTau, int iSubjet) const
338{
339 double R_sum = 0;
340 double pt = 0;
341
342 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
343 if (!trackLinksAcc.isAvailable(xDiTau) )
344 {
345 ATH_MSG_WARNING("Link not available");
346 }
347
348 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
349 if (iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
350 return m_dDefault;
351 }
352
353 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
354
355 TLorentzVector tlvSubjet;
356 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(iSubjet),
357 xDiTau.subjetEta(iSubjet),
358 xDiTau.subjetPhi(iSubjet),
359 xDiTau.subjetE(iSubjet) );
360
361 TLorentzVector tlvTrack;
362
363 for (const auto& xTrack: xTracks)
364 {
365 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
366 (*xTrack)->eta(),
367 (*xTrack)->phi(),
368 (*xTrack)->e() );
369
370 if ( tlvSubjet.DeltaR(tlvTrack) < 0.2 )
371 {
372 //ATH_MSG_DEBUG("smaller");
373 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
374 pt += tlvTrack.Pt();
375 }
376 }
377
378 if (pt == 0)
379 {
380 return m_dDefault;
381 }
382
383 return R_sum / pt;
384}
385
386//______________________________________________________________________________;
387float DiTauIDVarCalculator::R_core(const xAOD::DiTauJet& xDiTau, int iSubjet) const
388{
389 double R_sum = 0;
390 double pt = 0;
391
392 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
393 if (!trackLinksAcc.isAvailable(xDiTau) )
394 {
395 ATH_MSG_WARNING("Link not available");
396 }
397 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
398 if (iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
399 return m_dDefault;
400 }
401
402 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
403
404 TLorentzVector tlvSubjet;
405 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(iSubjet),
406 xDiTau.subjetEta(iSubjet),
407 xDiTau.subjetPhi(iSubjet),
408 xDiTau.subjetE(iSubjet) );
409
410 TLorentzVector tlvTrack;
411
412 for (const auto& xTrack: xTracks)
413 {
414 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
415 (*xTrack)->eta(),
416 (*xTrack)->phi(),
417 (*xTrack)->e() );
418
419 if ( tlvSubjet.DeltaR(tlvTrack) < m_Rcore )
420 {
421 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
422 pt += tlvTrack.Pt();
423 }
424 }
425
426 if (pt == 0)
427 {
428 return m_dDefault;
429 }
430
431 return R_sum / pt;
432}
433
434//______________________________________________________________________________;
436{
437 double R_sum = 0;
438 double pt = 0;
439
440 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
441 if (!trackLinksAcc.isAvailable(xDiTau) )
442 {
443 ATH_MSG_WARNING("Link not available");
444 }
445 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
446 if (n_subjetsAcc(xDiTau) < 2) {
447 return m_dDefault;
448 }
449
450
451 for (int i = 0; i<=1; i++)
452 {
453
454 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
455
456 TLorentzVector tlvSubjet;
457 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(i),
458 xDiTau.subjetEta(i),
459 xDiTau.subjetPhi(i),
460 xDiTau.subjetE(i) );
461
462 TLorentzVector tlvTrack;
463
464 for (const auto& xTrack: xTracks)
465 {
466 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
467 (*xTrack)->eta(),
468 (*xTrack)->phi(),
469 (*xTrack)->e() );
470 if ( tlvSubjet.DeltaR(tlvTrack) < m_Rcore )
471 {
472 //ATH_MSG_DEBUG("smaller");
473 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
474 pt += tlvTrack.Pt();
475 }
476 }
477 }
478 if (pt == 0)
479 {
480 return m_dDefault;
481 }
482
483 return R_sum / pt;
484}
485
486//______________________________________________________________________________;
488{
489 double R_sum = 0;
490 double pt = 0;
491
492 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
493 if (!trackLinksAcc.isAvailable(xDiTau) )
494 {
495 ATH_MSG_WARNING("Link not available");
496 }
497 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
498 if (n_subjetsAcc(xDiTau) < 2) {
499 return m_dDefault;
500 }
501
502 for (int i = 0; i<=1; i++)
503 {
504
505 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
506
507 TLorentzVector tlvSubjet;
508 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(i),
509 xDiTau.subjetEta(i),
510 xDiTau.subjetPhi(i),
511 xDiTau.subjetE(i) );
512
513 TLorentzVector tlvTrack;
514
515 for (const auto& xTrack: xTracks)
516 {
517 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
518 (*xTrack)->eta(),
519 (*xTrack)->phi(),
520 (*xTrack)->e() );
521
522 if (tlvSubjet.DeltaR(tlvTrack) < 0.2)
523 {
524 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
525 pt += tlvTrack.Pt();
526 }
527 }
528 }
529 if (pt == 0)
530 {
531 return m_dDefault;
532 }
533
534 return R_sum / pt;
535}
536//______________________________________________________________________________;
538{
539 double R_sum = 0;
540 double pt = 0;
541
542 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
543 if (!trackLinksAcc.isAvailable(xDiTau) )
544 {
545 ATH_MSG_WARNING("Link not available");
546 }
547
548 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
549 for (int i = 0; i<n_subjetsAcc(xDiTau); i++)
550 {
551
552 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
553
554 TLorentzVector tlvSubjet;
555 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(i),
556 xDiTau.subjetEta(i),
557 xDiTau.subjetPhi(i),
558 xDiTau.subjetE(i) );
559
560 TLorentzVector tlvTrack;
561
562 for (const auto& xTrack: xTracks)
563 {
564 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
565 (*xTrack)->eta(),
566 (*xTrack)->phi(),
567 (*xTrack)->e() );
568
569 if (tlvSubjet.DeltaR(tlvTrack) <= 0.2)
570 {
571 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
572 pt += tlvTrack.Pt();
573 }
574 }
575 }
576
577 if (pt == 0)
578 {
579 return m_dDefault;
580 }
581
582 return R_sum / pt;
583}
584
585//______________________________________________________________________________;
587{
588 double R_sum = 0;
589 double pt = 0;
590
591 static const SG::ConstAccessor<TrackParticleLinks_t> isoTrackLinksAcc("isoTrackLinks");
592 if (!isoTrackLinksAcc.isAvailable(xDiTau) )
593 {
594 ATH_MSG_WARNING("Link not available");
595 }
596
597 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
598 if (n_subjetsAcc(xDiTau) < 2) {
599 return m_dDefault;
600 }
601
602 for (int i = 0; i<=1; i++)
603 {
604
605 TrackParticleLinks_t xIsoTracks = xDiTau.isoTrackLinks();
606
607 TLorentzVector tlvSubjet;
608 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(i),
609 xDiTau.subjetEta(i),
610 xDiTau.subjetPhi(i),
611 xDiTau.subjetE(i) );
612
613 TLorentzVector tlvIsoTrack;
614
615 for (const auto& xIsoTrack: xIsoTracks)
616 {
617 tlvIsoTrack.SetPtEtaPhiE( (*xIsoTrack)->pt(),
618 (*xIsoTrack)->eta(),
619 (*xIsoTrack)->phi(),
620 (*xIsoTrack)->e() );
621
622 if (tlvSubjet.DeltaR(tlvIsoTrack) < 0.4)
623 {
624 R_sum += tlvSubjet.DeltaR(tlvIsoTrack)*tlvIsoTrack.Pt();
625 pt += tlvIsoTrack.Pt();
626 }
627 }
628 }
629
630 if (pt == 0)
631 {
632 return m_dDefault;
633 }
634
635 return R_sum / pt;
636}
637
638//______________________________________________________________________________;
640{
641
642 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
643 if (!trackLinksAcc.isAvailable(xDiTau) )
644 {
645 ATH_MSG_WARNING("Link not available");
646 }
647
648 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
649 if (n_subjetsAcc(xDiTau) < 2) {
650 return m_dDefault;
651 }
652
653 TLorentzVector tlvallTracks;
654
655 for (int i = 0; i<=1; i++)
656 {
657
658 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
659
660 TLorentzVector tlvSubjet;
661 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(i),
662 xDiTau.subjetEta(i),
663 xDiTau.subjetPhi(i),
664 xDiTau.subjetE(i) );
665
666 TLorentzVector tlvTrack;
667
668 for (const auto& xTrack: xTracks)
669 {
670 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
671 (*xTrack)->eta(),
672 (*xTrack)->phi(),
673 (*xTrack)->e() );
674 if ( tlvSubjet.DeltaR(tlvTrack) < m_Rcore )
675 {
676 //ATH_MSG_DEBUG("smaller");
677 tlvallTracks += tlvTrack;
678 }
679 }
680 }
681 if (tlvallTracks.M() < 0)
682 {
683 return m_dDefault;
684 }
685
686 return tlvallTracks.M();
687}
688
689//______________________________________________________________________________;
690float DiTauIDVarCalculator::mass_core(const xAOD::DiTauJet& xDiTau, int iSubjet) const
691{
692
693 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
694 if (!trackLinksAcc.isAvailable(xDiTau) )
695 {
696 ATH_MSG_WARNING("Link not available");
697 }
698
699 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
700 if ( iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
701 return m_dDefault;
702 }
703
704 TLorentzVector tlvallTracks;
705
706
707 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
708
709 TLorentzVector tlvSubjet;
710 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(iSubjet),
711 xDiTau.subjetEta(iSubjet),
712 xDiTau.subjetPhi(iSubjet),
713 xDiTau.subjetE(iSubjet) );
714
715 TLorentzVector tlvTrack;
716
717 for (const auto& xTrack: xTracks)
718 {
719 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
720 (*xTrack)->eta(),
721 (*xTrack)->phi(),
722 (*xTrack)->e() );
723 if ( tlvSubjet.DeltaR(tlvTrack) < m_Rcore )
724 {
725 //ATH_MSG_DEBUG("smaller");
726 tlvallTracks += tlvTrack;
727 }
728 }
729
730 if (tlvallTracks.M() < 0)
731 {
732 return m_dDefault;
733 }
734
735 return tlvallTracks.M();
736}
737
738//______________________________________________________________________________;
739float DiTauIDVarCalculator::mass_tracks(const xAOD::DiTauJet& xDiTau, int iSubjet) const
740{
741
742 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
743 if (!trackLinksAcc.isAvailable(xDiTau) )
744 {
745 ATH_MSG_WARNING("Link not available");
746 }
747
748 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
749 if ( iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
750 return m_dDefault;
751 }
752
753 TLorentzVector tlvallTracks;
754
755 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
756
757 TLorentzVector tlvSubjet;
758 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(iSubjet),
759 xDiTau.subjetEta(iSubjet),
760 xDiTau.subjetPhi(iSubjet),
761 xDiTau.subjetE(iSubjet) );
762
763 TLorentzVector tlvTrack;
764
765 for (const auto& xTrack: xTracks)
766 {
767 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
768 (*xTrack)->eta(),
769 (*xTrack)->phi(),
770 (*xTrack)->e() );
771 if ( tlvSubjet.DeltaR(tlvTrack) < 0.2 )
772 {
773 tlvallTracks += tlvTrack;
774 }
775 }
776
777 if (tlvallTracks.M() < 0)
778 {
779 return m_dDefault;
780 }
781
782 return tlvallTracks.M();
783}
784//______________________________________________________________________________;
786{
787
788 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
789 if (!trackLinksAcc.isAvailable(xDiTau) )
790 {
791 ATH_MSG_WARNING("Link not available");
792 }
793
794 TLorentzVector tlvallTracks;
795
796 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
797
798 TLorentzVector tlvTrack;
799
800 for (const auto& xTrack: xTracks)
801 {
802 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
803 (*xTrack)->eta(),
804 (*xTrack)->phi(),
805 (*xTrack)->e() );
806
807 tlvallTracks += tlvTrack;
808 }
809
810 if (tlvallTracks.M() < 0)
811 {
812 return m_dDefault;
813 }
814 return tlvallTracks.M();
815}
816//______________________________________________________________________________;
818{
819
820 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
821 if (!trackLinksAcc.isAvailable(xDiTau) )
822 {
823 ATH_MSG_WARNING("Link not available");
824 }
825
826 TLorentzVector tlvallTracks;
827
828 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
829
830 TLorentzVector tlvTrack;
831
832 for (const auto& xTrack: xTracks)
833 {
834 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
835 (*xTrack)->eta(),
836 (*xTrack)->phi(),
837 (*xTrack)->e() );
838
839 tlvallTracks += tlvTrack;
840 }
841
842
843 TrackParticleLinks_t xIsoTracks = xDiTau.isoTrackLinks();
844
845 TLorentzVector tlvIsoTrack;
846
847 for (const auto& xIsoTrack: xIsoTracks)
848 {
849 tlvIsoTrack.SetPtEtaPhiE( (*xIsoTrack)->pt(),
850 (*xIsoTrack)->eta(),
851 (*xIsoTrack)->phi(),
852 (*xIsoTrack)->e() );
853
854 tlvallTracks += tlvIsoTrack;
855 }
856
857 if (tlvallTracks.M() < 0)
858 {
859 return m_dDefault;
860 }
861
862 return tlvallTracks.M();
863}
864
865//______________________________________________________________________________;
866float DiTauIDVarCalculator::E_frac(const xAOD::DiTauJet& xDiTau, int iSubjet) const
867{
868 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
869 if ( iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
870 return m_dDefault;
871 }
872
873 return xDiTau.subjetE(iSubjet) / xDiTau.subjetE(0);
874}
875
876//______________________________________________________________________________;
877float DiTauIDVarCalculator::R_subjets(const xAOD::DiTauJet& xDiTau, int iSubjet) const
878{
879
880 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
881 if ( iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
882 return m_dDefault;
883 }
884
885 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
886 if (!trackLinksAcc.isAvailable(xDiTau) )
887 {
888 ATH_MSG_WARNING("Track links not available");
889 }
890
891 TLorentzVector tlvLeadSubjet;
892 tlvLeadSubjet.SetPtEtaPhiE( xDiTau.subjetPt(0),
893 xDiTau.subjetEta(0),
894 xDiTau.subjetPhi(0),
895 xDiTau.subjetE(0) );
896
897 TLorentzVector tlvSubjet;
898 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(iSubjet),
899 xDiTau.subjetEta(iSubjet),
900 xDiTau.subjetPhi(iSubjet),
901 xDiTau.subjetE(iSubjet) );
902 return tlvLeadSubjet.DeltaR(tlvSubjet);
903}
904
905//______________________________________________________________________________;
906float DiTauIDVarCalculator::d0_leadtrack(const xAOD::DiTauJet& xDiTau, int iSubjet) const
907{
908 double pt_leadtrk = 0;
909 double d0 = m_dDefault;
910 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
911 if (!trackLinksAcc.isAvailable(xDiTau) )
912 {
913 ATH_MSG_WARNING("Track links not available");
914 }
915
916 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
917 if ( iSubjet < 0 || iSubjet >= n_subjetsAcc(xDiTau)) {
918 return m_dDefault;
919 }
920
921 TLorentzVector tlvSubjet;
922 tlvSubjet.SetPtEtaPhiE( xDiTau.subjetPt(iSubjet),
923 xDiTau.subjetEta(iSubjet),
924 xDiTau.subjetPhi(iSubjet),
925 xDiTau.subjetE(iSubjet) );
926
927 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
928
929 TLorentzVector tlvTrack;
930
931 for (auto &xTrack: xTracks)
932 {
933 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
934 (*xTrack)->eta(),
935 (*xTrack)->phi(),
936 (*xTrack)->e() );
937
938 if (tlvTrack.DeltaR(tlvSubjet) < m_Rcore)
939 {
940 if (tlvTrack.Pt() > pt_leadtrk)
941 {
942 pt_leadtrk = tlvTrack.Pt();
943 d0 = (*xTrack)->d0();
944 }
945 }
946 }
947 return d0;
948}
949
950//______________________________________________________________________________;
952{
953 double iso_pt = 0;
954 static const SG::ConstAccessor<TrackParticleLinks_t> isoTrackLinksAcc("isoTrackLinks");
955 if (!isoTrackLinksAcc.isAvailable(xDiTau) )
956 {
957 ATH_MSG_WARNING("Track links not available");
958 }
959
960 TrackParticleLinks_t xIsoTracks = xDiTau.isoTrackLinks();
961
962 TLorentzVector tlvIsoTrack;
963
964 for (const auto& xIsoTrack: xIsoTracks)
965 {
966 tlvIsoTrack.SetPtEtaPhiE( (*xIsoTrack)->pt(),
967 (*xIsoTrack)->eta(),
968 (*xIsoTrack)->phi(),
969 (*xIsoTrack)->e() );
970
971 iso_pt += tlvIsoTrack.Pt();
972 }
973
974 return iso_pt / xDiTau.pt();
975}
976
977//______________________________________________________________________________;
979{
980 static const SG::ConstAccessor<TrackParticleLinks_t> trackLinksAcc("trackLinks");
981 if (!trackLinksAcc.isAvailable(xDiTau) )
982 {
983 Warning("decorNtracks()", "Track links not available.");
984 return StatusCode::FAILURE;
985 }
986
987 static const SG::ConstAccessor<int> n_subjetsAcc("n_subjets");
988 int nSubjets = n_subjetsAcc(xDiTau);
989
990 std::vector<int> nTracks(nSubjets, 0);
991
992 TrackParticleLinks_t xTracks = xDiTau.trackLinks();
993 for (const auto &xTrack: xTracks)
994 {
995 double dRmin = 1111;
996 double itrmin = -1;
997
998 for (int i=0; i<nSubjets; ++i)
999 {
1000 TLorentzVector tlvSubjet = TLorentzVector();
1001 tlvSubjet.SetPtEtaPhiE(xDiTau.subjetPt(i),
1002 xDiTau.subjetEta(i),
1003 xDiTau.subjetPhi(i),
1004 xDiTau.subjetE(i));
1005 double dR = tlvSubjet.DeltaR((*xTrack)->p4());
1006
1007
1008 if ((dR < m_Rsubjet) && (dR < dRmin))
1009 {
1010 dRmin = dR;
1011 itrmin = i;
1012 }
1013 } // loop over subjets
1014 if (itrmin > -1) nTracks[itrmin]++;
1015 } // loop over tracks
1016
1017 static const SG::Decorator< std::vector<int> > n_tracksDec("n_tracks");
1018 n_tracksDec(xDiTau) = nTracks;
1019
1020 return StatusCode::SUCCESS;
1021}
1022
1023
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
float mass_track_core(const xAOD::DiTauJet &xDiTau) const
float f_subjet(const xAOD::DiTauJet &xDiTau, int iSubjet) const
static float n_subjets(const xAOD::DiTauJet &xDiTau)
float R_tracks(const xAOD::DiTauJet &xDiTau, int iSubjet) const
static int n_track(const xAOD::DiTauJet &xDiTau)
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
float f_subjets(const xAOD::DiTauJet &xDiTau) const
virtual StatusCode calculateIDVariables(const xAOD::DiTauJet &xDiTau) const
virtual StatusCode execute(const xAOD::DiTauJet &xDiTau) const override
Declare the interface that the class provides.
StatusCode decorNtracks(const xAOD::DiTauJet &xDiTau) const
float R_track(const xAOD::DiTauJet &xDiTau) const
float f_core(const xAOD::DiTauJet &xDiTau, int iSubjet) const
float mass_core(const xAOD::DiTauJet &xDiTau, int iSubjet) const
static int n_isotrack(const xAOD::DiTauJet &xDiTau)
float d0_leadtrack(const xAOD::DiTauJet &xDiTau, int iSubjet) const
float f_isotracks(const xAOD::DiTauJet &xDiTau) const
float R_track_all(const xAOD::DiTauJet &xDiTau) const
float ditau_pt(const xAOD::DiTauJet &xDiTau) const
int n_tracks(const xAOD::DiTauJet &xDiTau, int iSubjet) const
float mass_track_all(const xAOD::DiTauJet &xDiTau) const
float R_isotrack(const xAOD::DiTauJet &xDiTau) const
float R_max(const xAOD::DiTauJet &xDiTau, int iSubjet) const
float E_frac(const xAOD::DiTauJet &xDiTau, int iSubjet) const
float mass_tracks(const xAOD::DiTauJet &xDiTau, int iSubjet) const
float f_track(const xAOD::DiTauJet &xDiTau, int iSubjet) const
float mass_track(const xAOD::DiTauJet &xDiTau) const
virtual ASG_TOOL_CLASS(DiTauIDVarCalculator, DiTauRecTools::IDiTauToolBase) public ~DiTauIDVarCalculator()
Create a proper constructor for Athena.
float R_core(const xAOD::DiTauJet &xDiTau, int iSubjet) const
float R_track_core(const xAOD::DiTauJet &xDiTau) const
float R_subjets(const xAOD::DiTauJet &xDiTau, int iSubjet) const
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
const TrackParticleLinks_t & isoTrackLinks() const
float fCore(unsigned int numSubjet) const
float subjetEta(unsigned int numSubjet) const
virtual double pt() const
The transverse momentum ( ) of the particle.
size_t nTracks() const
float subjetE(unsigned int numSubjet) const
float subjetPt(unsigned int numSubjet) const
float subjetPhi(unsigned int numSubjet) const
const TrackParticleLinks_t & trackLinks() const
size_t nIsoTracks() const
Implementation of boosted di-tau ID.
DiTauJet_v1 DiTauJet
Definition of the current version.
Definition DiTauJet.h:17
std::vector< ElementLink< xAOD::TrackParticleContainer > > TrackParticleLinks_t