Optional scoring for background studies in HALL.
[u/mrichter/AliRoot.git] / STRUCT / AliHALLv3.cxx
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 "AliMC.h"
36 #include "AliTrackReference.h"
37 #include <TGeoVolume.h>
38 #include <TGeoManager.h>
39 #include <TGeoMatrix.h>
40 #include <TGeoCompositeShape.h>
41 #include <TGeoBBox.h>
42 #include <TGeoTube.h>
43 #include <TGeoPgon.h>
44 #include <TGeoPcon.h>
45 #include <TGeoCone.h>
46 #include <TGeoTrd1.h>
47 #include <TGeoArb8.h>
48
49 ClassImp(AliHALL)
50  
51 //_____________________________________________________________________________
52 AliHALLv3::AliHALLv3() : fNewShield24(0), fRefVolumeId(-1), fScoring(0)
53 {
54   //
55   // Default constructor for the experimental Hall
56   //
57 }
58  
59 //_____________________________________________________________________________
60 AliHALLv3::AliHALLv3(const char *name, const char *title)
61   : AliHALL(name,title), fNewShield24(0), fRefVolumeId(-1), fScoring(0)
62 {
63   //
64   // Standard constructor for the experimental Hall
65   //
66
67 }
68  
69 //_____________________________________________________________________________
70 void AliHALLv3::CreateGeometry()
71 {
72   //
73   // Create the geometry of the exprimental hall
74   //
75   Float_t r2, dy;
76   Float_t phid, phim, h, r;
77   Float_t w1, dh, am, bm, dl,cm, hm, dr, dx, xl;
78   Float_t hullen;
79   Float_t phi;
80
81   // The top volume
82   //
83   TGeoVolume* top = gGeoManager->GetVolume("ALIC");
84   TGeoVolumeAssembly* asHall = new TGeoVolumeAssembly("HALL");
85   
86   // Rotations
87   // rotation by 90 deg in the y-z plane
88   TGeoRotation* rot000 = new TGeoRotation("rot000",  90., 0.,180.,  0.,    90., 90.);  
89   TGeoRotation* rot001 = new TGeoRotation("rot001", 270., 0., 90., 90.,   180.,  0.);  
90
91   // Materials
92   TGeoMedium* kMedCC     = gGeoManager->GetMedium("HALL_CC_C2");
93   TGeoMedium* kMedST     = gGeoManager->GetMedium("HALL_STST_C2");
94   TGeoMedium* kMedAir    = gGeoManager->GetMedium("HALL_AIR_C2");
95   
96   // Floor thickness 
97   Float_t dyFloor  =  190.;
98   // Floor width
99   Float_t dxFloor  = 1400.;
100   // Floor level 
101   Float_t  yFloor  = -801.;
102   // Pit centre
103   Float_t  zPit    = 2300.;
104   // Pit radius
105   Float_t  rPit    = 1140.;
106   // Hall end 
107   Float_t  zHall24 = 1700.;
108   Float_t  zHall26 = 1900.;
109     // Overlap between hall and pit radius
110   Float_t oPit = zHall24 - (zPit - rPit);
111   // Length of the L3 floor
112   Float_t dzL3 = 1700.;
113   // Start of hall roof in y
114   Float_t yHall = 500.;
115   // Radius of the hall roof
116   Float_t rHall = 1070.;
117   //
118   Float_t epsBig   = 100.;
119   Float_t epsSmall =   1.;
120   
121   
122
123   //
124   // RB24/26 Tunnel Floor 
125   r   = 220.;
126   h   = 140.;
127   phi = TMath::ACos(h / r);
128   xl  = r * TMath::Sin(phi);
129   dr  = 1600.;
130   dh  = dr * TMath::Cos(phi);
131   dl  = dr * TMath::Sin(phi);
132   if (gAlice->GetModule("ZDC") == 0) {
133     //     No ZDC 
134     hullen = 370.;
135   } else {
136     
137     //     ZDC is present 
138     hullen = 6520.;
139   }
140
141   TGeoVolume* voHUFL = new TGeoVolume("HUFL",
142                                       new TGeoTrd1(xl +dl, xl, hullen, dh / 2.),
143                                       kMedCC);
144   r2 = hullen + zHall26;
145   asHall->AddNode(voHUFL, 1, new TGeoCombiTrans(70., -100. - dh / 2., -r2 - 0.755, rot000));
146
147   //
148   // RB24/26 wall 
149   phid     = phi * kRaddeg;
150   TGeoVolume* voHUWA = new TGeoVolume("HUWA",
151                                       new TGeoTubeSeg(r, r+dr, hullen, phid - 90. + 0.002, 270. - phid - 0.002),
152                                       kMedCC);
153   asHall->AddNode(voHUWA, 1, new TGeoTranslation(70., 40., -zHall26 - hullen + 0.002 ));
154   //
155   // Air inside tunnel
156   TGeoTube* shHUWAT1 = new TGeoTube(0., r, hullen);
157   shHUWAT1->SetName("shHUWAT1");
158   //
159   // Space for ZDC
160   TGeoBBox*    shHUWAT2 = new TGeoBBox(70., 110., hullen + 20.);
161   shHUWAT2->SetName("shHUWAT2");
162   TGeoTranslation*   tHUWAT2 = new TGeoTranslation("tHUWAT2", -70., -30., 0.);
163   tHUWAT2->RegisterYourself();
164
165   TGeoBBox*    shHUWAT3 = new TGeoBBox(270., 110., hullen + 20.);
166   shHUWAT3->SetName("shHUWAT3");
167   TGeoTranslation*   tHUWAT3 = new TGeoTranslation("tHUWAT3", 0., -110. - 140., 0.);
168   tHUWAT3->RegisterYourself();
169   
170   TGeoCompositeShape*  shHUWAT = new TGeoCompositeShape("HUWAT", "(shHUWAT1-shHUWAT2:tHUWAT2)-shHUWAT3:tHUWAT3");
171   TGeoVolume* voHUWAT = new TGeoVolume("HUWAT", shHUWAT, kMedAir);
172   asHall->AddNode(voHUWAT, 1, new TGeoTranslation(70., 40., -zHall26 - hullen - 0.755));
173   
174   //
175   //  Hall floor 
176   //  RB26 side
177   phid      = 16.197;
178   Float_t dzFloor26 = zHall26 - dzL3/2.;
179   TGeoBBox* shHHF1 = new TGeoBBox(dxFloor/2. + 470., dyFloor/2., dzFloor26/2. - 0.002);
180   shHHF1->SetName("shHHF1");
181   TGeoVolume* voHHF1 = new TGeoVolume("HHF1", shHHF1, kMedCC);
182   asHall->AddNode(voHHF1, 2, new TGeoTranslation(0., yFloor, -(dzL3/2. + dzFloor26/2.)));
183   // RB24 side
184   Float_t dzFloor24 = zHall24 - dzL3/2.;
185   TGeoBBox* shHHF41 = new TGeoBBox(dxFloor/2. + 470., dyFloor/2., dzFloor24/2.);
186   shHHF41->SetName("shHHF41");
187   TGeoTube* shHHF42 = new TGeoTube(0., rPit + epsBig, dyFloor/2.);
188   shHHF42->SetName("shHHF42");
189   TGeoCombiTrans* trHHF42 = new TGeoCombiTrans("trHHF42", 0., 0., dzFloor24/2. + rPit - oPit, rot000);
190   trHHF42->RegisterYourself();
191   
192   TGeoCompositeShape*  shHHF4 = new TGeoCompositeShape("HHF4", "shHHF41+shHHF42:trHHF42");
193   TGeoVolume* voHHF4 = new TGeoVolume("HHF4", shHHF4, kMedCC);
194   asHall->AddNode(voHHF4, 1, new TGeoTranslation(0., yFloor,  dzL3/2. + dzFloor24/2.));
195
196
197   //
198   //  Hall side walls 
199   Float_t trH1   = (1273.78 - dyFloor)/ 2.;
200   Float_t trBL1  = 207.3;
201   Float_t trTL1  =  50.;
202   Float_t trALP1 = TMath::ATan((trBL1 - trTL1) / 2. / trH1) * kRaddeg;
203   dx = 1.5 * trBL1 - 0.5 * trTL1 + dxFloor/2. + dyFloor * TMath::Tan(phid * kDegrad);
204   TGeoVolume* voHHW11 = new TGeoVolume("HHW11",
205                                        new TGeoTrap(dzFloor26/2. - 0.002, 0., 0., 
206                                                     trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1),
207                                        kMedCC);
208   TGeoVolume* voHHW12 = new TGeoVolume("HHW12",
209                                        new TGeoTrap(dzFloor24/2., 0., 0., 
210                                                     trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1),
211                                        kMedCC);
212  
213   dy = yFloor + dyFloor/2. + trH1;
214   
215   asHall->AddNode(voHHW12, 1, new TGeoTranslation( dx, dy,  (dzL3/2. + dzFloor24/2.)));
216   asHall->AddNode(voHHW12, 2, new TGeoCombiTrans (-dx, dy,  (dzL3/2. + dzFloor24/2.), rot001));
217   asHall->AddNode(voHHW11, 1, new TGeoTranslation( dx, dy, -(dzL3/2. + dzFloor26/2.)));
218   asHall->AddNode(voHHW11, 2, new TGeoCombiTrans (-dx, dy, -(dzL3/2. + dzFloor26/2.), rot001));
219
220   Float_t boDY =  (yHall - (yFloor + dyFloor/2.) - 2. * trH1)/ 2.;
221   Float_t dzHall = zHall26 + zHall24;
222
223   TGeoVolume* voHBW1 = new TGeoVolume("HBW1", new TGeoBBox(50., boDY, dzHall / 2. - 0.05), kMedCC);
224
225   asHall->AddNode(voHBW1, 1,  new TGeoTranslation( 1120., yHall - boDY, (zHall24-zHall26)/2.));
226   asHall->AddNode(voHBW1, 2,  new TGeoTranslation(-1120., yHall - boDY, (zHall24-zHall26)/2.));
227
228   //
229   // Slanted wall close to L3 magnet 
230   //
231   phim =  45.;
232   hm   = 790.;
233   am   = hm * TMath::Tan(phim / 2. * kDegrad);
234   bm   = (hm + 76.) / hm * am;
235   cm   = bm * 2. / TMath::Sqrt(2.);
236   trH1   =  (1273.78 - cm) / 2. - 0.002;
237   trBL1  =  235. - cm * TMath::Tan(phid * kDegrad) / 2.;
238   trTL1  =   50.;
239   trALP1 = TMath::ATan((trBL1 - trTL1) / 2. / trH1) * kRaddeg;
240
241   w1 = trBL1;
242   dx = cm * TMath::Tan(phid * kDegrad) + dxFloor/2. + trBL1 * 1.5 - trTL1 * .5;
243
244   TGeoVolume* voHHW2 = new TGeoVolume("HHW2",
245                                       new TGeoTrap(dzL3/2. - 0.002, 0., 0., 
246                                                    trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1),
247                                       kMedCC);
248
249   r2 = cm + yFloor - dyFloor/2. + trH1;
250
251   asHall->AddNode(voHHW2, 1, new TGeoTranslation(dx, r2, 0.));
252   asHall->AddNode(voHHW2, 2, new TGeoCombiTrans(-dx, r2, 0., rot001));
253
254   trH1   = cm / 2.;
255   trBL1  = w1 + cm / 2.;
256   trTL1  = w1;
257   trALP1 = TMath::ATan(.5) * kRaddeg;
258   dx = 1170. - trBL1 * .5 - trTL1 * .5;
259
260   TGeoVolume* voHHW3 = new TGeoVolume("HHW3",
261                                       new TGeoTrap(dzL3/2., 0., 0., 
262                                                    trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1),
263                                       kMedCC);
264
265   r2 = trH1 - 896.;
266   asHall->AddNode(voHHW3, 1, new TGeoTranslation( dx, r2, 0.));
267   asHall->AddNode(voHHW3, 2, new TGeoCombiTrans (-dx, r2, 0., rot001));
268   //
269   // Floor L3
270   Float_t dyFloorL3  = 76.;
271   Float_t dx1FloorL3 = rHall + epsBig - 2. * trBL1;
272   Float_t dx2FloorL3 = dx1FloorL3 + TMath::Tan(phim * kDegrad) * dyFloorL3;
273   
274   
275   TGeoVolume* voHHF2 = new TGeoVolume("HHF2", 
276                                       new TGeoTrd1(dx1FloorL3 - 0.5, dx2FloorL3 - 0.5, dzL3/2., dyFloorL3/2.), 
277                                       kMedCC);
278
279   asHall->AddNode(voHHF2, 1, new TGeoCombiTrans(0., yFloor - dyFloor / 2. + dyFloorL3 / 2. - 0.5,0., rot000));
280   //
281   // Tunnel roof and pit
282   // Roof
283   TGeoTubeSeg* shHHC11 = new TGeoTubeSeg(rHall, rHall + 100., dzHall / 2., 0., 180.);
284   shHHC11->SetName("shHHC11");
285   // Pit 
286   TGeoTube*    shHHC12 = new TGeoTube(rPit, rPit + 100., 1000.);
287   shHHC12->SetName("shHHC12");
288   // Pit inside
289   TGeoTube*    shHHC13 = new TGeoTube(   0, rPit - epsSmall, 1000.);
290   shHHC13->SetName("shHHC13");
291   // Roof inside
292   TGeoTubeSeg* shHHC14 = new TGeoTubeSeg(0., rHall, dzHall / 2. + epsBig, 0., 180.);
293   shHHC14->SetName("shHHC14");
294
295   TGeoCombiTrans* trHHC = new TGeoCombiTrans("trHHC", 0., 1000., dzHall/2. + rPit - oPit, rot000);
296   trHHC->RegisterYourself();
297   TGeoCompositeShape*  shHHC1 = new TGeoCompositeShape("HHC1", "shHHC11+shHHC12:trHHC-(shHHC14+shHHC13:trHHC)");
298   TGeoVolume* voHHC1 = new TGeoVolume("HHC1", shHHC1, kMedCC);
299
300   asHall->AddNode(voHHC1, 1, new TGeoTranslation(0., yHall, -(zHall26-zHall24)/2.));
301
302
303   //
304   // Pit wall ground level
305   dy = yFloor + 1206. / 2. + dyFloor/2.;
306   TGeoTube* shHHCPW1 = new TGeoTube(rPit, rPit + 100., 1206./2.);
307   shHHCPW1->SetName("shHHCPW1");
308   TGeoCombiTrans* trHHCPW1 = new TGeoCombiTrans("trHHCPW1", 0., 0., 0., rot000);
309   trHHCPW1->RegisterYourself();
310
311   TGeoBBox* shHHCPW2 = new TGeoBBox(rPit + 100., 1206./ 2. + 20., rPit + 100.);
312   shHHCPW2->SetName("shHHCPW2");
313   
314   TGeoTube* shHHCPW3 = new TGeoTube(0., 60., 60.);
315   shHHCPW3->SetName("shHHCPW3");
316
317   
318   TGeoTranslation* trHHCPW2 = new TGeoTranslation("trHHCPW2", 0., 0., -(rPit + 100.) - oPit);
319   trHHCPW2->RegisterYourself();
320
321   TGeoTranslation* trHHCPW3 = new TGeoTranslation("trHHCPW3", 0., -dy, rPit + 50.);
322   trHHCPW3->RegisterYourself();
323
324   TGeoCompositeShape*  shHHCPW 
325       = new TGeoCompositeShape("HHCPW", "shHHCPW1:trHHCPW1-(shHHCPW2:trHHCPW2+shHHCPW3:trHHCPW3)");
326   TGeoVolume* voHHCPW = new TGeoVolume("HHCPW", shHHCPW, kMedCC);
327
328   asHall->AddNode(voHHCPW, 1, new TGeoTranslation(0., dy, 2300.));
329   // 
330   // Foundations of the Muon Spectrometer
331   // Drawing ALIP2A_0110
332   //
333   TGeoVolumeAssembly* asFMS = new TGeoVolumeAssembly("asFMS");
334   Float_t zFil = -1465.86 - 60.;
335   // Muon Filter Foundation
336   // Pillars
337   dy = 263.54/2.;
338   Float_t ys = yFloor + dyFloor / 2.;
339   TGeoVolume* voFmsMfPil = new TGeoVolume("FmsMfPil", new TGeoBBox( 50., dy, 165.), kMedCC);
340   ys += dy;
341   asFMS->AddNode(voFmsMfPil, 1, new TGeoTranslation(-330. + 50., ys, zFil + 165. - 90.));
342   asFMS->AddNode(voFmsMfPil, 2, new TGeoTranslation( 330. - 50., ys, zFil + 165  - 90.));
343   //
344   // Transverse bars
345   ys += dy;
346   dy = 91.32/2.;
347   ys += dy;
348   TGeoVolume* voFmsMfTb1 = new TGeoVolume("FmsMfTb1", new TGeoBBox(330., dy,  60.), kMedCC);
349   asFMS->AddNode(voFmsMfTb1, 1, new TGeoTranslation(0., ys, zFil));
350   ys += dy;
351   dy = 41.14/2.;
352   ys += dy;
353   TGeoVolume* voFmsMfTb2 = new TGeoVolume("FmsMfTb2", new TGeoBBox(330., dy,  60.), kMedCC);
354   asFMS->AddNode(voFmsMfTb2, 1, new TGeoTranslation(0., ys, zFil));
355   //
356   // Dipole foundation
357   ys = yFloor + dyFloor / 2.;
358   dy = (263.54 - 6.2)/2.;
359   ys += dy;
360   TGeoVolume* voFmsDf1 = new TGeoVolume("FmsDf1", new TGeoBBox(370., dy,  448.0 / 2.), kMedCC);
361   asFMS->AddNode(voFmsDf1, 1, new TGeoTranslation(0., ys, zFil + 240. + 224.));
362   TGeoVolume* voFmsDf2 = new TGeoVolume("FmsDf2", new TGeoBBox(370., (263.54 + 110.)/2.,  112.0 / 2.), kMedCC);
363   asFMS->AddNode(voFmsDf2, 1, new TGeoTranslation(0., ys - 110./2., zFil + 688. + 56.));
364
365   //
366   // Shielding in front of L3 magnet in PX24 and UX25
367   // Drawing ALIP2I__0016
368   //
369
370   TGeoVolumeAssembly* asShRb24 = new TGeoVolumeAssembly("ShRb24");
371   //
372   // Side walls 
373   // start 7450 from IP
374   TGeoVolume* voShRb24Sw = new TGeoVolume("ShRb24Sw", new TGeoBBox(80., 420., 520.), kMedCC);
375   asShRb24->AddNode(voShRb24Sw, 1, new TGeoTranslation(+315, -420. + 140., 0.));
376   asShRb24->AddNode(voShRb24Sw, 2, new TGeoTranslation(-315, -420. + 140., 0.));
377   //
378   // Roof
379   TGeoVolume* voShRb24Ro = new TGeoVolume("ShRb24Ro", new TGeoBBox(395., 80., 520.), kMedCC);
380   asShRb24->AddNode(voShRb24Ro, 1, new TGeoTranslation(0., +80. + 140., 0.));
381   //
382   // Concrete Plug
383   TGeoBBox* shShRb24Pl1 = new TGeoBBox(235., 140., 40.);
384   shShRb24Pl1->SetName("ShRb24Pl1");
385   // Steel Plug
386   TGeoBBox* shShRb24Pl4 = new TGeoBBox(15., 20., 40.);
387   shShRb24Pl4->SetName("ShRb24Pl4");
388
389   TGeoBBox* shShRb24Pl41 = new TGeoBBox(15., 20., 45.);
390   shShRb24Pl41->SetName("ShRb24Pl41");
391   
392   //
393   // Opening for beam pipe
394   Float_t dxShRb24Pl = 14.5;
395   Float_t dyShRb24Pl = 20.0;
396   if (fNewShield24) {
397     dxShRb24Pl = 6.;
398     dyShRb24Pl = 6.;
399   }
400   TGeoBBox* shShRb24Pl2 = new TGeoBBox(dxShRb24Pl, dyShRb24Pl, 60.);
401   shShRb24Pl2->SetName("ShRb24Pl2");
402   //
403   // Opening for tubes
404   TGeoBBox* shShRb24Pl3 = new TGeoBBox(20., 60., 60.);
405   shShRb24Pl3->SetName("ShRb24Pl3");
406
407   TGeoTranslation* trPl3 = new TGeoTranslation("trPl3", +235. -90., 80., 0.);
408   trPl3->RegisterYourself();
409
410   TGeoTranslation* trPl4 = new TGeoTranslation("trPl4", 0., -6., 0.);
411   trPl4->RegisterYourself();
412   TGeoTranslation* trPl5 = new TGeoTranslation("trPl5", 0., +6., 0.);
413   trPl5->RegisterYourself();
414
415   TGeoCompositeShape*  shRb24Pl   = 0;
416   TGeoCompositeShape*  shRb24PlSS = 0;
417   if (!fNewShield24) {
418     shRb24Pl = new TGeoCompositeShape("Rb24Pl", "ShRb24Pl1-ShRb24Pl2:trPl4-ShRb24Pl3:trPl3");
419   } else {
420     shRb24Pl   = new TGeoCompositeShape("Rb24Pl",   "ShRb24Pl1-(ShRb24Pl41:trPl4+ShRb24Pl3:trPl3)");
421     shRb24PlSS = new TGeoCompositeShape("Rb24PlSS", "ShRb24Pl4-ShRb24Pl2:trPl5");
422   }
423
424   TGeoVolume* voRb24Pl = new TGeoVolume("Rb24Pl", shRb24Pl, kMedCC);
425
426   asShRb24->AddNode(voRb24Pl, 1, new TGeoTranslation(0., 0., 520. - 40.));
427   if (fNewShield24) {
428     TGeoVolume* voRb24PlSS = new TGeoVolume("Rb24PlSS", shRb24PlSS, kMedST);
429     asShRb24->AddNode(voRb24PlSS, 1, new TGeoTranslation(0., -6., 520. - 40.));
430    }
431
432
433   //
434   // Concrete platform and shielding PX24
435   // Drawing LHCJUX 250014
436   //
437   TGeoVolumeAssembly* asShPx24 = new TGeoVolumeAssembly("ShPx24");
438   // Platform
439   TGeoVolume* voShPx24Pl = new TGeoVolume("ShPx24Pl", new TGeoBBox(1613.5/2., 120./2., 1205./2.), kMedCC);
440   asShPx24->AddNode(voShPx24Pl, 1, new TGeoTranslation(55., -140. - 60., 0.));
441   // Pillars
442   TGeoVolume* voShPx24Pi = new TGeoVolume("ShPx24Pi", new TGeoBBox(160./2., 440./2., 40/2.), kMedCC);
443   asShPx24->AddNode(voShPx24Pi, 1, new TGeoTranslation(-180. - 80., -220. -260.,  1205./2. - 20.));
444   asShPx24->AddNode(voShPx24Pi, 2, new TGeoTranslation(+290. + 80., -220. -260.,  1205./2. - 20.));
445   asShPx24->AddNode(voShPx24Pi, 3, new TGeoTranslation(-180. - 80., -220. -260., -1205./2. + 20. + 120.));
446   asShPx24->AddNode(voShPx24Pi, 4, new TGeoTranslation(+290. + 80., -220. -260., -1205./2. + 20. + 120.));
447   asShPx24->AddNode(voShPx24Pi, 5, new TGeoTranslation(-180. - 80., -220. -260., -1205./2. - 20. + 480.));
448   asShPx24->AddNode(voShPx24Pi, 6, new TGeoTranslation(+290. + 80., -220. -260., -1205./2. - 20. + 480.));
449   asShPx24->AddNode(voShPx24Pi, 7, new TGeoTranslation(-180. - 80., -220. -260., -1205./2. - 20. + 800.));
450   asShPx24->AddNode(voShPx24Pi, 8, new TGeoTranslation(+290. + 80., -220. -260., -1205./2. - 20. + 800.));
451   // Side Walls 
452   TGeoVolume* voShPx24Sw = new TGeoVolume("ShPx24Sw", new TGeoBBox(160./2., 280./2., 1205./2.), kMedCC);
453   asShPx24->AddNode(voShPx24Sw, 1, new TGeoTranslation(-180, 0., 0.));
454   asShPx24->AddNode(voShPx24Sw, 2, new TGeoTranslation(+290, 0., 0.));
455   // Roof
456   TGeoVolume* voShPx24Ro = new TGeoVolume("ShPx24Ro", new TGeoBBox(630./2., 160./2., 1205./2.), kMedCC);
457   asShPx24->AddNode(voShPx24Ro, 1, new TGeoTranslation(55., 80.+ 140., 0.));
458   asHall->AddNode(asShRb24, 1, new TGeoTranslation(0., 0., +745. + 520.));
459   asHall->AddNode(asShPx24, 1, new TGeoTranslation(0., 0., +745. + 1040. + 1205./ 2.));
460   // Stainless Steel Plug 80 cm thick
461   TGeoBBox* shShPx24Pl1 = new TGeoBBox(155., 140., 40.);
462   shShPx24Pl1->SetName("ShPx24Pl1");
463   // Opening for beam pipe
464   Float_t dxPx24Pl2 =  9.5;
465   Float_t dyPx24Pl2 = 14.0;
466   // Option for new shielding closer to the beam pipe
467   if (fNewShield24) {
468     dxPx24Pl2 = 6.;
469     dyPx24Pl2 = 6.;
470   }
471   //
472   TGeoBBox* shShPx24Pl2 = new TGeoBBox(dxPx24Pl2, dyPx24Pl2, 60.);
473   shShPx24Pl2->SetName("ShPx24Pl2");
474   TGeoTranslation* trPl2  = new TGeoTranslation("trPl2",  -55., 0., 0.);
475   trPl2->RegisterYourself();
476
477   TGeoCompositeShape*  shPx24Pl = new TGeoCompositeShape("Px24Pl", "ShPx24Pl1-ShPx24Pl2:trPl2");
478   TGeoVolume* voPx24Pl = new TGeoVolume("Px24Pl", shPx24Pl, kMedST);
479   asShPx24->AddNode(voPx24Pl, 1, new TGeoTranslation(55., 0., -1205./2. + 40.));
480   asHall->AddNode(asFMS, 1, new TGeoTranslation(0.,  0., 0.));
481
482   //
483   // Scoring plane for beam background simulations
484   //
485   TGeoVolume* voRB24Scoring = new TGeoVolume("RB24Scoring", new TGeoTube(4.3, 300., 1.), kMedAir);
486   asHall->AddNode(voRB24Scoring, 1, new TGeoTranslation(0., 0., 735.));
487   //
488
489   top->AddNode(asHall, 1, gGeoIdentity);
490   
491 }
492
493 void AliHALLv3::Init()
494 {
495   //
496   // Initialise the module after the geometry has been defined
497   //
498     if(AliLog::GetGlobalDebugLevel()>0) {
499         printf("%s: **************************************"
500                " HALL "
501                "**************************************\n",ClassName());
502         printf("\n%s:      Version 3 of HALL initialised\n\n",ClassName());
503         printf("%s: **************************************"
504                " HALL "
505                "**************************************\n",ClassName());
506     }
507 //
508 // The reference volume id
509     fRefVolumeId = gMC->VolId("RB24Scoring");
510 }
511
512 void AliHALLv3::StepManager()
513 {
514 //
515 // Stepmanager of AliHALLv2
516 // Used for recording of reference tracks entering scoring plane
517 //
518   if (!fScoring) return;
519   Int_t   copy, id;
520   
521   //
522   // Only charged tracks
523   if( !(gMC->TrackCharge()) ) return; 
524   //
525   // Only tracks entering mother volume
526   // 
527
528   id=gMC->CurrentVolID(copy);
529
530   if ((id != fRefVolumeId))   return;
531   if(!gMC->IsTrackEntering()) return;
532   //
533   // Add the reference track
534   //
535   AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kHALL);
536 }
537