Corrected define guard
[u/mrichter/AliRoot.git] / EVGEN / AliGenParam.cxx
CommitLineData
4c039060 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
88cb7938 16/* $Id$ */
6d4dd317 17
18// Class to generate particles from using paramtrized pT and y distributions.
19// Distributions are obtained from pointer to object of type AliGenLib.
20// (For example AliGenMUONlib)
21// Decays are performed using Pythia.
22// andreas.morsch@cern.ch
23
ac3faee4 24#include <TCanvas.h>
7ca4655f 25#include <TClonesArray.h>
fa480368 26#include <TDatabasePDG.h>
ac3faee4 27#include <TF1.h>
28#include <TH1F.h>
fa480368 29#include <TLorentzVector.h>
ac3faee4 30#include <TMath.h>
31#include <TParticle.h>
32#include <TParticlePDG.h>
828fff0d 33#include <TROOT.h>
ac3faee4 34#include <TVirtualMC.h>
fa480368 35
ac3faee4 36#include "AliDecayer.h"
37#include "AliGenMUONlib.h"
38#include "AliGenParam.h"
5d12ce38 39#include "AliMC.h"
ac3faee4 40#include "AliRun.h"
7cf36cae 41#include "AliGenEventHeader.h"
fe4da5cc 42
43ClassImp(AliGenParam)
44
45//------------------------------------------------------------
46
6078e216 47//Begin_Html
48/*
1439f98e 49 <img src="picts/AliGenParam.gif">
6078e216 50*/
51//End_Html
fe4da5cc 52
53//____________________________________________________________
6078e216 54AliGenParam::AliGenParam()
55: fPtParaFunc(0),
1c56e311 56 fYParaFunc(0),
57 fIpParaFunc(0),
6078e216 58 fV2ParaFunc(0),
1c56e311 59 fPtPara(0),
60 fYPara(0),
6078e216 61 fV2Para(0),
62 fdNdPhi(0),
1c56e311 63 fParam(0),
64 fdNdy0(0.),
65 fYWgt(0.),
66 fPtWgt(0.),
67 fBias(0.),
68 fTrials(0),
69 fDeltaPt(0.01),
18e09c20 70 fSelectAll(kFALSE),
1c56e311 71 fDecayer(0)
fe4da5cc 72{
6078e216 73 // Default constructor
b22ee262 74}
2ad38d56 75//____________________________________________________________
f2c13e03 76AliGenParam::AliGenParam(Int_t npart, const AliGenLib * Library, Int_t param, const char* tname)
1c56e311 77 :AliGenMC(npart),
78 fPtParaFunc(Library->GetPt(param, tname)),
79 fYParaFunc (Library->GetY (param, tname)),
80 fIpParaFunc(Library->GetIp(param, tname)),
6078e216 81 fV2ParaFunc(Library->GetV2(param, tname)),
1c56e311 82 fPtPara(0),
83 fYPara(0),
6078e216 84 fV2Para(0),
85 fdNdPhi(0),
1c56e311 86 fParam(param),
87 fdNdy0(0.),
88 fYWgt(0.),
89 fPtWgt(0.),
90 fBias(0.),
91 fTrials(0),
92 fDeltaPt(0.01),
18e09c20 93 fSelectAll(kFALSE),
1c56e311 94 fDecayer(0)
b22ee262 95{
6078e216 96 // Constructor using number of particles parameterisation id and library
8b31bfac 97 fName = "Param";
98 fTitle= "Particle Generator using pT and y parameterisation";
34f60c01 99 fAnalog = kAnalog;
b22ee262 100 SetForceDecay();
fe4da5cc 101}
fe4da5cc 102//____________________________________________________________
1c56e311 103AliGenParam::AliGenParam(Int_t npart, Int_t param, const char* tname, const char* name):
104 AliGenMC(npart),
105 fPtParaFunc(0),
106 fYParaFunc (0),
107 fIpParaFunc(0),
6078e216 108 fV2ParaFunc(0),
1c56e311 109 fPtPara(0),
110 fYPara(0),
6078e216 111 fV2Para(0),
112 fdNdPhi(0),
1c56e311 113 fParam(param),
114 fdNdy0(0.),
115 fYWgt(0.),
116 fPtWgt(0.),
117 fBias(0.),
118 fTrials(0),
119 fDeltaPt(0.01),
18e09c20 120 fSelectAll(kFALSE),
1c56e311 121 fDecayer(0)
fe4da5cc 122{
6078e216 123 // Constructor using parameterisation id and number of particles
124 //
1c56e311 125 fName = name;
126 fTitle= "Particle Generator using pT and y parameterisation";
8b31bfac 127
675e9664 128 AliGenLib* pLibrary = new AliGenMUONlib();
675e9664 129 fPtParaFunc = pLibrary->GetPt(param, tname);
130 fYParaFunc = pLibrary->GetY (param, tname);
131 fIpParaFunc = pLibrary->GetIp(param, tname);
6078e216 132 fV2ParaFunc = pLibrary->GetV2(param, tname);
b22ee262 133
34f60c01 134 fAnalog = kAnalog;
b22ee262 135 fChildSelect.Set(5);
136 for (Int_t i=0; i<5; i++) fChildSelect[i]=0;
137 SetForceDecay();
138 SetCutOnChild();
139 SetChildMomentumRange();
140 SetChildPtRange();
141 SetChildPhiRange();
142 SetChildThetaRange();
fe4da5cc 143}
2ad38d56 144//____________________________________________________________
fe4da5cc 145
34f60c01 146AliGenParam::AliGenParam(Int_t npart, Int_t param,
75e0cc59 147 Double_t (*PtPara) (const Double_t*, const Double_t*),
148 Double_t (*YPara ) (const Double_t* ,const Double_t*),
6078e216 149 Double_t (*V2Para) (const Double_t* ,const Double_t*),
65fb704d 150 Int_t (*IpPara) (TRandom *))
1c56e311 151 :AliGenMC(npart),
152
153 fPtParaFunc(PtPara),
154 fYParaFunc(YPara),
155 fIpParaFunc(IpPara),
6078e216 156 fV2ParaFunc(V2Para),
1c56e311 157 fPtPara(0),
158 fYPara(0),
6078e216 159 fV2Para(0),
160 fdNdPhi(0),
1c56e311 161 fParam(param),
162 fdNdy0(0.),
163 fYWgt(0.),
164 fPtWgt(0.),
165 fBias(0.),
166 fTrials(0),
167 fDeltaPt(0.01),
18e09c20 168 fSelectAll(kFALSE),
1c56e311 169 fDecayer(0)
886b6f73 170{
6078e216 171 // Constructor
172 // Gines Martinez 1/10/99
8b31bfac 173 fName = "Param";
174 fTitle= "Particle Generator using pT and y parameterisation";
175
34f60c01 176 fAnalog = kAnalog;
886b6f73 177 fChildSelect.Set(5);
178 for (Int_t i=0; i<5; i++) fChildSelect[i]=0;
179 SetForceDecay();
180 SetCutOnChild();
749070b6 181 SetChildMomentumRange();
182 SetChildPtRange();
183 SetChildPhiRange();
184 SetChildThetaRange();
886b6f73 185}
186
fe4da5cc 187//____________________________________________________________
188AliGenParam::~AliGenParam()
189{
6078e216 190 // Destructor
fe4da5cc 191 delete fPtPara;
192 delete fYPara;
6078e216 193 delete fV2Para;
194 delete fdNdPhi;
fe4da5cc 195}
196
197//____________________________________________________________
198void AliGenParam::Init()
199{
6078e216 200 // Initialisation
fa480368 201
2904363f 202 if (gMC) fDecayer = gMC->GetDecayer();
fe4da5cc 203 //Begin_Html
204 /*
1439f98e 205 <img src="picts/AliGenParam.gif">
fe4da5cc 206 */
207 //End_Html
c5c3e4b0 208 char name[256];
8f8399ab 209 snprintf(name, 256, "pt-parameterisation for %s", GetName());
c5c3e4b0 210
2ad38d56 211 if (fPtPara) fPtPara->Delete();
c5c3e4b0 212 fPtPara = new TF1(name, fPtParaFunc, fPtMin, fPtMax,0);
828fff0d 213 gROOT->GetListOfFunctions()->Remove(fPtPara);
6078e216 214 // Set representation precision to 10 MeV
c5c3e4b0 215 Int_t npx= Int_t((fPtMax - fPtMin) / fDeltaPt);
749070b6 216
217 fPtPara->SetNpx(npx);
c5c3e4b0 218
8f8399ab 219 snprintf(name, 256, "y-parameterisation for %s", GetName());
2ad38d56 220 if (fYPara) fYPara->Delete();
c5c3e4b0 221 fYPara = new TF1(name, fYParaFunc, fYMin, fYMax, 0);
828fff0d 222 gROOT->GetListOfFunctions()->Remove(fYPara);
223
6078e216 224 snprintf(name, 256, "v2-parameterisation for %s", GetName());
225 if (fV2Para) fV2Para->Delete();
226 fV2Para = new TF1(name, fV2ParaFunc, fPtMin, fPtMax, 0);
227 // fV2Para = new TF1(name, "2*[0]/(1+TMath::Exp([1]*([2]-x)))-[0]", fPtMin, fPtMax);
228 // fV2Para->SetParameter(0, 0.236910);
229 // fV2Para->SetParameter(1, 1.71122);
230 // fV2Para->SetParameter(2, 0.0827617);
231 //gROOT->GetListOfFunctions()->Remove(fV2Para); //TR: necessary?
232
233 snprintf(name, 256, "dNdPhi for %s", GetName());
234 if (fdNdPhi) fdNdPhi->Delete();
235 fdNdPhi = new TF1(name, "1+2*[0]*TMath::Cos(2*(x-[1]))", fPhiMin, fPhiMax);
236 //gROOT->GetListOfFunctions()->Remove(fdNdPhi); //TR: necessary?
749070b6 237
8f8399ab 238 snprintf(name, 256, "pt-for-%s", GetName());
c5c3e4b0 239 TF1 ptPara(name ,fPtParaFunc, 0, 15, 0);
8f8399ab 240 snprintf(name, 256, "y-for-%s", GetName());
c5c3e4b0 241 TF1 yPara(name, fYParaFunc, -6, 6, 0);
b7601ac4 242
6078e216 243 //
244 // dN/dy| y=0
749070b6 245 Double_t y1=0;
246 Double_t y2=0;
247
248 fdNdy0=fYParaFunc(&y1,&y2);
6078e216 249 //
250 // Integral over generation region
389a9124 251 Float_t intYS = yPara.Integral(fYMin, fYMax,(Double_t*) 0x0,1.e-6);
252 Float_t intPt0 = ptPara.Integral(0,15,(Double_t *) 0x0,1.e-6);
253 Float_t intPtS = ptPara.Integral(fPtMin,fPtMax,(Double_t*) 0x0,1.e-6);
6078e216 254 Float_t phiWgt=(fPhiMax-fPhiMin)/2./TMath::Pi(); //TR: should probably be done differently in case of anisotropic phi...
34f60c01 255 if (fAnalog == kAnalog) {
749070b6 256 fYWgt = intYS/fdNdy0;
257 fPtWgt = intPtS/intPt0;
258 fParentWeight = fYWgt*fPtWgt*phiWgt/fNpart;
259 } else {
260 fYWgt = intYS/fdNdy0;
261 fPtWgt = (fPtMax-fPtMin)/intPt0;
262 fParentWeight = fYWgt*fPtWgt*phiWgt/fNpart;
263 }
6078e216 264 //
265 // particle decay related initialization
00d6ce7d 266 fDecayer->SetForceDecay(fForceDecay);
fa480368 267 fDecayer->Init();
00d6ce7d 268
6078e216 269 //
fff02fee 270 AliGenMC::Init();
fe4da5cc 271}
272
273//____________________________________________________________
274void AliGenParam::Generate()
275{
d5615b85 276 //
277 // Generate 1 event (see Generate(Int_t ntimes) for details
6078e216 278 //
d5615b85 279 GenerateN(1);
280}
281//____________________________________________________________
282void AliGenParam::GenerateN(Int_t ntimes)
283{
284 //
285 // Generate ntimes*'npart' light and heavy mesons (J/Psi, upsilon or phi, Pion,
6078e216 286 // Kaons, Etas, Omegas) and Baryons (proton, antiprotons, neutrons and
287 // antineutrons in the the desired theta, phi and momentum windows;
288 // Gaussian smearing on the vertex is done if selected.
289 // The decay of heavy mesons is done using lujet,
290 // and the childern particle are tracked by GEANT
291 // However, light mesons are directly tracked by GEANT
292 // setting fForceDecay = nodecay (SetForceDecay(nodecay))
293 //
294 //
295 // Reinitialize decayer
2ad38d56 296 fDecayer->SetForceDecay(fForceDecay);
297 fDecayer->Init();
298
6078e216 299 //
28337bc1 300 Float_t polar[3]= {0,0,0}; // Polarisation of the parent particle (for GEANT tracking)
301 Float_t origin0[3]; // Origin of the generated parent particle (for GEANT tracking)
21391258 302 Float_t time0; // Time0 of the generated parent particle
28337bc1 303 Float_t pt, pl, ptot; // Transverse, logitudinal and total momenta of the parent particle
304 Float_t phi, theta; // Phi and theta spherical angles of the parent particle momentum
305 Float_t p[3], pc[3],
fff02fee 306 och[3]; // Momentum, polarisation and origin of the children particles from lujet
2d7a47be 307 Double_t ty, xmt;
fff02fee 308 Int_t nt, i, j;
fe4da5cc 309 Float_t wgtp, wgtch;
310 Double_t dummy;
09fd3ea2 311 static TClonesArray *particles;
fe4da5cc 312 //
fff02fee 313 if(!particles) particles = new TClonesArray("TParticle",1000);
8b31bfac 314
349be858 315 TDatabasePDG *pDataBase = TDatabasePDG::Instance();
fe4da5cc 316 //
317 Float_t random[6];
28337bc1 318
6078e216 319 // Calculating vertex position per event
fe4da5cc 320 for (j=0;j<3;j++) origin0[j]=fOrigin[j];
21391258 321 time0 = fTimeOrigin;
aee8290b 322 if(fVertexSmear==kPerEvent) {
d9ea0e3b 323 Vertex();
324 for (j=0;j<3;j++) origin0[j]=fVertex[j];
21391258 325 time0 = fTime;
fe4da5cc 326 }
d9ea0e3b 327
21aaa175 328 Int_t ipa=0;
fff02fee 329
6078e216 330 // Generating fNpart particles
7cf36cae 331 fNprimaries = 0;
332
d5615b85 333 Int_t nGen = fNpart*ntimes;
334 while (ipa<nGen) {
cc5d764c 335 while(1) {
6078e216 336 //
337 // particle type
65fb704d 338 Int_t iPart = fIpParaFunc(fRandom);
fa480368 339 fChildWeight=(fDecayer->GetPartialBranchingRatio(iPart))*fParentWeight;
675e9664 340 TParticlePDG *particle = pDataBase->GetParticle(iPart);
fa480368 341 Float_t am = particle->Mass();
8b31bfac 342
65fb704d 343 Rndm(random,2);
6078e216 344 //
345 // y
2d7a47be 346 ty = TMath::TanH(fYPara->GetRandom());
6078e216 347 //
348 // pT
34f60c01 349 if (fAnalog == kAnalog) {
fe4da5cc 350 pt=fPtPara->GetRandom();
351 wgtp=fParentWeight;
352 wgtch=fChildWeight;
353 } else {
354 pt=fPtMin+random[1]*(fPtMax-fPtMin);
355 Double_t ptd=pt;
356 wgtp=fParentWeight*fPtParaFunc(& ptd, &dummy);
357 wgtch=fChildWeight*fPtParaFunc(& ptd, &dummy);
358 }
359 xmt=sqrt(pt*pt+am*am);
2d7a47be 360 if (TMath::Abs(ty)==1.) {
361 ty=0.;
362 Fatal("AliGenParam",
363 "Division by 0: Please check you rapidity range !");
364 }
6078e216 365 //
366 // phi
367 // if(!ipa)
368 // phi=fEvPlane; //align first particle of each event with event plane
369 // else{
370 double v2 = fV2Para->Eval(pt);
371 fdNdPhi->SetParameter(0,v2);
372 fdNdPhi->SetParameter(1,fEvPlane);
373 phi=fdNdPhi->GetRandom();
374 // }
2d7a47be 375
60e55aee 376 pl=xmt*ty/sqrt((1.-ty)*(1.+ty));
fe4da5cc 377 theta=TMath::ATan2(pt,pl);
6078e216 378 // Cut on theta
fe4da5cc 379 if(theta<fThetaMin || theta>fThetaMax) continue;
380 ptot=TMath::Sqrt(pt*pt+pl*pl);
6078e216 381 // Cut on momentum
fe4da5cc 382 if(ptot<fPMin || ptot>fPMax) continue;
6078e216 383 //
fe4da5cc 384 p[0]=pt*TMath::Cos(phi);
385 p[1]=pt*TMath::Sin(phi);
386 p[2]=pl;
aee8290b 387 if(fVertexSmear==kPerTrack) {
65fb704d 388 Rndm(random,6);
fe4da5cc 389 for (j=0;j<3;j++) {
390 origin0[j]=
391 fOrigin[j]+fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())*
392 TMath::Sqrt(-2*TMath::Log(random[2*j+1]));
393 }
21391258 394 Rndm(random,2);
395 time0 = fTimeOrigin + fOsigma[2]/TMath::Ccgs()*
396 TMath::Cos(2*random[0]*TMath::Pi())*
397 TMath::Sqrt(-2*TMath::Log(random[1]));
fe4da5cc 398 }
28337bc1 399
6078e216 400 // Looking at fForceDecay :
401 // if fForceDecay != none Primary particle decays using
402 // AliPythia and children are tracked by GEANT
403 //
404 // if fForceDecay == none Primary particle is tracked by GEANT
405 // (In the latest, make sure that GEANT actually does all the decays you want)
406 //
cd716030 407 Bool_t decayed = kFALSE;
408
fff02fee 409
34f60c01 410 if (fForceDecay != kNoDecay) {
6078e216 411 // Using lujet to decay particle
886b6f73 412 Float_t energy=TMath::Sqrt(ptot*ptot+am*am);
fa480368 413 TLorentzVector pmom(p[0], p[1], p[2], energy);
414 fDecayer->Decay(iPart,&pmom);
6078e216 415 //
416 // select decay particles
fa480368 417 Int_t np=fDecayer->ImportParticles(particles);
1242532d 418
419 // Selecting GeometryAcceptance for particles fPdgCodeParticleforAcceptanceCut;
420 if (fGeometryAcceptance)
421 if (!CheckAcceptanceGeometry(np,particles)) continue;
886b6f73 422 Int_t ncsel=0;
fff02fee 423 Int_t* pFlag = new Int_t[np];
424 Int_t* pParent = new Int_t[np];
425 Int_t* pSelected = new Int_t[np];
426 Int_t* trackIt = new Int_t[np];
427
428 for (i=0; i<np; i++) {
429 pFlag[i] = 0;
430 pSelected[i] = 0;
431 pParent[i] = -1;
432 }
433
6ba00c52 434 if (np >1) {
cd716030 435 decayed = kTRUE;
08bffa4d 436 TParticle* iparticle = 0;
fff02fee 437 Int_t ipF, ipL;
438 for (i = 1; i<np ; i++) {
439 trackIt[i] = 1;
6ba00c52 440 iparticle = (TParticle *) particles->At(i);
441 Int_t kf = iparticle->GetPdgCode();
fff02fee 442 Int_t ks = iparticle->GetStatusCode();
6078e216 443 // flagged particle
fff02fee 444
445 if (pFlag[i] == 1) {
fff02fee 446 ipF = iparticle->GetFirstDaughter();
447 ipL = iparticle->GetLastDaughter();
448 if (ipF > 0) for (j=ipF-1; j<ipL; j++) pFlag[j]=1;
449 continue;
450 }
451
6078e216 452 // flag decay products of particles with long life-time (c tau > .3 mum)
fff02fee 453
454 if (ks != 1) {
6078e216 455 // TParticlePDG *particle = pDataBase->GetParticle(kf);
fff02fee 456
457 Double_t lifeTime = fDecayer->GetLifetime(kf);
6078e216 458 // Double_t mass = particle->Mass();
459 // Double_t width = particle->Width();
47fc6bd5 460 if (lifeTime > (Double_t) fMaxLifeTime) {
fff02fee 461 ipF = iparticle->GetFirstDaughter();
462 ipL = iparticle->GetLastDaughter();
463 if (ipF > 0) for (j=ipF-1; j<ipL; j++) pFlag[j]=1;
464 } else{
465 trackIt[i] = 0;
466 pSelected[i] = 1;
467 }
468 } // ks==1 ?
6078e216 469 //
470 // children
47fc6bd5 471
18e09c20 472 if ((ChildSelected(TMath::Abs(kf)) || fForceDecay == kAll || fSelectAll) && trackIt[i])
6ba00c52 473 {
6ba00c52 474 if (fCutOnChild) {
fff02fee 475 pc[0]=iparticle->Px();
476 pc[1]=iparticle->Py();
477 pc[2]=iparticle->Pz();
478 Bool_t childok = KinematicSelection(iparticle, 1);
479 if(childok) {
480 pSelected[i] = 1;
6ba00c52 481 ncsel++;
482 } else {
483 ncsel=-1;
484 break;
485 } // child kine cuts
486 } else {
fff02fee 487 pSelected[i] = 1;
886b6f73 488 ncsel++;
6ba00c52 489 } // if child selection
490 } // select muon
491 } // decay particle loop
492 } // if decay products
493
886b6f73 494 Int_t iparent;
495 if ((fCutOnChild && ncsel >0) || !fCutOnChild){
496 ipa++;
6078e216 497 //
498 // Parent
cd716030 499
500
21391258 501 PushTrack(0, -1, iPart, p, origin0, polar, time0, kPPrimary, nt, wgtp, ((decayed)? 11 : 1));
fff02fee 502 pParent[0] = nt;
a99cf51f 503 KeepTrack(nt);
7cf36cae 504 fNprimaries++;
505
6078e216 506 //
507 // Decay Products
508 //
fff02fee 509 for (i = 1; i < np; i++) {
510 if (pSelected[i]) {
511 TParticle* iparticle = (TParticle *) particles->At(i);
ea79897e 512 Int_t kf = iparticle->GetPdgCode();
cd716030 513 Int_t ksc = iparticle->GetStatusCode();
ea79897e 514 Int_t jpa = iparticle->GetFirstMother()-1;
fff02fee 515
774ceaaf 516 och[0] = origin0[0]+iparticle->Vx();
517 och[1] = origin0[1]+iparticle->Vy();
518 och[2] = origin0[2]+iparticle->Vz();
fff02fee 519 pc[0] = iparticle->Px();
520 pc[1] = iparticle->Py();
521 pc[2] = iparticle->Pz();
522
ea79897e 523 if (jpa > -1) {
524 iparent = pParent[jpa];
fff02fee 525 } else {
526 iparent = -1;
527 }
1242532d 528
ea79897e 529 PushTrack(fTrackIt * trackIt[i], iparent, kf,
fff02fee 530 pc, och, polar,
21391258 531 time0 + iparticle->T(), kPDecay, nt, wgtch, ksc);
fff02fee 532 pParent[i] = nt;
a99cf51f 533 KeepTrack(nt);
7cf36cae 534 fNprimaries++;
8b31bfac 535 } // Selected
536 } // Particle loop
28337bc1 537 } // Decays by Lujet
8b31bfac 538 particles->Clear();
fff02fee 539 if (pFlag) delete[] pFlag;
540 if (pParent) delete[] pParent;
541 if (pSelected) delete[] pSelected;
8b31bfac 542 if (trackIt) delete[] trackIt;
21aaa175 543 } // kinematic selection
28337bc1 544 else // nodecay option, so parent will be tracked by GEANT (pions, kaons, eta, omegas, baryons)
545 {
5d12ce38 546 gAlice->GetMCApp()->
21391258 547 PushTrack(fTrackIt,-1,iPart,p,origin0,polar,time0,kPPrimary,nt,wgtp, 1);
28337bc1 548 ipa++;
7cf36cae 549 fNprimaries++;
28337bc1 550 }
fe4da5cc 551 break;
21aaa175 552 } // while
fe4da5cc 553 } // event loop
7cf36cae 554
a99cf51f 555 SetHighWaterMark(nt);
7cf36cae 556
557 AliGenEventHeader* header = new AliGenEventHeader("PARAM");
558 header->SetPrimaryVertex(fVertex);
21391258 559 header->SetInteractionTime(fTime);
7cf36cae 560 header->SetNProduced(fNprimaries);
561 AddHeader(header);
fe4da5cc 562}
2ad38d56 563//____________________________________________________________________________________
564Float_t AliGenParam::GetRelativeArea(Float_t ptMin, Float_t ptMax, Float_t yMin, Float_t yMax, Float_t phiMin, Float_t phiMax)
565{
6078e216 566 //
567 // Normalisation for selected kinematic region
568 //
2ad38d56 569 Float_t ratio =
389a9124 570 fPtPara->Integral(ptMin,ptMax,(Double_t *)0,1.e-6) / fPtPara->Integral( fPtPara->GetXmin(), fPtPara->GetXmax(),(Double_t *)0,1.e-6) *
571 fYPara->Integral(yMin,yMax,(Double_t *)0,1.e-6)/fYPara->Integral(fYPara->GetXmin(),fYPara->GetXmax(),(Double_t *)0,1.e-6) *
2ad38d56 572 (phiMax-phiMin)/360.;
573 return TMath::Abs(ratio);
574}
575
576//____________________________________________________________________________________
fe4da5cc 577
dc1d768c 578void AliGenParam::Draw( const char * /*opt*/)
5bd39445 579{
580 //
581 // Draw the pT and y Distributions
582 //
583 TCanvas *c0 = new TCanvas("c0","Canvas 0",400,10,600,700);
584 c0->Divide(2,1);
585 c0->cd(1);
586 fPtPara->Draw();
587 fPtPara->GetHistogram()->SetXTitle("p_{T} (GeV)");
588 c0->cd(2);
589 fYPara->Draw();
590 fYPara->GetHistogram()->SetXTitle("y");
591}
592
f87cfe57 593
fe4da5cc 594
595