|
|
|||
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"
| [ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
|
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
|