113 {
114
119 InDetConversionContainer->setStore(InDetConversionContainerAux);
120
121 int numConversions = 0;
122
123
126
127
128
129 std::vector<const xAOD::TrackParticle*> negSelectedTracks;
130 negSelectedTracks.clear();
131 std::vector<const xAOD::TrackParticle*> posSelectedTracks;
132 posSelectedTracks.clear();
133 std::vector<int> negIndx;
134 std::vector<int> posIndx;
135
136 TrackPairsSelector::Cache cache{};
137
139 for (iter = (*trk_coll).begin(); iter != (*trk_coll).end(); ++iter) {
141 **iter,
142 nullptr)) {
144 if ((*iter)->charge() < 0) {
145 negSelectedTracks.push_back(*iter);
146 negIndx.push_back(0);
147 } else {
148 posSelectedTracks.push_back(*iter);
149 posIndx.push_back(0);
150 }
151 } else
153 }
154
155
156 std::vector<const xAOD::TrackParticle*>::const_iterator iter_pos;
157 std::vector<const xAOD::TrackParticle*>::const_iterator iter_neg;
158 std::vector<Amg::Vector3D> positionList;
159 positionList.clear();
160 std::vector<const xAOD::TrackParticle*> trackParticleList;
161 trackParticleList.clear();
162 std::vector<const xAOD::TrackParticle*> singleTrackConvList;
163 singleTrackConvList.clear();
164 int ipos = -1;
165 int ineg = -1;
166
167 for (iter_pos = posSelectedTracks.begin();
168 iter_pos != posSelectedTracks.end();
169 ++iter_pos) {
170 ineg = -1;
171 ipos++;
172
173 for (iter_neg = negSelectedTracks.begin();
174 iter_neg != negSelectedTracks.end();
175 ++iter_neg) {
176 ineg++;
178
179 std::map<std::string, float> intersectionDecors;
181 *iter_pos,
182 *iter_neg,
183 positionList,
184 initPos,
185 flag,
186 intersectionDecors)) {
187 positionList.clear();
188 continue;
189 }
190
191
192 if (positionList.size() < 2) {
194 positionList.clear();
195 continue;
196 }
197
198 trackParticleList.push_back(*iter_pos);
199 trackParticleList.push_back(*iter_neg);
200
201 std::unique_ptr<xAOD::Vertex> myVertex =
203 trackParticleList.clear();
204
205
206 if (myVertex) {
210 myVertex.get(), flag, positionList)) ||
213 myVertex.get(), flag, positionList, type))) {
214
216
217 myVertex->clearTracks();
218
219
221 !(type == 11)) {
222 myVertex.reset();
223 }
224
225
226
227 if (myVertex) {
230 "Decorating vertex with values used in track pair selector");
231 for (const auto& kv :
233 SG::Accessor<float>
acc (kv.first);
234 acc (*myVertex) = kv.second;
235 }
236 ATH_MSG_DEBUG(
"Decorating vertex with values used in vertex "
237 "point estimator");
238 for (const auto& kv : intersectionDecors) {
239 SG::Accessor<float>
acc (kv.first);
240 acc (*myVertex) = kv.second;
241 }
242 }
243
244 ElementLink<xAOD::TrackParticleContainer> newLinkPos(*iter_pos,
245 *trk_coll);
246 ElementLink<xAOD::TrackParticleContainer> newLinkNeg(*iter_neg,
247 *trk_coll);
248 myVertex->addTrackAtVertex(newLinkPos);
249 myVertex->addTrackAtVertex(newLinkNeg);
250
251
252
255 InDetConversionContainer->
push_back(std::move(myVertex));
256 }
257 else if (type == 101 || type == 110 || type == 11) {
259 InDetConversionContainer->
push_back(std::move(myVertex));
260 }
261
262 }
263
264 negIndx[ineg] = 1;
265 posIndx[ipos] = 1;
266 ++numConversions;
267 } else {
268 ATH_MSG_DEBUG(
"VxCandidate failed the post selection cuts!");
269 myVertex.reset();
270 }
271 } else {
273 }
274 positionList.clear();
275 }
276 }
277 ATH_MSG_DEBUG(
"Number of conversions found passing post selection cuts: "
278 << numConversions);
279
280
282 for (
int ip = 0;
ip <
int(posIndx.size()); ++
ip) {
283 if (posIndx[ip] == 0)
284 singleTrackConvList.push_back(posSelectedTracks[ip]);
285 }
286 for (
int in = 0; in <
int(negIndx.size()); ++in) {
287 if (negIndx[in] == 0)
288 singleTrackConvList.push_back(negSelectedTracks[in]);
289 }
290
291 std::vector<const xAOD::TrackParticle*>::iterator itk;
292 std::vector<const xAOD::TrackParticle*>::iterator itke = singleTrackConvList.end();
293 int numSingle = 0;
294 for (itk = singleTrackConvList.begin(); itk != itke; ++itk) {
296 ATH_MSG_DEBUG(
"Track failed single track conversion selection");
297 else {
300 (*itk), InDetConversionContainer);
301 if (sConver) {
302 sConver->clearTracks();
303
304 ElementLink<xAOD::TrackParticleContainer> newLink;
306 sConver->addTrackAtVertex(newLink);
308 numSingle++;
309
311 ATH_MSG_DEBUG(
"Decorating single track vertex with dummy values "
312 "used in track pair selector");
314 SG::Accessor<float>
acc (kv.first);
316 }
317
318 ATH_MSG_DEBUG(
"Decorating single track vertex with dummy values "
319 "used in vertex point estimator");
321 SG::Accessor<float>
acc (k);
323 }
324
325 ATH_MSG_DEBUG(
"Decorating single track vertex with dummy values "
326 "used in post selector");
328 }
329 }
330 }
331 }
332 ATH_MSG_DEBUG(
"Number successful reconstructed single track conversion: "
333 << numSingle);
334 }
335
336 return std::make_pair(InDetConversionContainer,
337 InDetConversionContainerAux);
338 }
DataModel_detail::const_iterator< DataVector > const_iterator
value_type push_back(value_type pElem)
Add an element to the end of the collection.
bool toContainedElement(BaseConstReference data, ElementType element, IProxyDict *sg=0)
Set from element pointer and a reference to the container (storable)
static void decorateVertex(xAOD::Vertex &vertex, float inv_mass, float pt1, float pt2, float fR, float deltaPhiVtxTrk)
Decorate vertices with values used in post selector.
static std::vector< std::string > decorKeys()
Return list of keys used for decorations.
Eigen::Matrix< double, 3, 1 > Vector3D
@ V0Vtx
Vertex from V0 decay.
@ ConvVtx
Conversion vertex.
Vertex_v1 Vertex
Define the latest version of the vertex class.