1313
1414using namespace Pythia8 ;
1515
16- class GeneratorPythia8GapTriggeredHFLepton : public o2 ::eventgen ::GeneratorPythia8 {
16+ class GeneratorPythia8GapTriggeredHFLepton : public o2 ::eventgen ::GeneratorPythia8
17+ {
1718public :
1819 /// default constructor
1920 GeneratorPythia8GapTriggeredHFLepton () = default ;
2021
2122 /// constructor
22- GeneratorPythia8GapTriggeredHFLepton ( TString configsignal , int quarkPdg = 4 , int lInputTriggerRatio = 5 ){
23+ GeneratorPythia8GapTriggeredHFLepton (TString configsignal , int quarkPdg = 4 , int lInputTriggerRatio = 5 , int lInputExternalID = 0 )
24+ {
2325
24- lGeneratedEvents = 0 ;
25- lInverseTriggerRatio = lInputTriggerRatio ;
26- mQuarkPdg = quarkPdg ;
26+ lGeneratedEvents = 0 ;
27+ lInverseTriggerRatio = lInputTriggerRatio ;
28+ lExternalID = lInputExternalID ;
29+ mQuarkPdg = quarkPdg ;
2730
2831 auto seed = (gRandom -> TRandom ::GetSeed () % 900000000 );
2932
30- cout << "Initalizing extra PYTHIA object used to generate min-bias events..." << endl ;
33+ cout << "Initalizing extra PYTHIA object used to generate min-bias events..." << endl ;
3134 TString pathconfigMB = gSystem -> ExpandPathName ("$O2DPG_ROOT/MC/config/PWGEM/pythia8/generator/pythia8_MB_gapevent.cfg" );
3235 pythiaObjectMinimumBias .readFile (pathconfigMB .Data ());
3336 pythiaObjectMinimumBias .readString ("Random:setSeed on" );
3437 pythiaObjectMinimumBias .readString ("Random:seed " + std ::to_string (seed ));
3538 pythiaObjectMinimumBias .init ();
3639 cout << "Initalization complete" << endl ;
37- cout << "Initalizing extra PYTHIA object used to generate signal events..." << endl ;
40+ cout << "Initalizing extra PYTHIA object used to generate signal events..." << endl ;
3841 TString pathconfigSignal = gSystem -> ExpandPathName (configsignal .Data ());
3942 pythiaObjectSignal .readFile (pathconfigSignal .Data ());
4043 pythiaObjectSignal .readString ("Random:setSeed on" );
@@ -44,13 +47,16 @@ public:
4447 // flag the generators using type
4548 // addCocktailConstituent(type, "interesting");
4649 // addCocktailConstitent(0, "minbias");
47-
4850 }
4951
5052 /// Destructor
5153 ~GeneratorPythia8GapTriggeredHFLepton () = default ;
5254
53- void addTriggerOnDaughter (int nb , int pdg ) { mNbDaughter = nb ; mPdgDaughter = pdg ; };
55+ void addTriggerOnDaughter (int nb , int pdg )
56+ {
57+ mNbDaughter = nb ;
58+ mPdgDaughter = pdg ;
59+ };
5460 void setQuarkRapidity (float yMin , float yMax )
5561 {
5662 mQuarkRapidityMin = yMin ;
@@ -64,27 +70,30 @@ public:
6470
6571protected :
6672 //__________________________________________________________________
67- Bool_t generateEvent () override {
73+ Bool_t generateEvent () override
74+ {
6875 /// reset event
6976 mPythia .event .reset ();
7077
7178 // Simple straightforward check to alternate generators
72- if ( lGeneratedEvents % lInverseTriggerRatio == 0 ) {
79+ if ( lGeneratedEvents % lInverseTriggerRatio == 0 ) {
7380 // Generate event of interest
7481 Bool_t lGenerationOK = kFALSE ;
75- while (!lGenerationOK ){
82+ while (!lGenerationOK ) {
7683 if (pythiaObjectSignal .next ()) {
77- lGenerationOK = selectEvent (pythiaObjectSignal .event );
84+ lGenerationOK = selectEvent (pythiaObjectSignal .event );
7885 }
7986 }
8087 mPythia .event = pythiaObjectSignal .event ;
81- }else {
88+ notifySubGenerator (lExternalID );
89+ } else {
8290 // Generate minimum-bias event
8391 Bool_t lGenerationOK = kFALSE ;
8492 while (!lGenerationOK ) {
8593 lGenerationOK = pythiaObjectMinimumBias .next ();
8694 }
8795 mPythia .event = pythiaObjectMinimumBias .event ;
96+ notifySubGenerator (0 );
8897 }
8998
9099 lGeneratedEvents ++ ;
@@ -93,22 +102,22 @@ protected:
93102 return true;
94103 }
95104
96- bool selectEvent (const Pythia8 ::Event & event )
105+ bool selectEvent (const Pythia8 ::Event & event )
97106 {
98107 bool isGoodAtPartonLevel = false, isGoodAtDaughterLevel = (mPdgDaughter != 0 ) ? false : true;
99- int nbDaughter = 0 ;
108+ int nbDaughter = 0 ;
100109 for (auto iPart {0 }; iPart < event .size () ; ++ iPart ) {
101110 // search for Q-Qbar mother with at least one Q in rapidity window
102111 if (!isGoodAtPartonLevel ) {
103112 auto daughterList = event [iPart ].daughterList ();
104113 bool hasQ = false, hasQbar = false, atSelectedY = false;
105114 for (auto iDau : daughterList ) {
106115 if (event [iDau ].id () == mQuarkPdg ) {
107- hasQ = true;
108- }
116+ hasQ = true;
117+ }
109118 if (event [iDau ].id () == - mQuarkPdg ) {
110- hasQbar = true;
111- }
119+ hasQbar = true;
120+ }
112121 if ((std ::abs (event [iDau ].id ()) == mQuarkPdg ) && (event [iDau ].y () > mQuarkRapidityMin ) && (event [iDau ].y () < mQuarkRapidityMax ))
113122 atSelectedY = true;
114123 }
@@ -121,21 +130,21 @@ protected:
121130 int id = std ::abs (event [iPart ].id ());
122131 float rap = event [iPart ].y ();
123132 if (id == mPdgDaughter ) {
124- int motherindexa = event [iPart ].mother1 ();
125- if (motherindexa > 0 ) {
126- int idmother = std ::abs (event [motherindexa ].id ());
127- if (int (std ::abs (idmother )/100. ) == 4 || int (std ::abs (idmother )/1000. ) == 4 || int (std ::abs (idmother )/100. ) == 5 || int (std ::abs (idmother )/1000. ) == 5 ) {
128- if (rap > mDaughterRapidityMin && rap < mDaughterRapidityMax ) {
129- nbDaughter ++ ;
130- if (nbDaughter >= mNbDaughter ) isGoodAtDaughterLevel = true;
131- }
133+ int motherindexa = event [iPart ].mother1 ();
134+ if (motherindexa > 0 ) {
135+ int idmother = std ::abs (event [motherindexa ].id ());
136+ if (int (std ::abs (idmother ) / 100. ) == 4 || int (std ::abs (idmother ) / 1000. ) == 4 || int (std ::abs (idmother ) / 100. ) == 5 || int (std ::abs (idmother ) / 1000. ) == 5 ) {
137+ if (rap > mDaughterRapidityMin && rap < mDaughterRapidityMax ) {
138+ nbDaughter ++ ;
139+ if (nbDaughter >= mNbDaughter ) isGoodAtDaughterLevel = true;
132140 }
133- }
141+ }
142+ }
134143 }
135144 }
136145 // we send the trigger
137146 if (isGoodAtPartonLevel && isGoodAtDaughterLevel ) {
138- return true;
147+ return true;
139148 }
140149 }
141150 return false;
@@ -157,46 +166,51 @@ private:
157166 // Control gap-triggering
158167 Long64_t lGeneratedEvents ;
159168 int lInverseTriggerRatio ;
169+ // ID for different generators
170+ int lExternalID ;
160171
161172 // Base event generators
162173 Pythia pythiaObjectMinimumBias ; ///Minimum bias collision generator
163- Pythia pythiaObjectSignal ; ///Signal collision generator
174+ Pythia pythiaObjectSignal ; ///Signal collision generator
164175};
165176
166177// Predefined generators:
167178
168179// Charm-enriched forced decay
169- FairGenerator * GeneratorPythia8GapTriggeredCharmLepton (int inputTriggerRatio , float yMin = -1.5 , float yMax = 1.5 ) {
170- auto myGen = new GeneratorPythia8GapTriggeredHFLepton ("$O2DPG_ROOT/MC/config/PWGEM/pythia8/generator/pythia8_pp_cr2_forceddecayscharm.cfg" , 4 , inputTriggerRatio );
180+ FairGenerator * GeneratorPythia8GapTriggeredCharmLepton (int inputTriggerRatio , int inputExternalID , float yMin = -1.5 , float yMax = 1.5 )
181+ {
182+ auto myGen = new GeneratorPythia8GapTriggeredHFLepton ("$O2DPG_ROOT/MC/config/PWGEM/pythia8/generator/pythia8_pp_cr2_forceddecayscharm.cfg" , 4 , inputTriggerRatio , inputExternalID );
171183 auto seed = (gRandom -> TRandom ::GetSeed () % 900000000 );
172184 myGen -> readString ("Random:setSeed on" );
173185 myGen -> readString ("Random:seed " + std ::to_string (seed ));
174186 myGen -> setQuarkRapidity (yMin , yMax );
175187 myGen -> addTriggerOnDaughter (2 , 11 );
176- myGen -> setDaughterRapidity (-1. ,1. );
188+ myGen -> setDaughterRapidity (-1. , 1. );
177189 return myGen ;
178190}
179191
180192// Beauty-enriched forced decay
181- FairGenerator * GeneratorPythia8GapTriggeredBeautyForcedDecays (int inputTriggerRatio , float yMin = -1.5 , float yMax = 1.5 ) {
182- auto myGen = new GeneratorPythia8GapTriggeredHFLepton ("$O2DPG_ROOT/MC/config/PWGEM/pythia8/generator/pythia8_bbbar_forceddecayscharmbeauty.cfg" , 5 , inputTriggerRatio );
193+ FairGenerator * GeneratorPythia8GapTriggeredBeautyForcedDecays (int inputTriggerRatio , int inputExternalID , float yMin = -1.5 , float yMax = 1.5 )
194+ {
195+ auto myGen = new GeneratorPythia8GapTriggeredHFLepton ("$O2DPG_ROOT/MC/config/PWGEM/pythia8/generator/pythia8_bbbar_forceddecayscharmbeauty.cfg" , 5 , inputTriggerRatio , inputExternalID );
183196 auto seed = (gRandom -> TRandom ::GetSeed () % 900000000 );
184197 myGen -> readString ("Random:setSeed on" );
185198 myGen -> readString ("Random:seed " + std ::to_string (seed ));
186199 myGen -> setQuarkRapidity (yMin , yMax );
187200 myGen -> addTriggerOnDaughter (2 , 11 );
188- myGen -> setDaughterRapidity (-1. ,1. );
201+ myGen -> setDaughterRapidity (-1. , 1. );
189202 return myGen ;
190203}
191204
192205// Beauty-enriched no forced decay
193- FairGenerator * GeneratorPythia8GapTriggeredBeautyNoForcedDecays (int inputTriggerRatio , float yMin = -1.5 , float yMax = 1.5 ) {
194- auto myGen = new GeneratorPythia8GapTriggeredHFLepton ("$O2DPG_ROOT/MC/config/PWGEM/pythia8/generator/pythia8_bbbar.cfg" , 5 , inputTriggerRatio );
206+ FairGenerator * GeneratorPythia8GapTriggeredBeautyNoForcedDecays (int inputTriggerRatio , int inputExternalID , float yMin = -1.5 , float yMax = 1.5 )
207+ {
208+ auto myGen = new GeneratorPythia8GapTriggeredHFLepton ("$O2DPG_ROOT/MC/config/PWGEM/pythia8/generator/pythia8_bbbar.cfg" , 5 , inputTriggerRatio , inputExternalID );
195209 auto seed = (gRandom -> TRandom ::GetSeed () % 900000000 );
196210 myGen -> readString ("Random:setSeed on" );
197211 myGen -> readString ("Random:seed " + std ::to_string (seed ));
198212 myGen -> setQuarkRapidity (yMin , yMax );
199213 myGen -> addTriggerOnDaughter (2 , 11 );
200- myGen -> setDaughterRapidity (-1. ,1. );
214+ myGen -> setDaughterRapidity (-1. , 1. );
201215 return myGen ;
202216}
0 commit comments