8 #include "Acts/Seeding/SeedFilterConfig.hpp"
9 #include "Acts/Seeding/BinnedGroup.hpp"
10 #include "Acts/Seeding/SeedFilter.hpp"
11 #include "Acts/Seeding/SeedFinder.hpp"
12 #include "Acts/Seeding/SeedFinderConfig.hpp"
13 #include "Acts/Definitions/Units.hpp"
14 #include "Acts/Seeding/SeedConfirmationRangeConfig.hpp"
18 const std::string&
name,
138 return StatusCode::FAILURE;
145 return StatusCode::FAILURE;
153 ATH_MSG_ERROR(
"Inconsistent config zBinsCustomLooping contains bins that are not in zBinEdges");
154 return StatusCode::FAILURE;
167 return StatusCode::SUCCESS;
172 const std::vector<const xAOD::SpacePoint*>& spContainer,
173 const Acts::Vector3& beamSpotPos,
174 const Acts::Vector3& bField,
179 std::vector<Acts::Seed< xAOD::SpacePoint >> groupSeeds;
187 seedContainer.
reserve(groupSeeds.size());
188 for(
const auto& seed: groupSeeds) {
189 std::unique_ptr< seed_type > to_add =
190 std::make_unique< seed_type >(seed);
191 seedContainer.
push_back(std::move(to_add));
194 return StatusCode::SUCCESS;
197 template<
typename external_iterator_t >
200 external_iterator_t spEnd,
201 const Acts::Vector3& beamSpotPos,
202 const Acts::Vector3& bField,
203 std::vector< seed_type >& seeds)
const
206 "Inconsistent type");
209 if (spBegin == spEnd)
210 return StatusCode::SUCCESS;
213 Acts::CylindricalSpacePointGridOptions gridOpts;
214 gridOpts.bFieldInZ = bField[2];
215 gridOpts = gridOpts.toInternalUnits();
218 Acts::SeedFinderOptions finderOpts;
219 finderOpts.beamPos = Acts::Vector2(beamSpotPos[
Amg::x],
221 finderOpts.bFieldInZ = bField[2];
222 finderOpts = finderOpts.toInternalUnits().calculateDerivedQuantities(
m_finderCfg);
224 auto extractCovariance = [](
const value_type& sp,
225 float,
float,
float) -> std::tuple<Acts::Vector3, Acts::Vector2, std::optional<Acts::ActsScalar>>
230 Acts::Vector3 position(sp.
x(),
234 return std::make_tuple(position, covariance, std::nullopt);
238 Acts::Extent rRangeSPExtent;
240 Acts::CylindricalSpacePointGrid< value_type > grid =
241 Acts::CylindricalSpacePointGridCreator::createGrid< value_type >(
m_gridCfg, gridOpts);
243 Acts::CylindricalSpacePointGridCreator::fillGrid(
m_finderCfg, finderOpts, grid,
244 spBegin, spEnd, extractCovariance, rRangeSPExtent);
246 Acts::CylindricalBinnedGroup< value_type > spacePointsGrouping(std::move(grid), *
m_bottomBinFinder,
250 const Acts::Range1D<float> rMiddleSPRange(std::floor(rRangeSPExtent.min(
Acts::binR) / 2) * 2 +
252 std::floor(rRangeSPExtent.max(
Acts::binR) / 2) * 2 -
256 typename decltype(
m_finder)::SeedingState state;
261 for (std::size_t
idx(0);
idx < spacePointsGrouping.grid().
size(); ++
idx) {
262 const std::vector<std::unique_ptr<Acts::InternalSpacePoint<xAOD::SpacePoint>>>& collection = spacePointsGrouping.grid().at(
idx);
263 for (
const std::unique_ptr<Acts::InternalSpacePoint<xAOD::SpacePoint>>& sp : collection) {
266 const float topHalfStripLength =
268 const float bottomHalfStripLength =
270 const Acts::Vector3 topStripDirection =
272 const Acts::Vector3 bottomStripDirection =
275 state.spacePointData.setTopStripVector(
276 index, topHalfStripLength * topStripDirection);
277 state.spacePointData.setBottomStripVector(
278 index, bottomHalfStripLength * bottomStripDirection);
279 state.spacePointData.setStripCenterDistance(
281 state.spacePointData.setTopStripCenterPosition(
288 for (
const auto [bottom, middle,
top] : spacePointsGrouping) {
289 m_finder.createSeedsForGroup(finderOpts, state, spacePointsGrouping.grid(),
290 std::back_inserter(seeds), bottom, middle,
top, rMiddleSPRange);
297 auto selectionFunction = [&state] (
const Acts::Seed<xAOD::SpacePoint>& seed) ->
bool
303 float seed_quality = seed.seedQuality();
304 float bottom_quality = state.spacePointData.quality(bottom_sp->
index());
305 float middle_quality = state.spacePointData.quality(middle_sp->
index());
306 float top_quality = state.spacePointData.quality(top_sp->
index());
308 if (bottom_quality > seed_quality and
309 middle_quality > seed_quality and
310 top_quality > seed_quality) {
318 std::size_t acceptedSeeds = 0;
319 for (std::size_t
i(0);
i<seeds.size(); ++
i) {
320 const auto& seed = seeds[
i];
321 if (not selectionFunction(seed)) {
327 if (acceptedSeeds !=
i)
328 seeds[acceptedSeeds] = std::move(seeds[
i]);
333 seeds.erase(seeds.begin() + acceptedSeeds, seeds.end());
336 return StatusCode::SUCCESS;
400 [](
const void*,
const value_type& sp) ->
float {
404 [](
const void*,
const value_type& sp) ->
float {
408 [](
const void*,
const value_type& sp) -> Acts::Vector3 {
412 [](
const void*,
const value_type& sp) -> Acts::Vector3 {
416 [](
const void*,
const value_type& sp) -> Acts::Vector3 {
420 [](
const void*,
const value_type& sp) -> Acts::Vector3 {
428 std::vector<float> convertedVec;
430 for (
const auto&
val :
vec) {
431 convertedVec.push_back(
static_cast<float>(
val));
434 m_finderCfg.rRangeMiddleSP.push_back(convertedVec);
440 [](
const void*,
float bottomRadius,
float cotTheta) ->
bool {
442 float fastTrackingRMin = 50.;
443 float fastTrackingCotThetaMax = 1.5;
445 if (bottomRadius < fastTrackingRMin and
446 (
cotTheta > fastTrackingCotThetaMax or
447 cotTheta < -fastTrackingCotThetaMax)) {
455 Acts::SeedFilterConfig filterCfg;
462 filterCfg.centralSeedConfirmationRange =
m_finderCfg.centralSeedConfirmationRange;
463 filterCfg.forwardSeedConfirmationRange =
m_finderCfg.forwardSeedConfirmationRange;
471 m_finderCfg.seedFilter = std::make_unique<Acts::SeedFilter< value_type > >(filterCfg.toInternalUnits());
493 return StatusCode::SUCCESS;