Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-17 07:34:32

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 #include "Acts/Utilities/Grid.hpp"
0012 
0013 #include <array>
0014 #include <span>
0015 #include <stdexcept>
0016 #include <unordered_set>
0017 
0018 namespace Acts::HoughTransformUtils {
0019 
0020 /// this type is responsible for encoding the parameters of our hough space
0021 using CoordType = double;
0022 
0023 /// Type alias for hit count/weight values in Hough space
0024 // this type is used to encode hit counts.
0025 // Floating point to allow hit weights to be applied
0026 using YieldType = float;
0027 
0028 /// @brief this function represents a mapping of a coordinate point in detector space to a line in
0029 /// hough space. Given the value of the first hough coordinate, it shall return
0030 /// the corresponding second coordinate according to the line parametrisation.
0031 /// Should be implemented by the user.
0032 /// @tparam PointType: The class representing a point in detector space (can differ between implementations)
0033 template <class PointType>
0034 using LineParametrisation =
0035     std::function<CoordType(CoordType, const PointType&)>;
0036 
0037 /// @brief struct to define the ranges of the hough histogram.
0038 /// Used to move between parameter and bin index coordinates.
0039 /// Disconnected from the hough plane binning to be able to reuse
0040 /// a plane with a given binning for several parameter ranges
0041 struct HoughAxisRanges {
0042   /// Minimum value of the first hough coordinate
0043   CoordType xMin = 0.0f;  // minimum value of the first coordinate
0044   /// Maximum value of the first hough coordinate
0045   CoordType xMax = 0.0f;  // maximum value of the first coordinate
0046   /// Minimum value of the second hough coordinate
0047   CoordType yMin = 0.0f;  // minimum value of the second coordinate
0048   /// Maximum value of the second hough coordinate
0049   CoordType yMax = 0.0f;  // maximum value of the second coordinate
0050 };
0051 
0052 /// convenience functions to link bin indices to axis coordinates
0053 
0054 /// @brief find the bin index corresponding to a certain abscissa
0055 /// of the coordinate axis, based on the axis limits and binning.
0056 /// @param min: Start of axis range
0057 /// @param max: End of axis range
0058 /// @param nSteps: Number of bins in axis
0059 /// @param val: value to find the corresponding bin for
0060 /// @return the bin number.
0061 /// No special logic to prevent over-/underflow, checking these is
0062 /// left to the caller
0063 inline int binIndex(double min, double max, unsigned nSteps, double val) {
0064   return static_cast<int>((val - min) / (max - min) * nSteps);
0065 }
0066 // Returns the lower bound of the bin specified by step
0067 /// @param min: Start of axis range
0068 /// @param max: End of axis range
0069 /// @param nSteps: Number of bins in axis
0070 /// @param binIndex: The index of the bin
0071 /// @return the parameter value at the lower bin edge.
0072 /// No special logic to prevent over-/underflow, checking these is
0073 /// left to the caller
0074 inline double lowerBinEdge(double min, double max, unsigned nSteps,
0075                            std::size_t binIndex) {
0076   return min + (max - min) * binIndex / nSteps;
0077 }
0078 // Returns the lower bound of the bin specified by step
0079 /// @param min: Start of axis range
0080 /// @param max: End of axis range
0081 /// @param nSteps: Number of bins in axis
0082 /// @param binIndex: The index of the bin
0083 /// @return the parameter value at the bin center.
0084 /// No special logic to prevent over-/underflow, checking these is
0085 /// left to the caller
0086 inline double binCenter(double min, double max, unsigned nSteps,
0087                         std::size_t binIndex) {
0088   return min + (max - min) * 0.5 * (2 * binIndex + 1) / nSteps;
0089 }
0090 
0091 /// @brief data class for the information to store for each
0092 /// cell of the hough histogram.
0093 /// @tparam identifier_t: Type of the identifier to associate to the hits
0094 ///                       Should be sortable. Used to uniquely identify each
0095 ///                       hit and to eventually return the list of hits per cell
0096 template <class identifier_t>
0097 class HoughCell {
0098  public:
0099   /// @brief construct the cell as empty
0100   HoughCell() = default;
0101   /// @brief add an entry to this cell
0102   /// @param identifier: Identifier of the hit (used to distinguish hits from another)
0103   /// @param layer: Layer of the hit (used when counting layers)
0104   /// @param weight: Optional weight to assign to the hit
0105   void fill(const identifier_t& identifier, unsigned int layer,
0106             YieldType weight = 1.);
0107   /// @brief access the number of layers with hits compatible with this cell
0108   /// @return The (weighted) number of layers with hits in this cell
0109   YieldType nLayers() const { return m_nLayers; }
0110   /// @brief access the number of unique hits compatible with this cell
0111   /// @return The (weighted) number of unique hits in this cell
0112   YieldType nHits() const { return m_nHits; }
0113   /// @brief access the span of layers compatible with this cell
0114   /// @return Span containing the layer indices with hits in this cell
0115   std::span<const unsigned, std::dynamic_extent> getLayers() const;
0116   /// Access the span of unique hits compatible with this cell.
0117   /// @return Span containing the identifiers of hits in this cell
0118   std::span<const identifier_t, std::dynamic_extent> getHits() const;
0119 
0120   /// @brief reset this cell, removing any existing content.
0121   void reset();
0122 
0123  private:
0124   /// (weighted) number of layers with hits on this cell
0125   YieldType m_nLayers{0};
0126   /// (weighted) number of unique hits on this cell
0127   YieldType m_nHits{0};
0128 
0129   /// index for the hits -- keeps track of vector's size
0130   std::size_t m_iHit{0};
0131   /// index for the layers -- keeps track of vector's size
0132   std::size_t m_iLayer{0};
0133 
0134   /// a batch to resize the vector of the hits or the layers
0135   std::size_t m_assignBatch{20};
0136 
0137   /// vector of layers with hits on this cell
0138   std::vector<unsigned> m_layers{std::vector<unsigned>(m_assignBatch)};
0139 
0140   /// vector of hits on this cell
0141   std::vector<identifier_t> m_hits{std::vector<identifier_t>(m_assignBatch)};
0142 };
0143 
0144 /// @brief Configuration - number of bins in each axis.
0145 /// The Hough plane is agnostic of how the bins map to
0146 /// coordinates, allowing to reuse a plane for several
0147 /// (sub) detectors of different dimensions if the bin number
0148 /// remains applicable
0149 struct HoughPlaneConfig {
0150   /// Number of bins in the first hough coordinate
0151   std::size_t nBinsX = 0;  // number of bins in the first coordinate
0152   /// Number of bins in the second hough coordinate
0153   std::size_t nBinsY = 0;  // number of bins in the second coordinate
0154 };
0155 
0156 /// @brief Representation of the hough plane - the histogram used
0157 /// for the hough transform with methods to fill and evaluate
0158 /// the histogram. Templated to a class used as identifier for the hits
0159 template <class identifier_t>
0160 class HoughPlane {
0161  public:
0162   /// @brief hough histogram representation as a 2D-indexable vector of hough cells
0163   using Axis =
0164       Acts::Axis<Acts::AxisType::Equidistant, Acts::AxisBoundaryType::Bound>;
0165   /// Type alias for Hough histogram grid
0166   using HoughHist = Grid<HoughCell<identifier_t>, Axis, Axis>;
0167   /// Type alias for histogram index type
0168   using Index = typename HoughHist::index_t;
0169 
0170   /// @brief instantiate the (empty) hough plane
0171   /// @param cfg: configuration
0172   explicit HoughPlane(const HoughPlaneConfig& cfg);
0173 
0174   /// fill and reset methods to modify the grid content
0175 
0176   /// @brief add one measurement to the hough plane
0177   /// @tparam PointType: Type of the objects to use when adding measurements (e.g. experiment EDM object)
0178   /// @param measurement: The measurement to add
0179   /// @param axisRanges: Ranges of the hough axes, used to map the bin numbers to parameter values
0180   /// @param linePar: The function y(x) parametrising the hough space line for a given measurement
0181   /// @param widthPar: The function dy(x) parametrising the width of the y(x) curve
0182   ///                   for a given measurement
0183   /// @param identifier: The unique identifier for the given hit
0184   /// @param layer: A layer index for this hit
0185   /// @param weight: An optional weight to assign to this hit
0186   template <class PointType>
0187   void fill(const PointType& measurement, const HoughAxisRanges& axisRanges,
0188             const LineParametrisation<PointType>& linePar,
0189             const LineParametrisation<PointType>& widthPar,
0190             const identifier_t& identifier, unsigned layer = 0,
0191             YieldType weight = 1.0f);
0192   /// @brief resets the contents of the grid. Can be used to avoid reallocating the histogram
0193   /// when switching regions / (sub)detectors
0194   void reset();
0195 
0196   //// user-facing accessors
0197 
0198   /// @brief get the layers with hits in one cell of the histogram
0199   /// @param xBin: bin index in the first coordinate
0200   /// @param yBin: bin index in the second coordinate
0201   /// @return the layer indices that have hits for this cell
0202   /// @throws out of range if indices are not within plane limits
0203   std::span<const unsigned, std::dynamic_extent> layers(
0204       std::size_t xBin, std::size_t yBin) const {
0205     checkIndices(xBin, yBin);
0206     return m_houghHist.atLocalBins({xBin, yBin}).getLayers();
0207   }
0208 
0209   /// @brief get the (weighted) number of layers  with hits in one cell of the histogram
0210   /// @param xBin: bin index in the first coordinate
0211   /// @param yBin: bin index in the second coordinate
0212   /// @return the (weighed) number of layers that have hits for this cell
0213   /// @throws out of range if indices are not within plane limits
0214   YieldType nLayers(std::size_t xBin, std::size_t yBin) const {
0215     checkIndices(xBin, yBin);
0216     return m_houghHist.atLocalBins({xBin, yBin}).nLayers();
0217   }
0218 
0219   /// @brief get the identifiers of all hits in one cell of the histogram
0220   /// @param xBin: bin index in the first coordinate
0221   /// @param yBin: bin index in the second coordinate
0222   /// @return the list of identifiers of the hits for this cell
0223   /// Can include duplicates if a hit was filled more than once
0224   /// @throws out of range if indices are not within plane limits
0225   std::span<const identifier_t, std::dynamic_extent> hitIds(
0226       std::size_t xBin, std::size_t yBin) const {
0227     checkIndices(xBin, yBin);
0228     return m_houghHist.atLocalBins({xBin, yBin}).getHits();
0229   }
0230   /// @brief get the identifiers of all hits in one cell of the histogram
0231   /// @param xBin: bin index in the first coordinate
0232   /// @param yBin: bin index in the second coordinate
0233   /// @return the list of identifiers of the hits for this cell
0234   /// Guaranteed to not duplicate identifiers
0235   /// @throws out of range if indices are not within plane limits
0236   std::unordered_set<const identifier_t> uniqueHitIds(std::size_t xBin,
0237                                                       std::size_t yBin) const {
0238     checkIndices(xBin, yBin);
0239     const auto hits_span = m_houghHist.atLocalBins({xBin, yBin}).getHits();
0240     return std::unordered_set<identifier_t>(hits_span.begin(), hits_span.end());
0241   }
0242   /// @brief access the (weighted) number of hits in one cell of the histogram from bin's coordinates
0243   /// @param xBin: bin index in the first coordinate
0244   /// @param yBin: bin index in the second coordinate
0245   /// @return the (weighted) number of hits for this cell
0246   /// @throws out of range if indices are not within plane limits
0247   YieldType nHits(std::size_t xBin, std::size_t yBin) const {
0248     checkIndices(xBin, yBin);
0249     return m_houghHist.atLocalBins({xBin, yBin}).nHits();
0250   }
0251 
0252   /// @brief access the (weighted) number of hits in one cell of the histogram from globalBin index
0253   /// @param globalBin: global bin index
0254   /// @return the (weighted) number of hits for this cell
0255   YieldType nHits(std::size_t globalBin) const {
0256     return m_houghHist.at(globalBin).nHits();
0257   }
0258 
0259   /// @brief get the number of bins on the first coordinate
0260   /// @return Number of bins in the X direction
0261   std::size_t nBinsX() const { return m_cfg.nBinsX; }
0262   /// @brief get the number of bins on the second coordinate
0263   /// @return Number of bins in the Y direction
0264   std::size_t nBinsY() const { return m_cfg.nBinsY; }
0265 
0266   /// @brief get the maximum number of (weighted) hits seen in a single
0267   /// cell across the entire histrogram.
0268   /// @return Maximum number of hits found in any single cell
0269   YieldType maxHits() const { return m_maxHits; }
0270 
0271   /// @brief get the list of cells with non-zero content.
0272   /// Useful for peak-finders in sparse data
0273   /// to avoid looping over all cells
0274   /// @return Reference to set of global bin indices with non-zero content
0275   const std::unordered_set<std::size_t>& getNonEmptyBins() const {
0276     return m_touchedBins;
0277   }
0278 
0279   /// @brief get the coordinates of the bin given the global bin index
0280   /// @param globalBin Global bin index to convert to coordinates
0281   /// @return Local bin coordinates (x,y) corresponding to global bin index
0282   Index axisBins(std::size_t globalBin) const {
0283     return m_houghHist.localBinsFromGlobalBin(globalBin);
0284   }
0285 
0286   /// @brief get the globalBin index given the coordinates of the bin
0287   /// @param indexBin Bin coordinates to convert to global index
0288   /// @return Global bin index corresponding to local bin coordinates
0289   std::size_t globalBin(Index indexBin) const {
0290     return m_houghHist.globalBinFromLocalBins(indexBin);
0291   }
0292 
0293   /// @brief get the bin indices of the cell containing the largest number
0294   /// of (weighted) hits across the entire histogram
0295   /// @return Pair of (x,y) bin indices where maximum hits are found
0296   std::pair<std::size_t, std::size_t> locMaxHits() const {
0297     return m_maxLocHits;
0298   }
0299 
0300   /// @brief get the maximum number of (weighted) layers with hits  seen
0301   /// in a single cell across the entire histrogram.
0302   /// @return Maximum number of layers found in any single cell
0303   YieldType maxLayers() const { return m_maxLayers; }
0304 
0305   /// @brief get the bin indices of the cell containing the largest number
0306   /// of (weighted) layers with hits across the entire histogram
0307   /// @return Pair of (x,y) bin indices where maximum layers are found
0308   std::pair<std::size_t, std::size_t> locMaxLayers() const {
0309     return m_maxLocLayers;
0310   }
0311 
0312   /// @brief Helper method to fill a bin of the hough histogram.
0313   /// Updates the internal helper data structures (maximum tracker etc).
0314   /// @param binX: bin number along x
0315   /// @param binY: bin number along y
0316   /// @param identifier: hit identifier
0317   /// @param layer: layer index
0318   /// @param w: optional hit weight
0319   void fillBin(std::size_t binX, std::size_t binY,
0320                const identifier_t& identifier, unsigned layer, double w = 1.0f);
0321 
0322  private:
0323   YieldType m_maxHits = 0.0f;    // track the maximum number of hits seen
0324   YieldType m_maxLayers = 0.0f;  // track the maximum number of layers seen
0325 
0326   /// track the location of the maximum in hits
0327   std::pair<std::size_t, std::size_t> m_maxLocHits = {0, 0};
0328   /// track the location of the maximum in layers
0329   std::pair<std::size_t, std::size_t> m_maxLocLayers = {0, 0};
0330 
0331   std::size_t m_assignBatch{20};
0332 
0333   /// track the bins with non-trivial content
0334   std::unordered_set<std::size_t> m_touchedBins{};
0335 
0336   std::size_t m_iBin = 0;
0337 
0338   HoughPlaneConfig m_cfg;  // the configuration object
0339   HoughHist m_houghHist;   // the histogram data object
0340 
0341   /// @brief check if indices are are valid
0342   void checkIndices(std::size_t x, std::size_t y) const;
0343 };
0344 
0345 /// example peak finders.
0346 namespace PeakFinders {
0347 /// configuration for the LayerGuidedCombinatoric peak finder
0348 struct LayerGuidedCombinatoricConfig {
0349   /// Minimum number of layers required to form a peak
0350   YieldType threshold = 3.0f;  // min number of layers to obtain a maximum
0351   /// Size of window for local maximum detection
0352   int localMaxWindowSize = 0;  // Only create candidates from a local maximum
0353 };
0354 
0355 /// @brief Peak finder inspired by ATLAS ITk event filter developments.
0356 /// Builds peaks based on layer counts and allows for subsequent resolution
0357 /// of the combinatorics by building multiple candidates per peak if needed.
0358 /// In flat regions, peak positions are moved towards smaller values of the
0359 /// second and first coordinate.
0360 /// @tparam identifier_t: The identifier type to use. Should match the one used in the hough plane.
0361 template <class identifier_t>
0362 class LayerGuidedCombinatoric {
0363  public:
0364   /// @brief data class representing the found maxima.
0365   /// Here, we just have a list of cluster identifiers
0366   struct Maximum {
0367     /// Set of hit identifiers contributing to this peak
0368     std::unordered_set<identifier_t> hitIdentifiers =
0369         {};  // identifiers of contributing hits
0370   };
0371   /// @brief constructor
0372   /// @param cfg: Configuration object
0373   explicit LayerGuidedCombinatoric(const LayerGuidedCombinatoricConfig& cfg);
0374 
0375   /// @brief main peak finder method.
0376   /// @param plane: Filled hough plane to search
0377   /// @return vector of found maxima
0378   std::vector<Maximum> findPeaks(const HoughPlane<identifier_t>& plane) const;
0379 
0380  private:
0381   /// @brief check if a given bin is a local maximum.
0382   /// @param plane: The filled hough plane
0383   /// @param xBin: x bin index
0384   /// @param yBin: y bin index
0385   /// @return true if a maximum, false otherwise
0386   bool passThreshold(const HoughPlane<identifier_t>& plane, std::size_t xBin,
0387                      std::size_t yBin) const;  // did we pass extensions?
0388 
0389   LayerGuidedCombinatoricConfig m_cfg;  // configuration data object
0390 };
0391 /// @brief Configuration for the IslandsAroundMax peak finder
0392 struct IslandsAroundMaxConfig {
0393   /// Minimum number of weighted hits required for a peak
0394   YieldType threshold =
0395       3.0f;  // min number of weigted hits required in a maximum
0396   /// Fraction of global maximum below which peaks are ignored
0397   YieldType fractionCutoff =
0398       0;  // Fraction of the global maximum at which to cut off maxima
0399   /// Minimum spacing between peaks in parameter space
0400   std::pair<CoordType, CoordType> minSpacingBetweenPeaks = {
0401       0.0f, 0.0f};  // minimum distance of a new peak from existing peaks in
0402                     // parameter space
0403 };
0404 /// @brief Peak finder inspired by ATLAS muon reconstruction.
0405 /// Looks for regions above a given fraction of the global maximum
0406 /// hit count and connects them into islands comprising adjacent bins
0407 /// above the threshold. Peak positions are averaged across cells in the island,
0408 /// weighted by hit counts
0409 /// @tparam identifier_t: The identifier type to use. Should match the one used in the hough plane.
0410 template <class identifier_t>
0411 class IslandsAroundMax {
0412  public:
0413   /// @brief data struct representing a local maximum.
0414   /// Comes with a position estimate and a list of hits within the island
0415   struct Maximum {
0416     /// X coordinate of the peak maximum
0417     CoordType x = 0;
0418     /// Y coordinate of the peak maximum
0419     CoordType y = 0;
0420     /// Width of the peak in X direction
0421     CoordType wx = 0;
0422     /// Width of the peak in Y direction
0423     CoordType wy = 0;
0424     /// Set of hit identifiers contributing to this peak
0425     std::unordered_set<identifier_t> hitIdentifiers =
0426         {};  // identifiers of contributing hits
0427   };
0428   /// @brief constructor.
0429   /// @param cfg: configuration object
0430   explicit IslandsAroundMax(const IslandsAroundMaxConfig& cfg);
0431 
0432   /// @brief main peak finder method.
0433   /// @param plane: The filled hough plane to search
0434   /// @param ranges: The axis ranges used for mapping between parameter space and bins.
0435   /// @return List of the found maxima
0436   std::vector<Maximum> findPeaks(const HoughPlane<identifier_t>& plane,
0437                                  const HoughAxisRanges& ranges);
0438 
0439  private:
0440   /// @brief method to incrementally grow an island by adding adjacent cells
0441   /// Performs a breadth-first search for neighbours above threshold and adds
0442   /// them to candidate. Stops when no suitable neighbours are left.
0443   /// @param houghPlane: The current hough Plane we are looking for maxima
0444   /// @param inMaximum: List of cells found in the island. Incrementally populated by calls to the method
0445   /// @param toExplore: List of the global Bin indices of neighbour cell candidates left to explore. Method will not do anything once this is empty
0446   /// @param threshold: the threshold to apply to check if a cell should be added to an island
0447   /// @param yieldMap: A map of the hit content of above-threshold cells. Used cells will be set to empty content to avoid reuse by subsequent calls
0448   void extendMaximum(const HoughPlane<identifier_t>& houghPlane,
0449                      std::vector<std::array<std::size_t, 2>>& inMaximum,
0450                      std::vector<std::size_t>& toExplore, YieldType threshold,
0451                      std::unordered_map<std::size_t, YieldType>& yieldMap);
0452 
0453   IslandsAroundMaxConfig m_cfg;  // configuration data object
0454 
0455   /// @brief array of steps to consider when exploring neighbouring cells.
0456   const std::array<std::pair<int, int>, 8> m_stepDirections{
0457       std::make_pair(-1, -1), std::make_pair(0, -1), std::make_pair(1, -1),
0458       std::make_pair(-1, 0),  std::make_pair(1, 0),  std::make_pair(-1, 1),
0459       std::make_pair(0, 1),   std::make_pair(1, 1)};
0460 };
0461 
0462 /// @brief Peak finder using sliding window algorithm.
0463 /// First it finds peaks by scanning all space for cells with number of hits
0464 /// above threshold. Then applies sliding window (SW) logic to eliminate peaks
0465 /// when maxima are adjacent leaving only one of them in a window. This SW
0466 /// implementation requires that none on the upper right corner are above peak
0467 /// and none in bottom left corner is below or equal to the peak. It can be
0468 /// illustrated as follows for window size of 1:
0469 ///
0470 ///
0471 ///  <= <= <=
0472 ///   <  O <=
0473 ///   <  <  <
0474 ///
0475 /// Then the algorithm collects maxima in a window (possibly of different size)
0476 /// and calculates peak position using weighted average.
0477 
0478 struct SlidingWindowConfig {
0479   /// peak threshold, cell content is compared with it using >= operator
0480   std::size_t threshold = 3;
0481   /// size of the window in x direction for sliding window
0482   std::size_t xWindowSize = 2;
0483   /// size of the window in y direction for sliding window
0484   std::size_t yWindowSize = 2;
0485   /// perform re-centering
0486   bool recenter = true;
0487   /// size of the window in x direction for recentering, this should be
0488   /// typically <= window size
0489   std::size_t xRecenterSize = 3;
0490   /// size of the window in y direction for recentering, this should be
0491   /// typically <= window size
0492   std::size_t yRecenterSize = 3;
0493 };
0494 
0495 /// @brief Obtain peaks list in Hough space using Sliding Window algorithm
0496 /// @tparam identifier_t Hough plane content
0497 /// @param plane Hough plane to work on
0498 /// @param config algorithm configuration
0499 /// @return list of indices (pairs of numbers)
0500 template <typename identifier_t>
0501 std::vector<typename HoughPlane<identifier_t>::Index> slidingWindowPeaks(
0502     const HoughPlane<identifier_t>& plane, const SlidingWindowConfig& config);
0503 
0504 /// @brief Obtain an image around the peak
0505 /// @tparam identifier_t Hough plane content
0506 /// @param plane Hough plane to work on
0507 /// @param index peak center
0508 /// @param xSize number of cells around the peak in x direction
0509 /// @param ySize number of cells around the peak in y direction
0510 /// @param summaryFunction function constructing pixel content, default is just number of hits in cell
0511 ///        Other implementations may take into account layers
0512 /// @return the vector with count of hits starting from lower left to upper right corner of rectangular window
0513 /// The "image" is always of the same size, if it would happen to be outside of
0514 /// Hough plane the content is padded with zeros
0515 template <typename identifier_t, typename pixel_value_t = unsigned char>
0516 std::vector<pixel_value_t> hitsCountImage(
0517     const HoughPlane<identifier_t>& plane,
0518     typename HoughPlane<identifier_t>::Index index, std::size_t xSize,
0519     std::size_t ySize,
0520     const std::function<pixel_value_t(const HoughPlane<identifier_t>&, int,
0521                                       int)>& summaryFunction =
0522         [](const HoughPlane<identifier_t>& plane, int x, int y) {
0523           return static_cast<pixel_value_t>(plane.nHits(x, y));
0524         });
0525 
0526 }  // namespace PeakFinders
0527 }  // namespace Acts::HoughTransformUtils
0528 
0529 #include "HoughTransformUtils.ipp"