Skip to content

Commit

Permalink
MC/PWGEM: add LF-> gamma MC
Browse files Browse the repository at this point in the history
  • Loading branch information
dsekihat committed Jun 7, 2024
1 parent e650b2f commit ee5cde3
Show file tree
Hide file tree
Showing 8 changed files with 328 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -15,7 +17,6 @@ namespace eventgen {
class CocktailParam : public GeneratorTGenerator {
public:
CocktailParam(GeneratorParam *thisGenerator)
//: GeneratorTGenerator("thisGenerator") {
: GeneratorTGenerator(thisGenerator->GetName()) {
setTGenerator(thisGenerator);
};
Expand All @@ -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<GeneratorCocktail>();

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<GeneratorCocktail> *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<GeneratorCocktailWithGap>();
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;
}

Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
50 changes: 50 additions & 0 deletions MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np1_gap5.sh
Original file line number Diff line number Diff line change
@@ -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
50 changes: 50 additions & 0 deletions MC/run/PWGEM/runAnchoredPythia8GapTriggeredLFgamma_pp_np3_gap5.sh
Original file line number Diff line number Diff line change
@@ -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
Loading

0 comments on commit ee5cde3

Please sign in to comment.