65 struct RawFinderTrack {
70 std::vector<uint8_t> houghSpace;
72 RawFinderTrack(std::array<double, 3> estimatedParameters,
74 std::vector<uint8_t>&& readoutHoughSpace)
75 : omega{estimatedParameters[0]},
76 phi{estimatedParameters[1]},
77 cot{estimatedParameters[2]},
78 peak{std::move(houghPeak)},
79 houghSpace{std::move(readoutHoughSpace)} {}
90 unsigned short nHitIDs;
95 unsigned short hitIndex;
96 unsigned short contribution;
97 unsigned short superLayer;
102 NDFinder() =
default;
105 ~NDFinder() {
delete m_houghSpace; }
112 void addHit(
const HitInfo& hitInfo);
116 std::vector<RawFinderTrack>* getFinderTracks() {
return &m_rawFinderTracks; }
121 void initHitToSectorMap();
123 void fillCompressedHitReps(
const std::vector<unsigned short>& flatArray,
const SectorBinning& compBins,
124 c4array& compHitsToWeights)
const;
126 std::vector<unsigned short> loadFromFile(
const std::string& fileName)
const;
128 void fillExpandedHitReps(
const SectorBinning& compBins,
const c4array& compHitsToWeights, c4array& expHitsToWeights)
const;
130 void processHitForHoughSpace(
const unsigned short hitIdx);
132 void writeHitToHoughSpace(
const unsigned short relativeWireID,
const unsigned short phiSectorStart,
133 const c4array& expHitsToWeights);
135 void runTrackFinding();
137 std::vector<HoughPeak> relateHitsToPeaks(std::vector<HoughPeak>& peaks)
const;
139 std::vector<std::vector<unsigned short>> getHitsVsPeaksTable(
const std::vector<HoughPeak>& peaks)
const;
141 unsigned short getHitContribution(
const cell_index& peakCell,
const unsigned short hitIdx)
const;
143 std::vector<ContributionInfo> extractContributionInfos(
const std::vector<unsigned short>& peakHits)
const;
145 int getMaximumHitInSuperLayer(
const std::vector<ContributionInfo>& contributionInfos,
unsigned short superLayer)
const;
147 bool checkHitSuperLayers(
const HoughPeak& peak)
const;
149 std::array<double, 3> getTrackParameterEstimate(
const cell_index& peakCell)
const;
151 std::array<double, 3> transformTrackParameters(
const std::array<double, 3>& estimatedParameters)
const;
153 static inline double getTrackRadius(
double transverseMomentum) {
return transverseMomentum * 1e11 / (3e8 * 1.5); }
157 std::vector<RawFinderTrack> m_rawFinderTracks;
159 std::vector<unsigned short> m_hitIDs;
161 std::vector<unsigned short> m_hitSLIDs;
163 std::vector<short> m_priorityWireTime;
165 unsigned short m_nHits{0};
167 NDFinderParameters m_ndFinderParams;
169 NDFinderPeakFinder m_peakFinder;
171 DBObjPtr<CDCTriggerNDFinderLUTs> m_LUTsConditionsDB;
181 static constexpr unsigned short m_nTS = 2336;
182 static constexpr unsigned short m_nSL = 9;
183 static constexpr unsigned short m_nAxial = 41;
184 static constexpr unsigned short m_nStereo = 32;
187 static constexpr unsigned short m_nOmega = 40;
188 static constexpr unsigned short m_nPhi = 384;
189 static constexpr unsigned short m_nCot = 9;
192 static constexpr unsigned short m_phiGeo = 32;
195 static constexpr unsigned short m_nPhiSector = m_nPhi / m_phiGeo;
198 static constexpr unsigned short m_nPhiComp = 15;
199 static constexpr SectorBinning m_compAxialBins = {m_nOmega, m_nPhiComp, 1, m_nAxial};
200 static constexpr SectorBinning m_compStereoBins = {m_nOmega, m_nPhiComp, m_nCot, m_nStereo};
203 static constexpr std::array<double, 2> m_omegaRange = {-4., 4.};
204 static constexpr std::array<double, 2> m_phiRange = {0., 11.25};
206 static constexpr std::array<double, 2> m_cotRange = {2.3849627654510415, -1.0061730449796316};
207 static constexpr double m_binSizeOmega = (m_omegaRange[1] - m_omegaRange[0]) / m_nOmega;
208 static constexpr double m_binSizePhi = (m_phiRange[1] - m_phiRange[0]) / m_nPhiSector;
209 static constexpr double m_binSizeCot = (m_cotRange[1] - m_cotRange[0]) / m_nCot;
210 static constexpr std::array<std::array<double, 2>, 3> m_acceptanceRanges = {m_omegaRange, m_phiRange, m_cotRange};
211 static constexpr std::array<double, 3> m_binSizes = {m_binSizeOmega, m_binSizePhi, m_binSizeCot};
221 c2array m_hitToSectorIDs{boost::extents[m_nTS][3]};
232 c4array m_compAxialHitReps{boost::extents[m_nAxial][m_nOmega][m_nPhiComp][1]};
233 c4array m_compStereoHitReps{boost::extents[m_nStereo][m_nOmega][m_nPhiComp][m_nCot]};
244 c4array m_expAxialHitReps{boost::extents[m_nAxial][m_nOmega][m_nPhi][m_nCot]};
245 c4array m_expStereoHitReps{boost::extents[m_nStereo][m_nOmega][m_nPhi][m_nCot]};
248 c3array* m_houghSpace =
nullptr;