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