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 **************************************************************************/
17 // Container class for AliGenerator and AfterBurners
18 // (which are AliGenerators as well) through recursion.
19 // The container is itself an AliGenerator a
20 // what is stored are not the pointers to the generators directly
21 // but to objects of type
22 // AliGenCocktailAfterBurner entry.
23 // The class provides also iterator functionality.
24 // Author: andreas.morsch@cern.ch and piotr.skowronski@cern.ch
26 // 24.09.2001 Piotr Skowronski
28 // fNEvents replaced with gAlice->GetEventsPerRun()
30 #include "AliGenCocktailAfterBurner.h"
31 #include "AliGenCocktailEntry.h"
34 #include <TObjArray.h>
36 #include <TParticle.h>
40 ClassImp(AliGenCocktailAfterBurner)
41 /*********************************************************************/
42 /*********************************************************************/
44 AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()
48 cout<<"AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()"<<endl;
49 SetName("AliGenCocktailAfterBurner");
50 SetTitle("AliGenCocktailAfterBurner");
53 fCurrentGenerator = 0;
55 fAfterBurnerEntries = new TList();
57 fGenerationDone = kFALSE;
61 /*********************************************************************/
62 /*********************************************************************/
64 AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
68 if (fInternalStacks) //delete stacks
70 fInternalStacks->SetOwner();
71 delete fInternalStacks;
73 if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
75 /*********************************************************************/
76 /*********************************************************************/
78 void AliGenCocktailAfterBurner::
79 AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
82 // Forward parameters to the new AfterBurner
84 if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
87 AfterBurner->SetPtRange(fPtMin,fPtMax);
88 if(TestBit(kMomentumRange))
89 AfterBurner->SetMomentumRange(fPMin,fPMax);
91 AfterBurner->SetYRange(fYMin,fYMax);
93 SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
95 SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
97 SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
99 SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
100 AfterBurner->SetVertexSmear(fVertexSmear);
101 AfterBurner->SetTrackingFlag(fTrackIt);
103 // Add AfterBurner to list
105 AliGenCocktailEntry *entry =
106 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
107 fAfterBurnerEntries->Add(entry);
112 /*********************************************************************/
113 /*********************************************************************/
115 void AliGenCocktailAfterBurner::Init()
118 fGenerationDone = kFALSE;
119 this->AliGenCocktail::Init();
121 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
122 TIter next(fAfterBurnerEntries);
123 AliGenCocktailEntry *entry;
125 // Loop over generators and initialize
126 while((entry = (AliGenCocktailEntry*)next())) {
127 entry->Generator()->Init();
130 /*********************************************************************/
131 /*********************************************************************/
133 void AliGenCocktailAfterBurner::Generate()
137 // Firsts runs each generator for all events
138 // than after burners ones for each event
140 // It generates and processes all events during
142 // In next calls it just returns already generated
143 // and processed events to the gAlice
146 cout<<"#####################################"<<endl
147 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
148 <<"#####################################"<<endl;
154 {//if generation is done (in first call)
155 //just copy particles from the stack to the gAlice
156 SetTracks(++fCurrentEvent);
157 cout<<"Returning event "<<fCurrentEvent<<endl;
161 { //Here we are in the first call of the method
163 Int_t numberOfEvents = gAlice->GetEventsPerRun();
165 fInternalStacks = new TObjArray(numberOfEvents); //Create array of internal stacks
166 for(i=0;i<numberOfEvents;i++)
168 stack = new AliStack(10000);
170 fInternalStacks->Add(stack);
172 /*********************************************************************/
173 TIter next(fEntries);
174 AliGenCocktailEntry *entry;
175 AliGenCocktailEntry *e1;
176 AliGenCocktailEntry *e2;
177 TObjArray *partArray;
179 // Loop over generators and generate events
181 while((entry = (AliGenCocktailEntry*)next()))
184 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
185 /***********************************************/
186 //First generator for all evenets, than second for all events, etc...
187 for(i=0;i<numberOfEvents;i++)
189 cout<<" EVENT "<<i<<endl;
191 partArray = stack->Particles();
192 fCurrentGenerator = entry->Generator();
193 fCurrentGenerator->SetStack(stack);
200 entry->SetFirst((partArray->GetEntriesFast())+1);
202 fCurrentGenerator->Generate();
203 entry->SetLast(partArray->GetEntriesFast());
205 /***********************************************/
208 while((entry = (AliGenCocktailEntry*)next()))
212 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
216 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
218 printf("\n -----------------------------");
224 /***********************************************/
225 /*******After Burners Processing****************/
226 /***********************************************/
227 TIter nextAfterBurner(fAfterBurnerEntries);
228 AliGenCocktailEntry *afterBurnerEntry;
229 Int_t iab =0; //number of current after burner / counter
231 cout<<"\n\nRunning After Burners"<<endl;
232 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
234 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
235 fCurrentGenerator = afterBurnerEntry->Generator();
236 fCurrentGenerator->Generate();
238 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
240 /***********************************************/
241 /***********************************************/
242 /***********************************************/
244 fGenerationDone=kTRUE;
245 SetTracks(0); //copy event 0 to gAlice stack
247 /*********************************************************************/
251 /*********************************************************************/
252 /*********************************************************************/
254 AliGenCocktailAfterBurner& AliGenCocktailAfterBurner::operator=(const AliGenCocktailAfterBurner& rhs)
256 // Assignment operator
259 /*********************************************************************/
260 /*********************************************************************/
262 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n)
264 //Returns the pointer to the N'th stack (event)
265 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
267 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
270 return ((AliStack*) fInternalStacks->At(n) );
272 /*********************************************************************/
273 /*********************************************************************/
275 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
277 //Set Active Events Number and Active Stack
278 //There is only one active event number
279 //Made fo convinience of work with AfterBurners (HBT processor)
281 fActiveEvent = actev;
282 fActiveStack = GetStack(actev);
284 /*********************************************************************/
285 /*********************************************************************/
287 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
289 //Method which copies tracks from given stack to the
291 AliStack* instack = GetStack(stackno);
295 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
302 Int_t N = instack->GetNtrack();
305 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<N<<"\n";
308 for(Int_t i = 0; i < N; i++)
311 p = instack->Particle(i);
312 done = !p->TestBit(kDoneBit);
313 parent = p->GetMother(0);
314 pdg = p->GetPdgCode();
323 p->GetPolarisation(pol);
327 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
328 weight = p->GetWeight();
330 gAlice->SetTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,
331 polx, poly, polz, mech, ntr, weight);
334 /*********************************************************************/
335 /*********************************************************************/
337 AliMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
339 //Mothod used to convert uniqueID (integer) to AliMCProcess type
340 const AliMCProcess MCprocesses[kMaxMCProcess] =
342 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
343 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
344 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
345 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
346 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
347 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
350 for (Int_t i = 0;i<kMaxMCProcess;i++)
352 if (MCprocesses[i] == no)
354 //if (debug) cout<<"IntToMCProcess("<<no<<") returned AliMCProcess Named \""<<AliMCProcessName[MCprocesses[i]]<<"\""<<endl;
355 return MCprocesses[i];