23 for (uint32_t SmType = 0; SmType <
fNbSm.size(); SmType++) {
25 int32_t NbSm =
fNbSm[SmType];
26 int32_t NbRpc =
fNbRpc[SmType];
29 for (int32_t Sm = 0; Sm < NbSm; Sm++) {
30 for (int32_t Rpc = 0; Rpc < NbRpc; Rpc++) {
32 auto par = std::make_unique<cbm::algo::tof::ClusterizerRpcPar>();
39 par->fSigVel = rpcPar.
sigVel;
50 int32_t NbChan = rpcPar.
chanPar.size();
51 par->fChanPar.resize(NbChan);
53 for (int32_t Ch = 0; Ch < NbChan; Ch++) {
55 par->fChanPar[Ch].address = chanPar.
address;
56 par->fChanPar[Ch].cell.pos = ROOT::Math::XYZVector(tra_ptr[0], tra_ptr[1], tra_ptr[2]);
57 par->fChanPar[Ch].cell.rotation = ROOT::Math::Rotation3D(&rot_ptr[0], &rot_ptr[9]);
58 par->fChanPar[Ch].cell.sizeX = rpcPar.
cell.
sizeX;
59 par->fChanPar[Ch].cell.sizeY = rpcPar.
cell.
sizeY;
61 fAlgo.emplace_back(std::move(*par));
68 L_(info) <<
"--- Configured hitfinder algorithms for TOF.";
79 auto& clusterTs = std::get<0>(result);
80 auto& monitor = std::get<1>(result);
81 auto& digiInd = std::get<2>(result);
85 xpu::push_timer(
"TofHitfindChanSort");
86 for (
size_t idigi = 0; idigi < digiIn.size(); idigi++) {
90 const double SmType = pDigi->
GetType();
91 const double Sm = pDigi->
GetSm();
92 const double Rpc = pDigi->
GetRpc();
93 const int NbRpc =
fNbRpc[SmType];
94 if (SmType >=
fNbSm.size() || Sm * NbRpc + Rpc >=
fNbSm[SmType] * NbRpc) {
98 fStorDigi[SmType][Sm * NbRpc + Rpc].emplace_back(*pDigi, idigi);
100 monitor.fSortTime = xpu::pop_timer();
107 std::vector<size_t> cluPrefix;
108 std::vector<size_t> sizePrefix;
109 std::vector<size_t> addrPrefix;
110 std::vector<size_t> indPrefix;
112 xpu::push_timer(
"TofHitfind");
113 xpu::t_add_bytes(digiIn.size_bytes());
122 cluPrefix.resize(nthreads + 1);
123 sizePrefix.resize(nthreads + 1);
124 addrPrefix.resize(nthreads + 1);
125 indPrefix.resize(nthreads + 1);
130 auto& clusters = std::get<0>(localresult);
131 auto& sizes = std::get<1>(localresult);
132 auto& addresses = std::get<2>(localresult);
133 auto& indices = std::get<3>(localresult);
135 CBM_OMP(
for schedule(dynamic) nowait)
136 for (uint32_t iRpc = 0; iRpc <
fAlgo.size(); iRpc++) {
139 std::vector<std::pair<CbmTofDigi, int32_t>>& digiExp = *
fStorDigiPtr[iRpc];
143 auto rpc_result =
fAlgo[iRpc](digiExp);
144 auto& rpc_clu = std::get<0>(rpc_result);
145 auto& rpc_size = std::get<1>(rpc_result);
146 auto& rpc_addr = std::get<2>(rpc_result);
147 auto& rpc_ind = std::get<3>(rpc_result);
150 clusters.insert(clusters.end(), std::make_move_iterator(rpc_clu.begin()),
151 std::make_move_iterator(rpc_clu.end()));
154 sizes.insert(sizes.end(), std::make_move_iterator(rpc_size.begin()), std::make_move_iterator(rpc_size.end()));
157 addresses.insert(addresses.end(), std::make_move_iterator(rpc_addr.begin()),
158 std::make_move_iterator(rpc_addr.end()));
161 indices.insert(indices.end(), std::make_move_iterator(rpc_ind.begin()), std::make_move_iterator(rpc_ind.end()));
166 cluPrefix[ithread + 1] = clusters.size();
167 sizePrefix[ithread + 1] = sizes.size();
168 addrPrefix[ithread + 1] = addresses.size();
169 indPrefix[ithread + 1] = indices.size();
174 for (
int i = 1; i < (nthreads + 1); i++) {
175 cluPrefix[i] += cluPrefix[i - 1];
176 sizePrefix[i] += sizePrefix[i - 1];
177 addrPrefix[i] += addrPrefix[i - 1];
178 indPrefix[i] += indPrefix[i - 1];
181 clustersFlat.resize(cluPrefix[nthreads]);
182 chanSizes.resize(sizePrefix[nthreads]);
183 chanAddresses.resize(addrPrefix[nthreads]);
184 digiInd.resize(indPrefix[nthreads]);
186 std::move(clusters.begin(), clusters.end(), clustersFlat.begin() + cluPrefix[ithread]);
187 std::move(sizes.begin(), sizes.end(), chanSizes.begin() + sizePrefix[ithread]);
188 std::move(addresses.begin(), addresses.end(), chanAddresses.begin() + addrPrefix[ithread]);
189 std::move(indices.begin(), indices.end(), digiInd.begin() + indPrefix[ithread]);
193 monitor.fTime = xpu::pop_timer();
194 monitor.fNumDigis = digiIn.size();
195 monitor.fNumHits = clustersFlat.size();
198 clusterTs =
PartitionedVector(std::move(clustersFlat), chanSizes, chanAddresses);