diff --git a/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFgamma.C b/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFgamma.C index a00c1cc03..10e6d7e23 100644 --- a/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFgamma.C +++ b/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFgamma.C @@ -3,8 +3,10 @@ R__ADD_INCLUDE_PATH($O2DPG_ROOT/MC/config/PWGDQ/external/generator) R__ADD_INCLUDE_PATH($O2DPG_ROOT/MC/config/PWGEM/external/generator) R__LOAD_LIBRARY(libpythia6) R__LOAD_LIBRARY(libEGPythia6) -#include "GeneratorCocktailWithGap.C" #include "GeneratorEvtGen.C" +#include "GeneratorCocktail.C" +#include "Generators/GeneratorPythia8.h" +#include "Pythia8/Pythia.h" using namespace std; using namespace Pythia8; @@ -15,7 +17,6 @@ namespace eventgen { class CocktailParam : public GeneratorTGenerator { public: CocktailParam(GeneratorParam *thisGenerator) - //: GeneratorTGenerator("thisGenerator") { : GeneratorTGenerator(thisGenerator->GetName()) { setTGenerator(thisGenerator); }; @@ -26,94 +27,128 @@ private: GeneratorParam *thisGenerator = nullptr; }; +//my generator class +class GeneratorPythia8GapTriggeredLFgamma : public GeneratorPythia8 { + + public: + GeneratorPythia8GapTriggeredLFgamma() : GeneratorPythia8() { + mGeneratedEvents = 0; + mInverseTriggerRatio = 1; + fGeneratorCocktail = 0x0; + }; + + GeneratorPythia8GapTriggeredLFgamma(int lInputTriggerRatio, float yMin, float yMax, int nPart) : GeneratorPythia8() { + mGeneratedEvents = 0; + mInverseTriggerRatio = lInputTriggerRatio; + // LMee cocktail settings: + float minPt = 0; + float maxPt = 25; + float phiMin = 0.; + float phiMax = 360.; + Weighting_t weightMode = kNonAnalog; + + //create cocktail generator : pi0, eta + fGeneratorCocktail = new o2::eventgen::GeneratorEvtGen(); + + auto decayer = new PythiaDecayerConfig(); + + //Param + GeneratorParamEMlib *emlib = new GeneratorParamEMlib(); + + // pi0 + auto genPizero = new GeneratorParam(nPart, emlib, GeneratorParamEMlib::kPizero, "pizero"); // 111 + genPizero->SetName("pizero"); + genPizero->SetMomentumRange(0., 25.); + genPizero->SetPtRange(minPt, maxPt); + genPizero->SetYRange(yMin, yMax); + genPizero->SetPhiRange(phiMin, phiMax); + genPizero->SetWeighting(weightMode); // flat pt, y and v2 zero + genPizero->SetSelectAll(kTRUE); + genPizero->SetDecayer(decayer); + genPizero->Init(); + CocktailParam *newgenpizero = new CocktailParam(genPizero); + + // eta + auto geneta = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kEta,"eta"); // 221 + geneta->SetName("eta"); + geneta->SetMomentumRange(0., 25.); + geneta->SetPtRange(minPt, maxPt); + geneta->SetYRange(yMin, yMax); + geneta->SetPhiRange(phiMin, phiMax); + geneta->SetWeighting(weightMode); // flat pt, y and v2 zero + geneta->SetSelectAll(kTRUE); + geneta->SetDecayer(decayer); + geneta->Init(); + CocktailParam *newgeneta = new CocktailParam(geneta); + + cout << "add pi0 for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenpizero, 1); + cout << "add eta for signal" << endl; + fGeneratorCocktail->AddGenerator(newgeneta, 1); + + // print debug + fGeneratorCocktail->PrintDebug(); + fGeneratorCocktail->Init(); + + addSubGenerator(0, "gap mb pythia"); + addSubGenerator(1, "injected cocktail"); + + }; + + ~GeneratorPythia8GapTriggeredLFgamma() = default; + + protected: + bool generateEvent() override + { + GeneratorPythia8::generateEvent(); + + if (mGeneratedEvents % mInverseTriggerRatio == 0){ // add injected prompt signals to the stack + fGeneratorCocktail->generateEvent(); + notifySubGenerator(1); + } else { // gap event + notifySubGenerator(0); + } + mGeneratedEvents++; + return true; + } + + bool importParticles() override + { + GeneratorPythia8::importParticles(); + + bool genOk = false; + if ((mGeneratedEvents-1) % mInverseTriggerRatio == 0){ // add injected prompt signals to the stack + fGeneratorCocktail->importParticles(); + int originalSize = mParticles.size(); + for(int ipart=0; ipart < fGeneratorCocktail->getParticles().size(); ipart++){ + TParticle part = TParticle(fGeneratorCocktail->getParticles().at(ipart)); + if(part.GetFirstMother() >= 0) part.SetFirstMother(part.GetFirstMother() + originalSize); + if(part.GetFirstDaughter() >= 0) part.SetFirstDaughter(part.GetFirstDaughter() + originalSize); + if(part.GetLastDaughter() >= 0) part.SetLastDaughter(part.GetLastDaughter() + originalSize); + mParticles.push_back(part); + // encodeParticleStatusAndTracking method already called in GeneratorEvtGen.C + } + fGeneratorCocktail->clearParticles(); + } + + return true; + } + + private: + GeneratorEvtGen *fGeneratorCocktail; + // Control gap-triggering + unsigned long long mGeneratedEvents; + int mInverseTriggerRatio; +}; + } // close eventgen } // close o2 -// Predefined generators: -// this function should be called in ini file. -FairGenerator *GeneratorPythia8GapTriggeredLFgamma_ForEM(TString configsignal = "$O2DPG_ROOT/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg", int inputTriggerRatio = 5, float yMin=-1.2, float yMax=1.2, int nPart = 1) { - printf("configsignal = %s\n", configsignal.Data()); - - //create cocktail generator : mb pythia8, pi0, eta, eta', rho, omega, phi, j/psi, psi(2s) - auto genCocktailEvtGen = new o2::eventgen::GeneratorEvtGen(); - genCocktailEvtGen->setInputTriggerRatio(inputTriggerRatio); - - // // EXODUS decayer - TString O2DPG_ROOT = TString(getenv("O2DPG_ROOT")); - auto decayer = new PythiaDecayerConfig(); - decayer->SetDecayerExodus(); - TString useLMeeDecaytable = "$O2DPG_ROOT/MC/config/PWGEM/decaytables/decaytable_LMee.dat"; - useLMeeDecaytable=useLMeeDecaytable.ReplaceAll("$O2DPG_ROOT",O2DPG_ROOT); - useLMeeDecaytable=useLMeeDecaytable.ReplaceAll("${O2DPG_ROOT}",O2DPG_ROOT); - decayer->SetDecayTableFile(useLMeeDecaytable.Data()); - decayer->ReadDecayTable(); - - // pythia8 +// Predefined generators: // this function should be called in ini file. +FairGenerator *GeneratorPythia8GapTriggeredLFgamma_ForEM(int inputTriggerRatio = 5, float yMin=-1.2, float yMax=1.2, int nPart = 1) { + auto myGen = new GeneratorPythia8GapTriggeredLFgamma(inputTriggerRatio, yMin, yMax, nPart); auto seed = (gRandom->TRandom::GetSeed() % 900000000); - o2::eventgen::GeneratorPythia8* mb_p8 = new o2::eventgen::GeneratorPythia8("mb_p8", "mb_p8"); - configsignal = configsignal.ReplaceAll("$O2DPG_ROOT",O2DPG_ROOT); - configsignal = configsignal.ReplaceAll("${O2DPG_ROOT}",O2DPG_ROOT); - mb_p8->readFile(configsignal.Data()); - mb_p8->readString("Random:setSeed on"); - mb_p8->readString("Random:seed " + std::to_string(seed)); - mb_p8->Init(); - - cout << "add mb pythia8 for gap" << endl; - genCocktailEvtGen->addGeneratorGap(mb_p8, 1); - - cout << "add mb pythia8 for signal" << endl; - genCocktailEvtGen->addGeneratorSig(mb_p8, 1); - - //Param - GeneratorParamEMlib *emlib = new GeneratorParamEMlib(); - - // LMee cocktail settings: - float minPt = 0; - float maxPt = 25; - float minRap = yMin; - float maxRap = yMax; - float phiMin = 0.; - float phiMax = 360.; - Weighting_t weightMode = kNonAnalog; - - // pi0 - auto genPizero = new GeneratorParam(nPart, emlib, GeneratorParamEMlib::kPizero, "pizero"); // 111 - genPizero->SetName("pizero"); - genPizero->SetMomentumRange(0., 1.e6); - genPizero->SetPtRange(minPt, maxPt); - genPizero->SetYRange(minRap, maxRap); - genPizero->SetPhiRange(phiMin, phiMax); - genPizero->SetWeighting(weightMode); // flat pt, y and v2 zero - genPizero->SetDecayer(decayer); // EXODUS - genPizero->SetForceDecay(kAll); - genPizero->SetForceGammaConversion(kFALSE); - genPizero->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma - genPizero->Init(); - CocktailParam *newgenpizero = new CocktailParam(genPizero); - - // eta - auto geneta = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kEta,"eta"); // 221 - geneta->SetName("eta"); - geneta->SetMomentumRange(0., 1.e6); - geneta->SetPtRange(minPt, maxPt); - geneta->SetYRange(minRap, maxRap); - geneta->SetPhiRange(phiMin, phiMax); - geneta->SetWeighting(weightMode); // flat pt, y and v2 zero - geneta->SetDecayer(decayer); // EXODUS - geneta->SetForceDecay(kAll); - geneta->SetForceGammaConversion(kFALSE); - geneta->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma - geneta->Init(); - CocktailParam *newgeneta = new CocktailParam(geneta); - - cout << "add pi0 for signal" << endl; - genCocktailEvtGen->addGeneratorSig(newgenpizero, 1); - cout << "add eta for signal" << endl; - genCocktailEvtGen->addGeneratorSig(newgeneta, 1); - - // print debug - genCocktailEvtGen->PrintDebug(); - - return genCocktailEvtGen; + myGen->readString("Random:setSeed on"); + myGen->readString("Random:seed " + std::to_string(seed)); + return myGen; } - diff --git a/MC/config/PWGEM/ini/Generator_GapTriggered_LFgamma_np1_gap5.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFgamma_np1_gap5.ini new file mode 100644 index 000000000..399d57cd5 --- /dev/null +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFgamma_np1_gap5.ini @@ -0,0 +1,9 @@ +### The setup uses an external event generator +### This part sets the path of the file and the function call to retrieve it + +[GeneratorExternal] +fileName = ${O2DPG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFgamma.C +funcName = GeneratorPythia8GapTriggeredLFgamma_ForEM(5+1, -1.2, +1.2, 1) + +[GeneratorPythia8] +config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg diff --git a/MC/config/PWGEM/ini/Generator_GapTriggered_LFgamma_np3_gap5.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFgamma_np3_gap5.ini new file mode 100644 index 000000000..30dad9bcc --- /dev/null +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFgamma_np3_gap5.ini @@ -0,0 +1,9 @@ +### The setup uses an external event generator +### This part sets the path of the file and the function call to retrieve it + +[GeneratorExternal] +fileName = ${O2DPG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFgamma.C +funcName = GeneratorPythia8GapTriggeredLFgamma_ForEM(5+1, -1.2, +1.2, 3) + +[GeneratorPythia8] +config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg diff --git a/MC/config/PWGEM/ini/Generator_GapTriggered_LFgamma_np5_gap5.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFgamma_np5_gap5.ini new file mode 100644 index 000000000..16529f237 --- /dev/null +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFgamma_np5_gap5.ini @@ -0,0 +1,9 @@ +### The setup uses an external event generator +### This part sets the path of the file and the function call to retrieve it + +[GeneratorExternal] +fileName = ${O2DPG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFgamma.C +funcName = GeneratorPythia8GapTriggeredLFgamma_ForEM(5+1, -1.2, +1.2, 5) + +[GeneratorPythia8] +config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg diff --git a/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np1_gap5.sh b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np1_gap5.sh new file mode 100644 index 000000000..a2f4eaf6d --- /dev/null +++ b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np1_gap5.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# +# Steering script for LF->ee enhanced dielectron MC anchored to LHC22o apass6 +# + +# example anchoring +# taken from https://its.cern.ch/jira/browse/O2-4586 +export ALIEN_JDL_LPMANCHORPASSNAME=apass6 +export ALIEN_JDL_MCANCHOR=apass6 +export ALIEN_JDL_CPULIMIT=8 +export ALIEN_JDL_LPMRUNNUMBER=526641 +export ALIEN_JDL_LPMPRODUCTIONTYPE=MC +export ALIEN_JDL_LPMINTERACTIONTYPE=pp +export ALIEN_JDL_LPMPRODUCTIONTAG=LHC24b1b +export ALIEN_JDL_LPMANCHORRUN=526641 +export ALIEN_JDL_LPMANCHORPRODUCTION=LHC22o +export ALIEN_JDL_LPMANCHORYEAR=2022 +export ALIEN_JDL_OUTPUT=*.dat@disk=1,*.txt@disk=1,*.root@disk=2 + +export NTIMEFRAMES=1 +export NSIGEVENTS=20 +export SPLITID=100 +export PRODSPLIT=153 +export CYCLE=0 + +# on the GRID, this is set and used as seed; when set, it takes precedence over SEED +#export ALIEN_PROC_ID=2963436952 +export SEED=0 + +# for pp and 50 events per TF, we launch only 4 workers. +export NWORKERS=4 + +# define the generator via ini file +# use 20/40/40 sampling for different generators +# generate random number +RNDSIG=$(($RANDOM % 100)) + +CONFIGNAME="Generator_GapTriggered_LFgamma_np1_gap5.ini" + +export ALIEN_JDL_ANCHOR_SIM_OPTIONS="-gen external -ini $O2DPG_ROOT/MC/config/PWGEM/ini/$CONFIGNAME" + +# run the central anchor steering script; this includes +# * derive timestamp +# * derive interaction rate +# * extract and prepare configurations (which detectors are contained in the run etc.) +# * run the simulation (and QC) +# To disable QC, uncomment the following line +#export DISABLE_QC=1 +${O2DPG_ROOT}/MC/run/ANCHOR/anchorMC.sh diff --git a/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np3_gap5.sh b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np3_gap5.sh new file mode 100644 index 000000000..0b8e3c83f --- /dev/null +++ b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np3_gap5.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# +# Steering script for LF->ee enhanced dielectron MC anchored to LHC22o apass6 +# + +# example anchoring +# taken from https://its.cern.ch/jira/browse/O2-4586 +export ALIEN_JDL_LPMANCHORPASSNAME=apass6 +export ALIEN_JDL_MCANCHOR=apass6 +export ALIEN_JDL_CPULIMIT=8 +export ALIEN_JDL_LPMRUNNUMBER=526641 +export ALIEN_JDL_LPMPRODUCTIONTYPE=MC +export ALIEN_JDL_LPMINTERACTIONTYPE=pp +export ALIEN_JDL_LPMPRODUCTIONTAG=LHC24b1b +export ALIEN_JDL_LPMANCHORRUN=526641 +export ALIEN_JDL_LPMANCHORPRODUCTION=LHC22o +export ALIEN_JDL_LPMANCHORYEAR=2022 +export ALIEN_JDL_OUTPUT=*.dat@disk=1,*.txt@disk=1,*.root@disk=2 + +export NTIMEFRAMES=1 +export NSIGEVENTS=20 +export SPLITID=100 +export PRODSPLIT=153 +export CYCLE=0 + +# on the GRID, this is set and used as seed; when set, it takes precedence over SEED +#export ALIEN_PROC_ID=2963436952 +export SEED=0 + +# for pp and 50 events per TF, we launch only 4 workers. +export NWORKERS=4 + +# define the generator via ini file +# use 20/40/40 sampling for different generators +# generate random number +RNDSIG=$(($RANDOM % 100)) + +CONFIGNAME="Generator_GapTriggered_LFgamma_np3_gap5.ini" + +export ALIEN_JDL_ANCHOR_SIM_OPTIONS="-gen external -ini $O2DPG_ROOT/MC/config/PWGEM/ini/$CONFIGNAME" + +# run the central anchor steering script; this includes +# * derive timestamp +# * derive interaction rate +# * extract and prepare configurations (which detectors are contained in the run etc.) +# * run the simulation (and QC) +# To disable QC, uncomment the following line +#export DISABLE_QC=1 +${O2DPG_ROOT}/MC/run/ANCHOR/anchorMC.sh diff --git a/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np5_gap5.sh b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np5_gap5.sh new file mode 100644 index 000000000..ab63b0738 --- /dev/null +++ b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np5_gap5.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# +# Steering script for LF->ee enhanced dielectron MC anchored to LHC22o apass6 +# + +# example anchoring +# taken from https://its.cern.ch/jira/browse/O2-4586 +export ALIEN_JDL_LPMANCHORPASSNAME=apass6 +export ALIEN_JDL_MCANCHOR=apass6 +export ALIEN_JDL_CPULIMIT=8 +export ALIEN_JDL_LPMRUNNUMBER=526641 +export ALIEN_JDL_LPMPRODUCTIONTYPE=MC +export ALIEN_JDL_LPMINTERACTIONTYPE=pp +export ALIEN_JDL_LPMPRODUCTIONTAG=LHC24b1b +export ALIEN_JDL_LPMANCHORRUN=526641 +export ALIEN_JDL_LPMANCHORPRODUCTION=LHC22o +export ALIEN_JDL_LPMANCHORYEAR=2022 +export ALIEN_JDL_OUTPUT=*.dat@disk=1,*.txt@disk=1,*.root@disk=2 + +export NTIMEFRAMES=1 +export NSIGEVENTS=20 +export SPLITID=100 +export PRODSPLIT=153 +export CYCLE=0 + +# on the GRID, this is set and used as seed; when set, it takes precedence over SEED +#export ALIEN_PROC_ID=2963436952 +export SEED=0 + +# for pp and 50 events per TF, we launch only 4 workers. +export NWORKERS=4 + +# define the generator via ini file +# use 20/40/40 sampling for different generators +# generate random number +RNDSIG=$(($RANDOM % 100)) + +CONFIGNAME="Generator_GapTriggered_LFgamma_np5_gap5.ini" + +export ALIEN_JDL_ANCHOR_SIM_OPTIONS="-gen external -ini $O2DPG_ROOT/MC/config/PWGEM/ini/$CONFIGNAME" + +# run the central anchor steering script; this includes +# * derive timestamp +# * derive interaction rate +# * extract and prepare configurations (which detectors are contained in the run etc.) +# * run the simulation (and QC) +# To disable QC, uncomment the following line +#export DISABLE_QC=1 +${O2DPG_ROOT}/MC/run/ANCHOR/anchorMC.sh diff --git a/MC/run/PWGEM/runPythia8GapTriggeredLFgamma_pp.sh b/MC/run/PWGEM/runPythia8GapTriggeredLFgamma_pp.sh new file mode 100644 index 000000000..7d23cd4e9 --- /dev/null +++ b/MC/run/PWGEM/runPythia8GapTriggeredLFgamma_pp.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# make sure O2DPG + O2 is loaded +[ ! "${O2DPG_ROOT}" ] && echo "Error: This needs O2DPG loaded" && exit 1 +[ ! "${O2_ROOT}" ] && echo "Error: This needs O2 loaded" && exit 1 + +# ----------- SETUP LOCAL CCDB CACHE -------------------------- +export ALICEO2_CCDB_LOCALCACHE=$PWD/.ccdb + + +# ----------- LOAD UTILITY FUNCTIONS -------------------------- +. ${O2_ROOT}/share/scripts/jobutils.sh + +NSIGEVENTS=${NSIGEVENTS:-10} +NWORKERS=${NWORKERS:-8} +NTIMEFRAMES=${NTIMEFRAMES:-1} +INTRATE=${INTRATE:-500000} +GAP=${GAP:-5} +NP=${NP:-1} + +CONFIGNAME="Generator_GapTriggered_LFgamma_np${NP}_gap${GAP}.ini" + +${O2DPG_ROOT}/MC/bin/o2dpg_sim_workflow.py -eCM 13600 -col pp -gen external -j ${NWORKERS} -ns ${NSIGEVENTS} -tf ${NTIMEFRAMES} -e TGeant4 -mod "--skipModules ZDC" \ + -ini $O2DPG_ROOT/MC/config/PWGEM/ini/$CONFIGNAME \ + -confKeyBkg "Diamond.width[2]=6" -interactionRate ${INTRATE} + +# run workflow +${O2DPG_ROOT}/MC/bin/o2_dpg_workflow_runner.py -f workflow.json -tt aod --cpu-limit 32