1 //-------------------------------------------------------------
2 // Generate Beam-Gas-Events
3 // Default: underlying event: pO @ 7 TeV (fixed target)
5 // underlying event can be changed by adding generators
6 // in the same as to AliGenCocktail before calling the Init()
7 //-------------------------------------------------------------
12 #include <TObjArray.h>
13 #include "TParticle.h"
15 #include "AliGenBeamGasNew.h"
16 #include "AliGenCocktail.h"
17 #include "AliGenCocktailEntry.h"
18 #include "AliGenCocktailEventHeader.h"
19 #include "../THijing/AliGenHijing.h"
20 #include "AliCollisionGeometry.h"
26 ClassImp(AliGenBeamGasNew)
28 Float_t EtaToTheta(Float_t arg) { return (180./TMath::Pi())*2.*atan(exp(-arg)); }
30 AliGenBeamGasNew::AliGenBeamGasNew() :
34 // Default constructor
37 AliGenBeamGasNew::~AliGenBeamGasNew()
42 AliGenBeamGasNew::AliGenBeamGasNew(const AliGenBeamGasNew& /*rhs*/) : AliGenCocktail()
44 AliFatal("Copy Constructor not yet implemented!");
48 void AliGenBeamGasNew::Init()
50 // Initialisation of the class
51 // if no generators were added before calling Init()
52 // AliGenHijing is added configured for pO
54 fVertexSmear = kPerEvent;
55 fVertexSource = kInternal;
58 // Adding default underlying event in case none was specified
59 // p-O-collision at 7 TeV (fixed target)
61 AliGenHijing *gen = new AliGenHijing(-1);
62 gen->SetEnergyCMS(7000);
63 gen->SetReferenceFrame("LAB");
64 gen->SetProjectile("P",1,1);
65 gen->SetTarget("A",16,8);
66 gen->SetPhiRange(0,360);
67 Float_t thmin = EtaToTheta(8);
68 Float_t thmax = EtaToTheta(-8);
69 gen->SetThetaRange(thmin, thmax);
70 gen->SetOrigin(0,0,0);
75 gen->SetSpectators(1);
77 gen->SetRandomPz(kTRUE);
78 gen->SetPileUpTimeWindow(0.);
79 AddGenerator(gen,"Hijing pO",1);
83 AliGenCocktailEntry *entry;
85 // Loop over generators and initialize
86 while((entry = (AliGenCocktailEntry*)next())) {
87 if (fStack) entry->Generator()->SetStack(fStack);
88 entry->Generator()->Init();
94 fProb.Set(fNGenerators);
97 while((entry = (AliGenCocktailEntry*)next())) {
104 while((entry = (AliGenCocktailEntry*)next())) {
105 psum += entry->Rate() / sum;
112 void AliGenBeamGasNew::VertexInternal()
114 // calculation of the interaction vertex for the beam gas event
115 // both spatial and time coordinate are adjusted.
122 fVertex[0] = fVertex[1] = 0.;
123 fVertex[2] = random[1] * 4000. - 2000.;
124 AliInfo(Form("z-Koord.: %13.3f \n", fVertex[2]));
125 nbunch = 2 * fTwindow / 25.e-9;
126 bunch = (Int_t) (nbunch * (random[0] - 0.5));
127 fItime = fVertex[2] / 3.e8 + bunch * 25.e-9;
128 AliInfo(Form("fItime: %13.3e \n", fItime));
131 void AliGenBeamGasNew::Generate()
133 TIter next(fEntries);
134 AliGenCocktailEntry *entry = 0;
135 AliGenCocktailEntry *preventry = 0;
136 AliGenerator* gen = 0;
138 if (fHeader) delete fHeader;
139 fHeader = new AliGenCocktailEventHeader("Beamgas Header");
141 TObjArray *partArray = gAlice->GetMCApp()->Particles();
144 int numbg = 0; // variable for counting how many bg interactions happened
150 for (Int_t j=0; j < 3; j++) eventVertex[j] = fVertex[j];
154 while((entry = (AliGenCocktailEntry*)next())) {
155 if (fUsePerEventRate && (gRandom->Rndm() > entry->Rate())) continue;
161 entry->SetFirst((partArray->GetEntriesFast())+1);
164 // Handle case in which current generator needs collision geometry from previous generator
166 gen = entry->Generator();
167 if (gen->NeedsCollisionGeometry())
169 if (preventry && preventry->Generator()->ProvidesCollisionGeometry())
171 gen->SetCollisionGeometry(preventry->Generator()->CollisionGeometry());
173 Fatal("Generate()", "No Collision Geometry Provided");
176 entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
177 entry->Generator()->Generate();
178 entry->SetLast(partArray->GetEntriesFast());
183 // Select a generator randomly
186 Float_t p0 = gRandom->Rndm();
188 for (i = 0; i < fNGenerators; i++) {
189 if (p0 < fProb[i]) break;
192 entry = (AliGenCocktailEntry*) fEntries->At(i);
194 gen = entry->Generator();
195 entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
196 entry->Generator()->Generate();
197 entry->SetLast(partArray->GetEntriesFast());
200 AliStack *stack = gAlice->GetRunLoader()->Stack();
202 for (int k = 0; k < stack->GetNprimary(); k++) {
203 stack->Particle(k)->ProductionVertex(v);
205 stack->Particle(k)->SetProductionVertex(v);
209 } while (gRandom->Rndm() < 1. / 5.); // must be adjusted to the rate of bg interactions
211 fHeader->SetPrimaryVertex(eventVertex);
212 // Total number of produced an stored particles
213 fHeader->CalcNProduced();
215 gAlice->SetGenEventHeader(fHeader);