]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/FORWARD/analysis2/sim/EGConfig.C
Minor updates and add participant information to output for fast simulations
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / sim / EGConfig.C
CommitLineData
66ff3038 1/**
2 * @file EGConfig.C
3 * @author Christian Holm Christensen <cholm@nbi.dk>
4 * @date Thu Oct 16 11:01:38 2014
5 *
6 * @brief Specific configuration for event generator.
7 *
8 *
9 */
10struct EGCfg : public VirtualEGCfg
11{
12 Int_t hftype; // Heavy flavour type (random)
15cb4a2b 13 Bool_t fIsLego; //
14
66ff3038 15 EGCfg()
15cb4a2b 16 : hftype(-1), fIsLego(false);
66ff3038 17 {
18 hftype = HFType();
19 }
15cb4a2b 20 virtual Bool_t IsLego() const { return fIsLego; }
66ff3038 21protected:
22 /**
23 * Make a random Heavy Flavour type
24 *
25 * @return Heavy flavour type
26 */
27 Int_t HFType() const
28 {
29 Int_t type = -1;
30 Int_t r = gRandom->Rndm();
31 if (r < 0.16) type = 0;
32 else if (r < 0.32) type = 1;
33 else if (r < 0.48) type = 2;
34 else if (r < 0.64) type = 3;
35 else if (r < 0.72) type = 4;
36 else if (r < 0.80) type = 5;
37 else type = 6;
38 return r;
39 }
40 /**
41 * Make the generator
42 *
43 * @param rt Generator ID
44 * @param b1 Least impact parameter
45 * @param b2 Largest impact parameter
46 *
47 * @return Point to newly allocated generator or null
48 */
49 AliGenerator* CreateGenerator(const TString& rt,
50 Float_t b1, Float_t b2)
51 {
52 Bool_t asym = grp->IsPA()||grp->IsAP();
53 AliGenerator* g = 0;
15cb4a2b 54 TString t(rt);
55 if (t.EqualTo("default")) t = DeduceRunType();
56 if (t.EndsWith("perugia0chadr")) g=PythiaHF(0);
57 else if (t.EndsWith("perugia0bchadr")) g=PythiaHF(1);
58 else if (t.EndsWith("perugia0cele")) g=PythiaHF(2);
59 else if (t.EndsWith("perugia0bele")) g=PythiaHF(3);
60 else if (t.EndsWith("perugia0jspi2e")) g=PythiaHF(4);
61 else if (t.EndsWith("perugia0btojspi2e")) g=PythiaHF(5);
62 else if (t.BeginsWith("pythia")) g=Pythia(rt);
63 else if (t.BeginsWith("hijing2000hf")) g=HFCocktail(rt, b1, b2);
64 else if (t.BeginsWith("hijing2000")) g=Hijing(b1, b2, asym,
66ff3038 65 false, 2.3);
15cb4a2b 66 else if (t.BeginsWith("hijing")) g=Hijing(b1, b2, asym,
66ff3038 67 grp->IsAA(), 0);
15cb4a2b 68 else if (t.BeginsWith("ampthf")) g=HFCocktail(rt,b1,b2);
69 else if (t.BeginsWith("ampt")) g=Ampt(b1, b2);
70 else if (t.BeginsWith("dpmjet")) g=Dpmjet(b1, b2);
71 else if (t.BeginsWith("phojet")) g=Dpmjet(b1, b2);
72 else if (t.BeginsWith("hydjet")) g=Hydjet(b1, b2);
73 else if (t.BeginsWith("lego")) g=Lego(rt);
f3c8e1f4 74 if (!g && !fIsLego)
15cb4a2b 75 Fatal("", "Invalid run type \"%s\" specified", t.Data());
66ff3038 76 return g;
77 }
78 /**
79 * Make our decayer
80 *
81 * @return Newly allocated decayer or null
82 */
83 TVirtualMCDecayer* CreateDecayer(const TString& runType)
84 {
85 if (runType.BeginsWith("hydjet")) return 0;
86
87 LoadPythia();
88 TVirtualMCDecayer* decayer = new AliDecayerPythia();
89 if (runType.EqualTo("hijing2000hf") && hftype < 2)
90 decayer->SetForceDecay(kHadronicD);
91 else
92 decayer->SetForceDecay(kAll);
93 decayer->Init();
94 return decayer;
95 }
96
97 // === PYTHIA ========================================================
98 // Normal
99 /**
100 * Greate a pythia6 event generator
101 *
102 * @param tune Possible tune
103 *
104 * @return newly allocated generator or null
105 */
106 AliGenerator* Pythia(const TString & tune)
107 {
108 // Int_t kCTEQ6l = 8;
109 if (!grp->IsPP()) Fatal("Setup", "Pythia6 only works for pp");
110
111 TString t(tune);
112 t.ToUpper();
113 t.ReplaceAll("PYTHIA6", "");
114 t.ReplaceAll("PYTHIA", "");
115 Info("Setup", "Making Pythia6 event generator (tune: %s)", t.Data());
116
117 LoadPythia();
118 AliGenPythia* pythia = new AliGenPythia(-1);
119 pythia->SetMomentumRange(0, 999999.);
120 pythia->SetThetaRange(0., 180.);
121 pythia->SetYRange(-12.,12.);
122 pythia->SetPtRange(0,1000.);
123 pythia->SetProcess(kPyMb);
124 pythia->SetEnergyCMS(grp->energy);
125
126 if (t == "D6T") {
127 // Tune
128 // 109 D6T : Rick Field's CDF Tune D6T
129 // (NB: needs CTEQ6L pdfs externally)
130 pythia->SetTune(109); // F I X
131 pythia->SetStrucFunc(kCTEQ6l);
132 }
133 else if (t == "PERUGIA0") {
134 // Tune
135 // 320 Perugia 0
136 pythia->SetTune(320);
137 pythia->UseNewMultipleInteractionsScenario();
138 }
139 else if (t == "ATLAS") {
140 // Tune
141 // C 306 ATLAS-CSC: Arthur Moraes' (new) ATLAS tune
142 // (needs CTEQ6L externally)
143 pythia->SetTune(306);
144 pythia->SetStrucFunc(kCTEQ6l);
145 }
146 else if (t == "JETS") {
147 pythia->SetProcess(kPyJets);
148 pythia->SetStrucFunc(kCTEQ6l);
149 pythia->SetJetEtaRange(-1.5, 1.5);
150 pythia->SetJetEtRange(50., 800.);
151 pythia->SetPtHard(45., 1000.);
152 pythia->SetPycellParameters(2.2, 300, 432, 0., 4., 5., 0.7);
153 }
154 else if (t == "ATLAS_FLAT") {
155 // set high multiplicity trigger
156 // this weight achieves a flat multiplicity distribution
157 TH1 *weight = new TH1D("weight","weight",201,-0.5,200.5);
158 weight->SetBinContent(1,5.49443);
159 weight->SetBinContent(2,8.770816);
160 weight->SetBinContent(6,0.4568624);
161 weight->SetBinContent(7,0.2919915);
162 weight->SetBinContent(8,0.6674189);
163 weight->SetBinContent(9,0.364737);
164 weight->SetBinContent(10,0.8818444);
165 weight->SetBinContent(11,0.531885);
166 weight->SetBinContent(12,1.035197);
167 weight->SetBinContent(13,0.9394057);
168 weight->SetBinContent(14,0.9643193);
169 weight->SetBinContent(15,0.94543);
170 weight->SetBinContent(16,0.9426507);
171 weight->SetBinContent(17,0.9423649);
172 weight->SetBinContent(18,0.789456);
173 weight->SetBinContent(19,1.149026);
174 weight->SetBinContent(20,1.100491);
175 weight->SetBinContent(21,0.6350525);
176 weight->SetBinContent(22,1.351941);
177 weight->SetBinContent(23,0.03233504);
178 weight->SetBinContent(24,0.9574557);
179 weight->SetBinContent(25,0.868133);
180 weight->SetBinContent(26,1.030998);
181 weight->SetBinContent(27,1.08897);
182 weight->SetBinContent(28,1.251382);
183 weight->SetBinContent(29,0.1391099);
184 weight->SetBinContent(30,1.192876);
185 weight->SetBinContent(31,0.448944);
186 for (Int_t i = 32; i <= 201; i++) weight->SetBinContent(i,1);
187 weight->SetEntries(526);
188
189 Int_t limit = weight->GetRandom();
190 pythia->SetTriggerChargedMultiplicity(limit, 1.4);
191 }
192 return pythia;
193 }
194 /**
195 * Create a Pythia6 generator for high-flavor physics
196 *
197 * @param type Which kind
198 * @param harder If true, make harder processes
199 *
200 * @return Newly allocated generator or null
201 */
202 AliGenerator* PythiaHF(Int_t type, Bool_t harder=0)
203 {
204 LoadPythia();
205 if (type == 6) return Pythia("jets");
206 if (type == 4) {
207 AliGenParam *jpsi = AliGenParam(1, AliGenMUONlib::kJpsi,
208 (harder?"CDF pp 8.8":"CDF pp 7"),"Jpsi");
209 jpsi->SetPtRange(0.,999.);
210 jpsi->SetYRange(-1.0, 1.0);
211 jpsi->SetPhiRange(0.,360.);
212 jpsi->SetForceDecay(kDiElectron);
213 return jpsi;
214 }
215 AliGenPythia* pythia = static_cast<AliGenPythia*>(Pythia("PERUGIA0"));
216 switch (type) {
217 case 0: // chadr
218 pythia->SetProcess(kPyCharmppMNRwmi);
219 pythia->SetForceDecay(kHadronicD);
220 break;
221 case 1: // bchadr
222 pythia->SetProcess(kPyBeautyppMNRwmi);
223 pythia->SetForceDecay(kHadronicD);
224 break;
225 case 2: // cele
226 pythia->SetProcess(kPyCharmppMNRwmi);
227 pythia->SetCutOnChild(1);
228 pythia->SetPdgCodeParticleforAcceptanceCut(11);
229 pythia->SetChildYRange(-1.2,1.2);
230 pythia->SetChildPtRange(0,10000.);
231 break;
232 case 3: // bele
233 pythia->SetProcess(kPyBeautyppMNRwmi);
234 pythia->SetCutOnChild(1);
235 pythia->SetPdgCodeParticleforAcceptanceCut(11);
236 pythia->SetChildYRange(-1.2,1.2);
237 pythia->SetChildPtRange(0,10000.);
238 break;
239 case 5:
240 pythia->SetProcess(kPyBeautyppMNRwmi);
241 pythia->SetCutOnChild(1);
242 pythia->SetPdgCodeParticleforAcceptanceCut(443);
243 pythia->SetChildYRange(-2,2);
244 pythia->SetChildPtRange(0,10000.);
245 }
246 return pythia;
247 }
248 /**
249 * Make a Min-Bias AA, pA, or Ap Hijing generator
250 *
251 * @param minB Least impact parameter
252 * @param maxB Largest impact parameter
253 * @param quench If true, enable quenching
254 * @param slowN If true, make a cocktail with slow neutrons
255 * @param ptHard Hard pT cut-off
256 *
257 * @return Generator
258 */
259 AliGenerator* Hijing(Float_t minB,
260 Float_t maxB,
261 Bool_t slowN=false,
262 Bool_t quench=1,
263 Float_t ptHard=0)
264 {
265 LoadHijing();
266 AliGenHijing *gener = new AliGenHijing(-1);
267 // centre of mass energy
268 gener->SetEnergyCMS(grp->energy);
269 gener->SetImpactParameterRange(minB, maxB);
270 // reference frame
271 gener->SetReferenceFrame("CMS");
272 // projectil
f3c8e1f4 273 gener->SetTarget (grp->beam1.Name(), grp->beam1.a, grp->beam1.z);
274 gener->SetProjectile(grp->beam2.Name(), grp->beam2.a, grp->beam2.z);
66ff3038 275 // tell hijing to keep the full parent child chain
276 gener->KeepFullEvent();
277 // enable jet quenching
278 gener->SetJetQuenching(quench);
279 // enable shadowing
280 gener->SetShadowing(slowN);
281 // Don't track spectators
282 gener->SetSpectators(!slowN);
283 //
284 if (ptHard > 0) hi->SetPtHardMin(ptHard);
285
286 // kinematic selection
287 gener->SetSelectAll(0);
288 // Boosted CMS
289 gener->SetBoostLHC(grp->IsPA() || grp->IsAP());
290 // No need for cocktail
291 if (!slowN || !grp->IsPA() || !grp->IsAP()) return gener;
292
293 AliGenCocktail* cocktail = new AliGenCocktail();
f3c8e1f4 294 cocktail->SetTarget (grp->beam1.Name(), grp->beam1.a, grp->beam1.z);
295 cocktail->SetProjectile(grp->beam2.Name(), grp->beam2.a, grp->beam2.z);
66ff3038 296 cocktail->SetEnergyCMS(grp->energy);
297
298 AliGenSlowNucleons* gray = new AliGenSlowNucleons(1);
299 AliCollisionGeometry* coll = gener->CollisionGeometry();
300 AliSlowNucleonModelExp* model = new AliSlowNucleonModelExp();
301 // Not yet in the release...
302 // model->SetSaturation(kTRUE);
303 gray->SetSlowNucleonModel(model);
f3c8e1f4 304 gray->SetTarget(grp->beam1.a, grp->beam1.z);
66ff3038 305 gray->SetThetaDist(1);
306 gray->SetProtonDirection(grp->beam1.IsP() ? 1 : 2);
307 // gray->SetDebug(1);
308 gray->SetNominalCmsEnergy(2*grp->beamEnergy);
309 gray->NeedsCollisionGeometry();
310 gray->SetCollisionGeometry(coll);
311
312 cocktail->AddGenerator(gener, "Hijing pPb", 1);
313 cocktail->AddGenerator(gray, "Gray Particles", 1);
314
315 return cocktail;
316 }
317 /**
318 * Make a DPMJet generator for pp, AA, pA, or Ap.
319 *
320 * @param fragments If true, make fragments
321 *
322 * @return Generator
323 */
324 AliGenerator* Dpmjet(Float_t minB, Float_t maxB,
325 Bool_t fragments=0)
326 {
327 LoadDpmjet();
328 AliGenDPMjet* dpmjet = new AliGenDPMjet(-1);
329 dpmjet->SetEnergyCMS(grp->energy);
15cb4a2b 330 dpmjet->SetProjectile(grp->beam2.Name(), grp->beam2.a, grp->beam2.z);
331 dpmjet->SetTarget (grp->beam1.Name(), grp->beam1.a, grp->beam1.z);
66ff3038 332 dpmjet->SetImpactParameterRange(minB, maxB);
15cb4a2b 333 dpmjet->SetProjectileBeamEnergy(grp->beam2.z*grp->beamEnergy/grp->beam2.a);
66ff3038 334 if (grp->IsAA()) {
335 dpmjet->SetPi0Decay(0);
336 }
337 else if (grp->IsPA() || grp->IsAP()) {
f3c8e1f4 338 // dpmjet->SetTriggerParticle(3312, 1.2, 2.0);
701a83f4 339 dpmjet->SetFragmentProd(false/*fragments*/); // Alwas disabled
66ff3038 340 }
341 else if (grp->IsPP()) { // PhoJet
342 dpmjet->SetMomentumRange(0, 999999.);
343 dpmjet->SetThetaRange(0., 180.);
344 dpmjet->SetYRange(-12.,12.);
345 dpmjet->SetPtRange(0,1000.);
346 }
347 return dpmjet;
348 }
349 /**
350 * Make an AMPT generator for AA collisions
351 *
352 * @return Generator
353 */
354 AliGenerator* Ampt(Float_t minB, Float_t maxB)
355 {
356 LoadAmpt();
357 AliGenAmpt *genHi = new AliGenAmpt(-1);
358 genHi->SetEnergyCMS(grp->energy);
359 genHi->SetReferenceFrame("CMS");
f3c8e1f4 360 genHi->SetTarget (grp->beam1.Name(), grp->beam1.a, grp->beam1.z);
361 genHi->SetProjectile(grp->beam2.Name(), grp->beam2.a, grp->beam2.z);
66ff3038 362 genHi->SetPtHardMin (2);
363 genHi->SetImpactParameterRange(minB,maxB);
364 // disable jet quenching
365 genHi->SetJetQuenching(0);
366 // enable shadowing
367 genHi->SetShadowing(1);
368 // neutral pion and heavy particle decays switched off
369 genHi->SetDecaysOff(1);
370 genHi->SetSpectators(0); // track spectators
371 genHi->KeepFullEvent();
372 genHi->SetSelectAll(0);
373 return genHi;
374 }
375 /**
376 * Make an HydJet generator for A-A
377 *
378 * @return Generator
379 */
380 AliGenerator* Hydjet(Float_t minB, Float_t maxB)
381 {
382 LoadHydjet();
383 AliGenUHKM *genHi = new AliGenUHKM(-1);
384 genHi->SetAllParametersLHC();
f3c8e1f4 385 genHi->SetTarget (grp->beam1.Name(), grp->beam1.a, grp->beam1.z);
386 genHi->SetProjectile(grp->beam2.Name(), grp->beam2.a, grp->beam2.z);
66ff3038 387 genHi->SetEcms(grp->energy);
388 genHi->SetEnergyCMS(grp->energy);
389 genHi->SetBmin(minB);
390 genHi->SetBmax(maxB);
391 genHi->SetPyquenPtmin(9);
392 return genHi;
393 }
15cb4a2b 394 // === Lego ========================================================
395 /**
396 * Greate a lego event generator
397 *
398 * @param tune Possible tune
399 *
400 * @return newly allocated generator or null
401 */
402 AliGenerator* Lego(const TString & variant)
403 {
404 fIsLego = true;
405 return 0;
406#if 0
407 TString v(variant);
408 v.ToUpper();
409 v.ReplaceAll("LEGO", "");
410 Info("Setup", "Making Lego event generator (variant: %s)", v.Data());
411
412 AliLegoGenerator* ret = 0;
413 // XYZ varies origin of the particles in two dimensions:
414 // X: o=(0,t1,t2), p=(1,0,0)
415 // Y: o=(t1,0,t2), p=(0,1,0)
416 // Z: o=(t1,t2,0), p=(0,0,1)
417 // PhiZ varies the momentum in two dimensions
418 // o=(0,0,t1) p=(cos(t2),sin(t2),0)
419 // Eta varies momentum in two dimensions
420 // phi=t1
421 // theta=2*atan(exp(-t2))
422 // o=(0,0,0) p=(cos(phi)*sin(theta),sin(phi)*cos(theta),cos(theta))
423 // Base varies in two dimensions
424 // phi=t1
425 // theta=t2
426 // o=(0,0,0) p=(cos(phi)*sin(theta),sin(phi)*cos(theta),cos(theta))
427 if (v.BeginsWith("X") || v.BeginsWith) {
428 const char* c[] = { v(0), '\0' };
429 ret = new AliLegoGeneratorXYZ(c);
430 ret->SetCoor1Range(10,-2,2); // Y, X
431 ret->SetCoor2Range(10,-10,10); // Z
432 }
433 else if (v.BeginsWith("Z")) {
434 ret = new AliLegoGeneratorXYZ("Z");
435 ret->SetCoor1Range(10,-2,2); // X
436 ret->SetCoor2Range(10,-2,2); // Y
437 }
438 else if (v.BeginsWith("PHIZ")) {
439 ret = new AliLegoGeneratorPhiZ();
440 ret->SetCoor1Range(10,-10,10); // Z
441 ret->SetCoor2Range(360,0,360); // phi
442 }
443 else if (v.BeginsWith("ETA")) {
444 ret = new AliLegoGeneratorEta();
445 ret->SetCoor1Range(360,0,360); // phi
446 Double_t aEta = 7;
447 Double_t dEta = (6--4)/200;
448 ret->SetCoor2Range(2*aEta/dEta,-aEta,+aEta); // Eta
449 }
450 else {
451 ret = new AliLegoGenerator();
452 ret->SetCoor1Range(180,0,180); // theta
453 ret->SetCoor1Range(360,0,360); // phi
454 }
455 return ret;
456#endif
457 }
458
66ff3038 459 /**
460 * Make a heavy flavour cocktail
461 *
462 * @param base Underlying event.
463 *
464 * @return Generator
465 */
466 AliGeneator* HFCocktail(const TString& base, Float_t minB, Float_t maxB)
467 {
468
469 AliGenCocktail *cocktail = new AliGenCocktail();
f3c8e1f4 470 cocktail->SetTarget (grp->beam1.Name(), grp->beam1.a, grp->beam1.z);
471 cocktail->SetProjectile(grp->beam2.Name(), grp->beam2.a, grp->beam2.z);
66ff3038 472 cocktail->SetEnergyCMS(grp->energy);
473
474 // Add underlying event
475 if (base.BeginsWith("ampt", TString::kIgnoreCase)) {
476 hi = Ampt(minB, maxB);
477 cocktail->AddGenerator(hi,"ampt",1);
478 }
479 else {
480 hi = Hijing(minB, maxB, grp->IsPA() || grp->IsAP(), false, 2.3);
481 cocktail->AddGenerator(hi,"hijing",1);
482
483 }
484
485 // --- Default formula -------------------------------------------
486 TForumla* one = new TFormula("one", "1.");
487
488 // --- Pythia ----------------------------------------------------
489 AliGenerator* pythia = PythiaHF(hftype);
490 switch (hftype) {
491 case 6:
492 cocktail->AddGenerator(pythia, "pythiaJets", 1, one);
493 break;
494 defualt:
495 cocktail
496 ->AddGenerator(pythia, "pythiaHF", 1,
497 new TFormula("Signals",
498 "20.*(x<5.)+80./3.*(1.-x/20.)*(x>5.)"));
499 break;
500 }
501 // --- Dummy -----------------------------------------------------
502 AliGenParam* param = 0;
503
504 // --- Phos stuff ------------------------------------------------
505 AliGenPHOSlib *plib = new AliGenPHOSlib();
506 Double_t lower[] = { 0, 3, 6, 9, 12, -1 };
507 Double_t *pLow = lower;
508 for (Int_t i = 0; i < 5; i++) {
509 param = new AliGenParam(5, plib, AliGenPHOSlib::kPi0);
510 param->SetPhiRange(0., 360.) ;
511 param->SetYRange(-1.2, 1.2) ;
512 param->SetPtRange(lower[i], 30.) ;
513 cocktail->AddGenerator(param,Form("Pi0HagPt%d", i), 1., one);
514 }
515
516 // --- Jpsi->mu+ mu-----------------------------------------------
517 param = new AliGenParam(1, AliGenMUONlib::kJpsi, "CDF pp 3.94", "Jpsi");
518 param->SetPtRange(0.,999.);
519 param->SetYRange(-4.2, -2.3);
520 param->SetPhiRange(0.,360.);
521 param->SetForceDecay(kDiMuon);
522 param->SetCutOnChild(1);
523 param->SetChildPhiRange(0.,360.);
524 param->SetChildThetaRange(168.5,178.5);
525 cocktail->AddGenerator(param, "Jpsi2M", 1, one);
526
527 // --- Chi_c -> J/Psi + gamma, J/Psi -> e+e- ---------------------
528 Float_t thmin = (180./TMath::Pi())*2.*atan(exp(-1.2));
529 Float_t thmax = (180./TMath::Pi())*2.*atan(exp( 1.2));
530 param = new AliGenParam(1, AliGenMUONlib::kChic,"default","Chic");
531 param->SetMomentumRange(0, 999.); // Wide cut on the momentum
532 param->SetPtRange(0, 100.); // Wide cut on Pt
533 param->SetYRange(-2.5, 2.5);
534 param->SetCutOnChild(1); // Enable cuts on decay products
535 param->SetChildPhiRange(0., 360.);
536 // In the acceptance of the Central Barrel
537 param->SetChildThetaRange(thmin, thmax);
538 // Chi_c -> J/Psi + gamma, J/Psi -> e+e-
539 param->SetForceDecay(kChiToJpsiGammaToElectronElectron);
540 cocktail->AddGenerator(param, "Chi_c", 1, one);
541
542 // --- Dummy -----------------------------------------------------
543 AliGenBox* box = 0;
544
545 // --- Some particles --------------------------------------------
546 Double_t boxR = gRandom->Integer(3)+1;
547 Int_t boxP[] = { 310, 3122, 3312, 3322,
548 (boxR==1 ?3334: boxR==2 ?-3334: -3312) };
549 Int_t boxN[] = { 1, 1, 3, 3, 1 }
550 const char* boxT[] = { "K0s", "Lambda", "Xi-", "Xi0",
551 (boxR==1 ? "Omega-": boxR==2 ? "Omega+": "Xi+") };
552 for (Int_t i = 0; i < 5; i++) {
553 box = new AliGenBox(boxN[i]);
554 box->SetPart(boxP[i]);
555 box->SetPtRange(0,13);
556 box->SetThetaRange(45, 135);
557 cocktail->AddGenerator(box, boxT[i], 1, one);
558 }
559
560 // --- High pT charged particle ----------------------------------
561 TFormula* hptF = new TFormula("High Pt",
562 "5.*(x<5.)+20./3.*(1.-x/20.)*(x > 5.)");
563 Int_t hptP[] = { 211, 321, 2212 };
564 const char* hptT[] = { "pi", "K", "p" };
565 for (Int_t i = 0; i < 3; i++) {
566 for (Int_t j = -1; j <= 1; j++) {
567 box->SetPart(j*hptP[i]);
568 box->SetPtRange(2., 50.);
569 box->SetThetaRange(thmin, thmax);
570 cocktail->AddGenerator(box, Form("%s%c",hptT[i],(j<0,'-','+')),1,hptF);
571 }
572 }
573 return cocktail;
574 }
575
576};
577
578void
579EGConfig()
580{
581 ::Info("EGConfig", "Creating EG factory");
582 egCfg = new EGCfg;
583}
584
585//
586// EOF
587//
588
589