Obsolete include removed
[u/mrichter/AliRoot.git] / EVGEN / AliGenMUONCocktailpp.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 //
19 // Class to create the coktail for physics with muons for pp collisions
20 // using the The followoing sources: 
21 // jpsi, psiP, upsilon, upsilonP, upsilonPP, open charm and open beauty
22 // The free parameeters are :
23 //      pp reaction cross-section
24 //      production cross-sections in pp collisions 
25 // July 07:added heavy quark production from AliGenCorrHF and heavy quark 
26 //         production switched off in Pythia 
27 // Aug. 07: added trigger cut on total momentum
28 // 2009: added possibility to hide x-sections (B. Vulpescu)
29 // 2009: added possibility to have the cocktail (fast generator and param.) 
30 // for pp @ 10 TeV or pp @ 14 TeV (N. Bastid)
31 //-----------------
32 // 2009:  added polarization (L. Bianchi)
33 //------------------
34 // 11/2009: added chi_c1 & chi_c2 (P.Crochet & N.Bastid). 
35 // Cross-sections for charmonia are now directly taken from the Yellow Report 
36 // (hep-ph/0311048) Tab.9, page 19. See below for details w.r.t. beam energy. 
37 // usage: see example of Config in $ALICE_ROOT/prod/LHC09a10/Config.C
38 //------------------------
39 // 04/2010:
40 // - CMS energy passed via parameter
41 // i.e. gener->SetCMSEnergy(AliGenMUONCocktailpp::kCMS07TeV) in Config.C 
42 // - resonances now added to the cocktail via AddReso2Generator 
43 // - cleaning 
44 // B.Vulpescu & P.Crochet         
45  
46 #include <TObjArray.h>
47 #include <TParticle.h>
48 #include <TF1.h>
49 #include <TVirtualMC.h>
50 #include "AliGenCocktailEventHeader.h"
51
52 #include "AliGenCocktailEntry.h"
53 #include "AliGenMUONCocktailpp.h"
54 #include "AliGenMUONlib.h"
55 #include "AliGenParam.h"
56 #include "AliMC.h"
57 #include "AliRun.h"
58 #include "AliStack.h"
59 #include "AliDecayer.h"
60 #include "AliLog.h"
61 #include "AliGenCorrHF.h"
62 #include "AliDecayerPolarized.h"
63
64 ClassImp(AliGenMUONCocktailpp)  
65   
66 //________________________________________________________________________
67 AliGenMUONCocktailpp::AliGenMUONCocktailpp()
68     :AliGenCocktail(),
69      fDecayer(0),
70      fDecayModeResonance(kAll),
71      fDecayModePythia(kAll),
72      fMuonMultiplicity(0),
73      fMuonPtCut(0.),
74      fMuonPCut(0.),
75      fMuonThetaMinCut(0.),
76      fMuonThetaMaxCut(180.),
77      fMuonOriginCut(-999.),
78      fNSucceded(0),
79      fNGenerated(0),
80
81      fJpsiPol(0), 
82      fChic1Pol(0), 
83      fChic2Pol(0), 
84      fPsiPPol(0), 
85      fUpsPol(0), 
86      fUpsPPol(0), 
87      fUpsPPPol(0),
88      fPolFrame(0),
89
90      fCMSEnergyTeV(0),
91      fCMSEnergyTeVArray(),
92      fSigmaReaction(0),  
93      fSigmaReactionArray(),  
94      fSigmaJPsi(0),      
95      fSigmaJPsiArray(),      
96      fSigmaChic1(0),     
97      fSigmaChic1Array(),     
98      fSigmaChic2(0),     
99      fSigmaChic2Array(),     
100      fSigmaPsiP(0),      
101      fSigmaPsiPArray(),      
102      fSigmaUpsilon(0),   
103      fSigmaUpsilonArray(),   
104      fSigmaUpsilonP(0),  
105      fSigmaUpsilonPArray(),  
106      fSigmaUpsilonPP(0), 
107      fSigmaUpsilonPPArray(), 
108      fSigmaCCbar(0),     
109      fSigmaCCbarArray(),     
110      fSigmaBBbar(0),
111      fSigmaBBbarArray(),
112
113      fSigmaSilent(kFALSE)
114 {
115 // Constructor
116
117 // x-sections for pp @ 7 TeV: charmonia from hep-ph/0311048 Tab.9, page 19,
118 // bottomnium as for 10 TeV
119     fCMSEnergyTeVArray[0] =   7.00;
120     fSigmaReactionArray[0] =  0.0695;
121     fSigmaJPsiArray[0] =      21.8e-6;
122     fSigmaChic1Array[0] =     21.1e-6;
123     fSigmaChic2Array[0] =     34.9e-6;
124     fSigmaPsiPArray[0] =      4.93e-6;
125     fSigmaUpsilonArray[0] =   0.463e-6;
126     fSigmaUpsilonPArray[0] =  0.154e-6;
127     fSigmaUpsilonPPArray[0] = 0.0886e-6;
128     fSigmaCCbarArray[0] =     6.91e-3;
129     fSigmaBBbarArray[0] =     0.232e-3;
130     
131 //x-sections for pp @ 10 TeV: charmonia and bottomonia from 14 TeV numbers
132 // scaled down according to ccbar and bbar cross-sections
133     fCMSEnergyTeVArray[1] =   10.00;
134     fSigmaReactionArray[1] =  0.0695;
135     fSigmaJPsiArray[1] =      26.06e-6;
136     fSigmaChic1Array[1] =     25.18e-6;
137     fSigmaChic2Array[1] =     41.58e-6;
138     fSigmaPsiPArray[1] =      5.88e-6;
139     fSigmaUpsilonArray[1] =   0.658e-6;
140     fSigmaUpsilonPArray[1] =  0.218e-6;
141     fSigmaUpsilonPPArray[1] = 0.122e-6;
142     fSigmaCCbarArray[1] =     8.9e-3;
143     fSigmaBBbarArray[1] =     0.33e-3;
144     
145 //x-sections for pp @ 14 TeV: charmonia from hep-ph/0311048 Tab.9, page 19,
146 // bottomonium from hep-ph/0311048 Tab.9, page 19 taken inton account that 
147 // feed-down from chib is included
148     fCMSEnergyTeVArray[2] =   14.00;
149     fSigmaReactionArray[2] =  0.070;
150     fSigmaJPsiArray[2] =      32.9e-6;
151     fSigmaChic1Array[2] =     31.8e-6;
152     fSigmaChic2Array[2] =     52.5e-6;
153     fSigmaPsiPArray[2] =      7.43e-6;
154     fSigmaUpsilonArray[2] =   0.989e-6;
155     fSigmaUpsilonPArray[2] =  0.502e-6;
156     fSigmaUpsilonPPArray[2] = 0.228e-6;
157     fSigmaCCbarArray[2] =     11.2e-3;
158     fSigmaBBbarArray[2] =     0.51e-3;
159     
160 }
161
162 //_________________________________________________________________________
163 AliGenMUONCocktailpp::~AliGenMUONCocktailpp()
164 {
165 // Destructor
166
167 }
168
169 //_________________________________________________________________________
170 void AliGenMUONCocktailpp::SetCMSEnergy(CMSEnergyCode cmsEnergy) 
171 {
172 // setter for CMSEnergy and corresponding cross-sections
173   fCMSEnergyTeV   = fCMSEnergyTeVArray[cmsEnergy];
174   fSigmaReaction  = fSigmaReactionArray[cmsEnergy];  
175   fSigmaJPsi      = fSigmaJPsiArray[cmsEnergy];      
176   fSigmaChic1     = fSigmaChic1Array[cmsEnergy];     
177   fSigmaChic2     = fSigmaChic2Array[cmsEnergy];     
178   fSigmaPsiP      = fSigmaPsiPArray[cmsEnergy];      
179   fSigmaUpsilon   = fSigmaUpsilonArray[cmsEnergy];   
180   fSigmaUpsilonP  = fSigmaUpsilonPArray[cmsEnergy];  
181   fSigmaUpsilonPP = fSigmaUpsilonPPArray[cmsEnergy]; 
182   fSigmaCCbar     = fSigmaCCbarArray[cmsEnergy];     
183   fSigmaBBbar     = fSigmaBBbarArray[cmsEnergy];
184 }
185
186 //_________________________________________________________________________
187 void AliGenMUONCocktailpp::SetResPolarization(Double_t JpsiPol, Double_t PsiPPol, Double_t UpsPol,
188                                 Double_t UpsPPol, Double_t UpsPPPol, char *PolFrame){
189 // setter for resonances polarization   
190    if (strcmp(PolFrame,"kColSop")==0){
191        fJpsiPol  = (JpsiPol>=-1  && JpsiPol<=1)  ? JpsiPol  : 0;
192        fPsiPPol  = (PsiPPol>=-1  && PsiPPol<=1)  ? PsiPPol  : 0;
193        fUpsPol   = (UpsPol>=-1   && UpsPol<=1)   ? UpsPol   : 0;
194        fUpsPPol  = (UpsPPol>=-1  && UpsPPol<=1)  ? UpsPPol  : 0;
195        fUpsPPPol = (UpsPPPol>=-1 && UpsPPPol<=1) ? UpsPPPol : 0;
196        fPolFrame = 0;
197    } else if (strcmp(PolFrame,"kHelicity")==0){
198        fJpsiPol  = (JpsiPol>=-1  && JpsiPol<=1)  ? JpsiPol  : 0;
199        fPsiPPol  = (PsiPPol>=-1  && PsiPPol<=1)  ? PsiPPol  : 0;
200        fUpsPol   = (UpsPol>=-1   && UpsPol<=1)   ? UpsPol   : 0;
201        fUpsPPol  = (UpsPPol>=-1  && UpsPPol<=1)  ? UpsPPol  : 0;
202        fUpsPPPol = (UpsPPPol>=-1 && UpsPPPol<=1) ? UpsPPPol : 0;
203        fPolFrame = 1;
204
205    } else {
206        AliInfo(Form("The polarization frame is not valid"));
207        AliInfo(Form("No polarization will be set"));
208        fJpsiPol=0.;
209        fPsiPPol=0.;
210        fUpsPol=0.;
211        fUpsPPol=0.;
212        fUpsPPPol=0.;
213    }
214 }
215
216 //_________________________________________________________________________
217 void AliGenMUONCocktailpp::CreateCocktail()
218 {
219 // create and add resonances and open HF to the coctail
220     Int_t cmsEnergy = Int_t(fCMSEnergyTeV);
221
222 // These limits are only used for renormalization of quarkonia cross section
223 // Pythia events are generated in 4pi  
224     Double_t ptMin  = fPtMin;
225     Double_t ptMax  = fPtMax;
226     Double_t yMin   = fYMin;;
227     Double_t yMax   = fYMax;;
228     Double_t phiMin = fPhiMin*180./TMath::Pi();
229     Double_t phiMax = fPhiMax*180./TMath::Pi();
230     AliInfo(Form("Ranges pT:%4.1f : %4.1f GeV/c, y:%4.2f : %4.2f, Phi:%5.1f : %5.1f degres",ptMin,ptMax,yMin,yMax,phiMin,phiMax));
231     
232 // Cross sections in barns (from PPR Vol. II p: 552) pp - 14 TeV and 
233 // corrected from feed down of higher resonances 
234
235     Double_t sigmajpsi      = fSigmaJPsi;  
236     Double_t sigmachic1     = fSigmaChic1;  
237     Double_t sigmachic2     = fSigmaChic2;  
238     Double_t sigmapsiP      = fSigmaPsiP;  
239     Double_t sigmaupsilon   = fSigmaUpsilon;  
240     Double_t sigmaupsilonP  = fSigmaUpsilonP;  
241     Double_t sigmaupsilonPP = fSigmaUpsilonPP;
242     Double_t sigmaccbar     = fSigmaCCbar;
243     Double_t sigmabbbar     = fSigmaBBbar;
244
245 // Cross sections corrected with the BR in mu+mu-
246 // (only in case of use of AliDecayerPolarized)
247
248     if(TMath::Abs(fJpsiPol) > 1.e-30) {sigmajpsi      = fSigmaJPsi*0.0593;}
249     if(TMath::Abs(fChic1Pol) > 1.e-30) {sigmachic1     = fSigmaChic1*0.;} // tb consistent
250     if(TMath::Abs(fChic2Pol) > 1.e-30) {sigmachic2     = fSigmaChic2*0.;} // tb consistent 
251     if(TMath::Abs(fPsiPPol) > 1.e-30) {sigmapsiP      = fSigmaPsiP*0.0075;}
252     if(TMath::Abs(fUpsPol) > 1.e-30) {sigmaupsilon   = fSigmaUpsilon*0.0248;}
253     if(TMath::Abs(fUpsPPol) > 1.e-30) {sigmaupsilonP  = fSigmaUpsilonP*0.0193;}
254     if(TMath::Abs(fUpsPPPol) > 1.e-30) {sigmaupsilonPP = fSigmaUpsilonPP*0.0218;}
255
256     AliInfo(Form("the parametrised resonances uses the decay mode %d",fDecayModeResonance));
257
258 // Create and add resonances to the generator
259     AliGenParam * genjpsi=0;
260     AliGenParam * genchic1=0;
261     AliGenParam * genchic2=0;
262     AliGenParam * genpsiP=0;
263     AliGenParam * genupsilon=0;
264     AliGenParam * genupsilonP=0;
265     AliGenParam * genupsilonPP=0;
266     
267     Char_t nameJpsi[10];    
268     Char_t nameChic1[10];    
269     Char_t nameChic2[10];    
270     Char_t namePsiP[10];
271     Char_t nameUps[10];    
272     Char_t nameUpsP[10];    
273     Char_t nameUpsPP[10];    
274
275     sprintf(nameJpsi,"Jpsi");    
276     sprintf(nameChic1,"Chic1");
277     sprintf(nameChic2,"Chic2");
278     sprintf(namePsiP,"PsiP");
279     sprintf(nameUps,"Ups");
280     sprintf(nameUpsP,"UpsP");
281     sprintf(nameUpsPP,"UpsPP");
282
283     if(cmsEnergy == 10){
284         genjpsi = new AliGenParam(1, AliGenMUONlib::kJpsi, "CDF pp 10", "Jpsi");
285         genchic1 = new AliGenParam(1, AliGenMUONlib::kChic1, "CDF pp 10", "Chic1");
286         genchic2 = new AliGenParam(1, AliGenMUONlib::kChic2, "CDF pp 10", "Chic2");
287         genpsiP = new AliGenParam(1, AliGenMUONlib::kPsiP, "CDF pp 10", "PsiP");
288         genupsilon = new AliGenParam(1, AliGenMUONlib::kUpsilon, "CDF pp 10", "Upsilon");
289
290         genupsilonP = new AliGenParam(1, AliGenMUONlib::kUpsilonP, "CDF pp 10", "UpsilonP");
291         genupsilonPP = new AliGenParam(1, AliGenMUONlib::kUpsilonPP, "CDF pp 10", "UpsilonPP");
292     } else if (cmsEnergy == 7){
293         genjpsi = new AliGenParam(1, AliGenMUONlib::kJpsi, "CDF pp 7", "Jpsi");
294         genchic1 = new AliGenParam(1, AliGenMUONlib::kChic1, "CDF pp 7", "Chic1");
295         genchic2 = new AliGenParam(1, AliGenMUONlib::kChic2, "CDF pp 7", "Chic2");
296         genpsiP = new AliGenParam(1, AliGenMUONlib::kPsiP, "CDF pp 7", "PsiP");
297
298         genupsilon = new AliGenParam(1, AliGenMUONlib::kUpsilon, "CDF pp 7", "Upsilon");
299         genupsilonP = new AliGenParam(1, AliGenMUONlib::kUpsilonP, "CDF pp 7", "UpsilonP");
300         genupsilonPP = new AliGenParam(1, AliGenMUONlib::kUpsilonPP, "CDF pp 7", "UpsilonPP");
301     } else if (cmsEnergy == 14){
302         genjpsi = new AliGenParam(1, AliGenMUONlib::kJpsi, "CDF pp ", "Jpsi");
303         genchic1 = new AliGenParam(1, AliGenMUONlib::kChic1, "CDF pp ", "Chic1");
304         genchic2 = new AliGenParam(1, AliGenMUONlib::kChic2, "CDF pp ", "Chic2");
305         genpsiP = new AliGenParam(1, AliGenMUONlib::kPsiP, "CDF pp", "PsiP");
306
307         genupsilon = new AliGenParam(1, AliGenMUONlib::kUpsilon, "CDF pp", "Upsilon");
308         genupsilonP = new AliGenParam(1, AliGenMUONlib::kUpsilonP, "CDF pp", "UpsilonP");
309
310         genupsilonPP = new AliGenParam(1, AliGenMUONlib::kUpsilonPP, "CDF pp", "UpsilonPP");    
311     }
312
313     AddReso2Generator(nameJpsi,genjpsi,sigmajpsi,fJpsiPol);
314     AddReso2Generator(nameChic1,genchic2,sigmachic1,fChic2Pol);
315     AddReso2Generator(nameChic2,genpsiP,sigmapsiP,fPsiPPol);    
316     AddReso2Generator(namePsiP,genchic1,sigmachic1,fChic1Pol);    
317     AddReso2Generator(nameUps,genupsilon,sigmaupsilon,fUpsPol);    
318     AddReso2Generator(nameUpsP,genupsilonP,sigmaupsilonP,fUpsPPol);    
319     AddReso2Generator(nameUpsPP,genupsilonPP,sigmaupsilonPP,fUpsPPPol);    
320
321 //------------------------------------------------------------------
322 // Generator of charm
323     AliGenCorrHF *gencharm = new AliGenCorrHF(1, 4, cmsEnergy);
324     gencharm->SetMomentumRange(0,9999);
325     gencharm->SetForceDecay(kAll);
326     Double_t ratioccbar = sigmaccbar/fSigmaReaction;
327     if (!gMC) gencharm->SetDecayer(fDecayer);  
328     gencharm->Init();
329     if (!fSigmaSilent) {
330       AliInfo(Form("c-cbar prod. cross-section in pp %5.3g b",sigmaccbar));
331       AliInfo(Form("c-cbar prod. probability per collision in acceptance %5.3g",ratioccbar));
332     }
333     AddGenerator(gencharm,"CorrHFCharm",ratioccbar);
334 //------------------------------------------------------------------
335 // Generator of beauty
336     AliGenCorrHF *genbeauty = new AliGenCorrHF(1, 5, cmsEnergy);
337     genbeauty->SetMomentumRange(0,9999);
338     genbeauty->SetForceDecay(kAll);
339     Double_t ratiobbbar = sigmabbbar/fSigmaReaction;
340     if (!gMC) genbeauty->SetDecayer(fDecayer);  
341     genbeauty->Init();
342     if (!fSigmaSilent) {
343       AliInfo(Form("b-bbar prod. cross-section in pp  %5.3g b",sigmabbbar));
344       AliInfo(Form("b-bbar prod. probability per collision in acceptance %5.3g",ratiobbbar));
345     }
346     AddGenerator(genbeauty,"CorrHFBeauty",ratiobbbar);
347
348 //-------------------------------------------------------------------
349 // Pythia generator
350 //
351 // This has to go into the Config.C
352 //
353 //    AliGenPythia *pythia = new AliGenPythia(1);
354 //    pythia->SetProcess(kPyMbMSEL1);
355 //    pythia->SetStrucFunc(kCTEQ5L);
356 //    pythia->SetEnergyCMS(14000.);
357 //    AliInfo(Form("\n\npythia uses the decay mode %d", GetDecayModePythia()));
358 //    Decay_t dt = gener->GetDecayModePythia();
359 //    pythia->SetForceDecay(dt);
360 //    pythia->SetPtRange(0.,100.);
361 //    pythia->SetYRange(-8.,8.);
362 //    pythia->SetPhiRange(0.,360.);
363 //    pythia->SetPtHard(2.76,-1.0);
364 //    pythia->SwitchHFOff();
365 //    pythia->Init(); 
366 //    AddGenerator(pythia,"Pythia",1);
367
368 }
369
370 //-------------------------------------------------------------------
371 void AliGenMUONCocktailpp::AddReso2Generator(Char_t* nameReso, 
372                                              AliGenParam* const genReso,
373                                              Double_t sigmaReso,
374                                              Double_t polReso)
375 {
376 // add resonances to the cocktail
377     Double_t phiMin = fPhiMin*180./TMath::Pi();
378     Double_t phiMax = fPhiMax*180./TMath::Pi();
379
380     // first step: generation in 4pi
381     genReso->SetPtRange(0.,100.); 
382     genReso->SetYRange(-8.,8.);
383     genReso->SetPhiRange(0.,360.);
384     genReso->SetForceDecay(fDecayModeResonance);
385     if (!gMC) genReso->SetDecayer(fDecayer);  
386     genReso->Init();  // generation in 4pi
387 // Ratios with respect to the reaction cross-section in the 
388 // kinematics limit of the MUONCocktail
389     Double_t ratioReso = sigmaReso / fSigmaReaction * genReso->GetRelativeArea(fPtMin,fPtMax,fYMin,fYMax,phiMin,phiMax);
390     if (!fSigmaSilent) {
391       AliInfo(Form("%s prod. cross-section in pp %5.3g b",nameReso,sigmaReso));
392       AliInfo(Form("%s prod. probability per collision in acceptance %5.3g",nameReso,ratioReso));
393     }
394 // second step: generation in selected kinematical range
395     genReso->SetPtRange(fPtMin, fPtMax);  
396     genReso->SetYRange(fYMin, fYMax);
397     genReso->SetPhiRange(phiMin, phiMax);
398     genReso->Init(); // generation in selected kinematical range
399
400      TVirtualMCDecayer *decReso = 0;
401      if(TMath::Abs(polReso) > 1.e-30){
402       AliInfo(Form("******Setting polarized decayer for %s''",nameReso));
403       if(fPolFrame==0) {
404         decReso = new AliDecayerPolarized(polReso,AliDecayerPolarized::kColSop,AliDecayerPolarized::kMuon);
405         AliInfo(Form("******Reference frame: %s, alpha: %f","Collins-Soper",polReso));
406           }
407       if(fPolFrame==1) {
408         decReso = new AliDecayerPolarized(polReso,AliDecayerPolarized::kHelicity,AliDecayerPolarized::kMuon);
409         AliInfo(Form("******Reference frame: %s, alpha: %f","Helicity",polReso));
410           }
411       decReso->SetForceDecay(kAll);
412       decReso->Init();
413       genReso->SetDecayer(decReso);
414      }
415     
416     AddGenerator(genReso,nameReso,ratioReso); // Adding Generator    
417 }
418
419 //-------------------------------------------------------------------
420 void AliGenMUONCocktailpp::Init()
421 {
422     // Initialisation
423     TIter next(fEntries);
424     AliGenCocktailEntry *entry;
425     if (fStack) {
426         while((entry = (AliGenCocktailEntry*)next())) {
427             entry->Generator()->SetStack(fStack);
428         }
429     }
430 }
431
432 //_________________________________________________________________________
433 void AliGenMUONCocktailpp::Generate()
434 {
435 // Generate event 
436     TIter next(fEntries);
437     AliGenCocktailEntry *entry = 0;
438     AliGenCocktailEntry *preventry = 0;
439     AliGenerator* gen = 0;
440
441     if (fHeader) delete fHeader;
442     fHeader = new AliGenCocktailEventHeader("MUON Cocktail Header");
443
444     const TObjArray *partArray = gAlice->GetMCApp()->Particles();
445     
446 // Generate the vertex position used by all generators    
447     if(fVertexSmear == kPerEvent) Vertex();
448
449 // Loop on primordialTrigger: 
450 // minimum muon multiplicity above a pt cut in a theta acceptance region
451
452     Bool_t primordialTrigger = kFALSE;
453     while(!primordialTrigger) {
454         //Reseting stack
455         AliRunLoader * runloader = AliRunLoader::Instance();
456         if (runloader)
457             if (runloader->Stack())
458                 runloader->Stack()->Clean();
459         // Loop over generators and generate events
460         Int_t igen = 0;
461         Int_t npart = 0;        
462         const char* genName = 0;
463         while((entry = (AliGenCocktailEntry*)next())) {
464             gen = entry->Generator();
465             genName = entry->GetName();
466             gen->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
467
468             npart = (strcmp(genName,"Pythia") == 0) ? 1 :
469                 gRandom->Poisson(entry->Rate());
470
471             if (npart > 0) {
472                 igen++; 
473                 if (igen == 1) entry->SetFirst(0);              
474                 else  entry->SetFirst((partArray->GetEntriesFast())+1);
475                 
476                 gen->SetNumberParticles(npart);         
477                 gen->Generate();
478                 entry->SetLast(partArray->GetEntriesFast());
479                 preventry = entry;
480             }
481         }  
482         next.Reset();
483
484
485 // Testing primordial trigger: Single muons or dimuons with Pt above a Pt cut 
486 // in the muon spectrometer acceptance
487         Int_t iPart;
488         fNGenerated++;
489         Int_t numberOfMuons=0;Int_t maxPart = partArray->GetEntriesFast();
490         for(iPart=0; iPart<maxPart; iPart++){      
491             
492           TParticle *part = gAlice->GetMCApp()->Particle(iPart);
493           if ( TMath::Abs(part->GetPdgCode()) == 13 ){  
494             if((part->Vz() > fMuonOriginCut) && //take only the muons that decayed before the abs + 1 int. length in C abs
495                (part->Theta()*180./TMath::Pi()>fMuonThetaMinCut) &&
496                (part->Theta()*180./TMath::Pi()<fMuonThetaMaxCut) &&
497                (part->Pt()>fMuonPtCut) &&
498                (part->P()>fMuonPCut)) {
499               numberOfMuons++;
500             }
501           }
502         }       
503         if (numberOfMuons >= fMuonMultiplicity) {
504           primordialTrigger = kTRUE;
505           fHeader->SetNProduced(maxPart);
506         }
507
508     }
509     fNSucceded++;
510
511     TArrayF eventVertex;
512     eventVertex.Set(3);
513     for (Int_t j=0; j < 3; j++) eventVertex[j] = fVertex[j];
514
515     fHeader->SetPrimaryVertex(eventVertex);
516
517     gAlice->SetGenEventHeader(fHeader);
518
519 //     AliInfo(Form("Generated Events are %d and Succeeded Events are %d",fNGenerated,fNSucceded));
520     AliDebug(5,Form("Generated Events are %d and Succeeded Events are %d",fNGenerated,fNSucceded));
521 }
522
523