49 const std::shared_ptr<GLogger>& log,
50 const std::shared_ptr<const gdynamicdigitization::dRoutinesMap>& dynamicRoutinesMap,
51 const std::shared_ptr<GOptions>& gopts) {
55 std::atomic<int> next{1};
61 std::vector<jthread_alias> pool;
63 pool.reserve(nthreads);
65 for (
int tid = 0; tid < nthreads; ++tid) {
67 pool.emplace_back([&, tid]
70 log->info(0,
"worker ", tid,
" started");
73 thread_local std::vector<std::unique_ptr<GEventDataCollection>> localRunData;
77 for (
auto& [name,
gstreamer] : *gstreamer_map) {
79 log->error(1,
"Failed to open connection for GStreamer ", name,
" in thread ", tid);
87 int evn = next.fetch_add(1, std::memory_order_relaxed);
89 if (evn > nevents)
break;
93 auto eventData = std::make_shared<GEventDataCollection>(gopts, std::move(gevent_header));
97 for (
unsigned i = 1; i < 11; i++) {
99 auto true_data = dynamicRoutinesMap->at(
plugin_name)->collectTrueInformation(hit, i);
100 auto digi_data = dynamicRoutinesMap->at(
plugin_name)->digitizeHit(hit, i);
102 eventData->addDetectorDigitizedData(
"ctof", std::move(digi_data));
103 eventData->addDetectorTrueInfoData(
"ctof", std::move(true_data));
106 log->info(0,
"worker ", tid,
" event ", evn,
" has ",
107 eventData->getDataCollectionMap().at(
"ctof")->getDigitizedData().size(),
" digitized hits");
111 for (
const auto& [name,
gstreamer] : *gstreamer_map) {
120 for (
const auto& [name,
gstreamer] : *gstreamer_map) {
122 log->error(1,
"Failed to close connection for GStreamer ", name,
" in thread ", tid);
126 log->info(0,
"worker ", tid,
" processed ", localCount,
" events");
void run_simulation_in_threads(int nevents, int nthreads, const std::shared_ptr< GLogger > &log, const std::shared_ptr< const gdynamicdigitization::dRoutinesMap > &dynamicRoutinesMap, const std::shared_ptr< GOptions > &gopts)
Run a synthetic event simulation in multiple worker threads and publish results via gstreamer.