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;
62 /*********************************************************************/
63 /*********************************************************************/
65 AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
69 if (fInternalStacks) //delete stacks
71 fInternalStacks->SetOwner();
72 delete fInternalStacks;
74 if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
76 /*********************************************************************/
77 /*********************************************************************/
79 void AliGenCocktailAfterBurner::
80 AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
83 // Forward parameters to the new AfterBurner
85 if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
88 AfterBurner->SetPtRange(fPtMin,fPtMax);
89 if(TestBit(kMomentumRange))
90 AfterBurner->SetMomentumRange(fPMin,fPMax);
92 AfterBurner->SetYRange(fYMin,fYMax);
93 AfterBurner->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
94 AfterBurner->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
95 AfterBurner->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
96 AfterBurner->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
97 AfterBurner->SetVertexSmear(fVertexSmear);
98 AfterBurner->SetTrackingFlag(fTrackIt);
100 // Add AfterBurner to list
102 AliGenCocktailEntry *entry =
103 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
104 fAfterBurnerEntries->Add(entry);
109 /*********************************************************************/
110 /*********************************************************************/
112 void AliGenCocktailAfterBurner::Init()
115 fGenerationDone = kFALSE;
116 if (fInternalStacks) //delete stacks
118 fInternalStacks->SetOwner();
119 fInternalStacks->Delete(); //clean after previous generation cycle
122 this->AliGenCocktail::Init();
124 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
125 TIter next(fAfterBurnerEntries);
126 AliGenCocktailEntry *entry;
128 // Loop over generators and initialize
129 while((entry = (AliGenCocktailEntry*)next())) {
130 entry->Generator()->Init();
133 /*********************************************************************/
134 /*********************************************************************/
136 void AliGenCocktailAfterBurner::Generate()
140 // Firsts runs each generator for all events
141 // than after burners ones for each event
143 // It generates and processes all events during
145 // In next calls it just returns already generated
146 // and processed events to the gAlice
149 cout<<"#####################################"<<endl
150 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
151 <<"#####################################"<<endl;
157 {//if generation is done (in first call)
158 //just copy particles from the stack to the gAlice
159 SetTracks(++fCurrentEvent);
160 cout<<"Returning event "<<fCurrentEvent<<endl;
164 { //Here we are in the first call of the method
166 Int_t numberOfEvents = gAlice->GetEventsPerRun();
168 fInternalStacks = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
169 for(i=0;i<numberOfEvents + fNBgEvents;i++)
171 stack = new AliStack(10000);
173 fInternalStacks->Add(stack);
175 /*********************************************************************/
176 TIter next(fEntries);
177 AliGenCocktailEntry *entry;
178 AliGenCocktailEntry *e1;
179 AliGenCocktailEntry *e2;
180 TObjArray *partArray;
182 // Loop over generators and generate events
184 while((entry = (AliGenCocktailEntry*)next()))
187 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
188 /***********************************************/
189 //First generator for all evenets, than second for all events, etc...
190 for(i=0;i<numberOfEvents + fNBgEvents;i++)
192 cout<<" EVENT "<<i<<endl;
194 partArray = stack->Particles();
195 fCurrentGenerator = entry->Generator();
196 fCurrentGenerator->SetStack(stack);
203 entry->SetFirst((partArray->GetEntriesFast())+1);
205 fCurrentGenerator->Generate();
206 entry->SetLast(partArray->GetEntriesFast());
208 /***********************************************/
211 while((entry = (AliGenCocktailEntry*)next()))
215 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
219 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
221 printf("\n -----------------------------");
227 /***********************************************/
228 /*******After Burners Processing****************/
229 /***********************************************/
230 TIter nextAfterBurner(fAfterBurnerEntries);
231 AliGenCocktailEntry *afterBurnerEntry;
232 Int_t iab =0; //number of current after burner / counter
234 cout<<"\n\nRunning After Burners"<<endl;
235 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
237 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
238 fCurrentGenerator = afterBurnerEntry->Generator();
239 fCurrentGenerator->Generate();
241 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
243 /***********************************************/
244 /***********************************************/
245 /***********************************************/
247 fGenerationDone=kTRUE;
248 SetTracks(0); //copy event 0 to gAlice stack
250 /*********************************************************************/
254 /*********************************************************************/
255 /*********************************************************************/
257 AliGenCocktailAfterBurner& AliGenCocktailAfterBurner::operator=(const AliGenCocktailAfterBurner& rhs)
259 // Assignment operator
262 /*********************************************************************/
263 /*********************************************************************/
265 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n)
267 //Returns the pointer to the N'th stack (event)
268 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
270 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
273 return ((AliStack*) fInternalStacks->At(n) );
275 /*********************************************************************/
276 /*********************************************************************/
278 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
280 //Set Active Events Number and Active Stack
281 //There is only one active event number
282 //Made fo convinience of work with AfterBurners (HBT processor)
284 fActiveEvent = actev;
285 fActiveStack = GetStack(actev);
287 /*********************************************************************/
288 /*********************************************************************/
290 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
292 //Method which copies tracks from given stack to the
294 AliStack* instack = GetStack(stackno);
298 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
305 Int_t N = instack->GetNtrack();
308 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<N<<"\n";
311 for(Int_t i = 0; i < N; i++)
314 p = instack->Particle(i);
315 done = !p->TestBit(kDoneBit);
316 parent = p->GetMother(0);
317 pdg = p->GetPdgCode();
326 p->GetPolarisation(pol);
330 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
331 weight = p->GetWeight();
333 gAlice->SetTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,
334 polx, poly, polz, mech, ntr, weight);
337 /*********************************************************************/
338 /*********************************************************************/
340 AliMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
342 //Mothod used to convert uniqueID (integer) to AliMCProcess type
343 const AliMCProcess MCprocesses[kMaxMCProcess] =
345 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
346 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
347 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
348 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
349 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
350 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
353 for (Int_t i = 0;i<kMaxMCProcess;i++)
355 if (MCprocesses[i] == no)
357 //if (debug) cout<<"IntToMCProcess("<<no<<") returned AliMCProcess Named \""<<AliMCProcessName[MCprocesses[i]]<<"\""<<endl;
358 return MCprocesses[i];