86{
87 const EventContext& ctx = Gaudi::Hive::currentContext();
88
89
90 SG::ThinningHandle<xAOD::TruthParticleContainer> importedTruthParticles
92 SG::ThinningHandle<xAOD::TruthVertexContainer> importedTruthVertices
94
95
96 unsigned int nParticles = importedTruthParticles->size();
97 unsigned int nVertices = importedTruthVertices->size();
98 std::vector<bool> partMask, vertMask;
99 partMask.assign(nParticles,false);
100 vertMask.assign(nVertices,false);
102
103
105 std::vector<int>
entries = m_parser->evaluateAsVector();
107
108 if (nParticles != nEntries ) {
109 ATH_MSG_ERROR(
"Sizes incompatible! Are you sure your selection string used TruthParticles?");
110 return StatusCode::FAILURE;
111 } else {
112
113 for (
unsigned int i=0;
i<nParticles; ++
i)
if (
entries[i]==1) partMask[
i]=
true;
114 }
115 }
116
117
118
120 DerivationFramework::DecayGraphHelper tauDecayHelper;
121 for (
unsigned int i=0;
i<nParticles; ++
i) {
124 bool last(true);
125 std::vector<int> tauDecayProducts;
126 std::unordered_set<int> tauDecayEncounteredUniqueIDs;
127 tauDecayHelper.
descendants(particle,tauDecayProducts,tauDecayEncounteredUniqueIDs);
128 for (unsigned int tauDecIt=0; tauDecIt<tauDecayProducts.size(); ++tauDecIt) {
129 if (std::abs(tauDecayProducts[tauDecIt])==15) {
130 last = false;
131 break;
132 }
133 }
134 if (!last) partMask[
i]=
false;
135 }
136 }
137 }
138
139
140
141
142
143
144
145 DerivationFramework::DecayGraphHelper decayHelper;
146 std::unordered_set<int> encounteredUniqueIDs;
148 for (
unsigned int i=0;
i<nParticles; ++
i) {
149 bool toKeep = partMask[
i];
150 if (!toKeep) continue;
152 encounteredUniqueIDs.clear();
154 encounteredUniqueIDs.clear();
156 encounteredUniqueIDs.clear();
158 encounteredUniqueIDs.clear();
159 }
160 }
161
162
163
164
165
166
167
168
169 m_npasspart += std::count (partMask.begin(), partMask.end(),
true);
170 m_npassvtx += std::count (vertMask.begin(), vertMask.end(),
true);
171
172
173 importedTruthParticles.keep (partMask);
174 importedTruthVertices.keep (vertMask);
175
176 return StatusCode::SUCCESS;
177}
SG::ThinningHandleKey< xAOD::TruthVertexContainer > m_verticesKey
SG::ThinningHandleKey< xAOD::TruthParticleContainer > m_particlesKey
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
TruthParticle_v1 TruthParticle
Typedef to implementation.
void descendants(const xAOD::TruthParticle *pHead, std::vector< int > &particleList, std::unordered_set< int > &encounteredUniqueIDs)
void ancestors(const xAOD::TruthParticle *pHead, std::vector< bool > &particleMask, std::vector< bool > &vertexMask, std::unordered_set< int > &encounteredUniqueIDs)