]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - THijing/AliGenBeamGasNew.cxx
take care of gGeoManager handling
[u/mrichter/AliRoot.git] / THijing / AliGenBeamGasNew.cxx
... / ...
CommitLineData
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/* $Id$ */
17
18
19
20//-------------------------------------------------------------
21// Generate Beam-Gas-Events
22// Default: underlying event: pO @ 7 TeV (fixed target)
23//
24// underlying event can be changed by adding generators
25// in the same way as to AliGenCocktail before calling
26// the Init()
27// Author: Jochen Klein
28//-------------------------------------------------------------
29
30#include <TList.h>
31#include <TObjArray.h>
32#include <TParticle.h>
33
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"
40#include "AliRun.h"
41#include "AliMC.h"
42#include "AliStack.h"
43#include "AliLog.h"
44
45#include "AliHeader.h"
46#include "AliGenEventHeader.h"
47
48ClassImp(AliGenBeamGasNew)
49
50Float_t EtaToTheta(Float_t arg) { return (180./TMath::Pi())*2.*atan(exp(-arg)); }
51
52AliGenBeamGasNew::AliGenBeamGasNew() :
53 AliGenCocktail(),
54 fItime(0),
55 fTwindow(88e-6),
56 fZwindow(2000),
57 fRate(1e3)
58{
59 // Default constructor
60}
61
62AliGenBeamGasNew::~AliGenBeamGasNew()
63{
64}
65
66void AliGenBeamGasNew::SetTimeWindow(Float_t twindow) { fTwindow = twindow; }
67
68bool AliGenBeamGasNew::SetRate(Float_t rate) {
69 if (rate >= 0) {
70 fRate = rate;
71 return true;
72 } else
73 return false;
74}
75
76void AliGenBeamGasNew::SetZWindow(Float_t zwindow) { fZwindow = zwindow; }
77
78void AliGenBeamGasNew::Init()
79{
80 // Initialisation of the class
81 // if no generators were added before calling Init()
82 // AliGenHijing is added configured for pO
83
84 fVertexSmear = kPerEvent;
85 fVertexSource = kInternal;
86 fRandom = kTRUE;
87
88 // Adding default underlying event in case none was specified
89 // p-O-collision at 7 TeV (fixed target)
90 if (!fEntries) {
91 AliGenHijing *gen = new AliGenHijing(-1);
92 gen->SetReferenceFrame("LAB");
93 gen->SetEnergyCMS(7000);
94 gen->SetProjectile("P",1,1);
95 gen->SetTarget("A",16,8);
96 gen->SetPhiRange(0,360);
97 Float_t thmin = EtaToTheta(8);
98 Float_t thmax = EtaToTheta(-8);
99 gen->SetThetaRange(thmin, thmax);
100 gen->SetOrigin(0,0,0);
101 gen->SetSigma(0,0,0);
102 gen->KeepFullEvent();
103 gen->SetShadowing(1);
104 gen->SetDecaysOff(1);
105 gen->SetSpectators(1);
106 gen->SetSelectAll(1);
107 gen->SetRandomPz(kFALSE);
108 gen->SetPileUpTimeWindow(0.);
109 AddGenerator(gen,"Hijing pO",1);
110 }
111
112 TIter next(fEntries);
113 AliGenCocktailEntry *entry;
114
115 // Loop over generators and initialize
116 while((entry = (AliGenCocktailEntry*)next())) {
117 if (fStack) entry->Generator()->SetStack(fStack);
118 entry->Generator()->Init();
119 }
120
121 next.Reset();
122
123 if (fRandom) {
124 fProb.Set(fNGenerators);
125 next.Reset();
126 Float_t sum = 0.;
127 while((entry = (AliGenCocktailEntry*)next())) {
128 sum += entry->Rate();
129 }
130
131 next.Reset();
132 Int_t i = 0;
133 Float_t psum = 0.;
134 while((entry = (AliGenCocktailEntry*)next())) {
135 psum += entry->Rate() / sum;
136 fProb[i++] = psum;
137 }
138 }
139 next.Reset();
140}
141
142void AliGenBeamGasNew::VertexInternal()
143{
144 // calculation of the interaction vertex for the beam gas event
145 // both spatial and time coordinate are adjusted.
146
147 Float_t random[2];
148 Float_t nbunch;
149 Float_t bunch;
150
151 gRandom->RndmArray(2,random);
152 fVertex[0] = fVertex[1] = 0;
153 fVertex[2] = random[0] * 2 * fZwindow - fZwindow;
154 nbunch = fTwindow/25e-9;
155 bunch = floor(2*nbunch * random[1] - nbunch);
156 fItime = fVertex[2] / 100 / 3e8 + bunch * 25e-9;
157 AliInfo(Form("fItime: %13.3e \n", fItime));
158}
159
160void AliGenBeamGasNew::Generate()
161{
162//
163// Generate the collisions for one event
164//
165 Int_t numbg = gRandom->Poisson(fRate*fZwindow/100*2*fTwindow);
166 if (numbg == 0) return;
167
168 TIter next(fEntries);
169 AliGenCocktailEntry *entry = 0;
170 AliGenCocktailEntry *preventry = 0;
171 AliGenerator* gen = 0;
172 TLorentzVector v;
173 TArrayF eventVertex;
174 Int_t lastpart=0;
175 Float_t sign;
176
177 if (fHeader) delete fHeader;
178 fHeader = new AliGenCocktailEventHeader("Beamgas Header");
179
180 const TObjArray *partArray = gAlice->GetMCApp()->Particles();
181 AliStack *stack = AliRunLoader::Instance()->Stack();
182
183 for (Int_t l = 0; l < numbg; l++) {
184 Vertex();
185 sign = (gRandom->Rndm() < 0.5)? -1. : 1.;
186 eventVertex.Set(3);
187 for (Int_t j=0; j < 3; j++) eventVertex[j] = fVertex[j];
188
189 if (!fRandom) {
190 Int_t igen=0;
191 while((entry = (AliGenCocktailEntry*)next())) {
192 if (fUsePerEventRate && (gRandom->Rndm() > entry->Rate())) continue;
193
194 igen++;
195 if (igen ==1) {
196 entry->SetFirst(lastpart);
197 } else {
198 entry->SetFirst((partArray->GetEntriesFast())+1);
199 }
200 //
201 // Handle case in which current generator needs collision geometry from previous generator
202 //
203 gen = entry->Generator();
204 if (gen->NeedsCollisionGeometry())
205 {
206 if (preventry && preventry->Generator()->ProvidesCollisionGeometry())
207 {
208 gen->SetCollisionGeometry(preventry->Generator()->CollisionGeometry());
209 } else {
210 Fatal("Generate()", "No Collision Geometry Provided");
211 }
212 }
213 entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
214 entry->Generator()->Generate();
215 entry->SetLast(partArray->GetEntriesFast());
216 preventry = entry;
217 }
218 } else {
219 //
220 // Select a generator randomly
221 //
222 Int_t i = 0;
223 Float_t p0 = gRandom->Rndm();
224
225 for (i = 0; i < fNGenerators; i++) {
226 if (p0 < fProb[i]) break;
227 }
228
229 entry = (AliGenCocktailEntry*) fEntries->At(i);
230 entry->SetFirst(lastpart);
231 gen = entry->Generator();
232 entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
233 entry->Generator()->Generate();
234 entry->SetLast(partArray->GetEntriesFast());
235 }
236
237 for (Int_t k = lastpart; k < stack->GetNprimary(); k++) {
238 stack->Particle(k)->ProductionVertex(v);
239 v[2] *= sign;
240 eventVertex[2] *= sign;
241 v[3] = fItime; // ??? +=
242 stack->Particle(k)->SetProductionVertex(v);
243 stack->Particle(k)->Momentum(v);
244 v[2] *= sign;
245 stack->Particle(k)->SetMomentum(v);
246 }
247
248 ((AliGenEventHeader*) fHeader->GetHeaders()->Last())->SetPrimaryVertex(eventVertex);
249
250 lastpart = stack->GetNprimary();
251 next.Reset();
252 }
253
254 fHeader->CalcNProduced();
255
256 if (fContainer) {
257 fContainer->AddHeader(fHeader);
258 } else {
259 gAlice->SetGenEventHeader(fHeader);
260 }
261}