ATLAS Offline Software
Loading...
Searching...
No Matches
TauThinningAlg.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 "TauThinningAlg.h"
9
14{
15 ATH_CHECK( m_taus.initialize(m_streamName) );
16 ATH_CHECK( m_tauTracks.initialize(m_streamName) );
20 ATH_CHECK( m_finalPi0s.initialize(m_streamName) );
21 ATH_CHECK( m_shotPFOs.initialize(m_streamName) );
26 ATH_CHECK( m_cells.initialize(m_streamName) );
28
29 return StatusCode::SUCCESS;
30}
31
36StatusCode TauThinningAlg::execute (const EventContext& ctx) const
37{
39 taus.thinAll();
40
42 tauTracks.thinAll();
43
45 neutralPFOs.thinAll();
46
48 pi0clusters.thinAll();
49
51 pi0CellLinks.thinAll();
52
54 shotPFOs.thinAll();
55
57 hadronicPFOs.thinAll();
58
60 secondaryVertices.thinAll();
61
63 cells.thinAll();
64
66 tauCellLinks.thinAll();
67
68 // The three following containers didn't exist in r21.
69 // Make them optional, so we won't crash processing a r21 ESD.
70
71 std::optional<SG::ThinningHandle<xAOD::ParticleContainer> > finalPi0sOpt;
73 finalPi0sOpt.emplace (m_finalPi0s, ctx);
74 finalPi0sOpt->thinAll();
75 }
76
77 std::optional<SG::ThinningHandle<xAOD::CaloClusterContainer> > shotclustersOpt;
79 shotclustersOpt.emplace (m_shotclusters, ctx);
80 shotclustersOpt->thinAll();
81 }
82
83 std::optional<SG::ThinningHandle<CaloClusterCellLinkContainer> > shotCellLinksOpt;
85 shotCellLinksOpt.emplace (m_shotCellLinks, ctx);
86 shotCellLinksOpt->thinAll();
87 }
88
89 static const SG::ConstAccessor<char> acc_passThinning("passThinning");
90
91 for (const xAOD::TauJet* tau : *taus) {
92
93 if (!acc_passThinning(*tau)) continue;
94
95 // keep tau
96 taus.keep(tau->index());
97
98 // keep tau tracks
99 for (const xAOD::TauTrack* track : tau->allTracks()) {
100 tauTracks.keep(track->index());
101 }
102
103 // keep tau cluster cell links and cells within 0.2 of the tau axis
104 TLorentzVector tauAxis = tauRecTools::getTauAxis(*tau, m_doVertexCorrection);
105 const xAOD::Vertex* tauVertex = tau->vertex();
106
107 for (const xAOD::IParticle* particle : tau->clusters()) {
108 const xAOD::CaloCluster* cluster = static_cast<const xAOD::CaloCluster*>(particle);
109 TLorentzVector clusterP4 = cluster->p4();
110
111 // correct the four momentum to point to the tau vertex
112 if (tauVertex) {
113 xAOD::CaloVertexedTopoCluster vertexedCluster(*cluster, tauVertex->position());
114 clusterP4 = vertexedCluster.p4();
115 }
116
117 if (clusterP4.DeltaR(tauAxis) > 0.2) continue;
118
119 const CaloClusterCellLink* cellLinks = cluster->getCellLinks();
120 if (!cellLinks) {
121 ATH_MSG_WARNING( "Skipping cluster without cell links." );
122 continue;
123 }
124
125 // cluster cell links
126 CaloClusterCellLinkContainer::const_iterator cellLinks_it = std::find(tauCellLinks->begin(), tauCellLinks->end(), cellLinks);
127 if(cellLinks_it != tauCellLinks->end()) {
128 size_t link_index = std::distance(tauCellLinks->begin(), cellLinks_it);
129 tauCellLinks.keep(link_index);
130 }
131 else {
132 ATH_MSG_WARNING( "Could not find cluster cell link in " << m_tauCellLinks.key() << ", skipping cluster." );
133 continue;
134 }
135
136 // cells
138 CaloClusterCellLink::const_iterator end = cellLinks->end();
139 for (; it != end; ++it) {
140 if (it.index() >= cells->size()) {
141 ATH_MSG_WARNING( "Cell index " << it.index() << " is larger than the number of cells in " << m_cells.key() << " (" << cells->size() << ")" );
142 continue;
143 }
144 cells.keep (it.index());
145 }
146 }
147
148 // keep neutral PFOs, pi0 clusters, cell links and cells
149 for(size_t i=0; i<tau->nNeutralPFOs(); i++) {
150 // neutral PFOs
151 neutralPFOs.keep(tau->neutralPFO(i)->index());
152
153 // pi0 clusters
154 const xAOD::CaloCluster* cluster = tau->neutralPFO(i)->cluster(0);
155 pi0clusters.keep(cluster->index());
156
157 // pi0 cell links
158 const CaloClusterCellLink* cellLinks = cluster->getCellLinks();
159 CaloClusterCellLinkContainer::const_iterator cellLinks_it = std::find(pi0CellLinks->begin(), pi0CellLinks->end(), cellLinks);
160 if(cellLinks_it != pi0CellLinks->end()) {
161 size_t link_index = std::distance(pi0CellLinks->begin(), cellLinks_it);
162 pi0CellLinks.keep(link_index);
163 }
164 else {
165 ATH_MSG_WARNING( "Could not find cluster cell link in " << m_pi0CellLinks.key() << ", won't be saved in xAOD." );
166 }
167
168 // pi0 cells
170 CaloClusterCellLink::const_iterator end = cellLinks->end();
171 for (; it != end; ++it) {
172 if (it.index() >= cells->size()) {
173 ATH_MSG_WARNING( "Cell index " << it.index() << " is larger than the number of cells in " << m_cells.key() << " (" << cells->size() << ")" );
174 continue;
175 }
176 cells.keep (it.index());
177 }
178 }
179
180 // keep final pi0s
181 if (finalPi0sOpt) {
182 for(size_t i=0; i<tau->nPi0s(); i++) {
183 finalPi0sOpt->keep(tau->pi0(i)->index());
184 }
185 }
186
187 // keep shot PFOs, clusters, cell links and cells
188 for(size_t i=0; i<tau->nShotPFOs(); i++) {
189 // shot PFOs
190 shotPFOs.keep(tau->shotPFO(i)->index());
191
192 // shot clusters
193 const xAOD::CaloCluster* cluster = tau->shotPFO(i)->cluster(0);
194 if (!cluster) continue;
195 if (shotclustersOpt) {
196 shotclustersOpt->keep(cluster->index());
197 }
198
199 // shot cell links
200 const CaloClusterCellLink* cellLinks = cluster->getCellLinks();
201 if (shotCellLinksOpt) {
202 CaloClusterCellLinkContainer::const_iterator cellLinks_it = std::find((*shotCellLinksOpt)->begin(), (*shotCellLinksOpt)->end(), cellLinks);
203 if(cellLinks_it != (*shotCellLinksOpt)->end()) {
204 size_t link_index = std::distance((*shotCellLinksOpt)->begin(), cellLinks_it);
205 shotCellLinksOpt->keep(link_index);
206 }
207 else {
208 ATH_MSG_WARNING( "Could not find cluster cell link in " << m_shotCellLinks.key() << ", won't be saved in xAOD." );
209 }
210 }
211
212 // shot cells
214 CaloClusterCellLink::const_iterator end = cellLinks->end();
215 for (; it != end; ++it) {
216 if (it.index() >= cells->size()) {
217 ATH_MSG_WARNING( "Cell index " << it.index() << " is larger than the number of cells in " << m_cells.key() << " (" << cells->size() << ")" );
218 continue;
219 }
220 cells.keep (it.index());
221 }
222 }
223
224 // keep hadronic PFOs
225 for(size_t i=0; i<tau->nHadronicPFOs(); i++) {
226 hadronicPFOs.keep(tau->hadronicPFO(i)->index());
227 }
228
229 // keep secondary vertex when present
230 if (tau->secondaryVertex() != nullptr) {
231 secondaryVertices.keep(tau->secondaryVertex()->index());
232 }
233 }
234
235 return StatusCode::SUCCESS;
236}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
static Double_t taus
Handle class for reading from StoreGate.
Handle for requesting thinning for a data object.
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
size_t index() const
Return the index of this element within its container.
Helper class to provide constant type-safe access to aux data.
void thinAll()
Mark that all elements should be thinned away.
void keep(size_t ndx)
Mark that index ndx in the container should be kept (not thinned away).
Handle for requesting thinning for a data object.
virtual StatusCode initialize() override
Gaudi initialize method.
SG::ThinningHandleKey< CaloClusterCellLinkContainer > m_tauCellLinks
SG::ThinningHandleKey< xAOD::ParticleContainer > m_finalPi0s
SG::ThinningHandleKey< xAOD::VertexContainer > m_secondaryVertices
SG::ThinningHandleKey< CaloClusterCellLinkContainer > m_pi0CellLinks
SG::ThinningHandleKey< xAOD::TauJetContainer > m_taus
SG::ThinningHandleKey< xAOD::CaloClusterContainer > m_shotclusters
Gaudi::Property< bool > m_doVertexCorrection
StringProperty m_streamName
virtual StatusCode execute(const EventContext &ctx) const override
Execute the algorithm.
SG::ThinningHandleKey< xAOD::PFOContainer > m_shotPFOs
SG::ThinningHandleKey< xAOD::CaloClusterContainer > m_pi0clusters
SG::ThinningHandleKey< xAOD::PFOContainer > m_hadronicPFOs
SG::ThinningHandleKey< CaloCellContainer > m_cells
SG::ThinningHandleKey< CaloClusterCellLinkContainer > m_shotCellLinks
SG::ThinningHandleKey< xAOD::PFOContainer > m_neutralPFOs
SG::ThinningHandleKey< xAOD::TauTrackContainer > m_tauTracks
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
virtual FourMom_t p4() const
The full 4-momentum of the particle.
virtual FourMom_t p4() const final
The full 4-momentum of the particle.
Evaluate cluster kinematics with a different vertex / signal state.
Class providing the definition of the 4-vector interface.
const Amg::Vector3D & position() const
Returns the 3-pos.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
TLorentzVector getTauAxis(const xAOD::TauJet &tau, bool doVertexCorrection=true)
Return the four momentum of the tau axis The tau axis is widely used to select clusters and cells in ...
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Vertex_v1 Vertex
Define the latest version of the vertex class.
TauTrack_v1 TauTrack
Definition of the current version.
Definition TauTrack.h:16
TauJet_v3 TauJet
Definition of the current "tau version".