]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVGEN/AliGenCocktailAfterBurner.cxx
Option kPyCharmPbMNR added. Produce charm pairs in agreement with MNR
[u/mrichter/AliRoot.git] / EVGEN / AliGenCocktailAfterBurner.cxx
CommitLineData
0b359ada 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16//
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
25//
2b9786f4 26// 24.09.2001 Piotr Skowronski
27// debug -> gDebug,
28// fNEvents replaced with gAlice->GetEventsPerRun()
29//
0b359ada 30#include "AliGenCocktailAfterBurner.h"
31#include "AliGenCocktailEntry.h"
2b9786f4 32
0b359ada 33#include "AliStack.h"
34#include <TObjArray.h>
35#include <TList.h>
36#include <TParticle.h>
37#include <iostream.h>
38
2b9786f4 39
0b359ada 40ClassImp(AliGenCocktailAfterBurner)
2b9786f4 41/*********************************************************************/
42/*********************************************************************/
0b359ada 43
44AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()
45{
46// Constructor
2b9786f4 47 if (gDebug > 0)
0b359ada 48 cout<<"AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()"<<endl;
49 SetName("AliGenCocktailAfterBurner");
50 SetTitle("AliGenCocktailAfterBurner");
51 fInternalStacks =0;
2685bf00 52 fActiveStack = 0;
53 fCurrentGenerator = 0;
0b359ada 54 fCurrentEvent =0;
55 fAfterBurnerEntries = new TList();
56 fNAfterBurners = 0;
57 fGenerationDone = kFALSE;
58
59 fActiveEvent = -1;
466bfded 60 fNBgEvents = 0;
0b359ada 61}
2b9786f4 62/*********************************************************************/
63/*********************************************************************/
0b359ada 64
65AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
66 {
2b9786f4 67//destructor
68
69 if (fInternalStacks) //delete stacks
70 {
71 fInternalStacks->SetOwner();
72 delete fInternalStacks;
73 }
74 if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
0b359ada 75 }
2b9786f4 76/*********************************************************************/
77/*********************************************************************/
0b359ada 78
79void AliGenCocktailAfterBurner::
80AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
81{
82//
83// Forward parameters to the new AfterBurner
84
2b9786f4 85 if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner Named "<<Name<<endl;
0b359ada 86
87 if(TestBit(kPtRange))
88 AfterBurner->SetPtRange(fPtMin,fPtMax);
89 if(TestBit(kMomentumRange))
90 AfterBurner->SetMomentumRange(fPMin,fPMax);
91
92 AfterBurner->SetYRange(fYMin,fYMax);
466bfded 93 AfterBurner->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
94 AfterBurner->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
95 AfterBurner->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
96 AfterBurner->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
0b359ada 97 AfterBurner->SetVertexSmear(fVertexSmear);
98 AfterBurner->SetTrackingFlag(fTrackIt);
99//
100// Add AfterBurner to list
101
102 AliGenCocktailEntry *entry =
103 new AliGenCocktailEntry(AfterBurner, Name, RateExp);
104 fAfterBurnerEntries->Add(entry);
105 fNAfterBurners++;
984c69bd 106//
984c69bd 107
0b359ada 108}
2b9786f4 109/*********************************************************************/
110/*********************************************************************/
0b359ada 111
112void AliGenCocktailAfterBurner::Init()
113{
114// Initialisation
2b9786f4 115 fGenerationDone = kFALSE;
466bfded 116 if (fInternalStacks) //delete stacks
117 {
118 fInternalStacks->SetOwner();
119 fInternalStacks->Delete(); //clean after previous generation cycle
120 }
121
0b359ada 122 this->AliGenCocktail::Init();
123
2b9786f4 124 if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
0b359ada 125 TIter next(fAfterBurnerEntries);
126 AliGenCocktailEntry *entry;
127 //
128 // Loop over generators and initialize
129 while((entry = (AliGenCocktailEntry*)next())) {
130 entry->Generator()->Init();
131 }
132}
2b9786f4 133/*********************************************************************/
134/*********************************************************************/
0b359ada 135
136void AliGenCocktailAfterBurner::Generate()
137{
138//
2b9786f4 139// Generate event
140// Firsts runs each generator for all events
141// than after burners ones for each event
142//
143// It generates and processes all events during
144// first call only.
145// In next calls it just returns already generated
146// and processed events to the gAlice
147
148 if (gDebug>0)
149 cout<<"#####################################"<<endl
150 <<"#AliGenCocktailAfterBurner::Generate#"<<endl
151 <<"#####################################"<<endl;
0b359ada 152
153 Int_t i; //iterator
154 AliStack * stack;
2b9786f4 155
0b359ada 156 if (fGenerationDone)
2b9786f4 157 {//if generation is done (in first call)
158 //just copy particles from the stack to the gAlice
159 SetTracks(++fCurrentEvent);
160 cout<<"Returning event "<<fCurrentEvent<<endl;
161 return;
0b359ada 162 }
163 else
2b9786f4 164 { //Here we are in the first call of the method
165 fCurrentEvent=0;
166 Int_t numberOfEvents = gAlice->GetEventsPerRun();
167 //Create stacks
466bfded 168 fInternalStacks = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
169 for(i=0;i<numberOfEvents + fNBgEvents;i++)
2b9786f4 170 {
171 stack = new AliStack(10000);
172 stack->Reset();
173 fInternalStacks->Add(stack);
174 }
0b359ada 175/*********************************************************************/
2b9786f4 176 TIter next(fEntries);
177 AliGenCocktailEntry *entry;
178 AliGenCocktailEntry *e1;
179 AliGenCocktailEntry *e2;
180 TObjArray *partArray;
181 //
182 // Loop over generators and generate events
183 Int_t igen=0;
184 while((entry = (AliGenCocktailEntry*)next()))
185 {
186 igen++;
187 cout<<"Generator "<<igen<<" : "<<entry->GetName()<<endl;
188/***********************************************/
0b359ada 189//First generator for all evenets, than second for all events, etc...
466bfded 190 for(i=0;i<numberOfEvents + fNBgEvents;i++)
2b9786f4 191 {
192 cout<<" EVENT "<<i<<endl;
193 stack = GetStack(i);
194 partArray = stack->Particles();
195 fCurrentGenerator = entry->Generator();
196 fCurrentGenerator->SetStack(stack);
197 if (igen ==1)
198 {
199 entry->SetFirst(0);
200 }
201 else
202 {
203 entry->SetFirst((partArray->GetEntriesFast())+1);
204 }
205 fCurrentGenerator->Generate();
206 entry->SetLast(partArray->GetEntriesFast());
207 }
208/***********************************************/
209 }
210 next.Reset();
211 while((entry = (AliGenCocktailEntry*)next()))
212 {
213 entry->PrintInfo();
214 }
215 for ( entry=FirstGenerator();entry;entry=NextGenerator() )
216 {
217 entry->PrintInfo();
218 }
219 for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
220 {
221 printf("\n -----------------------------");
222 e1->PrintInfo();
223 e2->PrintInfo();
0b359ada 224 }
225
0b359ada 226
2b9786f4 227 /***********************************************/
228 /*******After Burners Processing****************/
229 /***********************************************/
230 TIter nextAfterBurner(fAfterBurnerEntries);
231 AliGenCocktailEntry *afterBurnerEntry;
232 Int_t iab =0; //number of current after burner / counter
233
234 cout<<"\n\nRunning After Burners"<<endl;
235 while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
236 {
237 cout<<"After Burner "<<iab++<<" :"<<afterBurnerEntry->GetName()<<endl;
238 fCurrentGenerator = afterBurnerEntry->Generator();
239 fCurrentGenerator->Generate();
240 }
241 cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
242
243 /***********************************************/
244 /***********************************************/
245 /***********************************************/
0b359ada 246
2b9786f4 247 fGenerationDone=kTRUE;
248 SetTracks(0); //copy event 0 to gAlice stack
0b359ada 249
250/*********************************************************************/
251
252 }//else generated
253}
2b9786f4 254/*********************************************************************/
255/*********************************************************************/
0b359ada 256
257AliGenCocktailAfterBurner& AliGenCocktailAfterBurner::operator=(const AliGenCocktailAfterBurner& rhs)
258{
259// Assignment operator
260 return *this;
261}
2b9786f4 262/*********************************************************************/
263/*********************************************************************/
0b359ada 264
265AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n)
266{
2b9786f4 267//Returns the pointer to the N'th stack (event)
268 if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
0b359ada 269 {
2b9786f4 270 Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
271 return 0;
0b359ada 272 }
2682e810 273 return ((AliStack*) fInternalStacks->At(n) );
0b359ada 274}
2b9786f4 275/*********************************************************************/
276/*********************************************************************/
0b359ada 277
278void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
279{
2b9786f4 280//Set Active Events Number and Active Stack
281//There is only one active event number
282//Made fo convinience of work with AfterBurners (HBT processor)
283
0b359ada 284 fActiveEvent = actev;
285 fActiveStack = GetStack(actev);
286}
2b9786f4 287/*********************************************************************/
288/*********************************************************************/
0b359ada 289
290void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
291{
2b9786f4 292//Method which copies tracks from given stack to the
293//gAlice's stack
0b359ada 294 AliStack* instack = GetStack(stackno);
295 Int_t done;
296 Int_t parent;
297 Int_t pdg;
298 Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
299 AliMCProcess mech;
300 Int_t ntr;
301 Float_t weight;
302 TVector3 pol;
303
304 TParticle * p;
305 Int_t N = instack->GetNtrack();
2b9786f4 306 if (gDebug)
0b359ada 307 {
2b9786f4 308 cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<N<<"\n";
0b359ada 309 }
310
311 for(Int_t i = 0; i < N; i++)
312 {
313
2b9786f4 314 p = instack->Particle(i);
315 done = !p->TestBit(kDoneBit);
316 parent = p->GetMother(0);
317 pdg = p->GetPdgCode();
318 px = p->Px();
319 py = p->Py();
320 pz = p->Pz();
321 e = p->Energy();
322 vx = p->Vx();
323 vy = p->Vy();
324 vz = p->Vz();
325 tof = p->T();
326 p->GetPolarisation(pol);
327 polx = pol.X();
328 poly = pol.Y();
329 polz = pol.Z();
330 mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
331 weight = p->GetWeight();
332
333 gAlice->SetTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,
334 polx, poly, polz, mech, ntr, weight);
0b359ada 335 }
336}
2b9786f4 337/*********************************************************************/
338/*********************************************************************/
0b359ada 339
340AliMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
341{
2b9786f4 342 //Mothod used to convert uniqueID (integer) to AliMCProcess type
0b359ada 343 const AliMCProcess MCprocesses[kMaxMCProcess] =
2b9786f4 344 {
345 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
0b359ada 346 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
347 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
348 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
349 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
2b9786f4 350 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
351 };
0b359ada 352
353 for (Int_t i = 0;i<kMaxMCProcess;i++)
354 {
2b9786f4 355 if (MCprocesses[i] == no)
356 {
357 //if (debug) cout<<"IntToMCProcess("<<no<<") returned AliMCProcess Named \""<<AliMCProcessName[MCprocesses[i]]<<"\""<<endl;
358 return MCprocesses[i];
359 }
0b359ada 360 }
361 return kPNoProcess;
362}