]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVGEN/AliGenCocktailAfterBurner.cxx
Coding violations corrected.
[u/mrichter/AliRoot.git] / EVGEN / AliGenCocktailAfterBurner.cxx
CommitLineData
0b359ada 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$ */
17
0b359ada 18//
19// Container class for AliGenerator and AfterBurners
20// (which are AliGenerators as well) through recursion.
21// The container is itself an AliGenerator a
22// what is stored are not the pointers to the generators directly
23// but to objects of type
24// AliGenCocktailAfterBurner entry.
25// The class provides also iterator functionality.
26// Author: andreas.morsch@cern.ch and piotr.skowronski@cern.ch
27//
2b9786f4 28// 24.09.2001 Piotr Skowronski
29// debug -> gDebug,
124253ee 30// fNEvents replaced with AliRunLoader::GetNumberOfEvents()
2b9786f4 31//
2b9786f4 32
88cb7938 33
34#include <Riostream.h>
35
0b359ada 36#include <TList.h>
88cb7938 37#include <TObjArray.h>
0b359ada 38#include <TParticle.h>
88cb7938 39
40#include "AliGenCocktailAfterBurner.h"
41#include "AliGenCocktailEntry.h"
baf77725 42#include "AliGenCocktailEventHeader.h"
cc41459d 43#include "AliCollisionGeometry.h"
88cb7938 44#include "AliStack.h"
5d12ce38 45#include "AliMC.h"
4a33c50d 46#include "AliRun.h"
0b359ada 47
2b9786f4 48
0b359ada 49ClassImp(AliGenCocktailAfterBurner)
2b9786f4 50/*********************************************************************/
51/*********************************************************************/
0b359ada 52
1c56e311 53 AliGenCocktailAfterBurner::AliGenCocktailAfterBurner():
54 fNAfterBurners(0),
4a33c50d 55 fAfterBurnerEntries(0),
1c56e311 56 fGenerationDone(kFALSE),
57 fInternalStacks(0),
58 fCollisionGeometries(0),
9c64a93a 59 fHeaders(0),
1c56e311 60 fCurrentEvent(0),
61 fActiveStack(0),
62 fActiveEvent(-1),
63 fCurrentGenerator(0),
64 fNBgEvents(0)
0b359ada 65{
66// Constructor
2b9786f4 67 if (gDebug > 0)
1c56e311 68 cout<<"AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()"<<endl;
0b359ada 69 SetName("AliGenCocktailAfterBurner");
70 SetTitle("AliGenCocktailAfterBurner");
0b359ada 71}
20dddfab 72
2b9786f4 73/*********************************************************************/
0b359ada 74
75AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
76 {
2b9786f4 77//destructor
78
79 if (fInternalStacks) //delete stacks
80 {
81 fInternalStacks->SetOwner();
82 delete fInternalStacks;
83 }
84 if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
6bcdf1d1 85 Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
86 if (fCollisionGeometries) {
87 for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
88 if (fCollisionGeometries[i]) delete fCollisionGeometries[i];
89 delete[] fCollisionGeometries;
90 }
91 if (fHeaders) {
92 for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
93 if (fHeaders[i]) delete fHeaders[i];
94 delete[] fHeaders;
95 }
0b359ada 96 }
2b9786f4 97/*********************************************************************/
98/*********************************************************************/
0b359ada 99
100void AliGenCocktailAfterBurner::
101AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
102{
103//
104// Forward parameters to the new AfterBurner
105
2b9786f4 106 if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
0b359ada 107
108 if(TestBit(kPtRange))
109 AfterBurner->SetPtRange(fPtMin,fPtMax);
110 if(TestBit(kMomentumRange))
111 AfterBurner->SetMomentumRange(fPMin,fPMax);
112
113 AfterBurner->SetYRange(fYMin,fYMax);
466bfded 114 AfterBurner->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
115 AfterBurner->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
116 AfterBurner->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
117 AfterBurner->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
0b359ada 118 AfterBurner->SetVertexSmear(fVertexSmear);
119 AfterBurner->SetTrackingFlag(fTrackIt);
59fe7b77 120 AfterBurner->SetVertexSource(kContainer);
0b359ada 121//
122// Add AfterBurner to list
123
124 AliGenCocktailEntry *entry =
125 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
4a33c50d 126 if (!fAfterBurnerEntries) fAfterBurnerEntries = new TList();
127
0b359ada 128 fAfterBurnerEntries->Add(entry);
129 fNAfterBurners++;
984c69bd 130//
984c69bd 131
0b359ada 132}
2b9786f4 133/*********************************************************************/
134/*********************************************************************/
0b359ada 135
136void AliGenCocktailAfterBurner::Init()
137{
138// Initialisation
6bcdf1d1 139 Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
2b9786f4 140 fGenerationDone = kFALSE;
466bfded 141 if (fInternalStacks) //delete stacks
142 {
143 fInternalStacks->SetOwner();
144 fInternalStacks->Delete(); //clean after previous generation cycle
145 }
146
6bcdf1d1 147 if (fCollisionGeometries) {
148 for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
149 if (fCollisionGeometries[i]) delete fCollisionGeometries[i];
150 delete[] fCollisionGeometries;
151 }
152 if (fHeaders) {
153 for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
154 if (fHeaders[i]) delete fHeaders[i];
155 delete[] fHeaders;
156 }
157
0b359ada 158 this->AliGenCocktail::Init();
159
2b9786f4 160 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
0b359ada 161 TIter next(fAfterBurnerEntries);
162 AliGenCocktailEntry *entry;
163 //
164 // Loop over generators and initialize
165 while((entry = (AliGenCocktailEntry*)next())) {
166 entry->Generator()->Init();
167 }
168}
2b9786f4 169/*********************************************************************/
170/*********************************************************************/
0b359ada 171
172void AliGenCocktailAfterBurner::Generate()
173{
174//
2b9786f4 175// Generate event
176// Firsts runs each generator for all events
177// than after burners ones for each event
178//
179// It generates and processes all events during
180// first call only.
181// In next calls it just returns already generated
182// and processed events to the gAlice
183
184 if (gDebug>0)
185 cout<<"#####################################"<<endl
186 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
187 <<"#####################################"<<endl;
baf77725 188 // Initialize header
baf77725 189 //
0b359ada 190 Int_t i; //iterator
191 AliStack * stack;
2b9786f4 192
0b359ada 193 if (fGenerationDone)
2b9786f4 194 {//if generation is done (in first call)
195 //just copy particles from the stack to the gAlice
196 SetTracks(++fCurrentEvent);
9c64a93a 197 fHeader = fHeaders[fCurrentEvent];
198 gAlice->SetGenEventHeader(fHeader);
199 cout<<"Returning event " << fCurrentEvent<<endl;
2b9786f4 200 return;
0b359ada 201 }
202 else
2b9786f4 203 { //Here we are in the first call of the method
9c64a93a 204 Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
205 cout << "Number of events per run" << numberOfEvents << endl;
206 TArrayF eventVertex;
207 eventVertex.Set(3 * (numberOfEvents + fNBgEvents));
208 fCurrentEvent=0;
2b9786f4 209 //Create stacks
9c64a93a 210 fInternalStacks = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
211 fCollisionGeometries = new AliCollisionGeometry*[numberOfEvents + fNBgEvents]; //Create array of collision geometries
212 fHeaders = new AliGenCocktailEventHeader*[numberOfEvents + fNBgEvents]; //Create array of headers
213
214 for(i = 0; i < numberOfEvents + fNBgEvents; i++)
2b9786f4 215 {
9c64a93a 216 stack = new AliStack(10000);
217 stack->Reset();
218 fInternalStacks->Add(stack);
219 Vertex();
220 for (Int_t j = 0; j < 3; j++) eventVertex[3 * i + j] = fVertex[j];
0709d8b9 221 fHeaders[i] = new AliGenCocktailEventHeader();
ace4fb76 222 fCollisionGeometries[i] = 0;
2b9786f4 223 }
0b359ada 224/*********************************************************************/
2b9786f4 225 TIter next(fEntries);
226 AliGenCocktailEntry *entry;
227 AliGenCocktailEntry *e1;
228 AliGenCocktailEntry *e2;
d94af0c1 229 const TObjArray *partArray;
2b9786f4 230 //
231 // Loop over generators and generate events
232 Int_t igen=0;
233 while((entry = (AliGenCocktailEntry*)next()))
234 {
235 igen++;
236 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
237/***********************************************/
0b359ada 238//First generator for all evenets, than second for all events, etc...
9c64a93a 239 for(i = 0; i < numberOfEvents + fNBgEvents; i++)
59fe7b77 240 {
241 cout<<" EVENT "<<i << endl;
2b9786f4 242 stack = GetStack(i);
243 partArray = stack->Particles();
244 fCurrentGenerator = entry->Generator();
245 fCurrentGenerator->SetStack(stack);
246 if (igen ==1)
59fe7b77 247 {
2b9786f4 248 entry->SetFirst(0);
59fe7b77 249 }
2b9786f4 250 else
59fe7b77 251 {
2b9786f4 252 entry->SetFirst((partArray->GetEntriesFast())+1);
59fe7b77 253 }
9c64a93a 254 // Set the vertex for the generator
255 Int_t ioff = 3 * i;
256 fCurrentGenerator->SetVertex(eventVertex.At(ioff), eventVertex.At(ioff + 1), eventVertex.At(ioff + 2));
257 fHeader = fHeaders[i];
258 // Set the vertex for the cocktail
259 TArrayF v(3);
260 for (Int_t j=0; j<3; j++) v[j] = eventVertex.At(ioff + j);
261 fHeader->SetPrimaryVertex(v);
262 // Generate event
59fe7b77 263 fCurrentGenerator->Generate();
9c64a93a 264 //
59fe7b77 265 entry->SetLast(partArray->GetEntriesFast());
266
2f3fd0f1 267 if (fCurrentGenerator->ProvidesCollisionGeometry())
268 fCollisionGeometries[i] =
269 new AliCollisionGeometry(*(fCurrentGenerator->CollisionGeometry()));
9c64a93a 270 } // event loop
2b9786f4 271/***********************************************/
9c64a93a 272 } // generator loop
2b9786f4 273 next.Reset();
274 while((entry = (AliGenCocktailEntry*)next()))
275 {
276 entry->PrintInfo();
277 }
278 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
279 {
280 entry->PrintInfo();
281 }
282 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
283 {
284 printf("\n -----------------------------");
285 e1->PrintInfo();
286 e2->PrintInfo();
0b359ada 287 }
288
0b359ada 289
2b9786f4 290 /***********************************************/
291 /*******After Burners Processing****************/
292 /***********************************************/
293 TIter nextAfterBurner(fAfterBurnerEntries);
294 AliGenCocktailEntry *afterBurnerEntry;
295 Int_t iab =0; //number of current after burner / counter
296
297 cout<<"\n\nRunning After Burners"<<endl;
298 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
299 {
300 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
301 fCurrentGenerator = afterBurnerEntry->Generator();
302 fCurrentGenerator->Generate();
303 }
304 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
305
306 /***********************************************/
307 /***********************************************/
308 /***********************************************/
0b359ada 309
2b9786f4 310 fGenerationDone=kTRUE;
311 SetTracks(0); //copy event 0 to gAlice stack
0b359ada 312
313/*********************************************************************/
baf77725 314 // Pass the header to gAlice
9c64a93a 315 fHeader = fHeaders[0];
baf77725 316 gAlice->SetGenEventHeader(fHeader);
9c64a93a 317 } //else generated
0b359ada 318}
2b9786f4 319/*********************************************************************/
320/*********************************************************************/
0b359ada 321
20dddfab 322AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n) const
0b359ada 323{
2b9786f4 324//Returns the pointer to the N'th stack (event)
c516e34c 325 if( ( n<0 ) || ( n >= (GetNumberOfEvents()) ) )
0b359ada 326 {
2b9786f4 327 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
328 return 0;
0b359ada 329 }
2682e810 330 return ((AliStack*) fInternalStacks->At(n) );
0b359ada 331}
cc41459d 332
333/*********************************************************************/
334/*********************************************************************/
335
cc41459d 336AliCollisionGeometry* AliGenCocktailAfterBurner::GetCollisionGeometry(Int_t n) const
337{
338//Returns the pointer to the N'th stack (event)
339 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
340 {
341 Fatal("AliGenCocktailAfterBurner::GetCollisionGeometry","Asked for non existing stack (%d)",n);
342 return 0;
343 }
344 return fCollisionGeometries[n];
345}
346
2b9786f4 347/*********************************************************************/
348/*********************************************************************/
0b359ada 349
350void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
351{
2b9786f4 352//Set Active Events Number and Active Stack
353//There is only one active event number
354//Made fo convinience of work with AfterBurners (HBT processor)
355
0b359ada 356 fActiveEvent = actev;
357 fActiveStack = GetStack(actev);
358}
2b9786f4 359/*********************************************************************/
360/*********************************************************************/
0b359ada 361
362void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
363{
2b9786f4 364//Method which copies tracks from given stack to the
365//gAlice's stack
0b359ada 366 AliStack* instack = GetStack(stackno);
367 Int_t done;
368 Int_t parent;
369 Int_t pdg;
370 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
acc86a24 371 TMCProcess mech;
0b359ada 372 Int_t ntr;
373 Float_t weight;
374 TVector3 pol;
375
376 TParticle * p;
20dddfab 377 Int_t n = instack->GetNtrack();
2b9786f4 378 if (gDebug)
0b359ada 379 {
20dddfab 380 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<n<<"\n";
0b359ada 381 }
382
20dddfab 383 for(Int_t i = 0; i < n; i++)
0b359ada 384 {
385
2b9786f4 386 p = instack->Particle(i);
387 done = !p->TestBit(kDoneBit);
388 parent = p->GetMother(0);
389 pdg = p->GetPdgCode();
390 px = p->Px();
391 py = p->Py();
392 pz = p->Pz();
393 e = p->Energy();
394 vx = p->Vx();
395 vy = p->Vy();
396 vz = p->Vz();
397 tof = p->T();
398 p->GetPolarisation(pol);
399 polx = pol.X();
400 poly = pol.Y();
401 polz = pol.Z();
402 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
403 weight = p->GetWeight();
404
cc41459d 405 gAlice->GetMCApp()->PushTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,polx, poly, polz, mech, ntr, weight);
406
cc41459d 407 SetHighWaterMark(ntr) ;
cc41459d 408
0b359ada 409 }
410}
2b9786f4 411/*********************************************************************/
412/*********************************************************************/
0b359ada 413
acc86a24 414TMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
0b359ada 415{
acc86a24 416 //Mothod used to convert uniqueID (integer) to TMCProcess type
417 const TMCProcess kMCprocesses[kMaxMCProcess] =
2b9786f4 418 {
419 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
0b359ada 420 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
421 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
422 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
423 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
2b9786f4 424 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
425 };
0b359ada 426
427 for (Int_t i = 0;i<kMaxMCProcess;i++)
428 {
20dddfab 429 if (kMCprocesses[i] == no)
2b9786f4 430 {
20dddfab 431 return kMCprocesses[i];
2b9786f4 432 }
0b359ada 433 }
434 return kPNoProcess;
435}
198bb1c7 436