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