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