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