From 80ed3cfbda25fe3d0e4757166208c7f2a0fcca86 Mon Sep 17 00:00:00 2001 From: Marco Giacalone Date: Mon, 14 Sep 2026 14:05:43 +0200 Subject: [PATCH] Added user hook for triggered events --- .../generator_pythia8_hfhadron_to_nuclei.C | 16 ++++++++++++++++ .../pythia8/hooks/pythia8_userhooks_qqbar.C | 8 ++++++++ 2 files changed, 24 insertions(+) diff --git a/MC/config/PWGHF/external/generator/generator_pythia8_hfhadron_to_nuclei.C b/MC/config/PWGHF/external/generator/generator_pythia8_hfhadron_to_nuclei.C index a2aadef89..339b79eb8 100644 --- a/MC/config/PWGHF/external/generator/generator_pythia8_hfhadron_to_nuclei.C +++ b/MC/config/PWGHF/external/generator/generator_pythia8_hfhadron_to_nuclei.C @@ -9,6 +9,7 @@ R__ADD_INCLUDE_PATH($O2DPG_MC_CONFIG_ROOT) #include "MC/config/common/external/generator/CoalescencePythia8.h" +#include "MC/config/PWGHF/pythia8/hooks/pythia8_userhooks_qqbar.C" using namespace Pythia8; @@ -60,6 +61,16 @@ class GeneratorPythia8HFHadToNuclei : public o2::eventgen::GeneratorPythia8 { addSubGenerator(0, "Minimum bias"); addSubGenerator(1, "HF + Coalescence"); + + // Bias parton-level generation towards bbbar production at midrapidity, but only + // while generating the triggered events. Without this, finding the requested b-hadron + // can stall the jobs for a very long time + mBbbarBiasHook = new UserHooks_qqbar(); + mBbbarBiasHook->setPDG(5); + mBbbarBiasHook->setRapidity(mHadRapidityMin, mHadRapidityMax); + mBbbarBiasHook->setActive(false); + setUserHooks(mBbbarBiasHook); + return o2::eventgen::GeneratorPythia8::Init(); } @@ -93,11 +104,13 @@ class GeneratorPythia8HFHadToNuclei : public o2::eventgen::GeneratorPythia8 // Generate event of interest bool genOk = false; + mBbbarBiasHook->setActive(true); while (!genOk) { if (GeneratorPythia8::generateEvent()) { genOk = selectEvent(mPythia.event); } } + mBbbarBiasHook->setActive(false); notifySubGenerator(1); } else { // Generate minimum-bias event @@ -178,6 +191,9 @@ class GeneratorPythia8HFHadToNuclei : public o2::eventgen::GeneratorPythia8 float mHadRapidityMax; unsigned int mUsedSeed; + // Bias towards bbbar at midrapidity, active only while generating HF-triggered events + UserHooks_qqbar* mBbbarBiasHook{nullptr}; + // Control gap-triggering unsigned long long mGeneratedEvents; int mInverseTriggerRatio; diff --git a/MC/config/PWGHF/pythia8/hooks/pythia8_userhooks_qqbar.C b/MC/config/PWGHF/pythia8/hooks/pythia8_userhooks_qqbar.C index 9cbf6fe27..8dcf2b4cd 100644 --- a/MC/config/PWGHF/pythia8/hooks/pythia8_userhooks_qqbar.C +++ b/MC/config/PWGHF/pythia8/hooks/pythia8_userhooks_qqbar.C @@ -16,6 +16,10 @@ class UserHooks_qqbar : public Pythia8::UserHooks bool canVetoPartonLevel() override { return true; }; bool doVetoPartonLevel(const Pythia8::Event& event) override { + // Veto runtime condition + if (!mActive) { + return false; + } // search for c-cbar mother with at least one c at midrapidity for (int ipa = 0; ipa < event.size(); ++ipa) { auto daughterList = event[ipa].daughterList(); @@ -40,11 +44,15 @@ class UserHooks_qqbar : public Pythia8::UserHooks mRapidityMin = valMin; mRapidityMax = valMax; }; + // Allows the veto to be switched on/off at run time, e.g. so that a generator + // alternating between biased and unbiased events can apply the bias selectively. + void setActive(bool val) { mActive = val; }; private: int mPDG = 4; double mRapidityMin = -1.5; double mRapidityMax = 1.5; + bool mActive = true; }; Pythia8::UserHooks*