271{
272
273
274
275
276
277
278
279
280
281 filteredHits.clear();
282
284
285
286 std::vector< std::pair<FPGATrackSimHit,unsigned> > filteredHits_ID, hits_to_filter;
288 for (const auto &hit : hits) {
289
290 std::pair<FPGATrackSimHit,unsigned> hit_ID;
291 hit_ID.first = hit;
294
295
296 if(!hit.isStrip()) {
297 if( std::any_of(std::begin(filter_pixel_physLayers), std::end(filter_pixel_physLayers),
298 [&](
unsigned i) {
return i == hit.getPhysLayer(); }) )
299 hits_to_filter.push_back(hit_ID);
300 else
301 filteredHits_ID.push_back(hit_ID);
302 }
303
304 else {
305 if( std::any_of(std::begin(filter_strip_physLayers), std::end(filter_strip_physLayers),
306 [&](
unsigned i) {
return i == hit.getPhysLayer(); }) )
307 hits_to_filter.push_back(hit_ID);
308 else
309 filteredHits_ID.push_back(hit_ID);
310 }
311 }
312
313
314 std::vector< std::pair<FPGATrackSimHit,unsigned> > hits_to_filter_inner, hits_to_filter_outer;
315
316
317
318
319 for (const auto &hit : hits_to_filter) {
320 if (hit.first.getPhysLayer() % 2 == 0)
321 hits_to_filter_inner.push_back(hit);
322 else
323 hits_to_filter_outer.push_back(hit);
324 }
325
326
327 std::vector< std::pair<FPGATrackSimHit,unsigned> > passed_inner_hits, passed_outer_hits;
328 for (const auto &innerHit : hits_to_filter_inner) {
329 std::vector<std::pair<FPGATrackSimHit,unsigned>> nearby_outer_hits;
331
332
333 float cut_m, cut_p;
335
336 for (const auto &outerHit : nearby_outer_hits) {
337 bool hitPassed =
check_hit_stub(innerHit.first, outerHit.first, cut_m, cut_p);
338 if(hitPassed) {
339
340 passed_inner_hits.push_back(innerHit);
341 passed_outer_hits.push_back(outerHit);
342 }
343 }
344 }
345
346
347 std::vector< std::pair<FPGATrackSimHit,unsigned> > passed_outer_hits_unique;
348 for (const auto &hit : passed_outer_hits) {
349 auto it = std::find_if(passed_outer_hits_unique.begin(), passed_outer_hits_unique.end(),
350 [&hit](const std::pair<FPGATrackSimHit,unsigned>& h) {return h.second == hit.second;} );
351 if(it == passed_outer_hits_unique.end()) {
352 passed_outer_hits_unique.push_back(hit);
353 }
354 }
355 std::vector< std::pair<FPGATrackSimHit,unsigned> > passed_inner_hits_unique;
356 for (const auto &hit : passed_inner_hits) {
357 auto it = std::find_if(passed_inner_hits_unique.begin(), passed_inner_hits_unique.end(),
358 [&hit](const std::pair<FPGATrackSimHit,unsigned>& h) {return h.second == hit.second;} );
359 if(it == passed_inner_hits_unique.end()) {
360 passed_inner_hits_unique.push_back(hit);
361 }
362 }
363
364
365
366 for (auto &hit : passed_inner_hits_unique) {
367 filteredHits_ID.push_back(hit);
368 }
369 for (const auto &hit : passed_outer_hits_unique) {
370 filteredHits_ID.push_back(hit);
371 }
372 if(true) {
373
374 std::sort(filteredHits_ID.begin(), filteredHits_ID.end(),
375 [](const std::pair<FPGATrackSimHit,unsigned> & hit1, const std::pair<FPGATrackSimHit,unsigned> & hit2){
376 return hit1.second < hit2.second;
377 });
378 for (const auto &hit_ID : filteredHits_ID) {
379 filteredHits.push_back(hit_ID.first);
380 }
381 }
382
383 }
384 else {
385
387 }
388
389}
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.