diff --git a/MC/config/PWGEM/external/generator/GeneratorCocktailWithGap.C b/MC/config/PWGEM/external/generator/GeneratorCocktailWithGap.C deleted file mode 100644 index f930f0e68..000000000 --- a/MC/config/PWGEM/external/generator/GeneratorCocktailWithGap.C +++ /dev/null @@ -1,149 +0,0 @@ -#include - -using namespace o2::eventgen; - -// This is to evaluate MC efficiency. Not for comparison between data and LMEE cocktail. -class GeneratorCocktailWithGap : public Generator -{ - public: - GeneratorCocktailWithGap() : Generator() { - lGeneratedEvents = 0; - lInverseTriggerRatio = 1; - mGeneratorsSig->clear(); - mGeneratorsGap->clear(); - mGeneratorsSig->shrink_to_fit(); - mGeneratorsGap->shrink_to_fit(); - }; - - GeneratorCocktailWithGap(int lInputTriggerRatio) : Generator() { - lGeneratedEvents = 0; - lInverseTriggerRatio = lInputTriggerRatio; - mGeneratorsSig->clear(); - mGeneratorsGap->clear(); - mGeneratorsSig->shrink_to_fit(); - mGeneratorsGap->shrink_to_fit(); - }; - - ~GeneratorCocktailWithGap() = default; - - // at init we init all generators - bool Init() override - { - for (auto& g : *mGeneratorsSig) { - g->Init(); - } - for (auto& g : *mGeneratorsGap) { - g->Init(); - } - - Generator::Init(); - return true; - }; - - void setInputTriggerRatio(int lInputTriggerRatio) { lInverseTriggerRatio = lInputTriggerRatio; }; - - // call generate method for all generators - bool generateEvent() override - { - // Simple straightforward check to alternate generators - if (lGeneratedEvents % lInverseTriggerRatio == 0) { - // Generate event of interest - printf("generate signal event %lld\n", lGeneratedEvents); - for (auto& g : *mGeneratorsSig){ - printf("generate signal event %s\n", g->GetName()); - bool isOK = g->generateEvent(); - } - } else { - // Generate gap event - printf("generate gap event %lld\n", lGeneratedEvents); - for (auto& g : *mGeneratorsGap){ - printf("generate gap event %s\n", g->GetName()); - bool isOK = g->generateEvent(); - } - } - lGeneratedEvents++; - return true; - }; - - // at importParticles we add particles to the output particle vector - bool importParticles() override - { - //note that lGeneratedEvents++ is called in generateEvent(); - if ((lGeneratedEvents-1) % lInverseTriggerRatio == 0) { - for (auto& g : *mGeneratorsSig) { - int nPart = mParticles.size(); - g->importParticles(); - printf("generator %s : ngen = %zu\n", g->GetName(), g->getParticles().size()); - for (auto p : g->getParticles()) { - mParticles.push_back(p); - auto& pEdit = mParticles.back(); - o2::mcutils::MCGenHelper::encodeParticleStatusAndTracking(pEdit); - - if (pEdit.GetFirstMother() > -1){ - pEdit.SetFirstMother(pEdit.GetFirstMother() + nPart); - } - if (pEdit.GetSecondMother() > -1){ - pEdit.SetLastMother(pEdit.GetSecondMother() + nPart); - } - if (pEdit.GetFirstDaughter() > -1){ - pEdit.SetFirstDaughter(pEdit.GetFirstDaughter() + nPart); - } - if (pEdit.GetLastDaughter() > -1){ - pEdit.SetLastDaughter(pEdit.GetLastDaughter() + nPart); - } - } - g->clearParticles(); - } - } else { - for (auto& g : *mGeneratorsGap) { - int nPart = mParticles.size(); - g->importParticles(); - printf("generator %s : ngen = %zu\n", g->GetName(), g->getParticles().size()); - for (auto p : g->getParticles()) { - mParticles.push_back(p); - auto& pEdit = mParticles.back(); - o2::mcutils::MCGenHelper::encodeParticleStatusAndTracking(pEdit); - - if (pEdit.GetFirstMother() > -1){ - pEdit.SetFirstMother(pEdit.GetFirstMother() + nPart); - } - if (pEdit.GetSecondMother() > -1){ - pEdit.SetLastMother(pEdit.GetSecondMother() + nPart); - } - if (pEdit.GetFirstDaughter() > -1){ - pEdit.SetFirstDaughter(pEdit.GetFirstDaughter() + nPart); - } - if (pEdit.GetLastDaughter() > -1){ - pEdit.SetLastDaughter(pEdit.GetLastDaughter() + nPart); - } - } - g->clearParticles(); - } - } - - //maybe, it is better to implement mParticle.shrink_to_fit() in Generator::clearParticles(); - - return true; - }; - - void addGeneratorSig(Generator* gen, int ntimes = 1) { - for (int in = 0; in < ntimes; in++){ - mGeneratorsSig->push_back(gen); - } - }; - void addGeneratorGap(Generator* gen, int ntimes = 1) { - for (int in = 0; in < ntimes; in++){ - mGeneratorsGap->push_back(gen); - } - }; - - std::vector* getGeneratorsSig() { return mGeneratorsSig; }; - std::vector* getGeneratorsGap() { return mGeneratorsGap; }; - - private: - // Control gap-triggering - Long64_t lGeneratedEvents; - int lInverseTriggerRatio; - std::vector* mGeneratorsSig = new std::vector(); // vector of Generator for signal - std::vector* mGeneratorsGap = new std::vector(); // vector of Generator for gap -}; diff --git a/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFee.C b/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFee.C index 115e3cead..1b2761065 100644 --- a/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFee.C +++ b/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFee.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,13 +27,12 @@ private: GeneratorParam *thisGenerator = nullptr; }; -class O2_GeneratorParamJpsi : public GeneratorTGenerator -{ - public: - O2_GeneratorParamJpsi() : GeneratorTGenerator("ParamJpsi") +class O2_GeneratorParamJpsi : public GeneratorTGenerator { + public: + O2_GeneratorParamJpsi() : GeneratorTGenerator("ParamJpsi") { paramJpsi = new GeneratorParam(1, -1, Flat, Flat, V2JPsi, IpJPsi); - paramJpsi->SetMomentumRange(0., 1.e6); + paramJpsi->SetMomentumRange(0., 25.); paramJpsi->SetPtRange(0., 25.); paramJpsi->SetYRange(-1.2, 1.2); paramJpsi->SetPhiRange(0., 360.); @@ -41,278 +41,415 @@ class O2_GeneratorParamJpsi : public GeneratorTGenerator setTGenerator(paramJpsi); }; - ~O2_GeneratorParamJpsi() - { - delete paramJpsi; - }; - - Bool_t Init() override - { - GeneratorTGenerator::Init(); - paramJpsi->Init(); - return true; - } - - void SetNSignalPerEvent(Int_t nsig) { paramJpsi->SetNumberParticles(nsig); } - - //-------------------------------------------------------------------------// - static Double_t Flat(const Double_t* px, const Double_t* /*dummy*/) - { - return 1.; - } - - //-------------------------------------------------------------------------// - static Double_t V2JPsi(const Double_t* /*dummy*/, const Double_t* /*dummy*/) - { - // jpsi v2 - return 0.; - } - - //-------------------------------------------------------------------------// - static Int_t IpJPsi(TRandom*) - { - return 443; - } - - private: - GeneratorParam* paramJpsi = nullptr; + ~O2_GeneratorParamJpsi() + { + delete paramJpsi; + }; + + Bool_t Init() override + { + GeneratorTGenerator::Init(); + paramJpsi->Init(); + return true; + } + + void SetNSignalPerEvent(Int_t nsig) { paramJpsi->SetNumberParticles(nsig); } + + //-------------------------------------------------------------------------// + static Double_t Flat(const Double_t* px, const Double_t* /*dummy*/) + { + return 1.; + } + + //-------------------------------------------------------------------------// + static Double_t V2JPsi(const Double_t* /*dummy*/, const Double_t* /*dummy*/) + { + // jpsi v2 + return 0.; + } + + //-------------------------------------------------------------------------// + static Int_t IpJPsi(TRandom*) + { + return 443; + } + + private: + GeneratorParam* paramJpsi = nullptr; }; -class O2_GeneratorParamPsi : public GeneratorTGenerator -{ - public: - O2_GeneratorParamPsi() : GeneratorTGenerator("ParamPsi") +class O2_GeneratorParamPsi : public GeneratorTGenerator { + public: + O2_GeneratorParamPsi() : GeneratorTGenerator("ParamPsi") { paramPsi = new GeneratorParam(1, -1, PtPsi, YPsi, V2Psi, IpPsi); - paramPsi->SetMomentumRange(0., 1.e6); // Momentum range added from me + paramPsi->SetMomentumRange(0., 25.); // Momentum range added from me paramPsi->SetPtRange(0., 25.); // transverse of momentum range - paramPsi->SetYRange(-1.0, 1.0); // rapidity range + paramPsi->SetYRange(-1.2, 1.2); // rapidity range paramPsi->SetPhiRange(0., 360.); // phi range paramPsi->SetDecayer(new TPythia6Decayer()); // Pythia decayer paramPsi->SetForceDecay(kNoDecay); // particle left undecayed setTGenerator(paramPsi); }; - ~O2_GeneratorParamPsi() - { - delete paramPsi; - }; - - Bool_t Init() override - { - GeneratorTGenerator::Init(); - paramPsi->Init(); - return true; - } - void SetNSignalPerEvent(Int_t nsig) { paramPsi->SetNumberParticles(nsig); } - - //-------------------------------------------------------------------------// - static Double_t PtPsi(const Double_t* px, const Double_t* /*dummy*/) - { - return 1.; - } - - //-------------------------------------------------------------------------// - static Double_t YPsi(const Double_t* py, const Double_t* /*dummy*/) - { - return 1.; - } - - //-------------------------------------------------------------------------// - static Double_t V2Psi(const Double_t* /*dummy*/, const Double_t* /*dummy*/) - { - // psi(2s) v2 - return 0.; - } - - //-------------------------------------------------------------------------// - static Int_t IpPsi(TRandom*) - { - return 100443; - } + ~O2_GeneratorParamPsi() + { + delete paramPsi; + }; + + Bool_t Init() override + { + GeneratorTGenerator::Init(); + paramPsi->Init(); + return true; + } + void SetNSignalPerEvent(Int_t nsig) { paramPsi->SetNumberParticles(nsig); } + + //-------------------------------------------------------------------------// + static Double_t PtPsi(const Double_t* px, const Double_t* /*dummy*/) + { + return 1.; + } + + //-------------------------------------------------------------------------// + static Double_t YPsi(const Double_t* py, const Double_t* /*dummy*/) + { + return 1.; + } + + //-------------------------------------------------------------------------// + static Double_t V2Psi(const Double_t* /*dummy*/, const Double_t* /*dummy*/) + { + // psi(2s) v2 + return 0.; + } + + //-------------------------------------------------------------------------// + static Int_t IpPsi(TRandom*) + { + return 100443; + } + + private: + GeneratorParam* paramPsi = nullptr; +}; - private: - GeneratorParam* paramPsi = nullptr; +//my generator class +class GeneratorPythia8GapTriggeredLFee : public GeneratorPythia8 { + + public: + GeneratorPythia8GapTriggeredLFee() : GeneratorPythia8() { + mGeneratedEvents = 0; + mInverseTriggerRatio = 1; + fGeneratorCocktail = 0x0; + mMode = -1; + mTargetPDG = 0; + }; + + GeneratorPythia8GapTriggeredLFee(int lInputTriggerRatio, float yMin, float yMax, int nPart, int mode) : GeneratorPythia8() { + mGeneratedEvents = 0; + mInverseTriggerRatio = lInputTriggerRatio; + mMode = mode; + // LMee cocktail settings: + float minPt = 0; + float maxPt = 25; + float phiMin = 0.; + float phiMax = 360.; + Weighting_t weightMode = kNonAnalog; + + //create cocktail generator : pi0, eta, eta', rho, omega, phi, j/psi, psi(2s) + fGeneratorCocktail = new o2::eventgen::GeneratorEvtGen(); + + // 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(); + + //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->SetDecayer(decayer); // EXOUS; + genPizero->SetForceDecay(kDiElectronEM); // Dielectrons + 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., 25.); + geneta->SetPtRange(minPt, maxPt); + geneta->SetYRange(yMin, yMax); + geneta->SetPhiRange(phiMin, phiMax); + geneta->SetWeighting(weightMode); // flat pt, y and v2 zero + geneta->SetDecayer(decayer); // EXOUS; + geneta->SetForceDecay(kDiElectronEM); // Dielectrons + geneta->SetForceGammaConversion(kFALSE); + geneta->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma + geneta->Init(); + CocktailParam *newgeneta = new CocktailParam(geneta); + + // etaprime + auto genetaprime = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kEtaprime,"etaprime"); // 331 + genetaprime->SetName("etaprime"); + genetaprime->SetMomentumRange(0., 25.); + genetaprime->SetPtRange(minPt, maxPt); + genetaprime->SetYRange(yMin, yMax); + genetaprime->SetPhiRange(phiMin, phiMax); + genetaprime->SetWeighting(weightMode); // flat pt, y and v2 zero + genetaprime->SetDecayer(decayer); // EXOUS; + genetaprime->SetForceDecay(kDiElectronEM); // Dielectrons + genetaprime->SetForceGammaConversion(kFALSE); + genetaprime->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma + genetaprime->Init(); + CocktailParam *newgenetaprime = new CocktailParam(genetaprime); + + // rho + auto genrho = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kRho0,"rho"); // 113 + genrho->SetName("rho"); + genrho->SetMomentumRange(0., 25.); + genrho->SetPtRange(minPt, maxPt); + genrho->SetYRange(yMin, yMax); + genrho->SetPhiRange(phiMin, phiMax); + genrho->SetWeighting(weightMode); // flat pt, y and v2 zero + genrho->SetDecayer(decayer); // EXOUS; + genrho->SetForceDecay(kDiElectronEM); // Dielectrons + genrho->SetForceGammaConversion(kFALSE); + genrho->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma + genrho->Init(); + CocktailParam *newgenrho = new CocktailParam(genrho); + + // Omega + auto genomega = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kOmega,"omega"); //223 + genomega->SetName("omega"); + genomega->SetMomentumRange(0., 25.); + genomega->SetPtRange(minPt, maxPt); + genomega->SetYRange(yMin, yMax); + genomega->SetPhiRange(phiMin, phiMax); + genomega->SetWeighting(weightMode); // flat pt, y and v2 zero + genomega->SetDecayer(decayer); // EXOUS; + genomega->SetForceDecay(kDiElectronEM); // Dielectrons + genomega->SetForceGammaConversion(kFALSE); + genomega->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma + genomega->Init(); + CocktailParam *newgenomega = new CocktailParam(genomega); + + // phi + auto genphi = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kPhi,"phi"); //333 + genphi->SetName("phi"); + genphi->SetMomentumRange(0., 25.); + genphi->SetPtRange(minPt, maxPt); + genphi->SetYRange(yMin, yMax); + genphi->SetPhiRange(phiMin, phiMax); + genphi->SetWeighting(weightMode); // flat pt, y and v2 zero + genphi->SetDecayer(decayer); // EXOUS; + genphi->SetForceDecay(kDiElectronEM); // Dielectrons + genphi->SetForceGammaConversion(kFALSE); + genphi->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma + genphi->Init(); + CocktailParam *newgenphi = new CocktailParam(genphi); + + // J/psi and psi(2S) need to be slightly different since no EXODUS but EvtGen decayer + auto genJpsi = new o2::eventgen::O2_GeneratorParamJpsi; + genJpsi->SetNSignalPerEvent(nPart); // signal per event for J/Psi + + auto genPsi = new o2::eventgen::O2_GeneratorParamPsi; + genPsi->SetNSignalPerEvent(nPart); // signal per event for Psi(2s) + + TString pdgs = "443;100443"; + std::string spdg; + TObjArray* obj = pdgs.Tokenize(";"); + fGeneratorCocktail->SetSizePdg(obj->GetEntriesFast()); + for (int i = 0; i < obj->GetEntriesFast(); i++) { + spdg = obj->At(i)->GetName(); + fGeneratorCocktail->AddPdg(std::stoi(spdg), i); + printf("PDG %d \n", std::stoi(spdg)); + } + fGeneratorCocktail->SetForceDecay(kEvtDiElectron); + + int target_pdg = 0; + + if (mMode < 0) { + target_pdg = 0; + cout << "all-particle mode is selected. all 8 mesons are injected in each event" << endl; + cout << "add pi0 for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenpizero, 1); + cout << "add eta for signal" << endl; + fGeneratorCocktail->AddGenerator(newgeneta, 1); + cout << "add etaprime for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenetaprime, 1); + cout << "add rho for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenrho, 1); + cout << "add omega for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenomega, 1); + cout << "add phi for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenphi, 1); + cout << "add j/psi for signal" << endl; + fGeneratorCocktail->AddGenerator(genJpsi, 1); // add cocktail --> J/Psi + cout << "add psi(2S) for signal" << endl; + fGeneratorCocktail->AddGenerator(genPsi, 1); // add cocktail --> Psi(2s) + } else if (mMode < 100) { + cout << "1-particle Mode is selected. 1 meson selected randomly per job is injected in each event" << endl; + TRandom3 *r3 = new TRandom3(0); + double rndm = r3->Rndm(); + printf("rndm = %f\n", rndm); + + if(rndm < 1/8.) { + cout << "add pi0 for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenpizero, 1); + target_pdg = 111; + } else if (rndm < 2/8.) { + cout << "add eta for signal" << endl; + fGeneratorCocktail->AddGenerator(newgeneta, 1); + target_pdg = 221; + } else if (rndm < 3/8.) { + cout << "add etaprime for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenetaprime, 1); + target_pdg = 331; + } else if (rndm < 4/8.) { + cout << "add rho for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenrho, 1); + target_pdg = 113; + } else if (rndm < 5/8.) { + cout << "add omega for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenomega, 1); + target_pdg = 223; + } else if (rndm < 6/8.) { + cout << "add phi for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenphi, 1); + target_pdg = 333; + } else if (rndm < 7/8.) { + cout << "add j/psi for signal" << endl; + fGeneratorCocktail->AddGenerator(genJpsi, 1); // add cocktail --> J/Psi + target_pdg = 443; + } else { + cout << "add psi(2S) for signal" << endl; + fGeneratorCocktail->AddGenerator(genPsi, 1); // add cocktail --> Psi(2s) + target_pdg = 100443; + } + delete r3; + } else { //directly select meson pdg + target_pdg = mMode; + switch (mMode) { + case 111 : + cout << "add pi0 for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenpizero, 1); + break; + case 221 : + cout << "add eta for signal" << endl; + fGeneratorCocktail->AddGenerator(newgeneta, 1); + break; + case 331 : + cout << "add etaprime for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenetaprime, 1); + break; + case 113 : + cout << "add rho for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenrho, 1); + break; + case 223 : + cout << "add omega for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenomega, 1); + break; + case 333 : + cout << "add phi for signal" << endl; + fGeneratorCocktail->AddGenerator(newgenphi, 1); + break; + case 443 : + cout << "add j/psi for signal" << endl; + fGeneratorCocktail->AddGenerator(genJpsi, 1); // add cocktail --> J/Psi + break; + case 100443 : + cout << "add psi(2S) for signal" << endl; + fGeneratorCocktail->AddGenerator(genPsi, 1); // add cocktail --> Psi(2s) + break; + default: + cout << "!WARNING! default : nothing is added to cocktail generator" << endl; + target_pdg = 1; + break; + } + } + + // print debug + fGeneratorCocktail->PrintDebug(); + fGeneratorCocktail->Init(); + + cout << "target_pdg for subGeneratorId is " << target_pdg << endl; + addSubGenerator(0, "gap mb pythia"); + addSubGenerator(target_pdg, "injected cocktail"); + mTargetPDG = target_pdg; + }; + + ~GeneratorPythia8GapTriggeredLFee() = default; + + protected: + bool generateEvent() override + { + GeneratorPythia8::generateEvent(); + + if (mGeneratedEvents % mInverseTriggerRatio == 0){ // add injected prompt signals to the stack + fGeneratorCocktail->generateEvent(); + notifySubGenerator(mTargetPDG); + } 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; + int mMode; + int mTargetPDG; }; } // close eventgen } // close o2 -// Predefined generators: -// this function should be called in ini file. -FairGenerator *GeneratorPythia8GapTriggeredLFee_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 *GeneratorPythia8GapTriggeredLFee_ForEM(int inputTriggerRatio = 5, float yMin=-1.2, float yMax=1.2, int nPart = 1, int mode = -1) { + auto myGen = new GeneratorPythia8GapTriggeredLFee(inputTriggerRatio, yMin, yMax, nPart, mode); 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); // EXOUS; - genPizero->SetForceDecay(kDiElectronEM); // Dielectrons - 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); // EXOUS; - geneta->SetForceDecay(kDiElectronEM); // Dielectrons - geneta->SetForceGammaConversion(kFALSE); - geneta->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma - geneta->Init(); - CocktailParam *newgeneta = new CocktailParam(geneta); - - // etaprime - auto genetaprime = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kEtaprime,"etaprime"); // 331 - genetaprime->SetName("etaprime"); - genetaprime->SetMomentumRange(0., 1.e6); - genetaprime->SetPtRange(minPt, maxPt); - genetaprime->SetYRange(minRap, maxRap); - genetaprime->SetPhiRange(phiMin, phiMax); - genetaprime->SetWeighting(weightMode); // flat pt, y and v2 zero - genetaprime->SetDecayer(decayer); // EXOUS; - genetaprime->SetForceDecay(kDiElectronEM); // Dielectrons - genetaprime->SetForceGammaConversion(kFALSE); - genetaprime->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma - genetaprime->Init(); - CocktailParam *newgenetaprime = new CocktailParam(genetaprime); - - // rho - auto genrho = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kRho0,"rho"); // 113 - genrho->SetName("rho"); - genrho->SetMomentumRange(0., 1.e6); - genrho->SetPtRange(minPt, maxPt); - genrho->SetYRange(minRap, maxRap); - genrho->SetPhiRange(phiMin, phiMax); - genrho->SetWeighting(weightMode); // flat pt, y and v2 zero - genrho->SetDecayer(decayer); // EXOUS; - genrho->SetForceDecay(kDiElectronEM); // Dielectrons - genrho->SetForceGammaConversion(kFALSE); - genrho->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma - genrho->Init(); - CocktailParam *newgenrho = new CocktailParam(genrho); - - // Omega - auto genomega = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kOmega,"omega"); //223 - genomega->SetName("omega"); - genomega->SetMomentumRange(0., 1.e6); - genomega->SetPtRange(minPt, maxPt); - genomega->SetYRange(minRap, maxRap); - genomega->SetPhiRange(phiMin, phiMax); - genomega->SetWeighting(weightMode); // flat pt, y and v2 zero - genomega->SetDecayer(decayer); // EXOUS; - genomega->SetForceDecay(kDiElectronEM); // Dielectrons - genomega->SetForceGammaConversion(kFALSE); - genomega->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma - genomega->Init(); - CocktailParam *newgenomega = new CocktailParam(genomega); - - // phi - auto genphi = new GeneratorParam(nPart,emlib,GeneratorParamEMlib::kPhi,"phi"); //333 - genphi->SetName("phi"); - genphi->SetMomentumRange(0., 1.e6); - genphi->SetPtRange(minPt, maxPt); - genphi->SetYRange(minRap, maxRap); - genphi->SetPhiRange(phiMin, phiMax); - genphi->SetWeighting(weightMode); // flat pt, y and v2 zero - genphi->SetDecayer(decayer); // EXOUS; - genphi->SetForceDecay(kDiElectronEM); // Dielectrons - genphi->SetForceGammaConversion(kFALSE); - genphi->SetSelectAll(kTRUE); // Store also the gamma in pi0->e+e-gamma - genphi->Init(); - CocktailParam *newgenphi = new CocktailParam(genphi); - - cout << "add pi0 for signal" << endl; - genCocktailEvtGen->addGeneratorSig(newgenpizero, 1); - cout << "add eta for signal" << endl; - genCocktailEvtGen->addGeneratorSig(newgeneta, 1); - cout << "add etaprime for signal" << endl; - genCocktailEvtGen->addGeneratorSig(newgenetaprime, 1); - cout << "add rho for signal" << endl; - genCocktailEvtGen->addGeneratorSig(newgenrho, 1); - cout << "add omega for signal" << endl; - genCocktailEvtGen->addGeneratorSig(newgenomega, 1); - cout << "add phi for signal" << endl; - genCocktailEvtGen->addGeneratorSig(newgenphi, 1); - - // J/psi and psi(2S) need to be slightly different since no EXODUS but EvtGen decayer - auto genJpsi = new o2::eventgen::O2_GeneratorParamJpsi; - genJpsi->SetNSignalPerEvent(nPart); // signal per event for J/Psi - genCocktailEvtGen->addGeneratorSig(genJpsi, 1); // add cocktail --> J/Psi - cout << "add j/psi for signal" << endl; - - auto genPsi = new o2::eventgen::O2_GeneratorParamPsi; - genPsi->SetNSignalPerEvent(nPart); // signal per event for Psi(2s) - genCocktailEvtGen->addGeneratorSig(genPsi, 1); // add cocktail --> Psi(2s) - cout << "add psi(2S) for signal" << endl; - - TString pdgs = "443;100443"; - std::string spdg; - TObjArray* obj = pdgs.Tokenize(";"); - genCocktailEvtGen->SetSizePdg(obj->GetEntriesFast()); - for (int i = 0; i < obj->GetEntriesFast(); i++) { - spdg = obj->At(i)->GetName(); - genCocktailEvtGen->AddPdg(std::stoi(spdg), i); - printf("PDG %d \n", std::stoi(spdg)); - } - genCocktailEvtGen->SetForceDecay(kEvtDiElectron); - - // 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_LFee.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee.ini index 502d3ec6c..e6fa251fc 100644 --- a/MC/config/PWGEM/ini/Generator_GapTriggered_LFee.ini +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee.ini @@ -3,8 +3,7 @@ [GeneratorExternal] fileName = ${O2DPG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_LFee.C -funcName = GeneratorPythia8GapTriggeredLFee_ForEM("${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg", 5, -1.2, +1.2, 1) +funcName = GeneratorPythia8GapTriggeredLFee_ForEM(5+1, -1.2, +1.2, 1, -1) [GeneratorPythia8] config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg -#config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/configPythiaEmpty.cfg diff --git a/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_all_np1_gap10.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_all_np1_gap10.ini new file mode 100644 index 000000000..d32ef9743 --- /dev/null +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_all_np1_gap10.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_LFee.C +funcName = GeneratorPythia8GapTriggeredLFee_ForEM(10+1, -1.2, +1.2, 1, -1) + +[GeneratorPythia8] +config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg diff --git a/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_all_np1_gap3.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_all_np1_gap3.ini new file mode 100644 index 000000000..5ebf9b396 --- /dev/null +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_all_np1_gap3.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_LFee.C +funcName = GeneratorPythia8GapTriggeredLFee_ForEM(3+1, -1.2, +1.2, 1, -1) + +[GeneratorPythia8] +config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg diff --git a/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_all_np1_gap5.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_all_np1_gap5.ini new file mode 100644 index 000000000..e6fa251fc --- /dev/null +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_all_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_LFee.C +funcName = GeneratorPythia8GapTriggeredLFee_ForEM(5+1, -1.2, +1.2, 1, -1) + +[GeneratorPythia8] +config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg diff --git a/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_random_np1_gap0.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_random_np1_gap0.ini new file mode 100644 index 000000000..af9a01758 --- /dev/null +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_random_np1_gap0.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_LFee.C +funcName = GeneratorPythia8GapTriggeredLFee_ForEM(0+1, -1.2, +1.2, 1, 1) + +[GeneratorPythia8] +config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg diff --git a/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_random_np3_gap0.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_random_np3_gap0.ini new file mode 100644 index 000000000..c7fecbc19 --- /dev/null +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_random_np3_gap0.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_LFee.C +funcName = GeneratorPythia8GapTriggeredLFee_ForEM(0+1, -1.2, +1.2, 3, 1) + +[GeneratorPythia8] +config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg diff --git a/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_random_np5_gap0.ini b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_random_np5_gap0.ini new file mode 100644 index 000000000..1ec9fc198 --- /dev/null +++ b/MC/config/PWGEM/ini/Generator_GapTriggered_LFee_random_np5_gap0.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_LFee.C +funcName = GeneratorPythia8GapTriggeredLFee_ForEM(0+1, -1.2, +1.2, 5, 1) + +[GeneratorPythia8] +config = ${O2DPG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg diff --git a/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFee_pp_np1_gap3.sh b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFee_pp_np1_gap3.sh new file mode 100644 index 000000000..23f9b5952 --- /dev/null +++ b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFee_pp_np1_gap3.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_LFee_all_np1_gap3.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/runAnchoredPythia8GapTriggeredLFee_pp_np1_gap5.sh b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFee_pp_np1_gap5.sh new file mode 100644 index 000000000..e977da87b --- /dev/null +++ b/MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFee_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_LFee_all_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/runPythia8GapTriggeredLFee_pp.sh b/MC/run/PWGEM/runPythia8GapTriggeredLFee_pp.sh new file mode 100644 index 000000000..281dcccf3 --- /dev/null +++ b/MC/run/PWGEM/runPythia8GapTriggeredLFee_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_LFee_all_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