From c68878a9c6fd1660c0eb195b5e02403a750c8c41 Mon Sep 17 00:00:00 2001 From: Marco Giacalone Date: Sun, 2 Feb 2025 20:01:00 +0100 Subject: [PATCH] Added static variable for number of events in Generator --- Generators/include/Generators/Generator.h | 6 ++++++ Generators/include/Generators/GeneratorHybrid.h | 3 --- Generators/src/Generator.cxx | 2 +- Generators/src/GeneratorFactory.cxx | 1 - Generators/src/GeneratorHybrid.cxx | 2 +- Generators/src/GeneratorService.cxx | 2 ++ macro/o2sim.C | 4 ++++ run/O2PrimaryServerDevice.h | 5 +++++ run/dpl_eventgen.cxx | 7 +++++++ 9 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Generators/include/Generators/Generator.h b/Generators/include/Generators/Generator.h index 7181bcbc6682d..640cc80931862 100644 --- a/Generators/include/Generators/Generator.h +++ b/Generators/include/Generators/Generator.h @@ -85,9 +85,12 @@ class Generator : public FairGenerator void setTriggerMode(ETriggerMode_t val) { mTriggerMode = val; }; void addTrigger(Trigger trigger) { mTriggers.push_back(trigger); }; void addDeepTrigger(DeepTrigger trigger) { mDeepTriggers.push_back(trigger); }; + // setter for global number of events + static void setTotalNEvents(unsigned int& n) { gTotalNEvents = n; } /** getters **/ const std::vector& getParticles() const { return mParticles; }; //! + static unsigned int getTotalNEvents() { return gTotalNEvents; }; /** other **/ void clearParticles() { mParticles.clear(); }; @@ -152,6 +155,9 @@ class Generator : public FairGenerator // the current ID of the sub-generator used in the current event (if applicable) int mSubGeneratorId = -1; + // global static information about (upper limit of) number of events to be generated + static unsigned int gTotalNEvents; + ClassDefOverride(Generator, 2); }; /** class Generator **/ diff --git a/Generators/include/Generators/GeneratorHybrid.h b/Generators/include/Generators/GeneratorHybrid.h index 21f669776d944..955240d6a28fa 100644 --- a/Generators/include/Generators/GeneratorHybrid.h +++ b/Generators/include/Generators/GeneratorHybrid.h @@ -63,8 +63,6 @@ class GeneratorHybrid : public Generator Bool_t importParticles() override; void updateHeader(o2::dataformats::MCEventHeader* eventHeader) override; - void setNEvents(int n) { mNEvents = n; } - Bool_t parseJSON(const std::string& path); Bool_t confSetter(const auto& gen); template @@ -116,7 +114,6 @@ class GeneratorHybrid : public Generator std::atomic mStopFlag; bool mIsInitialized = false; - int mNEvents = -1; // the number of events to be done, if known (helps initiating cleanup) o2::dataformats::MCEventHeader mMCEventHeader; // to capture event headers enum class GenMode { diff --git a/Generators/src/Generator.cxx b/Generators/src/Generator.cxx index ed7bf0a99bbe3..9204ede98215e 100644 --- a/Generators/src/Generator.cxx +++ b/Generators/src/Generator.cxx @@ -29,7 +29,7 @@ namespace eventgen { std::atomic Generator::InstanceCounter{0}; - +unsigned int Generator::gTotalNEvents = 0; /*****************************************************************/ /*****************************************************************/ diff --git a/Generators/src/GeneratorFactory.cxx b/Generators/src/GeneratorFactory.cxx index 5db1354a12908..8a6001b2cd5e6 100644 --- a/Generators/src/GeneratorFactory.cxx +++ b/Generators/src/GeneratorFactory.cxx @@ -285,7 +285,6 @@ void GeneratorFactory::setPrimaryGenerator(o2::conf::SimConfig const& conf, Fair return; } auto hybrid = new o2::eventgen::GeneratorHybrid(config); - hybrid->setNEvents(conf.getNEvents()); primGen->AddGenerator(hybrid); #endif } else { diff --git a/Generators/src/GeneratorHybrid.cxx b/Generators/src/GeneratorHybrid.cxx index 03a78eb852eb6..578dbfc1b110d 100644 --- a/Generators/src/GeneratorHybrid.cxx +++ b/Generators/src/GeneratorHybrid.cxx @@ -407,7 +407,7 @@ bool GeneratorHybrid::importParticles() mseqCounter++; mEventCounter++; - if (mEventCounter == mNEvents) { + if (mEventCounter == getTotalNEvents()) { LOG(info) << "HybridGen: Stopping TBB task pool"; mStopFlag = true; } diff --git a/Generators/src/GeneratorService.cxx b/Generators/src/GeneratorService.cxx index 21c25aeb73720..902b482dc839b 100644 --- a/Generators/src/GeneratorService.cxx +++ b/Generators/src/GeneratorService.cxx @@ -12,6 +12,7 @@ #include "Generators/GeneratorService.h" #include "Generators/GeneratorFactory.h" #include "SimConfig/SimConfig.h" +#include "Generators/Generator.h" #include "DataFormatsCalibration/MeanVertexObject.h" using namespace o2::eventgen; @@ -23,6 +24,7 @@ void GeneratorService::initService(std::string const& genName, auto localSimConfig = o2::conf::SimConfig::make(); localSimConfig.getConfigData().mGenerator = genName; localSimConfig.getConfigData().mTrigger = triggerName; + localSimConfig.getConfigData().mNEvents = o2::eventgen::Generator::getTotalNEvents(); o2::eventgen::GeneratorFactory::setPrimaryGenerator(localSimConfig, &mPrimGen); diff --git a/macro/o2sim.C b/macro/o2sim.C index 4bd2ff4e4d9cb..7d5faa544249c 100644 --- a/macro/o2sim.C +++ b/macro/o2sim.C @@ -13,6 +13,7 @@ #if !defined(__CLING__) || defined(__ROOTCLING__) #include #include +#include #include "SimulationDataFormat/O2DatabasePDG.h" #include "SimulationDataFormat/MCEventHeader.h" #include @@ -61,6 +62,9 @@ void check_notransport() FairRunSim* o2sim_init(bool asservice, bool evalmat = false) { auto& confref = o2::conf::SimConfig::Instance(); + // set the global information about the number of events to be generated + unsigned int nTotalEvents = confref.getNEvents(); + o2::eventgen::Generator::setTotalNEvents(nTotalEvents); // initialize CCDB service auto& ccdbmgr = o2::ccdb::BasicCCDBManager::instance(); // fix the timestamp early diff --git a/run/O2PrimaryServerDevice.h b/run/O2PrimaryServerDevice.h index 1db1109f573e8..4b313a7ca9499 100644 --- a/run/O2PrimaryServerDevice.h +++ b/run/O2PrimaryServerDevice.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -87,6 +88,10 @@ class O2PrimaryServerDevice final : public fair::mq::Device ccdbmgr.setURL(conf.getConfigData().mCCDBUrl); ccdbmgr.setTimestamp(conf.getTimestamp()); + // set the global information about the number of events to be generated + unsigned int nTotalEvents = conf.getNEvents(); + o2::eventgen::Generator::setTotalNEvents(nTotalEvents); + // init magnetic field as it might be needed by the generator if (TGeoGlobalMagField::Instance()->GetField() == nullptr) { TGeoGlobalMagField::Instance()->SetField(o2::base::SimFieldUtils::createMagField()); diff --git a/run/dpl_eventgen.cxx b/run/dpl_eventgen.cxx index c033aafddc367..6202e965f3e8a 100644 --- a/run/dpl_eventgen.cxx +++ b/run/dpl_eventgen.cxx @@ -16,6 +16,7 @@ #include "SimulationDataFormat/MCTrack.h" #include "Framework/runDataProcessing.h" #include +#include #include #include #include // simple timer from ROOT @@ -63,6 +64,12 @@ struct GeneratorTask { // update config key params o2::conf::ConfigurableParam::updateFromFile(iniFile); o2::conf::ConfigurableParam::updateFromString((std::string)params); + // set the number of events in the static Generator variable gTotalNEvents. + // Variable is unset if nEvents exceeds the uint maximum value + if (nEvents <= std::numeric_limits::max()) { + unsigned int castNEvents = static_cast(nEvents); + o2::eventgen::Generator::setTotalNEvents(castNEvents); + } // initialize the service if (vtxmode == o2::conf::VertexMode::kDiamondParam) { genservice->initService(generator, trigger, o2::eventgen::DiamondParamVertexOption());