made const array arguments of GetPredictedChi2 methods
[u/mrichter/AliRoot.git] / STRUCT / AliSHILv3.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 // The small angle absorber SAA (beam shield)
20 // Author: A.Morsch
21 // andreas.morsch@cern.ch
22 //-------------------------------------------------------------------------
23
24 #include <TVirtualMC.h>
25 #include <TArrayI.h>
26 #include <TGeoVolume.h>
27 #include <TGeoTube.h>
28 #include <TGeoManager.h>
29 #include <TGeoMatrix.h>
30 #include <TGeoCompositeShape.h>
31 #include <TGeoBBox.h>
32 #include <TGeoPgon.h>
33 #include <TGeoCone.h>
34
35 #include "AliSHILv3.h"
36 #include "AliConst.h"
37 #include "AliLog.h"
38
39 ClassImp(AliSHILv3)
40  
41 //_____________________________________________________________________________
42 AliSHILv3::AliSHILv3()
43 {
44   //
45   // Default constructor for muon shield
46   //
47 }
48  
49 //_____________________________________________________________________________
50 AliSHILv3::AliSHILv3(const char *name, const char *title)
51   : AliSHIL(name,title)
52 {
53   //
54   // Standard constructor for muon shield
55   //
56 }
57  
58 //_____________________________________________________________________________
59 void AliSHILv3::CreateGeometry()
60 {
61 //
62 // The geometry of the small angle absorber "Beam Shield"
63 //
64     Float_t dz, dr, z, rmax;
65 //
66 // The top volume
67 //
68     TGeoVolume* top = gGeoManager->GetVolume("ALIC");
69 //  Rotations
70     TGeoRotation* rot000 = new TGeoRotation("rot000",  90.,   0., 90.,  90., 0., 0.);
71     TGeoRotation* rot090 = new TGeoRotation("rot090",  90.,  90., 90., 180., 0., 0.);
72     TGeoRotation* rot180 = new TGeoRotation("rot180",  90., 180., 90., 270., 0., 0.);
73     TGeoRotation* rot270 = new TGeoRotation("rot270",  90., 270., 90.,   0., 0., 0.);
74     Float_t alhc = 0.794;
75     TGeoRotation* rotxzlhc   = new TGeoRotation("rotxzlhc", 0.,  -alhc, 0.);
76     TGeoRotation* rotlhc     = new TGeoRotation("rotlhc",   0.,   alhc, 0.);
77
78 //
79 // Media
80 //
81     TGeoMedium* kMedNiW     = gGeoManager->GetMedium("SHIL_Ni/W0");
82     TGeoMedium* kMedNiWsh   = gGeoManager->GetMedium("SHIL_Ni/W3");
83 //
84     TGeoMedium* kMedSteel   = gGeoManager->GetMedium("SHIL_ST_C0");
85     TGeoMedium* kMedSteelSh = gGeoManager->GetMedium("SHIL_ST_C3");
86 //
87     TGeoMedium* kMedAir     = gGeoManager->GetMedium("SHIL_AIR_C0");
88     TGeoMedium* kMedAirMu   = gGeoManager->GetMedium("SHIL_AIR_MUON");
89 //
90     TGeoMedium* kMedPb      = gGeoManager->GetMedium("SHIL_PB_C0");
91     TGeoMedium* kMedPbSh    = gGeoManager->GetMedium("SHIL_PB_C2");
92 //
93     TGeoMedium* kMedConcSh  = gGeoManager->GetMedium("SHIL_CC_C2");
94 //
95     TGeoMedium* kMedCastiron   = gGeoManager->GetMedium("SHIL_CAST_IRON0");
96     TGeoMedium* kMedCastironSh = gGeoManager->GetMedium("SHIL_CAST_IRON2");
97 //
98     const Float_t kDegRad = TMath::Pi() / 180.;
99     const Float_t kAngle02   = TMath::Tan( 2.00   * kDegRad);   
100     const Float_t kAngle0071 = TMath::Tan( 0.71   * kDegRad);   
101
102
103 ///////////////////////////////////
104 //    FA Tungsten Tail           //
105 //    Drawing ALIP2A__0049       //
106 //    Drawing ALIP2A__0111       //
107 ///////////////////////////////////
108 //
109 //    The tail as built is shorter than in drawing ALIP2A__0049. 
110 //    The CDD data base has to be updated !
111 //
112 //    Inner radius at the entrance of the flange
113       Float_t rInFaWTail1  = 13.98/2.;
114 //    Outer radius at the entrance of the flange
115       Float_t rOuFaWTail1  = 52.00/2.;
116 //    Outer radius at the end of the section inside the FA
117       Float_t rOuFaWTail2  = 35.27/2.;
118 //    Length of the Flange section inside the FA
119       Float_t dzFaWTail1   =  6.00;
120 //    Length of the Flange section ouside the FA
121       Float_t dzFaWTail2   = 12.70;
122 //    Inner radius at the end of the section inside the FA 
123       Float_t rInFaWTail2  = rInFaWTail1 +  dzFaWTail1 * kAngle0071;
124 //    Inner radius at the end of the flange
125       Float_t rInFaWTail3  = rInFaWTail2 +  dzFaWTail2 * kAngle0071;
126 //    Outer radius at the end of the flange
127       Float_t rOuFaWTail3  = rOuFaWTail2 +  dzFaWTail2 * kAngle02;
128 //    Outer radius of the recess for station 1
129       Float_t rOuFaWTailR  = 30.8/2.;
130 //    Length of the recess
131       Float_t dzFaWTailR   = 36.00;
132 //    Inner radiues at the end of the recess      
133       Float_t rInFaWTail4  =  rInFaWTail3 +  dzFaWTailR * kAngle0071;
134 //    Outer radius at the end of the recess      
135       Float_t rOuFaWTail4  =  rOuFaWTail3 +  dzFaWTailR * kAngle02;
136 //    Inner radius of the straight section
137       Float_t rInFaWTailS  = 22.30/2.;
138 //    Length of the bulge
139       Float_t dzFaWTailB   = 13.0;
140 //    Outer radius at the end of the bulge
141       Float_t rOuFaWTailB  =  rOuFaWTail4 +  dzFaWTailB * kAngle02;
142 //    Outer radius at the end of the tail 
143       Float_t rOuFaWTailE  = 31.6/2.;
144 //    Total length of the tail
145       Float_t dzFaWTail    = 70.7;
146
147       TGeoPcon* shFaWTail = new TGeoPcon(0., 360., 10);
148       z    = 0.;
149 //    Flange section inside FA
150       shFaWTail->DefineSection(0,  z, rInFaWTail1, rOuFaWTail1);
151       z += dzFaWTail1;
152       shFaWTail->DefineSection(1,  z, rInFaWTail2, rOuFaWTail1);      
153       shFaWTail->DefineSection(2,  z, rInFaWTail2, rOuFaWTail2);      
154 //    Flange section outside FA
155       z +=  dzFaWTail2;
156       shFaWTail->DefineSection(3,  z, rInFaWTail3, rOuFaWTail3);      
157       shFaWTail->DefineSection(4,  z, rInFaWTail3, rOuFaWTailR);
158 //    Recess Station 1
159       z +=  dzFaWTailR;
160       shFaWTail->DefineSection(5,  z, rInFaWTail4, rOuFaWTailR); 
161       shFaWTail->DefineSection(6,  z, rInFaWTailS, rOuFaWTail4);
162 //    Bulge
163       z += dzFaWTailB;
164       shFaWTail->DefineSection(7,  z, rInFaWTailS, rOuFaWTailB);
165       shFaWTail->DefineSection(8,  z, rInFaWTailS, rOuFaWTailE);
166 //    End
167       z =  dzFaWTail;
168       shFaWTail->DefineSection(9,  z, rInFaWTailS, rOuFaWTailE);
169       
170       TGeoVolume* voFaWTail = new TGeoVolume("YFaWTail", shFaWTail, kMedNiW);
171 //
172 //    Define an inner region with higher transport cuts
173       TGeoPcon* shFaWTailI = new TGeoPcon(0., 360., 4);
174       z  = 0.;
175       dr = 3.5;
176       shFaWTailI->DefineSection(0, z, rInFaWTail1,  rInFaWTail1 + dr);
177       z += (dzFaWTail1 + dzFaWTail2 +  dzFaWTailR);
178       shFaWTailI->DefineSection(1, z, rInFaWTail4,  rInFaWTail4 + dr);
179       shFaWTailI->DefineSection(2, z, rInFaWTailS,  rInFaWTailS + dr);
180       z = dzFaWTail;
181       shFaWTailI->DefineSection(3, z, rInFaWTailS,  rInFaWTailS + dr);
182       TGeoVolume* voFaWTailI = new TGeoVolume("YFaWTailI", shFaWTailI, kMedNiWsh);
183       voFaWTail->AddNode(voFaWTailI, 1, gGeoIdentity);
184       
185 ///////////////////////////////////
186 //                               //
187 // Recess Station 1              //
188 // Drawing ALIP2A__0260          //
189 ///////////////////////////////////
190
191 ///////////////////////////////////
192 //    FA W-Ring 2                //
193 //    Drawing ALIP2A__0220       //
194 ///////////////////////////////////
195       const Float_t kFaWring2Rinner  = 15.41;
196       const Float_t kFaWring2Router  = 18.40;
197       const Float_t kFaWring2HWidth  =  3.75;
198       const Float_t kFaWring2Cutoffx =  3.35;
199       const Float_t kFaWring2Cutoffy =  3.35;
200       TGeoTubeSeg* shFaWring2a  = new TGeoTubeSeg(kFaWring2Rinner, kFaWring2Router, kFaWring2HWidth, 0., 90.);
201       shFaWring2a->SetName("shFaWring2a");
202       TGeoBBox* shFaWring2b  = new TGeoBBox(kFaWring2Router / 2., kFaWring2Router / 2., kFaWring2HWidth);
203       shFaWring2b->SetName("shFaWring2b");
204       TGeoTranslation* trFaWring2b 
205           = new TGeoTranslation("trFaWring2b", kFaWring2Router / 2. + kFaWring2Cutoffx, kFaWring2Router / 2. + kFaWring2Cutoffy, 0.);
206       trFaWring2b->RegisterYourself();
207       TGeoCompositeShape*  shFaWring2 = new TGeoCompositeShape("shFaWring2", "(shFaWring2a)*(shFaWring2b:trFaWring2b)");
208       TGeoVolume* voFaWring2    = new TGeoVolume("YFA_WRING2", shFaWring2, kMedNiW);
209
210 ///////////////////////////////////
211 //    FA W-Ring 3                //
212 //    Drawing ALIP2A__0219       //
213 ///////////////////////////////////
214       const Float_t kFaWring3Rinner  = 15.41;
215       const Float_t kFaWring3Router  = 18.40;
216       const Float_t kFaWring3HWidth  =  3.75;
217       const Float_t kFaWring3Cutoffx =  3.35;
218       const Float_t kFaWring3Cutoffy =  3.35;
219       TGeoTubeSeg* shFaWring3a  = new TGeoTubeSeg(kFaWring3Rinner, kFaWring3Router, kFaWring3HWidth, 0., 90.);
220       shFaWring3a->SetName("shFaWring3a");
221       TGeoBBox* shFaWring3b  = new TGeoBBox(kFaWring3Router / 2., kFaWring3Router / 2., kFaWring3HWidth);
222       shFaWring3b->SetName("shFaWring3b");
223       TGeoTranslation* trFaWring3b 
224           = new TGeoTranslation("trFaWring3b", kFaWring3Router / 2. + kFaWring3Cutoffx, kFaWring3Router / 2. + kFaWring3Cutoffy, 0.);
225       trFaWring3b->RegisterYourself();
226       TGeoCompositeShape*  shFaWring3 = new TGeoCompositeShape("shFaWring3", "(shFaWring3a)*(shFaWring3b:trFaWring3b)");
227       TGeoVolume* voFaWring3    = new TGeoVolume("YFA_WRING3", shFaWring3, kMedNiW);
228
229 ///////////////////////////////////
230 //    FA W-Ring 5                //
231 //    Drawing ALIP2A__0221       //
232 ///////////////////////////////////
233       const Float_t kFaWring5Rinner = 15.41;
234       const Float_t kFaWring5Router = 18.67;
235       const Float_t kFaWring5HWidth =  1.08;
236       TGeoVolume* voFaWring5    = new TGeoVolume("YFA_WRING5", new TGeoTube(kFaWring5Rinner, kFaWring5Router, kFaWring5HWidth), kMedNiW);
237
238 //
239 // Position the rings in the assembly 
240 //      
241       TGeoVolumeAssembly* asFaExtraShield = new TGeoVolumeAssembly("YCRE");
242 // Distance between rings
243       const Float_t kFaDWrings = 1.92;
244 //
245       dz = 0.;
246       
247       dz +=  kFaWring2HWidth;
248       asFaExtraShield->AddNode(voFaWring2,    1, new TGeoCombiTrans(0., 0., dz, rot180));
249       asFaExtraShield->AddNode(voFaWring2,    2, new TGeoCombiTrans(0., 0., dz, rot000));
250       dz +=   kFaWring2HWidth;
251       dz +=   kFaDWrings;
252       dz +=   kFaWring3HWidth;
253       asFaExtraShield->AddNode(voFaWring3,    1, new TGeoCombiTrans(0., 0., dz, rot090));
254       asFaExtraShield->AddNode(voFaWring3,    2, new TGeoCombiTrans(0., 0., dz, rot270));
255       dz +=   kFaWring3HWidth;   
256       dz +=   kFaWring5HWidth;   
257       asFaExtraShield->AddNode(voFaWring5,    1, new TGeoTranslation(0., 0., dz));
258       dz +=   kFaWring5HWidth;   
259       dz +=   kFaWring3HWidth;   
260       asFaExtraShield->AddNode(voFaWring3,    3, new TGeoCombiTrans(0., 0., dz, rot180));
261       asFaExtraShield->AddNode(voFaWring3,    4, new TGeoCombiTrans(0., 0., dz, rot000));
262       dz +=   kFaWring3HWidth;   
263       dz +=   kFaDWrings;
264       dz +=   kFaWring2HWidth;
265       asFaExtraShield->AddNode(voFaWring2,    3, new TGeoCombiTrans(0., 0., dz, rot090));
266       asFaExtraShield->AddNode(voFaWring2,    4, new TGeoCombiTrans(0., 0., dz, rot270));
267       dz +=   kFaWring2HWidth;
268
269       
270 ///////////////////////////////////////
271 //                SAA1               //
272 ///////////////////////////////////////
273
274
275 ///////////////////////////////////////
276 //          FA/SAA1  W Joint         //
277 //          Drawing ALIP2A__0060     //
278 ///////////////////////////////////////
279
280 // Length of flange FA side      
281       Float_t dzFaSaa1F1  =  2.8;
282 // Inner radius of flange FA side
283       Float_t rInFaSaa1F1 = 32.0/2.;
284 // Outer radius of flange FA side
285       Float_t rOuFaSaa1F1 = 39.5/2.;
286 // Length of first straight section
287       Float_t dzFaSaa1S1  = 18.5 - dzFaSaa1F1;
288 // Inner radius of first straight section
289       Float_t rInFaSaa1S1 = 22.3/2.;
290 // Length of 45 deg transition region
291       Float_t  dzFaSaa1T1 =  2.2;
292 // Inner radius of second straight section
293       Float_t rInFaSaa1S2 = 17.9/2.;
294 // Length of second straight section
295       Float_t dzFaSaa1S2  = 10.1;
296 // Length of flange SAA1 side      
297 //    Float_t dzFaSaa1F2  =  4.0;
298 // Inner radius of flange FA side
299       Float_t rInFaSaa1F2 = 25.2/2.;
300 // Length of joint
301       Float_t dzFaSaa1    = 34.8;
302 // Outer Radius at the end of the joint
303       Float_t rOuFaSaa1E  = 41.93/2.;
304       
305       
306       TGeoPcon* shFaSaa1 = new TGeoPcon(0., 360., 8);
307       z = 0;
308 // Flange FA side      
309       shFaSaa1->DefineSection( 0, z, rInFaSaa1F1, rOuFaSaa1F1 - 0.01);
310       z += dzFaSaa1F1;
311       shFaSaa1->DefineSection( 1, z, rInFaSaa1F1, 40.0);
312       shFaSaa1->DefineSection( 2, z, rInFaSaa1S1, 40.0);
313 // First straight section
314       z += dzFaSaa1S1;
315       shFaSaa1->DefineSection( 3, z, rInFaSaa1S1, 40.0);
316 // 45 deg transition region
317       z += dzFaSaa1T1;
318       shFaSaa1->DefineSection( 4, z, rInFaSaa1S2, 40.0);
319 // Second straight section
320       z += dzFaSaa1S2;
321       shFaSaa1->DefineSection( 5, z, rInFaSaa1S2, 40.0);
322       shFaSaa1->DefineSection( 6, z, rInFaSaa1F2, 40.0);
323 // Flange SAA1 side
324       z = dzFaSaa1;
325       shFaSaa1->DefineSection( 7, z, rInFaSaa1F2, rOuFaSaa1E - 0.01);
326
327 // Outer 2 deg line
328       for (Int_t i  = 1; i < 7; i++) {
329           Double_t zp   = shFaSaa1->GetZ(i);
330           Double_t r1   = shFaSaa1->GetRmin(i);  
331           Double_t r2 = 39.5/2. + zp * TMath::Tan(2. * kDegRad) - 0.01;
332           shFaSaa1->DefineSection(i, zp, r1, r2);
333       }
334       TGeoVolume* voFaSaa1 = new TGeoVolume("YFASAA1", shFaSaa1, kMedNiWsh);
335 //
336 // Outer region with lower transport cuts
337       TGeoCone* shFaSaa1O   = new TGeoCone(dzFaSaa1/2., rOuFaSaa1F1 - 3.5, rOuFaSaa1F1 - 0.01, rOuFaSaa1E - 3.5, rOuFaSaa1E - 0.01);
338       TGeoVolume* voFaSaa1O = new TGeoVolume("YFASAA1O", shFaSaa1O, kMedNiW);
339       voFaSaa1->AddNode(voFaSaa1O, 1, new TGeoTranslation(0., 0., dzFaSaa1/2.));
340       
341
342 ///////////////////////////////////
343 //    SAA1 Steel Envelope        //
344 //    Drawing ALIP2A__0039       //
345 ///////////////////////////////////
346       
347       Float_t rOut;      // Outer radius
348 // Thickness of the steel envelope
349       Float_t dSt = 4.;
350 // 4 Section
351 // z-positions
352       Float_t zSaa1StEnv[5] = {111.2, 113.7, 229.3, 195.0};
353 // Radii
354 // 1
355       Float_t rOuSaa1StEnv1 = 40.4/2.;
356       Float_t rInSaa1StEnv1 = rOuSaa1StEnv1 - dSt - 0.05;
357 // 2  
358       Float_t rInSaa1StEnv2 = 41.7/2.;
359       Float_t rOuSaa1StEnv2 = rInSaa1StEnv2 + dSt / TMath::Cos(2.0 * kDegRad) - 0.05;
360 // 3         
361       Float_t rOuSaa1StEnv3 = 57.6/2.; 
362       Float_t rInSaa1StEnv3 = rOuSaa1StEnv3 - dSt + 0.05;
363 // 4
364       Float_t rInSaa1StEnv4 = 63.4/2.;
365       Float_t rOuSaa1StEnv4 = rInSaa1StEnv4 + dSt / TMath::Cos(1.6 * kDegRad) - 0.05;
366 // end         
367       Float_t rInSaa1StEnv5 = 74.28/2.;
368       Float_t rOuSaa1StEnv5 = rInSaa1StEnv5 + dSt / TMath::Cos(1.6 * kDegRad) - 0.05;
369 // Relative starting position
370       Float_t zSaa1StEnvS = 3.;
371       
372       TGeoPcon* shSaa1StEnv  = new TGeoPcon(0., 360., 11);
373 // 1st Section
374       z = zSaa1StEnvS;
375       shSaa1StEnv->DefineSection( 0, z, rInSaa1StEnv1, rOuSaa1StEnv1);
376       z += (zSaa1StEnv[0] - dSt);
377       shSaa1StEnv->DefineSection( 1, z, rInSaa1StEnv1, rOuSaa1StEnv1);
378 // 1 - 2
379       shSaa1StEnv->DefineSection( 2, z, rInSaa1StEnv1, rOuSaa1StEnv2);
380       z +=  dSt;
381       shSaa1StEnv->DefineSection( 3, z, rInSaa1StEnv1, rOuSaa1StEnv2);      
382 // 2nd Section
383       shSaa1StEnv->DefineSection( 4, z, rInSaa1StEnv2, rOuSaa1StEnv2);      
384       z += zSaa1StEnv[1];
385       shSaa1StEnv->DefineSection( 5, z, rInSaa1StEnv3, rOuSaa1StEnv3);      
386 // 3rd Section  
387       z += (zSaa1StEnv[2] - dSt);
388       shSaa1StEnv->DefineSection( 6, z, rInSaa1StEnv3, rOuSaa1StEnv3);      
389 // 3 - 4
390       shSaa1StEnv->DefineSection( 7, z, rInSaa1StEnv3, rOuSaa1StEnv4);
391       z += dSt;
392       shSaa1StEnv->DefineSection( 8, z, rInSaa1StEnv3, rOuSaa1StEnv4);
393 // 4th Section
394       shSaa1StEnv->DefineSection( 9, z, rInSaa1StEnv4, rOuSaa1StEnv4);
395       z += zSaa1StEnv[3];
396       shSaa1StEnv->DefineSection(10, z, rInSaa1StEnv5, rOuSaa1StEnv5);      
397       TGeoVolume* voSaa1StEnv  =  new TGeoVolume("YSAA1_SteelEnvelope", shSaa1StEnv, kMedSteel);
398
399
400       
401  
402
403 ///////////////////////////////////
404 //    SAA1 W-Pipe                //
405 //    Drawing ALIP2A__0059       //
406 ///////////////////////////////////
407 //
408 //    Flange FA side
409 //    Length of first section      
410       Float_t dzSaa1WPipeF1  = 0.9;
411 //    Outer radius 
412       Float_t rOuSaa1WPipeF1 = 24.5/2.;
413 //    Inner Radius
414       Float_t rInSaa1WPipeF1 = 22.0/2.;
415 //    Length of second section
416       Float_t dzSaa1WPipeF11 =  2.1;
417 //    Inner Radius
418       Float_t rInSaa1WPipeF11 = 18.5/2.;
419 //
420 //    Central tube 
421 //    Length 
422       Float_t dzSaa1WPipeC = 111.2;
423 //    Inner Radius at the end
424       Float_t rInSaa1WPipeC = 22.0/2.;
425 //    Outer Radius
426       Float_t rOuSaa1WPipeC = 31.9/2.;
427 //
428 //    Flange SAA2 Side
429 //    Length
430       Float_t dzSaa1WPipeF2  = 6.0;
431 //    Outer radius 
432       Float_t rOuSaa1WPipeF2 = 41.56/2.;
433
434 //
435       TGeoPcon* shSaa1WPipe  = new TGeoPcon(0., 360., 8);
436       z = 0.;
437 // Flange FA side first section
438       shSaa1WPipe->DefineSection( 0, z, rInSaa1WPipeF1 , rOuSaa1WPipeF1);
439       z += dzSaa1WPipeF1;
440       shSaa1WPipe->DefineSection( 1, z, rInSaa1WPipeF1 , rOuSaa1WPipeF1);
441 // Flange FA side second section
442       shSaa1WPipe->DefineSection( 2, z, rInSaa1WPipeF11, rOuSaa1WPipeF1);
443       z += dzSaa1WPipeF11;
444       shSaa1WPipe->DefineSection( 3, z, rInSaa1WPipeF11, rOuSaa1WPipeF1);
445 // Central Section
446       shSaa1WPipe->DefineSection( 4, z, rInSaa1WPipeF11, rOuSaa1WPipeC);
447       z += dzSaa1WPipeC;
448       shSaa1WPipe->DefineSection( 5, z, rInSaa1WPipeC,   rOuSaa1WPipeC);
449 // Flange SAA2 side
450       shSaa1WPipe->DefineSection( 6, z, rInSaa1WPipeC,   rOuSaa1WPipeF2);
451       z +=  dzSaa1WPipeF2;
452       shSaa1WPipe->DefineSection( 7, z, rInSaa1WPipeC,   rOuSaa1WPipeF2);
453
454       TGeoVolume* voSaa1WPipe  =  new TGeoVolume("YSAA1_WPipe", shSaa1WPipe, kMedNiW);
455 //
456 // Inner region with higher transport cuts
457       TGeoTube*   shSaa1WPipeI = new TGeoTube(rInSaa1WPipeC, rOuSaa1WPipeC, dzSaa1WPipeC/2.);
458       TGeoVolume* voSaa1WPipeI =  new TGeoVolume("YSAA1_WPipeI", shSaa1WPipeI, kMedNiWsh);
459       voSaa1WPipe->AddNode(voSaa1WPipeI, 1, new TGeoTranslation(0., 0., dzSaa1WPipeF1 + dzSaa1WPipeF11 + dzSaa1WPipeC/2));
460       
461
462 ///////////////////////////////////
463 //    SAA1 Pb Components         //
464 //    Drawing ALIP2A__0078       //
465 ///////////////////////////////////
466 //
467 //    Inner angle
468       Float_t tanAlpha = TMath::Tan(1.69    / 2. * kDegRad);
469       Float_t tanBeta  = TMath::Tan(3.20    / 2. * kDegRad);    
470 // 
471 //    1st Section 2deg opening cone
472 //    Length 
473       Float_t dzSaa1PbComp1 = 100.23;
474 //    Inner radius at entrance
475       Float_t rInSaa1PbComp1 = 22.0/2.; // It's 21 cm diameter in the drawing. Is this a typo ??!!
476 //    Outer radius at entrance
477       Float_t rOuSaa1PbComp1 = 42.0/2.;
478 //
479 //    2nd Section: Straight Section
480 //    Length 
481       Float_t dzSaa1PbComp2  = 236.77;
482 //    Inner radius
483       Float_t rInSaa1PbComp2 = rInSaa1PbComp1 + dzSaa1PbComp1 * tanAlpha;
484 //    Outer radius
485       Float_t rOuSaa1PbComp2 = 49.0/2.;
486 //
487 //    3rd Section: 1.6deg opening cone until bellow
488 //    Length 
489       Float_t dzSaa1PbComp3 = 175.6;
490 //    Inner radius        
491       Float_t  rInSaa1PbComp3 = rInSaa1PbComp2 + dzSaa1PbComp2 * tanAlpha;
492 //    Outer radius
493       Float_t rOuSaa1PbComp3 = 62.8/2.;
494 //   
495 //   4th Section: Bellow region
496       Float_t dzSaa1PbComp4  = 26.4;
497 //    Inner radius        
498       Float_t  rInSaa1PbComp4 = 37.1/2.;
499       Float_t  rInSaa1PbCompB = 43.0/2.;
500 //    Outer radius
501       Float_t rOuSaa1PbComp4  = rOuSaa1PbComp3 +  dzSaa1PbComp3 * tanBeta;
502 //
503 //   5th Section: Flange SAA2 side
504 //   1st detail 
505       Float_t dzSaa1PbCompF1  = 4.;
506       Float_t rOuSaa1PbCompF1 = 74.1/2.;
507 //   2nd detail       
508       Float_t dzSaa1PbCompF2  = 3.;
509       Float_t rOuSaa1PbCompF2 = 66.0/2.;
510       Float_t rOuSaa1PbCompF3 = 58.0/2.;
511       
512
513       TGeoPcon* shSaa1PbComp  = new TGeoPcon(0., 360., 11);
514       z = 120.2;
515 // 2 deg opening cone
516       shSaa1PbComp->DefineSection( 0, z, rInSaa1PbComp1, rOuSaa1PbComp1);
517       z += dzSaa1PbComp1;
518       shSaa1PbComp->DefineSection( 1, z, rInSaa1PbComp2, rOuSaa1PbComp2);
519 // Straight section
520       z += dzSaa1PbComp2;
521       shSaa1PbComp->DefineSection( 2, z, rInSaa1PbComp3, rOuSaa1PbComp2);
522 // 1.6 deg opening cone
523       shSaa1PbComp->DefineSection( 3, z, rInSaa1PbComp3, rOuSaa1PbComp3);
524       z += dzSaa1PbComp3;
525       shSaa1PbComp->DefineSection( 4, z, rInSaa1PbComp4, rOuSaa1PbComp4);
526 // Bellow region until outer flange
527       shSaa1PbComp->DefineSection( 5, z, rInSaa1PbCompB, rOuSaa1PbComp4);
528       z += (dzSaa1PbComp4 - dzSaa1PbCompF1 -  dzSaa1PbCompF2);
529       shSaa1PbComp->DefineSection( 6, z, rInSaa1PbCompB, rOuSaa1PbCompF1);
530       shSaa1PbComp->DefineSection( 7, z, rInSaa1PbCompB, rOuSaa1PbCompF2);
531 // Flange first step
532       z +=  dzSaa1PbCompF1;
533       shSaa1PbComp->DefineSection( 8, z, rInSaa1PbCompB, rOuSaa1PbCompF2);
534       shSaa1PbComp->DefineSection( 9, z, rInSaa1PbCompB, rOuSaa1PbCompF3);
535 // Flange second step
536       z +=  dzSaa1PbCompF2;
537       shSaa1PbComp->DefineSection( 10, z, rInSaa1PbCompB, rOuSaa1PbCompF3);
538
539       TGeoVolume* voSaa1PbComp  =  new TGeoVolume("YSAA1_PbComp", shSaa1PbComp, kMedPb);
540 //
541 // Inner region with higher transport cuts
542       TGeoPcon*   shSaa1PbCompI = MakeShapeFromTemplate(shSaa1PbComp, 0., -3.);
543       TGeoVolume* voSaa1PbCompI =  new TGeoVolume("YSAA1_PbCompI", shSaa1PbCompI, kMedPbSh);
544       voSaa1PbComp->AddNode(voSaa1PbCompI, 1, gGeoIdentity);
545       
546 ///////////////////////////////////
547 //    SAA1 W-Cone                //
548 //    Drawing ALIP2A__0058       //
549 ///////////////////////////////////
550       // Length of the Cone
551       Float_t dzSaa1WCone = 52.9;
552       // Inner and outer radii
553       Float_t rInSaa1WCone1 = 20.4;
554       Float_t rOuSaa1WCone1 = rInSaa1WCone1 + 0.97;
555       Float_t rOuSaa1WCone2 = rInSaa1WCone1 + 2.80;
556       // relative z-position 
557       Float_t zSaa1WCone    = 9.3;
558       
559       
560       TGeoPcon* shSaa1WCone  = new TGeoPcon(0., 360., 2);
561       z = zSaa1WCone;
562       shSaa1WCone->DefineSection( 0, z, rInSaa1WCone1, rOuSaa1WCone1);
563       z += dzSaa1WCone;
564       shSaa1WCone->DefineSection( 1, z, rInSaa1WCone1, rOuSaa1WCone2);
565       TGeoVolume* voSaa1WCone  =  new TGeoVolume("YSAA1_WCone", shSaa1WCone, kMedNiW);
566
567 ///////////////////////////////////
568 //    SAA1 Steel-Ring            //
569 //    Drawing ALIP2A__0040       //
570 ///////////////////////////////////
571 //
572 //    Length of the ring
573       Float_t dzSaa1StRing = 4.;
574 //    Inner and outer radius
575       Float_t rInSaa1String = 33.0;
576       Float_t rOuSaa1String = 41.1;      
577 //    Relative z-position
578       Float_t zSaa1StRing   = 652.2;
579       TGeoPcon* shSaa1StRing  = new TGeoPcon(0., 360., 2);
580       z = zSaa1StRing;
581       shSaa1StRing->DefineSection( 0, z, rInSaa1String, rOuSaa1String);
582       z += dzSaa1StRing;
583       shSaa1StRing->DefineSection( 1, z, rInSaa1String, rOuSaa1String);
584       TGeoVolume* voSaa1StRing  =  new TGeoVolume("YSAA1_StRing", shSaa1StRing, kMedSteel);
585
586 ///////////////////////////////////
587 //    SAA1 Inner Tube            //
588 //    Drawing ALIP2A__0082       //
589 ///////////////////////////////////
590 //
591 // Length of saa2:               659.2 cm
592 // Length of inner tube:         631.9 cm
593 // Lenth of bellow cavern:        27.3 cm    
594 // Radius at entrance 18.5/2,  d = 0.3
595 // Radius at exit     37.1/2,  d = 0.3 
596 //
597       Float_t dzSaa1InnerTube     = 631.9/2.;  // Half length of the tube  
598       Float_t rInSaa1InnerTube    =  18.2/2.;  // Radius at entrance
599       Float_t rOuSaa1InnerTube    =  36.8/2.;  // Radius at exit
600       Float_t dSaa1InnerTube      =   0.2   ;  // Thickness      
601       TGeoVolume* voSaa1InnerTube = new TGeoVolume("YSAA1_InnerTube", 
602                                                    new TGeoCone(dzSaa1InnerTube, 
603                                                                 rInSaa1InnerTube - dSaa1InnerTube, rInSaa1InnerTube,
604                                                                 rOuSaa1InnerTube - dSaa1InnerTube, rOuSaa1InnerTube),
605                                                    kMedSteelSh);
606
607 ///////////////////////////////////
608 //    SAA1 Outer Shape           //
609 //    Drawing ALIP2A__0107       //
610 ///////////////////////////////////
611       // Total length 
612       Float_t dzSaa1 = 659.2;
613       //
614       TGeoPcon* shSaa1M  = new TGeoPcon(0., 360., 20);
615       Float_t kSec = 0.2; // security distance to avoid trivial extrusions
616       Float_t rmin = rInSaa1InnerTube - dSaa1InnerTube - kSec;
617       rmax = rOuSaa1InnerTube - dSaa1InnerTube - kSec;
618       z = 0.;
619       shSaa1M->DefineSection( 0, z, rmin, rOuSaa1WPipeF1);
620       z += dzSaa1WPipeF1;
621       shSaa1M->DefineSection( 1, z, rmin, rOuSaa1WPipeF1);
622       shSaa1M->DefineSection( 2, z, 0.,   rOuSaa1WPipeF1);
623       z += dzSaa1WPipeF11;
624       shSaa1M->DefineSection( 3, z, 0.,   rOuSaa1WPipeF1);
625       shSaa1M->DefineSection( 4, z, 0.,   rOuSaa1StEnv1);
626       z = zSaa1WCone;
627       shSaa1M->DefineSection( 5, z, 0.,   rOuSaa1StEnv1);
628       shSaa1M->DefineSection( 6, z, 0.,   rOuSaa1WCone1);
629       z += dzSaa1WCone;
630       shSaa1M->DefineSection( 7, z, 0.,   rOuSaa1WCone2);
631       shSaa1M->DefineSection( 8, z, 0.,   rOuSaa1StEnv1);
632       z =  zSaa1StEnv[0] - dSt + zSaa1StEnvS;
633       shSaa1M->DefineSection( 9, z, 0.,   rOuSaa1StEnv1);
634       shSaa1M->DefineSection(10, z, 0.,   rOuSaa1StEnv2);
635       z +=  (zSaa1StEnv[1] + dSt);
636       shSaa1M->DefineSection(11, z, 0.,   rOuSaa1StEnv3);
637       z +=  (zSaa1StEnv[2] - dSt);
638       shSaa1M->DefineSection(12, z, 0.,   rOuSaa1StEnv3);
639       shSaa1M->DefineSection(13, z, 0.,   rOuSaa1StEnv4);
640
641       z += (zSaa1StEnv[3] - dSt +  dzSaa1PbCompF1 + dzSaa1PbCompF2 - dzSaa1PbComp4);
642       Float_t rmaxSaa1 = shSaa1M->GetRmax(13) + (z - shSaa1M->GetZ(13)) * TMath::Tan(1.6 * kDegRad);
643
644       shSaa1M->DefineSection(14, z, 0.,    rmaxSaa1);
645       shSaa1M->DefineSection(15, z, rmax,  rmaxSaa1);
646       z = zSaa1StRing;     
647       shSaa1M->DefineSection(16, z, rmax + 0.4, rOuSaa1String);
648       z += dzSaa1PbCompF1;
649       shSaa1M->DefineSection(17, z, rmax + 0.4, rOuSaa1String);
650       shSaa1M->DefineSection(18, z, rmax + 0.4, rOuSaa1PbCompF3);
651       z += dzSaa1PbCompF2;
652       shSaa1M->DefineSection(19, z, rmax + 0.4, rOuSaa1PbCompF3);
653
654 //
655 //    Inner 1.69deg line
656       for (Int_t i  = 2; i < 15; i++) {
657           Double_t zp = shSaa1M->GetZ(i);
658           Double_t r2 = shSaa1M->GetRmax(i);     
659           Double_t r1 = rmin + (zp - 0.9) * TMath::Tan(1.686 / 2. * kDegRad) - kSec;
660           shSaa1M->DefineSection(i, zp, r1, r2);
661       }
662
663       TGeoVolume* voSaa1M  =  new TGeoVolume("YSAA1M", shSaa1M, kMedAir);
664       voSaa1M->SetVisibility(0);
665       
666
667 ///////////////////////////////////
668 //                               //
669 // Recess Station 2              //
670 // Drawing ALIP2A__0260          //
671 ///////////////////////////////////
672 ///////////////////////////////////
673 //    SAA1 W-Ring 1              //
674 //    Drawing ALIP2A__0217       //
675 ///////////////////////////////////
676       Float_t saa1Wring1Width  =  5.85;
677       TGeoPcon* shSaa1Wring1    = new TGeoPcon(0., 360., 2);
678       shSaa1Wring1->DefineSection(0, 0.00           , 20.31, 23.175);
679       shSaa1Wring1->DefineSection(1, saa1Wring1Width, 20.31, 23.400);
680       TGeoVolume* voSaa1Wring1  =  new TGeoVolume("YSAA1_WRING1", shSaa1Wring1, kMedNiW);
681
682 ///////////////////////////////////
683 //    SAA1 W-Ring 2              //
684 //    Drawing ALIP2A__0055       //
685 ///////////////////////////////////
686       Float_t saa1Wring2Rinner  = 20.31;
687       Float_t saa1Wring2Router  = 23.40;
688       Float_t saa1Wring2HWidth  =  3.75;
689       Float_t saa1Wring2Cutoffx =  4.9;
690       Float_t saa1Wring2Cutoffy =  4.9;
691       TGeoTubeSeg* shSaa1Wring2a  = new TGeoTubeSeg(saa1Wring2Rinner, saa1Wring2Router, saa1Wring2HWidth, 0., 90.);
692       shSaa1Wring2a->SetName("shSaa1Wring2a");
693       TGeoBBox* shSaa1Wring2b  = new TGeoBBox(saa1Wring2Router / 2., saa1Wring2Router / 2., saa1Wring2HWidth);
694       shSaa1Wring2b->SetName("shSaa1Wring2b");
695       TGeoTranslation* trSaa1Wring2b 
696           = new TGeoTranslation("trSaa1Wring2b", saa1Wring2Router / 2. + saa1Wring2Cutoffx, saa1Wring2Router / 2. + saa1Wring2Cutoffy, 0.);
697       trSaa1Wring2b->RegisterYourself();
698       TGeoCompositeShape*  shSaa1Wring2 = new TGeoCompositeShape("shSaa1Wring2", "(shSaa1Wring2a)*(shSaa1Wring2b:trSaa1Wring2b)");
699       TGeoVolume* voSaa1Wring2 = new TGeoVolume("YSAA1_WRING2", shSaa1Wring2, kMedNiW);
700
701 ///////////////////////////////////
702 //    SAA1 W-Ring 3              //
703 //    Drawing ALIP2A__0216       //
704 ///////////////////////////////////
705
706       Float_t saa1Wring3Rinner  = 20.31;
707       Float_t saa1Wring3Router  = 23.40;
708       Float_t saa1Wring3HWidth  =  3.75;
709       Float_t saa1Wring3Cutoffx =  4.80;
710       Float_t saa1Wring3Cutoffy =  4.80;
711       TGeoTubeSeg* shSaa1Wring3a  = new TGeoTubeSeg(saa1Wring3Rinner, saa1Wring3Router, saa1Wring3HWidth, 0., 90.);
712       shSaa1Wring3a->SetName("shSaa1Wring3a");
713       TGeoBBox* shSaa1Wring3b  = new TGeoBBox(saa1Wring3Router / 2., saa1Wring3Router / 2., saa1Wring3HWidth);
714       shSaa1Wring3b->SetName("shSaa1Wring3b");
715       TGeoTranslation* trSaa1Wring3b 
716           = new TGeoTranslation("trSaa1Wring3b", saa1Wring3Router / 2. + saa1Wring3Cutoffx, saa1Wring3Router / 2. + saa1Wring3Cutoffy, 0.);
717       trSaa1Wring3b->RegisterYourself();
718       TGeoCompositeShape*  shSaa1Wring3 = new TGeoCompositeShape("shSaa1Wring3", "(shSaa1Wring3a)*(shSaa1Wring3b:trSaa1Wring3b)");
719       TGeoVolume* voSaa1Wring3 = new TGeoVolume("YSAA1_WRING3", shSaa1Wring3, kMedNiW);
720
721 ///////////////////////////////////
722 //    SAA1 W-Ring 4              //
723 //    Drawing ALIP2A__0215       //
724 ///////////////////////////////////
725       Float_t saa1Wring4Width  =  5.85;
726       TGeoPcon* shSaa1Wring4  = new TGeoPcon(0., 360., 5);
727       shSaa1Wring4->DefineSection(0, 0.00, 20.31, 23.40);
728       shSaa1Wring4->DefineSection(1, 1.00, 20.31, 23.40);
729       shSaa1Wring4->DefineSection(2, 1.00, 20.31, 24.50);      
730       shSaa1Wring4->DefineSection(3, 4.85, 20.31, 24.80);
731       shSaa1Wring4->DefineSection(4, 5.85, 24.10, 24.80);
732       TGeoVolume* voSaa1Wring4  =  new TGeoVolume("YSAA1_WRING4", shSaa1Wring4, kMedNiW);
733
734 ///////////////////////////////////
735 //    SAA1 W-Ring 5              //
736 //    Drawing ALIP2A__0218       //
737 ///////////////////////////////////
738       Float_t saa1Wring5Rinner = 20.31;
739       Float_t saa1Wring5Router = 23.40;
740       Float_t saa1Wring5HWidth =  0.85;
741       TGeoVolume* voSaa1Wring5    = new TGeoVolume("YSAA1_WRING5", 
742                                                    new TGeoTube(saa1Wring5Rinner, saa1Wring5Router, saa1Wring5HWidth), kMedNiW);
743 //
744 // Position the rings in the assembly 
745 //      
746       TGeoVolumeAssembly* asSaa1ExtraShield = new TGeoVolumeAssembly("YSAA1ExtraShield");
747 // Distance between rings
748       Float_t saa1DWrings = 2.3;
749 //
750       dz = - (saa1Wring1Width + 6. * saa1Wring2HWidth + 2. * saa1Wring3HWidth + saa1Wring4Width + 2. * saa1Wring5HWidth + 2. * saa1DWrings) / 2.;
751       asSaa1ExtraShield->AddNode(voSaa1Wring1,    1, new TGeoTranslation(0., 0., dz));
752       dz +=   saa1Wring1Width;
753       dz +=   saa1Wring2HWidth;   
754       asSaa1ExtraShield->AddNode(voSaa1Wring2,    1, new TGeoCombiTrans(0., 0., dz, rot000));
755       asSaa1ExtraShield->AddNode(voSaa1Wring2,    2, new TGeoCombiTrans(0., 0., dz, rot180));
756       dz +=   saa1Wring2HWidth;   
757       dz +=   saa1DWrings;
758       dz +=   saa1Wring2HWidth;   
759       asSaa1ExtraShield->AddNode(voSaa1Wring2,    3, new TGeoCombiTrans(0., 0., dz, rot090));
760       asSaa1ExtraShield->AddNode(voSaa1Wring2,    4, new TGeoCombiTrans(0., 0., dz, rot270));
761       dz +=   saa1Wring2HWidth;   
762       dz +=   saa1Wring5HWidth;   
763       asSaa1ExtraShield->AddNode(voSaa1Wring5,    1, new TGeoTranslation(0., 0., dz));
764       dz +=   saa1Wring5HWidth;   
765       dz +=   saa1Wring2HWidth;   
766       asSaa1ExtraShield->AddNode(voSaa1Wring2,    5, new TGeoCombiTrans(0., 0., dz, rot000));
767       asSaa1ExtraShield->AddNode(voSaa1Wring2,    6, new TGeoCombiTrans(0., 0., dz, rot180));
768       dz +=   saa1Wring2HWidth;   
769       dz +=   saa1DWrings;
770       dz +=   saa1Wring3HWidth;   
771       asSaa1ExtraShield->AddNode(voSaa1Wring3,    1, new TGeoCombiTrans(0., 0., dz, rot090));
772       asSaa1ExtraShield->AddNode(voSaa1Wring3,    2, new TGeoCombiTrans(0., 0., dz, rot270));
773       dz +=   saa1Wring3HWidth;   
774       asSaa1ExtraShield->AddNode(voSaa1Wring4,    1, new TGeoTranslation(0., 0., dz));
775       dz +=   saa1Wring4Width;   
776       const Float_t saa1ExtraShieldL = 48;
777 //
778 // Assemble SAA1
779       voSaa1M->AddNode(voSaa1StEnv,     1, gGeoIdentity);
780       voSaa1M->AddNode(voSaa1WPipe,     1, gGeoIdentity);
781       voSaa1M->AddNode(voSaa1PbComp,    1, gGeoIdentity);
782       voSaa1M->AddNode(voSaa1WCone,     1, gGeoIdentity);
783       voSaa1M->AddNode(voSaa1StRing,    1, gGeoIdentity);
784       voSaa1M->AddNode(voSaa1InnerTube, 1, new TGeoTranslation(0., 0., dzSaa1InnerTube + 0.9));               
785       TGeoVolumeAssembly* voSaa1 = new TGeoVolumeAssembly("YSAA1");
786       voSaa1->AddNode(voSaa1M, 1, gGeoIdentity);
787       
788 ///////////////////////////////////////
789 //          SAA1/SAA2  Pb Joint      //
790 //          Drawing ALIP2A__0081     //
791 ///////////////////////////////////////
792 //
793 // Outer radius
794       Float_t rOuSaa1Saa2      = 70.0/2.;
795 // Flange SAA1 side
796       Float_t dzSaa1Saa2F1     =  3.;
797       Float_t rInSaa1Saa2F1    = 58.5/2.;
798 // 1st Central Section
799       Float_t dzSaa1Saa2C1     = 19.3;
800       Float_t rInSaa1Saa2C1    = 42.8/2.;
801 // Transition Region
802       Float_t dzSaa1Saa2T      =  3.3;
803 // 1st Central Section
804       Float_t dzSaa1Saa2C2     =  6.2;
805       Float_t rInSaa1Saa2C2    = 36.2/2.;
806 // Flange SAA2 side
807       Float_t dzSaa1Saa2F2     =  3.1;
808       Float_t rInSaa1Saa2F2    = 54.1/2.;
809 // Total length
810       Float_t dzSaa1Saa2       = 34.9;
811       
812       
813       TGeoPcon* shSaa1Saa2Pb = new TGeoPcon(0., 360., 8);
814       z = 0.;
815 // Flange SAA1 side
816       shSaa1Saa2Pb->DefineSection( 0,  z, rInSaa1Saa2F1, rOuSaa1Saa2);
817       z += dzSaa1Saa2F1;
818       shSaa1Saa2Pb->DefineSection( 1,  z, rInSaa1Saa2F1, rOuSaa1Saa2);
819       shSaa1Saa2Pb->DefineSection( 2,  z, rInSaa1Saa2C1, rOuSaa1Saa2);
820 // Central region 1
821       z +=  dzSaa1Saa2C1;
822       shSaa1Saa2Pb->DefineSection( 3,  z, rInSaa1Saa2C1, rOuSaa1Saa2);
823 // 45 deg transition
824       z += dzSaa1Saa2T;
825       shSaa1Saa2Pb->DefineSection( 4, z, rInSaa1Saa2C2, rOuSaa1Saa2);
826       z += dzSaa1Saa2C2;
827       shSaa1Saa2Pb->DefineSection( 5, z, rInSaa1Saa2C2, rOuSaa1Saa2);
828       shSaa1Saa2Pb->DefineSection( 6, z, rInSaa1Saa2F2, rOuSaa1Saa2);
829       z += dzSaa1Saa2F2;
830       shSaa1Saa2Pb->DefineSection( 7, z, rInSaa1Saa2F2, rOuSaa1Saa2);
831       TGeoVolume* voSaa1Saa2Pb = new TGeoVolume("YSAA1SAA2Pb", shSaa1Saa2Pb, kMedPb);
832 //
833 //    Mother volume and outer steel envelope
834       Float_t rOuSaa1Saa2Steel = 36.9;
835       
836       TGeoPcon* shSaa1Saa2 = MakeShapeFromTemplate(shSaa1Saa2Pb, 0., rOuSaa1Saa2Steel-rOuSaa1Saa2);
837       TGeoVolume* voSaa1Saa2 = new TGeoVolume("YSAA1SAA2", shSaa1Saa2, kMedSteel);
838       voSaa1Saa2->AddNode(voSaa1Saa2Pb, 1, gGeoIdentity);
839 //
840 //    Inner region with higher transport cuts
841 //
842       TGeoPcon*   shSaa1Saa2I = MakeShapeFromTemplate(shSaa1Saa2Pb, 0., -3.);
843       TGeoVolume* voSaa1Saa2I = new TGeoVolume("YSAA1_SAA2I", shSaa1Saa2I, kMedPbSh);
844       voSaa1Saa2Pb->AddNode(voSaa1Saa2I, 1, gGeoIdentity);
845       
846
847
848 ///////////////////////////////////////
849 //                SAA2               //
850 ///////////////////////////////////////
851
852       
853 ///////////////////////////////////
854 //    SAA2 Steel Envelope        //
855 //    Drawing ALIP2A__0041       //
856 ///////////////////////////////////
857       dSt = 4.;  // Thickness of steel envelope
858       // Length of the first section
859       Float_t dzSaa2StEnv1  = 163.15;
860       Float_t rInSaa2StEnv1 = 65.8/2.;
861       // Length of the second section
862       Float_t dzSaa2StEnv2  = 340.35 - 4.;
863       Float_t rInSaa2StEnv2 = 87.2/2.;
864       // Rel. starting position 
865       Float_t zSaa2StEnv = 3.;
866       
867       TGeoPcon* shSaa2StEnv  = new TGeoPcon(0., 360., 6);
868       // First Section
869       z = zSaa2StEnv;
870       shSaa2StEnv->DefineSection( 0, z, rInSaa2StEnv1, rInSaa2StEnv1 + dSt);
871       z += dzSaa2StEnv1;
872       shSaa2StEnv->DefineSection( 1, z, rInSaa2StEnv1, rInSaa2StEnv1 + dSt);
873       // Transition region
874       shSaa2StEnv->DefineSection( 2, z, rInSaa2StEnv1, rInSaa2StEnv2 + dSt);           
875       z += dSt;
876       shSaa2StEnv->DefineSection( 3, z, rInSaa2StEnv1, rInSaa2StEnv2 + dSt);          
877       // Second section
878       shSaa2StEnv->DefineSection( 4, z, rInSaa2StEnv2, rInSaa2StEnv2 + dSt);           
879       z += dzSaa2StEnv2;
880       shSaa2StEnv->DefineSection( 5, z, rInSaa2StEnv2, rInSaa2StEnv2 + dSt);           
881
882       TGeoVolume* voSaa2StEnv  =  new TGeoVolume("YSAA2_SteelEnvelope", shSaa2StEnv, kMedSteel);
883
884
885 ///////////////////////////////////
886 //    SAA2 Pb Ring               //
887 //    Drawing ALIP2A__0080       //
888 //    Drawing ALIP2A__0111       //
889 ///////////////////////////////////
890 //
891 // Rel. position in z
892       Float_t zSaa2PbRing    = 35.25;  
893 // Length
894       Float_t dzSaa2PbRing   = 65.90;  
895 // Inner radius
896       Float_t rInSaa2PbRing  = 37.00;
897 // Outer radius at front
898       Float_t rOuSaa2PbRingF = 42.74;
899 // Outer Rradius at rear
900       Float_t rOuSaa2PbRingR = 44.58;      
901       
902       TGeoPcon* shSaa2PbRing  = new TGeoPcon(0., 360., 2);
903       z = zSaa2PbRing;
904       shSaa2PbRing->DefineSection(0, z, rInSaa2PbRing, rOuSaa2PbRingF);
905       z += dzSaa2PbRing;
906       shSaa2PbRing->DefineSection(1, z, rInSaa2PbRing, rOuSaa2PbRingR);
907
908       TGeoVolume* voSaa2PbRing  =  new TGeoVolume("YSAA2_PbRing", shSaa2PbRing, kMedPb);
909
910
911 ///////////////////////////////////
912 //    SAA2 Pb Components         //
913 //    Drawing ALIP2A__0079       //
914 ///////////////////////////////////
915       tanAlpha = TMath::Tan(1.89 / 2. * kDegRad);
916       TGeoPcon* shSaa2PbComp  = new TGeoPcon(0., 360., 16);
917       // Total length 
918       Float_t dzSaa2PbComp    = 512.;
919       // Length of 1st bellow recess
920       Float_t dzSaa2PbCompB1  =  24.;
921       // Length of 2nd bellow recess
922       Float_t dzSaa2PbCompB2   = 27.;
923       // Flange on the SAA1 side Detail A
924       // 1st Step
925       Float_t dzSaa2PbCompA1  =   1.5;
926       Float_t rInSaa2PbCompA1 =  43.0/2.;
927       Float_t rOuSaa2PbCompA1 =  53.0/2.;
928       // 2nd Step
929       Float_t dzSaa2PbCompA2  =   1.5;
930       Float_t rInSaa2PbCompA2 =  36.8/2.;
931       Float_t rOuSaa2PbCompA2 =  rOuSaa2PbCompA1;
932       // Straight section
933       Float_t dzSaa2PbCompA3  =  21.0;
934       Float_t rInSaa2PbCompA3 =  rInSaa2PbCompA2;
935       Float_t rOuSaa2PbCompA3 =  65.2/2.;
936       //
937       // 1st Section (outer straight, inner 1.89/2. deg opening cone)
938       // Length
939       Float_t dzSaa2PbComp1   = 146.15;
940       // Inner radius at the end 
941       Float_t rInSaa2PbComp1  = rInSaa2PbCompA3 + dzSaa2PbComp1 * tanAlpha;
942       // Outer radius
943       Float_t rOuSaa2PbComp1  = rOuSaa2PbCompA3;
944       //
945       // 2nd Section (outer straight, inner 1.89/2. deg opening cone)
946       // Length 
947       Float_t dzSaa2PbComp2   = (dzSaa2PbComp - dzSaa2PbComp1 - dzSaa2PbCompB1 - dzSaa2PbCompB2);
948       // Inner radius at the end 
949       Float_t rInSaa2PbComp2  = rInSaa2PbComp1 + dzSaa2PbComp2 * tanAlpha;
950       // Outer radius
951       Float_t rOuSaa2PbComp2  = 86.6/2.;
952       //
953       // Flange on the SAA3 side (Detail E)
954       //
955       // Straight Section
956       // Length  dzSaa2PbCompB2 - 8.8 = 27 - 8.8 = 18.2
957       Float_t dzSaa2PbCompE1  =  18.2;
958       Float_t rInSaa2PbCompE1 =  52.0/2.;
959       Float_t rOuSaa2PbCompE1 =  86.6/2.;
960       // 45 deg transition
961       Float_t dzSaa2PbCompE2  =   2.7;
962       // 1st Step
963       Float_t dzSaa2PbCompE3  =   0.6;
964       Float_t rInSaa2PbCompE3 =  52.0/2.+ dzSaa2PbCompE2;
965       Float_t rOuSaa2PbCompE3 =  83.0/2.;
966       // 2nd Step
967       Float_t dzSaa2PbCompE4  =   4.0;
968       Float_t rOuSaa2PbCompE4 =  61.6/2.;
969       // end
970       Float_t dzSaa2PbCompE5  =   1.5;
971
972
973       //
974       // Flange on SAA1 side (Detail A)
975       z = 0.;
976       // 1st Step
977       shSaa2PbComp->DefineSection(  0,  z, rInSaa2PbCompA1, rOuSaa2PbCompA1);
978       z += dzSaa2PbCompA1;
979       shSaa2PbComp->DefineSection(  1,  z, rInSaa2PbCompA1, rOuSaa2PbCompA1);
980       shSaa2PbComp->DefineSection(  2,  z, rInSaa2PbCompA2, rOuSaa2PbCompA2);
981       // 2nd Step
982       z += dzSaa2PbCompA2;
983       shSaa2PbComp->DefineSection(  3,  z, rInSaa2PbCompA2, rOuSaa2PbCompA2);
984       shSaa2PbComp->DefineSection(  4,  z, rInSaa2PbCompA3, rOuSaa2PbCompA3);
985       // straight section
986       z += dzSaa2PbCompA3;
987       shSaa2PbComp->DefineSection(  5,  z, rInSaa2PbCompA3, rOuSaa2PbCompA3);
988       //
989       // Section 1
990       z += dzSaa2PbComp1;
991       shSaa2PbComp->DefineSection(  6,  z, rInSaa2PbComp1, rOuSaa2PbComp1);
992       shSaa2PbComp->DefineSection(  7,  z, rInSaa2PbComp1, rOuSaa2PbComp2);
993       //
994       // Section 2
995       z += dzSaa2PbComp2;
996       shSaa2PbComp->DefineSection(  8,  z, rInSaa2PbComp2, rOuSaa2PbComp2);
997       //
998       // Flange SAA3 side (Detail E)
999       z += dzSaa2PbCompE1;
1000       shSaa2PbComp->DefineSection(  9,  z, rInSaa2PbCompE1, rOuSaa2PbCompE1);
1001       // 45 deg transition
1002       z += dzSaa2PbCompE2;
1003       shSaa2PbComp->DefineSection( 10,  z, rInSaa2PbCompE3, rOuSaa2PbCompE1);
1004       // 1st step
1005       z += dzSaa2PbCompE3;
1006       shSaa2PbComp->DefineSection( 11,  z, rInSaa2PbCompE3, rOuSaa2PbCompE1);
1007       shSaa2PbComp->DefineSection( 12,  z, rInSaa2PbCompE3, rOuSaa2PbCompE3);
1008       // 2nd step
1009       z += dzSaa2PbCompE4;
1010       shSaa2PbComp->DefineSection( 13,  z, rInSaa2PbCompE3, rOuSaa2PbCompE3);
1011       shSaa2PbComp->DefineSection( 14,  z, rInSaa2PbCompE3, rOuSaa2PbCompE4);
1012       // end
1013       z += dzSaa2PbCompE5;
1014       shSaa2PbComp->DefineSection( 15,  z, rInSaa2PbCompE3, rOuSaa2PbCompE4);
1015
1016       TGeoVolume* voSaa2PbComp  =  new TGeoVolume("YSAA2_PbComp", shSaa2PbComp, kMedPbSh);
1017
1018
1019 ///////////////////////////////////
1020 //    SAA2 Inner Tube            //
1021 //    Drawing ALIP2A__0083       //
1022 ///////////////////////////////////
1023 //
1024 //
1025 //
1026 // Length of saa2:               512.0 cm
1027 // Length of inner tube:         501.7 cm 
1028 // Lenth of bellow recess:        10.3 cm   ( 1.5 + 8.8) 
1029 // Radius at entrance 36.8/2,  d = 0.1
1030 // Radius at exit     52.0/2,  d = 0.1 
1031 //
1032       const Float_t kSaa2InnerTubeL     =  501.7;    // Length of the tube  
1033       const Float_t kSaa2InnerTubeRmin  =  36.6/2.;  // Radius at entrance
1034       const Float_t kSaa2InnerTubeRmax  =  51.8/2.;  // Radius at exit
1035       const Float_t kSaa2InnerTubeD     =   0.2   ;  // Thickness     
1036       TGeoPcon*   shSaa2InnerTube = new TGeoPcon(0., 360., 4);
1037       z = 0.;
1038       shSaa2InnerTube->DefineSection( 0, z, kSaa2InnerTubeRmin - kSaa2InnerTubeD, kSaa2InnerTubeRmin);
1039       z += dzSaa2PbCompA2 + dzSaa2PbCompA3;
1040       shSaa2InnerTube->DefineSection( 1, z, kSaa2InnerTubeRmin - kSaa2InnerTubeD, kSaa2InnerTubeRmin);
1041       z =  kSaa2InnerTubeL - dzSaa2PbCompE1;
1042       shSaa2InnerTube->DefineSection( 2, z, kSaa2InnerTubeRmax - kSaa2InnerTubeD, kSaa2InnerTubeRmax);
1043       z =  kSaa2InnerTubeL;
1044       shSaa2InnerTube->DefineSection( 3, z, kSaa2InnerTubeRmax - kSaa2InnerTubeD, kSaa2InnerTubeRmax);
1045       TGeoVolume* voSaa2InnerTube = new TGeoVolume("YSAA2_InnerTube", shSaa2InnerTube, kMedSteelSh);
1046       
1047 ///////////////////////////////////
1048 //    SAA2 Steel Ring            //
1049 //    Drawing ALIP2A__0042       //
1050 ///////////////////////////////////
1051       //  HalfWidth
1052       Float_t dzSaa2SteelRing = 2.;
1053       TGeoTube*   shSaa2SteelRing  = new TGeoTube(41.6, 47.6, dzSaa2SteelRing);
1054       TGeoVolume* voSaa2SteelRing  = new TGeoVolume("YSAA2_SteelRing", shSaa2SteelRing, kMedSteel);
1055
1056 ///////////////////////////////////
1057 //    SAA2 Outer Shape           //
1058 //    Drawing ALIP2A__0108       //
1059 ///////////////////////////////////
1060
1061       TGeoPcon* shSaa2  = new TGeoPcon(0., 360., 16);
1062       kSec = 0.02; // security distance to avoid trivial extrusions
1063       rmin = kSaa2InnerTubeRmin - kSaa2InnerTubeD - kSec;
1064       rmax = kSaa2InnerTubeRmax - kSaa2InnerTubeD - kSec;
1065       // Flange SAA1 side
1066       z = 0.;
1067       shSaa2->DefineSection( 0, z, rmin           , rOuSaa2PbCompA1);
1068       z += dzSaa2PbCompA1 + dzSaa2PbCompA2;
1069       shSaa2->DefineSection( 1, z, rmin           , rOuSaa2PbCompA1);
1070       shSaa2->DefineSection( 2, z, rmin           , rInSaa2StEnv1 + dSt);
1071       z += dzSaa2PbCompA3;
1072       shSaa2->DefineSection( 3, z, rmin           , rInSaa2StEnv1 + dSt);
1073       z = zSaa2PbRing;
1074       shSaa2->DefineSection( 4, z, 0.             , rInSaa2StEnv1 + dSt);
1075       shSaa2->DefineSection( 5, z, 0.             , rOuSaa2PbRingF);
1076       z += dzSaa2PbRing;
1077       shSaa2->DefineSection( 6, z, 0.             , rOuSaa2PbRingR);
1078       shSaa2->DefineSection( 7, z, 0.             , rInSaa2StEnv1 + dSt);
1079       z = dzSaa2PbCompA1 + dzSaa2PbCompA2 + dzSaa2StEnv1;
1080       shSaa2->DefineSection( 8, z, 0.             , rInSaa2StEnv1 + dSt);
1081       shSaa2->DefineSection( 9, z, 0.             , rInSaa2StEnv2 + dSt);
1082       z = dzSaa2PbComp - dzSaa2PbCompB2;
1083       shSaa2->DefineSection(10, z, rmax           , rInSaa2StEnv2 + dSt);
1084       z += dzSaa2PbCompE1;
1085       shSaa2->DefineSection(11, z, rmax           , rInSaa2StEnv2 + dSt);
1086       z += dzSaa2PbCompE2;
1087       shSaa2->DefineSection(12, z, rInSaa2PbCompE3, rInSaa2StEnv2 + dSt);
1088       z += (dzSaa2PbCompE3 + dzSaa2PbCompE4);
1089       shSaa2->DefineSection(13, z, rInSaa2PbCompE3, rInSaa2StEnv2 + dSt);
1090       shSaa2->DefineSection(14, z, rInSaa2PbCompE3, rOuSaa2PbCompE4);
1091       z += dzSaa2PbCompE5;
1092       shSaa2->DefineSection(15, z, rInSaa2PbCompE3, rOuSaa2PbCompE4);
1093
1094       TGeoVolume* voSaa2  =  new TGeoVolume("YSAA2", shSaa2, kMedAir);
1095       voSaa2->SetVisibility(0);
1096 // Inner 1.89/2 deg line
1097       Double_t zref   = dzSaa2PbCompA1 + dzSaa2PbCompA2 + dzSaa2PbCompA3;
1098       for (Int_t i  = 4; i < 10; i++) {
1099           Double_t zp = shSaa2->GetZ(i);
1100           Double_t r2 = shSaa2->GetRmax(i);      
1101           Double_t r1 = rmin + (zp -  zref) * TMath::Tan(1.89 / 2. * kDegRad) - kSec;
1102           shSaa2->DefineSection(i, zp, r1, r2);
1103       }
1104
1105 //
1106 //    Assemble SAA2
1107       voSaa2->AddNode(voSaa2StEnv,     1, gGeoIdentity);
1108       voSaa2->AddNode(voSaa2PbRing,    1, gGeoIdentity);
1109       voSaa2->AddNode(voSaa2PbComp,    1, gGeoIdentity);
1110       voSaa2->AddNode(voSaa2InnerTube, 1, new TGeoTranslation(0., 0., dzSaa2PbCompA1));
1111       z = (dzSaa2PbComp - dzSaa2PbCompE4 - dzSaa2PbCompE5) + dzSaa2SteelRing;
1112       voSaa2->AddNode(voSaa2SteelRing, 1, new TGeoTranslation(0., 0., z));
1113
1114
1115 ///////////////////////////////////////
1116 //                SAA3               //
1117 ///////////////////////////////////////
1118 //
1119 //
1120 //  This is a study performed by S. Maridor
1121 //  The SAA3 has not yet been designed !!!!!!!!
1122 //
1123 ///////////////////////////////////
1124 //    SAA3 Outer Shape           //
1125 //    Drawing ALIP2A__0288       //
1126 ///////////////////////////////////
1127       TGeoVolumeAssembly* voSaa3  = new TGeoVolumeAssembly("YSAA3");
1128 ///////////////////////////////////
1129 //    SAA3 Concrete cone         //
1130 //    Drawing ALIP2A__0284       //
1131 ///////////////////////////////////
1132 //    Block
1133       TGeoBBox* shSaa3CCBlockO   = new TGeoBBox(80./2., 80./2., 100./2.);
1134       shSaa3CCBlockO->SetName("Saa3CCBlockO");
1135
1136       TGeoPcon* shSaa3InnerRegion  = new TGeoPcon(0., 360., 4);
1137       shSaa3InnerRegion->DefineSection( 0, -60.0, 0., 27.1);
1138       shSaa3InnerRegion->DefineSection( 1, -23.0, 0., 27.1);
1139       shSaa3InnerRegion->DefineSection( 2,  29.1, 0., 12.3);
1140       shSaa3InnerRegion->DefineSection( 3,  60.0, 0., 12.3);
1141       shSaa3InnerRegion->SetName("Saa3InnerRegion");
1142
1143       TGeoCompositeShape* shSaa3CCBlock = new TGeoCompositeShape("Saa3CCBlock", "Saa3CCBlockO-Saa3InnerRegion");
1144       TGeoVolume* voSaa3CCBlock         = new TGeoVolume("YSAA3CCBlock", shSaa3CCBlock, kMedConcSh);     
1145
1146       
1147       voSaa3->AddNode(voSaa3CCBlock, 1, gGeoIdentity);
1148       
1149 //    Plate 1: 240 cm x 80 cm x 100 cm (x 2)
1150       TGeoVolume* voSaa3SteelPlate1  =  new TGeoVolume("YSAA3SteelPlate1", 
1151                                                        new TGeoBBox(240./2., 80./2., 100./2.),
1152                                                        kMedSteelSh);
1153       TGeoVolume* voSaa3SteelPlate11 =  new TGeoVolume("YSAA3SteelPlate11", 
1154                                                        new TGeoBBox(240./2., 80./2., 10./2.),
1155                                                        kMedSteel);
1156       voSaa3SteelPlate1->AddNode(voSaa3SteelPlate11, 1, new TGeoTranslation(0., 0., -45.));
1157       voSaa3->AddNode(voSaa3SteelPlate1, 1, new TGeoTranslation(0., +80., 0.));
1158       voSaa3->AddNode(voSaa3SteelPlate1, 2, new TGeoTranslation(0., -80., 0.));
1159
1160
1161 //    Plate 2:  80 cm x 80 cm x 100 cm (x 2)
1162       TGeoVolume* voSaa3SteelPlate2  =  new TGeoVolume("YSAA3SteelPlate2", 
1163                                                        new TGeoBBox( 80./2., 80./2., 100./2.),
1164                                                        kMedSteelSh);
1165       TGeoVolume* voSaa3SteelPlate21 =  new TGeoVolume("YSAA3SteelPlate21", 
1166                                                        new TGeoBBox( 80./2., 80./2., 10./2.),
1167                                                        kMedSteel);
1168       voSaa3SteelPlate2->AddNode(voSaa3SteelPlate21, 1, new TGeoTranslation(0., 0., -45.));
1169
1170       voSaa3->AddNode(voSaa3SteelPlate2, 1, new TGeoTranslation(+80, 0., 0.));
1171       voSaa3->AddNode(voSaa3SteelPlate2, 2, new TGeoTranslation(-80, 0., 0.));
1172
1173
1174 ///////////////////////////////////
1175 //    Muon Filter                //
1176 //    Drawing ALIP2A__0105       //
1177 ///////////////////////////////////
1178       // Half Length 
1179       Float_t dzMuonFilter = 60.;
1180       
1181       TGeoBBox*   shMuonFilterO  = new TGeoBBox(550./2., 620./2., dzMuonFilter);
1182       shMuonFilterO->SetName("FilterO");
1183       TGeoCombiTrans* trFilter = new TGeoCombiTrans("trFilter", 0., -dzMuonFilter * TMath::Tan(alhc * kDegrad), 0., rotlhc);
1184       trFilter->RegisterYourself();
1185       TGeoTube*   shMuonFilterI  = new TGeoTube(0., 48.8, dzMuonFilter + 20.);
1186       shMuonFilterI->SetName("FilterI");
1187       TGeoCompositeShape* shMuonFilter = new TGeoCompositeShape("MuonFilter", "FilterO-FilterI:trFilter");
1188       //
1189       // !!!!! Needs to be inclined
1190       TGeoVolume* voMuonFilter = new TGeoVolume("YMuonFilter", shMuonFilter, kMedCastiron);
1191
1192       // Inner part with higher transport cuts
1193       Float_t dzMuonFilterH = 50.;
1194       TGeoBBox*   shMuonFilterOH  = new TGeoBBox(550./2., 620./2., dzMuonFilterH);
1195       shMuonFilterOH->SetName("FilterOH");
1196       TGeoTube*   shMuonFilterIH  = new TGeoTube(0., 50., dzMuonFilterH + 5.);
1197       shMuonFilterIH->SetName("FilterIH");
1198       TGeoCompositeShape* shMuonFilterH = new TGeoCompositeShape("MuonFilterH", "FilterOH-FilterIH:trFilter");
1199       TGeoVolume* voMuonFilterH = new TGeoVolume("YMuonFilterH", shMuonFilterH, kMedCastironSh);
1200       voMuonFilter->AddNode(voMuonFilterH, 1, gGeoIdentity);
1201       
1202 //  
1203       TGeoVolumeAssembly* voSaa  = new TGeoVolumeAssembly("YSAA");
1204 //
1205 //    
1206 //    
1207 //
1208 //
1209 //    Starting position of the FA Flange/Tail 
1210       Float_t ziFaWTail   = 499.0;
1211 //    End of the FA Flange/Tail
1212       Float_t zoFaWTail   = ziFaWTail + dzFaWTail;
1213 //    Starting position of the FA/SAA1 Joint (2.8 cm overlap with tail)
1214       Float_t ozFaSaa1    = 2.8;
1215       Float_t ziFaSaa1    = zoFaWTail - ozFaSaa1;
1216 //    End of the FA/SAA1 Joint
1217       Float_t zoFaSaa1    = ziFaSaa1 +  dzFaSaa1;
1218 //    Starting position of SAA1 (2.0 cm overlap with joint)     
1219       Float_t ozSaa1      = 2.;
1220       Float_t ziSaa1      = zoFaSaa1 - ozSaa1;
1221 //    End of SAA1
1222       Float_t zoSaa1      = ziSaa1 + dzSaa1;
1223 //    Starting position of SAA1/SAA2 Joint (1.95 cm overlap with SAA1)
1224       Float_t ziSaa1Saa2  = zoSaa1 - 1.95;
1225 //    End of SAA1/SAA2 Joint
1226       Float_t zoSaa1Saa2  = ziSaa1Saa2 + dzSaa1Saa2;
1227 //    Starting position of SAA2 (3.1 cm overlap with the joint)
1228       Float_t ziSaa2      = zoSaa1Saa2 - 3.1;
1229 //    End of SAA2
1230       Float_t zoSaa2      = ziSaa2 + dzSaa2PbComp;
1231 //    Position of SAA3
1232       Float_t zcSaa3      = zoSaa2 + 50.;
1233 //    Position of the Muon Filter
1234       Float_t zcFilter    = 1465.9 + dzMuonFilter;
1235
1236       voSaa->AddNode(voFaWTail,    1, new TGeoTranslation(0., 0., ziFaWTail));
1237       voSaa->AddNode(voFaSaa1,     1, new TGeoTranslation(0., 0., ziFaSaa1));
1238       voSaa->AddNode(voSaa1 ,      1, new TGeoTranslation(0., 0., ziSaa1));
1239       voSaa->AddNode(voSaa1Saa2,   1, new TGeoTranslation(0., 0., ziSaa1Saa2 - 0.1));
1240       voSaa->AddNode(voSaa2 ,      1, new TGeoTranslation(0., 0., ziSaa2));
1241       voSaa->AddNode(voSaa3,       1, new TGeoTranslation(0., 0., zcSaa3));
1242       
1243
1244       TGeoRotation* rotxz  = new TGeoRotation("rotxz",   90.,   0., 90.,  90., 180., 0.);
1245       top->AddNode(voSaa, 1, new TGeoCombiTrans(0., 0., 0., rotxz));
1246 //
1247 //  Mother volume for muon stations 1+2 and shielding material placed between the quadrants
1248 //
1249       // Position of the dipole
1250       Float_t ziDipole = 741.;
1251       
1252       TGeoPcon* shYOUT1 = new TGeoPcon(0., 360., 24);
1253       Float_t eps = 1.e-2;
1254       // FA Tail Section
1255       for (Int_t iz =  1; iz < 9; iz++) {
1256           z = shFaWTail->GetZ(iz+1);
1257           if (iz == 8) z -= ozFaSaa1;
1258           shYOUT1->DefineSection(iz-1, z + ziFaWTail, shFaWTail->GetRmax(iz+1) + eps, 150.);
1259       }
1260       // FA-SAA1 Joint
1261       z = shYOUT1->GetZ(7);
1262       
1263       for (Int_t iz =  9; iz < 17; iz++) 
1264           shYOUT1->DefineSection(iz-1, z + shFaSaa1->GetZ(iz-9), shFaSaa1->GetRmax(iz-9) + eps, 150.);
1265
1266       z = shYOUT1->GetZ(15) - ozSaa1;
1267       // SAA1  - Dipole
1268       for (Int_t iz = 17; iz < 24; iz++) 
1269           shYOUT1->DefineSection(iz-1, z + shSaa1M->GetZ(iz-13), shSaa1M->GetRmax(iz-13) + eps, 150.); 
1270       // Distance between dipole and start of SAA1 2deg opening cone
1271       dz   = ziDipole - (zSaa1StEnv[0] - dSt + zSaa1StEnvS + ziSaa1);
1272       rOut = rOuSaa1StEnv2 + dz * TMath::Tan(2. * kDegRad);
1273       
1274       shYOUT1->DefineSection(23, ziDipole, rOut + eps, 150.);
1275
1276       InvertPcon(shYOUT1);
1277       TGeoVolume* voYOUT1 = new TGeoVolume("YOUT1", shYOUT1, kMedAirMu);
1278       voYOUT1->SetVisibility(0);
1279
1280       voYOUT1->AddNode(asSaa1ExtraShield, 1, new TGeoCombiTrans(0., 0., - (100.7 + 62.2 + saa1ExtraShieldL / 2. + ziFaWTail), rotxz));
1281       voYOUT1->AddNode(asFaExtraShield,   1, new TGeoCombiTrans(0., 0., - (16.41 - 1.46 + kFaWring2HWidth + ziFaWTail), rotxz));
1282       top->AddNode(voYOUT1, 1, gGeoIdentity);
1283 //
1284 //  Mother volume for muon stations 4+5 and trigger stations.
1285 //
1286       Float_t zoDipole = 1249.;
1287       
1288       TGeoPcon* shYOUT21 = new TGeoPcon(0., 360., 14);
1289       z =  zoDipole;
1290       shYOUT21->DefineSection(0, z,             rOuSaa1String,       375.);
1291 //    Start of SAA1-SAA2
1292       z = ziSaa1Saa2;
1293       shYOUT21->DefineSection(1, z,             rOuSaa1String,       375.);
1294       shYOUT21->DefineSection(2, z,             rOuSaa1Saa2Steel,    375.);
1295 //    End of SAA1-SAA2
1296       z = ziSaa2;
1297       shYOUT21->DefineSection(3, z,             rOuSaa1Saa2Steel,    375.);
1298 //    SAA2
1299       shYOUT21->DefineSection( 4, z,            rInSaa2StEnv1 + dSt, 375.);
1300       z = ziSaa2 + zSaa2PbRing;
1301       shYOUT21->DefineSection( 5, z,            rInSaa2StEnv1 + dSt, 375.);
1302 //    Pb Cone
1303       shYOUT21->DefineSection( 6, z,            rOuSaa2PbRingF,      375.);
1304       rmin = rOuSaa2PbRingF + (1380. - z) * TMath::Tan(1.6 * kDegRad);
1305       shYOUT21->DefineSection( 7, 1380., rmin, 375.);
1306       shYOUT21->DefineSection( 8, 1380., rmin, 375.);
1307       z = ziSaa2 + zSaa2PbRing + dzSaa2PbRing;
1308       shYOUT21->DefineSection( 9, z,            rOuSaa2PbRingR,      375.);
1309 //    Straight Sections
1310       shYOUT21->DefineSection(10, z,            rInSaa2StEnv1 + dSt, 460.);
1311       z = ziSaa2 + dzSaa2StEnv1;
1312       shYOUT21->DefineSection(11, z,            rInSaa2StEnv1 + dSt, 460.);
1313       shYOUT21->DefineSection(12, z,            rInSaa2StEnv2 + dSt, 460.);
1314       z += dzSaa2StEnv2;
1315       shYOUT21->DefineSection(13, z,            rInSaa2StEnv2 + dSt, 460.);
1316             
1317       InvertPcon(shYOUT21);
1318       shYOUT21->SetName("shYOUT21");
1319
1320       TGeoBBox* shYOUT22 = new TGeoBBox(460. , 200., 65. - 1.5);
1321       shYOUT22->SetName("shYOUT22");
1322       
1323       TGeoTranslation* tYOUT22 = new TGeoTranslation(0., -310. - 200., -zcFilter);
1324       tYOUT22->SetName("tYOUT22");
1325       tYOUT22->RegisterYourself();
1326       
1327
1328       TGeoCompositeShape* shYOUT2 = new TGeoCompositeShape("shYOUT2", "shYOUT21-shYOUT22:tYOUT22");
1329       
1330       TGeoVolume* voYOUT2 = new TGeoVolume("YOUT2", shYOUT2, kMedAirMu);
1331       voYOUT2->SetVisibility(1);
1332       voYOUT2->AddNode(voMuonFilter, 1, new TGeoCombiTrans(0., dzMuonFilter * TMath::Tan(alhc * kDegrad), -zcFilter, rotxzlhc));
1333       top->AddNode(voYOUT2, 1, gGeoIdentity);
1334 }
1335
1336 void AliSHILv3::Init()
1337 {
1338   //
1339   // Initialise the muon shield after it has been built
1340   //
1341   Int_t i;
1342   //
1343   if(AliLog::GetGlobalDebugLevel()>0) {
1344     printf("\n%s: ",ClassName());
1345     for(i=0;i<35;i++) printf("*");
1346     printf(" SHILv3_INIT ");
1347     for(i=0;i<35;i++) printf("*");
1348     printf("\n%s: ",ClassName());
1349     //
1350     // Here the SHIL initialisation code (if any!)
1351     for(i=0;i<80;i++) printf("*");
1352     printf("\n");
1353   }
1354 }
1355
1356 void AliSHILv3::InvertPcon(TGeoPcon* pcon)
1357 {
1358 //
1359 //  z -> -z
1360 // 
1361     Int_t nz = pcon->GetNz();
1362     Double_t* z    = new Double_t[nz];
1363     Double_t* rmin = new Double_t[nz];
1364     Double_t* rmax = new Double_t[nz];
1365
1366     Double_t*  z0    = pcon->GetZ();
1367     Double_t*  rmin0 = pcon->GetRmin();
1368     Double_t*  rmax0 = pcon->GetRmax();
1369     
1370     for (Int_t i = 0; i < nz; i++) {
1371         z[i] = z0[i];
1372         rmin[i] = rmin0[i];
1373         rmax[i] = rmax0[i];     
1374     }
1375     
1376     for (Int_t i = 0; i < nz; i++) {
1377         Int_t j = nz - i - 1;
1378         pcon->DefineSection(i, - z[j], rmin[j], rmax[j]);
1379     }
1380     
1381     delete[] z;
1382     delete[] rmin;
1383     delete[] rmax;
1384 }
1385
1386 TGeoPcon* AliSHILv3::MakeShapeFromTemplate(const TGeoPcon* pcon, Float_t drMin, Float_t drMax)
1387 {
1388     // 
1389     // Returns new shape based on a template changing
1390     // the inner radii by drMin and the outer radii by drMax.
1391     //
1392     Int_t nz = pcon->GetNz();
1393     TGeoPcon* cpcon = new TGeoPcon(0., 360., nz);
1394     for (Int_t i = 0; i < nz; i++) 
1395         cpcon->DefineSection(i, pcon->GetZ(i), pcon->GetRmin(i) + drMin, pcon->GetRmax(i) + drMax);
1396     return cpcon;
1397 }
1398
1399