50 const std::shared_ptr<GOptions>& gopt,
51 const std::shared_ptr<GLogger>& log,
52 const std::shared_ptr<const gdynamicdigitization::dRoutinesMap>& dynamicRoutinesMap)
53 -> std::vector<std::unique_ptr<GEventDataCollection>> {
54 std::mutex collectorMtx;
55 std::vector<std::unique_ptr<GEventDataCollection>> collected;
58 std::atomic<int> next{1};
61 std::vector<jthread_alias> pool;
62 pool.reserve(nthreads);
64 for (
int tid = 0; tid < nthreads; ++tid) {
65 pool.emplace_back([&, tid] {
66 log->info(0,
"worker %1 started", tid);
69 thread_local std::vector<std::unique_ptr<GEventDataCollection>> localRunData;
72 int evn = next.fetch_add(1, std::memory_order_relaxed);
73 if (evn > nevents)
break;
76 auto eventData = std::make_unique<GEventDataCollection>(gopt, std::move(gevent_header));
79 for (
unsigned i = 1; i < 3; i++) {
81 auto true_data = dynamicRoutinesMap->at(
plugin_name)->collectTrueInformation(hit, i);
82 auto digi_data = dynamicRoutinesMap->at(
plugin_name)->digitizeHit(hit, i);
84 eventData->addDetectorDigitizedData(
"ctof", std::move(digi_data));
85 eventData->addDetectorTrueInfoData(
"ctof", std::move(true_data));
89 0,
"worker %1 event %2 has %3 digitized hits", tid, evn,
90 eventData->getDataCollectionMap().at(
"ctof")->getDigitizedData().size());
92 localRunData.emplace_back(std::move(eventData));
98 std::scoped_lock lk(collectorMtx);
99 for (
auto& evt : localRunData) {
100 if (collected.size() >= 2)
break;
101 collected.emplace_back(std::move(evt));
103 localRunData.clear();
106 log->info(0,
"worker %1 processed %2 events", tid, localCount);
128int main(
int argc,
char* argv[]) {
136 constexpr int nevents = 10;
137 constexpr int nthreads = 8;
141 if (dynamicRoutinesMap->at(
plugin_name)->loadConstants(1,
"default") ==
false) {
143 1,
"Failed to load constants for dynamic routine %1 for run number 1 with variation 'default'.",
150 for (
size_t i = 0; i < runData.size(); i++) {
151 log->info(
" > Event %1 collected with local event number: %2", i + 1, runData[i]->getEventNumber());
auto run_simulation_in_threads(int nevents, int nthreads, const std::shared_ptr< GOptions > &gopt, const std::shared_ptr< GLogger > &log, const std::shared_ptr< const gdynamicdigitization::dRoutinesMap > &dynamicRoutinesMap) -> std::vector< std::unique_ptr< GEventDataCollection > >
Runs a small simulated event loop using multiple worker threads.