1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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
28 // 24.09.2001 Piotr Skowronski
30 // fNEvents replaced with AliRunLoader::GetNumberOfEvents()
34 #include <Riostream.h>
37 #include <TObjArray.h>
38 #include <TParticle.h>
40 #include "AliGenCocktailAfterBurner.h"
41 #include "AliGenCocktailEntry.h"
42 #include "AliGenCocktailEventHeader.h"
43 #include "AliCollisionGeometry.h"
48 ClassImp(AliGenCocktailAfterBurner)
49 /*********************************************************************/
50 /*********************************************************************/
52 AliGenCocktailAfterBurner::AliGenCocktailAfterBurner():
54 fAfterBurnerEntries(new TList()),
55 fGenerationDone(kFALSE),
57 fCollisionGeometries(0),
66 cout<<"AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()"<<endl;
67 SetName("AliGenCocktailAfterBurner");
68 SetTitle("AliGenCocktailAfterBurner");
71 /*********************************************************************/
73 AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
77 if (fInternalStacks) //delete stacks
79 fInternalStacks->SetOwner();
80 delete fInternalStacks;
82 if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
83 delete[] fCollisionGeometries;
85 /*********************************************************************/
86 /*********************************************************************/
88 void AliGenCocktailAfterBurner::
89 AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
92 // Forward parameters to the new AfterBurner
94 if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
97 AfterBurner->SetPtRange(fPtMin,fPtMax);
98 if(TestBit(kMomentumRange))
99 AfterBurner->SetMomentumRange(fPMin,fPMax);
101 AfterBurner->SetYRange(fYMin,fYMax);
102 AfterBurner->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
103 AfterBurner->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
104 AfterBurner->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
105 AfterBurner->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
106 AfterBurner->SetVertexSmear(fVertexSmear);
107 AfterBurner->SetTrackingFlag(fTrackIt);
108 AfterBurner->SetVertexSource(kContainer);
110 // Add AfterBurner to list
112 AliGenCocktailEntry *entry =
113 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
114 fAfterBurnerEntries->Add(entry);
119 /*********************************************************************/
120 /*********************************************************************/
122 void AliGenCocktailAfterBurner::Init()
125 fGenerationDone = kFALSE;
126 if (fInternalStacks) //delete stacks
128 fInternalStacks->SetOwner();
129 fInternalStacks->Delete(); //clean after previous generation cycle
132 if (fCollisionGeometries) delete[] fCollisionGeometries;
134 this->AliGenCocktail::Init();
136 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
137 TIter next(fAfterBurnerEntries);
138 AliGenCocktailEntry *entry;
140 // Loop over generators and initialize
141 while((entry = (AliGenCocktailEntry*)next())) {
142 entry->Generator()->Init();
145 /*********************************************************************/
146 /*********************************************************************/
148 void AliGenCocktailAfterBurner::Generate()
152 // Firsts runs each generator for all events
153 // than after burners ones for each event
155 // It generates and processes all events during
157 // In next calls it just returns already generated
158 // and processed events to the gAlice
161 cout<<"#####################################"<<endl
162 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
163 <<"#####################################"<<endl;
165 if (fHeader) delete fHeader;
166 fHeader = new AliGenCocktailEventHeader("Cocktail Header");
169 // Generate the vertex position used by all generators
171 if(fVertexSmear == kPerEvent) Vertex();
174 for (Int_t j=0; j < 3; j++) eventVertex[j] = fVertex[j];
180 {//if generation is done (in first call)
181 //just copy particles from the stack to the gAlice
182 SetTracks(++fCurrentEvent);
183 cout<<"Returning event "<<fCurrentEvent<<endl;
187 { //Here we are in the first call of the method
189 Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
190 cout << "Number of events per run" << numberOfEvents << endl;
193 fInternalStacks = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
194 fCollisionGeometries = new AliCollisionGeometry*[numberOfEvents + fNBgEvents]; //Create array of collision geometries
195 for(i=0;i<numberOfEvents + fNBgEvents;i++)
197 stack = new AliStack(10000);
199 fInternalStacks->Add(stack);
201 /*********************************************************************/
202 TIter next(fEntries);
203 AliGenCocktailEntry *entry;
204 AliGenCocktailEntry *e1;
205 AliGenCocktailEntry *e2;
206 const TObjArray *partArray;
208 // Loop over generators and generate events
210 while((entry = (AliGenCocktailEntry*)next()))
213 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
214 /***********************************************/
215 //First generator for all evenets, than second for all events, etc...
216 for(i=0;i<numberOfEvents + fNBgEvents;i++)
218 cout<<" EVENT "<<i << endl;
220 partArray = stack->Particles();
221 fCurrentGenerator = entry->Generator();
222 fCurrentGenerator->SetStack(stack);
229 entry->SetFirst((partArray->GetEntriesFast())+1);
231 fCurrentGenerator->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
232 fCurrentGenerator->Generate();
233 entry->SetLast(partArray->GetEntriesFast());
235 if (fCurrentGenerator->ProvidesCollisionGeometry()) fCollisionGeometries[i] = fCurrentGenerator->CollisionGeometry();
238 /***********************************************/
241 while((entry = (AliGenCocktailEntry*)next()))
245 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
249 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
251 printf("\n -----------------------------");
257 /***********************************************/
258 /*******After Burners Processing****************/
259 /***********************************************/
260 TIter nextAfterBurner(fAfterBurnerEntries);
261 AliGenCocktailEntry *afterBurnerEntry;
262 Int_t iab =0; //number of current after burner / counter
264 cout<<"\n\nRunning After Burners"<<endl;
265 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
267 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
268 fCurrentGenerator = afterBurnerEntry->Generator();
269 fCurrentGenerator->Generate();
271 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
273 /***********************************************/
274 /***********************************************/
275 /***********************************************/
277 fGenerationDone=kTRUE;
278 SetTracks(0); //copy event 0 to gAlice stack
280 /*********************************************************************/
281 // Pass the header to gAlice
282 fHeader->SetPrimaryVertex(eventVertex);
283 gAlice->SetGenEventHeader(fHeader);
286 /*********************************************************************/
287 /*********************************************************************/
289 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n) const
291 //Returns the pointer to the N'th stack (event)
292 if( ( n<0 ) || ( n >= (GetNumberOfEvents()) ) )
294 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
297 return ((AliStack*) fInternalStacks->At(n) );
300 /*********************************************************************/
301 /*********************************************************************/
303 AliCollisionGeometry* AliGenCocktailAfterBurner::GetCollisionGeometry(Int_t n) const
305 //Returns the pointer to the N'th stack (event)
306 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
308 Fatal("AliGenCocktailAfterBurner::GetCollisionGeometry","Asked for non existing stack (%d)",n);
311 return fCollisionGeometries[n];
314 /*********************************************************************/
315 /*********************************************************************/
317 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
319 //Set Active Events Number and Active Stack
320 //There is only one active event number
321 //Made fo convinience of work with AfterBurners (HBT processor)
323 fActiveEvent = actev;
324 fActiveStack = GetStack(actev);
326 /*********************************************************************/
327 /*********************************************************************/
329 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
331 //Method which copies tracks from given stack to the
333 AliStack* instack = GetStack(stackno);
337 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
344 Int_t n = instack->GetNtrack();
347 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<n<<"\n";
350 for(Int_t i = 0; i < n; i++)
353 p = instack->Particle(i);
354 done = !p->TestBit(kDoneBit);
355 parent = p->GetMother(0);
356 pdg = p->GetPdgCode();
365 p->GetPolarisation(pol);
369 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
370 weight = p->GetWeight();
372 gAlice->GetMCApp()->PushTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,polx, poly, polz, mech, ntr, weight);
374 // ANDREAS MORSCH ---------------------------------------------------(
375 SetHighWaterMark(ntr) ;
376 // ANDREAS MORSCH ---------------------------------------------------)
380 /*********************************************************************/
381 /*********************************************************************/
383 TMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
385 //Mothod used to convert uniqueID (integer) to TMCProcess type
386 const TMCProcess kMCprocesses[kMaxMCProcess] =
388 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
389 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
390 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
391 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
392 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
393 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
396 for (Int_t i = 0;i<kMaxMCProcess;i++)
398 if (kMCprocesses[i] == no)
400 return kMCprocesses[i];