9#include "trg/cdc/NDFinderPeakFinder.h"
19std::vector<HoughPeak> NDFinderPeakFinder::findPeaks()
21 std::vector<HoughPeak> candidatePeaks;
22 c3array houghSpaceBackup = *m_houghSpace;
23 for (
unsigned short quadrant = 0; quadrant < 4; ++quadrant) {
24 for (
unsigned short section = 0; section < 4; ++section) {
25 std::array<c3index, 2> sectionBounds = getSectionBounds(quadrant, section);
26 iterateOverSection(sectionBounds, candidatePeaks);
27 if (m_peakFindingParams.iterations > 1) *m_houghSpace = houghSpaceBackup;
30 return candidatePeaks;
34std::array<c3index, 2> NDFinderPeakFinder::getSectionBounds(
const unsigned short quadrant,
const unsigned section)
36 c3index quadrantSize = m_peakFindingParams.nPhi / 4;
37 c3index quadrantOffset = m_peakFindingParams.nPhi / 8;
38 c3index sectionSize = quadrantSize / 4;
40 c3index quadrantStart = quadrant * quadrantSize + quadrantOffset;
41 c3index sectionStart = quadrantStart + section * sectionSize;
42 c3index sectionEnd = sectionStart + sectionSize;
44 return {sectionStart, sectionEnd};
48void NDFinderPeakFinder::iterateOverSection(
const std::array<c3index, 2>& sectionBounds,
49 std::vector<HoughPeak>& candidatePeaks)
51 for (
unsigned short _ = 0; _ < m_peakFindingParams.iterations; ++_) {
52 HoughPeak sectionPeak = getSectionPeak(sectionBounds);
53 if (sectionPeak.weight > 0) candidatePeaks.push_back(sectionPeak);
54 if (m_peakFindingParams.iterations > 1) deletePeakSurroundings(sectionPeak);
59HoughPeak NDFinderPeakFinder::getSectionPeak(
const std::array<c3index, 2>& sectionBounds)
61 unsigned int peakValue = 0;
62 cell_index peakCell = {0, 0, 0};
63 for (c3index omegaIdx = 0; omegaIdx < m_peakFindingParams.nOmega; ++omegaIdx) {
64 for (c3index phiIdx = sectionBounds[0]; phiIdx < sectionBounds[1]; ++phiIdx) {
65 c3index phiIdxMod = phiIdx % m_peakFindingParams.nPhi;
66 for (c3index cotIdx = 0; cotIdx < m_peakFindingParams.nCot; ++cotIdx) {
67 if ((*m_houghSpace)[omegaIdx][phiIdxMod][cotIdx] > peakValue) {
68 peakValue = (*m_houghSpace)[omegaIdx][phiIdxMod][cotIdx];
69 peakCell = {omegaIdx, phiIdxMod, cotIdx};
76 peak.weight = peakValue;
81void NDFinderPeakFinder::deletePeakSurroundings(
const HoughPeak& peak)
83 c3index omegaPeak = peak.cell[0];
84 c3index phiPeak = peak.cell[1];
86 c3index omegaLowerBound = std::max<unsigned short>(0, omegaPeak - m_peakFindingParams.omegaTrim);
87 c3index omegaUpperBound = std::min<unsigned short>(m_peakFindingParams.nOmega, omegaPeak + m_peakFindingParams.omegaTrim + 1);
89 for (c3index cotIdx = 0; cotIdx < m_peakFindingParams.nCot; ++cotIdx) {
90 for (c3index omegaIdx = omegaLowerBound; omegaIdx < omegaUpperBound; ++omegaIdx) {
91 c3index phiCell = phiPeak + omegaPeak - omegaIdx;
92 c3index relativePhi = phiCell - phiPeak;
94 if (relativePhi > 0) {
96 phiCell - m_peakFindingParams.phiTrim,
97 static_cast<c3index
>(phiCell + m_peakFindingParams.phiTrim + std::floor(2.4 * relativePhi)),
101 clearHoughSpaceRow(firstBounds);
102 }
else if (relativePhi < 0) {
104 static_cast<c3index
>(phiCell - m_peakFindingParams.phiTrim + std::ceil(2.4 * relativePhi)),
105 phiCell + m_peakFindingParams.phiTrim + 1,
109 clearHoughSpaceRow(secondBounds);
112 phiCell - m_peakFindingParams.phiTrim,
113 phiCell + m_peakFindingParams.phiTrim + 1,
117 clearHoughSpaceRow(thirdBounds);
124void NDFinderPeakFinder::clearHoughSpaceRow(
const DeletionBounds& bounds)
126 for (c3index phiIdx = bounds.phiLowerBound; phiIdx < bounds.phiUpperBound; ++phiIdx) {
127 c3index phiIdxMod = (phiIdx + m_peakFindingParams.nPhi) % m_peakFindingParams.nPhi;
128 (*m_houghSpace)[bounds.omega][phiIdxMod][bounds.cot] = 0;
Abstract base class for different kinds of events.