4 #if defined(FLATTEN) && defined(__GNUC__)
6 #pragma GCC optimize "-fno-var-tracking-assignments"
12 #include "Acts/Seeding/SeedFilterConfig.hpp"
13 #include "Acts/Seeding/BinnedGroup.hpp"
14 #include "Acts/Seeding/SeedFilter.hpp"
15 #include "Acts/Seeding/SeedFinder.hpp"
16 #include "Acts/Seeding/SeedFinderConfig.hpp"
17 #include "Acts/Definitions/Units.hpp"
18 #include "Acts/Seeding/SeedConfirmationRangeConfig.hpp"
21 using namespace Acts::HashedStringLiteral;
24 SeedingTool::SeedingTool(
const std::string&
type,
25 const std::string&
name,
151 return StatusCode::FAILURE;
158 return StatusCode::FAILURE;
165 return StatusCode::FAILURE;
172 return StatusCode::FAILURE;
180 ATH_MSG_ERROR(
"Inconsistent config zBinsCustomLooping contains bins that are not in zBinEdges");
181 return StatusCode::FAILURE;
189 ATH_MSG_ERROR(
"Inconsistent config rBinsCustomLooping contains bins that are not in rBinEdges");
190 return StatusCode::FAILURE;
208 return StatusCode::SUCCESS;
214 const Acts::SpacePointContainer<ActsTrk::SpacePointCollector, Acts::detail::RefHolder>& spContainer,
215 const Acts::Vector3& beamSpotPos,
216 const Acts::Vector3& bField,
227 return StatusCode::SUCCESS;
230 template<
typename external_iterator_t >
233 external_iterator_t spEnd,
234 const Acts::Vector3& beamSpotPos,
235 const Acts::Vector3& bField,
236 DataVector< Acts::Seed< typename SeedingTool::external_type, 3ul > >& seedContainer)
const
239 "Inconsistent type");
241 if (spBegin == spEnd)
242 return StatusCode::SUCCESS;
244 std::vector< seed_type > seeds;
247 Acts::CylindricalSpacePointGridOptions gridOpts;
248 gridOpts.bFieldInZ = bField[2];
249 gridOpts = gridOpts.toInternalUnits();
252 Acts::SeedFinderOptions finderOpts;
253 finderOpts.beamPos = Acts::Vector2(beamSpotPos[
Amg::x],
255 finderOpts.bFieldInZ = bField[2];
256 finderOpts = finderOpts.toInternalUnits().calculateDerivedQuantities(
m_finderCfg);
261 Acts::CylindricalSpacePointGrid< value_type > grid =
262 Acts::CylindricalSpacePointGridCreator::createGrid< value_type >(
m_gridCfg, gridOpts,
logger());
264 Acts::CylindricalSpacePointGridCreator::fillGrid(
m_finderCfg, finderOpts, grid,
265 spBegin, spEnd,
logger());
271 float maxRange = std::numeric_limits<float>::lowest();
272 for (
const auto& coll : grid) {
276 const auto* firstEl = coll.front();
277 const auto* lastEl = coll.back();
278 minRange =
std::min(firstEl->radius(), minRange);
279 maxRange =
std::max(lastEl->radius(), maxRange);
282 Acts::CylindricalBinnedGroup< value_type > spacePointsGrouping(std::move(grid), *
m_bottomBinFinder,
286 const Acts::Range1D<float> rMiddleSPRange(std::floor(minRange/2)*2 +
m_finderCfg.deltaRMiddleMinSPRange,
287 std::floor(maxRange/2)*2 -
m_finderCfg.deltaRMiddleMaxSPRange);
290 typename decltype(
m_finder)::SeedingState state;
301 state.spacePointMutableData.resize(
std::distance(spBegin, spEnd));
303 for (
const auto [bottom, middle,
top] : spacePointsGrouping) {
304 m_finder.createSeedsForGroup(finderOpts, state, spacePointsGrouping.grid(),
305 seeds, bottom, middle,
top, rMiddleSPRange);
312 auto selectionFunction = [&state] (
const seed_type& seed) ->
bool
314 float seed_quality = seed.seedQuality();
315 float bottom_quality = state.spacePointMutableData.quality(seed.sp()[0]->index());
316 float middle_quality = state.spacePointMutableData.quality(seed.sp()[1]->index());
317 float top_quality = state.spacePointMutableData.quality(seed.sp()[2]->index());
319 if (bottom_quality > seed_quality and
320 middle_quality > seed_quality and
321 top_quality > seed_quality) {
329 std::size_t acceptedSeeds = 0;
330 for (std::size_t
i(0);
i<seeds.size(); ++
i) {
331 const auto& seed = seeds[
i];
332 if (not selectionFunction(seed)) {
338 if (acceptedSeeds !=
i)
339 seeds[acceptedSeeds] = std::move(seeds[
i]);
344 seeds.erase(seeds.begin() + acceptedSeeds, seeds.end());
349 seedContainer.reserve(seeds.size());
350 for(
const auto& seed: seeds) {
351 const auto [bottom, middle,
top] = seed.sp();
353 std::unique_ptr< ActsTrk::Seed >
toAdd =
354 std::make_unique< ActsTrk::Seed >(bottom->externalSpacePoint(),
355 middle->externalSpacePoint(),
356 top->externalSpacePoint());
357 toAdd->setVertexZ(seed.z());
358 toAdd->setQuality(seed.seedQuality());
359 seedContainer.push_back(std::move(
toAdd));
362 return StatusCode::SUCCESS;
429 std::vector<float> convertedVec;
431 for (
const auto&
val :
vec) {
432 convertedVec.push_back(
static_cast<float>(
val));
435 m_finderCfg.rRangeMiddleSP.push_back(convertedVec);
451 Acts::SeedFilterConfig filterCfg;
458 filterCfg.centralSeedConfirmationRange =
m_finderCfg.centralSeedConfirmationRange;
459 filterCfg.forwardSeedConfirmationRange =
m_finderCfg.forwardSeedConfirmationRange;
467 m_finderCfg.seedFilter = std::make_unique<Acts::SeedFilter< value_type > >(filterCfg.toInternalUnits(),
logger().cloneWithSuffix(
"Filter"));
490 return StatusCode::SUCCESS;