ATLAS Offline Software
Loading...
Searching...
No Matches
TrigTauRecMerged.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "TrigTauRecMerged.h"
6
7#include "GaudiKernel/SystemOfUnits.h"
10
12
15
16#include "xAODJet/Jet.h"
19
22#include "xAODTau/TauJet.h"
23
24#include "xAODTau/TauDefs.h"
25#include "xAODTau/TauTrack.h"
28
29#include <iterator>
30#include <algorithm>
31
32
33TrigTauRecMerged::TrigTauRecMerged(const std::string& name, ISvcLocator* pSvcLocator)
34 : AthReentrantAlgorithm(name, pSvcLocator)
35{
36
37}
38
39
41{
42 ATH_MSG_DEBUG("Initialize");
43
44 if(m_commonTools.begin() == m_commonTools.end()) {
45 ATH_MSG_ERROR("No tools given for this algorithm");
46 return StatusCode::FAILURE;
47 }
48
49 for(const auto& tool : m_commonTools) ATH_CHECK(tool.retrieve());
50 for(const auto& tool : m_commonToolsBeforeTF) ATH_CHECK(tool.retrieve());
51 for(const auto& tool : m_vertexFinderTools) ATH_CHECK(tool.retrieve());
52 for(const auto& tool : m_trackFinderTools) ATH_CHECK(tool.retrieve());
53 for(const auto& tool : m_vertexVarsTools) ATH_CHECK(tool.retrieve());
54 for(const auto& tool : m_idTools) ATH_CHECK(tool.retrieve());
55
56 if(!m_monTool.name().empty()) ATH_CHECK(m_monTool.retrieve());
57
58 ATH_MSG_DEBUG("Initialising handle keys");
59 ATH_CHECK(m_roiInputKey.initialize());
64
66 ATH_CHECK(m_tauJetOutputKey.initialize());
67 ATH_CHECK(m_tauTrackOutputKey.initialize());
68
69 for(const auto& [key, p] : m_monitoredIdScores) {
71 key,
72 std::make_pair(SG::ConstAccessor<float>(p.first), SG::ConstAccessor<float>(p.second))
73 );
74 }
75
76
77 return StatusCode::SUCCESS;
78}
79
80
81StatusCode TrigTauRecMerged::execute(const EventContext& ctx) const
82{
83 //===============================================================================
84 // Initialize monitoring variables
85 //===============================================================================
86
87 // Common CaloOnly and Precision monitored variables:
88 auto n_taus = Monitored::Scalar<int>("NTauCandidates", 0);
89
90 auto pT = Monitored::Scalar<float>("Pt", 0);
91 auto eta = Monitored::Scalar<float>("Eta", -99.9);
92 auto phi = Monitored::Scalar<float>("Phi", -99.9);
93
94 auto etaRoI = Monitored::Scalar<float>("EtaRoI", -99.9);
95 auto phiRoI = Monitored::Scalar<float>("PhiRoI", -99.9);
96 auto dEta_RoI = Monitored::Scalar<float>("dEtaTau_RoI", -10);
97 auto dPhi_RoI = Monitored::Scalar<float>("dPhiTau_RoI", -10);
98
99 auto mEflowApprox = Monitored::Scalar<float>("mEflowApprox", -99.9);
100 auto ptRatioEflowApprox = Monitored::Scalar<float>("ptRatioEflowApprox", -99.9);
101 auto pt_jetseed_log = Monitored::Scalar<float>("pt_jetseed_log", -99.9);
102 auto etaDetectorAxis = Monitored::Scalar<float>("etaDetectorAxis", -99.9);
103 auto ptDetectorAxis = Monitored::Scalar<float>("ptDetectorAxis", -99.9);
104 auto ptDetectorAxis_log = Monitored::Scalar<float>("ptDetectorAxis_log", -99.9);
105
106 auto n_cells = Monitored::Scalar<int>("NCaloCells", 0);
107 auto EMRadius = Monitored::Scalar<float>("EMRadius", -0.099);
108 auto HadRadius = Monitored::Scalar<float>("HadRadius", -0.099);
109 auto EtHad = Monitored::Scalar<float>("EtHad", -10);
110 auto EtEm = Monitored::Scalar<float>("EtEm", -10);
111 auto EMFrac = Monitored::Scalar<float>("EMFrac", -10);
112 auto IsoFrac = Monitored::Scalar<float>("IsoFrac", -1);
113 auto CentFrac = Monitored::Scalar<float>("CentFrac", -10);
114
115 auto clustersMeanCenterLambda = Monitored::Scalar<float>("clustersMeanCenterLambda", 0);
116 auto clustersMeanFirstEngDens = Monitored::Scalar<float>("clustersMeanFirstEngDens", 0);
117 auto clustersMeanEMProbability = Monitored::Scalar<float>("clustersMeanEMProbability", 0);
118 auto clustersMeanSecondLambda = Monitored::Scalar<float>("clustersMeanSecondLambda", 0);
119 auto clustersMeanPresamplerFrac = Monitored::Scalar<float>("clustersMeanPresamplerFrac", 0);
120
121 auto n_clusters = Monitored::Scalar<int>("NClusters", 0);
122 std::vector<float> cluster_et_log, cluster_dEta, cluster_dPhi;
123 std::vector<float> cluster_log_SECOND_R, cluster_SECOND_LAMBDA, cluster_CENTER_LAMBDA;
124 auto mon_cluster_et_log = Monitored::Collection("cluster_et_log", cluster_et_log);
125 auto mon_cluster_dEta = Monitored::Collection("cluster_dEta", cluster_dEta);
126 auto mon_cluster_dPhi = Monitored::Collection("cluster_dPhi", cluster_dPhi);
127 auto mon_cluster_log_SECOND_R = Monitored::Collection("cluster_log_SECOND_R", cluster_log_SECOND_R);
128 auto mon_cluster_SECOND_LAMBDA = Monitored::Collection("cluster_SECOND_LAMBDA", cluster_SECOND_LAMBDA);
129 auto mon_cluster_CENTER_LAMBDA = Monitored::Collection("cluster_CENTER_LAMBDA", cluster_CENTER_LAMBDA);
130 std::vector<unsigned char> calo_errors;
131 auto mon_calo_errors = Monitored::Collection("calo_errors", calo_errors);
132
133 // Precision monitored variables
134 auto n_tracks = Monitored::Scalar<int>("NTracks", -10);
135 auto n_iso_tracks = Monitored::Scalar<int>("NIsoTracks", -10);
136
137 auto ipSigLeadTrk = Monitored::Scalar<float>("ipSigLeadTrk", -1000);
138 auto trFlightPathSig = Monitored::Scalar<float>("trFlightPathSig", -10);
139 auto massTrkSys = Monitored::Scalar<float>("massTrkSys", -10);
140 auto dRmax = Monitored::Scalar<float>("dRmax", -10);
141 auto trkAvgDist = Monitored::Scalar<float>("TrkAvgDist", -1);
142 auto innerTrkAvgDist = Monitored::Scalar<float>("innerTrkAvgDist", -1);
143 auto etovPtLead = Monitored::Scalar<float>("EtovPtLead", -10);
144 auto PSSFraction = Monitored::Scalar<float>("PSSFraction", -999.9);
145 auto EMPOverTrkSysP = Monitored::Scalar<float>("EMPOverTrkSysP", -999.9);
146 auto ChPiEMEOverCaloEME = Monitored::Scalar<float>("ChPiEMEOverCaloEME", -999.9);
147 auto vertex_x = Monitored::Scalar<float>("vertex_x", -999.9);
148 auto vertex_y = Monitored::Scalar<float>("vertex_y", -999.9);
149 auto vertex_z = Monitored::Scalar<float>("vertex_z", -999.9);
150
151 auto n_all_tracks = Monitored::Scalar<int>("NAllTracks", 0);
152 std::vector<float> track_pt_log, track_dEta, track_dPhi;
153 std::vector<float> track_d0_abs_log, track_z0sinthetaTJVA_abs_log;
154 std::vector<float> track_nPixelHitsPlusDeadSensors, track_nSCTHitsPlusDeadSensors;
155 auto mon_track_pt_log = Monitored::Collection("track_pt_log", track_pt_log);
156 auto mon_track_dEta = Monitored::Collection("track_dEta", track_dEta);
157 auto mon_track_dPhi = Monitored::Collection("track_dPhi", track_dPhi);
158 auto mon_track_d0_abs_log = Monitored::Collection("track_d0_abs_log", track_d0_abs_log);
159 auto mon_track_z0sinthetaTJVA_abs_log = Monitored::Collection("track_z0sinthetaTJVA_abs_log", track_z0sinthetaTJVA_abs_log);
160 auto mon_track_nPixelHitsPlusDeadSensors = Monitored::Collection("track_nPixelHitsPlusDeadSensors", track_nPixelHitsPlusDeadSensors);
161 auto mon_track_nSCTHitsPlusDeadSensors = Monitored::Collection("track_nSCTHitsPlusDeadSensors", track_nSCTHitsPlusDeadSensors);
162 std::vector<unsigned char> track_errors;
163 auto mon_track_errors = Monitored::Collection("track_errors", track_errors);
164
165 std::map<std::string, Monitored::Scalar<float>> monitoredIdVariables;
166 for(const auto& [key, p] : m_monitoredIdScores) {
167 monitoredIdVariables.emplace(key + "_TauJetScore_0p", Monitored::Scalar<float>(key + "_TauJetScore_0p", -1));
168 monitoredIdVariables.emplace(key + "_TauJetScoreTrans_0p", Monitored::Scalar<float>(key + "_TauJetScoreTrans_0p", -1));
169 monitoredIdVariables.emplace(key + "_TauJetScore_1p", Monitored::Scalar<float>(key + "_TauJetScore_1p", -1));
170 monitoredIdVariables.emplace(key + "_TauJetScoreTrans_1p", Monitored::Scalar<float>(key + "_TauJetScoreTrans_1p", -1));
171 monitoredIdVariables.emplace(key + "_TauJetScore_mp", Monitored::Scalar<float>(key + "_TauJetScore_mp", -1));
172 monitoredIdVariables.emplace(key + "_TauJetScoreTrans_mp", Monitored::Scalar<float>(key + "_TauJetScoreTrans_mp", -1));
173 }
174
175 std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>> monVars = {
176 std::ref(n_taus),
177 std::ref(pT), std::ref(eta), std::ref(phi),
178 std::ref(etaRoI), std::ref(phiRoI), std::ref(dEta_RoI), std::ref(dPhi_RoI),
179 std::ref(mEflowApprox), std::ref(ptRatioEflowApprox), std::ref(pt_jetseed_log),
180 std::ref(etaDetectorAxis), std::ref(ptDetectorAxis), std::ref(ptDetectorAxis_log),
181 std::ref(n_cells),
182 std::ref(EMRadius), std::ref(HadRadius), std::ref(EtHad), std::ref(EtEm), std::ref(EMFrac), std::ref(IsoFrac), std::ref(CentFrac),
183 std::ref(clustersMeanCenterLambda), std::ref(clustersMeanFirstEngDens), std::ref(clustersMeanEMProbability),
184 std::ref(clustersMeanSecondLambda), std::ref(clustersMeanPresamplerFrac),
185 std::ref(n_clusters), std::ref(mon_cluster_et_log), std::ref(mon_cluster_dEta), std::ref(mon_cluster_dPhi),
186 std::ref(mon_cluster_log_SECOND_R), std::ref(mon_cluster_SECOND_LAMBDA), std::ref(mon_cluster_CENTER_LAMBDA),
187 std::ref(mon_calo_errors),
188 std::ref(n_tracks), std::ref(n_iso_tracks),
189 std::ref(ipSigLeadTrk), std::ref(trFlightPathSig), std::ref(massTrkSys), std::ref(dRmax), std::ref(trkAvgDist), std::ref(innerTrkAvgDist),
190 std::ref(etovPtLead), std::ref(PSSFraction), std::ref(EMPOverTrkSysP), std::ref(ChPiEMEOverCaloEME),
191 std::ref(vertex_x), std::ref(vertex_y), std::ref(vertex_z),
192 std::ref(n_all_tracks), std::ref(mon_track_pt_log), std::ref(mon_track_dEta), std::ref(mon_track_dPhi),
193 std::ref(mon_track_d0_abs_log), std::ref(mon_track_z0sinthetaTJVA_abs_log),
194 std::ref(mon_track_nPixelHitsPlusDeadSensors), std::ref(mon_track_nSCTHitsPlusDeadSensors),
195 std::ref(mon_track_errors)
196 };
197 for(auto& [key, var] : monitoredIdVariables) monVars.push_back(std::ref(var));
198 auto monitorIt = Monitored::Group(m_monTool, monVars);
199
200
201 ATH_MSG_DEBUG("Executing TrigTauRecMerged");
202
203 //===============================================================================
204 // Main TauJet object:
205 //===============================================================================
206 xAOD::TauJet* tau = nullptr;
207
208
209 //===============================================================================
210 // Retrieve RoI
211 //===============================================================================
213 if(!roisHandle.isValid()) {
214 ATH_MSG_ERROR("No RoIHandle found");
215 return StatusCode::FAILURE;
216 }
217
218 if(roisHandle->empty()) {
219 ATH_MSG_ERROR("Empty RoIHandle");
220 return StatusCode::FAILURE;
221 }
222
223 const TrigRoiDescriptor *roiDescriptor = roisHandle->at(0);
224 if(roiDescriptor) {
225 ATH_MSG_DEBUG("RoI: " << *roiDescriptor);
226 } else {
227 ATH_MSG_ERROR("Failed to find TrigRoiDescriptor");
228 calo_errors.push_back(NoROIDescr);
229 return StatusCode::FAILURE;
230 }
231
232
233 //===============================================================================
234 // Prepare Output TauJet and TauTrack containers
235 //===============================================================================
236
237 // Create and register the output TauJetContainer
238 std::unique_ptr<xAOD::TauJetContainer> outputContainer = std::make_unique<xAOD::TauJetContainer>();
239 std::unique_ptr<xAOD::TauJetAuxContainer> outputAuxContainer = std::make_unique<xAOD::TauJetAuxContainer>();
240 outputContainer->setStore(outputAuxContainer.get());
241
243 ATH_CHECK(outputTauHandle.record(std::move(outputContainer), std::move(outputAuxContainer)));
244
245 // Create and register the output TauTrackContainer
246 std::unique_ptr<xAOD::TauTrackContainer> outputTrackContainer = std::make_unique<xAOD::TauTrackContainer>();
247 std::unique_ptr<xAOD::TauTrackAuxContainer> outputTrackAuxContainer = std::make_unique<xAOD::TauTrackAuxContainer>();
248 outputTrackContainer->setStore(outputTrackAuxContainer.get());
249
251 ATH_CHECK(tauTrackHandle.record(std::move(outputTrackContainer), std::move(outputTrackAuxContainer)));
252
253
254 //===============================================================================
255 // Initial TauJet calo-reco / input-retrieval
256 //===============================================================================
257 // We now have two options for the TauJet reconstruction:
258 // 1) Reconstruct the TauJet from scratch, using the bare calo-clusters (1st trigger step)
259 // 2) Fetch a preceding TauJet (and dummy TauTracks), and use them to seed the current reconstruction
260
261 //-------------------------------------------------------------------------------
262 // Option 1: Calorimeter-only reconstruction from clusters (CaloMVA step)
263 //-------------------------------------------------------------------------------
265 // Retrieve Calocluster container
267 ATH_CHECK(CCContainerHandle.isValid());
268
269 const xAOD::CaloClusterContainer *RoICaloClusterContainer = CCContainerHandle.get();
270 if(RoICaloClusterContainer) {
271 ATH_MSG_DEBUG("CaloCluster container found of size: " << RoICaloClusterContainer->size());
272
273 // If size is zero, don't stop just continue to produce empty TauJetCollection
274 if(RoICaloClusterContainer->empty()) calo_errors.push_back(NoClustCont);
275 } else {
276 ATH_MSG_ERROR("No CaloCluster container found");
277 calo_errors.push_back(NoClustCont);
278 return StatusCode::FAILURE;
279 }
280
281 // Also create the seed-jet containers
282 std::unique_ptr<xAOD::JetContainer> jetContainer{std::make_unique<xAOD::JetContainer>()};
283 std::unique_ptr<xAOD::JetAuxContainer> jetAuxContainer{std::make_unique<xAOD::JetAuxContainer>()};
284 jetContainer->setStore(jetAuxContainer.get());
285
287 ATH_CHECK(outputTauSeedJetHandle.record(std::move(jetContainer), std::move(jetAuxContainer)));
288
289 // And create the seed-jet object itself
290 outputTauSeedJetHandle->push_back(std::make_unique<xAOD::Jet>());
291 xAOD::Jet *jet = outputTauSeedJetHandle->back();
292
293
294 // Build the jet, also keep track of the kinematics by hand
295 // Eventually, want to use FastJet here?
296 // We are using calibrated clusters, we need to keep track of this
297 jet->setConstituentsSignalState(xAOD::JetConstitScale::CalibratedJetConstituent);
298 TLorentzVector cluster_p4, barycenter;
299 for(const xAOD::CaloCluster* cluster : *RoICaloClusterContainer) {
300 ATH_MSG_DEBUG("Cluster (e, eta, phi): (" << cluster->e() << ", " << cluster->eta() << ", " << cluster->phi() << ")");
301
302 if(cluster->e() < 0) {
303 ATH_MSG_DEBUG("Negative energy cluster is rejected");
304 continue;
305 }
306
307 cluster_p4.SetPtEtaPhiE(cluster->pt(), cluster->eta(), cluster->phi(), cluster->e());
308 jet->addConstituent(cluster);
309
310 barycenter += cluster_p4;
311 }
312
313 jet->setJetP4(xAOD::JetFourMom_t(barycenter.Pt(), barycenter.Eta(), barycenter.Phi(), barycenter.M()));
314 ATH_MSG_DEBUG("Built jet with eta: " << jet->eta() << ", phi: " << jet->phi() << ", pT: " << jet->pt() << ", E: "<< jet->e() );
315
316
317 // If we're running calo-clustering, that means we just started the HLT reco,
318 // and there's no input TauJet container to this step. Create one instead!
319 outputTauHandle->push_back(std::make_unique<xAOD::TauJet>());
320 tau = outputTauHandle->back();
321 tau->setROIWord(roiDescriptor->roiWord());
322
323 // Using the new Jet collection, setup the tau candidate structure
324 tau->setJet(outputTauSeedJetHandle.ptr(), jet);
325
326 // Fix eta, phi in case the jet's energy is negative
327 if(jet->e() <= 0) {
328 ATH_MSG_DEBUG("Changing (eta, phi) back to the RoI center due to negative energy: " << jet->e());
329 tau->setP4(tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), tau->m());
330 ATH_MSG_DEBUG("Roi: " << roiDescriptor->roiId() << ", tau eta: " << tau->eta() << ", tau phi: " << tau->phi() );
331 }
332 }
333
334
335 //-------------------------------------------------------------------------------
336 // Option 2: Use input TauJet (and TauTracks) as seeds (non calo-only reco)
337 //-------------------------------------------------------------------------------
338 if(!doCaloReconstruction()) {
339 // Retrieve input TauJet container
340 if(!m_tauJetInputKey.key().empty()) {
342 const xAOD::TauJetContainer* inputTauContainer = tauInputHandle.cptr();
343 ATH_MSG_DEBUG("Input TauJet Container size: " << inputTauContainer->size());
344
345 // Copy the input TauJets to the output container
346 ATH_CHECK(deepCopy(outputTauHandle, inputTauContainer));
347 }
348
349 // Retrieve input TauTrack container
350 if(!m_tauTrackInputKey.key().empty()) {
352 const xAOD::TauTrackContainer* inputTauTrackContainer = tauTrackInputHandle.cptr();
353 ATH_MSG_DEBUG("Tau Track Container Size " << inputTauTrackContainer->size());
354
355 // Copy the input TauTracks to the output container
356 ATH_CHECK(deepCopy(tauTrackHandle, inputTauTrackContainer));
357 }
358
359
360 // Now retrieve the main TauJet object, if available (the recently created copy of the input TauJet)
361 if(!outputTauHandle->empty()) {
362 tau = outputTauHandle->back();
363
364 // Check if the tau has a valid jetLink
365 ATH_CHECK(tau->jetLink().isValid());
366
367 // Clear all previous TauTrack links (if any), since we will run the
368 // TauTrackFinder tool (and the associated InDet helpers) in the
369 // Presel and Precision steps, refilling the tracks
370 if(!m_tauTrackInputKey.key().empty()) tau->clearTauTrackLinks();
371 }
372 }
373
374
375 //===============================================================================
376 // Get Vertex Container (optional)
377 //===============================================================================
378 const xAOD::VertexContainer* RoIVxContainer = nullptr;
379 if(!m_vertexInputKey.key().empty()){
381
382 if(!VertexContainerHandle.isValid()) {
383 ATH_MSG_DEBUG("No VertexContainer retrieved for the trigger element");
384 track_errors.push_back(NoVtxCont);
385 } else {
386 RoIVxContainer = VertexContainerHandle.get();
387 ATH_MSG_DEBUG("Size of VertexContainer: " << RoIVxContainer->size());
388 }
389 }
390
391
392 ATH_MSG_DEBUG("roiDescriptor roiWord: " << roiDescriptor->roiWord() << ", saved in TauJet: " << tau->ROIWord());
393
394
395 //===============================================================================
396 // Loop over all booked tau tools:
397 //===============================================================================
398 StatusCode processStatus = StatusCode::SUCCESS;
399
400 // Sequence: VertexFinderTools -> CommonToolsBeforeTF -> TrackFinderTools -> CommonTools -> VertexVarsTools -> IDTools
401
402 for(const auto& tool : m_vertexFinderTools) {
403 ATH_MSG_DEBUG("Starting Tool: " << tool->name());
404
405 processStatus = tool->executeVertexFinder(*tau, RoIVxContainer);
406
407 if(!processStatus.isFailure()) {
408 ATH_MSG_DEBUG(" " << tool->name() << " executed successfully");
409 } else {
410 ATH_MSG_DEBUG(" " << tool->name() << " execution failed");
411 break;
412 }
413 }
414
415 for(const auto& tool : m_commonToolsBeforeTF) {
416 if(!processStatus.isFailure()) ATH_MSG_DEBUG("Starting Tool: " << tool->name());
417 else break;
418
419 processStatus = tool->execute(*tau);
420
421 if(!processStatus.isFailure()) {
422 ATH_MSG_DEBUG(" " << tool->name() << " executed successfully");
423 } else {
424 ATH_MSG_DEBUG(" " << tool->name() << " execution failed");
425 break;
426 }
427 }
428
429 for(const auto& tool : m_trackFinderTools) {
430 if(!processStatus.isFailure()) ATH_MSG_DEBUG("Starting Tool: " << tool->name());
431 else break;
432
433 processStatus = tool->executeTrackFinder(*tau, *tauTrackHandle);
434
435 if(!processStatus.isFailure()) {
436 ATH_MSG_DEBUG(" " << tool->name() << " executed successfully");
437 } else {
438 ATH_MSG_DEBUG(" " << tool->name() << " execution failed");
439 break;
440 }
441 }
442
443 for(const auto& tool : m_commonTools) {
444 if(!processStatus.isFailure()) ATH_MSG_DEBUG("Starting Tool: " << tool->name());
445 else break;
446
447 processStatus = tool->execute(*tau);
448
449 if(!processStatus.isFailure()) {
450 ATH_MSG_DEBUG(" " << tool->name() << " executed successfully");
451 } else {
452 ATH_MSG_DEBUG(" " << tool->name() << " execution failed");
453 break;
454 }
455 }
456
457 // Dummy container passed to TauVertexVariables, not used in trigger though
458 xAOD::VertexContainer dummyVxCont;
459 for(const auto& tool : m_vertexVarsTools) {
460 if(!processStatus.isFailure()) ATH_MSG_DEBUG("Starting Tool: " << tool->name());
461 else break;
462
463 processStatus = tool->executeVertexVariables(*tau, dummyVxCont);
464
465 if(!processStatus.isFailure()) {
466 ATH_MSG_DEBUG(" " << tool->name() << " executed successfully");
467 } else {
468 ATH_MSG_DEBUG(" " << tool->name() << " execution failed");
469 break;
470 }
471 }
472
473 for(const auto& tool : m_idTools) {
474 if(!processStatus.isFailure()) ATH_MSG_DEBUG("Starting Tool: " << tool->name());
475 else break;
476
477 processStatus = tool->execute(*tau);
478
479 if(!processStatus.isFailure()) {
480 ATH_MSG_DEBUG(" " << tool->name() << " executed successfully");
481 } else {
482 ATH_MSG_DEBUG(" " << tool->name() << " execution failed");
483 break;
484 }
485 }
486
487 ATH_MSG_DEBUG("This tau has " << tau->allTracks() << " tracks linked");
488
489
490 // Cleanup in case any of the tools failed (rejected Tau)
491 if(!processStatus.isSuccess()) {
492 ATH_MSG_DEBUG("The tau object has NOT been registered in the tau container");
493
494 xAOD::TauJet* bad_tau = outputTauHandle->back();
495 ATH_MSG_DEBUG("Deleting " << bad_tau->nAllTracks() << " tracks associated with tau");
496 tauTrackHandle->erase(tauTrackHandle->end() - bad_tau->nAllTracks(), tauTrackHandle->end());
497
498 outputTauHandle->pop_back();
499
500 ATH_MSG_DEBUG("Clean up done after jet seed");
501
502 } else {
503 // Check that the seed-jet energy is positive
504 // Otherwise, try to salvage it by replacing the tau position with the RoI's
505 float fJetEnergy = (*tau->jetLink())->e();
506 ATH_MSG_DEBUG("Seed jet E: " << fJetEnergy);
507
508 if(fJetEnergy < 0.00001) {
509 ATH_MSG_DEBUG("Changing tau's (eta,phi) to RoI ones due to negative energy (PxPyPzE flips eta and phi)");
510 ATH_MSG_DEBUG("This is probably not needed anymore, method PxPyPzE has been corrected");
511 // TODO: Do we still need this??
512
513 tau->setP4(tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), tau->m());
514
515 ATH_MSG_DEBUG("Roi: " << roiDescriptor->roiId() << ", Tau eta: " << tau->eta() << ", phi: " << tau->phi() << ", pT: " << tau->pt());
516 }
517
518
519 //===============================================================================
520 // Monitor tau variables
521 //===============================================================================
522
523 pT = tau->pt()/Gaudi::Units::GeV;
524 eta = tau->eta();
525 phi = tau->phi();
526
527
528 etaRoI = roiDescriptor->eta();
529 phiRoI = roiDescriptor->phi();
530 dEta_RoI = eta - roiDescriptor->eta();
531 dPhi_RoI = phi - roiDescriptor->phi();
532 if(dPhi_RoI < -M_PI) dPhi_RoI += 2.0*M_PI;
533 if(dPhi_RoI > M_PI) dPhi_RoI -= 2.0*M_PI;
534
535
536 float pre_mEflowApprox;
537 tau->detail(xAOD::TauJetParameters::mEflowApprox, pre_mEflowApprox);
538 mEflowApprox = std::log10(std::max(pre_mEflowApprox, 140.0f));
539
540 float pre_ptRatioEflowApprox;
541 tau->detail(xAOD::TauJetParameters::ptRatioEflowApprox, pre_ptRatioEflowApprox);
542 ptRatioEflowApprox = std::min(pre_ptRatioEflowApprox, 4.0f);
543
544 pt_jetseed_log = std::log10(tau->ptJetSeed());
545 etaDetectorAxis = tau->etaDetectorAxis();
546 ptDetectorAxis = std::min(tau->ptDetectorAxis()/Gaudi::Units::GeV, 10000.0);
547 ptDetectorAxis_log = std::log10(std::min(tau->ptDetectorAxis()/Gaudi::Units::GeV, 10000.0));
548
549
554 EtHad /= Gaudi::Units::GeV;
556 EtEm /= Gaudi::Units::GeV;
557
558 float Et_raw = EtEm + EtHad;
559 if(Et_raw != 0) EMFrac = EtEm / Et_raw;
560
563
564
565 // Monitor BRT variables
566 float tmp = 0;
568 if(test) clustersMeanCenterLambda = tmp;
570 if(test) clustersMeanFirstEngDens = tmp;
572 if(test) clustersMeanEMProbability = tmp;
574 if(test) clustersMeanSecondLambda = tmp;
576 if(test) clustersMeanPresamplerFrac = tmp;
577
578
579 // Cluster variables monitoring
580 n_clusters = tau->clusters().size();
581 for(const auto& cluster : tau->clusters()) {
582 const xAOD::CaloCluster* cls = dynamic_cast<const xAOD::CaloCluster*>(cluster);
583
584 cluster_et_log.push_back(std::log10(cls->et()));
585 cluster_dEta.push_back(cls->eta() - tau->eta());
586 cluster_dPhi.push_back(cls->p4().DeltaPhi(tau->p4()));
587
588 double log_second_R = -999;
589 const bool success_SECOND_R = cls->retrieveMoment(xAOD::CaloCluster::MomentType::SECOND_R, log_second_R);
590 if(success_SECOND_R) log_second_R = std::log10(log_second_R + 0.1);
591 cluster_log_SECOND_R.push_back(log_second_R);
592
593 double second_lambda = -999;
594 const bool success_SECOND_LAMBDA = cls->retrieveMoment(xAOD::CaloCluster::MomentType::SECOND_LAMBDA, second_lambda);
595 if(success_SECOND_LAMBDA) second_lambda = std::log10(second_lambda + 0.1);
596 cluster_SECOND_LAMBDA.push_back(second_lambda);
597
598 double center_lambda = -999;
599 const bool success_CENTER_LAMBDA = cls->retrieveMoment(xAOD::CaloCluster::MomentType::CENTER_LAMBDA, center_lambda);
600 if(success_CENTER_LAMBDA) center_lambda = std::log10(center_lambda + 1e-6);
601 cluster_CENTER_LAMBDA.push_back(center_lambda);
602 }
603
604
605 // Tracks summary monitoring
606 n_tracks = tau->nTracks();
607 n_iso_tracks = tau->nTracksIsolation();
609 if(tau->nTracks() > 0) ipSigLeadTrk = std::abs(tau->track(0)->d0SigTJVA()); // TODO: Is this needed?
610 tau->detail(xAOD::TauJetParameters::trFlightPathSig, trFlightPathSig);
612 massTrkSys /= Gaudi::Units::GeV;
615 tau->detail(xAOD::TauJetParameters::innerTrkAvgDist, innerTrkAvgDist);
619 tau->detail(xAOD::TauJetParameters::ChPiEMEOverCaloEME, ChPiEMEOverCaloEME);
620
621 if(tau->vertexLink().isValid() && tau->vertex() && tau->vertex()->vertexType() != xAOD::VxType::NoVtx) {
622 vertex_x = tau->vertex()->x();
623 vertex_y = tau->vertex()->y();
624 vertex_z = tau->vertex()->z();
625 }
626
627
628 // Track variables monitoring
629 n_all_tracks = tau->allTracks().size();
630 for(const xAOD::TauTrack* track : tau->allTracks()) {
631 track_pt_log.push_back(std::log10(track->pt()));
632 track_dEta.push_back(track->eta() - tau->eta());
633 track_dPhi.push_back(track->p4().DeltaPhi(tau->p4()));
634 track_d0_abs_log.push_back(std::log10(std::abs(track->track()->d0()) + 1e-6));
635 track_z0sinthetaTJVA_abs_log.push_back(track->z0sinthetaTJVA());
636
637 uint8_t pixel_hits, pixel_dead;
638 const bool success1_pixel_hits = track->track()->summaryValue(pixel_hits, xAOD::numberOfPixelHits);
639 const bool success2_pixel_dead = track->track()->summaryValue(pixel_dead, xAOD::numberOfPixelDeadSensors);
640 float nPixelHitsPlusDeadSensor = -999;
641 if(success1_pixel_hits && success2_pixel_dead) nPixelHitsPlusDeadSensor = pixel_hits + pixel_dead;
642 track_nPixelHitsPlusDeadSensors.push_back(nPixelHitsPlusDeadSensor);
643
644 uint8_t sct_hits, sct_dead;
645 const bool success1_sct_hits = track->track()->summaryValue(sct_hits, xAOD::numberOfSCTHits);
646 const bool success2_sct_dead = track->track()->summaryValue(sct_dead, xAOD::numberOfSCTDeadSensors);
647 float nSCTHitsPlusDeadSensors = -999;
648 if(success1_sct_hits && success2_sct_dead) nSCTHitsPlusDeadSensors = sct_hits + sct_dead;
649 track_nSCTHitsPlusDeadSensors.push_back(nSCTHitsPlusDeadSensors);
650 }
651
652
653 // TauID Score monitoring
654 for(const auto& [key, p] : m_monitoredIdAccessors) {
655 if(p.first.isAvailable(*tau)) {
656 if(tau->nTracks() == 0) {
657 monitoredIdVariables.at(key + "_TauJetScore_0p") = p.first(*tau);
658 } else if(tau->nTracks() == 1) {
659 monitoredIdVariables.at(key + "_TauJetScore_1p") = p.first(*tau);
660 } else { // MP tau
661 monitoredIdVariables.at(key + "_TauJetScore_mp") = p.first(*tau);
662 }
663 }
664
665 if(p.second.isAvailable(*tau)) {
666 if(tau->nTracks() == 0) {
667 monitoredIdVariables.at(key + "_TauJetScoreTrans_0p") = p.second(*tau);
668 } else if(tau->nTracks() == 1) {
669 monitoredIdVariables.at(key + "_TauJetScoreTrans_1p") = p.second(*tau);
670 } else { // MP tau
671 monitoredIdVariables.at(key + "_TauJetScoreTrans_mp") = p.second(*tau);
672 }
673 }
674 }
675
676
677 ++n_taus;
678
679
680 ATH_MSG_DEBUG("RoI: " << roiDescriptor->roiId()
681 << ", Tau pT (GeV): " << pT << ", Tau eta: " << eta << ", Tau phi: " << phi
682 << ", wrt RoI dEta: " << dEta_RoI << ", dPhi: " << dPhi_RoI);
683 }
684
685 //-------------------------------------------------------------------------------
686 // All done!
687 //-------------------------------------------------------------------------------
688
689 ATH_MSG_DEBUG("Output TauJetContainer size: " << outputTauHandle->size());
690 ATH_MSG_DEBUG("Output TauJetTrackContainer size: " << tauTrackHandle->size());
691
692 return StatusCode::SUCCESS;
693}
#define M_PI
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
Header file to be included by clients of the Monitored infrastructure.
An algorithm that can be simultaneously executed in multiple threads.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
virtual double phi() const override final
Methods to retrieve data members.
virtual double eta() const override final
Helper class to provide constant type-safe access to aux data.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
const_pointer_type get() const
Dereference the pointer, but don't cache anything.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
nope - should be used for standalone also, perhaps need to protect the class def bits ifndef XAOD_ANA...
virtual unsigned int roiWord() const override final
virtual unsigned int roiId() const override final
these quantities probably don't need to be used any more
const ToolHandleArray< ITauToolBase > m_idTools
StatusCode deepCopy(SG::WriteHandle< DataVector< V > > &writeHandle, const DataVector< V > *oldContainer) const
virtual StatusCode execute(const EventContext &ctx) const override
const ToolHandleArray< ITauToolBase > m_commonTools
const ToolHandle< GenericMonitoringTool > m_monTool
SG::WriteHandleKey< xAOD::TauJetContainer > m_tauJetOutputKey
bool doCaloReconstruction() const
SG::WriteHandleKey< xAOD::TauTrackContainer > m_tauTrackOutputKey
const ToolHandleArray< ITauToolBase > m_commonToolsBeforeTF
SG::ReadHandleKey< xAOD::TauTrackContainer > m_tauTrackInputKey
virtual StatusCode initialize() override
SG::WriteHandleKey< xAOD::JetContainer > m_tauSeedOutputKey
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexInputKey
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_clustersInputKey
const ToolHandleArray< ITauToolBase > m_vertexFinderTools
const ToolHandleArray< ITauToolBase > m_trackFinderTools
SG::ReadHandleKey< xAOD::TauJetContainer > m_tauJetInputKey
TrigTauRecMerged(const std::string &name, ISvcLocator *pSvcLocator)
const ToolHandleArray< ITauToolBase > m_vertexVarsTools
Gaudi::Property< std::map< std::string, std::pair< std::string, std::string > > > m_monitoredIdScores
SG::ReadHandleKey< TrigRoiDescriptorCollection > m_roiInputKey
std::map< std::string, std::pair< SG::ConstAccessor< float >, SG::ConstAccessor< float > > > m_monitoredIdAccessors
@ SECOND_LAMBDA
Second Moment in .
@ SECOND_R
Second Moment in .
@ CENTER_LAMBDA
Shower depth at Cluster Centroid.
virtual double phi() const
The azimuthal angle ( ) of the particle.
void setROIWord(unsigned int)
void clearTauTrackLinks()
Remove all tracks from the tau.
unsigned int ROIWord() const
the ROIWord, in case TauJet is used in EF trigger
double ptDetectorAxis() const
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition TauJet_v3.cxx:96
virtual double pt() const
The transverse momentum ( ) of the particle.
double etaDetectorAxis() const
const VertexLink_t & vertexLink() const
const JetLink_t & jetLink() const
void setJet(const xAOD::JetContainer *cont, const xAOD::Jet *jet)
bool detail(TauJetParameters::Detail detail, int &value) const
Get and set values of common details variables via enum.
const TauTrack * track(size_t i, TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged, int *container_index=0) const
Get the pointer to a given tauTrack associated with this tau /*container index needed by trackNonCons...
const Vertex * vertex() const
void setP4(double pt, double eta, double phi, double m)
Set methods for IParticle values.
std::vector< const IParticle * > clusters() const
double ptJetSeed() const
size_t nTracksIsolation() const
virtual double m() const
The invariant mass of the particle.
size_t nAllTracks() const
std::vector< const TauTrack * > allTracks() const
Get the v<const pointer> to all tracks associated with this tau, regardless of classification.
virtual double eta() const
The pseudorapidity ( ) of the particle.
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
float d0SigTJVA() const
float z() const
Returns the z position.
float y() const
Returns the y position.
VxType::VertexType vertexType() const
The type of the vertex.
float x() const
Returns the x position.
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
@ hadRadius
Get hadron calorimeter radius.
Definition TauDefs.h:192
@ EMRadius
Get E_T radius.
Definition TauDefs.h:190
@ etHadAtEMScale
Get Hadronic energy at EM scale.
Definition TauDefs.h:196
@ isolFrac
Get isolation fraction.
Definition TauDefs.h:198
@ trkAvgDist
Get calibrated EM transverse energy (DEPRECATED since r19)
Definition TauDefs.h:214
@ etEMAtEMScale
Get EM energy at EM scale.
Definition TauDefs.h:194
@ centFrac
Get centrality fraction.
Definition TauDefs.h:200
@ dRmax
Get maximal dR of tracks associated to calo-seeded tau.
Definition TauDefs.h:226
@ NoVtx
Dummy vertex. TrackParticle was not used in vertex fit.
Jet_v1 Jet
Definition of the current "jet version".
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
TauTrack_v1 TauTrack
Definition of the current version.
Definition TauTrack.h:16
TauJet_v3 TauJet
Definition of the current "tau version".
TauTrackContainer_v1 TauTrackContainer
Definition of the current TauTrack container version.
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.
TauJetContainer_v3 TauJetContainer
Definition of the current "taujet container version".
@ numberOfSCTDeadSensors
number of dead SCT sensors crossed [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
@ CalibratedJetConstituent
Definition JetTypes.h:22
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > JetFourMom_t
Base 4 Momentum type for Jet.
Definition JetTypes.h:17