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 tauTracks.keep(
track->index());
101 }
102
103
106
107 for (const xAOD::IParticle* particle : tau->clusters()) {
109 TLorentzVector clusterP4 = cluster->
p4();
110
111
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) {
122 continue;
123 }
124
125
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 {
133 continue;
134 }
135
136
137 CaloClusterCellLink::const_iterator
it = cellLinks->
begin();
138 CaloClusterCellLink::const_iterator
end = cellLinks->
end();
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 }
145 }
146 }
147
148
149 for(
size_t i=0;
i<tau->nNeutralPFOs();
i++) {
150
151 neutralPFOs.keep(tau->neutralPFO(i)->index());
152
153
155 pi0clusters.keep(cluster->
index());
156
157
158 const CaloClusterCellLink* cellLinks = cluster->
getCellLinks();
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 {
166 }
167
168
169 CaloClusterCellLink::const_iterator
it = cellLinks->
begin();
170 CaloClusterCellLink::const_iterator
end = cellLinks->
end();
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 }
177 }
178 }
179
180
181 if (finalPi0sOpt) {
182 for(
size_t i=0;
i<tau->nPi0s();
i++) {
183 finalPi0sOpt->keep(tau->pi0(i)->index());
184 }
185 }
186
187
188 for(
size_t i=0;
i<tau->nShotPFOs();
i++) {
189
190 shotPFOs.keep(tau->shotPFO(i)->index());
191
192
194 if (!cluster) continue;
195 if (shotclustersOpt) {
196 shotclustersOpt->keep(cluster->
index());
197 }
198
199
200 const CaloClusterCellLink* cellLinks = cluster->
getCellLinks();
201 if (shotCellLinksOpt) {
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 {
209 }
210 }
211
212
213 CaloClusterCellLink::const_iterator
it = cellLinks->
begin();
214 CaloClusterCellLink::const_iterator
end = cellLinks->
end();
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 }
221 }
222 }
223
224
225 for(
size_t i=0;
i<tau->nHadronicPFOs();
i++) {
226 hadronicPFOs.keep(tau->hadronicPFO(i)->index());
227 }
228
229
230 if (tau->secondaryVertex() != nullptr) {
231 secondaryVertices.keep(tau->secondaryVertex()->index());
232 }
233 }
234
235 return StatusCode::SUCCESS;
236}
#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
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".