ATLAS Offline Software
Loading...
Searching...
No Matches
DiTauExtraVarDecorator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 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
18DiTauExtraVarDecorator::DiTauExtraVarDecorator( const std::string& type, const std::string& name, const IInterface * parent) :
19 DiTauToolBase(type, name, parent)
20{
21 declareInterface<DiTauToolBase > (this);
22}
23
25
27 ATH_MSG_INFO( "Initializing DiTauExtraVarDecorator" );
28 ATH_CHECK( m_ditau_ptDecKey.initialize() );
29 ATH_CHECK( m_f_core_leadDecKey.initialize() );
30 ATH_CHECK( m_f_core_sublDecKey.initialize() );
31 ATH_CHECK( m_f_subjet_leadDecKey.initialize() );
32 ATH_CHECK( m_f_subjet_sublDecKey.initialize() );
33 ATH_CHECK( m_f_subjetsDecKey.initialize() );
34 ATH_CHECK( m_f_track_leadDecKey.initialize() );
35 ATH_CHECK( m_f_track_sublDecKey.initialize() );
36 ATH_CHECK( m_R_max_leadDecKey.initialize() );
37 ATH_CHECK( m_R_max_sublDecKey.initialize() );
38 ATH_CHECK( m_n_trackDecKey.initialize() );
39 ATH_CHECK( m_n_tracks_leadDecKey.initialize() );
40 ATH_CHECK( m_n_tracks_sublDecKey.initialize() );
41 ATH_CHECK( m_n_isotrackDecKey.initialize() );
42 ATH_CHECK( m_R_trackDecKey.initialize() );
43 ATH_CHECK( m_R_track_coreDecKey.initialize() );
44 ATH_CHECK( m_R_track_allDecKey.initialize() );
45 ATH_CHECK( m_R_isotrackDecKey.initialize() );
46 ATH_CHECK( m_R_core_leadDecKey.initialize() );
47 ATH_CHECK( m_R_core_sublDecKey.initialize() );
48 ATH_CHECK( m_R_tracks_leadDecKey.initialize() );
49 ATH_CHECK( m_R_tracks_sublDecKey.initialize() );
50 ATH_CHECK( m_M_trackDecKey.initialize() );
51 ATH_CHECK( m_M_track_coreDecKey.initialize() );
52 ATH_CHECK( m_M_core_leadDecKey.initialize() );
53 ATH_CHECK( m_M_core_sublDecKey.initialize() );
54 ATH_CHECK( m_M_track_allDecKey.initialize() );
55 ATH_CHECK( m_M_tracks_leadDecKey.initialize() );
56 ATH_CHECK( m_M_tracks_sublDecKey.initialize() );
57 ATH_CHECK( m_E_frac_sublDecKey.initialize() );
58 ATH_CHECK( m_E_frac_subsublDecKey.initialize() );
59 ATH_CHECK( m_R_subjets_sublDecKey.initialize() );
63 ATH_CHECK( m_f_isotracksDecKey.initialize() );
64
65 return StatusCode::SUCCESS;
66}
67
68StatusCode DiTauExtraVarDecorator::execute(DiTauCandidateData * data, const EventContext& ctx) const {
69 xAOD::DiTauJet* xDiTauPtr = data->xAODDiTau;
70 xAOD::DiTauJet& xDiTau = *xDiTauPtr;
71 ATH_CHECK( executeObj(xDiTau, ctx));
72 return StatusCode::SUCCESS;
73}
74
75StatusCode DiTauExtraVarDecorator::executeObj( xAOD::DiTauJet& xDiTau, const EventContext& ctx) const{
76
77 ATH_MSG_DEBUG("Calculate DiTau ID variables");
78
79 static const SG::Accessor< int > n_subjetsDec("n_subjets");
80 DitauTrackingInfo ditauTrackingInfo;
81 ATH_CHECK( getTrackingInfo(xDiTau, ditauTrackingInfo) );
82 n_subjetsDec(xDiTau) = ditauTrackingInfo.nSubjets;
83
85 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > f_core_leadDec (m_f_core_leadDecKey, ctx); f_core_leadDec(xDiTau) = m_dDefault;
86 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > f_core_sublDec (m_f_core_sublDecKey, ctx); f_core_sublDec(xDiTau) = m_dDefault;
87 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > f_subjet_leadDec (m_f_subjet_leadDecKey, ctx); f_subjet_leadDec(xDiTau) = m_dDefault;
88 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > f_subjet_sublDec (m_f_subjet_sublDecKey, ctx); f_subjet_sublDec(xDiTau) = m_dDefault;
90 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > f_track_leadDec (m_f_track_leadDecKey, ctx); f_track_leadDec(xDiTau) = m_dDefault;
91 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > f_track_sublDec (m_f_track_sublDecKey, ctx); f_track_sublDec(xDiTau) = m_dDefault;
92 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_max_leadDec (m_R_max_leadDecKey, ctx); R_max_leadDec(xDiTau) = m_dDefault;
93 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_max_sublDec (m_R_max_sublDecKey, ctx); R_max_sublDec(xDiTau) = m_dDefault;
95 SG::WriteDecorHandle<xAOD::DiTauJetContainer, int > n_tracks_leadDec (m_n_tracks_leadDecKey, ctx); n_tracks_leadDec(xDiTau) = m_dDefault;
96 SG::WriteDecorHandle<xAOD::DiTauJetContainer, int > n_tracks_sublDec (m_n_tracks_sublDecKey, ctx); n_tracks_sublDec(xDiTau) = m_dDefault;
97 SG::WriteDecorHandle<xAOD::DiTauJetContainer, int > n_isotrackDec (m_n_isotrackDecKey, ctx); n_isotrackDec(xDiTau) = m_dDefault;
99 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_track_coreDec (m_R_track_coreDecKey, ctx); R_track_coreDec(xDiTau) = m_dDefault;
100 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_track_allDec (m_R_track_allDecKey, ctx); R_track_allDec(xDiTau) = m_dDefault;
101 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_isotrackDec (m_R_isotrackDecKey, ctx); R_isotrackDec(xDiTau) = m_dDefault;
102 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_core_leadDec (m_R_core_leadDecKey, ctx); R_core_leadDec(xDiTau) = m_dDefault;
103 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_core_sublDec (m_R_core_sublDecKey, ctx); R_core_sublDec(xDiTau) = m_dDefault;
104 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_tracks_leadDec (m_R_tracks_leadDecKey, ctx); R_tracks_leadDec(xDiTau) = m_dDefault;
105 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_tracks_sublDec (m_R_tracks_sublDecKey, ctx); R_tracks_sublDec(xDiTau) = m_dDefault;
107 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > M_track_coreDec (m_M_track_coreDecKey, ctx); M_track_coreDec(xDiTau) = m_dDefault;
108 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > M_core_leadDec (m_M_core_leadDecKey, ctx); M_core_leadDec(xDiTau) = m_dDefault;
109 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > M_core_sublDec (m_M_core_sublDecKey, ctx); M_core_sublDec(xDiTau) = m_dDefault;
110 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > M_track_allDec (m_M_track_allDecKey, ctx); M_track_allDec(xDiTau) = m_dDefault;
111 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > M_tracks_leadDec (m_M_tracks_leadDecKey, ctx); M_tracks_leadDec(xDiTau) = m_dDefault;
112 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > M_tracks_sublDec (m_M_tracks_sublDecKey, ctx); M_tracks_sublDec(xDiTau) = m_dDefault;
113 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > E_frac_sublDec (m_E_frac_sublDecKey, ctx); E_frac_sublDec(xDiTau) = m_dDefault;
114 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > E_frac_subsublDec (m_E_frac_subsublDecKey, ctx); E_frac_subsublDec(xDiTau) = m_dDefault;
115 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_subjets_sublDec (m_R_subjets_sublDecKey, ctx); R_subjets_sublDec(xDiTau) = m_dDefault;
116 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > R_subjets_subsublDec (m_R_subjets_subsublDecKey, ctx); R_subjets_subsublDec(xDiTau) = m_dDefault;
117 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > d0_leadtrack_leadDec (m_d0_leadtrack_leadDecKey, ctx); d0_leadtrack_leadDec(xDiTau) = m_dDefault;
118 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > d0_leadtrack_sublDec (m_d0_leadtrack_sublDecKey, ctx); d0_leadtrack_sublDec(xDiTau) = m_dDefault;
119 SG::WriteDecorHandle<xAOD::DiTauJetContainer, float > f_isotracksDec (m_f_isotracksDecKey, ctx); f_isotracksDec(xDiTau) = m_dDefault;
120
121 n_trackDec(xDiTau) = n_track(xDiTau, ditauTrackingInfo);
122 n_isotrackDec(xDiTau) = n_isotrack(xDiTau, ditauTrackingInfo);
123 R_track_allDec(xDiTau) = R_track_all(xDiTau, ditauTrackingInfo);
124
125 M_track_allDec(xDiTau) = mass_track_all(xDiTau, ditauTrackingInfo);
126 f_isotracksDec(xDiTau) = f_isotracks(xDiTau, ditauTrackingInfo);
127
128 if (ditauTrackingInfo.nSubjets > 2) {
129 E_frac_subsublDec(xDiTau) = E_frac (xDiTau, ditauTrackingInfo, 2);
130 R_subjets_subsublDec(xDiTau) = R_subjets (xDiTau, ditauTrackingInfo, 2);
131 }
132 if (ditauTrackingInfo.nSubjets > 1) {
133 ditau_ptDec(xDiTau) = ditau_pt (xDiTau, ditauTrackingInfo);
134 f_subjetsDec(xDiTau) = f_subjets (xDiTau, ditauTrackingInfo);
135 R_track_coreDec(xDiTau) = R_track_core (xDiTau, ditauTrackingInfo);
136 R_trackDec(xDiTau) = R_track (xDiTau, ditauTrackingInfo);
137 R_isotrackDec(xDiTau) = R_isotrack (xDiTau, ditauTrackingInfo);
138 M_trackDec(xDiTau) = mass_track (xDiTau, ditauTrackingInfo);
139 M_track_coreDec(xDiTau) = mass_track_core(xDiTau, ditauTrackingInfo);
140 d0_leadtrack_sublDec(xDiTau) = d0_leadtrack (xDiTau, ditauTrackingInfo, 1);
141 f_core_sublDec(xDiTau) = f_core (xDiTau, ditauTrackingInfo, 1);
142 f_subjet_sublDec(xDiTau) = f_subjet (xDiTau, ditauTrackingInfo, 1);
143 f_track_sublDec(xDiTau) = f_track (xDiTau, ditauTrackingInfo, 1);
144 R_max_sublDec(xDiTau) = R_max (xDiTau, ditauTrackingInfo, 1);
145 n_tracks_sublDec(xDiTau) = n_tracks (xDiTau, ditauTrackingInfo, 1);
146 R_core_sublDec(xDiTau) = R_core (xDiTau, ditauTrackingInfo, 1);
147 R_tracks_sublDec(xDiTau) = R_tracks (xDiTau, ditauTrackingInfo, 1);
148 M_core_sublDec(xDiTau) = mass_core (xDiTau, ditauTrackingInfo, 1);
149 M_tracks_sublDec(xDiTau) = mass_tracks (xDiTau, ditauTrackingInfo, 1);
150 E_frac_sublDec(xDiTau) = E_frac (xDiTau, ditauTrackingInfo, 1);
151 R_subjets_sublDec(xDiTau) = R_subjets (xDiTau, ditauTrackingInfo, 1);
152 }
153 if (ditauTrackingInfo.nSubjets > 0) {
154 d0_leadtrack_leadDec(xDiTau) = d0_leadtrack (xDiTau, ditauTrackingInfo, 0);
155 f_core_leadDec(xDiTau) = f_core (xDiTau, ditauTrackingInfo, 0);
156 f_subjet_leadDec(xDiTau) = f_subjet (xDiTau, ditauTrackingInfo, 0);
157 f_track_leadDec(xDiTau) = f_track (xDiTau, ditauTrackingInfo, 0);
158 R_max_leadDec(xDiTau) = R_max (xDiTau, ditauTrackingInfo, 0);
159 n_tracks_leadDec(xDiTau) = n_tracks (xDiTau, ditauTrackingInfo, 0);
160 R_core_leadDec(xDiTau) = R_core (xDiTau, ditauTrackingInfo, 0);
161 R_tracks_leadDec(xDiTau) = R_tracks (xDiTau, ditauTrackingInfo, 0);
162 M_core_leadDec(xDiTau) = mass_core (xDiTau, ditauTrackingInfo, 0);
163 M_tracks_leadDec(xDiTau) = mass_tracks (xDiTau, ditauTrackingInfo, 0);
164 }
165 return StatusCode::SUCCESS;
166}
167
169 int nSubjet = 0;
170 while (xDiTau.subjetPt(nSubjet) > 0. ){
171 nSubjet++;
172 }
173 return nSubjet;
174}
175
177{
178 return xDiTau.subjetPt(0)+xDiTau.subjetPt(1);
179}
180
181float DiTauExtraVarDecorator::f_core(const xAOD::DiTauJet& xDiTau, const DitauTrackingInfo&, int iSubjet) const
182{
183 return xDiTau.fCore(iSubjet);
184}
185
186float DiTauExtraVarDecorator::f_subjet(const xAOD::DiTauJet& xDiTau, const DitauTrackingInfo&, int iSubjet) const {
187 return xDiTau.subjetPt(iSubjet) / xDiTau.pt();
188}
189
191{
192 return (xDiTau.subjetPt(0) + xDiTau.subjetPt(1))/ xDiTau.pt();
193}
194
195float DiTauExtraVarDecorator::f_track(const xAOD::DiTauJet&, const DitauTrackingInfo& ditauInfo, int iSubjet) const
196{
197 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(iSubjet);
198 float leadTrackPt = subjetInfo.leadTrack ? subjetInfo.leadTrack->pt() : 0;
199 float subjetPt = subjetInfo.subjet_p4.Pt();
200 return leadTrackPt / subjetPt;
201}
202
203float DiTauExtraVarDecorator::R_max(const xAOD::DiTauJet&, const DitauTrackingInfo& ditauInfo, int iSubjet) const {
204 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(iSubjet);
205 float Rmax = 0;
206 for (const xAOD::TrackParticle* xTrack: subjetInfo.vTracks) {
207 if (subjetInfo.subjet_p4.DeltaR(xTrack->p4()) > Rmax) {
208 Rmax = subjetInfo.subjet_p4.DeltaR(xTrack->p4());
209 }
210 }
211 return Rmax;
212}
213
215 return xDiTau.nTracks();
216}
217
218int DiTauExtraVarDecorator::n_tracks(const xAOD::DiTauJet&, const DitauTrackingInfo& ditauInfo, int iSubjet) const {
219 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(iSubjet);
220 return subjetInfo.vTracks.size();
221}
222
224 return xDiTau.nIsoTracks();
225}
226
227float DiTauExtraVarDecorator::R_tracks(const xAOD::DiTauJet&, const DitauTrackingInfo& ditauInfo, int iSubjet) const {
228 float R_sum = 0;
229 float pt = 0;
230
231 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(iSubjet);
232 for (const xAOD::TrackParticle* xTrack: subjetInfo.vTracks) {
233 R_sum += subjetInfo.subjet_p4.DeltaR(xTrack->p4()) * xTrack->pt();
234 pt += xTrack->pt();
235 }
236 if (pt == 0) {
237 return m_dDefault;
238 }
239 return R_sum / pt;
240}
241
242float DiTauExtraVarDecorator::R_core(const xAOD::DiTauJet&, const DitauTrackingInfo& ditauInfo, int iSubjet) const {
243 double R_sum = 0;
244 double pt = 0;
245 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(iSubjet);
246 for (const xAOD::TrackParticle* xTrack: subjetInfo.vCoreTracks) {
247 R_sum += subjetInfo.subjet_p4.DeltaR(xTrack->p4()) * xTrack->pt();
248 pt += xTrack->pt();
249 }
250 if (pt == 0) {
251 return m_dDefault;
252 }
253 return R_sum / pt;
254
255}
256
258 float R_sum = 0;
259 float pt = 0;
260 for (int i = 0; i < 2; i++) {
261 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(i);
262 for (const xAOD::TrackParticle* xTrack: subjetInfo.vCoreTracks) {
263 R_sum += subjetInfo.subjet_p4.DeltaR(xTrack->p4()) * xTrack->pt();
264 pt += xTrack->pt();
265 }
266 }
267 if (pt == 0) {
268 return m_dDefault;
269 }
270 return R_sum / pt;
271}
272
274{
275 float R_sum = 0;
276 float pt = 0;
277 for (int i = 0; i < 2; i++) {
278 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(i);
279 for (const xAOD::TrackParticle* xTrack: subjetInfo.vTracks) {
280 R_sum += subjetInfo.subjet_p4.DeltaR(xTrack->p4()) * xTrack->pt();
281 pt += xTrack->pt();
282 }
283 }
284 if (pt == 0) {
285 return m_dDefault;
286 }
287 return R_sum / pt;
288}
289
291{
292 double R_sum = 0;
293 double pt = 0;
294
295 for (const SubjetTrackingInfo& subjetInfo : ditauInfo.vSubjetInfo) {
296 for (const xAOD::TrackParticle* xTrack: subjetInfo.vTracks) {
297 R_sum += subjetInfo.subjet_p4.DeltaR(xTrack->p4())*xTrack->pt();
298 pt += xTrack->pt();
299 }
300 }
301 if (pt == 0) {
302 return m_dDefault;
303 }
304 return R_sum / pt;
305}
306
308{
309 float R_sum = 0;
310 float pt = 0;
311 for (int i = 0; i < 2; i++) {
312 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(i);
313 for (const xAOD::TrackParticle* xTrack: subjetInfo.vIsoTracks) {
314 R_sum += subjetInfo.subjet_p4.DeltaR(xTrack->p4()) * xTrack->pt();
315 pt += xTrack->pt();
316 }
317 }
318 if (pt == 0) {
319 return m_dDefault;
320 }
321 return R_sum / pt;
322}
323
325{
326 TLorentzVector allCoreTracks_p4;
327 for (int i = 0; i < 2; i++) {
328 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(i);
329 for (const xAOD::TrackParticle* xTrack: subjetInfo.vCoreTracks) {
330 allCoreTracks_p4 += xTrack->p4();
331 }
332 }
333 float mass = allCoreTracks_p4.M();
334 if (mass < 0) {
335 return m_dDefault;
336 }
337 return mass;
338}
339
340float DiTauExtraVarDecorator::mass_core(const xAOD::DiTauJet&, const DitauTrackingInfo& ditauInfo, int iSubjet) const {
341 TLorentzVector allCoreTracks_p4;
342 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(iSubjet);
343 for (const xAOD::TrackParticle* xTrack: subjetInfo.vCoreTracks) {
344 allCoreTracks_p4 += xTrack->p4();
345 }
346 float mass = allCoreTracks_p4.M();
347 if (mass < 0) {
348 return m_dDefault;
349 }
350 return mass;
351}
352
353float DiTauExtraVarDecorator::mass_tracks(const xAOD::DiTauJet&, const DitauTrackingInfo& ditauInfo, int iSubjet) const {
354 TLorentzVector allTracks_p4;
355 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(iSubjet);
356 for (const xAOD::TrackParticle* xTrack: subjetInfo.vTracks) {
357 allTracks_p4 += xTrack->p4();
358 }
359 float mass = allTracks_p4.M();
360 if (mass < 0) {
361 return m_dDefault;
362 }
363 return mass;
364}
365
367 TLorentzVector allTracks_p4;
368 for (const xAOD::TrackParticle* xTrack: ditauInfo.vTracks) {
369 allTracks_p4 += xTrack->p4();
370 }
371 float mass = allTracks_p4.M();
372 if (mass < 0) {
373 return m_dDefault;
374 }
375 return mass;
376}
377
379 TLorentzVector allTracks_p4;
380 for (const xAOD::TrackParticle* xTrack: ditauInfo.vTracks) {
381 allTracks_p4 += xTrack->p4();
382 }
383 for (const xAOD::TrackParticle* xTrack: ditauInfo.vIsoTracks) {
384 allTracks_p4 += xTrack->p4();
385 }
386 float mass = allTracks_p4.M();
387 if (mass < 0) {
388 return m_dDefault;
389 }
390 return mass;
391}
392
393float DiTauExtraVarDecorator::E_frac(const xAOD::DiTauJet& xDiTau, const DitauTrackingInfo&, int iSubjet) const {
394 return xDiTau.subjetE(iSubjet) / xDiTau.subjetE(0);
395}
396
397float DiTauExtraVarDecorator::R_subjets(const xAOD::DiTauJet&, const DitauTrackingInfo& ditauInfo, int iSubjet) const {
398 TLorentzVector leadSubjet_p4 = ditauInfo.vSubjetInfo.at(0).subjet_p4;
399 TLorentzVector subjet_p4 = ditauInfo.vSubjetInfo.at(iSubjet).subjet_p4;
400 return leadSubjet_p4.DeltaR(subjet_p4);
401}
402
403float DiTauExtraVarDecorator::d0_leadtrack(const xAOD::DiTauJet&, const DitauTrackingInfo& ditauInfo, int iSubjet) const {
404 SubjetTrackingInfo subjetInfo = ditauInfo.vSubjetInfo.at(iSubjet);
405 if (!subjetInfo.leadTrack) {
406 return m_dDefault;
407 }
408 return subjetInfo.leadTrack->d0();
409}
410
411float DiTauExtraVarDecorator::f_isotracks(const xAOD::DiTauJet& xDiTau, const DitauTrackingInfo& ditauInfo) const {
412 float iso_pt = 0;
413 for (const xAOD::TrackParticle* xTrack: ditauInfo.vIsoTracks) {
414 iso_pt += xTrack->pt();
415 }
416 return iso_pt / xDiTau.pt();
417}
418
420 static const SG::ConstAccessor<std::vector<ElementLink<xAOD::TrackParticleContainer>>> trackLinksAcc("trackLinks");
421 static const SG::ConstAccessor<std::vector<ElementLink<xAOD::TrackParticleContainer>>> isoTrackLinksAcc("isoTrackLinks");
422 static const SG::ConstAccessor<float> R_subjetAcc("R_subjet");
423 static const SG::ConstAccessor<float> R_coreAcc("R_core");
424
425
426 if (!trackLinksAcc.isAvailable(xDiTau) || !isoTrackLinksAcc.isAvailable(xDiTau)) {
427 ATH_MSG_WARNING("Track " << (!trackLinksAcc.isAvailable(xDiTau) ? "DiTauJet.trackLinks" : "DiTauJet.isoTrackLinks") << " links not available.");
428 return StatusCode::FAILURE;
429 }
430
431 int nSubjets = n_subjets(xDiTau, trackingInfo);
432 float Rsubjet = R_subjetAcc(xDiTau);
433 float RCore = R_coreAcc(xDiTau);
434
435 trackingInfo.nSubjets = nSubjets;
436 trackingInfo.vSubjetInfo.clear();
437 trackingInfo.vIsoTracks.clear();
438 trackingInfo.vTracks.clear();
439
440 // Get the track links from the DiTauJet and store them in the tracking info
441 std::vector<ElementLink<xAOD::TrackParticleContainer>> isoTrackLinks = xDiTau.isoTrackLinks();
442 for (const auto &trackLink: isoTrackLinks) {
443 if (!trackLink.isValid()) {
444 ATH_MSG_WARNING("Iso track link is not valid");
445 continue;
446 }
447 const xAOD::TrackParticle* xTrack = *trackLink;
448 trackingInfo.vIsoTracks.push_back(xTrack);
449 }
450 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackLinks = xDiTau.trackLinks();
451 for (const auto &trackLink : trackLinks) {
452 if (!trackLink.isValid()) {
453 ATH_MSG_WARNING("track link is not valid");
454 continue;
455 }
456 const xAOD::TrackParticle* xTrack = *trackLink;
457 trackingInfo.vTracks.push_back(xTrack);
458 }
459 // store subjet p4
460 for (int i=0; i<nSubjets; ++i){
461 SubjetTrackingInfo subjetTrackingInfo;
462 TLorentzVector subjet_p4 = TLorentzVector();
463 subjet_p4.SetPtEtaPhiE( xDiTau.subjetPt(i), xDiTau.subjetEta(i), xDiTau.subjetPhi(i), xDiTau.subjetE(i));
464 subjetTrackingInfo.subjet_p4 = subjet_p4;
465 trackingInfo.vSubjetInfo.push_back(subjetTrackingInfo);
466 }
467 for (const auto track : trackingInfo.vTracks) {
468 float dRMin = 999;
469 int inSubjet = -1;
470 for (int i=0; i<nSubjets; ++i){
471 float dRTrackSubjet = trackingInfo.vSubjetInfo[i].subjet_p4.DeltaR(track->p4());
472 if (dRTrackSubjet < Rsubjet && dRTrackSubjet < dRMin){
473 dRMin = dRTrackSubjet;
474 inSubjet = i;
475 }
476 }
477 if (inSubjet >= 0){
478 trackingInfo.vSubjetInfo[inSubjet].vTracks.push_back(track);
479 }
480 }
481 // find leading track in subjets
482 for (int i=0; i<nSubjets; ++i){
483 float ptLeadTrack = 0;
484 for (const auto track : trackingInfo.vSubjetInfo[i].vTracks){
485 if (track->pt() > ptLeadTrack){
486 ptLeadTrack = track->pt();
487 trackingInfo.vSubjetInfo[i].leadTrack = track;
488 }
489 }
490 }
491 // find core track in subjets
492 for (int i=0; i<nSubjets; ++i){
493 for (const auto track : trackingInfo.vSubjetInfo[i].vTracks){
494 auto subjetTrackingInfo = trackingInfo.vSubjetInfo[i];
495 if (subjetTrackingInfo.subjet_p4.DeltaR(track->p4()) < RCore){
496 trackingInfo.vSubjetInfo[i].vCoreTracks.push_back(track);
497 }
498 }
499 }
500 //find isotracks in subjets
501 for (const auto track : trackingInfo.vIsoTracks){
502 float RIso = 0.4;
503 float dRMin = 999;
504 int inSubjet = -1;
505 for (int i=0; i<nSubjets; ++i){
506 float dRTrackSubjet = trackingInfo.vSubjetInfo[i].subjet_p4.DeltaR(track->p4());
507 if (dRTrackSubjet > Rsubjet && dRTrackSubjet < RIso && dRTrackSubjet < dRMin){
508 dRMin = dRTrackSubjet;
509 inSubjet = i;
510 }
511 }
512 if (inSubjet >= 0){
513 trackingInfo.vSubjetInfo[inSubjet].vIsoTracks.push_back(track);
514 }
515 }
516 return StatusCode::SUCCESS;
517}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Helper class to provide constant type-safe access to aux data.
Helper class to provide type-safe access to aux data.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_f_core_sublDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_n_isotrackDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_f_core_leadDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_n_tracks_sublDecKey
float f_subjet(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
float ditau_pt(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_M_track_allDecKey
int n_track(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_E_frac_subsublDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_ditau_ptDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_d0_leadtrack_leadDecKey
float f_isotracks(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
StatusCode getTrackingInfo(xAOD::DiTauJet &xDiTau, DitauTrackingInfo &trackingInfo) const
float f_track(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
virtual StatusCode executeObj(xAOD::DiTauJet &xDiTau, const EventContext &ctx) const override
Execute - called for each Ditau jet.
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_tracks_leadDecKey
Gaudi::Property< float > m_dDefault
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_isotrackDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_track_allDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_f_track_sublDecKey
float R_track_all(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
float R_tracks(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_M_track_coreDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_core_sublDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_M_tracks_sublDecKey
DiTauExtraVarDecorator(const std::string &type, const std::string &name, const IInterface *parent)
float R_track(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_M_trackDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_M_core_sublDecKey
float mass_tracks(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
float mass_track(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
virtual ~DiTauExtraVarDecorator()
float R_isotrack(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
float mass_core(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_max_sublDecKey
float R_max(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_track_coreDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_E_frac_sublDecKey
float f_subjets(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_n_trackDecKey
virtual StatusCode execute(DiTauCandidateData *data, const EventContext &ctx) const override
Execute - called for each Ditau candidate.
float f_core(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_f_subjet_sublDecKey
virtual StatusCode initialize() override
Tool initializer.
float R_core(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_subjets_sublDecKey
float R_subjets(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_core_leadDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_max_leadDecKey
float R_track_core(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
float E_frac(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_f_subjet_leadDecKey
float mass_track_all(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_f_subjetsDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_M_tracks_leadDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_d0_leadtrack_sublDecKey
float d0_leadtrack(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_tracks_sublDecKey
int n_subjets(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_f_isotracksDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_trackDecKey
float mass_track_core(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_R_subjets_subsublDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_f_track_leadDecKey
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_n_tracks_leadDecKey
int n_isotrack(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo) const
int n_tracks(const xAOD::DiTauJet &xDiTau, const DitauTrackingInfo &ditauInfo, int iSubjet) const
SG::WriteDecorHandleKey< xAOD::DiTauJetContainer > m_M_core_leadDecKey
DiTauToolBase(const std::string &type, const std::string &name, const IInterface *parent)
Helper class to provide type-safe access to aux data.
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
Handle class for adding a decoration to an object.
const TrackParticleLinks_t & isoTrackLinks() const
float fCore(unsigned int numSubjet) const
float subjetEta(unsigned int numSubjet) const
virtual double pt() const
The transverse momentum ( ) of the particle.
size_t nTracks() const
float subjetE(unsigned int numSubjet) const
float subjetPt(unsigned int numSubjet) const
float subjetPhi(unsigned int numSubjet) const
const TrackParticleLinks_t & trackLinks() const
size_t nIsoTracks() const
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
float d0() const
Returns the parameter.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
DiTauJet_v1 DiTauJet
Definition of the current version.
Definition DiTauJet.h:17
std::vector< const xAOD::TrackParticle * > vTracks
std::vector< const xAOD::TrackParticle * > vIsoTracks
std::vector< SubjetTrackingInfo > vSubjetInfo
std::vector< const xAOD::TrackParticle * > vIsoTracks
std::vector< const xAOD::TrackParticle * > vCoreTracks
std::vector< const xAOD::TrackParticle * > vTracks