13-nov-2007 GdV Bug fix in IceRoot by completely re-building the Daq device.
[u/mrichter/AliRoot.git] / STRUCT / AliHALLv3.cxx
CommitLineData
257726e6 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// Experimental Hall //
21// This class contains the description of the experimental hall //
22// and the shielding blocks. //
23// Author: Andreas Morsch //
24// andreas.morsch@cern.ch //
25// //
26///////////////////////////////////////////////////////////////////////////////
27
28#include <TVirtualMC.h>
29
30#include "AliConst.h"
31#include "AliHALLv3.h"
32#include "AliMagF.h"
33#include "AliRun.h"
34#include "AliLog.h"
35#include <TGeoVolume.h>
36#include <TGeoManager.h>
37#include <TGeoMatrix.h>
38#include <TGeoCompositeShape.h>
39#include <TGeoBBox.h>
40#include <TGeoTube.h>
41#include <TGeoPgon.h>
42#include <TGeoPcon.h>
43#include <TGeoCone.h>
44#include <TGeoTrd1.h>
45#include <TGeoArb8.h>
46
47ClassImp(AliHALL)
48
49//_____________________________________________________________________________
50AliHALLv3::AliHALLv3()
51{
52 //
53 // Default constructor for the experimental Hall
54 //
55}
56
57//_____________________________________________________________________________
58AliHALLv3::AliHALLv3(const char *name, const char *title)
59 : AliHALL(name,title)
60{
61 //
62 // Standard constructor for the experimental Hall
63 //
64
65}
66
67//_____________________________________________________________________________
68void AliHALLv3::CreateGeometry()
69{
70 //
71 // Create the geometry of the exprimental hall
72 //
73 Float_t r2, dy;
74 Float_t phid, phim, h, r;
75 Float_t w1, dh, am, bm, dl,cm, hm, dr, dx, xl;
76 Float_t hullen;
77 Float_t phi;
78
79 // The top volume
80 //
81 TGeoVolume* top = gGeoManager->GetVolume("ALIC");
82 TGeoVolumeAssembly* asHall = new TGeoVolumeAssembly("HALL");
83
84 // Rotations
85 // rotation by 90 deg in the y-z plane
86 TGeoRotation* rot000 = new TGeoRotation("rot000", 90., 0., 0., 0., 90., 90.);
87 TGeoRotation* rot001 = new TGeoRotation("rot001", 270., 0., 90., 90., 0., 0.);
88
89 // Materials
90 TGeoMedium* kMedCC = gGeoManager->GetMedium("HALL_CC_C2");
91 TGeoMedium* kMedST = gGeoManager->GetMedium("HALL_STST_C2");
ffb3970c 92 TGeoMedium* kMedAir = gGeoManager->GetMedium("HALL_AIR_C2");
ffb3970c 93
257726e6 94 // Floor thickness
95 Float_t dyFloor = 190.;
96 // Floor width
97 Float_t dxFloor = 1400.;
98 // Floor level
99 Float_t yFloor = -801.;
100 // Pit centre
101 Float_t zPit = 2300.;
102 // Pit radius
103 Float_t rPit = 1140.;
104 // Hall end
105 Float_t zHall24 = 1700.;
106 Float_t zHall26 = 1900.;
107 // Overlap between hall and pit radius
108 Float_t oPit = zHall24 - (zPit - rPit);
109 // Length of the L3 floor
110 Float_t dzL3 = 1700.;
111 // Start of hall roof in y
112 Float_t yHall = 500.;
113 // Radius of the hall roof
114 Float_t rHall = 1070.;
115 //
116 Float_t epsBig = 100.;
117 Float_t epsSmall = 1.;
118
119
120
121 //
122 // RB24/26 Tunnel Floor
123 r = 220.;
124 h = 140.;
125 phi = TMath::ACos(h / r);
126 xl = r * TMath::Sin(phi);
127 dr = 1600.;
128 dh = dr * TMath::Cos(phi);
129 dl = dr * TMath::Sin(phi);
130 if (gAlice->GetModule("ZDC") == 0) {
131 // No ZDC
132 hullen = 370.;
133 } else {
134
135 // ZDC is present
136 hullen = 6520.;
137 }
138
139 TGeoVolume* voHUFL = new TGeoVolume("HUFL",
140 new TGeoTrd1(xl +dl, xl, hullen, dh / 2.),
141 kMedCC);
142 r2 = hullen + zHall26;
257726e6 143 asHall->AddNode(voHUFL, 1, new TGeoCombiTrans(70., -100. - dh / 2., -r2, rot000));
ffb3970c 144
257726e6 145 //
146 // RB24/26 wall
ffb3970c 147 phid = phi * kRaddeg;
257726e6 148 TGeoVolume* voHUWA = new TGeoVolume("HUWA",
149 new TGeoTubeSeg(r, r+dr, hullen, phid - 90., 270. - phid),
150 kMedCC);
151 asHall->AddNode(voHUWA, 1, new TGeoTranslation(70., 40., -zHall26 - hullen ));
152 //
ffb3970c 153 // Air inside tunnel
154 TGeoTube* shHUWAT1 = new TGeoTube(0., r, hullen);
155 shHUWAT1->SetName("shHUWAT1");
156 //
157 // Space for ZDC
158 TGeoBBox* shHUWAT2 = new TGeoBBox(70., 110., hullen + 20.);
159 shHUWAT2->SetName("shHUWAT2");
160 TGeoTranslation* tHUWAT2 = new TGeoTranslation("tHUWAT2", -70., -30., 0.);
161 tHUWAT2->RegisterYourself();
162
163 TGeoBBox* shHUWAT3 = new TGeoBBox(270., 110., hullen + 20.);
164 shHUWAT3->SetName("shHUWAT3");
165 TGeoTranslation* tHUWAT3 = new TGeoTranslation("tHUWAT3", 0., -110. - 140., 0.);
166 tHUWAT3->RegisterYourself();
167
168 TGeoCompositeShape* shHUWAT = new TGeoCompositeShape("HUWAT", "(shHUWAT1-shHUWAT2:tHUWAT2)-shHUWAT3:tHUWAT3");
169 TGeoVolume* voHUWAT = new TGeoVolume("HUWAT", shHUWAT, kMedAir);
170 asHall->AddNode(voHUWAT, 1, new TGeoTranslation(70., 40., -zHall26 - hullen));
171
172 //
257726e6 173 // Hall floor
174 // RB26 side
175 phid = 16.197;
176 Float_t dzFloor26 = zHall26 - dzL3/2.;
177 TGeoBBox* shHHF1 = new TGeoBBox(dxFloor/2. + 470., dyFloor/2., dzFloor26/2.);
178 shHHF1->SetName("shHHF1");
179 TGeoVolume* voHHF1 = new TGeoVolume("HHF1", shHHF1, kMedCC);
180 asHall->AddNode(voHHF1, 2, new TGeoTranslation(0., yFloor, -(dzL3/2. + dzFloor26/2.)));
181 // RB24 side
182 Float_t dzFloor24 = zHall24 - dzL3/2.;
183 TGeoBBox* shHHF41 = new TGeoBBox(dxFloor/2. + 470., dyFloor/2., dzFloor24/2.);
184 shHHF41->SetName("shHHF41");
185 TGeoTube* shHHF42 = new TGeoTube(0., rPit + epsBig, dyFloor/2.);
186 shHHF42->SetName("shHHF42");
187 TGeoCombiTrans* trHHF42 = new TGeoCombiTrans("trHHF42", 0., 0., dzFloor24/2. + rPit - oPit, rot000);
188 trHHF42->RegisterYourself();
189
190 TGeoCompositeShape* shHHF4 = new TGeoCompositeShape("HHF4", "shHHF41+shHHF42:trHHF42");
191 TGeoVolume* voHHF4 = new TGeoVolume("HHF4", shHHF4, kMedCC);
192 asHall->AddNode(voHHF4, 1, new TGeoTranslation(0., yFloor, dzL3/2. + dzFloor24/2.));
193
194
195 //
196 // Hall side walls
197 Float_t trH1 = (1273.78 - dyFloor)/ 2.;
198 Float_t trBL1 = 207.3;
199 Float_t trTL1 = 50.;
200 Float_t trALP1 = TMath::ATan((trBL1 - trTL1) / 2. / trH1) * kRaddeg;
201 dx = 1.5 * trBL1 - 0.5 * trTL1 + dxFloor/2. + dyFloor * TMath::Tan(phid * kDegrad);
202 TGeoVolume* voHHW11 = new TGeoVolume("HHW11",
203 new TGeoTrap(dzFloor26/2., 0., 0.,
204 trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1),
205 kMedCC);
206 TGeoVolume* voHHW12 = new TGeoVolume("HHW12",
207 new TGeoTrap(dzFloor24/2., 0., 0.,
208 trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1),
209 kMedCC);
210
211 dy = yFloor + dyFloor/2. + trH1;
212
213 asHall->AddNode(voHHW12, 1, new TGeoTranslation( dx, dy, (dzL3/2. + dzFloor24/2.)));
214 asHall->AddNode(voHHW12, 2, new TGeoCombiTrans (-dx, dy, (dzL3/2. + dzFloor24/2.), rot001));
215 asHall->AddNode(voHHW11, 3, new TGeoTranslation( dx, dy, -(dzL3/2. + dzFloor26/2.)));
216 asHall->AddNode(voHHW11, 4, new TGeoCombiTrans (-dx, dy, -(dzL3/2. + dzFloor26/2.), rot001));
217
218 Float_t boDY = (yHall - (yFloor + dyFloor/2.) - 2. * trH1)/ 2.;
219 Float_t dzHall = zHall26 + zHall24;
220
221 TGeoVolume* voHBW1 = new TGeoVolume("HBW1", new TGeoBBox(50., boDY, dzHall / 2.), kMedCC);
222
223 asHall->AddNode(voHBW1, 1, new TGeoTranslation( 1120., yHall - boDY, (zHall24-zHall26)/2.));
224 asHall->AddNode(voHBW1, 2, new TGeoTranslation(-1120., yHall - boDY, (zHall24-zHall26)/2.));
225
226 //
227 // Slanted wall close to L3 magnet
ffb3970c 228 //
257726e6 229 phim = 45.;
230 hm = 790.;
231 am = hm * TMath::Tan(phim / 2. * kDegrad);
232 bm = (hm + 76.) / hm * am;
233 cm = bm * 2. / TMath::Sqrt(2.);
234 trH1 = (1273.78 - cm) / 2.;
235 trBL1 = 235. - cm * TMath::Tan(phid * kDegrad) / 2.;
236 trTL1 = 50.;
237 trALP1 = TMath::ATan((trBL1 - trTL1) / 2. / trH1) * kRaddeg;
238
239 w1 = trBL1;
240 dx = cm * TMath::Tan(phid * kDegrad) + dxFloor/2. + trBL1 * 1.5 - trTL1 * .5;
241
242 TGeoVolume* voHHW2 = new TGeoVolume("HHW2",
243 new TGeoTrap(dzL3/2., 0., 0.,
244 trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1),
245 kMedCC);
246
247 r2 = cm + yFloor - dyFloor/2. + trH1;
248
249 asHall->AddNode(voHHW2, 1, new TGeoTranslation(dx, r2, 0.));
250 asHall->AddNode(voHHW2, 2, new TGeoCombiTrans(-dx, r2, 0., rot001));
251
252 trH1 = cm / 2.;
253 trBL1 = w1 + cm / 2.;
254 trTL1 = w1;
255 trALP1 = TMath::ATan(.5) * kRaddeg;
256 dx = 1170. - trBL1 * .5 - trTL1 * .5;
257
258 TGeoVolume* voHHW3 = new TGeoVolume("HHW3",
259 new TGeoTrap(dzL3/2., 0., 0.,
260 trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1),
261 kMedCC);
262
263 r2 = trH1 - 896.;
264 asHall->AddNode(voHHW3, 1, new TGeoTranslation( dx, r2, 0.));
265 asHall->AddNode(voHHW3, 2, new TGeoCombiTrans (-dx, r2, 0., rot001));
266 //
267 // Floor L3
268 Float_t dyFloorL3 = 76.;
269 Float_t dx1FloorL3 = rHall + epsBig - 2. * trBL1;
270 Float_t dx2FloorL3 = dx1FloorL3 + TMath::Tan(phim * kDegrad) * dyFloorL3;
271
272
273 TGeoVolume* voHHF2 = new TGeoVolume("HHF2",
274 new TGeoTrd1(dx1FloorL3, dx2FloorL3, dzL3/2., dyFloorL3/2.),
275 kMedCC);
276
277 asHall->AddNode(voHHF2, 1, new TGeoCombiTrans(0., yFloor - dyFloor / 2. + dyFloorL3 / 2.,0., rot000));
278 //
279 // Tunnel roof and pit
280 // Roof
281 TGeoTubeSeg* shHHC11 = new TGeoTubeSeg(rHall, rHall + 100., dzHall / 2., 0., 180.);
282 shHHC11->SetName("shHHC11");
283 // Pit
284 TGeoTube* shHHC12 = new TGeoTube(rPit, rPit + 100., 1000.);
285 shHHC12->SetName("shHHC12");
286 // Pit inside
287 TGeoTube* shHHC13 = new TGeoTube( 0, rPit - epsSmall, 1000.);
288 shHHC13->SetName("shHHC13");
289 // Roof inside
290 TGeoTubeSeg* shHHC14 = new TGeoTubeSeg(0., rHall, dzHall / 2. + epsBig, 0., 180.);
291 shHHC14->SetName("shHHC14");
292
293 TGeoCombiTrans* trHHC = new TGeoCombiTrans("trHHC", 0., 1000., dzHall/2. + rPit - oPit, rot000);
294 trHHC->RegisterYourself();
295 TGeoCompositeShape* shHHC1 = new TGeoCompositeShape("HHC1", "shHHC11+shHHC12:trHHC-(shHHC14+shHHC13:trHHC)");
296 TGeoVolume* voHHC1 = new TGeoVolume("HHC1", shHHC1, kMedCC);
297
298 asHall->AddNode(voHHC1, 1, new TGeoTranslation(0., yHall, -(zHall26-zHall24)/2.));
299
300
301 //
302 // Pit wall ground level
303 TGeoTube* shHHCPW1 = new TGeoTube(rPit, rPit + 100., 1206./2.);
304 shHHCPW1->SetName("shHHCPW1");
305 TGeoCombiTrans* trHHCPW1 = new TGeoCombiTrans("trHHCPW1", 0., 0., 0., rot000);
306 trHHCPW1->RegisterYourself();
307
308 TGeoBBox* shHHCPW2 = new TGeoBBox(rPit + 100., 1206./ 2. + 20., rPit + 100.);
309 shHHCPW2->SetName("shHHCPW2");
310
311
312 TGeoTranslation* trHHCPW2 = new TGeoTranslation("trHHCPW2", 0., 0., -(rPit + 100.) - oPit);
313 trHHCPW2->RegisterYourself();
314
315 TGeoCompositeShape* shHHCPW = new TGeoCompositeShape("HHCPW", "shHHCPW1:trHHCPW1-shHHCPW2:trHHCPW2");
316 TGeoVolume* voHHCPW = new TGeoVolume("HHCPW", shHHCPW, kMedCC);
317 dy = yFloor + 1206. / 2. + dyFloor/2.;
318 asHall->AddNode(voHHCPW, 1, new TGeoTranslation(0., dy, 2300.));
319 //
320 // Foundations of the Muon Spectrometer
321 // Drawing ALIP2A_0110
322 //
323 TGeoVolumeAssembly* asFMS = new TGeoVolumeAssembly("asFMS");
324 Float_t zFil = -1465.86 - 60.;
325 // Muon Filter Foundation
326 // Pillars
327 dy = 263.54/2.;
328 Float_t ys = yFloor + dyFloor / 2.;
329 TGeoVolume* voFmsMfPil = new TGeoVolume("FmsMfPil", new TGeoBBox( 50., dy, 165.), kMedCC);
330 ys += dy;
331 asFMS->AddNode(voFmsMfPil, 1, new TGeoTranslation(-330. + 50., ys, zFil + 165. - 90.));
332 asFMS->AddNode(voFmsMfPil, 2, new TGeoTranslation( 330. - 50., ys, zFil + 165 - 90.));
333 //
334 // Transverse bars
335 ys += dy;
b8bb2f2a 336 dy = 91.32/2.;
257726e6 337 ys += dy;
338 TGeoVolume* voFmsMfTb1 = new TGeoVolume("FmsMfTb1", new TGeoBBox(330., dy, 90.), kMedCC);
339 asFMS->AddNode(voFmsMfTb1, 1, new TGeoTranslation(0., ys, zFil));
340 ys += dy;
341 dy = 41.14/2.;
342 ys += dy;
343 TGeoVolume* voFmsMfTb2 = new TGeoVolume("FmsMfTb2", new TGeoBBox(330., dy, 60.), kMedCC);
344 asFMS->AddNode(voFmsMfTb2, 1, new TGeoTranslation(0., ys, zFil));
345 //
346 // Dipole foundation
347 ys = yFloor + dyFloor / 2.;
348 dy = 263.54/2;
349 ys += dy;
350 TGeoVolume* voFmsDf1 = new TGeoVolume("FmsDf1", new TGeoBBox(370., dy, 448.0 / 2.), kMedCC);
351 asFMS->AddNode(voFmsDf1, 1, new TGeoTranslation(0., ys, zFil + 240. + 224.));
352 TGeoVolume* voFmsDf2 = new TGeoVolume("FmsDf2", new TGeoBBox(370., (263.54 + 110.)/2., 112.0 / 2.), kMedCC);
353 asFMS->AddNode(voFmsDf2, 1, new TGeoTranslation(0., ys - 110./2., zFil + 688. + 56.));
354
355 //
356 // Shielding in front of L3 magnet in PX24 and UX25
357 // Drawing ALIP2I__0016
358 //
359
360 TGeoVolumeAssembly* asShRb24 = new TGeoVolumeAssembly("ShRb24");
361 //
362 // Side walls
363 // start 7450 from IP
364 TGeoVolume* voShRb24Sw = new TGeoVolume("ShRb24Sw", new TGeoBBox(80., 420., 520.), kMedCC);
365 asShRb24->AddNode(voShRb24Sw, 1, new TGeoTranslation(+315, -420. + 140., 0.));
366 asShRb24->AddNode(voShRb24Sw, 2, new TGeoTranslation(-315, -420. + 140., 0.));
367 //
368 // Roof
369 TGeoVolume* voShRb24Ro = new TGeoVolume("ShRb24Ro", new TGeoBBox(395., 80., 520.), kMedCC);
370 asShRb24->AddNode(voShRb24Ro, 1, new TGeoTranslation(0., +80. + 140., 0.));
371 //
372 // Plug
373 TGeoBBox* shShRb24Pl1 = new TGeoBBox(235., 140., 40.);
374 shShRb24Pl1->SetName("ShRb24Pl1");
375 //
376 // Opening for beam pipe
377 TGeoBBox* shShRb24Pl2 = new TGeoBBox(15., 20., 60.);
378 shShRb24Pl2->SetName("ShRb24Pl2");
379 //
380 // Opening for tubes
381 TGeoBBox* shShRb24Pl3 = new TGeoBBox(20., 60., 60.);
382 shShRb24Pl3->SetName("ShRb24Pl3");
383
384 TGeoTranslation* trPl3 = new TGeoTranslation("trPl3", +235. -90., 80., 0.);
385 trPl3->RegisterYourself();
386 TGeoCompositeShape* shRb24Pl = new TGeoCompositeShape("Rb24Pl", "ShRb24Pl1-(ShRb24Pl2+ShRb24Pl3:trPl3)");
387 TGeoVolume* voRb24Pl = new TGeoVolume("Rb24Pl", shRb24Pl, kMedCC);
388 asShRb24->AddNode(voRb24Pl, 1, new TGeoTranslation(0., 0., 520. - 40.));
389
390 //
391 // Concrete platform and shielding PX24
392 // Drawing LHCJUX 250014
393 //
394 TGeoVolumeAssembly* asShPx24 = new TGeoVolumeAssembly("ShPx24");
395 // Platform
396 TGeoVolume* voShPx24Pl = new TGeoVolume("ShPx24Pl", new TGeoBBox(1613.5/2., 120./2., 1205./2.), kMedCC);
397 asShPx24->AddNode(voShPx24Pl, 1, new TGeoTranslation(55., -140. - 60., 0.));
398 // Pillars
399 TGeoVolume* voShPx24Pi = new TGeoVolume("ShPx24Pi", new TGeoBBox(160./2., 440./2., 40/2.), kMedCC);
400 asShPx24->AddNode(voShPx24Pi, 1, new TGeoTranslation(-180. - 80., -220. -260., 1205./2. - 20.));
401 asShPx24->AddNode(voShPx24Pi, 2, new TGeoTranslation(+290. + 80., -220. -260., 1205./2. - 20.));
402 asShPx24->AddNode(voShPx24Pi, 3, new TGeoTranslation(-180. - 80., -220. -260., -1205./2. + 20. + 120.));
403 asShPx24->AddNode(voShPx24Pi, 4, new TGeoTranslation(+290. + 80., -220. -260., -1205./2. + 20. + 120.));
404 asShPx24->AddNode(voShPx24Pi, 5, new TGeoTranslation(-180. - 80., -220. -260., -1205./2. - 20. + 480.));
405 asShPx24->AddNode(voShPx24Pi, 6, new TGeoTranslation(+290. + 80., -220. -260., -1205./2. - 20. + 480.));
406 asShPx24->AddNode(voShPx24Pi, 7, new TGeoTranslation(-180. - 80., -220. -260., -1205./2. - 20. + 800.));
407 asShPx24->AddNode(voShPx24Pi, 8, new TGeoTranslation(+290. + 80., -220. -260., -1205./2. - 20. + 800.));
408 // Side Walls
409 TGeoVolume* voShPx24Sw = new TGeoVolume("ShPx24Sw", new TGeoBBox(160./2., 280./2., 1205./2.), kMedCC);
410 asShPx24->AddNode(voShPx24Sw, 1, new TGeoTranslation(-180, 0., 0.));
411 asShPx24->AddNode(voShPx24Sw, 2, new TGeoTranslation(+290, 0., 0.));
412 // Roof
413 TGeoVolume* voShPx24Ro = new TGeoVolume("ShPx24Ro", new TGeoBBox(630./2., 160./2., 1205./2.), kMedCC);
414 asShPx24->AddNode(voShPx24Ro, 1, new TGeoTranslation(55., 80.+ 140., 0.));
415 asHall->AddNode(asShRb24, 1, new TGeoTranslation(0., 0., +745. + 520.));
416 asHall->AddNode(asShPx24, 1, new TGeoTranslation(0., 0., +745. + 1040. + 1205./ 2.));
417 // Stainless Steel Plug 80 cm thick
418 TGeoBBox* shShPx24Pl1 = new TGeoBBox(155., 140., 40.);
419 shShPx24Pl1->SetName("ShPx24Pl1");
420 // Opening for beam pipe
421 TGeoBBox* shShPx24Pl2 = new TGeoBBox(15., 20., 60.);
422 shShPx24Pl2->SetName("ShPx24Pl2");
423 TGeoCompositeShape* shPx24Pl = new TGeoCompositeShape("Px24Pl", "ShPx24Pl1-ShPx24Pl2");
424 TGeoVolume* voPx24Pl = new TGeoVolume("Px24Pl", shPx24Pl, kMedST);
425 asShPx24->AddNode(voPx24Pl, 1, new TGeoTranslation(55., 0., -1205./2. + 40.));
426 asHall->AddNode(asFMS, 1, new TGeoTranslation(0., 0., 0.));
427
428 //
429 top->AddNode(asHall, 1, gGeoIdentity);
430
431}