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;
57 AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
59 fInternalStacks->SetOwner();
60 delete fInternalStacks;
61 delete fAfterBurnerEntries;
64 void AliGenCocktailAfterBurner::
65 AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
68 // Forward parameters to the new AfterBurner
70 if (debug)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
73 AfterBurner->SetPtRange(fPtMin,fPtMax);
74 if(TestBit(kMomentumRange))
75 AfterBurner->SetMomentumRange(fPMin,fPMax);
77 AfterBurner->SetYRange(fYMin,fYMax);
79 SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
81 SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
83 SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
85 SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
86 AfterBurner->SetVertexSmear(fVertexSmear);
87 AfterBurner->SetTrackingFlag(fTrackIt);
89 // Add AfterBurner to list
91 AliGenCocktailEntry *entry =
92 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
93 fAfterBurnerEntries->Add(entry);
97 void AliGenCocktailAfterBurner::Init()
100 this->AliGenCocktail::Init();
102 if (debug) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
103 TIter next(fAfterBurnerEntries);
104 AliGenCocktailEntry *entry;
106 // Loop over generators and initialize
107 while((entry = (AliGenCocktailEntry*)next())) {
108 entry->Generator()->Init();
112 void AliGenCocktailAfterBurner::Generate()
116 if (debug)cout<<"#####################################"<<endl
117 <<"#AliGenCocktailAfterBurner::Generate#"
118 <<endl<<"#####################################"<<endl;
124 SetTracks(++fCurrentEvent);
125 cout<<"Returning event "<<fCurrentEvent<<endl;
131 fInternalStacks = new TObjArray(fNumberOfEvents); //Create array of internal stacks
132 for(i=0;i<fNumberOfEvents;i++)
134 stack = new AliStack(10000);
136 fInternalStacks->Add(stack);
138 /*********************************************************************/
139 TIter next(fEntries);
140 AliGenCocktailEntry *entry;
141 AliGenCocktailEntry *e1;
142 AliGenCocktailEntry *e2;
143 TObjArray *partArray;
145 // Loop over generators and generate events
147 while((entry = (AliGenCocktailEntry*)next()))
150 cout<<"Generator number "<<igen<<endl;
151 /***********************************************/
152 //First generator for all evenets, than second for all events, etc...
153 for(i=0;i<fNumberOfEvents;i++)
156 cout<<" EVENT "<<i<<endl;
158 partArray = stack->Particles();
159 fCurrentGenerator = entry->Generator();
160 fCurrentGenerator->SetStack(stack);
168 entry->SetFirst((partArray->GetEntriesFast())+1);
170 fCurrentGenerator->Generate();
171 entry->SetLast(partArray->GetEntriesFast());
173 /***********************************************/
176 while((entry = (AliGenCocktailEntry*)next()))
180 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
185 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
187 printf("\n -----------------------------");
192 /***********************************************/
193 /*******After Burners Processing****************/
194 /***********************************************/
195 TIter nextAfterBurner(fAfterBurnerEntries);
196 AliGenCocktailEntry *afterBurnerEntry;
198 cout<<"\n\nRunning After Burners"<<endl;
199 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
201 cout<<"After Burner number "<<iab++<<endl;
202 fCurrentGenerator = afterBurnerEntry->Generator();
203 fCurrentGenerator->Generate();
205 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
207 /***********************************************/
208 /***********************************************/
209 /***********************************************/
211 fGenerationDone=kTRUE;
212 SetTracks(0); //copy event 0 to gAlice stack
214 /*********************************************************************/
220 AliGenCocktailAfterBurner& AliGenCocktailAfterBurner::operator=(const AliGenCocktailAfterBurner& rhs)
222 // Assignment operator
227 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n)
229 if( (n<0) || (n>=fNumberOfEvents) )
231 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
234 return ((AliStack*) ((*fInternalStacks)[n]) );
237 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
239 fActiveEvent = actev;
240 fActiveStack = GetStack(actev);
243 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
245 AliStack* instack = GetStack(stackno);
249 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
256 Int_t N = instack->GetNtrack();
259 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<N<<"\n";
262 for(Int_t i = 0; i < N; i++)
265 p = instack->Particle(i);
266 done = !p->TestBit(kDoneBit);
267 if (debug) {cout<<i<<" "<<done<<" "; fflush(0);}
268 parent = p->GetMother(0);
269 pdg = p->GetPdgCode();
278 p->GetPolarisation(pol);
282 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
283 weight = p->GetWeight();
285 gAlice->SetTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,
286 polx, poly, polz, mech, ntr, weight);
290 AliMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
292 const AliMCProcess MCprocesses[kMaxMCProcess] =
293 {kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
294 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
295 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
296 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
297 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
298 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop};
300 for (Int_t i = 0;i<kMaxMCProcess;i++)
302 if (MCprocesses[i] == no)
304 //if (debug) cout<<"IntToMCProcess("<<no<<") returned AliMCProcess Named \""<<AliMCProcessName[MCprocesses[i]]<<"\""<<endl;
305 return MCprocesses[i];