1+ R__LOAD_LIBRARY (EvtGen )
2+ R__ADD_INCLUDE_PATH ($EVTGEN_ROOT /include )
3+
14#include "FairGenerator.h"
25#include "Generators/GeneratorPythia8.h"
36#include "Generators/GeneratorPythia8Param.h"
7+ #include "EvtGen/EvtGen.hh"
48#include "Pythia8/Pythia.h"
9+ #include "Pythia8Plugins/EvtGen.h"
510#include "TRandom.h"
611#include "TDatabasePDG.h"
712#include <fairlogger/Logger.h>
@@ -33,6 +38,9 @@ public:
3338 mHadronPdgList = hadronPdgList ;
3439 mPartPdgToReplaceList = partPdgToReplaceList ;
3540 mFreqReplaceList = freqReplaceList ;
41+ mEvtGen = nullptr ;
42+ mUseEvtGen = false;
43+ mEvtGenDecTable = "" ;
3644 // 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)
3745 mCustomPartPdgs = {30433 , 40433 , 437 , 4315 , 4316 , 4325 , 4326 , 4124 , 14122 , 24124 , 24126 , 4125 , 9422111 };
3846 mCustomPartMasses [30433 ] = 2.714f ;
@@ -114,6 +122,10 @@ public:
114122 pdgToReplace .push_back (mPartPdgToReplaceList [iRepl ].at (0 ));
115123 }
116124
125+ if (mUseEvtGen ) {
126+ mEvtGen = new Pythia8 ::EvtGenDecays (& mPythia , mEvtGenDecTable .data (), gSystem -> ExpandPathName ("$EVTGEN_ROOT/share/EvtGen/evt.pdl" ));
127+ }
128+
117129 return o2 ::eventgen ::GeneratorPythia8 ::Init ();
118130 }
119131
@@ -135,6 +147,14 @@ public:
135147 {
136148 return mUsedSeed ;
137149 };
150+ void setUseEvtGenDecayer (std ::string evtGenDecTable = "" ) {
151+ mUseEvtGen = true;
152+ if (evtGenDecTable .empty ()) {
153+ mEvtGenDecTable = gSystem -> ExpandPathName ("$EVTGEN_ROOT/share/EvtGen/DECAY.DEC" );
154+ } else {
155+ mEvtGenDecTable = gSystem -> ExpandPathName (evtGenDecTable .data ());
156+ }
157+ }
138158
139159protected :
140160 //__________________________________________________________________
@@ -167,6 +187,10 @@ protected:
167187 {
168188 if (GeneratorPythia8 ::generateEvent ())
169189 {
190+ if (mUseEvtGen ) {
191+ mEvtGen -> decay ();
192+ checkConsistency ();
193+ }
170194 genOk = selectEvent ();
171195 }
172196 }
@@ -179,6 +203,12 @@ protected:
179203 while (!genOk )
180204 {
181205 genOk = GeneratorPythia8 ::generateEvent ();
206+ if (genOk ) {
207+ if (mUseEvtGen ) {
208+ mEvtGen -> decay ();
209+ checkConsistency ();
210+ }
211+ }
182212 }
183213 notifySubGenerator (0 );
184214 }
@@ -197,6 +227,8 @@ protected:
197227
198228 for (auto iPart {0 }; iPart < mPythia .event .size (); ++ iPart )
199229 {
230+
231+
200232 // search for Q-Qbar mother with at least one Q in rapidity window
201233 if (!isGoodAtPartonLevel )
202234 {
@@ -352,11 +384,22 @@ protected:
352384 return true;
353385 }
354386
387+ void checkConsistency () {
388+ for (int iPart {1 }; iPart < mPythia .event .size (); ++ iPart ) {
389+ // verify if all particles of decay chain are in the TDatabasePDG
390+ // taken from https://github.com/AliceO2Group/O2DPG/blob/master/MC/config/PWGDQ/EvtGen/GeneratorEvtGen.C
391+ if (!TDatabasePDG ::Instance ()-> GetParticle (abs (mPythia .event [iPart ].id ()))) {
392+ // std::cout << "Particle code non known in TDatabasePDG " << mPythia.event[iPart].id() << " - set pdg = 89" << std::endl;
393+ mPythia .event [iPart ].id (89 );
394+ }
395+ }
396+ }
397+
355398 private :
356399 // Interface to override import particles
357400 Pythia8 ::Event mOutputEvent ;
358401
359- // Properties of selection
402+ // Properties of selection
360403 int mQuarkPdg ;
361404 float mQuarkRapidityMin ;
362405 float mQuarkRapidityMax ;
@@ -379,6 +422,12 @@ protected:
379422
380423 // Control alternate trigger on different hadrons
381424 std ::vector < int > mHadronPdgList = {};
425+
426+ // EVTGEN decayer from PYTHIA8 plugins
427+ Pythia8 ::EvtGenDecays * mEvtGen ;
428+ bool mUseEvtGen ;
429+ std ::string mEvtGenDecTable ;
430+
382431};
383432
384433// Predefined generators:
@@ -446,3 +495,20 @@ FairGenerator *GeneratorPythia8GapHF(int inputTriggerRatio, float yQuarkMin = -1
446495
447496 return myGen ;
448497}
498+
499+ // Beauty-enriched with EvtGen decayer
500+ 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 = "" )
501+ {
502+ auto myGen = new GeneratorPythia8GapTriggeredHF (inputTriggerRatio , std ::vector < int > {5 }, hadronPdgList , partPdgToReplaceList , freqReplaceList );
503+ auto seed = (gRandom -> TRandom ::GetSeed () % 900000000 );
504+ myGen -> setUsedSeed (seed );
505+ myGen -> readString ("Random:setSeed on" );
506+ myGen -> readString ("Random:seed " + std ::to_string (seed ));
507+ myGen -> setQuarkRapidity (yQuarkMin , yQuarkMax );
508+ if (hadronPdgList .size () != 0 )
509+ {
510+ myGen -> setHadronRapidity (yHadronMin , yHadronMax );
511+ }
512+ myGen -> setUseEvtGenDecayer (decayTable );
513+ return myGen ;
514+ }
0 commit comments