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);
109 // Add AfterBurner to list
111 AliGenCocktailEntry *entry =
112 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
113 fAfterBurnerEntries->Add(entry);
118 /*********************************************************************/
119 /*********************************************************************/
121 void AliGenCocktailAfterBurner::Init()
124 fGenerationDone = kFALSE;
125 if (fInternalStacks) //delete stacks
127 fInternalStacks->SetOwner();
128 fInternalStacks->Delete(); //clean after previous generation cycle
131 if (fCollisionGeometries) delete[] fCollisionGeometries;
133 this->AliGenCocktail::Init();
135 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
136 TIter next(fAfterBurnerEntries);
137 AliGenCocktailEntry *entry;
139 // Loop over generators and initialize
140 while((entry = (AliGenCocktailEntry*)next())) {
141 entry->Generator()->Init();
144 /*********************************************************************/
145 /*********************************************************************/
147 void AliGenCocktailAfterBurner::Generate()
151 // Firsts runs each generator for all events
152 // than after burners ones for each event
154 // It generates and processes all events during
156 // In next calls it just returns already generated
157 // and processed events to the gAlice
160 cout<<"#####################################"<<endl
161 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
162 <<"#####################################"<<endl;
164 if (fHeader) delete fHeader;
165 fHeader = new AliGenCocktailEventHeader("Cocktail Header");
172 {//if generation is done (in first call)
173 //just copy particles from the stack to the gAlice
174 SetTracks(++fCurrentEvent);
175 cout<<"Returning event "<<fCurrentEvent<<endl;
179 { //Here we are in the first call of the method
181 Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
182 cout << "Number of events per run" << numberOfEvents << endl;
185 fInternalStacks = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
186 fCollisionGeometries = new AliCollisionGeometry*[numberOfEvents + fNBgEvents]; //Create array of collision geometries
187 for(i=0;i<numberOfEvents + fNBgEvents;i++)
189 stack = new AliStack(10000);
191 fInternalStacks->Add(stack);
193 /*********************************************************************/
194 TIter next(fEntries);
195 AliGenCocktailEntry *entry;
196 AliGenCocktailEntry *e1;
197 AliGenCocktailEntry *e2;
198 const TObjArray *partArray;
200 // Loop over generators and generate events
202 while((entry = (AliGenCocktailEntry*)next()))
205 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
206 /***********************************************/
207 //First generator for all evenets, than second for all events, etc...
208 for(i=0;i<numberOfEvents + fNBgEvents;i++)
210 cout<<" EVENT "<<i << endl;
212 partArray = stack->Particles();
213 fCurrentGenerator = entry->Generator();
214 fCurrentGenerator->SetStack(stack);
221 entry->SetFirst((partArray->GetEntriesFast())+1);
223 fCurrentGenerator->Generate();
224 entry->SetLast(partArray->GetEntriesFast());
226 if (fCurrentGenerator->ProvidesCollisionGeometry()) fCollisionGeometries[i] = fCurrentGenerator->CollisionGeometry();
229 /***********************************************/
232 while((entry = (AliGenCocktailEntry*)next()))
236 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
240 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
242 printf("\n -----------------------------");
248 /***********************************************/
249 /*******After Burners Processing****************/
250 /***********************************************/
251 TIter nextAfterBurner(fAfterBurnerEntries);
252 AliGenCocktailEntry *afterBurnerEntry;
253 Int_t iab =0; //number of current after burner / counter
255 cout<<"\n\nRunning After Burners"<<endl;
256 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
258 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
259 fCurrentGenerator = afterBurnerEntry->Generator();
260 fCurrentGenerator->Generate();
262 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
264 /***********************************************/
265 /***********************************************/
266 /***********************************************/
268 fGenerationDone=kTRUE;
269 SetTracks(0); //copy event 0 to gAlice stack
271 /*********************************************************************/
272 // Pass the header to gAlice
273 gAlice->SetGenEventHeader(fHeader);
276 /*********************************************************************/
277 /*********************************************************************/
279 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n) const
281 //Returns the pointer to the N'th stack (event)
282 if( ( n<0 ) || ( n >= (GetNumberOfEvents()) ) )
284 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
287 return ((AliStack*) fInternalStacks->At(n) );
290 /*********************************************************************/
291 /*********************************************************************/
293 AliCollisionGeometry* AliGenCocktailAfterBurner::GetCollisionGeometry(Int_t n) const
295 //Returns the pointer to the N'th stack (event)
296 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
298 Fatal("AliGenCocktailAfterBurner::GetCollisionGeometry","Asked for non existing stack (%d)",n);
301 return fCollisionGeometries[n];
304 /*********************************************************************/
305 /*********************************************************************/
307 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
309 //Set Active Events Number and Active Stack
310 //There is only one active event number
311 //Made fo convinience of work with AfterBurners (HBT processor)
313 fActiveEvent = actev;
314 fActiveStack = GetStack(actev);
316 /*********************************************************************/
317 /*********************************************************************/
319 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
321 //Method which copies tracks from given stack to the
323 AliStack* instack = GetStack(stackno);
327 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
334 Int_t n = instack->GetNtrack();
337 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<n<<"\n";
340 for(Int_t i = 0; i < n; i++)
343 p = instack->Particle(i);
344 done = !p->TestBit(kDoneBit);
345 parent = p->GetMother(0);
346 pdg = p->GetPdgCode();
355 p->GetPolarisation(pol);
359 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
360 weight = p->GetWeight();
362 gAlice->GetMCApp()->PushTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,polx, poly, polz, mech, ntr, weight);
364 // ANDREAS MORSCH ---------------------------------------------------(
365 SetHighWaterMark(ntr) ;
366 // ANDREAS MORSCH ---------------------------------------------------)
370 /*********************************************************************/
371 /*********************************************************************/
373 TMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
375 //Mothod used to convert uniqueID (integer) to TMCProcess type
376 const TMCProcess kMCprocesses[kMaxMCProcess] =
378 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
379 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
380 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
381 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
382 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
383 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
386 for (Int_t i = 0;i<kMaxMCProcess;i++)
388 if (kMCprocesses[i] == no)
390 return kMCprocesses[i];