CbmRoot
Loading...
Searching...
No Matches
HitfinderChain.h
Go to the documentation of this file.
1/* Copyright (C) 2022 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Felix Weiglhofer [committer], Kilian Hunold */
4
5#ifndef CBM_ALGO_STS_HITFINDER_CHAIN_H
6#define CBM_ALGO_STS_HITFINDER_CHAIN_H
7
8#include "CbmStsDigi.h"
9#include "PartitionedSpan.h"
10#include "PartitionedVector.h"
11#include "SubChain.h"
12#include "sts/Hitfinder.h"
13#include "sts/HitfinderPars.h"
14#include "sts/LandauTable.h"
15
16#include <array>
17#include <cstdint>
18#include <gsl/span>
19#include <map>
20#include <optional>
21#include <vector>
22
23#include <xpu/host.h>
24
25namespace cbm::algo::sts
26{
27
31
32 void SetDeviceMon(const HitfinderMonDevice& devMon) { HitfinderMonDevice::operator=(devMon); }
33 };
34
36 HitfinderPars setup; // TODO: HitfinderPars should renamed to HitfinderSetup
38 };
39
46 class HitfinderChain : public SubChain {
47
48 public:
54
55 void SetParameters(const HitfinderChainPars& parameters);
56 const HitfinderChainPars& GetParameters() const { return *fPars; }
57
61 void Finalize();
62
63 Result operator()(gsl::span<const CbmStsDigi>, bool storeClusters = false);
64
65 private:
66 static constexpr u16 InvalidModule = 0xFFFF;
67
68 struct DigiMap {
69 //< Map module address to index in digis array. Only works for 17 bit packed addresses.
70 std::vector<u16> addrToIndex;
71 // Map modules to number of Digis, 2 * NModules entries, first half is front, second half is back
72 std::vector<size_t> nDigisPerModule;
73 std::vector<std::vector<size_t>> nDigisPerThread; //< Number of digis per module per thread [thread][module]
74 size_t maxNDigisPerModule = 0; //< Upper bound on number of digis per module
75
76 u16 ModuleIndex(const CbmStsDigi& digi) const
77 {
78 i32 moduleAddr = digi.GetAddressPacked();
79 u16 moduleIndex = addrToIndex[moduleAddr];
80 return moduleIndex;
81 }
82 };
83
87 void EnsureParameters();
88
93 void AllocateStatic();
94
99 void AllocateDynamic(size_t, size_t);
100
104 DigiMap CountDigisPerModules(gsl::span<const CbmStsDigi> digis);
105
109 void FlattenDigis(gsl::span<const CbmStsDigi> digis, DigiMap& digiMap);
110
115
120
126 size_t GetNHits(xpu::h_view<PaddedToCacheLine<int>> nHitsPerModule, int module);
127
138
143
144 // Debug functions, ensure reco produces sane results
145 void EnsureDigiOffsets(DigiMap&);
146 void EnsureDigisSorted();
147 void EnsureChannelOffsets(gsl::span<u32>);
148 void EnsureClustersSane(gsl::span<ClusterIdx>, gsl::span<PaddedToCacheLine<int>>);
151
152 std::optional<sts::HitfinderChainPars> fPars;
153
155
156 // Output buffer, used by the returned PartitionedSpan
157 std::vector<u32> fAddresses;
158 std::vector<size_t> fHitOffsets;
159 std::vector<u32> fStreamAddresses;
160 std::vector<size_t> fHitStreamOffsets;
161 };
162
163} // namespace cbm::algo::sts
164
165#endif // #ifndef CBM_ALGO_STS_HITFINDER_CHAIN_H
static vector< vector< QAHit > > hits
Data class for a single-channel message in the STS.
Definition CbmStsDigi.h:40
XPU_D int32_t GetAddressPacked() const
Definition CbmStsDigi.h:77
A class that represents a value with padding to a certain size.
Definition PaddedValue.h:27
A vector that is partitioned into multiple subvectors.
void EnsureHitsSorted(PartitionedSpan< sts::Hit >)
PartitionedSpan< sts::Hit > SplitHitsIntoStreams(PartitionedSpan< sts::Hit > hits, int nstreamsMax)
PartitionedVector< sts::Cluster > FlattenClusters(xpu::queue)
void SortHitsWithinPartition(PartitionedSpan< sts::Hit > hits)
void EnsureClustersSane(gsl::span< ClusterIdx >, gsl::span< PaddedToCacheLine< int > >)
void EnsureChannelOffsets(gsl::span< u32 >)
std::vector< size_t > fHitStreamOffsets
size_t GetNHits(xpu::h_view< PaddedToCacheLine< int > > nHitsPerModule, int module)
Returns the number of hits of a module.
std::vector< size_t > fHitOffsets
PartitionedSpan< sts::Hit > FlattenHits(xpu::queue)
std::optional< sts::HitfinderChainPars > fPars
void FlattenDigis(gsl::span< const CbmStsDigi > digis, DigiMap &digiMap)
DigiMap CountDigisPerModules(gsl::span< const CbmStsDigi > digis)
Result operator()(gsl::span< const CbmStsDigi >, bool storeClusters=false)
const HitfinderChainPars & GetParameters() const
std::vector< u32 > fStreamAddresses
void SetParameters(const HitfinderChainPars &parameters)
void AllocateDynamic(size_t, size_t)
static constexpr u16 InvalidModule
std::int32_t i32
Definition Definitions.h:20
std::uint64_t u64
Definition Definitions.h:23
std::uint16_t u16
Definition Definitions.h:19
RecoParams::STS::Memory memory
u16 ModuleIndex(const CbmStsDigi &digi) const
std::vector< std::vector< size_t > > nDigisPerThread
PartitionedVector< sts::Cluster > clusters
PartitionedSpan< sts::Hit > hits
void SetDeviceMon(const HitfinderMonDevice &devMon)