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 **************************************************************************/
20 //-------------------------------------------------------------
21 // Generate Beam-Gas-Events
22 // Default: underlying event: pO @ 7 TeV (fixed target)
24 // underlying event can be changed by adding generators
25 // in the same way as to AliGenCocktail before calling
27 // Author: Jochen Klein
28 //-------------------------------------------------------------
31 #include <TObjArray.h>
32 #include <TParticle.h>
34 #include "AliGenBeamGasNew.h"
35 #include "AliGenCocktail.h"
36 #include "AliGenCocktailEntry.h"
37 #include "AliGenCocktailEventHeader.h"
38 #include "../THijing/AliGenHijing.h"
39 #include "AliCollisionGeometry.h"
45 #include "AliHeader.h"
46 #include "AliGenEventHeader.h"
48 ClassImp(AliGenBeamGasNew)
50 Float_t EtaToTheta(Float_t arg) { return (180./TMath::Pi())*2.*atan(exp(-arg)); }
52 AliGenBeamGasNew::AliGenBeamGasNew() :
59 // Default constructor
62 AliGenBeamGasNew::~AliGenBeamGasNew()
68 void AliGenBeamGasNew::SetTimeWindow(Float_t twindow) { fTwindow = twindow; }
70 bool AliGenBeamGasNew::SetRate(Float_t rate) {
78 void AliGenBeamGasNew::SetZWindow(Float_t zwindow) { fZwindow = zwindow; }
80 void AliGenBeamGasNew::Init()
82 // Initialisation of the class
83 // if no generators were added before calling Init()
84 // AliGenHijing is added configured for pO
86 fVertexSmear = kPerEvent;
87 fVertexSource = kInternal;
90 // Adding default underlying event in case none was specified
91 // p-O-collision at 7 TeV (fixed target)
93 AliGenHijing *gen = new AliGenHijing(-1);
94 gen->SetReferenceFrame("LAB");
95 gen->SetEnergyCMS(7000);
96 gen->SetProjectile("P",1,1);
97 gen->SetTarget("A",16,8);
98 gen->SetPhiRange(0,360);
99 Float_t thmin = EtaToTheta(8);
100 Float_t thmax = EtaToTheta(-8);
101 gen->SetThetaRange(thmin, thmax);
102 gen->SetOrigin(0,0,0);
103 gen->SetSigma(0,0,0);
104 gen->KeepFullEvent();
105 gen->SetShadowing(1);
106 gen->SetDecaysOff(1);
107 gen->SetSpectators(1);
108 gen->SetSelectAll(1);
109 gen->SetRandomPz(kFALSE);
110 gen->SetPileUpTimeWindow(0.);
111 AddGenerator(gen,"Hijing pO",1);
114 TIter next(fEntries);
115 AliGenCocktailEntry *entry;
117 // Loop over generators and initialize
118 while((entry = (AliGenCocktailEntry*)next())) {
119 if (fStack) entry->Generator()->SetStack(fStack);
120 entry->Generator()->Init();
126 fProb.Set(fNGenerators);
129 while((entry = (AliGenCocktailEntry*)next())) {
130 sum += entry->Rate();
136 while((entry = (AliGenCocktailEntry*)next())) {
137 psum += entry->Rate() / sum;
144 void AliGenBeamGasNew::VertexInternal()
146 // calculation of the interaction vertex for the beam gas event
147 // both spatial and time coordinate are adjusted.
153 gRandom->RndmArray(2,random);
154 fVertex[0] = fVertex[1] = 0;
155 fVertex[2] = random[0] * 2 * fZwindow - fZwindow;
156 nbunch = fTwindow/25e-9;
157 bunch = floor(2*nbunch * random[1] - nbunch);
158 fItime = fVertex[2] / 100 / 3e8 + bunch * 25e-9;
159 AliInfo(Form("fItime: %13.3e \n", fItime));
162 void AliGenBeamGasNew::Generate()
165 // Generate the collisions for one event
167 Int_t numbg = gRandom->Poisson(fRate*fZwindow/100*2*fTwindow);
168 if (numbg == 0) return;
170 TIter next(fEntries);
171 AliGenCocktailEntry *entry = 0;
172 AliGenCocktailEntry *preventry = 0;
173 AliGenerator* gen = 0;
179 if (fHeader) delete fHeader;
180 fHeader = new AliGenCocktailEventHeader("Beamgas Header");
182 TObjArray *partArray = gAlice->GetMCApp()->Particles();
183 AliStack *stack = gAlice->GetRunLoader()->Stack();
185 for (Int_t l = 0; l < numbg; l++) {
187 sign = (gRandom->Rndm() < 0.5)? -1. : 1.;
189 for (Int_t j=0; j < 3; j++) eventVertex[j] = fVertex[j];
193 while((entry = (AliGenCocktailEntry*)next())) {
194 if (fUsePerEventRate && (gRandom->Rndm() > entry->Rate())) continue;
198 entry->SetFirst(lastpart);
200 entry->SetFirst((partArray->GetEntriesFast())+1);
203 // Handle case in which current generator needs collision geometry from previous generator
205 gen = entry->Generator();
206 if (gen->NeedsCollisionGeometry())
208 if (preventry && preventry->Generator()->ProvidesCollisionGeometry())
210 gen->SetCollisionGeometry(preventry->Generator()->CollisionGeometry());
212 Fatal("Generate()", "No Collision Geometry Provided");
215 entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
216 entry->Generator()->Generate();
217 entry->SetLast(partArray->GetEntriesFast());
222 // Select a generator randomly
225 Float_t p0 = gRandom->Rndm();
227 for (i = 0; i < fNGenerators; i++) {
228 if (p0 < fProb[i]) break;
231 entry = (AliGenCocktailEntry*) fEntries->At(i);
232 entry->SetFirst(lastpart);
233 gen = entry->Generator();
234 entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
235 entry->Generator()->Generate();
236 entry->SetLast(partArray->GetEntriesFast());
239 for (int k = lastpart; k < stack->GetNprimary(); k++) {
240 stack->Particle(k)->ProductionVertex(v);
242 v[3] = fItime; // ??? +=
243 stack->Particle(k)->SetProductionVertex(v);
244 stack->Particle(k)->Momentum(v);
246 stack->Particle(k)->SetMomentum(v);
249 lastpart = stack->GetNprimary();
253 fHeader->SetPrimaryVertex(eventVertex);
254 fHeader->CalcNProduced();
257 fContainer->AddHeader(fHeader);
259 gAlice->SetGenEventHeader(fHeader);