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()
55 cout<<"AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()"<<endl;
56 SetName("AliGenCocktailAfterBurner");
57 SetTitle("AliGenCocktailAfterBurner");
59 fCollisionGeometries = 0;
61 fCurrentGenerator = 0;
63 fAfterBurnerEntries = new TList();
65 fGenerationDone = kFALSE;
70 /*********************************************************************/
71 AliGenCocktailAfterBurner::AliGenCocktailAfterBurner(const AliGenCocktailAfterBurner& cocktail):
72 AliGenCocktail(cocktail)
79 /*********************************************************************/
81 AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
85 if (fInternalStacks) //delete stacks
87 fInternalStacks->SetOwner();
88 delete fInternalStacks;
90 if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
91 delete[] fCollisionGeometries;
93 /*********************************************************************/
94 /*********************************************************************/
96 void AliGenCocktailAfterBurner::
97 AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
100 // Forward parameters to the new AfterBurner
102 if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
104 if(TestBit(kPtRange))
105 AfterBurner->SetPtRange(fPtMin,fPtMax);
106 if(TestBit(kMomentumRange))
107 AfterBurner->SetMomentumRange(fPMin,fPMax);
109 AfterBurner->SetYRange(fYMin,fYMax);
110 AfterBurner->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
111 AfterBurner->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
112 AfterBurner->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
113 AfterBurner->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
114 AfterBurner->SetVertexSmear(fVertexSmear);
115 AfterBurner->SetTrackingFlag(fTrackIt);
117 // Add AfterBurner to list
119 AliGenCocktailEntry *entry =
120 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
121 fAfterBurnerEntries->Add(entry);
126 /*********************************************************************/
127 /*********************************************************************/
129 void AliGenCocktailAfterBurner::Init()
132 fGenerationDone = kFALSE;
133 if (fInternalStacks) //delete stacks
135 fInternalStacks->SetOwner();
136 fInternalStacks->Delete(); //clean after previous generation cycle
139 // ANDREAS MORSCH ---------------------------------------------------(
140 if (fCollisionGeometries) delete[] fCollisionGeometries;
141 // ANDREAS MORSCH ---------------------------------------------------)
143 this->AliGenCocktail::Init();
145 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
146 TIter next(fAfterBurnerEntries);
147 AliGenCocktailEntry *entry;
149 // Loop over generators and initialize
150 while((entry = (AliGenCocktailEntry*)next())) {
151 entry->Generator()->Init();
154 /*********************************************************************/
155 /*********************************************************************/
157 void AliGenCocktailAfterBurner::Generate()
161 // Firsts runs each generator for all events
162 // than after burners ones for each event
164 // It generates and processes all events during
166 // In next calls it just returns already generated
167 // and processed events to the gAlice
170 cout<<"#####################################"<<endl
171 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
172 <<"#####################################"<<endl;
178 {//if generation is done (in first call)
179 //just copy particles from the stack to the gAlice
180 SetTracks(++fCurrentEvent);
181 cout<<"Returning event "<<fCurrentEvent<<endl;
185 { //Here we are in the first call of the method
187 Int_t numberOfEvents = gAlice->GetEventsPerRun();
189 fInternalStacks = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
190 fCollisionGeometries = new AliCollisionGeometry*[numberOfEvents + fNBgEvents]; //Create array of collision geometries
191 for(i=0;i<numberOfEvents + fNBgEvents;i++)
193 stack = new AliStack(10000);
195 fInternalStacks->Add(stack);
197 /*********************************************************************/
198 TIter next(fEntries);
199 AliGenCocktailEntry *entry;
200 AliGenCocktailEntry *e1;
201 AliGenCocktailEntry *e2;
202 TObjArray *partArray;
204 // Loop over generators and generate events
206 while((entry = (AliGenCocktailEntry*)next()))
209 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
210 /***********************************************/
211 //First generator for all evenets, than second for all events, etc...
212 for(i=0;i<numberOfEvents + fNBgEvents;i++)
214 cout<<" EVENT "<<i<<endl;
216 partArray = stack->Particles();
217 fCurrentGenerator = entry->Generator();
218 fCurrentGenerator->SetStack(stack);
225 entry->SetFirst((partArray->GetEntriesFast())+1);
227 fCurrentGenerator->Generate();
228 entry->SetLast(partArray->GetEntriesFast());
230 // ANDREAS MORSCH ---------------------------------------------------(
231 if (fCurrentGenerator->ProvidesCollisionGeometry()) fCollisionGeometries[i] = fCurrentGenerator->CollisionGeometry();
232 // ANDREAS MORSCH ---------------------------------------------------)
235 /***********************************************/
238 while((entry = (AliGenCocktailEntry*)next()))
242 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
246 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
248 printf("\n -----------------------------");
254 /***********************************************/
255 /*******After Burners Processing****************/
256 /***********************************************/
257 TIter nextAfterBurner(fAfterBurnerEntries);
258 AliGenCocktailEntry *afterBurnerEntry;
259 Int_t iab =0; //number of current after burner / counter
261 cout<<"\n\nRunning After Burners"<<endl;
262 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
264 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
265 fCurrentGenerator = afterBurnerEntry->Generator();
266 fCurrentGenerator->Generate();
268 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
270 /***********************************************/
271 /***********************************************/
272 /***********************************************/
274 fGenerationDone=kTRUE;
275 SetTracks(0); //copy event 0 to gAlice stack
277 /*********************************************************************/
281 /*********************************************************************/
282 /*********************************************************************/
284 AliGenCocktailAfterBurner& AliGenCocktailAfterBurner::operator=(const AliGenCocktailAfterBurner& rhs)
286 // Assignment operator
290 /*********************************************************************/
291 /*********************************************************************/
293 AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n) const
295 //Returns the pointer to the N'th stack (event)
296 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
298 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
301 return ((AliStack*) fInternalStacks->At(n) );
304 /*********************************************************************/
305 /*********************************************************************/
307 // ANDREAS MORSCH ---------------------------------------------------(
309 AliCollisionGeometry* AliGenCocktailAfterBurner::GetCollisionGeometry(Int_t n) const
311 //Returns the pointer to the N'th stack (event)
312 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
314 Fatal("AliGenCocktailAfterBurner::GetCollisionGeometry","Asked for non existing stack (%d)",n);
317 return fCollisionGeometries[n];
320 // ANDREAS MORSCH ---------------------------------------------------)
322 /*********************************************************************/
323 /*********************************************************************/
325 void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
327 //Set Active Events Number and Active Stack
328 //There is only one active event number
329 //Made fo convinience of work with AfterBurners (HBT processor)
331 fActiveEvent = actev;
332 fActiveStack = GetStack(actev);
334 /*********************************************************************/
335 /*********************************************************************/
337 void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
339 //Method which copies tracks from given stack to the
341 AliStack* instack = GetStack(stackno);
345 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
352 Int_t n = instack->GetNtrack();
355 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<n<<"\n";
358 for(Int_t i = 0; i < n; i++)
361 p = instack->Particle(i);
362 done = !p->TestBit(kDoneBit);
363 parent = p->GetMother(0);
364 pdg = p->GetPdgCode();
373 p->GetPolarisation(pol);
377 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
378 weight = p->GetWeight();
380 gAlice->GetMCApp()->PushTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,polx, poly, polz, mech, ntr, weight);
382 // ANDREAS MORSCH ---------------------------------------------------(
383 SetHighWaterMark(ntr) ;
384 // ANDREAS MORSCH ---------------------------------------------------)
388 /*********************************************************************/
389 /*********************************************************************/
391 TMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
393 //Mothod used to convert uniqueID (integer) to TMCProcess type
394 const TMCProcess kMCprocesses[kMaxMCProcess] =
396 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
397 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
398 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
399 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
400 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
401 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
404 for (Int_t i = 0;i<kMaxMCProcess;i++)
406 if (kMCprocesses[i] == no)
408 return kMCprocesses[i];
414 void AliGenCocktailAfterBurner::Copy(TObject &) const
416 Fatal("Copy","Not implemented!\n");