1010
1111using namespace Pythia8 ;
1212
13+ #include <cmath>
14+
1315namespace hf_generators
1416{
1517 enum GenType : int {
@@ -35,7 +37,13 @@ public:
3537 //}
3638
3739 /// Destructor
38- ~GeneratorPythia8EmbedHF () = default ;
40+ ~GeneratorPythia8EmbedHF () {
41+ // Clean up the internally created HF generator if any
42+ if (mGeneratorEvHF ) {
43+ delete mGeneratorEvHF ;
44+ mGeneratorEvHF = nullptr ;
45+ }
46+ }
3947
4048 /// Init
4149 bool Init () override
@@ -51,29 +59,30 @@ public:
5159 /// \param yHadronMin minimum hadron rapidity
5260 /// \param yHadronMax maximum hadron rapidity
5361 /// \param hadronPdgList list of PDG codes for hadrons to be used in trigger
54- void setupGeneratorEvHF (int genType , bool usePtHardBins , float yQuarkMin , float yQuarkMax , float yHadronMin , float yHadronMax , std ::vector < int > hadronPdgList = {}) {
62+ /// \param quarkPdgList list of PDG codes for quarks to be enriched in the trigger
63+ void setupGeneratorEvHF (int genType , bool usePtHardBins , float yQuarkMin , float yQuarkMax , float yHadronMin , float yHadronMax , std ::vector < int > quarkPdgList = {}, std ::vector < int > hadronPdgList = {}, std ::vector < std ::array < int ,2 >> partPdgToReplaceList = {}, std ::vector < float > freqReplaceList = {}) {
5564 mGeneratorEvHF = nullptr;
5665 switch (genType )
5766 {
5867 case hf_generators ::GapTriggeredCharm :
5968 LOG (info ) << "********** [GeneratorPythia8EmbedHF] configuring GeneratorPythia8GapTriggeredCharm **********" ;
6069 LOG (info ) << "********** Default number of HF signal events to be merged (updated by notifyEmbedding): " << mNumSigEvs ;
61- mGeneratorEvHF = dynamic_cast < GeneratorPythia8GapTriggeredHF * > (GeneratorPythia8GapTriggeredCharm (/*no gap trigger*/ 1 , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList ));
70+ mGeneratorEvHF = dynamic_cast < GeneratorPythia8GapTriggeredHF * > (GeneratorPythia8GapTriggeredCharm (/*no gap trigger*/ 1 , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList , partPdgToReplaceList , freqReplaceList ));
6271 break ;
6372 case hf_generators ::GapTriggeredBeauty :
6473 LOG (info ) << "********** [GeneratorPythia8EmbedHF] configuring GeneratorPythia8GapTriggeredBeauty **********" ;
6574 LOG (info ) << "********** Default number of HF signal events to be merged (updated by notifyEmbedding): " << mNumSigEvs ;
66- mGeneratorEvHF = dynamic_cast < GeneratorPythia8GapTriggeredHF * > (GeneratorPythia8GapTriggeredBeauty (/*no gap trigger*/ 1 , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList ));
75+ mGeneratorEvHF = dynamic_cast < GeneratorPythia8GapTriggeredHF * > (GeneratorPythia8GapTriggeredBeauty (/*no gap trigger*/ 1 , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList , partPdgToReplaceList , freqReplaceList ));
6776 break ;
6877 case hf_generators ::GapTriggeredCharmAndBeauty :
6978 LOG (info ) << "********** [GeneratorPythia8EmbedHF] configuring GeneratorPythia8GapTriggeredCharmAndBeauty **********" ;
7079 LOG (info ) << "********** Default number of HF signal events to be merged (updated by notifyEmbedding): " << mNumSigEvs ;
71- mGeneratorEvHF = dynamic_cast < GeneratorPythia8GapTriggeredHF * > (GeneratorPythia8GapTriggeredCharmAndBeauty (/*no gap trigger*/ 1 , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList ));
80+ mGeneratorEvHF = dynamic_cast < GeneratorPythia8GapTriggeredHF * > (GeneratorPythia8GapTriggeredCharmAndBeauty (/*no gap trigger*/ 1 , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList , partPdgToReplaceList , freqReplaceList ));
7281 break ;
7382 case hf_generators ::GapHF :
7483 LOG (info ) << "********** [GeneratorPythia8EmbedHF] configuring GeneratorPythia8GapHF **********" ;
7584 LOG (info ) << "********** Default number of HF signal events to be merged (updated by notifyEmbedding): " << mNumSigEvs ;
76- mGeneratorEvHF = dynamic_cast < GeneratorPythia8GapTriggeredHF * > (GeneratorPythia8GapHF (/*no gap trigger*/ 1 , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList ));
85+ mGeneratorEvHF = dynamic_cast < GeneratorPythia8GapTriggeredHF * > (GeneratorPythia8GapHF (/*no gap trigger*/ 1 , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , quarkPdgList , hadronPdgList , partPdgToReplaceList , freqReplaceList ));
7786 break ;
7887 default :
7988 LOG (fatal ) << "********** [GeneratorPythia8EmbedHF] bad configuration, fix it! **********" ;
@@ -111,7 +120,8 @@ public:
111120 LOG (info ) << "[notifyEmbedding] ----- Collision impact parameter: " << x ;
112121
113122 /// number of events to be embedded in a background event
114- mNumSigEvs = 5 + 0.886202881 * std ::pow (std ::max (0.0f , 17.5f - x ),1.7 );
123+ // compute and round the number of signal events to an integer
124+ mNumSigEvs = static_cast < int > (std ::lround (5.0 + 0.886202881 * std ::pow (std ::max (0.0f , 17.5f - x ), 1.7 )));
115125 LOG (info ) << "[notifyEmbedding] ----- generating " << mNumSigEvs << " signal events " << std ::endl ;
116126 };
117127
@@ -142,13 +152,15 @@ bool isFromCharmOrBeauty(const int partId, std::vector<TParticle> const& particl
142152 std ::vector < int64_t > initVec {partId };
143153 arrayIds .push_back (initVec ); // the first vector contains the index of the original particle
144154 int stage = 0 ;
155+
145156 while (arrayIds [- stage ].size () > 0 ) {
146157
147158 //LOG(info) << "### stage " << stage << ", arrayIds[-stage].size() = " << arrayIds[-stage].size();
148159
149160 std ::vector < int64_t > arrayIdsStage {};
150161
151162 for (auto& iPart : arrayIds [- stage ]) { // check all the particles that were the mothers at the previous stage
163+
152164 const TParticle & partStage = particles .at (iPart );
153165
154166 // check the first mother
@@ -380,34 +392,34 @@ private:
380392};
381393
382394// Charm enriched
383- FairGenerator * GeneratorPythia8EmbedHFCharm (bool usePtHardBins = false, float yQuarkMin = -1.5 , float yQuarkMax = 1.5 , float yHadronMin = -1.5 , float yHadronMax = 1.5 , std ::vector < int > hadronPdgList = {})
395+ FairGenerator * GeneratorPythia8EmbedHFCharm (bool usePtHardBins = false, float yQuarkMin = -1.5 , float yQuarkMax = 1.5 , float yHadronMin = -1.5 , float yHadronMax = 1.5 , std ::vector < int > quarkPdgList = {}, std :: vector < int > hadronPdgList = {}, std :: vector < std :: array < int , 2 >> partPdgToReplaceList = {}, std :: vector < float > freqReplaceList = {})
384396{
385397 auto myGen = new GeneratorPythia8EmbedHF ();
386398
387399 /// setup the internal generator for HF events
388- myGen -> setupGeneratorEvHF (hf_generators ::GapTriggeredCharm , usePtHardBins , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList );
400+ myGen -> setupGeneratorEvHF (hf_generators ::GapTriggeredCharm , usePtHardBins , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , quarkPdgList , hadronPdgList , partPdgToReplaceList , freqReplaceList );
389401
390402 return myGen ;
391403}
392404
393405// Beauty enriched
394- FairGenerator * GeneratorPythia8EmbedHFBeauty (bool usePtHardBins = false, float yQuarkMin = -1.5 , float yQuarkMax = 1.5 , float yHadronMin = -1.5 , float yHadronMax = 1.5 , std ::vector < int > hadronPdgList = {})
406+ FairGenerator * GeneratorPythia8EmbedHFBeauty (bool usePtHardBins = false, float yQuarkMin = -1.5 , float yQuarkMax = 1.5 , float yHadronMin = -1.5 , float yHadronMax = 1.5 , std ::vector < int > quarkPdgList = {}, std :: vector < int > hadronPdgList = {}, std :: vector < std :: array < int , 2 >> partPdgToReplaceList = {}, std :: vector < float > freqReplaceList = {})
395407{
396408 auto myGen = new GeneratorPythia8EmbedHF ();
397409
398410 /// setup the internal generator for HF events
399- myGen -> setupGeneratorEvHF (hf_generators ::GapTriggeredBeauty , usePtHardBins , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList );
411+ myGen -> setupGeneratorEvHF (hf_generators ::GapTriggeredBeauty , usePtHardBins , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , quarkPdgList , hadronPdgList , partPdgToReplaceList , freqReplaceList );
400412
401413 return myGen ;
402414}
403415
404416// Charm and beauty enriched (with same ratio)
405- FairGenerator * GeneratorPythia8EmbedHFCharmAndBeauty (bool usePtHardBins = false, float yQuarkMin = -1.5 , float yQuarkMax = 1.5 , float yHadronMin = -1.5 , float yHadronMax = 1.5 , std ::vector < int > hadronPdgList = {})
417+ FairGenerator * GeneratorPythia8EmbedHFCharmAndBeauty (bool usePtHardBins = false, float yQuarkMin = -1.5 , float yQuarkMax = 1.5 , float yHadronMin = -1.5 , float yHadronMax = 1.5 , std ::vector < int > quarkPdgList = {}, std :: vector < int > hadronPdgList = {}, std :: vector < std :: array < int , 2 >> partPdgToReplaceList = {}, std :: vector < float > freqReplaceList = {})
406418{
407419 auto myGen = new GeneratorPythia8EmbedHF ();
408420
409421 /// setup the internal generator for HF events
410- myGen -> setupGeneratorEvHF (hf_generators ::GapTriggeredCharmAndBeauty , usePtHardBins , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , hadronPdgList );
422+ myGen -> setupGeneratorEvHF (hf_generators ::GapTriggeredCharmAndBeauty , usePtHardBins , yQuarkMin , yQuarkMax , yHadronMin , yHadronMax , quarkPdgList , hadronPdgList , partPdgToReplaceList , freqReplaceList );
411423
412424 return myGen ;
413425}
0 commit comments