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
27 #include "AliGenCocktailAfterBurner.h"
28 #include "AliGenCocktailEntry.h"
31 #include <TObjArray.h>
33 #include <TParticle.h>
36 static const Bool_t debug = kFALSE;
37 ClassImp(AliGenCocktailAfterBurner)
39 AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()
43 cout<<"AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()"<<endl;
44 SetName("AliGenCocktailAfterBurner");
45 SetTitle("AliGenCocktailAfterBurner");
48 fAfterBurnerEntries = new TList();
50 fGenerationDone = kFALSE;
56 AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
58 fInternalStacks->SetOwner();
59 delete fInternalStacks;
60 delete fAfterBurnerEntries;
63 void AliGenCocktailAfterBurner::
64 AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
67 // Forward parameters to the new AfterBurner
69 if (debug)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
72 AfterBurner->SetPtRange(fPtMin,fPtMax);
73 if(TestBit(kMomentumRange))
74 AfterBurner->SetMomentumRange(fPMin,fPMax);
76 AfterBurner->SetYRange(fYMin,fYMax);
78 SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
80 SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
82 SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
84 SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
85 AfterBurner->SetVertexSmear(fVertexSmear);
86 AfterBurner->SetTrackingFlag(fTrackIt);
88 // Add AfterBurner to list
90 AliGenCocktailEntry *entry =
91 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
92 fAfterBurnerEntries->Add(entry);
95 SetNumberOfEvents(gAlice->GetEventsPerRun());
99 void AliGenCocktailAfterBurner::Init()
102 this->AliGenCocktail::Init();
104 if (debug) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
105 TIter next(fAfterBurnerEntries);
106 AliGenCocktailEntry *entry;
108 // Loop over generators and initialize
109 while((entry = (AliGenCocktailEntry*)next())) {
110 entry->Generator()->Init();
114 void AliGenCocktailAfterBurner::Generate()
118 if (debug)cout<<"#####################################"<<endl
119 <<"#AliGenCocktailAfterBurner::Generate#"
120 <<endl<<"#####################################"<<endl;
126 SetTracks(++fCurrentEvent);
127 cout<<"Returning event "<<fCurrentEvent<<endl;
133 fInternalStacks = new TObjArray(fNumberOfEvents); //Create array of internal stacks
134 for(i=0;i<fNumberOfEvents;i++)
136 stack = new AliStack(10000);
138 fInternalStacks->Add(stack);
140 /*********************************************************************/
141 TIter next(fEntries);
142 AliGenCocktailEntry *entry;
143 AliGenCocktailEntry *e1;
144 AliGenCocktailEntry *e2;
145 TObjArray *partArray;
147 // Loop over generators and generate events
149 while((entry = (AliGenCocktailEntry*)next()))
152 cout<<"Generator number "<<igen<<endl;
153 /***********************************************/
154 //First generator for all evenets, than second for all events, etc...
155 for(i=0;i<fNumberOfEvents;i++)
158 cout<<" EVENT "<<i<<endl;
160 partArray = stack->Particles();
161 fCurrentGenerator = entry->Generator();
162 fCurrentGenerator->SetStack(stack);
170 entry->SetFirst((partArray->GetEntriesFast())+1);
172 fCurrentGenerator->Generate();
173 entry->SetLast(partArray->GetEntriesFast());
175 /***********************************************/
178 while((entry = (AliGenCocktailEntry*)next()))
182 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
187 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
189 printf("\n -----------------------------");
194 /***********************************************/
195 /*******After Burners Processing****************/
196 /***********************************************/
197 TIter nextAfterBurner(fAfterBurnerEntries);
198 AliGenCocktailEntry *afterBurnerEntry;
200 cout<<"\n\nRunning After Burners"<<endl;
201 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
203 cout<<"After Burner number "<<iab++<<endl;
204 fCurrentGenerator = afterBurnerEntry->Generator();
205 fCurrentGenerator->Generate();
207 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
209 /***********************************************/
210 /***********************************************/
211 /***********************************************/
213 fGenerationDone=kTRUE;
214 SetTracks(0); //copy event 0 to gAlice stack
216 /*********************************************************************/
222 AliGenCocktailAfterBurner& AliGenCocktailAfterBurner::operator=(const AliGenCocktailAfterBurner& rhs)
224 // Assignment operator
229 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n)
231 if( (n<0) || (n>=fNumberOfEvents) )
233 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
236 return ((AliStack*) ((*fInternalStacks)[n]) );
239 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
241 fActiveEvent = actev;
242 fActiveStack = GetStack(actev);
245 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
247 AliStack* instack = GetStack(stackno);
251 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
258 Int_t N = instack->GetNtrack();
261 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<N<<"\n";
264 for(Int_t i = 0; i < N; i++)
267 p = instack->Particle(i);
268 done = !p->TestBit(kDoneBit);
269 if (debug) {cout<<i<<" "<<done<<" "; fflush(0);}
270 parent = p->GetMother(0);
271 pdg = p->GetPdgCode();
280 p->GetPolarisation(pol);
284 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
285 weight = p->GetWeight();
287 gAlice->SetTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,
288 polx, poly, polz, mech, ntr, weight);
292 AliMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
294 const AliMCProcess MCprocesses[kMaxMCProcess] =
295 {kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
296 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
297 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
298 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
299 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
300 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop};
302 for (Int_t i = 0;i<kMaxMCProcess;i++)
304 if (MCprocesses[i] == no)
306 //if (debug) cout<<"IntToMCProcess("<<no<<") returned AliMCProcess Named \""<<AliMCProcessName[MCprocesses[i]]<<"\""<<endl;
307 return MCprocesses[i];