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++) {
31 auto par = std::make_unique<cbm::algo::tof::ClusterizerRpcPar>();
38 par->fSigVel = rpcPar.
sigVel;
49 int32_t NbChan = rpcPar.
chanPar.size();
50 par->fChanPar.resize(NbChan);
52 for (int32_t Ch = 0; Ch < NbChan; Ch++) {
54 par->fChanPar[Ch].address = chanPar.
address;
55 par->fChanPar[Ch].cell.pos = ROOT::Math::XYZVector(tra_ptr[0], tra_ptr[1], tra_ptr[2]);
56 par->fChanPar[Ch].cell.rotation = ROOT::Math::Rotation3D(&rot_ptr[0], &rot_ptr[9]);
57 par->fChanPar[Ch].cell.sizeX = rpcPar.
cell.
sizeX;
58 par->fChanPar[Ch].cell.sizeY = rpcPar.
cell.
sizeY;
60 fAlgo.emplace_back(std::move(*par));
67 L_(info) <<
"--- Configured hitfinder algorithms for TOF.";
78 auto& clusterTs = std::get<0>(result);
79 auto& monitor = std::get<1>(result);
80 auto& digiInd = std::get<2>(result);
84 xpu::push_timer(
"TofHitfindChanSort");
85 for (
size_t idigi = 0; idigi < digiIn.size(); idigi++) {
89 const double SmType = pDigi->
GetType();
90 const double Sm = pDigi->
GetSm();
91 const double Rpc = pDigi->
GetRpc();
92 const int NbRpc =
fNbRpc[SmType];
93 if (SmType >=
fNbSm.size() || Sm * NbRpc + Rpc >=
fNbSm[SmType] * NbRpc) {
97 fStorDigi[SmType][Sm * NbRpc + Rpc].emplace_back(*pDigi, idigi);
99 monitor.fSortTime = xpu::pop_timer();
106 std::vector<size_t> cluPrefix;
107 std::vector<size_t> sizePrefix;
108 std::vector<size_t> addrPrefix;
109 std::vector<size_t> indPrefix;
111 xpu::push_timer(
"TofHitfind");
112 xpu::t_add_bytes(digiIn.size_bytes());
121 cluPrefix.resize(nthreads + 1);
122 sizePrefix.resize(nthreads + 1);
123 addrPrefix.resize(nthreads + 1);
124 indPrefix.resize(nthreads + 1);
129 auto& clusters = std::get<0>(localresult);
130 auto& sizes = std::get<1>(localresult);
131 auto& addresses = std::get<2>(localresult);
132 auto& indices = std::get<3>(localresult);
134 CBM_OMP(
for schedule(dynamic) nowait)
135 for (uint32_t iRpc = 0; iRpc <
fAlgo.size(); iRpc++) {
138 std::vector<std::pair<CbmTofDigi, int32_t>>& digiExp = *
fStorDigiPtr[iRpc];
142 auto rpc_result =
fAlgo[iRpc](digiExp);
143 auto& rpc_clu = std::get<0>(rpc_result);
144 auto& rpc_size = std::get<1>(rpc_result);
145 auto& rpc_addr = std::get<2>(rpc_result);
146 auto& rpc_ind = std::get<3>(rpc_result);
149 clusters.insert(clusters.end(), std::make_move_iterator(rpc_clu.begin()),
150 std::make_move_iterator(rpc_clu.end()));
153 sizes.insert(sizes.end(), std::make_move_iterator(rpc_size.begin()), std::make_move_iterator(rpc_size.end()));
156 addresses.insert(addresses.end(), std::make_move_iterator(rpc_addr.begin()),
157 std::make_move_iterator(rpc_addr.end()));
160 indices.insert(indices.end(), std::make_move_iterator(rpc_ind.begin()), std::make_move_iterator(rpc_ind.end()));
165 cluPrefix[ithread + 1] = clusters.size();
166 sizePrefix[ithread + 1] = sizes.size();
167 addrPrefix[ithread + 1] = addresses.size();
168 indPrefix[ithread + 1] = indices.size();
173 for (
int i = 1; i < (nthreads + 1); i++) {
174 cluPrefix[i] += cluPrefix[i - 1];
175 sizePrefix[i] += sizePrefix[i - 1];
176 addrPrefix[i] += addrPrefix[i - 1];
177 indPrefix[i] += indPrefix[i - 1];
180 clustersFlat.resize(cluPrefix[nthreads]);
181 chanSizes.resize(sizePrefix[nthreads]);
182 chanAddresses.resize(addrPrefix[nthreads]);
183 digiInd.resize(indPrefix[nthreads]);
185 std::move(clusters.begin(), clusters.end(), clustersFlat.begin() + cluPrefix[ithread]);
186 std::move(sizes.begin(), sizes.end(), chanSizes.begin() + sizePrefix[ithread]);
187 std::move(addresses.begin(), addresses.end(), chanAddresses.begin() + addrPrefix[ithread]);
188 std::move(indices.begin(), indices.end(), digiInd.begin() + indPrefix[ithread]);
192 monitor.fTime = xpu::pop_timer();
193 monitor.fNumDigis = digiIn.size();
194 monitor.fNumHits = clustersFlat.size();
197 clusterTs =
PartitionedVector(std::move(clustersFlat), chanSizes, chanAddresses);