Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
R__LOAD_LIBRARY(EvtGen)
R__ADD_INCLUDE_PATH($EVTGEN_ROOT/include)

#include "FairGenerator.h"
#include "Generators/GeneratorPythia8.h"
#include "Generators/GeneratorPythia8Param.h"
#include "EvtGen/EvtGen.hh"
#include "Pythia8/Pythia.h"
#include "Pythia8Plugins/EvtGen.h"
#include "TRandom.h"
#include "TDatabasePDG.h"
#include <fairlogger/Logger.h>
Expand Down Expand Up @@ -33,6 +38,8 @@ public:
mHadronPdgList = hadronPdgList;
mPartPdgToReplaceList = partPdgToReplaceList;
mFreqReplaceList = freqReplaceList;
mUseEvtGen = false;
mEvtGenDecTable = "";
// Ds1*(2700), Ds1*(2860), Ds3*(2860), Xic(3055)+, Xic(3080)+, Xic(3055)0, Xic(3080)0, LambdaC(2625), LambdaC(2595), LambdaC(2860), LambdaC(2880), LambdaC(2940), ThetaC(3100)
mCustomPartPdgs = {30433, 40433, 437, 4315, 4316, 4325, 4326, 4124, 14122, 24124, 24126, 4125, 9422111};
mCustomPartMasses[30433] = 2.714f;
Expand Down Expand Up @@ -114,6 +121,10 @@ public:
pdgToReplace.push_back(mPartPdgToReplaceList[iRepl].at(0));
}

if (mUseEvtGen) {
mEvtGen = new Pythia8::EvtGenDecays(&mPythia, mEvtGenDecTable.data(), gSystem->ExpandPathName("$EVTGEN_ROOT/share/EvtGen/evt.pdl"));
}

return o2::eventgen::GeneratorPythia8::Init();
}

Expand All @@ -135,6 +146,14 @@ public:
{
return mUsedSeed;
};
void setUseEvtGenDecayer(std::string evtGenDecTable = "") {
mUseEvtGen = true;
if (evtGenDecTable.empty()) {
mEvtGenDecTable = gSystem->ExpandPathName("$EVTGEN_ROOT/share/EvtGen/DECAY.DEC");
} else {
mEvtGenDecTable = gSystem->ExpandPathName(evtGenDecTable.data());
}
}

protected:
//__________________________________________________________________
Expand Down Expand Up @@ -167,6 +186,10 @@ protected:
{
if (GeneratorPythia8::generateEvent())
{
if (mEvtGen) {
mEvtGen->decay();
checkConsistency();
}
genOk = selectEvent();
}
}
Expand All @@ -179,6 +202,12 @@ protected:
while (!genOk)
{
genOk = GeneratorPythia8::generateEvent();
if (genOk) {
if (mEvtGen) {
mEvtGen->decay();
checkConsistency();
}
}
}
notifySubGenerator(0);
}
Expand All @@ -197,6 +226,8 @@ protected:

for (auto iPart{0}; iPart < mPythia.event.size(); ++iPart)
{


// search for Q-Qbar mother with at least one Q in rapidity window
if (!isGoodAtPartonLevel)
{
Expand Down Expand Up @@ -352,11 +383,22 @@ protected:
return true;
}

void checkConsistency() {
for (int iPart{1}; iPart<mPythia.event.size(); ++iPart) {
// verify if all particles of decay chain are in the TDatabasePDG
// taken from https://github.com/AliceO2Group/O2DPG/blob/master/MC/config/PWGDQ/EvtGen/GeneratorEvtGen.C
if (!TDatabasePDG::Instance()->GetParticle(abs(mPythia.event[iPart].id()))) {
// std::cout << "Particle code non known in TDatabasePDG " << mPythia.event[iPart].id() << " - set pdg = 89" << std::endl;
mPythia.event[iPart].id(89);
}
}
}

private:
// Interface to override import particles
Pythia8::Event mOutputEvent;

// Properties of selection
// Properties of selection
int mQuarkPdg;
float mQuarkRapidityMin;
float mQuarkRapidityMax;
Expand All @@ -379,6 +421,12 @@ protected:

// Control alternate trigger on different hadrons
std::vector<int> mHadronPdgList = {};

// EVTGEN decayer from PYTHIA8 plugins
Pythia8::EvtGenDecays *mEvtGen;
bool mUseEvtGen;
std::string mEvtGenDecTable;

};

// Predefined generators:
Expand Down Expand Up @@ -446,3 +494,20 @@ FairGenerator *GeneratorPythia8GapHF(int inputTriggerRatio, float yQuarkMin = -1

return myGen;
}

// Beauty-enriched with EvtGen decayer
FairGenerator *GeneratorPythia8GapTriggeredBeautyWithEvtGen(int inputTriggerRatio, float yQuarkMin = -1.5, float yQuarkMax = 1.5, float yHadronMin = -1.5, float yHadronMax = 1.5, std::vector<int> hadronPdgList = {}, std::vector<std::array<int, 2>> partPdgToReplaceList = {}, std::vector<float> freqReplaceList = {}, std::string decayTable = "")
{
auto myGen = new GeneratorPythia8GapTriggeredHF(inputTriggerRatio, std::vector<int>{5}, hadronPdgList, partPdgToReplaceList, freqReplaceList);
auto seed = (gRandom->TRandom::GetSeed() % 900000000);
myGen->setUsedSeed(seed);
myGen->readString("Random:setSeed on");
myGen->readString("Random:seed " + std::to_string(seed));
myGen->setQuarkRapidity(yQuarkMin, yQuarkMax);
if (hadronPdgList.size() != 0)
{
myGen->setHadronRapidity(yHadronMin, yHadronMax);
}
myGen->setUseEvtGenDecayer(decayTable);
return myGen;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#NEV_TEST> 20
### The external generator derives from GeneratorPythia8.
[GeneratorExternal]
fileName=${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGHF/external/generator/generator_pythia8_gaptriggered_hf.C
funcName=GeneratorPythia8GapTriggeredBeautyWithEvtGen(5, -1.5, 1.5, -1.5, 1.5, {}, {}, {}, "${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGHF/pythia8/decayer/EVTGEN_DECAY_B2JPSI.DEC")

[GeneratorPythia8]
config=${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGHF/pythia8/generator/pythia8_Mode2_noforcedecays.cfg
includePartonEvent=false
Loading
Loading