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