diff --git a/algo/unpack/Unpack.cxx b/algo/unpack/Unpack.cxx index b0b1c2aa95768a19acf3cc8464e0730131d9574f..b4df2a746c341ba74b14b5c645eaff856f1cefaa 100644 --- a/algo/unpack/Unpack.cxx +++ b/algo/unpack/Unpack.cxx @@ -30,7 +30,7 @@ namespace cbm::algo if (DetectorEnabled(fles::SubsystemIdentifier::STS)) { xpu::scoped_timer t1("STS"); - ParallelMsLoop(digiTs.fData.fSts.fDigis, monitor.fSts, *timeslice, 0x20); + ParallelMsLoop(fParallelStsSetup, digiTs.fData.fSts.fDigis, monitor.fSts, *timeslice, fAlgoSts, 0x20); } // --- Component loop @@ -342,14 +342,16 @@ namespace cbm::algo // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- - void Unpack::ParallelMsLoop(std::vector<CbmStsDigi>& digisOut, std::vector<UnpackStsMonitorData>& monitorOut, - const fles::Timeslice& ts, u8 sys_ver) + template<class Digi, class UnpackAlgo, class Monitor> + void Unpack::ParallelMsLoop(ParallelSetup<Digi, Monitor>& setup, std::vector<Digi>& digisOut, + std::vector<Monitor>& monitorOut, const fles::Timeslice& ts, + const std::map<u16, UnpackAlgo>& algos, u8 sys_ver) { - const auto& msContent = fParallelStsSetup.msContent; - const auto& msDesc = fParallelStsSetup.msDescriptors; - const auto& msEqIds = fParallelStsSetup.msEquipmentIds; - auto& monitor = fParallelStsSetup.msMonitorData; - auto& msDigis = fParallelStsSetup.msDigis; + const auto& msContent = setup.msContent; + const auto& msDesc = setup.msDescriptors; + const auto& msEqIds = setup.msEquipmentIds; + auto& monitor = setup.msMonitorData; + auto& msDigis = setup.msDigis; size_t numMs = msDigis.size(); xpu::push_timer("Unpack"); diff --git a/algo/unpack/Unpack.h b/algo/unpack/Unpack.h index 26189dd835a9bbfe6e606653d837f66bcf4e7810..dd87b0dd2da0a9f50400be8a2d834d0d485aa3c4 100644 --- a/algo/unpack/Unpack.h +++ b/algo/unpack/Unpack.h @@ -131,12 +131,13 @@ namespace cbm::algo } private: // types + template<class Digi, class Monitor> struct ParallelSetup { std::vector<u16> msEquipmentIds; std::vector<fles::MicrosliceDescriptor> msDescriptors; std::vector<const u8*> msContent; - std::vector<std::vector<sts::Digi>> msDigis; - std::vector<UnpackStsMonitorData> msMonitorData; + std::vector<std::vector<Digi>> msDigis; + std::vector<Monitor> msMonitorData; }; private: // methods @@ -150,8 +151,9 @@ namespace cbm::algo void ParallelInit(const fles::Timeslice& timeslice); /** @brief Parallel microslice loop **/ - void ParallelMsLoop(std::vector<CbmStsDigi>& digisOut, std::vector<UnpackStsMonitorData>& monitor, - const fles::Timeslice& ts, u8 sys_ver); + template<class Digi, class UnpackAlgo, class Monitor> + void ParallelMsLoop(ParallelSetup<Digi, Monitor>& setup, std::vector<Digi>& digisOut, std::vector<Monitor>& monitor, + const fles::Timeslice& ts, const std::map<u16, UnpackAlgo>& algos, u8 sys_ver); private: // members @@ -186,7 +188,7 @@ namespace cbm::algo {fles::SubsystemIdentifier::T0, 0}, {fles::SubsystemIdentifier::TRD, 1300}, {fles::SubsystemIdentifier::TRD2D, -510}}; /** @brief Parallel STS Setup */ - ParallelSetup fParallelStsSetup = {}; + ParallelSetup<sts::Digi, UnpackStsMonitorData> fParallelStsSetup = {}; }; } // namespace cbm::algo