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;
210 return StatusCode::FAILURE;
213 return StatusCode::SUCCESS;
219 const Acts::SpacePointContainer<ActsTrk::SpacePointCollector, Acts::detail::RefHolder>& spContainer,
220 const Acts::Vector3& beamSpotPos,
221 const Acts::Vector3& bField,
232 return StatusCode::SUCCESS;
235 template<
typename external_iterator_t >
238 external_iterator_t spEnd,
239 const Acts::Vector3& beamSpotPos,
240 const Acts::Vector3& bField,
244 "Inconsistent type");
246 if (spBegin == spEnd)
247 return StatusCode::SUCCESS;
249 std::vector< seed_type > seeds;
252 Acts::CylindricalSpacePointGridOptions gridOpts;
253 gridOpts.bFieldInZ = bField[2];
254 gridOpts = gridOpts.toInternalUnits();
257 Acts::SeedFinderOptions finderOpts;
258 finderOpts.beamPos = Acts::Vector2(beamSpotPos[
Amg::x],
260 finderOpts.bFieldInZ = bField[2];
261 finderOpts = finderOpts.toInternalUnits().calculateDerivedQuantities(
m_finderCfg);
266 Acts::CylindricalSpacePointGrid< value_type > grid =
267 Acts::CylindricalSpacePointGridCreator::createGrid< value_type >(
m_gridCfg, gridOpts,
logger());
269 Acts::CylindricalSpacePointGridCreator::fillGrid(
m_finderCfg, finderOpts, grid,
270 spBegin, spEnd,
logger());
276 float maxRange = std::numeric_limits<float>::lowest();
277 for (
const auto& coll : grid) {
281 const auto* firstEl = coll.front();
282 const auto* lastEl = coll.back();
283 minRange =
std::min(firstEl->radius(), minRange);
284 maxRange =
std::max(lastEl->radius(), maxRange);
287 Acts::CylindricalBinnedGroup< value_type > spacePointsGrouping(std::move(grid), *
m_bottomBinFinder,
291 const Acts::Range1D<float> rMiddleSPRange(std::floor(minRange/2)*2 +
m_finderCfg.deltaRMiddleMinSPRange,
292 std::floor(maxRange/2)*2 -
m_finderCfg.deltaRMiddleMaxSPRange);
295 typename decltype(
m_finder)::SeedingState state;
306 state.spacePointMutableData.resize(
std::distance(spBegin, spEnd));
308 for (
const auto [bottom, middle,
top] : spacePointsGrouping) {
309 m_finder.createSeedsForGroup(finderOpts, state, spacePointsGrouping.grid(),
310 seeds, bottom, middle,
top, rMiddleSPRange);
317 auto selectionFunction = [&state] (
const seed_type& seed) ->
bool
319 float seed_quality = seed.seedQuality();
320 float bottom_quality = state.spacePointMutableData.quality(seed.sp()[0]->index());
321 float middle_quality = state.spacePointMutableData.quality(seed.sp()[1]->index());
322 float top_quality = state.spacePointMutableData.quality(seed.sp()[2]->index());
324 if (bottom_quality > seed_quality and
325 middle_quality > seed_quality and
326 top_quality > seed_quality) {
334 std::size_t acceptedSeeds = 0;
335 for (std::size_t
i(0);
i<seeds.size(); ++
i) {
336 const auto& seed = seeds[
i];
337 if (not selectionFunction(seed)) {
343 if (acceptedSeeds !=
i)
344 seeds[acceptedSeeds] = std::move(seeds[
i]);
349 seeds.erase(seeds.begin() + acceptedSeeds, seeds.end());
354 seedContainer.reserve(seeds.size());
355 for(
const auto& seed: seeds) {
356 assert(seed.sp().size() == 3
ul);
357 const auto bottom = seed.sp().at(0);
358 const auto middle = seed.sp().at(1);
359 const auto top = seed.sp().at(2);
361 std::unique_ptr< ActsTrk::Seed >
toAdd =
362 std::make_unique< ActsTrk::Seed >(bottom->externalSpacePoint(),
363 middle->externalSpacePoint(),
364 top->externalSpacePoint());
365 toAdd->setVertexZ(seed.z());
366 toAdd->setQuality(seed.seedQuality());
367 seedContainer.push_back(std::move(
toAdd));
370 return StatusCode::SUCCESS;
437 std::vector<float> convertedVec;
439 for (
const auto&
val :
vec) {
440 convertedVec.push_back(
static_cast<float>(
val));
443 m_finderCfg.rRangeMiddleSP.push_back(convertedVec);
460 Acts::SeedFilterConfig filterCfg;
467 filterCfg.centralSeedConfirmationRange =
m_finderCfg.centralSeedConfirmationRange;
468 filterCfg.forwardSeedConfirmationRange =
m_finderCfg.forwardSeedConfirmationRange;
476 m_finderCfg.seedFilter = std::make_unique<Acts::SeedFilter< value_type > >(filterCfg.toInternalUnits(),
logger().cloneWithSuffix(
"Filter"));
499 return StatusCode::SUCCESS;