38 const std::shared_ptr<GOptions>& gopt,
39 const std::shared_ptr<GLogger>& log,
40 const std::shared_ptr<const gdynamicdigitization::dRoutinesMap>& dynamicRoutinesMap) -> std::vector<std::unique_ptr<GEventDataCollection>> {
41 std::mutex collectorMtx;
42 std::vector<std::unique_ptr<GEventDataCollection>> collected;
47 std::atomic<int> next{1};
53 std::vector<jthread_alias> pool;
55 pool.reserve(nthreads);
57 for (
int tid = 0; tid < nthreads; ++tid) {
59 pool.emplace_back([&, tid]
62 log->info(0,
"worker ", tid,
" started");
65 thread_local std::vector<std::unique_ptr<GEventDataCollection>> localRunData;
71 int evn = next.fetch_add(1, std::memory_order_relaxed);
72 if (evn > nevents)
break;
74 auto gheader = GEventHeader::create(gopt);
75 auto eventData = std::make_unique<GEventDataCollection>(gopt, std::move(gheader));
78 for (
unsigned i = 1; i < 3; i++) {
79 auto hit = GHit::create(gopt);
80 auto true_data = dynamicRoutinesMap->at(
plugin_name)->collectTrueInformation(hit, i);
81 auto digi_data = dynamicRoutinesMap->at(
plugin_name)->digitizeHit(hit, i);
83 eventData->addDetectorDigitizedData(
"ctof", std::move(digi_data));
84 eventData->addDetectorTrueInfoData(
"ctof", std::move(true_data));
87 log->info(0,
"worker ", tid,
" event ", evn,
" has ", eventData->getDataCollectionMap().at(
"ctof")->getDigitizedData().size(),
" digitized hits");
89 localRunData.emplace_back(std::move(eventData));
96 std::scoped_lock lk(collectorMtx);
97 for (
auto& evt : localRunData) {
99 if (collected.size() >= 2)
break;
100 collected.emplace_back(std::move(evt));
102 localRunData.clear();
105 log->info(0,
"worker ", tid,
" processed ", localCount,
" events");
115int main(
int argc,
char* argv[]) {
120 auto log = std::make_shared<GLogger>(gopts, SFUNCTION_NAME, PLUGIN_LOGGER);
122 constexpr int nevents = 10;
123 constexpr int nthreads = 8;
126 if (dynamicRoutinesMap->at(
plugin_name)->loadConstants(1,
"default") ==
false) {
127 log->error(1,
"Failed to load constants for dynamic routine",
plugin_name,
"for run number 1 with variation 'default'.");
133 for (
size_t i = 0; i < runData.size(); i++) { log->info(
" > Event ", i + 1,
" collected with local event number: ", 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 > >