Execute the algorithm.
37{
38 SG::ThinningHandle<xAOD::TauJetContainer>
taus (
m_taus, ctx);
40
41 SG::ThinningHandle<xAOD::TauTrackContainer> tauTracks (
m_tauTracks, ctx);
42 tauTracks.thinAll();
43
44 SG::ThinningHandle<xAOD::PFOContainer> neutralPFOs (
m_neutralPFOs, ctx);
45 neutralPFOs.thinAll();
46
47 SG::ThinningHandle<xAOD::CaloClusterContainer> pi0clusters (
m_pi0clusters, ctx);
48 pi0clusters.thinAll();
49
50 SG::ThinningHandle<CaloClusterCellLinkContainer> pi0CellLinks (
m_pi0CellLinks, ctx);
51 pi0CellLinks.thinAll();
52
53 SG::ThinningHandle<xAOD::PFOContainer> shotPFOs (
m_shotPFOs, ctx);
54 shotPFOs.thinAll();
55
56 SG::ThinningHandle<xAOD::PFOContainer> hadronicPFOs (
m_hadronicPFOs, ctx);
57 hadronicPFOs.thinAll();
58
60 secondaryVertices.thinAll();
61
62 SG::ThinningHandle<CaloCellContainer>
cells (
m_cells, ctx);
64
65 SG::ThinningHandle<CaloClusterCellLinkContainer> tauCellLinks (
m_tauCellLinks, ctx);
66 tauCellLinks.thinAll();
67
68
69
70
71 std::optional<SG::ThinningHandle<xAOD::ParticleContainer> > finalPi0sOpt;
74 finalPi0sOpt->thinAll();
75 }
76
77 std::optional<SG::ThinningHandle<xAOD::CaloClusterContainer> > shotclustersOpt;
80 shotclustersOpt->thinAll();
81 }
82
83 std::optional<SG::ThinningHandle<CaloClusterCellLinkContainer> > shotCellLinksOpt;
86 shotCellLinksOpt->thinAll();
87 }
88
89 static const SG::ConstAccessor<char> acc_passThinning("passThinning");
90
92
93 if (!acc_passThinning(*tau)) continue;
94
95
96 taus.keep(tau->index());
97
98
100
102 continue;
103
104 tauTracks.keep(
track->index());
105 }
106
107
110
111 for (const xAOD::IParticle* particle : tau->clusters()) {
113 TLorentzVector clusterP4 = cluster->
p4();
114
115
116 if (tauVertex) {
117 xAOD::CaloVertexedTopoCluster vertexedCluster(*cluster, tauVertex->
position());
118 clusterP4 = vertexedCluster.p4();
119 }
120
121 if (clusterP4.DeltaR(tauAxis) > 0.2) continue;
122
123 const CaloClusterCellLink* cellLinks = cluster->
getCellLinks();
124 if (!cellLinks) {
126 continue;
127 }
128
129
131 if(cellLinks_it != tauCellLinks->end()) {
132 size_t link_index = std::distance(tauCellLinks->begin(), cellLinks_it);
133 tauCellLinks.keep(link_index);
134 }
135 else {
137 continue;
138 }
139
140
141 CaloClusterCellLink::const_iterator
it = cellLinks->
begin();
142 CaloClusterCellLink::const_iterator
end = cellLinks->
end();
144 if (
it.index() >=
cells->size()) {
145 ATH_MSG_WARNING(
"Cell index " <<
it.index() <<
" is larger than the number of cells in " <<
m_cells.key() <<
" (" <<
cells->size() <<
")" );
146 continue;
147 }
149 }
150 }
151
152
153 for(
size_t i=0;
i<tau->nNeutralPFOs();
i++) {
154
155 neutralPFOs.keep(tau->neutralPFO(i)->index());
156
157
159 pi0clusters.keep(cluster->
index());
160
161
162 const CaloClusterCellLink* cellLinks = cluster->
getCellLinks();
164 if(cellLinks_it != pi0CellLinks->end()) {
165 size_t link_index = std::distance(pi0CellLinks->begin(), cellLinks_it);
166 pi0CellLinks.keep(link_index);
167 }
168 else {
170 }
171
172
173 CaloClusterCellLink::const_iterator
it = cellLinks->
begin();
174 CaloClusterCellLink::const_iterator
end = cellLinks->
end();
176 if (
it.index() >=
cells->size()) {
177 ATH_MSG_WARNING(
"Cell index " <<
it.index() <<
" is larger than the number of cells in " <<
m_cells.key() <<
" (" <<
cells->size() <<
")" );
178 continue;
179 }
181 }
182 }
183
184
185 if (finalPi0sOpt) {
186 for(
size_t i=0;
i<tau->nPi0s();
i++) {
187 finalPi0sOpt->keep(tau->pi0(i)->index());
188 }
189 }
190
191
192 for(
size_t i=0;
i<tau->nShotPFOs();
i++) {
193
194 shotPFOs.keep(tau->shotPFO(i)->index());
195
196
198 if (!cluster) continue;
199 if (shotclustersOpt) {
200 shotclustersOpt->keep(cluster->
index());
201 }
202
203
204 const CaloClusterCellLink* cellLinks = cluster->
getCellLinks();
205 if (shotCellLinksOpt) {
207 if(cellLinks_it != (*shotCellLinksOpt)->end()) {
208 size_t link_index = std::distance((*shotCellLinksOpt)->begin(), cellLinks_it);
209 shotCellLinksOpt->keep(link_index);
210 }
211 else {
213 }
214 }
215
216
217 CaloClusterCellLink::const_iterator
it = cellLinks->
begin();
218 CaloClusterCellLink::const_iterator
end = cellLinks->
end();
220 if (
it.index() >=
cells->size()) {
221 ATH_MSG_WARNING(
"Cell index " <<
it.index() <<
" is larger than the number of cells in " <<
m_cells.key() <<
" (" <<
cells->size() <<
")" );
222 continue;
223 }
225 }
226 }
227
228
229 for(
size_t i=0;
i<tau->nHadronicPFOs();
i++) {
230 hadronicPFOs.keep(tau->hadronicPFO(i)->index());
231 }
232
233
234 if (tau->secondaryVertex() != nullptr) {
235 secondaryVertices.keep(tau->secondaryVertex()->index());
236 }
237 }
238
239 return StatusCode::SUCCESS;
240}
#define ATH_MSG_WARNING(x)
ServiceHandle< StoreGateSvc > & evtStore()
const_iterator end() const
const end method
const_iterator begin() const
const begin method
DataModel_detail::const_iterator< DataVector > const_iterator
size_t index() const
Return the index of this element within its container.
SG::ThinningHandleKey< CaloClusterCellLinkContainer > m_tauCellLinks
SG::ThinningHandleKey< xAOD::ParticleContainer > m_finalPi0s
SG::ThinningHandleKey< xAOD::VertexContainer > m_secondaryVertices
SG::ThinningHandleKey< CaloClusterCellLinkContainer > m_pi0CellLinks
Gaudi::Property< bool > m_saveOnlyGoodTracks
SG::ThinningHandleKey< xAOD::TauJetContainer > m_taus
SG::ThinningHandleKey< xAOD::CaloClusterContainer > m_shotclusters
Gaudi::Property< bool > m_doVertexCorrection
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.
const Amg::Vector3D & position() const
Returns the 3-pos.
bool contains(const std::string &s, const std::string ®x)
does a string contain the substring
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
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.
TauJet_v3 TauJet
Definition of the current "tau version".