From f797e8ab0ab3cac8d4163478342aaf6d0d19d23d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 16 Sep 2026 21:15:55 +0200 Subject: [PATCH 1/5] Add DittoMC --- MC/config/ALICE3/ini/ditto_pp_136tev.ini | 6 ++ MC/config/ALICE3/pythia8/generator_DittoMC.C | 62 ++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 MC/config/ALICE3/ini/ditto_pp_136tev.ini create mode 100644 MC/config/ALICE3/pythia8/generator_DittoMC.C diff --git a/MC/config/ALICE3/ini/ditto_pp_136tev.ini b/MC/config/ALICE3/ini/ditto_pp_136tev.ini new file mode 100644 index 000000000..cefe555d6 --- /dev/null +++ b/MC/config/ALICE3/ini/ditto_pp_136tev.ini @@ -0,0 +1,6 @@ +[Diamond] +width[2]=6.0 + +[GeneratorExternal] +fileName=${O2DPG_MC_CONFIG_ROOT}/MC/config/ALICE3/pythia8/generator_DittoMC.C +funcName=generator_DittoMC("Ditto_tune_pythia8_inel_136tev.root") diff --git a/MC/config/ALICE3/pythia8/generator_DittoMC.C b/MC/config/ALICE3/pythia8/generator_DittoMC.C new file mode 100644 index 000000000..d454a9383 --- /dev/null +++ b/MC/config/ALICE3/pythia8/generator_DittoMC.C @@ -0,0 +1,62 @@ +#include "Ditto.h" + +#include +#include +#include +#include + +#if !defined(__CLING__) || defined(__ROOTCLING__) + +#include + +#include +#include + +#include +#include + +#endif + +// Ditto event generator + +class GeneratorDittoMC : public o2::eventgen::GeneratorPythia8 +{ + public: + /// Constructor + GeneratorDittoMC(const TString& tuneFile) : mGenerator(makeConfig(tuneFile)) + { + mPythia.readString("ProcessLevel:all = off"); + } + + bool generateEvent() override + { + mGenerator.generate(); + mGenerator.loadParticles(mPythia.event, true); + return true; + } + + /// Destructor + ~GeneratorDittoMC() = default; + + private: + static Ditto::Config makeConfig(const TString& tuneFile) + { + Ditto::Config config; + if (tuneFile.IsNull()) { + throw std::runtime_error("DITTO_TUNE_FILE must point to a Ditto tune file"); + } + config.tuneFile = tuneFile; + + const char* alienProcId = std::getenv("ALIEN_PROC_ID"); + config.seed = alienProcId ? static_cast(std::atoll(alienProcId)) : 0; + Printf("Using Ditto tune: %s and seed: %lu\n", config.tuneFile.c_str(), config.seed); + return config; + } + + Ditto::Generator mGenerator; +}; + +FairGenerator* generator_DittoMC(const TString& tuneFile) +{ + return new GeneratorDittoMC(tuneFile); +} From ac62decc6a1239fdf536191ef221213bb2699215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 21 Sep 2026 14:55:01 +0200 Subject: [PATCH 2/5] Update ditto_pp_136tev.ini --- MC/config/ALICE3/ini/ditto_pp_136tev.ini | 3 --- 1 file changed, 3 deletions(-) diff --git a/MC/config/ALICE3/ini/ditto_pp_136tev.ini b/MC/config/ALICE3/ini/ditto_pp_136tev.ini index cefe555d6..eed87b70f 100644 --- a/MC/config/ALICE3/ini/ditto_pp_136tev.ini +++ b/MC/config/ALICE3/ini/ditto_pp_136tev.ini @@ -1,6 +1,3 @@ -[Diamond] -width[2]=6.0 - [GeneratorExternal] fileName=${O2DPG_MC_CONFIG_ROOT}/MC/config/ALICE3/pythia8/generator_DittoMC.C funcName=generator_DittoMC("Ditto_tune_pythia8_inel_136tev.root") From dc3262a7f33f130c5a17f008fe05f1c521bc6afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 22 Sep 2026 17:14:08 +0200 Subject: [PATCH 3/5] Add test --- MC/config/ALICE3/ini/tests/ditto_pp_136tev.C | 1 + 1 file changed, 1 insertion(+) create mode 120000 MC/config/ALICE3/ini/tests/ditto_pp_136tev.C diff --git a/MC/config/ALICE3/ini/tests/ditto_pp_136tev.C b/MC/config/ALICE3/ini/tests/ditto_pp_136tev.C new file mode 120000 index 000000000..4103e578f --- /dev/null +++ b/MC/config/ALICE3/ini/tests/ditto_pp_136tev.C @@ -0,0 +1 @@ +pythia8_pp_ropes.C \ No newline at end of file From c04dd5af84f5a8b6b66b174605678ee89bb66590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Sat, 26 Sep 2026 11:18:24 +0200 Subject: [PATCH 4/5] Update generator_DittoMC.C --- MC/config/ALICE3/pythia8/generator_DittoMC.C | 50 ++++++++++---------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/MC/config/ALICE3/pythia8/generator_DittoMC.C b/MC/config/ALICE3/pythia8/generator_DittoMC.C index d454a9383..27fd8b66d 100644 --- a/MC/config/ALICE3/pythia8/generator_DittoMC.C +++ b/MC/config/ALICE3/pythia8/generator_DittoMC.C @@ -1,33 +1,26 @@ -#include "Ditto.h" - -#include -#include -#include -#include - -#if !defined(__CLING__) || defined(__ROOTCLING__) - -#include - +#include #include -#include #include -#include -#endif +#include +#include +#include +#include // Ditto event generator - class GeneratorDittoMC : public o2::eventgen::GeneratorPythia8 { public: /// Constructor - GeneratorDittoMC(const TString& tuneFile) : mGenerator(makeConfig(tuneFile)) + explicit GeneratorDittoMC(const TString& tuneFile) : mGenerator(makeConfig(tuneFile)) { + // We use the Pythia8 event only as the container passed to the O2 + // GeneratorPythia8 machinery. Particle production is handled by Ditto. mPythia.readString("ProcessLevel:all = off"); } + /// Generate one Ditto event and export it to the Pythia8 event record. bool generateEvent() override { mGenerator.generate(); @@ -35,21 +28,30 @@ class GeneratorDittoMC : public o2::eventgen::GeneratorPythia8 return true; } - /// Destructor - ~GeneratorDittoMC() = default; + /// Destructor + ~GeneratorDittoMC() override = default; private: + /// Build the Ditto runtime configuration. static Ditto::Config makeConfig(const TString& tuneFile) { - Ditto::Config config; if (tuneFile.IsNull()) { - throw std::runtime_error("DITTO_TUNE_FILE must point to a Ditto tune file"); + throw std::runtime_error("Ditto tune file must be specified"); + } + + Ditto::Config config; + config.mTuneFile = tuneFile.Data(); + + // Use the Grid process ID as the Ditto seed when available. + // Outside the Grid, seed 0 is used. + if (const char* alienProcId = std::getenv("ALIEN_PROC_ID")) { + config.mSeed = static_cast(std::strtoull(alienProcId, nullptr, 10)); + } else { + config.mSeed = static_cast(std::time(nullptr)); } - config.tuneFile = tuneFile; - const char* alienProcId = std::getenv("ALIEN_PROC_ID"); - config.seed = alienProcId ? static_cast(std::atoll(alienProcId)) : 0; - Printf("Using Ditto tune: %s and seed: %lu\n", config.tuneFile.c_str(), config.seed); + Printf("Using Ditto tune: %s and seed: %llu", config.mTuneFile.c_str(), static_cast(config.mSeed)); + return config; } From 7944f1f3c6edd71f36fac6c20c257dbd523c6c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Sat, 26 Sep 2026 11:18:44 +0200 Subject: [PATCH 5/5] Update ditto_pp_136tev.ini --- MC/config/ALICE3/ini/ditto_pp_136tev.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MC/config/ALICE3/ini/ditto_pp_136tev.ini b/MC/config/ALICE3/ini/ditto_pp_136tev.ini index eed87b70f..e44eb26f7 100644 --- a/MC/config/ALICE3/ini/ditto_pp_136tev.ini +++ b/MC/config/ALICE3/ini/ditto_pp_136tev.ini @@ -1,3 +1,3 @@ [GeneratorExternal] fileName=${O2DPG_MC_CONFIG_ROOT}/MC/config/ALICE3/pythia8/generator_DittoMC.C -funcName=generator_DittoMC("Ditto_tune_pythia8_inel_136tev.root") +funcName=generator_DittoMC("https://github.com/njacazio/DittoMC/releases/download/v1.0.0/Ditto_tune_pythia8_inel_136tev.root")