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"
42 #include "AliCollisionGeometry.h"
47 ClassImp(AliGenCocktailAfterBurner)
48 /*********************************************************************/
49 /*********************************************************************/
51 AliGenCocktailAfterBurner::AliGenCocktailAfterBurner():
53 fAfterBurnerEntries(new TList()),
54 fGenerationDone(kFALSE),
56 fCollisionGeometries(0),
65 cout<<"AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()"<<endl;
66 SetName("AliGenCocktailAfterBurner");
67 SetTitle("AliGenCocktailAfterBurner");
69 /*********************************************************************/
70 AliGenCocktailAfterBurner::AliGenCocktailAfterBurner(const AliGenCocktailAfterBurner& cocktail):
71 AliGenCocktail(cocktail),
73 fAfterBurnerEntries(new TList()),
74 fGenerationDone(kFALSE),
76 fCollisionGeometries(0),
87 /*********************************************************************/
89 AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
93 if (fInternalStacks) //delete stacks
95 fInternalStacks->SetOwner();
96 delete fInternalStacks;
98 if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
99 delete[] fCollisionGeometries;
101 /*********************************************************************/
102 /*********************************************************************/
104 void AliGenCocktailAfterBurner::
105 AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
108 // Forward parameters to the new AfterBurner
110 if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
112 if(TestBit(kPtRange))
113 AfterBurner->SetPtRange(fPtMin,fPtMax);
114 if(TestBit(kMomentumRange))
115 AfterBurner->SetMomentumRange(fPMin,fPMax);
117 AfterBurner->SetYRange(fYMin,fYMax);
118 AfterBurner->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
119 AfterBurner->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
120 AfterBurner->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
121 AfterBurner->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
122 AfterBurner->SetVertexSmear(fVertexSmear);
123 AfterBurner->SetTrackingFlag(fTrackIt);
125 // Add AfterBurner to list
127 AliGenCocktailEntry *entry =
128 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
129 fAfterBurnerEntries->Add(entry);
134 /*********************************************************************/
135 /*********************************************************************/
137 void AliGenCocktailAfterBurner::Init()
140 fGenerationDone = kFALSE;
141 if (fInternalStacks) //delete stacks
143 fInternalStacks->SetOwner();
144 fInternalStacks->Delete(); //clean after previous generation cycle
147 // ANDREAS MORSCH ---------------------------------------------------(
148 if (fCollisionGeometries) delete[] fCollisionGeometries;
149 // ANDREAS MORSCH ---------------------------------------------------)
151 this->AliGenCocktail::Init();
153 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
154 TIter next(fAfterBurnerEntries);
155 AliGenCocktailEntry *entry;
157 // Loop over generators and initialize
158 while((entry = (AliGenCocktailEntry*)next())) {
159 entry->Generator()->Init();
162 /*********************************************************************/
163 /*********************************************************************/
165 void AliGenCocktailAfterBurner::Generate()
169 // Firsts runs each generator for all events
170 // than after burners ones for each event
172 // It generates and processes all events during
174 // In next calls it just returns already generated
175 // and processed events to the gAlice
178 cout<<"#####################################"<<endl
179 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
180 <<"#####################################"<<endl;
186 {//if generation is done (in first call)
187 //just copy particles from the stack to the gAlice
188 SetTracks(++fCurrentEvent);
189 cout<<"Returning event "<<fCurrentEvent<<endl;
193 { //Here we are in the first call of the method
195 Int_t numberOfEvents = gAlice->GetEventsPerRun();
197 fInternalStacks = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
198 fCollisionGeometries = new AliCollisionGeometry*[numberOfEvents + fNBgEvents]; //Create array of collision geometries
199 for(i=0;i<numberOfEvents + fNBgEvents;i++)
201 stack = new AliStack(10000);
203 fInternalStacks->Add(stack);
205 /*********************************************************************/
206 TIter next(fEntries);
207 AliGenCocktailEntry *entry;
208 AliGenCocktailEntry *e1;
209 AliGenCocktailEntry *e2;
210 TObjArray *partArray;
212 // Loop over generators and generate events
214 while((entry = (AliGenCocktailEntry*)next()))
217 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
218 /***********************************************/
219 //First generator for all evenets, than second for all events, etc...
220 for(i=0;i<numberOfEvents + fNBgEvents;i++)
222 cout<<" EVENT "<<i<<endl;
224 partArray = stack->Particles();
225 fCurrentGenerator = entry->Generator();
226 fCurrentGenerator->SetStack(stack);
233 entry->SetFirst((partArray->GetEntriesFast())+1);
235 fCurrentGenerator->Generate();
236 entry->SetLast(partArray->GetEntriesFast());
238 // ANDREAS MORSCH ---------------------------------------------------(
239 if (fCurrentGenerator->ProvidesCollisionGeometry()) fCollisionGeometries[i] = fCurrentGenerator->CollisionGeometry();
240 // ANDREAS MORSCH ---------------------------------------------------)
243 /***********************************************/
246 while((entry = (AliGenCocktailEntry*)next()))
250 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
254 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
256 printf("\n -----------------------------");
262 /***********************************************/
263 /*******After Burners Processing****************/
264 /***********************************************/
265 TIter nextAfterBurner(fAfterBurnerEntries);
266 AliGenCocktailEntry *afterBurnerEntry;
267 Int_t iab =0; //number of current after burner / counter
269 cout<<"\n\nRunning After Burners"<<endl;
270 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
272 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
273 fCurrentGenerator = afterBurnerEntry->Generator();
274 fCurrentGenerator->Generate();
276 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
278 /***********************************************/
279 /***********************************************/
280 /***********************************************/
282 fGenerationDone=kTRUE;
283 SetTracks(0); //copy event 0 to gAlice stack
285 /*********************************************************************/
289 /*********************************************************************/
290 /*********************************************************************/
292 AliGenCocktailAfterBurner& AliGenCocktailAfterBurner::operator=(const AliGenCocktailAfterBurner& rhs)
294 // Assignment operator
298 /*********************************************************************/
299 /*********************************************************************/
301 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n) const
303 //Returns the pointer to the N'th stack (event)
304 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
306 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
309 return ((AliStack*) fInternalStacks->At(n) );
312 /*********************************************************************/
313 /*********************************************************************/
315 // ANDREAS MORSCH ---------------------------------------------------(
317 AliCollisionGeometry* AliGenCocktailAfterBurner::GetCollisionGeometry(Int_t n) const
319 //Returns the pointer to the N'th stack (event)
320 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
322 Fatal("AliGenCocktailAfterBurner::GetCollisionGeometry","Asked for non existing stack (%d)",n);
325 return fCollisionGeometries[n];
328 // ANDREAS MORSCH ---------------------------------------------------)
330 /*********************************************************************/
331 /*********************************************************************/
333 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
335 //Set Active Events Number and Active Stack
336 //There is only one active event number
337 //Made fo convinience of work with AfterBurners (HBT processor)
339 fActiveEvent = actev;
340 fActiveStack = GetStack(actev);
342 /*********************************************************************/
343 /*********************************************************************/
345 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
347 //Method which copies tracks from given stack to the
349 AliStack* instack = GetStack(stackno);
353 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
360 Int_t n = instack->GetNtrack();
363 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<n<<"\n";
366 for(Int_t i = 0; i < n; i++)
369 p = instack->Particle(i);
370 done = !p->TestBit(kDoneBit);
371 parent = p->GetMother(0);
372 pdg = p->GetPdgCode();
381 p->GetPolarisation(pol);
385 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
386 weight = p->GetWeight();
388 gAlice->GetMCApp()->PushTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,polx, poly, polz, mech, ntr, weight);
390 // ANDREAS MORSCH ---------------------------------------------------(
391 SetHighWaterMark(ntr) ;
392 // ANDREAS MORSCH ---------------------------------------------------)
396 /*********************************************************************/
397 /*********************************************************************/
399 TMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
401 //Mothod used to convert uniqueID (integer) to TMCProcess type
402 const TMCProcess kMCprocesses[kMaxMCProcess] =
404 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
405 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
406 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
407 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
408 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
409 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
412 for (Int_t i = 0;i<kMaxMCProcess;i++)
414 if (kMCprocesses[i] == no)
416 return kMCprocesses[i];
422 void AliGenCocktailAfterBurner::Copy(TObject &) const
424 Fatal("Copy","Not implemented!\n");