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 fAfterBurnerEntries = new TList();
55 fGenerationDone = kFALSE;
59 /*********************************************************************/
60 /*********************************************************************/
62 AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
66 if (fInternalStacks) //delete stacks
68 fInternalStacks->SetOwner();
69 delete fInternalStacks;
71 if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
73 /*********************************************************************/
74 /*********************************************************************/
76 void AliGenCocktailAfterBurner::
77 AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
80 // Forward parameters to the new AfterBurner
82 if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
85 AfterBurner->SetPtRange(fPtMin,fPtMax);
86 if(TestBit(kMomentumRange))
87 AfterBurner->SetMomentumRange(fPMin,fPMax);
89 AfterBurner->SetYRange(fYMin,fYMax);
91 SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
93 SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
95 SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
97 SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
98 AfterBurner->SetVertexSmear(fVertexSmear);
99 AfterBurner->SetTrackingFlag(fTrackIt);
101 // Add AfterBurner to list
103 AliGenCocktailEntry *entry =
104 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
105 fAfterBurnerEntries->Add(entry);
110 /*********************************************************************/
111 /*********************************************************************/
113 void AliGenCocktailAfterBurner::Init()
116 fGenerationDone = kFALSE;
117 this->AliGenCocktail::Init();
119 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
120 TIter next(fAfterBurnerEntries);
121 AliGenCocktailEntry *entry;
123 // Loop over generators and initialize
124 while((entry = (AliGenCocktailEntry*)next())) {
125 entry->Generator()->Init();
128 /*********************************************************************/
129 /*********************************************************************/
131 void AliGenCocktailAfterBurner::Generate()
135 // Firsts runs each generator for all events
136 // than after burners ones for each event
138 // It generates and processes all events during
140 // In next calls it just returns already generated
141 // and processed events to the gAlice
144 cout<<"#####################################"<<endl
145 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
146 <<"#####################################"<<endl;
152 {//if generation is done (in first call)
153 //just copy particles from the stack to the gAlice
154 SetTracks(++fCurrentEvent);
155 cout<<"Returning event "<<fCurrentEvent<<endl;
159 { //Here we are in the first call of the method
161 Int_t numberOfEvents = gAlice->GetEventsPerRun();
163 fInternalStacks = new TObjArray(numberOfEvents); //Create array of internal stacks
164 for(i=0;i<numberOfEvents;i++)
166 stack = new AliStack(10000);
168 fInternalStacks->Add(stack);
170 /*********************************************************************/
171 TIter next(fEntries);
172 AliGenCocktailEntry *entry;
173 AliGenCocktailEntry *e1;
174 AliGenCocktailEntry *e2;
175 TObjArray *partArray;
177 // Loop over generators and generate events
179 while((entry = (AliGenCocktailEntry*)next()))
182 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
183 /***********************************************/
184 //First generator for all evenets, than second for all events, etc...
185 for(i=0;i<numberOfEvents;i++)
187 cout<<" EVENT "<<i<<endl;
189 partArray = stack->Particles();
190 fCurrentGenerator = entry->Generator();
191 fCurrentGenerator->SetStack(stack);
198 entry->SetFirst((partArray->GetEntriesFast())+1);
200 fCurrentGenerator->Generate();
201 entry->SetLast(partArray->GetEntriesFast());
203 /***********************************************/
206 while((entry = (AliGenCocktailEntry*)next()))
210 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
214 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
216 printf("\n -----------------------------");
222 /***********************************************/
223 /*******After Burners Processing****************/
224 /***********************************************/
225 TIter nextAfterBurner(fAfterBurnerEntries);
226 AliGenCocktailEntry *afterBurnerEntry;
227 Int_t iab =0; //number of current after burner / counter
229 cout<<"\n\nRunning After Burners"<<endl;
230 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
232 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
233 fCurrentGenerator = afterBurnerEntry->Generator();
234 fCurrentGenerator->Generate();
236 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
238 /***********************************************/
239 /***********************************************/
240 /***********************************************/
242 fGenerationDone=kTRUE;
243 SetTracks(0); //copy event 0 to gAlice stack
245 /*********************************************************************/
249 /*********************************************************************/
250 /*********************************************************************/
252 AliGenCocktailAfterBurner& AliGenCocktailAfterBurner::operator=(const AliGenCocktailAfterBurner& rhs)
254 // Assignment operator
257 /*********************************************************************/
258 /*********************************************************************/
260 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n)
262 //Returns the pointer to the N'th stack (event)
263 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
265 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
268 return ((AliStack*) fInternalStacks->At(n) );
270 /*********************************************************************/
271 /*********************************************************************/
273 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
275 //Set Active Events Number and Active Stack
276 //There is only one active event number
277 //Made fo convinience of work with AfterBurners (HBT processor)
279 fActiveEvent = actev;
280 fActiveStack = GetStack(actev);
282 /*********************************************************************/
283 /*********************************************************************/
285 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
287 //Method which copies tracks from given stack to the
289 AliStack* instack = GetStack(stackno);
293 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
300 Int_t N = instack->GetNtrack();
303 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<N<<"\n";
306 for(Int_t i = 0; i < N; i++)
309 p = instack->Particle(i);
310 done = !p->TestBit(kDoneBit);
311 parent = p->GetMother(0);
312 pdg = p->GetPdgCode();
321 p->GetPolarisation(pol);
325 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
326 weight = p->GetWeight();
328 gAlice->SetTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,
329 polx, poly, polz, mech, ntr, weight);
332 /*********************************************************************/
333 /*********************************************************************/
335 AliMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
337 //Mothod used to convert uniqueID (integer) to AliMCProcess type
338 const AliMCProcess MCprocesses[kMaxMCProcess] =
340 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
341 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
342 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
343 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
344 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
345 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
348 for (Int_t i = 0;i<kMaxMCProcess;i++)
350 if (MCprocesses[i] == no)
352 //if (debug) cout<<"IntToMCProcess("<<no<<") returned AliMCProcess Named \""<<AliMCProcessName[MCprocesses[i]]<<"\""<<endl;
353 return MCprocesses[i];