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