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 gAlice->GetEventsPerRun()
34 #include <Riostream.h>
37 #include <TObjArray.h>
38 #include <TParticle.h>
40 #include "AliGenCocktailAfterBurner.h"
41 #include "AliGenCocktailEntry.h"
45 ClassImp(AliGenCocktailAfterBurner)
46 /*********************************************************************/
47 /*********************************************************************/
49 AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()
53 cout<<"AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()"<<endl;
54 SetName("AliGenCocktailAfterBurner");
55 SetTitle("AliGenCocktailAfterBurner");
58 fCurrentGenerator = 0;
60 fAfterBurnerEntries = new TList();
62 fGenerationDone = kFALSE;
67 /*********************************************************************/
68 AliGenCocktailAfterBurner::AliGenCocktailAfterBurner(const AliGenCocktailAfterBurner& in)
73 /*********************************************************************/
75 AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
79 if (fInternalStacks) //delete stacks
81 fInternalStacks->SetOwner();
82 delete fInternalStacks;
84 if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
86 /*********************************************************************/
87 /*********************************************************************/
89 void AliGenCocktailAfterBurner::
90 AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
93 // Forward parameters to the new AfterBurner
95 if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
98 AfterBurner->SetPtRange(fPtMin,fPtMax);
99 if(TestBit(kMomentumRange))
100 AfterBurner->SetMomentumRange(fPMin,fPMax);
102 AfterBurner->SetYRange(fYMin,fYMax);
103 AfterBurner->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
104 AfterBurner->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
105 AfterBurner->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
106 AfterBurner->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
107 AfterBurner->SetVertexSmear(fVertexSmear);
108 AfterBurner->SetTrackingFlag(fTrackIt);
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 this->AliGenCocktail::Init();
134 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
135 TIter next(fAfterBurnerEntries);
136 AliGenCocktailEntry *entry;
138 // Loop over generators and initialize
139 while((entry = (AliGenCocktailEntry*)next())) {
140 entry->Generator()->Init();
143 /*********************************************************************/
144 /*********************************************************************/
146 void AliGenCocktailAfterBurner::Generate()
150 // Firsts runs each generator for all events
151 // than after burners ones for each event
153 // It generates and processes all events during
155 // In next calls it just returns already generated
156 // and processed events to the gAlice
159 cout<<"#####################################"<<endl
160 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
161 <<"#####################################"<<endl;
167 {//if generation is done (in first call)
168 //just copy particles from the stack to the gAlice
169 SetTracks(++fCurrentEvent);
170 cout<<"Returning event "<<fCurrentEvent<<endl;
174 { //Here we are in the first call of the method
176 Int_t numberOfEvents = gAlice->GetEventsPerRun();
178 fInternalStacks = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
179 for(i=0;i<numberOfEvents + fNBgEvents;i++)
181 stack = new AliStack(10000);
183 fInternalStacks->Add(stack);
185 /*********************************************************************/
186 TIter next(fEntries);
187 AliGenCocktailEntry *entry;
188 AliGenCocktailEntry *e1;
189 AliGenCocktailEntry *e2;
190 TObjArray *partArray;
192 // Loop over generators and generate events
194 while((entry = (AliGenCocktailEntry*)next()))
197 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
198 /***********************************************/
199 //First generator for all evenets, than second for all events, etc...
200 for(i=0;i<numberOfEvents + fNBgEvents;i++)
202 cout<<" EVENT "<<i<<endl;
204 partArray = stack->Particles();
205 fCurrentGenerator = entry->Generator();
206 fCurrentGenerator->SetStack(stack);
213 entry->SetFirst((partArray->GetEntriesFast())+1);
215 fCurrentGenerator->Generate();
216 entry->SetLast(partArray->GetEntriesFast());
218 /***********************************************/
221 while((entry = (AliGenCocktailEntry*)next()))
225 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
229 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
231 printf("\n -----------------------------");
237 /***********************************************/
238 /*******After Burners Processing****************/
239 /***********************************************/
240 TIter nextAfterBurner(fAfterBurnerEntries);
241 AliGenCocktailEntry *afterBurnerEntry;
242 Int_t iab =0; //number of current after burner / counter
244 cout<<"\n\nRunning After Burners"<<endl;
245 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
247 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
248 fCurrentGenerator = afterBurnerEntry->Generator();
249 fCurrentGenerator->Generate();
251 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
253 /***********************************************/
254 /***********************************************/
255 /***********************************************/
257 fGenerationDone=kTRUE;
258 SetTracks(0); //copy event 0 to gAlice stack
260 /*********************************************************************/
264 /*********************************************************************/
265 /*********************************************************************/
267 AliGenCocktailAfterBurner& AliGenCocktailAfterBurner::operator=(const AliGenCocktailAfterBurner& rhs)
269 // Assignment operator
272 /*********************************************************************/
273 /*********************************************************************/
275 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n) const
277 //Returns the pointer to the N'th stack (event)
278 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
280 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
283 return ((AliStack*) fInternalStacks->At(n) );
285 /*********************************************************************/
286 /*********************************************************************/
288 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
290 //Set Active Events Number and Active Stack
291 //There is only one active event number
292 //Made fo convinience of work with AfterBurners (HBT processor)
294 fActiveEvent = actev;
295 fActiveStack = GetStack(actev);
297 /*********************************************************************/
298 /*********************************************************************/
300 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
302 //Method which copies tracks from given stack to the
304 AliStack* instack = GetStack(stackno);
308 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
315 Int_t n = instack->GetNtrack();
318 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<n<<"\n";
321 for(Int_t i = 0; i < n; i++)
324 p = instack->Particle(i);
325 done = !p->TestBit(kDoneBit);
326 parent = p->GetMother(0);
327 pdg = p->GetPdgCode();
336 p->GetPolarisation(pol);
340 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
341 weight = p->GetWeight();
343 gAlice->SetTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,
344 polx, poly, polz, mech, ntr, weight);
347 /*********************************************************************/
348 /*********************************************************************/
350 TMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
352 //Mothod used to convert uniqueID (integer) to TMCProcess type
353 const TMCProcess kMCprocesses[kMaxMCProcess] =
355 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
356 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
357 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
358 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
359 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
360 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
363 for (Int_t i = 0;i<kMaxMCProcess;i++)
365 if (kMCprocesses[i] == no)
367 return kMCprocesses[i];