]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STRUCT/AliPIPEv3.cxx
616d0c668b04caaf97c1e07a73a509f73dbeb259
[u/mrichter/AliRoot.git] / STRUCT / AliPIPEv3.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 //  Beam pipe class
20 //  This version uses TGeo
21 //  Author: A.Morsch
22 //-------------------------------------------------------------------------
23
24
25 #include <Riostream.h>
26
27 #include <TSystem.h>
28 #include <TVirtualMC.h>
29 #include <TGeoManager.h>
30 #include <TGeoVolume.h>
31 #include <TGeoTorus.h>
32 #include <TGeoTube.h>
33 #include <TGeoCone.h>
34 #include <TGeoPcon.h>
35 #include <TGeoBBox.h>
36 #include <TGeoXtru.h>
37 #include <TGeoCompositeShape.h>
38
39 #include "AliConst.h"
40 #include "AliMagF.h"
41 #include "AliPIPEv3.h"
42 #include "AliRun.h"
43 #include "AliLog.h"
44  
45 ClassImp(AliPIPEv3)
46  
47 //_____________________________________________________________________________
48 AliPIPEv3::AliPIPEv3()
49 {
50 // Constructor
51 }
52
53 //_____________________________________________________________________________
54 AliPIPEv3::AliPIPEv3(const char *name, const char *title)
55   : AliPIPE(name,title)
56 {
57 // Constructor
58 }
59
60  
61 //___________________________________________
62 void AliPIPEv3::CreateGeometry()
63 {
64     AliDebug(1,"Create PIPEv3 geometry");
65 //
66 //  Class describing the beam pipe geometry
67 //
68
69     Float_t dz, z, zsh, z0;
70 //
71 // Rotation Matrices
72 //
73     const Float_t  kDegRad = TMath::Pi() / 180.;
74 // Rotation by 180 deg
75     TGeoRotation* rot180        = new TGeoRotation("rot180", 90., 180.,  90.,  90., 180.,   0.);
76     TGeoRotation* rotyz         = new TGeoRotation("rotyz",  90., 180.,   0., 180.,  90.,  90.);
77     TGeoRotation* rotxz         = new TGeoRotation("rotxz",   0.,   0.,  90.,  90.,  90., 180.);
78     TGeoRotation* rot045        = new TGeoRotation("rot045", 90.,  45.,  90., 135.,   0.,   0.);
79     TGeoRotation* rot135        = new TGeoRotation("rot135", 90. ,135.,  90., 225.,   0.,   0.);
80     TGeoRotation* rot225        = new TGeoRotation("rot225", 90. ,225.,  90., 315.,   0.,   0.);
81     TGeoRotation* rot315        = new TGeoRotation("rot315", 90. ,315.,  90.,  45.,   0.,   0.);    
82 //
83 // Media
84     const TGeoMedium* kMedAir    =  gGeoManager->GetMedium("PIPE_AIR");
85     const TGeoMedium* kMedVac    =  gGeoManager->GetMedium("PIPE_VACUUM");    
86     const TGeoMedium* kMedInsu   =  gGeoManager->GetMedium("PIPE_INS_C0");    
87     const TGeoMedium* kMedSteel  =  gGeoManager->GetMedium("PIPE_INOX");        
88     const TGeoMedium* kMedBe     =  gGeoManager->GetMedium("PIPE_BE");       
89     const TGeoMedium* kMedCu     =  gGeoManager->GetMedium("PIPE_CU");        
90     const TGeoMedium* kMedKapton =  gGeoManager->GetMedium("PIPE_KAPTON");        
91     const TGeoMedium* kMedAco    =  gGeoManager->GetMedium("PIPE_ANTICORODAL");        
92 // Top volume
93     TGeoVolume* top    = gGeoManager->GetVolume("ALIC");
94 //
95 //
96 ////////////////////////////////////////////////////////////////////////////////     
97 //                                                                            //
98 //                                  The Central Vacuum system                 // 
99 //                                                                            //
100 ////////////////////////////////////////////////////////////////////////////////
101 //
102 //
103 //  The ALICE central beam-pipe according to drawing         LHCVC2C_0001 
104 //  Drawings of sub-elements:
105 //  
106 //  Pos 7 - Minimised Flange:                                LHCVFX_P0025
107 //  Pos 6 - Standard Flange:                                 STDVFUHV0009
108 //  Pos 8 - Bellow:                                          LHCVBX__0001
109 //
110 //  Absolute z-coordinates -82.0 - 400.0 cm 
111 //  Total length:                                          482.0 cm
112 //  It consists of 3 main parts:
113 //  CP/2 The flange on the non-absorber side:               36.5 cm  
114 //  CP/1 The central Be pipe:                              405.0 cm 
115 //  CP/3 The double-bellow and flange on the absorber side: 40.5 cm 
116 //
117 //
118
119 //
120 //
121 //  Starting position in z
122     const Float_t kCPz0      = -400.0;
123 //  Length of the CP/1 section
124     const Float_t kCP1Length =  405.0;    
125 //  Length of the CP/2 section    
126     const Float_t kCP2Length =   36.5;
127 //  Length of the CP/3 section    
128     const Float_t kCP3Length =   40.5;
129 //  Position of the CP/2 section    
130 //    const Float_t kCP2pos    = kCPz0 + kCP2Length / 2.;
131 //  Position of the CP/3 section
132     const Float_t kCP3pos    = kCPz0 + kCP2Length + kCP1Length + kCP3Length/2.;
133
134
135 ///////////////////
136 //      CP/1     //
137 ///////////////////
138 //  Inner and outer radii of the Be-section [Pos 1]
139     const Float_t kCP1BeRi                       = 2.90;
140     const Float_t kCP1BeRo                       = 2.98;
141     const Float_t kCP1KaRo                       = 2.99;    
142 //
143 // Be-Stainless Steel adaptor tube [Pos 2] at both ends of the Be-section. Length 5 cm
144     const Float_t kCP1BeStAdaptorLength          = 5.00;
145 //
146 // Bulge of the Be-Stainless Steel adaptor Tube [Pos 2]
147     const Float_t kCP1BeStRo                     = 3.05;
148 //
149 //  Length of bulge [Pos 2]
150     const Float_t kCP1BulgeLength                = 0.50;
151 //
152 //  Distance between bulges [Pos 2]
153     const Float_t kCP1BulgeBulgeDistance         = 1.00;
154 //
155 // Length of Be-pipe
156     const Float_t kCP1BeLength =  kCP1Length - 2. *  kCP1BeStAdaptorLength;
157
158 //    
159 // CP/1 Mother volume 
160     TGeoVolume* voCp1Mo = new TGeoVolume("CP1MO", 
161                                          new TGeoTube(0., kCP1BeStRo,  kCP1Length / 2.), 
162                                          kMedAir);
163     voCp1Mo->SetVisibility(0);
164     
165 /////////////////////////////////////////////
166 // CP/1 Be-Section                         //
167 /////////////////////////////////////////////
168     TGeoVolume* voCp1Vac = new TGeoVolume("CP1VAC", 
169                                           new TGeoTube(0., kCP1BeRi,  kCP1Length / 2.), 
170                                           kMedVac);
171     TGeoVolume* voCp1Be  = new TGeoVolume("CP1BE", 
172                                           new TGeoTube(0., kCP1BeRo,  kCP1BeLength / 2.), 
173                                           kMedBe);
174     // Outer Kapton foil
175     TGeoVolume* voCp1Ka  = new TGeoVolume("CP1KA", 
176                                           new TGeoTube(0., kCP1KaRo,  kCP1BeLength / 2.), 
177                                           kMedKapton);
178
179     voCp1Ka->AddNode(voCp1Be,  1, gGeoIdentity);
180     voCp1Be->AddNode(voCp1Vac, 1, gGeoIdentity);
181     voCp1Mo->AddNode(voCp1Ka,  1, gGeoIdentity);
182
183 /////////////////////////////////////////////
184 // CP/1 Be-Stainless Steel adaptor tube    //
185 /////////////////////////////////////////////
186     TGeoPcon* shCp1At = new TGeoPcon(0., 360., 8);
187 //  First Bulge 
188     z = - kCP1BeStAdaptorLength / 2.;
189     shCp1At->DefineSection(0, z, kCP1BeRi, kCP1BeStRo);
190     z += kCP1BulgeLength;
191     shCp1At->DefineSection(1, z, kCP1BeRi, kCP1BeStRo);
192     shCp1At->DefineSection(2, z, kCP1BeRi, kCP1BeRo);
193 //  Between the bulges
194     z += kCP1BulgeBulgeDistance;
195     shCp1At->DefineSection(3, z, kCP1BeRi, kCP1BeRo);
196     shCp1At->DefineSection(4, z, kCP1BeRi, kCP1BeStRo);
197 //  Second bulge
198     z += kCP1BulgeLength;
199     shCp1At->DefineSection(5, z, kCP1BeRi, kCP1BeStRo);
200     shCp1At->DefineSection(6, z, kCP1BeRi, kCP1BeRo);
201 //  Straight piece
202     z = kCP1BeStAdaptorLength / 2.;
203     shCp1At->DefineSection(7, z, kCP1BeRi, kCP1BeRo);
204 //
205     TGeoVolume* voCp1At = new TGeoVolume("CP1AT", shCp1At, kMedSteel);
206
207 //  Position adaptor tube at both ends
208     dz = kCP1Length / 2. -  kCP1BeStAdaptorLength / 2.;
209     voCp1Mo->AddNode(voCp1At,    1, new TGeoTranslation(0., 0., -dz));
210     voCp1Mo->AddNode(voCp1At,    2, new TGeoCombiTrans(0., 0.,  dz, rot180));
211     TGeoVolumeAssembly* voCp1 = new TGeoVolumeAssembly("Cp1");
212     voCp1->AddNode(voCp1Mo, 1, gGeoIdentity);
213     
214 //
215 ///////////////////
216 //      CP/2     //
217 ///////////////////
218 //
219 // Fixed Point tube [Pos 5]
220 //
221 // Inner and outer radii of the Stainless Steel pipe    
222     const Float_t kCP2StRi               =      2.90;
223     const Float_t kCP2StRo               =      2.98;
224 //  
225 // Transition to central Be-pipe (Bulge)   
226 // Length
227     const Float_t kCP2BulgeLength        =      0.80;
228 //     
229 // Bulge outer radius
230     const Float_t kCP2BulgeRo            =      3.05;
231 //
232 // Fixed Point at z = 391.7 (IP)
233 //
234 // Position of fixed point
235     const Float_t kCP2FixedPointZ        =      8.30;
236 //
237 // Outer radius of fixed point
238     const Float_t kCP2FixedPointRo       =      3.50;
239 //
240 // Length of fixed point
241     const Float_t kCP2FixedPointLength   =      0.60;
242 //
243 // Fixed Flange [Pos 6]    
244 //
245 // Fixed flange outer radius
246     const Float_t kCP2FixedFlangeRo      =      7.60;
247 //
248 // Fixed flange inner radius
249     const Float_t kCP2FixedFlangeRi      =      3.00;
250 // Fixed flange inner radius bulge
251     const Float_t kCP2FixedFlangeBulgeRi =      2.90;
252 // Fixed flange lengths of sections at inner radius
253     const Float_t kCP2FixedFlangeRecessLengths[3] ={1., 0.08, 0.9};
254 // Fixed flange length
255     const Float_t kCP2FixedFlangeLength =       1.98;
256 //
257 // Fixed flange bulge
258 // Outer radius
259      const Float_t kCP2FixedFlangeBulgeRo =     3.00;
260 //
261 // Length    
262      const Float_t kCP2FixedFlangeBulgeLength = 2.00;
263
264 //
265 // CP/2 Mother Volume
266 //
267     TGeoPcon* shCp2Mo = new TGeoPcon(0., 360., 14);
268 //  Flange
269     z = - kCP2Length / 2.;
270     shCp2Mo->DefineSection( 0, z, kCP2FixedFlangeRi, kCP2FixedFlangeRo);
271     z +=  kCP2FixedFlangeRecessLengths[0];
272     shCp2Mo->DefineSection( 1, z, kCP2FixedFlangeRi, kCP2FixedFlangeRo);
273     shCp2Mo->DefineSection( 2, z, 0.,                kCP2FixedFlangeRo);
274     z +=  (kCP2FixedFlangeRecessLengths[1] + kCP2FixedFlangeRecessLengths[2]) ;
275     shCp2Mo->DefineSection( 3, z, 0., kCP2FixedFlangeRo);
276 //  Straight section between Flange and Fixed Point
277     shCp2Mo->DefineSection( 4, z, 0., kCP2FixedFlangeBulgeRo);
278     z += kCP2FixedFlangeBulgeLength;
279     shCp2Mo->DefineSection( 5, z, 0., kCP2FixedFlangeBulgeRo);
280     shCp2Mo->DefineSection( 6, z, 0., kCP2StRo);
281     z =  - kCP2Length / 2 +  kCP2FixedPointZ - kCP2FixedPointLength / 2.;
282     shCp2Mo->DefineSection( 7, z, 0., kCP2StRo);
283 //  Fixed Point
284     shCp2Mo->DefineSection( 8, z, 0., kCP2FixedPointRo);
285     z +=  kCP2FixedPointLength;
286     shCp2Mo->DefineSection( 9, z, 0., kCP2FixedPointRo);
287 //  Straight section between Fixed Point and transition bulge
288     shCp2Mo->DefineSection(10, z, 0., kCP2StRo);
289     z  =  kCP2Length / 2. - kCP2BulgeLength;
290     shCp2Mo->DefineSection(11, z, 0., kCP2StRo);
291     shCp2Mo->DefineSection(12, z, 0., kCP2BulgeRo);
292     z = kCP2Length / 2.;
293     shCp2Mo->DefineSection(13, z, 0., kCP2BulgeRo);
294     
295     TGeoVolume* voCp2Mo = new TGeoVolume("CP2MO", shCp2Mo, kMedAir);
296     voCp2Mo->SetVisibility(0);
297 //
298 // CP/1 Vacuum
299     TGeoTube*   shCp2Va = new TGeoTube(0., kCP2StRi, (kCP2Length - kCP2FixedFlangeRecessLengths[0])/2.);
300     TGeoVolume* voCp2Va = new TGeoVolume("CP2VA", shCp2Va, kMedVac);
301     
302     voCp2Mo->AddNode(voCp2Va, 1, new TGeoTranslation(0., 0., kCP2FixedFlangeRecessLengths[0]/2.));
303     
304 /////////////////////////////////////////////
305 //  CP/2 Fixed Flange [Pos 6]              //
306 /////////////////////////////////////////////
307
308     TGeoPcon* shCp2Fl = new TGeoPcon(0., 360., 6);
309     z = - kCP2FixedFlangeLength / 2.;
310     shCp2Fl->DefineSection(0, z, kCP2FixedFlangeRi,      kCP2FixedFlangeRo);
311     z +=  kCP2FixedFlangeRecessLengths[0];
312     shCp2Fl->DefineSection(1, z, kCP2FixedFlangeRi,      kCP2FixedFlangeRo);
313     shCp2Fl->DefineSection(2, z, kCP2FixedFlangeBulgeRi, kCP2FixedFlangeRo);
314     z +=  kCP2FixedFlangeRecessLengths[1];
315     shCp2Fl->DefineSection(3, z, kCP2FixedFlangeBulgeRi, kCP2FixedFlangeRo);
316     shCp2Fl->DefineSection(4, z, kCP2FixedFlangeRi,      kCP2FixedFlangeRo);
317     z = kCP2FixedFlangeLength / 2.;
318     shCp2Fl->DefineSection(5, z, kCP2FixedFlangeRi,      kCP2FixedFlangeRo);
319     TGeoVolume* voCp2Fl = new TGeoVolume("CP2FL", shCp2Fl, kMedSteel);
320 // 
321     dz =  - kCP2Length / 2. +  kCP2FixedFlangeLength / 2.;
322     voCp2Mo->AddNode(voCp2Fl, 1, new TGeoTranslation(0., 0., dz));
323
324
325 /////////////////////////////////////////////////////////////
326 //  CP/2 Beam pipe with fixed point and transition bulges  //
327 /////////////////////////////////////////////////////////////
328     TGeoPcon* shCp2Pi = new TGeoPcon(0., 360., 10);
329 //  Bulge at transition to flange 
330     z =  - (kCP2Length -  kCP2FixedFlangeRecessLengths[0] - kCP2FixedFlangeRecessLengths[1]) / 2.;
331     z0 = z;
332     shCp2Pi->DefineSection(0, z, kCP2StRi, kCP2FixedFlangeBulgeRo);
333     z += kCP2FixedFlangeBulgeLength;
334     shCp2Pi->DefineSection(1, z, kCP2StRi, kCP2FixedFlangeBulgeRo);
335 //  Straight section between Bulge and Fixed Point
336     shCp2Pi->DefineSection(2, z, kCP2StRi, kCP2StRo);
337     z  += (kCP2FixedPointZ - kCP2FixedPointLength / 2. - kCP2FixedFlangeRecessLengths[0]
338            - kCP2FixedFlangeRecessLengths[1] - 
339         kCP2FixedFlangeBulgeLength);
340     shCp2Pi->DefineSection(3, z, kCP2StRi, kCP2StRo);
341 //  Fixed Point
342     shCp2Pi->DefineSection(4, z, kCP2StRi, kCP2FixedPointRo);
343     z +=  kCP2FixedPointLength;
344     shCp2Pi->DefineSection(5, z, kCP2StRi, kCP2FixedPointRo);
345 //  Straight section between Fixed Point and transition bulge
346     shCp2Pi->DefineSection(6, z, kCP2StRi, kCP2StRo);
347     z = - shCp2Pi->GetZ(0) - kCP2BulgeLength;
348     shCp2Pi->DefineSection(7, z, kCP2StRi, kCP2StRo);
349 //  Bulge at transition to Be pipe
350     shCp2Pi->DefineSection(8, z, kCP2StRi, kCP2BulgeRo);
351     z = - shCp2Pi->GetZ(0);
352     shCp2Pi->DefineSection(9, z, kCP2StRi, kCP2BulgeRo);
353
354     TGeoVolume* voCp2Pi = new TGeoVolume("CP2PI", shCp2Pi, kMedSteel);
355     dz = (kCP2FixedFlangeRecessLengths[0] + kCP2FixedFlangeRecessLengths[1]) / 2.;
356     voCp2Mo->AddNode(voCp2Pi, 1, new TGeoTranslation(0., 0., dz));
357
358 //
359 //  Central beam pipe support collars
360 //  LHCVC2C_0019
361 //  Position at z = -46., 40., 150.
362     TGeoVolume* voCpSupC = new TGeoVolume("CpSupC", new TGeoTube(3.0, 4.0, 0.35), kMedAco);
363     voCp1->AddNode(voCpSupC, 1, new TGeoTranslation(0., 0.,  kCP1Length / 2. - 81.5));
364     voCp1->AddNode(voCpSupC, 2, new TGeoTranslation(0., 0.,  kCP1Length / 2.- 191.5));
365 //  Beam Pipe Protection Tube
366 //
367 //  ALIFWDA_0025
368 //    
369 //  Plaque de Centrage  ALIFWDA_0019
370     const Float_t kFwdaBPPTXL = 3.;
371     TGeoXtru* shFwdaBPPTX = new TGeoXtru(2);
372     Double_t xBPPTX[8] = {12.5,  7.5, -7.5, -12.5, -12.5,  -7.5,   7.5, 12.5};
373     Double_t yBPPTX[8] = { 7.0, 12.0, 12.0,  7.0, -7.0, -12.0, -12.0,  -7.0};
374     shFwdaBPPTX->DefinePolygon(8, xBPPTX, yBPPTX);
375     shFwdaBPPTX->DefineSection(0, 0.,         0., 0., 1.);
376     shFwdaBPPTX->DefineSection(1, kFwdaBPPTXL, 0., 0., 1.);
377     shFwdaBPPTX->SetName("FwdaBPPTX");
378     TGeoTube* shFwdaBPPTY = new TGeoTube(0., 8.5, 3.2);
379     shFwdaBPPTY->SetName("FwdaBPPTY");
380     TGeoCompositeShape*  shFwdaBPPTPC = new TGeoCompositeShape("shFwdaBPPTPC", "FwdaBPPTX-FwdaBPPTY");
381     TGeoVolume* voFwdaBPPTPC =  new TGeoVolume("FwdaBPPTPC", shFwdaBPPTPC, kMedAco);
382 //    
383 //  Tube  ALIFWDA_0020  
384 //    const Float_t kFwdaBPPTTL = 48.;
385     const Float_t kFwdaBPPTTL = 35.;
386     TGeoVolume* voFwdaBPPTT =  new TGeoVolume("FwdaBPPTT", new TGeoTube(8.85, 9.0, kFwdaBPPTTL/2.), kMedAco);
387     TGeoVolumeAssembly* voFwdaBPPT = new TGeoVolumeAssembly("FwdaBPPT");
388     voFwdaBPPT->AddNode(voFwdaBPPTPC, 1, gGeoIdentity);
389     voFwdaBPPT->AddNode(voFwdaBPPTT,  1, new TGeoTranslation(0., 0., kFwdaBPPTTL/2. + kFwdaBPPTXL));
390
391     
392 //  BeamPipe and T0A Support
393 //
394 //  ALIFWDA_0033
395 //    
396 //  Support  Plate ALIFWDA_0026
397     const Float_t kFwdaBPSPL = 4.0;
398     TGeoXtru* shFwdaBPSPX = new TGeoXtru(2);
399     Double_t xBPSPX[8] = {10.0,  6.0 , -6.0, -10.0, -10.0,  -6.0,   6.0, 10.0};
400     Double_t yBPSPX[8] = { 6.0, 10.0,  10.0,   6.0, - 6.0, -10.0, -10.0, -6.0};
401     shFwdaBPSPX->DefinePolygon(8, xBPSPX, yBPSPX);
402     shFwdaBPSPX->DefineSection(0, 0.,         0., 0., 1.);
403     shFwdaBPSPX->DefineSection(1, kFwdaBPSPL, 0., 0., 1.);
404     shFwdaBPSPX->SetName("FwdaBPSPX");
405     TGeoPcon* shFwdaBPSPY = new TGeoPcon(0., 360., 6);
406     shFwdaBPSPY->DefineSection(0, -1.00, 0., 5.5);
407     shFwdaBPSPY->DefineSection(1,  3.50, 0., 5.5);    
408     shFwdaBPSPY->DefineSection(2,  3.50, 0., 5.0);    
409     shFwdaBPSPY->DefineSection(3,  3.86, 0., 5.0);    
410     shFwdaBPSPY->DefineSection(4,  3.86, 0., 5.5);    
411     shFwdaBPSPY->DefineSection(5,  5.00, 0., 5.5);    
412     shFwdaBPSPY->SetName("FwdaBPSPY");
413     TGeoCompositeShape*  shFwdaBPSP = new TGeoCompositeShape("shFwdaBPSP", "FwdaBPSPX-FwdaBPSPY");
414     TGeoVolume* voFwdaBPSP =  new TGeoVolume("FwdaBPSP", shFwdaBPSP, kMedAco);
415 //    
416 //  Flasque  ALIFWDA_00027
417
418
419     const Float_t kFwdaBPSTTRi  =  7.6/2.;
420     const Float_t kFwdaBPSTTRo1 = 13.9/2.;
421     const Float_t kFwdaBPSTTRo2 =  8.2/2.;
422     const Float_t kFwdaBPSTTRo3 =  9.4/2.;
423     
424     TGeoPcon* shFwdaBPSFL = new TGeoPcon(0., 360., 8);
425     z = 0., 
426     shFwdaBPSFL->DefineSection(0, z, kFwdaBPSTTRi, kFwdaBPSTTRo1);
427     z += 0.64;
428     shFwdaBPSFL->DefineSection(1, z, kFwdaBPSTTRi, kFwdaBPSTTRo1);
429     shFwdaBPSFL->DefineSection(2, z, kFwdaBPSTTRi, kFwdaBPSTTRo2);
430     z += 2.55;
431     shFwdaBPSFL->DefineSection(3, z, kFwdaBPSTTRi, kFwdaBPSTTRo2);
432     shFwdaBPSFL->DefineSection(4, z, kFwdaBPSTTRi, kFwdaBPSTTRo3);
433     z += 0.4;
434     shFwdaBPSFL->DefineSection(5, z, kFwdaBPSTTRi, kFwdaBPSTTRo3);
435     shFwdaBPSFL->DefineSection(6, z, kFwdaBPSTTRi, kFwdaBPSTTRo2);
436     z += 1.2;
437     shFwdaBPSFL->DefineSection(7, z, kFwdaBPSTTRi, kFwdaBPSTTRo2);
438
439     TGeoVolume* voFwdaBPSFL =  new TGeoVolume("FwdaBPSFL", shFwdaBPSFL, kMedAco);
440
441     
442     //
443     // Cable support 
444     TGeoBBox* shFwdaBPSCSa = new TGeoBBox(3.0, 8.75, 0.5);
445     shFwdaBPSCSa->SetName("FwdaBPSCSa");
446     TGeoBBox* shFwdaBPSCSb = new TGeoBBox(1.25, 4.00, 1.0);
447     shFwdaBPSCSb->SetName("FwdaBPSCSb");   
448     TGeoTranslation* tFwdaBPSCSb = new TGeoTranslation(0., 5.25 - 8.75, 0.);
449     tFwdaBPSCSb->SetName("tFwdaBPSCSb");
450     tFwdaBPSCSb->RegisterYourself();
451     TGeoBBox* shFwdaBPSCSc = new TGeoBBox(3.0, 0.50, 0.70);
452     shFwdaBPSCSc->SetName("FwdaBPSCSc");
453     TGeoTranslation* tFwdaBPSCSc = new TGeoTranslation(0., 0.5 - 8.75, 1.2);
454     tFwdaBPSCSc->SetName("tFwdaBPSCSc");
455     tFwdaBPSCSc->RegisterYourself();
456     TGeoCompositeShape* shFwdaBPSCS = new TGeoCompositeShape("shFwdaBPSCS", "(FwdaBPSCSa-FwdaBPSCSb:tFwdaBPSCSb)+FwdaBPSCSc:tFwdaBPSCSc");
457     TGeoVolume* voFwdaBPSCS = new TGeoVolume("FwdaBPSCS", shFwdaBPSCS, kMedAco);
458     
459     
460     // Assembling the beam pipe support 
461     TGeoVolumeAssembly* voFwdaBPS = new TGeoVolumeAssembly("FwdaBPS");
462     voFwdaBPS->AddNode(voFwdaBPSP,   1,  new TGeoCombiTrans(0., 0., 0., rot045));
463     voFwdaBPS->AddNode(voFwdaBPSFL,  1,  new TGeoTranslation(0., 0., kFwdaBPSPL));
464     const Float_t kFwdaBPSCSdy = 18.75/TMath::Sqrt(2.);
465     
466     voFwdaBPS->AddNode(voFwdaBPSCS,  1,  new TGeoCombiTrans(- kFwdaBPSCSdy,   kFwdaBPSCSdy, 2., rot045));
467     voFwdaBPS->AddNode(voFwdaBPSCS,  2,  new TGeoCombiTrans(- kFwdaBPSCSdy, - kFwdaBPSCSdy, 2., rot135));
468     voFwdaBPS->AddNode(voFwdaBPSCS,  3,  new TGeoCombiTrans(  kFwdaBPSCSdy, - kFwdaBPSCSdy, 2., rot225));
469     voFwdaBPS->AddNode(voFwdaBPSCS,  4,  new TGeoCombiTrans(  kFwdaBPSCSdy,   kFwdaBPSCSdy, 2., rot315));
470
471     TGeoVolumeAssembly* voCp2 = new TGeoVolumeAssembly("CP2");
472     voCp2->AddNode(voCp2Mo, 1, gGeoIdentity);
473     voCp2->AddNode(voFwdaBPPT, 1, new TGeoTranslation(0., 0., -kCP2Length / 2. + 13.8));
474     voCp2->AddNode(voFwdaBPS,  1, new TGeoTranslation(0., 0., -kCP2Length / 2. +  5.1));
475
476 //
477 ///////////////////
478 //      CP/3     //
479 ///////////////////
480 //
481 // Adaptor tube [Pos 4]
482 // 
483 // Adaptor tube length 
484     const Float_t  kCP3AdaptorTubeLength            =  5.50;
485 //
486 // Inner and outer radii
487      const Float_t kCP3AdaptorTubeRi                =  2.92;
488      const Float_t kCP3AdaptorTubeRo                =  3.00;
489 //
490 // Bulge at transition point
491 // Inner and outer radii
492      const Float_t kCP3AdaptorTubeBulgeRi           =  2.90;
493      const Float_t kCP3AdaptorTubeBulgeRo           =  3.05;    
494 //
495 // Length of bulge
496     const Float_t  kCP3AdaptorTubeBulgeLength       =  0.80;
497 //
498 // Bellow [Pos 8]
499 //
500 //  Total length    
501     const Float_t kCP3BellowLength                  = 13.00;
502 //  Outer Radius
503     const Float_t kCP3BellowRo                      =  3.6;
504 //  Inner Radius 
505     const Float_t kCP3BellowRi                      =  2.8;
506 //  Number of plies
507     const Int_t   kCP3NumberOfPlies                 = 18;
508 //  Length of undulated region
509     const Float_t kCP3BellowUndulatedLength         =  8.30; 
510 //  Plie thickness
511     const Float_t kCP3PlieThickness                 =  0.02;   
512 //  Connection Plie radies (at transition been undulated region and beam pipe)
513     const Float_t kCP3ConnectionPlieR               =  0.21;
514 //  Plie radius
515 //  const Float_t kCP3PlieR = 0.118286;
516     const Float_t kCP3PlieR = 
517         (kCP3BellowUndulatedLength - 4. *  kCP3ConnectionPlieR + 2. * kCP3PlieThickness + 
518          (2. *  kCP3NumberOfPlies - 2.) * kCP3PlieThickness) / (4. * kCP3NumberOfPlies - 2.);
519 //  Length of connection pipe
520     const Float_t kCP3BellowConnectionLength        =  2.35;
521 //
522 //  Tube between bellows [Pos 3]  
523 //    
524 //  Length of tube
525     const Float_t kCP3TubeLength                    =  4.00;
526 //
527 //  Minimised fixed flange [Pos 7]
528 //  
529 //  Length of flange connection tube
530     const Float_t kCP3FlangeConnectorLength         =  5.0 - 1.4;
531 //  Length of Flange
532     const Float_t kCP3FlangeLength                  =  1.40;
533 //  Outer radius    
534     const Float_t kCP3FlangeRo                      =  4.30;
535
536 //
537 // CP/3 Mother volume
538 //
539     TGeoPcon* shCp3Mo = new TGeoPcon(0., 360., 12);
540 //  From transition to first bellow
541     z = - kCP3Length / 2.;
542     shCp3Mo->DefineSection( 0, z, 0., kCP3AdaptorTubeBulgeRo);
543     z += kCP3BellowConnectionLength + kCP3AdaptorTubeLength;
544     shCp3Mo->DefineSection( 1, z, 0., kCP3AdaptorTubeBulgeRo);
545 //  First Bellow
546     shCp3Mo->DefineSection( 2, z, 0., kCP3BellowRo);
547     z +=  kCP3BellowUndulatedLength;
548     shCp3Mo->DefineSection( 3, z, 0., kCP3BellowRo);
549 //  Connection between the two bellows
550     shCp3Mo->DefineSection( 4, z, 0., kCP3AdaptorTubeBulgeRo);
551     z +=  2. * kCP3BellowConnectionLength + kCP3TubeLength;
552     shCp3Mo->DefineSection( 5, z, 0., kCP3AdaptorTubeBulgeRo);
553 //  Second bellow
554     shCp3Mo->DefineSection( 6, z, 0., kCP3BellowRo);
555     z += kCP3BellowUndulatedLength;
556     shCp3Mo->DefineSection( 7, z, 0., kCP3BellowRo);
557 //  Pipe between second Bellow and Flange
558     shCp3Mo->DefineSection( 8, z, 0., kCP3AdaptorTubeBulgeRo);
559     z +=  kCP3BellowConnectionLength +  kCP3FlangeConnectorLength;
560     shCp3Mo->DefineSection( 9, z, 0., kCP3AdaptorTubeBulgeRo);
561 //  Flange 
562     shCp3Mo->DefineSection(10, z, 0., kCP3FlangeRo);
563     z = -shCp3Mo->GetZ(0);
564     shCp3Mo->DefineSection(11, z, 0., kCP3FlangeRo);
565 //
566     TGeoVolume* voCp3Mo = new TGeoVolume("CP3MO", shCp3Mo, kMedAir);
567     voCp3Mo->SetVisibility(0);
568     TGeoVolumeAssembly* voCp3 = new TGeoVolumeAssembly("Cp3");
569     voCp3->AddNode(voCp3Mo,  1, gGeoIdentity);
570     voCp3->AddNode(voCpSupC, 3, new TGeoTranslation(0., 0., - kCP3Length / 2. + 4.5));
571     dz = kCP3pos;
572
573 //////////////////////////////////////////////
574 // CP/3 Adaptor tube                        // 
575 //////////////////////////////////////////////
576     TGeoPcon* shCp3AtV = new TGeoPcon(0., 360., 4);
577 //  Bulge at transition
578     z =  - kCP3AdaptorTubeLength / 2.;
579     shCp3AtV->DefineSection(0, z, 0., kCP3AdaptorTubeBulgeRo);
580     z += kCP3AdaptorTubeBulgeLength;
581     shCp3AtV->DefineSection(1, z, 0., kCP3AdaptorTubeBulgeRo);
582 //  Tube
583     shCp3AtV->DefineSection(2, z, 0., kCP3AdaptorTubeRo);
584     z =  + kCP3AdaptorTubeLength / 2.;
585     shCp3AtV->DefineSection(3, z, 0., kCP3AdaptorTubeRo);
586
587     TGeoVolume* voCp3AtV = new TGeoVolume("CP3ATV", shCp3AtV, kMedVac);
588
589     TGeoPcon* shCp3AtS = new TGeoPcon(0., 360., 4);
590 //  Bulge at transition
591     shCp3AtS->DefineSection(0, shCp3AtV->GetZ(0), kCP3AdaptorTubeBulgeRi, kCP3AdaptorTubeBulgeRo);
592     shCp3AtS->DefineSection(1, shCp3AtV->GetZ(1), kCP3AdaptorTubeBulgeRi, kCP3AdaptorTubeBulgeRo);
593 //  Tube
594     shCp3AtS->DefineSection(2, shCp3AtV->GetZ(2), kCP3AdaptorTubeRi,      kCP3AdaptorTubeRo);
595     shCp3AtS->DefineSection(3, shCp3AtV->GetZ(3), kCP3AdaptorTubeRi ,     kCP3AdaptorTubeRo);
596     TGeoVolume* voCp3AtS = new TGeoVolume("CP3ATS", shCp3AtS, kMedSteel);
597
598     voCp3AtV->AddNode(voCp3AtS, 1, gGeoIdentity);
599     dz = - kCP3Length / 2. +  kCP3AdaptorTubeLength / 2.;
600     voCp3Mo->AddNode(voCp3AtV, 1, new TGeoTranslation(0., 0., dz));
601
602 /////////////////////////////////
603 // CP/3 Bellow section         //
604 /////////////////////////////////
605
606 //
607 //  Upper part of the undulation
608     TGeoTorus* plieTorusUO =  new TGeoTorus(kCP3BellowRo - kCP3PlieR, 0. , kCP3PlieR);
609     plieTorusUO->SetName("TorusUO");
610     TGeoTorus* plieTorusUI =  new TGeoTorus(kCP3BellowRo - kCP3PlieR, kCP3PlieR - kCP3PlieThickness, kCP3PlieR);
611     plieTorusUI->SetName("TorusUI");
612     TGeoTube*  plieTubeU   =  new TGeoTube (kCP3BellowRo - kCP3PlieR, kCP3BellowRo, kCP3PlieR);
613     plieTubeU->SetName("TubeU");
614     
615     TGeoCompositeShape*  shUpperPlieO = new TGeoCompositeShape("upperPlieO", "TorusUO*TubeU");
616     TGeoCompositeShape*  shUpperPlieI = new TGeoCompositeShape("upperPlieI", "TorusUI*TubeU");
617  
618     TGeoVolume* voWiggleUO = new TGeoVolume("CP3WUO", shUpperPlieO, kMedVac);
619     TGeoVolume* voWiggleUI = new TGeoVolume("CP3WUI", shUpperPlieI, kMedSteel);
620     voWiggleUO->AddNode(voWiggleUI, 1,  gGeoIdentity);    
621 //
622 // Lower part of the undulation
623     TGeoTorus* plieTorusLO =  new TGeoTorus(kCP3BellowRi + kCP3PlieR, 0. , kCP3PlieR);
624     plieTorusLO->SetName("TorusLO");
625     TGeoTorus* plieTorusLI =  new TGeoTorus(kCP3BellowRi + kCP3PlieR, kCP3PlieR - kCP3PlieThickness, kCP3PlieR);
626     plieTorusLI->SetName("TorusLI");
627     TGeoTube*  plieTubeL   =  new TGeoTube (kCP3BellowRi, kCP3BellowRi + kCP3PlieR, kCP3PlieR);
628     plieTubeL->SetName("TubeL");
629
630     TGeoCompositeShape*  shLowerPlieO = new TGeoCompositeShape("lowerPlieO", "TorusLO*TubeL");
631     TGeoCompositeShape*  shLowerPlieI = new TGeoCompositeShape("lowerPlieI", "TorusLI*TubeL");
632
633     TGeoVolume* voWiggleLO = new TGeoVolume("CP3WLO", shLowerPlieO, kMedVac);
634     TGeoVolume* voWiggleLI = new TGeoVolume("CP3WLI", shLowerPlieI, kMedSteel);
635     voWiggleLO->AddNode(voWiggleLI, 1,  gGeoIdentity);    
636
637 //
638 // Connection between upper and lower part of undulation
639     TGeoVolume* voWiggleC1 = new TGeoVolume("Q3WCO1",  
640                                           new TGeoTube(kCP3BellowRi + kCP3PlieR, kCP3BellowRo - kCP3PlieR, kCP3PlieThickness / 2.),
641                                           kMedSteel);
642     TGeoVolume* voWiggleC2 = new TGeoVolume("Q3WCO2",  
643                                           new TGeoTube(kCP3BellowRi + kCP3ConnectionPlieR, kCP3BellowRo - kCP3PlieR, kCP3PlieThickness / 2.),
644                                           kMedSteel);
645 //
646 // Conncetion between undulated section and beam pipe
647     TGeoTorus* plieTorusCO =  new TGeoTorus(kCP3BellowRi + kCP3ConnectionPlieR, 0. , kCP3ConnectionPlieR);
648     plieTorusCO->SetName("TorusCO");
649     TGeoTorus* plieTorusCI =  new TGeoTorus(kCP3BellowRi + kCP3ConnectionPlieR, kCP3ConnectionPlieR - kCP3PlieThickness, kCP3ConnectionPlieR);
650     plieTorusCI->SetName("TorusCI");
651     TGeoTube*  plieTubeC   =  new TGeoTube (kCP3BellowRi, kCP3BellowRi + kCP3ConnectionPlieR, kCP3ConnectionPlieR);
652     plieTubeC->SetName("TubeC");
653
654     TGeoCompositeShape*  shConnectionPlieO = new TGeoCompositeShape("connectionPlieO", "TorusCO*TubeC");
655     TGeoCompositeShape*  shConnectionPlieI = new TGeoCompositeShape("connectionPlieI", "TorusCI*TubeC");
656
657     TGeoVolume* voConnectionPO = new TGeoVolume("CP3CPO", shConnectionPlieO, kMedVac);
658     TGeoVolume* voConnectionPI = new TGeoVolume("CP3CPI", shConnectionPlieI, kMedSteel);
659     voConnectionPO->AddNode(voConnectionPI, 1,  gGeoIdentity);    
660 //
661 // Connecting pipes
662     TGeoVolume* voConnectionPipeO = new TGeoVolume("CP3BECO",  
663                                                    new TGeoTube(0., kCP3AdaptorTubeRo, kCP3BellowConnectionLength / 2.),
664                                                    kMedVac);
665     TGeoVolume* voConnectionPipeI = new TGeoVolume("CP3BECI",  
666                                                    new TGeoTube(kCP3AdaptorTubeRi, kCP3AdaptorTubeRo, kCP3BellowConnectionLength / 2.),
667                                                    kMedSteel);
668     
669     voConnectionPipeO->AddNode(voConnectionPipeI, 1,  gGeoIdentity);
670     
671 //
672 // Bellow mother
673     TGeoPcon* shBellowMotherPC = new TGeoPcon(0., 360., 6);
674     dz =  - kCP3BellowLength / 2;
675     shBellowMotherPC->DefineSection(0, dz, 0.,  kCP3AdaptorTubeRo);
676     dz +=  kCP3BellowConnectionLength;
677     shBellowMotherPC->DefineSection(1, dz, 0.,  kCP3AdaptorTubeRo);
678     shBellowMotherPC->DefineSection(2, dz, 0.,  kCP3BellowRo);
679     dz =  kCP3BellowLength /2. -  kCP3BellowConnectionLength;;
680     shBellowMotherPC->DefineSection(3, dz, 0.,  kCP3BellowRo);
681     shBellowMotherPC->DefineSection(4, dz, 0.,  kCP3AdaptorTubeRo);
682     dz +=  kCP3BellowConnectionLength;
683     shBellowMotherPC->DefineSection(5, dz, 0.,  kCP3AdaptorTubeRo);
684
685     TGeoVolume* voBellowMother = new TGeoVolume("CP3BeMO", shBellowMotherPC, kMedVac);
686     voBellowMother->SetVisibility(0);
687     
688 //
689 // Add undulations
690     z0   =  - kCP3BellowLength / 2. +  kCP3BellowConnectionLength + 2. * kCP3ConnectionPlieR - kCP3PlieThickness;
691     zsh  = 4. *  kCP3PlieR -  2. * kCP3PlieThickness;
692     for (Int_t iw = 0; iw < 18; iw++) {
693         Float_t zpos =  z0 + iw * zsh;  
694         if (iw > 0) 
695             voBellowMother->AddNode(voWiggleC1,  iw + 1 , new TGeoTranslation(0., 0., zpos + kCP3PlieThickness / 2.));  
696         else
697             voBellowMother->AddNode(voWiggleC2,  iw + 1 , new TGeoTranslation(0., 0., zpos + kCP3PlieThickness / 2.));  
698
699         zpos += kCP3PlieR;
700         voBellowMother->AddNode(voWiggleUO, iw + 1,  new TGeoTranslation(0., 0., zpos));        
701
702         zpos += kCP3PlieR;
703         if (iw < 17) 
704             voBellowMother->AddNode(voWiggleC1,  iw + 19, new TGeoTranslation(0., 0., zpos - kCP3PlieThickness / 2.));
705         else
706             voBellowMother->AddNode(voWiggleC2,  iw + 19, new TGeoTranslation(0., 0., zpos - kCP3PlieThickness / 2.));
707
708         if (iw < 17) {
709             zpos += kCP3PlieR;
710             voBellowMother->AddNode(voWiggleLO, iw + 1, new TGeoTranslation(0., 0., zpos -  kCP3PlieThickness));
711         }
712     }
713 //
714 // Add connecting undulation between bellow and connecting pipe
715     dz = - kCP3BellowUndulatedLength / 2. + kCP3ConnectionPlieR;
716     voBellowMother->AddNode(voConnectionPO, 1,  new TGeoTranslation(0., 0.,  dz));
717     voBellowMother->AddNode(voConnectionPO, 2,  new TGeoTranslation(0., 0., -dz));
718 //
719 // Add connecting pipe
720     dz =  - kCP3BellowLength / 2. +  kCP3BellowConnectionLength / 2.;
721     voBellowMother->AddNode(voConnectionPipeO, 1,  new TGeoTranslation(0., 0.,   dz));
722     voBellowMother->AddNode(voConnectionPipeO, 2,  new TGeoTranslation(0., 0.,  -dz));
723 //
724 // Add bellow to CP/3 mother    
725     dz = - kCP3Length / 2. +  kCP3AdaptorTubeLength +  kCP3BellowLength / 2.;
726     voCp3Mo->AddNode(voBellowMother, 1,  new TGeoTranslation(0., 0., dz));
727     dz += (kCP3BellowLength +  kCP3TubeLength);
728     voCp3Mo->AddNode(voBellowMother, 2,  new TGeoTranslation(0., 0., dz));
729
730
731 ///////////////////////////////////////////
732 // Beam pipe section between bellows     //
733 ///////////////////////////////////////////
734
735     TGeoVolume* voCp3Bco = new TGeoVolume("CP3BCO",
736                                           new TGeoTube(0.,  kCP3AdaptorTubeRo,  kCP3TubeLength / 2.),
737                                           kMedVac);
738    
739     TGeoVolume* voCp3Bci = new TGeoVolume("CP3BCI",
740                                           new TGeoTube(kCP3AdaptorTubeRi, kCP3AdaptorTubeRo, kCP3TubeLength / 2.), 
741                                           kMedSteel);
742     
743     voCp3Bco->AddNode(voCp3Bci, 1, gGeoIdentity);
744     dz = - kCP3Length / 2. +   kCP3AdaptorTubeLength +  kCP3BellowLength +  kCP3TubeLength / 2.;
745     voCp3Mo->AddNode(voCp3Bco, 1, new TGeoTranslation(0., 0., dz));
746
747
748 ///////////////////////////////////////////               
749 // CP3 Minimised Flange                  //
750 ///////////////////////////////////////////
751
752     TGeoPcon* shCp3mfo = new TGeoPcon(0., 360., 4);
753     z = - (kCP3FlangeConnectorLength + kCP3FlangeLength) / 2.;
754 //  Connection Tube
755     shCp3mfo->DefineSection(0, z, 0., kCP3AdaptorTubeRo);
756     z +=  kCP3FlangeConnectorLength;
757     shCp3mfo->DefineSection(1, z, 0., kCP3AdaptorTubeRo);
758 //  Flange
759     shCp3mfo->DefineSection(2, z, 0., kCP3FlangeRo);
760     z = - shCp3mfo->GetZ(0);
761     shCp3mfo->DefineSection(3, z, 0., kCP3FlangeRo);
762
763     TGeoVolume* voCp3mfo = new TGeoVolume("CP3MFO", shCp3mfo, kMedVac);
764
765
766     TGeoPcon* shCp3mfi = new TGeoPcon(0., 360., 4);
767 //  Connection Tube
768     shCp3mfi->DefineSection(0, shCp3mfo->GetZ(0), kCP3AdaptorTubeRi, kCP3AdaptorTubeRo);
769     shCp3mfi->DefineSection(1, shCp3mfo->GetZ(1), kCP3AdaptorTubeRi, kCP3AdaptorTubeRo);
770 //  Flange
771     shCp3mfi->DefineSection(2, shCp3mfo->GetZ(2), kCP3AdaptorTubeRi, kCP3FlangeRo);
772     shCp3mfi->DefineSection(3, shCp3mfo->GetZ(3), kCP3AdaptorTubeRi, kCP3FlangeRo);
773
774     TGeoVolume* voCp3mfi = new TGeoVolume("CP3MFI", shCp3mfi, kMedSteel);
775
776     voCp3mfo->AddNode(voCp3mfi, 1, gGeoIdentity);
777     dz =  kCP3Length / 2. - (kCP3FlangeConnectorLength + kCP3FlangeLength) / 2.;
778     voCp3Mo->AddNode(voCp3mfo, 1, new TGeoTranslation(0., 0., dz));
779
780
781 //
782 //  Assemble the central beam pipe
783 //
784     TGeoVolumeAssembly* asCP = new TGeoVolumeAssembly("CP");
785     z = 0.;
786     asCP->AddNode(voCp2,   1, gGeoIdentity);
787     z +=  kCP2Length / 2. + kCP1Length / 2.;
788     asCP->AddNode(voCp1, 1, new TGeoTranslation(0., 0., z));
789     z +=  kCP1Length / 2.  + kCP3Length / 2.;
790     asCP->AddNode(voCp3, 1, new TGeoTranslation(0., 0., z));
791     top->AddNode(asCP, 1,  new TGeoCombiTrans(0., 0., 400. -  kCP2Length / 2, rot180));
792
793
794
795
796 ////////////////////////////////////////////////////////////////////////////////     
797 //                                                                            //
798 //                                  RB24                                      // 
799 //                                                                            //
800 ////////////////////////////////////////////////////////////////////////////////
801 //
802 //
803 // Drawing LHCVC2U_0001
804 // Copper Tube             373.5 cm 
805 // Warm module VMACA        18.0 cm
806 // Annular Ion Pump         35.0 cm
807 // Valve                     7.5 cm
808 // Warm module WMABC        28.0 cm
809 // ================================
810 //                         462.0 cm
811 //
812
813 // Copper Tube
814     const Float_t  kRB24CuTubeL  = 373.5;
815     const Float_t  kRB24CuTubeRi = 8.0/2.;
816     const Float_t  kRB24CuTubeRo = 8.4/2.;
817     TGeoVolume* voRB24CuTubeM = new TGeoVolume("voRB24CuTubeM", 
818                                                new TGeoTube(0., kRB24CuTubeRo, kRB24CuTubeL/2.), kMedVac);
819     voRB24CuTubeM->SetVisibility(0);
820     TGeoVolume* voRB24CuTube  = new TGeoVolume("voRB24CuTube", 
821                                                new TGeoTube(kRB24CuTubeRi, kRB24CuTubeRo, kRB24CuTubeL/2.), kMedCu);
822     voRB24CuTubeM->AddNode(voRB24CuTube, 1, gGeoIdentity);
823     
824    
825 // Warm Module Type VMACA
826 // LHCVMACA_0002
827 // 
828 // Pos 1 Warm Bellows DN100       LHCVBU__0012
829 // Pos 2 RF Contact   D80         LHCVSR__0005
830 // Pos 3 Trans. Tube Flange       LHCVSR__0065
831 // [Pos 4 Hex. Countersunk Screw   Bossard BN4719]
832 // [Pos 5 Tension spring           LHCVSR__0011]
833 //
834 //
835 //
836 // Pos1    Warm Bellows DN100
837 // Pos1.1  Bellows                  LHCVBU__0006
838 //
839 //
840 // Connection Tubes    
841 // Connection tube inner r
842     const Float_t kRB24B1ConTubeRin        = 10.0/2.;
843 // Connection tube outer r
844     const Float_t kRB24B1ConTubeRou        = 10.3/2.;
845 // Connection tube length
846     const Float_t kRB24B1ConTubeL          =  2.5;
847 // 
848     const Float_t kRB24B1CompL             = 16.00;    // Length of the compensator
849     const Float_t kRB24B1BellowRi          = 10.25/2.; // Bellow inner radius        
850     const Float_t kRB24B1BellowRo          = 11.40/2.; // Bellow outer radius        
851     const Int_t   kRB24B1NumberOfPlies     = 27;       // Number of plies            
852     const Float_t kRB24B1BellowUndL        = 11.00;    // Length of undulated region 
853     const Float_t kRB24B1PlieThickness     =  0.015;   // Plie thickness             
854
855     const Float_t kRB24B1PlieRadius = 
856         (kRB24B1BellowUndL + (2. *  kRB24B1NumberOfPlies - 2.) * kRB24B1PlieThickness) / (4. * kRB24B1NumberOfPlies);
857     
858     const Float_t kRB24B1ProtTubeThickness = 0.02;     // Thickness of the protection tube
859     const Float_t kRB24B1ProtTubeLength    = 4.2;      // Length of the protection tube
860
861     const Float_t kRB24B1RFlangeL          = 1.86;     // Length of the flanges
862     const Float_t kRB24B1RFlangeLO         = 0.26;     // Flange overlap
863     const Float_t kRB24B1RFlangeRO         = 11.18/2;  // Inner radius at Flange overlap    
864     const Float_t kRB24B1RFlangeRou        = 15.20/2.; // Outer radius of flange
865     const Float_t kRB24B1RFlangeRecess     = 0.98;     // Flange recess
866     const Float_t kRB24B1L                 = kRB24B1CompL +  2. * (kRB24B1RFlangeL - kRB24B1RFlangeRecess);
867     
868 ///      
869 //
870 // Bellow mother volume
871     TGeoPcon* shRB24B1BellowM = new TGeoPcon(0., 360., 14);
872     // Connection Tube and Flange
873     z = 0.;
874     shRB24B1BellowM->DefineSection( 0, z, 0.,               kRB24B1RFlangeRou);
875     z += kRB24B1RFlangeLO;
876     shRB24B1BellowM->DefineSection( 1, z, 0.,               kRB24B1RFlangeRou);
877     shRB24B1BellowM->DefineSection( 2, z, 0.,               kRB24B1RFlangeRou);    
878     z = kRB24B1RFlangeL;
879     shRB24B1BellowM->DefineSection( 3, z, 0.,               kRB24B1RFlangeRou);    
880     shRB24B1BellowM->DefineSection( 4, z, 0.,               kRB24B1ConTubeRou);
881     z = kRB24B1ConTubeL +  kRB24B1RFlangeL - kRB24B1RFlangeRecess;
882     shRB24B1BellowM->DefineSection( 5, z, 0.,               kRB24B1ConTubeRou);
883     // Plie
884     shRB24B1BellowM->DefineSection( 6, z, 0.,               kRB24B1BellowRo + kRB24B1ProtTubeThickness);
885     z += kRB24B1BellowUndL;
886     shRB24B1BellowM->DefineSection( 7, z, 0.,               kRB24B1BellowRo + kRB24B1ProtTubeThickness);
887     shRB24B1BellowM->DefineSection( 8, z, 0.,               kRB24B1ConTubeRou);
888     // Connection Tube and Flange
889     z = kRB24B1L - shRB24B1BellowM->GetZ(3);
890     shRB24B1BellowM->DefineSection( 9, z, 0.,               kRB24B1ConTubeRou);
891     shRB24B1BellowM->DefineSection(10, z, 0.,               kRB24B1RFlangeRou);
892     z = kRB24B1L - shRB24B1BellowM->GetZ(1);
893     shRB24B1BellowM->DefineSection(11, z, 0.,               kRB24B1RFlangeRou);
894     shRB24B1BellowM->DefineSection(12, z, 0.,               kRB24B1RFlangeRou);
895     z = kRB24B1L - shRB24B1BellowM->GetZ(0);
896     shRB24B1BellowM->DefineSection(13, z, 0.,               kRB24B1RFlangeRou);
897
898     TGeoVolume* voRB24B1BellowM = new TGeoVolume("RB24B1BellowM", shRB24B1BellowM, kMedVac);
899     voRB24B1BellowM->SetVisibility(0);
900 //
901 // Bellow Section    
902     TGeoVolume* voRB24B1Bellow 
903         = MakeBellow("RB24B1", kRB24B1NumberOfPlies, kRB24B1BellowRi, kRB24B1BellowRo, 
904                      kRB24B1BellowUndL, kRB24B1PlieRadius ,kRB24B1PlieThickness);
905     voRB24B1Bellow->SetVisibility(0);
906     
907 //
908 // End Parts (connection tube)
909     TGeoVolume* voRB24B1CT = new TGeoVolume("RB24B1CT", new TGeoTube(kRB24B1ConTubeRin, kRB24B1ConTubeRou,  kRB24B1ConTubeL/2.), kMedSteel); 
910 //
911 // Protection Tube      
912     TGeoVolume* voRB24B1PT = new TGeoVolume("RB24B1PT", new TGeoTube(kRB24B1BellowRo, kRB24B1BellowRo + kRB24B1ProtTubeThickness,  
913                                                                      kRB24B1ProtTubeLength / 2.), kMedSteel);
914     
915     z = kRB24B1ConTubeL/2. +  (kRB24B1RFlangeL - kRB24B1RFlangeRecess);
916     
917     voRB24B1BellowM->AddNode(voRB24B1CT, 1, new TGeoTranslation(0., 0., z));
918     z += (kRB24B1ConTubeL/2.+ kRB24B1BellowUndL/2.);
919     voRB24B1BellowM->AddNode(voRB24B1Bellow, 1, new TGeoTranslation(0., 0., z));
920     z += (kRB24B1BellowUndL/2. + kRB24B1ConTubeL/2);
921     voRB24B1BellowM->AddNode(voRB24B1CT, 2, new TGeoTranslation(0., 0., z));
922     z =  kRB24B1ConTubeL +  kRB24B1ProtTubeLength / 2. + 1. + kRB24B1RFlangeLO;
923     voRB24B1BellowM->AddNode(voRB24B1PT, 1, new TGeoTranslation(0., 0., z));
924     z +=  kRB24B1ProtTubeLength + 0.6;
925     voRB24B1BellowM->AddNode(voRB24B1PT, 2, new TGeoTranslation(0., 0., z));
926
927                  
928
929 // Pos 1/2 Rotatable Flange         LHCVBU__0013
930 // Pos 1/3 Flange DN100/103         LHCVBU__0018
931 // The two flanges can be represented by the same volume
932     // Outer Radius (including the outer movable ring).
933     // The inner ring has a diameter of 12.04 cm
934
935   
936     TGeoPcon* shRB24B1RFlange = new TGeoPcon(0., 360., 10);
937     z = 0.;
938     shRB24B1RFlange->DefineSection(0, z, 10.30/2., kRB24B1RFlangeRou);
939     z += 0.55;  // 5.5 mm added for outer ring
940     z += 0.43;
941     shRB24B1RFlange->DefineSection(1, z, 10.30/2., kRB24B1RFlangeRou);
942     shRB24B1RFlange->DefineSection(2, z, 10.06/2., kRB24B1RFlangeRou);    
943     z += 0.15;
944     shRB24B1RFlange->DefineSection(3, z, 10.06/2., kRB24B1RFlangeRou);    
945     // In reality this part is rounded
946     shRB24B1RFlange->DefineSection(4, z, 10.91/2., kRB24B1RFlangeRou);    
947     z += 0.15;
948     shRB24B1RFlange->DefineSection(5, z, 10.91/2., kRB24B1RFlangeRou);    
949     shRB24B1RFlange->DefineSection(6, z, 10.06/2., kRB24B1RFlangeRou);    
950     z += 0.32;
951     shRB24B1RFlange->DefineSection(7, z, 10.06/2., kRB24B1RFlangeRou);    
952     shRB24B1RFlange->DefineSection(8, z, kRB24B1RFlangeRO, kRB24B1RFlangeRou);    
953     z += kRB24B1RFlangeLO;
954     shRB24B1RFlange->DefineSection(9, z, kRB24B1RFlangeRO, kRB24B1RFlangeRou);    
955     
956     TGeoVolume* voRB24B1RFlange = new TGeoVolume("RB24B1RFlange", shRB24B1RFlange, kMedSteel);
957
958     
959     z = kRB24B1L - kRB24B1RFlangeL;
960     voRB24B1BellowM->AddNode(voRB24B1RFlange, 1, new TGeoTranslation(0., 0., z));
961     z = kRB24B1RFlangeL;
962     voRB24B1BellowM->AddNode(voRB24B1RFlange, 2, new TGeoCombiTrans(0., 0., z, rot180));
963 //
964 // Pos 2 RF Contact   D80         LHCVSR__0005
965 //
966 // Pos 2.1 RF Contact Flange      LHCVSR__0003
967 //
968     TGeoPcon* shRB24B1RCTFlange = new TGeoPcon(0., 360., 6);
969     const Float_t kRB24B1RCTFlangeRin  = 8.06/2.;  // Inner radius
970     const Float_t kRB24B1RCTFlangeL    = 1.45;     // Length
971     
972     z = 0.;
973     shRB24B1RCTFlange->DefineSection(0, z, kRB24B1RCTFlangeRin,  8.20/2.);
974     z += 0.15;
975     shRB24B1RCTFlange->DefineSection(1, z, kRB24B1RCTFlangeRin,  8.20/2.);
976     shRB24B1RCTFlange->DefineSection(2, z, kRB24B1RCTFlangeRin,  8.60/2.);
977     z += 1.05;
978     shRB24B1RCTFlange->DefineSection(3, z, kRB24B1RCTFlangeRin,  8.60/2.);
979     shRB24B1RCTFlange->DefineSection(4, z, kRB24B1RCTFlangeRin, 11.16/2.);
980     z += 0.25;
981     shRB24B1RCTFlange->DefineSection(5, z, kRB24B1RCTFlangeRin, 11.16/2.);
982     TGeoVolume* voRB24B1RCTFlange = new TGeoVolume("RB24B1RCTFlange", shRB24B1RCTFlange, kMedCu);
983     z = kRB24B1L - kRB24B1RCTFlangeL;
984     
985     voRB24B1BellowM->AddNode(voRB24B1RCTFlange, 1, new TGeoTranslation(0., 0., z));
986 //
987 // Pos 2.2 RF-Contact        LHCVSR__0004
988 //
989     TGeoPcon* shRB24B1RCT = new TGeoPcon(0., 360., 3);
990     const Float_t kRB24B1RCTRin  = 8.00/2.;        // Inner radius
991     const Float_t kRB24B1RCTCRin = 8.99/2.;        // Max. inner radius conical section
992     const Float_t kRB24B1RCTL    = 11.78;          // Length
993     const Float_t kRB24B1RCTSL   = 10.48;          // Length of straight section
994     const Float_t kRB24B1RCTd    =  0.03;          // Thickness
995     
996     z = 0;
997     shRB24B1RCT->DefineSection(0, z,  kRB24B1RCTCRin,  kRB24B1RCTCRin + kRB24B1RCTd);
998     z =  kRB24B1RCTL -  kRB24B1RCTSL;
999     // In the (VSR0004) this section is straight in (LHCVC2U_0001) it is conical ????
1000     shRB24B1RCT->DefineSection(1, z,  kRB24B1RCTRin + 0.35,  kRB24B1RCTRin + 0.35 + kRB24B1RCTd);
1001     z = kRB24B1RCTL;
1002     shRB24B1RCT->DefineSection(2, z,  kRB24B1RCTRin,  kRB24B1RCTRin + kRB24B1RCTd);
1003
1004     TGeoVolume* voRB24B1RCT = new TGeoVolume("RB24B1RCT", shRB24B1RCT, kMedCu);
1005     z = kRB24B1L - kRB24B1RCTL - 0.45;
1006     voRB24B1BellowM->AddNode(voRB24B1RCT, 1, new TGeoTranslation(0., 0., z));    
1007
1008 //
1009 // Pos 3 Trans. Tube Flange       LHCVSR__0065
1010 //
1011 // Pos 3.1 Transition Tube D53    LHCVSR__0064
1012 // Pos 3.2 Transition Flange      LHCVSR__0060
1013 // Pos 3.3 Transition Tube        LHCVSR__0058
1014     TGeoPcon* shRB24B1TTF = new TGeoPcon(0., 360., 7);
1015     // Flange
1016     z = 0.;
1017     shRB24B1TTF->DefineSection(0, z,  6.30/2., 11.16/2.);
1018     z += 0.25;
1019     shRB24B1TTF->DefineSection(1, z,  6.30/2., 11.16/2.);
1020     shRB24B1TTF->DefineSection(2, z,  6.30/2.,  9.3/2.);
1021     z += 0.55;
1022     shRB24B1TTF->DefineSection(3, z,  6.30/2.,  9.3/2.);
1023     // Tube
1024     shRB24B1TTF->DefineSection(4, z,  6.30/2.,  6.7/2.);
1025     z += 5.80;
1026     shRB24B1TTF->DefineSection(5, z,  6.30/2.,  6.7/2.);
1027     // Transition Tube
1028     z += 3.75;
1029     shRB24B1TTF->DefineSection(6, z,  8.2/2.,  8.6/2.);
1030     TGeoVolume* voRB24B1TTF = new TGeoVolume("RB24B1TTF", shRB24B1TTF, kMedSteel);
1031     z =  0.;
1032     voRB24B1BellowM->AddNode(voRB24B1TTF, 1, new TGeoTranslation(0., 0., z));    
1033
1034 // Annular Ion Pump        
1035 // LHCVC2U_0003
1036 //
1037 // Pos  1 Rotable Flange         LHCVFX__0031
1038 // Pos  2 RF Screen Tube         LHCVC2U_0005
1039 // Pos  3 Shell                  LHCVC2U_0007
1040 // Pos  4 Extruded Shell         LHCVC2U_0006
1041 // Pos  5 Feedthrough Tube       LHCVC2U_0004
1042 // Pos  6 Tubulated Flange       STDVFUHV0021
1043 // Pos  7 Fixed Flange           LHCVFX__0032
1044 // Pos  8 Pumping Elements
1045
1046 //
1047 // Pos 1 Rotable Flange          LHCVFX__0031
1048 // pos 7 Fixed Flange            LHCVFX__0032
1049 //
1050 //  Mother volume
1051     const Float_t kRB24AIpML = 35.;
1052     
1053     TGeoVolume* voRB24AIpM = new TGeoVolume("voRB24AIpM", new TGeoTube(0., 10., kRB24AIpML/2.), kMedAir);
1054     voRB24AIpM->SetVisibility(0);
1055     
1056     //
1057     // Length 35 cm
1058     // Flange 2 x 1.98 =   3.96
1059     // Tube            =  32.84
1060     //==========================
1061     //                    36.80
1062     // Overlap 2 * 0.90 =  1.80
1063                         
1064     const Float_t kRB24IpRFD1     =  0.68;    // Length of section 1
1065     const Float_t kRB24IpRFD2     =  0.30;    // Length of section 2                                                 
1066     const Float_t kRB24IpRFD3     =  0.10;    // Length of section 3                                                       
1067     const Float_t kRB24IpRFD4     =  0.35;    // Length of section 4                                                       
1068     const Float_t kRB24IpRFD5     =  0.55;    // Length of section 5                                                       
1069     
1070     const Float_t kRB24IpRFRo     = 15.20/2.; // Flange outer radius 
1071     const Float_t kRB24IpRFRi1    =  6.30/2.; // Flange inner radius section 1
1072     const Float_t kRB24IpRFRi2    =  6.00/2.; // Flange inner radius section 2
1073     const Float_t kRB24IpRFRi3    =  5.84/2.; // Flange inner radius section 3    
1074     const Float_t kRB24IpRFRi4    =  6.00/2.; // Flange inner radius section 1
1075     const Float_t kRB24IpRFRi5    = 10.50/2.; // Flange inner radius section 2
1076
1077     TGeoPcon* shRB24IpRF = new TGeoPcon(0., 360., 9);
1078     z0 = 0.;
1079     shRB24IpRF->DefineSection(0, z0, kRB24IpRFRi1, kRB24IpRFRo);
1080     z0 += kRB24IpRFD1;
1081     shRB24IpRF->DefineSection(1, z0, kRB24IpRFRi2, kRB24IpRFRo);
1082     z0 += kRB24IpRFD2;
1083     shRB24IpRF->DefineSection(2, z0, kRB24IpRFRi2, kRB24IpRFRo);
1084     shRB24IpRF->DefineSection(3, z0, kRB24IpRFRi3, kRB24IpRFRo);
1085     z0 += kRB24IpRFD3;
1086     shRB24IpRF->DefineSection(4, z0, kRB24IpRFRi3, kRB24IpRFRo);
1087     shRB24IpRF->DefineSection(5, z0, kRB24IpRFRi4, kRB24IpRFRo);
1088     z0 += kRB24IpRFD4;
1089     shRB24IpRF->DefineSection(6, z0, kRB24IpRFRi4, kRB24IpRFRo);
1090     shRB24IpRF->DefineSection(7, z0, kRB24IpRFRi5, kRB24IpRFRo);
1091     z0 += kRB24IpRFD5;
1092     shRB24IpRF->DefineSection(8, z0, kRB24IpRFRi5, kRB24IpRFRo);
1093
1094     TGeoVolume* voRB24IpRF = new TGeoVolume("RB24IpRF", shRB24IpRF, kMedSteel);
1095     
1096 //
1097 // Pos  2 RF Screen Tube         LHCVC2U_0005
1098 //
1099
1100 //
1101 // Tube
1102     Float_t kRB24IpSTTL  = 32.84;            // Total length of the tube
1103     Float_t kRB24IpSTTRi =  5.80/2.;         // Inner Radius
1104     Float_t kRB24IpSTTRo =  6.00/2.;         // Outer Radius
1105     TGeoVolume* voRB24IpSTT = new TGeoVolume("RB24IpSTT", new TGeoTube(kRB24IpSTTRi, kRB24IpSTTRo, kRB24IpSTTL/2.), kMedSteel);
1106 // Screen
1107     Float_t kRB24IpSTCL  =  0.4;             // Lenth of the crochet detail
1108     // Length of the screen 
1109     Float_t kRB24IpSTSL  =  9.00 - 2. * kRB24IpSTCL; 
1110     // Rel. position of the screen 
1111     Float_t kRB24IpSTSZ  =  7.00 + kRB24IpSTCL; 
1112     TGeoVolume* voRB24IpSTS = new TGeoVolume("RB24IpSTS", new TGeoTube(kRB24IpSTTRi, kRB24IpSTTRo, kRB24IpSTSL/2.), kMedSteel);
1113     // Vacuum
1114     TGeoVolume* voRB24IpSTV = new TGeoVolume("RB24IpSTV", new TGeoTube(0., kRB24IpSTTRi, kRB24AIpML/2.), kMedVac);
1115     //
1116     voRB24IpSTT->AddNode(voRB24IpSTS, 1, new TGeoTranslation(0., 0., kRB24IpSTSZ -  kRB24IpSTTL/2. +  kRB24IpSTSL/2.));
1117     
1118 // Crochets
1119     // Inner radius
1120     Float_t kRB24IpSTCRi  = kRB24IpSTTRo + 0.25;
1121     // Outer radius
1122     Float_t kRB24IpSTCRo  = kRB24IpSTTRo + 0.35;
1123     // Length of 1stsection
1124     Float_t kRB24IpSTCL1  = 0.15;
1125     // Length of 2nd section
1126     Float_t kRB24IpSTCL2  = 0.15;
1127     // Length of 3rd section
1128     Float_t kRB24IpSTCL3  = 0.10;
1129     // Rel. position of 1st Crochet
1130
1131
1132     TGeoPcon* shRB24IpSTC = new TGeoPcon(0., 360., 5);
1133     z0 = 0;
1134     shRB24IpSTC->DefineSection(0, z0, kRB24IpSTCRi, kRB24IpSTCRo);
1135     z0 += kRB24IpSTCL1;
1136     shRB24IpSTC->DefineSection(1, z0, kRB24IpSTCRi, kRB24IpSTCRo);
1137     shRB24IpSTC->DefineSection(2, z0, kRB24IpSTTRo, kRB24IpSTCRo);
1138     z0 += kRB24IpSTCL2;
1139     shRB24IpSTC->DefineSection(3, z0, kRB24IpSTTRo, kRB24IpSTCRo);
1140     z0 += kRB24IpSTCL3;
1141     shRB24IpSTC->DefineSection(4, z0, kRB24IpSTTRo, kRB24IpSTTRo + 0.001);
1142     TGeoVolume* voRB24IpSTC = new TGeoVolume("RB24IpSTC", shRB24IpSTC, kMedSteel);
1143
1144 // Pos  3 Shell                  LHCVC2U_0007
1145 // Pos  4 Extruded Shell         LHCVC2U_0006
1146     Float_t kRB24IpShellL     =  4.45;    // Length of the Shell
1147     Float_t kRB24IpShellD     =  0.10;    // Wall thickness of the shell
1148     Float_t kRB24IpShellCTRi  =  6.70/2.; // Inner radius of the connection tube
1149     Float_t kRB24IpShellCTL   =  1.56;    // Length of the connection tube
1150     Float_t kRB24IpShellCARi  = 17.80/2.; // Inner radius of the cavity
1151     Float_t kRB24IpShellCCRo  = 18.20/2.; // Inner radius at the centre
1152
1153     TGeoPcon* shRB24IpShell = new TGeoPcon(0., 360., 7);
1154     z0 = 0;
1155     shRB24IpShell->DefineSection(0, z0, kRB24IpShellCTRi, kRB24IpShellCTRi + kRB24IpShellD);
1156     z0 +=  kRB24IpShellCTL;
1157     shRB24IpShell->DefineSection(1, z0, kRB24IpShellCTRi, kRB24IpShellCTRi + kRB24IpShellD);
1158     shRB24IpShell->DefineSection(2, z0, kRB24IpShellCTRi, kRB24IpShellCARi + kRB24IpShellD);
1159     z0 += kRB24IpShellD;
1160     shRB24IpShell->DefineSection(3, z0, kRB24IpShellCARi, kRB24IpShellCARi + kRB24IpShellD);
1161     z0 = kRB24IpShellL - kRB24IpShellD;
1162     shRB24IpShell->DefineSection(4, z0, kRB24IpShellCARi, kRB24IpShellCARi + kRB24IpShellD);
1163     shRB24IpShell->DefineSection(5, z0, kRB24IpShellCARi, kRB24IpShellCCRo);
1164     z0 = kRB24IpShellL;
1165     shRB24IpShell->DefineSection(6, z0, kRB24IpShellCARi, kRB24IpShellCCRo);
1166     TGeoVolume* voRB24IpShell = new TGeoVolume("RB24IpShell", shRB24IpShell, kMedSteel);
1167     
1168     TGeoPcon* shRB24IpShellM   = MakeMotherFromTemplate(shRB24IpShell, 0, 6, kRB24IpShellCTRi , 13);
1169     
1170     
1171     for (Int_t i = 0; i < 6; i++) {
1172         z = 2. * kRB24IpShellL  - shRB24IpShellM->GetZ(5-i);
1173         Float_t rmin = shRB24IpShellM->GetRmin(5-i);
1174         Float_t rmax = shRB24IpShellM->GetRmax(5-i);
1175         shRB24IpShellM->DefineSection(7+i, z, rmin, rmax);
1176     }
1177     
1178     TGeoVolume* voRB24IpShellM = new TGeoVolume("RB24IpShellM", shRB24IpShellM, kMedVac);
1179     voRB24IpShellM->SetVisibility(0);
1180     voRB24IpShellM->AddNode(voRB24IpShell, 1, gGeoIdentity);
1181     voRB24IpShellM->AddNode(voRB24IpShell, 2, new TGeoCombiTrans(0., 0., 2. * kRB24IpShellL, rot180));
1182 //
1183 // Pos  8 Pumping Elements
1184 //
1185 //  Anode array
1186     TGeoVolume* voRB24IpPE = new TGeoVolume("voRB24IpPE", new TGeoTube(0.9, 1., 2.54/2.), kMedSteel);
1187     Float_t kRB24IpPEAR = 5.5;
1188     
1189     for (Int_t i = 0; i < 15; i++) {
1190         Float_t phi = Float_t(i) * 24.;
1191         Float_t x   =  kRB24IpPEAR * TMath::Cos(kDegRad * phi);
1192         Float_t y   =  kRB24IpPEAR * TMath::Sin(kDegRad * phi);
1193         voRB24IpShellM->AddNode(voRB24IpPE, i+1, new TGeoTranslation(x, y, kRB24IpShellL));
1194     }
1195     
1196     
1197 //
1198 //  Cathodes
1199 //
1200 // Here we could add some Ti strips
1201
1202 // Postioning of elements
1203     voRB24AIpM->AddNode(voRB24IpRF,     1, new TGeoTranslation(0., 0., -kRB24AIpML/2.));
1204     voRB24AIpM->AddNode(voRB24IpRF,     2, new TGeoCombiTrans (0., 0., +kRB24AIpML/2., rot180));
1205     voRB24AIpM->AddNode(voRB24IpSTT,    1, new TGeoTranslation(0., 0., 0.));
1206     voRB24AIpM->AddNode(voRB24IpSTV,    1, new TGeoTranslation(0., 0., 0.));
1207     voRB24AIpM->AddNode(voRB24IpShellM, 1, new TGeoTranslation(0., 0., -kRB24AIpML/2. +  8.13));
1208     voRB24AIpM->AddNode(voRB24IpSTC,    1, new TGeoTranslation(0., 0., 8.13 - kRB24AIpML/2.));
1209     voRB24AIpM->AddNode(voRB24IpSTC,    2, new TGeoCombiTrans (0., 0., 8.14 + 8.9 - kRB24AIpML/2., rot180));
1210     
1211 //
1212 // Valve
1213 // VAC Series 47 DN 63 with manual actuator
1214 //
1215     const Float_t kRB24ValveWz = 7.5;
1216     const Float_t kRB24ValveDN = 10.0/2.;
1217 //
1218 //  Body containing the valve plate
1219 //
1220     const Float_t kRB24ValveBoWx =  15.6;
1221     const Float_t kRB24ValveBoWy = (21.5 + 23.1 - 5.);
1222     const Float_t kRB24ValveBoWz =  4.6;
1223     const Float_t kRB24ValveBoD  =  0.5;
1224
1225     TGeoVolume* voRB24ValveBoM =
1226         new TGeoVolume("RB24ValveBoM", 
1227                        new TGeoBBox( kRB24ValveBoWx/2.,  kRB24ValveBoWy/2., kRB24ValveBoWz/2.), kMedAir);
1228     voRB24ValveBoM->SetVisibility(0);
1229     TGeoVolume* voRB24ValveBo =
1230         new TGeoVolume("RB24ValveBo", 
1231                        new TGeoBBox( kRB24ValveBoWx/2.,  kRB24ValveBoWy/2., kRB24ValveBoWz/2.), kMedSteel);
1232     voRB24ValveBoM->AddNode(voRB24ValveBo, 1, gGeoIdentity);
1233     //
1234     // Inner volume
1235     //
1236     TGeoVolume* voRB24ValveBoI = new TGeoVolume("RB24ValveBoI", 
1237                                                 new TGeoBBox( kRB24ValveBoWx/2. -  kRB24ValveBoD,  
1238                                                               kRB24ValveBoWy/2. -  kRB24ValveBoD/2., 
1239                                                               kRB24ValveBoWz/2. -  kRB24ValveBoD), 
1240                                                 kMedVac);
1241     voRB24ValveBo->AddNode(voRB24ValveBoI, 1, new TGeoTranslation(0., kRB24ValveBoD/2., 0.));
1242     //
1243     // Opening and Flanges
1244     const Float_t  kRB24ValveFlRo = 18./2.;
1245     const Float_t  kRB24ValveFlD  = 1.45;    
1246     TGeoVolume* voRB24ValveBoA = new TGeoVolume("RB24ValveBoA", 
1247                                                 new TGeoTube(0., kRB24ValveDN/2., kRB24ValveBoD/2.), kMedVac);
1248     voRB24ValveBo->AddNode(voRB24ValveBoA, 1, new TGeoTranslation(0., - kRB24ValveBoWy/2. + 21.5, -kRB24ValveBoWz/2. +  kRB24ValveBoD/2.));
1249     voRB24ValveBo->AddNode(voRB24ValveBoA, 2, new TGeoTranslation(0., - kRB24ValveBoWy/2. + 21.5, +kRB24ValveBoWz/2. -  kRB24ValveBoD/2.));
1250  
1251     TGeoVolume* voRB24ValveFl  = new TGeoVolume("RB24ValveFl",  new TGeoTube(kRB24ValveDN/2.,  kRB24ValveFlRo, kRB24ValveFlD/2.), kMedSteel);
1252     TGeoVolume* voRB24ValveFlI = new TGeoVolume("RB24ValveFlI", new TGeoTube(0.,               kRB24ValveFlRo, kRB24ValveFlD/2.), kMedVac);
1253     voRB24ValveFlI->AddNode(voRB24ValveFl, 1, gGeoIdentity);
1254     
1255     //
1256     // Actuator Flange
1257     const Float_t kRB24ValveAFlWx =  18.9;
1258     const Float_t kRB24ValveAFlWy =   5.0;
1259     const Float_t kRB24ValveAFlWz =   7.7;
1260     TGeoVolume* voRB24ValveAFl = new TGeoVolume("RB24ValveAFl", new TGeoBBox(kRB24ValveAFlWx/2., kRB24ValveAFlWy/2., kRB24ValveAFlWz/2.), kMedSteel);
1261     //
1262     // Actuator Tube
1263     const Float_t kRB24ValveATRo = 9.7/2.;
1264     const Float_t kRB24ValveATH  = 16.6;
1265     TGeoVolume* voRB24ValveAT = new TGeoVolume("RB24ValveAT", new TGeoTube(kRB24ValveATRo -  2. * kRB24ValveBoD,kRB24ValveATRo,  kRB24ValveATH/2.), 
1266                                                kMedSteel);
1267     //
1268     // Manual Actuator (my best guess)
1269     TGeoVolume* voRB24ValveMA1 = new TGeoVolume("RB24ValveMA1", new TGeoCone(2.5/2., 0., 0.5, 4.5, 5.), kMedSteel);
1270     TGeoVolume* voRB24ValveMA2 = new TGeoVolume("RB24ValveMA2", new TGeoTorus(5., 0., 1.25), kMedSteel);
1271     TGeoVolume* voRB24ValveMA3 = new TGeoVolume("RB24ValveMA3", new TGeoTube (0., 1.25, 2.5), kMedSteel);
1272     
1273
1274     //
1275     // Position all volumes
1276     Float_t y0;
1277     TGeoVolumeAssembly*  voRB24ValveMo = new TGeoVolumeAssembly("RB24ValveMo");
1278     voRB24ValveMo->AddNode(voRB24ValveFl,  1, new TGeoTranslation(0., 0., - 7.5/2. + kRB24ValveFlD/2.));
1279     voRB24ValveMo->AddNode(voRB24ValveFl,  2, new TGeoTranslation(0., 0., + 7.5/2. - kRB24ValveFlD/2.));
1280     y0 = -21.5;
1281     voRB24ValveMo->AddNode(voRB24ValveBoM, 1, new TGeoTranslation(0., y0 + kRB24ValveBoWy/2.,   0.));
1282     y0 +=  kRB24ValveBoWy;
1283     voRB24ValveMo->AddNode(voRB24ValveAFl, 1, new TGeoTranslation(0., y0 +  kRB24ValveAFlWy/2., 0.));
1284     y0 +=  kRB24ValveAFlWy;
1285     voRB24ValveMo->AddNode(voRB24ValveAT,  1, new TGeoCombiTrans(0.,  y0 + kRB24ValveATH/2.,    0., rotyz));
1286     y0 += kRB24ValveATH;
1287     voRB24ValveMo->AddNode(voRB24ValveMA1, 1, new TGeoCombiTrans(0.,  y0 + 2.5/2.,    0., rotyz));
1288     y0 += 2.5;
1289     voRB24ValveMo->AddNode(voRB24ValveMA2, 1, new TGeoCombiTrans(0.,  y0 + 2.5/2.,    0., rotyz));
1290     y0 += 2.5;
1291     voRB24ValveMo->AddNode(voRB24ValveMA3, 1, new TGeoCombiTrans(5./TMath::Sqrt(2.),  y0 + 5.0/2., 5./TMath::Sqrt(2.), rotyz));
1292 //
1293 // Warm Module Type VMABC
1294 // LHCVMABC_0002
1295 // 
1296 //
1297 //
1298 // Flange                  1.00
1299 // Central Piece          11.50
1300 // Bellow                 14.50
1301 // End Flange              1.00
1302 //===================================
1303 // Total                  28.00 
1304 //                        
1305 // Pos 1 Warm Bellows DN100       LHCVBU__0016
1306 // Pos 2 Trans. Tube Flange       LHCVSR__0062
1307 // Pos 3 RF Contact   D63         LHCVSR__0057
1308 // [Pos 4 Hex. Countersunk Screw   Bossard BN4719]
1309 // [Pos 5 Tension spring           LHCVSR__00239]
1310 //
1311
1312 // Pos 1 Warm Bellows DN100                   LHCVBU__0016
1313 // Pos 1.1 Right Body 2 Ports with Support    LHCVBU__0014
1314     //
1315     // Tube 1
1316     const Float_t kRB24VMABCRBT1Ri = 10.0/2.;
1317     const Float_t kRB24VMABCRBT1Ro = 10.3/2.;
1318     const Float_t kRB24VMABCRBT1L  = 11.5;   
1319     const Float_t kRB24VMABCRBT1L2 = 8.;   
1320     TGeoTube* shRB24VMABCRBT1 = new TGeoTube(kRB24VMABCRBT1Ri, kRB24VMABCRBT1Ro, kRB24VMABCRBT1L/2.);
1321     shRB24VMABCRBT1->SetName("RB24VMABCRBT1");
1322     TGeoTube* shRB24VMABCRBT1o = new TGeoTube(0., kRB24VMABCRBT1Ro,  kRB24VMABCRBT1L/2.);
1323     shRB24VMABCRBT1o->SetName("RB24VMABCRBT1o");
1324     TGeoTube* shRB24VMABCRBT1o2 = new TGeoTube(0., kRB24VMABCRBT1Ro + 0.3, kRB24VMABCRBT1L/2.);
1325     shRB24VMABCRBT1o2->SetName("RB24VMABCRBT1o2");
1326     // Lower inforcement 
1327     TGeoVolume*  voRB24VMABCRBT12  = new TGeoVolume("RB24VMABCRBT12", 
1328                                                     new TGeoTubeSeg(kRB24VMABCRBT1Ro, kRB24VMABCRBT1Ro + 0.3, kRB24VMABCRBT1L2/2., 220., 320.)
1329                                                     , kMedSteel);
1330     //
1331     // Tube 2
1332     const Float_t kRB24VMABCRBT2Ri =   6.0/2.;
1333     const Float_t kRB24VMABCRBT2Ro =   6.3/2.;
1334     const Float_t kRB24VMABCRBF2Ro =  11.4/2.;
1335     const Float_t kRB24VMABCRBT2L  =   5.95 + 2.; // 2. cm added for welding    
1336     const Float_t kRB24VMABCRBF2L  =   1.75;
1337     TGeoTube* shRB24VMABCRBT2 = new TGeoTube(kRB24VMABCRBT2Ri, kRB24VMABCRBT2Ro,  kRB24VMABCRBT2L/2.);
1338     shRB24VMABCRBT2->SetName("RB24VMABCRBT2");
1339     TGeoTube* shRB24VMABCRBT2i = new TGeoTube(0., kRB24VMABCRBT2Ri, kRB24VMABCRBT2L/2. + 2.);
1340     shRB24VMABCRBT2i->SetName("RB24VMABCRBT2i");
1341     TGeoCombiTrans* tRBT2 = new TGeoCombiTrans(-11.5 + kRB24VMABCRBT2L/2., 0., 7.2 - kRB24VMABCRBT1L/2.  , rotxz);
1342     tRBT2->SetName("tRBT2");
1343     tRBT2->RegisterYourself();
1344     TGeoCompositeShape* shRB24VMABCRBT2c =  new TGeoCompositeShape("shRB24VMABCRBT2c","RB24VMABCRBT2:tRBT2-RB24VMABCRBT1o");
1345     TGeoVolume* voRB24VMABCRBT2 = new TGeoVolume("shRB24VMABCRBT2", shRB24VMABCRBT2c, kMedSteel);
1346     // Flange
1347     // Pos 1.4 Flange DN63                        LHCVBU__0008
1348     TGeoVolume* voRB24VMABCRBF2 = new TGeoVolume("RB24VMABCRBF2", 
1349                                                  new TGeoTube(kRB24VMABCRBT2Ro, kRB24VMABCRBF2Ro, kRB24VMABCRBF2L/2.), kMedSteel);
1350     // DN63 Blank Flange (my best guess)
1351     TGeoVolume* voRB24VMABCRBF2B = new TGeoVolume("RB24VMABCRBF2B", 
1352                                                   new TGeoTube(0., kRB24VMABCRBF2Ro, kRB24VMABCRBF2L/2.), kMedSteel);
1353     //
1354     // Tube 3
1355     const Float_t kRB24VMABCRBT3Ri =  3.5/2.;
1356     const Float_t kRB24VMABCRBT3Ro =  3.8/2.;
1357     const Float_t kRB24VMABCRBF3Ro =  7.0/2.;
1358     const Float_t kRB24VMABCRBT3L  =  4.95 + 2.; // 2. cm added for welding    
1359     const Float_t kRB24VMABCRBF3L  =  1.27;
1360     TGeoTube* shRB24VMABCRBT3 = new TGeoTube(kRB24VMABCRBT3Ri, kRB24VMABCRBT3Ro,  kRB24VMABCRBT3L/2);
1361     shRB24VMABCRBT3->SetName("RB24VMABCRBT3");
1362     TGeoTube* shRB24VMABCRBT3i = new TGeoTube(0., kRB24VMABCRBT3Ri, kRB24VMABCRBT3L/2. + 2.);
1363     shRB24VMABCRBT3i->SetName("RB24VMABCRBT3i");
1364     TGeoCombiTrans* tRBT3 = new TGeoCombiTrans(0., 10.5 - kRB24VMABCRBT3L/2., 7.2 - kRB24VMABCRBT1L/2.  , rotyz);
1365     tRBT3->SetName("tRBT3");
1366     tRBT3->RegisterYourself();
1367     TGeoCompositeShape* shRB24VMABCRBT3c =  new TGeoCompositeShape("shRB24VMABCRBT3c","RB24VMABCRBT3:tRBT3-RB24VMABCRBT1o");
1368     TGeoVolume* voRB24VMABCRBT3 = new TGeoVolume("shRB24VMABCRBT3", shRB24VMABCRBT3c, kMedSteel);
1369     // Flange
1370     // Pos 1.4 Flange DN35                        LHCVBU__0007
1371     TGeoVolume* voRB24VMABCRBF3 = new TGeoVolume("RB24VMABCRBF3", 
1372                                                  new TGeoTube(kRB24VMABCRBT3Ro, kRB24VMABCRBF3Ro, kRB24VMABCRBF3L/2.), kMedSteel);
1373     //
1374     // Tube 4
1375     const Float_t kRB24VMABCRBT4Ri =  6.0/2.;
1376     const Float_t kRB24VMABCRBT4Ro =  6.4/2.;
1377     const Float_t kRB24VMABCRBT4L  =  6.6;    
1378     TGeoTube* shRB24VMABCRBT4 = new TGeoTube(kRB24VMABCRBT4Ri, kRB24VMABCRBT4Ro,  kRB24VMABCRBT4L/2.);
1379     shRB24VMABCRBT4->SetName("RB24VMABCRBT4");
1380     TGeoCombiTrans* tRBT4 = new TGeoCombiTrans(0.,-11.+kRB24VMABCRBT4L/2., 7.2 - kRB24VMABCRBT1L/2.  , rotyz);
1381     tRBT4->SetName("tRBT4");
1382     tRBT4->RegisterYourself();
1383     TGeoCompositeShape* shRB24VMABCRBT4c =  new TGeoCompositeShape("shRB24VMABCRBT4c","RB24VMABCRBT4:tRBT4-RB24VMABCRBT1o2");
1384     TGeoVolume* voRB24VMABCRBT4 = new TGeoVolume("shRB24VMABCRBT4", shRB24VMABCRBT4c, kMedSteel);
1385     TGeoCompositeShape* shRB24VMABCRB = new TGeoCompositeShape("shRB24VMABCRB", "RB24VMABCRBT1-(RB24VMABCRBT2i:tRBT2+RB24VMABCRBT3i:tRBT3)");
1386     TGeoVolume* voRB24VMABCRBI = new TGeoVolume("RB24VMABCRBI", shRB24VMABCRB, kMedSteel);
1387     //
1388     // Plate
1389     const Float_t kRB24VMABCRBBx = 16.0;
1390     const Float_t kRB24VMABCRBBy =  1.5;
1391     const Float_t kRB24VMABCRBBz = 15.0;
1392     
1393     // Relative position of tubes
1394     const Float_t  kRB24VMABCTz =   7.2;
1395     // Relative position of plate
1396     const Float_t  kRB24VMABCPz =   3.6;
1397     const Float_t  kRB24VMABCPy = -12.5;
1398     
1399     TGeoVolume* voRB24VMABCRBP = new TGeoVolume("RB24VMABCRBP", new TGeoBBox(kRB24VMABCRBBx/2., kRB24VMABCRBBy/2., kRB24VMABCRBBz/2.), kMedSteel);
1400     //
1401     // Pirani Gauge (my best guess)
1402     //
1403     TGeoPcon* shRB24VMABCPirani = new TGeoPcon(0., 360., 15);
1404     // DN35/16 Coupling
1405     z = 0;
1406     shRB24VMABCPirani->DefineSection( 0, z,  0.8 , kRB24VMABCRBF3Ro);
1407     z += kRB24VMABCRBF3L; // 1.3
1408     shRB24VMABCPirani->DefineSection( 1, z,  0.8 , kRB24VMABCRBF3Ro);
1409     shRB24VMABCPirani->DefineSection( 2, z,  0.8 , 1.0);
1410     // Pipe
1411     z += 2.8;
1412     shRB24VMABCPirani->DefineSection( 3, z,  0.8 , 1.0);
1413     // Flange
1414     shRB24VMABCPirani->DefineSection( 4, z,  0.8 , 1.75);
1415     z += 1.6;
1416     shRB24VMABCPirani->DefineSection( 5, z,  0.8 , 1.75);
1417     shRB24VMABCPirani->DefineSection( 6, z,  0.8 , 1.0);
1418     z += 5.2;
1419     shRB24VMABCPirani->DefineSection( 7, z,  0.8 , 1.0);
1420     shRB24VMABCPirani->DefineSection( 8, z,  0.8 , 2.5);    
1421     z += 2.0;
1422     shRB24VMABCPirani->DefineSection( 9, z,  0.80, 2.50);    
1423     shRB24VMABCPirani->DefineSection(10, z,  1.55, 1.75);    
1424     z += 5.7;
1425     shRB24VMABCPirani->DefineSection(11, z,  1.55, 1.75);    
1426     shRB24VMABCPirani->DefineSection(11, z,  0.00, 1.75);    
1427     z += 0.2;
1428     shRB24VMABCPirani->DefineSection(12, z,  0.00, 1.75);    
1429     shRB24VMABCPirani->DefineSection(13, z,  0.00, 0.75);    
1430     z += 0.5;
1431     shRB24VMABCPirani->DefineSection(14, z,  0.00, 0.75);  
1432     TGeoVolume* voRB24VMABCPirani = new TGeoVolume("RB24VMABCPirani", shRB24VMABCPirani, kMedSteel);
1433     //
1434     //
1435     // 
1436     
1437     
1438     //
1439     // Positioning of elements
1440     TGeoVolumeAssembly* voRB24VMABCRB = new TGeoVolumeAssembly("RB24VMABCRB");
1441     //
1442     voRB24VMABCRB->AddNode(voRB24VMABCRBI,   1, gGeoIdentity);
1443     // Plate
1444     voRB24VMABCRB->AddNode(voRB24VMABCRBP,   1, new TGeoTranslation(0., kRB24VMABCPy +  kRB24VMABCRBBy /2., 
1445                                                                     kRB24VMABCRBBz/2. - kRB24VMABCRBT1L/2. +  kRB24VMABCPz));
1446     // Tube 2
1447     voRB24VMABCRB->AddNode(voRB24VMABCRBT2,  1, gGeoIdentity);
1448     // Flange Tube 2
1449     voRB24VMABCRB->AddNode(voRB24VMABCRBF2,  1, new TGeoCombiTrans(kRB24VMABCPy + kRB24VMABCRBF2L/2., 0.,  kRB24VMABCTz - kRB24VMABCRBT1L/2., rotxz));
1450     // Blank Flange Tube 2
1451     voRB24VMABCRB->AddNode(voRB24VMABCRBF2B, 1, new TGeoCombiTrans(kRB24VMABCPy- kRB24VMABCRBF2L/2., 0.,  kRB24VMABCTz - kRB24VMABCRBT1L/2., rotxz));    
1452     // Tube 3
1453     voRB24VMABCRB->AddNode(voRB24VMABCRBT3,  1, gGeoIdentity);
1454     // Flange Tube 3
1455     voRB24VMABCRB->AddNode(voRB24VMABCRBF3,  1, new TGeoCombiTrans(0.,   11.2 - kRB24VMABCRBF3L/2.,  kRB24VMABCTz - kRB24VMABCRBT1L/2., rotyz));
1456     // Pirani Gauge
1457     voRB24VMABCRB->AddNode(voRB24VMABCPirani, 1, new  TGeoCombiTrans(0., 11.2,  kRB24VMABCTz - kRB24VMABCRBT1L/2., rotyz));
1458     // Tube 4
1459     voRB24VMABCRB->AddNode(voRB24VMABCRBT4,  1, gGeoIdentity);
1460     // Inforcement 
1461     voRB24VMABCRB->AddNode(voRB24VMABCRBT12, 1, new TGeoTranslation(0., 0., kRB24VMABCRBT1L2/2. - kRB24VMABCRBT1L/2. + 2.8));
1462     
1463
1464 // Pos 1.3 Bellows with end part              LHCVBU__0002
1465 //
1466 // Connection Tube    
1467 // Connection tube inner r
1468     const Float_t kRB24VMABBEConTubeRin        = 10.0/2.;
1469 // Connection tube outer r
1470     const Float_t kRB24VMABBEConTubeRou        = 10.3/2.;
1471 // Connection tube length
1472     const Float_t kRB24VMABBEConTubeL1         =  0.9;
1473     const Float_t kRB24VMABBEConTubeL2         =  2.6;
1474 //  const Float_t RB24VMABBEBellowL            =  kRB24VMABBEConTubeL1 + kRB24VMABBEConTubeL2 + kRB24B1BellowUndL;
1475     
1476 // Mother volume
1477     TGeoPcon* shRB24VMABBEBellowM = new TGeoPcon(0., 360., 6);
1478     // Connection Tube and Flange
1479     z = 0.;
1480     shRB24VMABBEBellowM->DefineSection( 0, z, kRB24VMABBEConTubeRin,  kRB24VMABBEConTubeRou);
1481     z += kRB24VMABBEConTubeL1;
1482     shRB24VMABBEBellowM->DefineSection( 1, z, kRB24VMABBEConTubeRin, kRB24VMABBEConTubeRou);
1483     shRB24VMABBEBellowM->DefineSection( 2, z, kRB24B1BellowRi,       kRB24B1BellowRo + kRB24B1ProtTubeThickness);
1484     z += kRB24B1BellowUndL;
1485     shRB24VMABBEBellowM->DefineSection( 3, z, kRB24B1BellowRi,       kRB24B1BellowRo + kRB24B1ProtTubeThickness);
1486     shRB24VMABBEBellowM->DefineSection( 4, z, kRB24VMABBEConTubeRin,  kRB24VMABBEConTubeRou);
1487     z += kRB24VMABBEConTubeL2;
1488     shRB24VMABBEBellowM->DefineSection( 5, z, kRB24VMABBEConTubeRin,  kRB24VMABBEConTubeRou);
1489     TGeoVolume* voRB24VMABBEBellowM = new TGeoVolume("RB24VMABBEBellowM", shRB24VMABBEBellowM, kMedVac);
1490     voRB24VMABBEBellowM->SetVisibility(0);
1491     
1492 //  Connection tube left
1493     TGeoVolume* voRB24VMABBECT1 = new TGeoVolume("RB24VMABBECT1", 
1494                                               new TGeoTube(kRB24VMABBEConTubeRin, kRB24VMABBEConTubeRou,kRB24VMABBEConTubeL1/2.),
1495                                               kMedSteel);
1496 //  Connection tube right
1497     TGeoVolume* voRB24VMABBECT2 = new TGeoVolume("RB24VMABBECT2", 
1498                                               new TGeoTube(kRB24VMABBEConTubeRin, kRB24VMABBEConTubeRou,kRB24VMABBEConTubeL2/2.),
1499                                               kMedSteel);
1500     z = kRB24VMABBEConTubeL1/2.;
1501     voRB24VMABBEBellowM->AddNode(voRB24VMABBECT1, 1, new TGeoTranslation(0., 0., z));
1502     z += kRB24VMABBEConTubeL1/2.;
1503     z += kRB24B1BellowUndL/2.;
1504     voRB24VMABBEBellowM->AddNode(voRB24B1Bellow, 2, new TGeoTranslation(0., 0., z));
1505     z += kRB24B1BellowUndL/2.;
1506     z += kRB24VMABBEConTubeL2/2.;
1507     voRB24VMABBEBellowM->AddNode(voRB24VMABBECT2, 1, new TGeoTranslation(0., 0., z));
1508     z += kRB24VMABBEConTubeL2/2.;
1509
1510     voRB24VMABCRB->AddNode(voRB24VMABBEBellowM, 1, new TGeoTranslation(0., 0., kRB24VMABCRBT1L/2.));
1511
1512 // Pos 1.2 Rotable flange                     LHCVBU__0013[*]
1513 // Front
1514     voRB24VMABCRB->AddNode(voRB24B1RFlange,  3, new TGeoCombiTrans(0., 0., - kRB24VMABCRBT1L/2. + 0.86, rot180));
1515 // End
1516     z =  kRB24VMABCRBT1L/2. + kRB24B1BellowUndL +kRB24VMABBEConTubeL1 +  kRB24VMABBEConTubeL2;
1517     voRB24VMABCRB->AddNode(voRB24B1RFlange,  4, new TGeoTranslation(0., 0., z - 0.86));
1518
1519
1520 // Pos 2    Trans. Tube Flange       LHCVSR__0062
1521 // Pos 2.1  Transition Tube          LHCVSR__0063
1522 // Pos 2.2  Transition Flange        LHCVSR__0060
1523 //
1524 // Transition Tube with Flange
1525     TGeoPcon* shRB24VMABCTT = new TGeoPcon(0., 360., 7);
1526     z = 0.;
1527     shRB24VMABCTT->DefineSection(0, z, 6.3/2., 11.16/2.);
1528     z += 0.25;
1529     shRB24VMABCTT->DefineSection(1, z, 6.3/2., 11.16/2.);
1530     shRB24VMABCTT->DefineSection(2, z, 6.3/2.,  9.30/2.);
1531     z += 0.25;
1532     shRB24VMABCTT->DefineSection(3, z, 6.3/2.,  9.30/2.);
1533     shRB24VMABCTT->DefineSection(4, z, 6.3/2.,  6.70/2.);
1534     z += (20.35 - 0.63);
1535     shRB24VMABCTT->DefineSection(5, z, 6.3/2.,  6.7/2.);
1536     z += 0.63;
1537     shRB24VMABCTT->DefineSection(6, z, 6.5/2.,  6.9/2.);
1538     TGeoVolume* voRB24VMABCTT = new TGeoVolume("RB24VMABCTT", shRB24VMABCTT, kMedSteel);
1539     voRB24VMABCRB->AddNode(voRB24VMABCTT, 1, new TGeoTranslation(0., 0., - kRB24VMABCRBT1L/2.-1.));
1540
1541 // Pos 3   RF Contact   D63         LHCVSR__0057
1542 // Pos 3.1 RF Contact Flange        LHCVSR__0017
1543 //
1544     TGeoPcon* shRB24VMABCCTFlange = new TGeoPcon(0., 360., 6);
1545     const Float_t kRB24VMABCCTFlangeRin  = 6.36/2.;  // Inner radius
1546     const Float_t kRB24VMABCCTFlangeL    = 1.30;     // Length
1547     
1548     z = 0.;
1549     shRB24VMABCCTFlange->DefineSection(0, z, kRB24VMABCCTFlangeRin,  6.5/2.);
1550     z += 0.15;
1551     shRB24VMABCCTFlange->DefineSection(1, z, kRB24VMABCCTFlangeRin,  6.5/2.);
1552     shRB24VMABCCTFlange->DefineSection(2, z, kRB24VMABCCTFlangeRin,  6.9/2.);
1553     z += 0.9;
1554     shRB24VMABCCTFlange->DefineSection(3, z, kRB24VMABCCTFlangeRin,  6.9/2.);
1555     shRB24VMABCCTFlange->DefineSection(4, z, kRB24VMABCCTFlangeRin, 11.16/2.);
1556     z += 0.25;
1557     shRB24VMABCCTFlange->DefineSection(5, z, kRB24VMABCCTFlangeRin, 11.16/2.);
1558     TGeoVolume* voRB24VMABCCTFlange = new TGeoVolume("RB24VMABCCTFlange", shRB24VMABCCTFlange, kMedCu);
1559 //
1560 // Pos 3.2 RF-Contact        LHCVSR__0056
1561 //
1562     TGeoPcon* shRB24VMABCCT = new TGeoPcon(0., 360., 4);
1563     const Float_t kRB24VMABCCTRin  = 6.30/2.;        // Inner radius
1564     const Float_t kRB24VMABCCTCRin = 7.29/2.;        // Max. inner radius conical section
1565     const Float_t kRB24VMABCCTL    = 11.88;          // Length
1566     const Float_t kRB24VMABCCTSL   = 10.48;          // Length of straight section
1567     const Float_t kRB24VMABCCTd    =  0.03;          // Thickness
1568     z = 0;
1569     shRB24VMABCCT->DefineSection(0, z,  kRB24VMABCCTCRin,  kRB24VMABCCTCRin + kRB24VMABCCTd);
1570     z =  kRB24VMABCCTL -  kRB24VMABCCTSL;
1571     shRB24VMABCCT->DefineSection(1, z,  kRB24VMABCCTRin + 0.35,  kRB24VMABCCTRin + 0.35 + kRB24VMABCCTd);
1572     z = kRB24VMABCCTL  -  kRB24VMABCCTFlangeL;
1573     shRB24VMABCCT->DefineSection(2, z,  kRB24VMABCCTRin,  kRB24VMABCCTRin + kRB24VMABCCTd);
1574     z = kRB24VMABCCTL;
1575     shRB24VMABCCT->DefineSection(3, z,  kRB24VMABCCTRin,  kRB24VMABCCTRin + kRB24VMABCCTd);
1576
1577     TGeoVolume* voRB24VMABCCT = new TGeoVolume("RB24VMABCCT", shRB24VMABCCT, kMedCu);
1578     
1579     TGeoVolumeAssembly* voRB24VMABRFCT = new TGeoVolumeAssembly("RB24VMABRFCT");
1580     voRB24VMABRFCT->AddNode(voRB24VMABCCT,        1, gGeoIdentity);
1581     voRB24VMABRFCT->AddNode( voRB24VMABCCTFlange, 1, new TGeoTranslation(0., 0.,  kRB24VMABCCTL - kRB24VMABCCTFlangeL));
1582
1583     z =  kRB24VMABCRBT1L/2. + kRB24B1BellowUndL + kRB24VMABBEConTubeL1 +  kRB24VMABBEConTubeL2 - kRB24VMABCCTL + 1.;    
1584     voRB24VMABCRB->AddNode(voRB24VMABRFCT, 1, new TGeoTranslation(0., 0., z));
1585
1586
1587 //
1588 // Assembling RB24
1589 //    
1590     TGeoVolumeAssembly* voRB24 = new TGeoVolumeAssembly("RB24");
1591
1592     voRB24->AddNode(voRB24CuTubeM, 1, gGeoIdentity);
1593     z =  kRB24CuTubeL/2;
1594     voRB24->AddNode(voRB24B1BellowM, 1, new TGeoTranslation(0., 0., z));
1595     z +=  (kRB24B1L +  kRB24AIpML/2.);
1596
1597     voRB24->AddNode(voRB24AIpM, 1, new TGeoTranslation(0., 0., z));
1598     z +=  (kRB24AIpML/2. +  kRB24ValveWz/2.);
1599
1600     voRB24->AddNode(voRB24ValveMo, 1, new TGeoTranslation(0., 0., z));
1601     z += (kRB24ValveWz/2.+ kRB24VMABCRBT1L/2. + 1.);
1602
1603     voRB24->AddNode(voRB24VMABCRB, 1, new TGeoTranslation(0., 0., z));
1604     top->AddNode(voRB24, 1, new TGeoCombiTrans(0., 0., kRB24CuTubeL/2 + 88.5 + 400., rot180));
1605     
1606 // 
1607 ////////////////////////////////////////////////////////////////////////////////     
1608 //                                                                            //
1609 //                                  The Absorber Vacuum system                // 
1610 //                                                                            //
1611 ////////////////////////////////////////////////////////////////////////////////
1612 //
1613 //    Rotable Flange starts at:            82.00 cm from IP      
1614 //    Length of rotable flange section:    10.68 cm             
1615 //    Weld                                  0.08 cm                  
1616 //    Length of straight section          207.21 cm
1617 //    =======================================================================
1618 //                                        299.97 cm  [0.03 cm missing ?]
1619 //    Length of opening cone              252.09 cm
1620 //    Weld                                  0.15 cm                
1621 //    Length of compensator                30.54 cm
1622 //    Weld                                  0.15 cm                
1623 //    Length of fixed flange  2.13 - 0.97   1.16 cm
1624 //    ======================================================================= 
1625 //                                        584.06 cm [584.80 installed] [0.74 cm missing]
1626 //    RB26/3
1627 //    Length of split flange  2.13 - 1.2    0.93 cm
1628 //    Weld                                  0.15 cm                
1629 //    Length of fixed point section        16.07 cm               
1630 //    Weld                                  0.15 cm                
1631 //    Length of opening cone              629.20 cm
1632 //    Weld                                  0.30 cm                
1633 //    Kength of the compensator            41.70 cm
1634 //    Weld                                  0.30 cm                
1635 //    Length of fixed flange  2.99 - 1.72   1.27 cm
1636 // =================================================
1637 //    Length of RB26/3                    690.07 cm [689.20 installed] [0.87 cm too much] 
1638 //
1639 //    RB26/4-5
1640 //    Length of split flange  2.13 - 1.2    0.93 cm
1641 //    Weld                                  0.15 cm                
1642 //    Length of fixed point section        16.07 cm               
1643 //    Weld                                  0.15 cm                
1644 //    Length of opening cone              629.20 cm
1645 //    Weld                                  0.30 cm                
1646 //    Length of closing cone
1647 //    Weld
1648 //    Lenth of straight section 
1649 //    Kength of the compensator            41.70 cm
1650 //    Weld                                  0.30 cm                
1651 //    Length of fixed flange  2.99 - 1.72   1.27 cm
1652 // =================================================
1653 //    Length of RB26/3                    690.07 cm [689.20 installed] [0.87 cm too much] 
1654       
1655 ///////////////////////////////////////////
1656 //                                       //
1657 //    RB26/1-2                           //  
1658 //    Drawing LHCV2a_0050 [as installed] //
1659 //    Drawing LHCV2a_0008                //
1660 //    Drawing LHCV2a_0001                //
1661 ///////////////////////////////////////////
1662 //    Pos1 Vacuum Tubes   LHCVC2A__0010
1663 //    Pos2 Compensator    LHCVC2A__0064
1664 //    Pos3 Rotable Flange LHCVFX___0016
1665 //    Pos4 Fixed Flange   LHCVFX___0006
1666 //    Pos5 Bellow Tooling LHCVFX___0003
1667 //
1668 //             
1669 //
1670 ///////////////////////////////////
1671 //    RB26/1-2 Vacuum Tubes      //
1672 //    Drawing  LHCVC2a_0010      //
1673 ///////////////////////////////////
1674       const Float_t kRB26s12TubeL = 459.45; // 0.15 cm added for welding       
1675       //
1676       // Add 1 cm on outer diameter for insulation
1677       //
1678       TGeoPcon* shRB26s12Tube = new TGeoPcon(0., 360., 5);
1679       // Section 1: straight section
1680       shRB26s12Tube->DefineSection(0,   0.00,         5.84/2.,  6.00/2.);
1681       shRB26s12Tube->DefineSection(1, 207.21,         5.84/2.,  6.00/2.);      
1682       // Section 2: 0.72 deg opening cone
1683       shRB26s12Tube->DefineSection(2, 207.21,         5.84/2.,  6.14/2.);      
1684       shRB26s12Tube->DefineSection(3, 452.30,        12.00/2., 12.30/2.);      
1685       shRB26s12Tube->DefineSection(4, kRB26s12TubeL, 12.00/2., 12.30/2.); 
1686       TGeoVolume* voRB26s12Tube  = new TGeoVolume("RB26s12Tube", shRB26s12Tube, kMedSteel);
1687       // Add the insulation layer    
1688       TGeoVolume* voRB26s12TubeIns = new TGeoVolume("RB26s12TubeIns", MakeInsulationFromTemplate(shRB26s12Tube), kMedInsu); 
1689       voRB26s12Tube->AddNode(voRB26s12TubeIns, 1, gGeoIdentity);
1690
1691  
1692       TGeoVolume* voRB26s12TubeM  = new TGeoVolume("RB26s12TubeM", MakeMotherFromTemplate(shRB26s12Tube), kMedVac);
1693       voRB26s12TubeM->AddNode(voRB26s12Tube, 1, gGeoIdentity);
1694       
1695
1696       
1697 ///////////////////////////////////
1698 //    RB26/2   Axial Compensator //
1699 //    Drawing  LHCVC2a_0064      //
1700 ///////////////////////////////////
1701       const Float_t kRB26s2CompL             = 30.65;    // Length of the compensator
1702       const Float_t kRB26s2BellowRo          = 14.38/2.; // Bellow outer radius        [Pos 1]
1703       const Float_t kRB26s2BellowRi          = 12.12/2.; // Bellow inner radius        [Pos 1] 
1704       const Int_t   kRB26s2NumberOfPlies     = 14;       // Number of plies            [Pos 1] 
1705       const Float_t kRB26s2BellowUndL        = 10.00;    // Length of undulated region [Pos 1]  [+10 mm installed including pretension ?] 
1706       const Float_t kRB26s2PlieThickness     =  0.025;   // Plie thickness             [Pos 1]
1707       const Float_t kRB26s2ConnectionPlieR   =  0.21;    // Connection plie radius     [Pos 1] 
1708 //  Plie radius
1709       const Float_t kRB26s2PlieR = 
1710         (kRB26s2BellowUndL - 4. *  kRB26s2ConnectionPlieR + 2. * kRB26s2PlieThickness + 
1711          (2. *  kRB26s2NumberOfPlies - 2.) * kRB26s2PlieThickness) / (4. * kRB26s2NumberOfPlies - 2.);
1712       const Float_t kRB26s2CompTubeInnerR    = 12.00/2.;  // Connection tubes inner radius     [Pos 2 + 3]
1713       const Float_t kRB26s2CompTubeOuterR    = 12.30/2.;  // Connection tubes outer radius     [Pos 2 + 3]
1714       const Float_t kRB26s2WeldingTubeLeftL  =  9.00/2.;  // Left connection tube half length  [Pos 2]
1715       const Float_t kRB26s2WeldingTubeRightL = 11.65/2.;  // Right connection tube half length [Pos 3]  [+ 0.15 cm for welding]
1716       const Float_t kRB26s2RingOuterR        = 18.10/2.;  // Ring inner radius                 [Pos 4]
1717       const Float_t kRB26s2RingL             =  0.40/2.;  // Ring half length                  [Pos 4]
1718       const Float_t kRB26s2RingZ             =  6.50   ;  // Ring z-position                   [Pos 4]
1719       const Float_t kRB26s2ProtOuterR        = 18.20/2.;  // Protection tube outer radius      [Pos 5]
1720       const Float_t kRB26s2ProtL             = 15.00/2.;  // Protection tube half length       [Pos 5]
1721       const Float_t kRB26s2ProtZ             =  6.70   ;  // Protection tube z-position        [Pos 5]
1722    
1723       
1724 // Mother volume
1725 //
1726       TGeoPcon* shRB26s2Compensator  = new TGeoPcon(0., 360., 6);
1727       shRB26s2Compensator->DefineSection( 0,   0.0, 0., kRB26s2CompTubeOuterR);
1728       shRB26s2Compensator->DefineSection( 1,   kRB26s2RingZ, 0., kRB26s2CompTubeOuterR);      
1729       shRB26s2Compensator->DefineSection( 2,   kRB26s2RingZ, 0., kRB26s2ProtOuterR);      
1730       shRB26s2Compensator->DefineSection( 3,   kRB26s2ProtZ + 2. * kRB26s2ProtL, 0., kRB26s2ProtOuterR);            
1731       shRB26s2Compensator->DefineSection( 4,   kRB26s2ProtZ + 2. * kRB26s2ProtL, 0., kRB26s2CompTubeOuterR);
1732       shRB26s2Compensator->DefineSection( 5,   kRB26s2CompL                    , 0., kRB26s2CompTubeOuterR);            
1733       TGeoVolume* voRB26s2Compensator  = new TGeoVolume("RB26s2Compensator", shRB26s2Compensator, kMedVac);
1734             
1735 //
1736 // [Pos 1] Bellow
1737 //      
1738 //
1739       TGeoVolume* voRB26s2Bellow = new TGeoVolume("RB26s2Bellow", new TGeoTube(kRB26s2BellowRi, kRB26s2BellowRo, kRB26s2BellowUndL/2.), kMedVac);
1740 //      
1741 //  Upper part of the undulation
1742 //
1743       TGeoTorus* shRB26s2PlieTorusU  =  new TGeoTorus(kRB26s2BellowRo - kRB26s2PlieR, kRB26s2PlieR - kRB26s2PlieThickness, kRB26s2PlieR);
1744       shRB26s2PlieTorusU->SetName("RB26s2TorusU");
1745       TGeoTube*  shRB26s2PlieTubeU   =  new TGeoTube (kRB26s2BellowRo - kRB26s2PlieR, kRB26s2BellowRo, kRB26s2PlieR);
1746       shRB26s2PlieTubeU->SetName("RB26s2TubeU");
1747       TGeoCompositeShape*  shRB26s2UpperPlie = new TGeoCompositeShape("RB26s2UpperPlie", "RB26s2TorusU*RB26s2TubeU");
1748  
1749       TGeoVolume* voRB26s2WiggleU = new TGeoVolume("RB26s2UpperPlie", shRB26s2UpperPlie, kMedSteel);
1750 //
1751 // Lower part of the undulation
1752       TGeoTorus* shRB26s2PlieTorusL =  new TGeoTorus(kRB26s2BellowRi + kRB26s2PlieR, kRB26s2PlieR - kRB26s2PlieThickness, kRB26s2PlieR);
1753       shRB26s2PlieTorusL->SetName("RB26s2TorusL");
1754       TGeoTube*  shRB26s2PlieTubeL   =  new TGeoTube (kRB26s2BellowRi, kRB26s2BellowRi + kRB26s2PlieR, kRB26s2PlieR);
1755       shRB26s2PlieTubeL->SetName("RB26s2TubeL");
1756       TGeoCompositeShape*  shRB26s2LowerPlie = new TGeoCompositeShape("RB26s2LowerPlie", "RB26s2TorusL*RB26s2TubeL");
1757       
1758       TGeoVolume* voRB26s2WiggleL = new TGeoVolume("RB26s2LowerPlie", shRB26s2LowerPlie, kMedSteel); 
1759
1760 //
1761 // Connection between upper and lower part of undulation
1762       TGeoVolume* voRB26s2WiggleC1 = new TGeoVolume("RB26s2PlieConn1",  
1763                                                     new TGeoTube(kRB26s2BellowRi + kRB26s2PlieR, 
1764                                                                  kRB26s2BellowRo - kRB26s2PlieR, kRB26s2PlieThickness / 2.), kMedSteel);
1765 //
1766 // One wiggle
1767       TGeoVolumeAssembly* voRB26s2Wiggle = new TGeoVolumeAssembly("RB26s2Wiggle");
1768       z0 =  -  kRB26s2PlieThickness / 2.;
1769       voRB26s2Wiggle->AddNode(voRB26s2WiggleC1,  1 , new TGeoTranslation(0., 0., z0));
1770       z0 += kRB26s2PlieR -  kRB26s2PlieThickness / 2.;
1771       voRB26s2Wiggle->AddNode(voRB26s2WiggleU,   1 , new TGeoTranslation(0., 0., z0));
1772       z0 += kRB26s2PlieR -  kRB26s2PlieThickness / 2.;
1773       voRB26s2Wiggle->AddNode(voRB26s2WiggleC1,  2 , new TGeoTranslation(0., 0., z0));
1774       z0 += kRB26s2PlieR -  kRB26s2PlieThickness;
1775       voRB26s2Wiggle->AddNode(voRB26s2WiggleL ,  1 , new TGeoTranslation(0., 0., z0));
1776 // Positioning of the volumes
1777       z0   = - kRB26s2BellowUndL/2.+ kRB26s2ConnectionPlieR;
1778       voRB26s2Bellow->AddNode(voRB26s2WiggleL, 1, new TGeoTranslation(0., 0., z0));
1779       z0  +=  kRB26s2ConnectionPlieR;
1780       zsh  = 4. *  kRB26s2PlieR -  2. * kRB26s2PlieThickness;
1781       for (Int_t iw = 0; iw < kRB26s2NumberOfPlies; iw++) {
1782           Float_t zpos =  z0 + iw * zsh;        
1783           voRB26s2Bellow->AddNode(voRB26s2Wiggle,  iw + 1, new TGeoTranslation(0., 0., zpos -  kRB26s2PlieThickness));  
1784       }
1785
1786       voRB26s2Compensator->AddNode(voRB26s2Bellow, 1,  new TGeoTranslation(0., 0., 2. * kRB26s2WeldingTubeLeftL + kRB26s2BellowUndL/2.));
1787       
1788 //
1789 // [Pos 2] Left Welding Tube
1790 //      
1791       TGeoTube* shRB26s2CompLeftTube = new TGeoTube(kRB26s2CompTubeInnerR, kRB26s2CompTubeOuterR, kRB26s2WeldingTubeLeftL);
1792       TGeoVolume* voRB26s2CompLeftTube = new TGeoVolume("RB26s2CompLeftTube", shRB26s2CompLeftTube, kMedSteel);
1793       voRB26s2Compensator->AddNode(voRB26s2CompLeftTube, 1,  new TGeoTranslation(0., 0., kRB26s2WeldingTubeLeftL));
1794 //
1795 // [Pos 3] Right Welding Tube
1796 //      
1797       TGeoTube* shRB26s2CompRightTube = new TGeoTube(kRB26s2CompTubeInnerR, kRB26s2CompTubeOuterR, kRB26s2WeldingTubeRightL);
1798       TGeoVolume* voRB26s2CompRightTube = new TGeoVolume("RB26s2CompRightTube", shRB26s2CompRightTube, kMedSteel);
1799       voRB26s2Compensator->AddNode(voRB26s2CompRightTube,  1, new TGeoTranslation(0., 0.,  kRB26s2CompL - kRB26s2WeldingTubeRightL));
1800 //
1801 // [Pos 4] Ring
1802 //      
1803       TGeoTube* shRB26s2CompRing = new TGeoTube(kRB26s2CompTubeOuterR, kRB26s2RingOuterR, kRB26s2RingL);
1804       TGeoVolume* voRB26s2CompRing = new TGeoVolume("RB26s2CompRing", shRB26s2CompRing, kMedSteel);
1805       voRB26s2Compensator->AddNode(voRB26s2CompRing,  1, new TGeoTranslation(0., 0., kRB26s2RingZ + kRB26s2RingL));
1806
1807 //
1808 // [Pos 5] Outer Protecting Tube
1809 //      
1810       TGeoTube* shRB26s2CompProtTube = new TGeoTube(kRB26s2RingOuterR, kRB26s2ProtOuterR, kRB26s2ProtL);
1811       TGeoVolume* voRB26s2CompProtTube = new TGeoVolume("RB26s2CompProtTube", shRB26s2CompProtTube, kMedSteel);
1812       voRB26s2Compensator->AddNode(voRB26s2CompProtTube, 1,  new TGeoTranslation(0., 0., kRB26s2ProtZ + kRB26s2ProtL));
1813       
1814 ///////////////////////////////////
1815 //    Rotable Flange             //
1816 //    Drawing  LHCVFX_0016       //
1817 /////////////////////////////////// 
1818       const Float_t kRB26s1RFlangeTubeRi    = 5.84/2. ;  // Tube inner radius
1819       const Float_t kRB26s1RFlangeTubeRo    = 6.00/2. ;  // Tube outer radius
1820
1821 // Pos 1 Clamp Ring          LHCVFX__0015
1822       const Float_t kRB26s1RFlangeCrL       = 1.40     ; // Lenth of the clamp ring
1823       const Float_t kRB26s1RFlangeCrRi1     = 6.72/2.  ; // Ring inner radius section 1
1824       const Float_t kRB26s1RFlangeCrRi2     = 6.06/2.  ; // Ring inner radius section 2
1825       const Float_t kRB26s1RFlangeCrRo      = 8.60/2.  ; // Ring outer radius 
1826       const Float_t kRB26s1RFlangeCrD       = 0.800    ; // Width section 1
1827       
1828       TGeoPcon* shRB26s1RFlangeCr = new TGeoPcon(0., 360., 4);
1829       z0 = 0.;
1830       shRB26s1RFlangeCr->DefineSection(0, z0, kRB26s1RFlangeCrRi1, kRB26s1RFlangeCrRo);
1831       z0 += kRB26s1RFlangeCrD;
1832       shRB26s1RFlangeCr->DefineSection(1, z0, kRB26s1RFlangeCrRi1, kRB26s1RFlangeCrRo);
1833       shRB26s1RFlangeCr->DefineSection(2, z0, kRB26s1RFlangeCrRi2, kRB26s1RFlangeCrRo);      
1834       z0 = kRB26s1RFlangeCrL;
1835       shRB26s1RFlangeCr->DefineSection(3, z0, kRB26s1RFlangeCrRi2, kRB26s1RFlangeCrRo);
1836       TGeoVolume* voRB26s1RFlangeCr =  
1837           new TGeoVolume("RB26s1RFlangeCr", shRB26s1RFlangeCr, kMedSteel);
1838
1839 // Pos 2 Insert              LHCVFX__0015
1840       const Float_t kRB26s1RFlangeIsL       = 4.88     ; // Lenth of the insert
1841       const Float_t kRB26s1RFlangeIsR       = 6.70/2.  ; // Ring radius
1842       const Float_t kRB26s1RFlangeIsD       = 0.80     ; // Ring Width
1843
1844       TGeoPcon* shRB26s1RFlangeIs = new TGeoPcon(0., 360., 4);
1845       z0 = 0.;
1846       shRB26s1RFlangeIs->DefineSection(0, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeIsR);
1847       z0 += kRB26s1RFlangeIsD;
1848       shRB26s1RFlangeIs->DefineSection(1, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeIsR);
1849       shRB26s1RFlangeIs->DefineSection(2, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);      
1850       z0 = kRB26s1RFlangeIsL;
1851       shRB26s1RFlangeIs->DefineSection(3, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
1852       TGeoVolume* voRB26s1RFlangeIs =  
1853           new TGeoVolume("RB26s1RFlangeIs", shRB26s1RFlangeIs, kMedSteel);
1854 // 4.88 + 3.7 = 8.58 (8.7 to avoid overlap)
1855 // Pos 3 Fixed Point Section LHCVC2A_0021
1856       const Float_t kRB26s1RFlangeFpL       = 5.88     ; // Length of the fixed point section (0.08 cm added for welding)
1857       const Float_t kRB26s1RFlangeFpZ       = 3.82     ; // Position of the ring
1858       const Float_t kRB26s1RFlangeFpD       = 0.59     ; // Width of the ring
1859       const Float_t kRB26s1RFlangeFpR       = 7.00/2.  ; // Radius of the ring
1860       
1861       TGeoPcon* shRB26s1RFlangeFp = new TGeoPcon(0., 360., 6);
1862       z0 = 0.;
1863       shRB26s1RFlangeFp->DefineSection(0, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
1864       z0 += kRB26s1RFlangeFpZ;
1865       shRB26s1RFlangeFp->DefineSection(1, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);      
1866       shRB26s1RFlangeFp->DefineSection(2, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeFpR);           
1867       z0 += kRB26s1RFlangeFpD;
1868       shRB26s1RFlangeFp->DefineSection(3, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeFpR);           
1869       shRB26s1RFlangeFp->DefineSection(4, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
1870       z0 = kRB26s1RFlangeFpL;
1871       shRB26s1RFlangeFp->DefineSection(5, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
1872       TGeoVolume* voRB26s1RFlangeFp = new TGeoVolume("RB26s1RFlangeFp", shRB26s1RFlangeFp, kMedSteel);
1873              
1874 // Put everything in a mother volume
1875       TGeoPcon* shRB26s1RFlange = new TGeoPcon(0., 360., 8);
1876       z0 =  0.;
1877       shRB26s1RFlange->DefineSection(0, z0, 0., kRB26s1RFlangeCrRo);
1878       z0 += kRB26s1RFlangeCrL;
1879       shRB26s1RFlange->DefineSection(1, z0, 0., kRB26s1RFlangeCrRo);
1880       shRB26s1RFlange->DefineSection(2, z0, 0., kRB26s1RFlangeTubeRo);
1881       z0 = kRB26s1RFlangeIsL + kRB26s1RFlangeFpZ;
1882       shRB26s1RFlange->DefineSection(3, z0, 0., kRB26s1RFlangeTubeRo);      
1883       shRB26s1RFlange->DefineSection(4, z0, 0., kRB26s1RFlangeFpR);
1884       z0 += kRB26s1RFlangeFpD;
1885       shRB26s1RFlange->DefineSection(5, z0, 0., kRB26s1RFlangeFpR);               
1886       shRB26s1RFlange->DefineSection(6, z0, 0., kRB26s1RFlangeTubeRo);
1887       z0 = kRB26s1RFlangeIsL + kRB26s1RFlangeFpL;
1888       shRB26s1RFlange->DefineSection(7, z0, 0., kRB26s1RFlangeTubeRo);
1889       TGeoVolume* voRB26s1RFlange = new TGeoVolume("RB26s1RFlange", shRB26s1RFlange, kMedVac);
1890
1891       voRB26s1RFlange->AddNode(voRB26s1RFlangeIs, 1, gGeoIdentity);
1892       voRB26s1RFlange->AddNode(voRB26s1RFlangeCr, 1, gGeoIdentity);
1893       voRB26s1RFlange->AddNode(voRB26s1RFlangeFp, 1, new TGeoTranslation(0., 0., kRB26s1RFlangeIsL));
1894       
1895 ///////////////////////////////////
1896 //    Fixed Flange               //
1897 //    Drawing  LHCVFX_0006       //
1898 /////////////////////////////////// 
1899       const Float_t kRB26s2FFlangeL      =  2.13;    // Length of the flange
1900       const Float_t kRB26s2FFlangeD1     =  0.97;    // Length of section 1
1901       const Float_t kRB26s2FFlangeD2     =  0.29;    // Length of section 2                                                  
1902       const Float_t kRB26s2FFlangeD3     =  0.87;    // Length of section 3                                                        
1903       const Float_t kRB26s2FFlangeRo     = 17.15/2.; // Flange outer radius 
1904       const Float_t kRB26s2FFlangeRi1    = 12.30/2.; // Flange inner radius section 1
1905       const Float_t kRB26s2FFlangeRi2    = 12.00/2.; // Flange inner radius section 2
1906       const Float_t kRB26s2FFlangeRi3    = 12.30/2.; // Flange inner radius section 3
1907       z0 = 0;
1908       TGeoPcon* shRB26s2FFlange = new TGeoPcon(0., 360., 6);
1909       z0 = 0.;
1910       shRB26s2FFlange->DefineSection(0, z0, kRB26s2FFlangeRi1, kRB26s2FFlangeRo);
1911       z0 += kRB26s2FFlangeD1;
1912       shRB26s2FFlange->DefineSection(1, z0, kRB26s2FFlangeRi1, kRB26s2FFlangeRo);
1913       shRB26s2FFlange->DefineSection(2, z0, kRB26s2FFlangeRi2, kRB26s2FFlangeRo);
1914       z0 += kRB26s2FFlangeD2;
1915       shRB26s2FFlange->DefineSection(3, z0, kRB26s2FFlangeRi2, kRB26s2FFlangeRo);
1916       shRB26s2FFlange->DefineSection(4, z0, kRB26s2FFlangeRi3, kRB26s2FFlangeRo);
1917       z0 += kRB26s2FFlangeD3;
1918       shRB26s2FFlange->DefineSection(5, z0, kRB26s2FFlangeRi3, kRB26s2FFlangeRo);
1919       TGeoVolume* voRB26s2FFlange = new TGeoVolume("RB26s2FFlange", shRB26s2FFlange, kMedSteel);
1920
1921       TGeoVolume* voRB26s2FFlangeM = new TGeoVolume("RB26s2FFlangeM", MakeMotherFromTemplate(shRB26s2FFlange, 2, 5), kMedVac);
1922       voRB26s2FFlangeM->AddNode(voRB26s2FFlange, 1, gGeoIdentity);
1923       
1924       
1925
1926 ////////////////////////////////////////
1927 //                                    //
1928 //    RB26/3                          //  
1929 //    Drawing LHCV2a_0048             //
1930 //    Drawing LHCV2a_0002             //
1931 ////////////////////////////////////////    
1932 //
1933 //    Pos 1 Vacuum Tubes      LHCVC2A__0003
1934 //    Pos 2 Fixed Point       LHCVFX___0005
1935 //    Pos 3 Split Flange      LHCVFX___0007
1936 //    Pos 4 Fixed Flange      LHCVFX___0004
1937 //    Pos 5 Axial Compensator LHCVC2A__0065
1938 //
1939 //
1940 //
1941 //
1942 ///////////////////////////////////
1943 //    Vacuum Tube                //
1944 //    Drawing  LHCVC2A_0003      //
1945 /////////////////////////////////// 
1946       const Float_t kRB26s3TubeL = 629.35 + 0.3; // 0.3 cm added for welding
1947       
1948       TGeoPcon* shRB26s3Tube = new TGeoPcon(0., 360., 7);
1949       // Section 1: straight section
1950       shRB26s3Tube->DefineSection(0,   0.00, 12.00/2., 12.30/2.);
1951       shRB26s3Tube->DefineSection(1,   2.00, 12.00/2., 12.30/2.);      
1952       // Section 2: 0.829 deg opening cone
1953       shRB26s3Tube->DefineSection(2,   2.00, 12.00/2., 12.40/2.);
1954
1955       shRB26s3Tube->DefineSection(3, 217.80, 12.00/2., 12.40/2.);
1956       shRB26s3Tube->DefineSection(4, 217.80, 12.00/2., 12.40/2.);      
1957
1958       shRB26s3Tube->DefineSection(5, 622.20, 30.00/2., 30.60/2.);      
1959       shRB26s3Tube->DefineSection(6, kRB26s3TubeL, 30.00/2., 30.60/2.); 
1960
1961       TGeoVolume* voRB26s3Tube = new TGeoVolume("RB26s3Tube", shRB26s3Tube, kMedSteel);
1962 //    Add the insulation layer
1963       TGeoVolume* voRB26s3TubeIns = new TGeoVolume("RB26s3TubeIns", MakeInsulationFromTemplate(shRB26s3Tube), kMedInsu); 
1964       voRB26s3Tube->AddNode(voRB26s3TubeIns, 1, gGeoIdentity);
1965
1966       TGeoVolume* voRB26s3TubeM  = new TGeoVolume("RB26s3TubeM", MakeMotherFromTemplate(shRB26s3Tube), kMedVac);
1967       voRB26s3TubeM->AddNode(voRB26s3Tube, 1, gGeoIdentity);
1968
1969       
1970
1971 ///////////////////////////////////
1972 //    Fixed Point                //
1973 //    Drawing  LHCVFX_0005       //
1974 /////////////////////////////////// 
1975       const Float_t kRB26s3FixedPointL       = 16.37     ; // Length of the fixed point section (0.3 cm added for welding)
1976       const Float_t kRB26s3FixedPointZ       =  9.72     ; // Position of the ring (0.15 cm added for welding)
1977       const Float_t kRB26s3FixedPointD       =  0.595    ; // Width of the ring
1978       const Float_t kRB26s3FixedPointR       = 13.30/2.  ; // Radius of the ring
1979       const Float_t kRB26s3FixedPointRi      = 12.00/2.  ; // Inner radius of the tube
1980       const Float_t kRB26s3FixedPointRo1     = 12.30/2.  ; // Outer radius of the tube (in)
1981       const Float_t kRB26s3FixedPointRo2     = 12.40/2.  ; // Outer radius of the tube (out)
1982       const Float_t kRB26s3FixedPointDs      =  1.5      ; // Width of straight section behind ring
1983       const Float_t kRB26s3FixedPointDc      =  3.15     ; // Width of conical  section behind ring (0.15 cm added for welding)      
1984       
1985       TGeoPcon* shRB26s3FixedPoint = new TGeoPcon(0., 360., 8);
1986       z0 = 0.;
1987       shRB26s3FixedPoint->DefineSection(0, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
1988       z0 += kRB26s3FixedPointZ;
1989       shRB26s3FixedPoint->DefineSection(1, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);      
1990       shRB26s3FixedPoint->DefineSection(2, z0, kRB26s3FixedPointRi, kRB26s3FixedPointR);          
1991       z0 += kRB26s3FixedPointD;
1992       shRB26s3FixedPoint->DefineSection(3, z0, kRB26s3FixedPointRi, kRB26s3FixedPointR);          
1993       shRB26s3FixedPoint->DefineSection(4, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
1994       z0 += kRB26s3FixedPointDs;
1995       shRB26s3FixedPoint->DefineSection(5, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
1996       z0 += kRB26s3FixedPointDc;
1997       shRB26s3FixedPoint->DefineSection(6, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo2);
1998       z0 = kRB26s3FixedPointL;
1999       shRB26s3FixedPoint->DefineSection(7, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo2);
2000       TGeoVolume* voRB26s3FixedPoint = new TGeoVolume("RB26s3FixedPoint", shRB26s3FixedPoint, kMedSteel);
2001
2002       TGeoVolume* voRB26s3FixedPointM = new TGeoVolume("RB26s3FixedPointM", MakeMotherFromTemplate(shRB26s3FixedPoint), kMedVac);
2003       voRB26s3FixedPointM->AddNode(voRB26s3FixedPoint, 1, gGeoIdentity);
2004       
2005 ///////////////////////////////////
2006 //    Split Flange               //
2007 //    Drawing  LHCVFX_0005       //
2008 /////////////////////////////////// 
2009       const Float_t kRB26s3SFlangeL      =  2.13;        // Length of the flange
2010       const Float_t kRB26s3SFlangeD1     =  0.57;        // Length of section 1
2011       const Float_t kRB26s3SFlangeD2     =  0.36;        // Length of section 2                                              
2012       const Float_t kRB26s3SFlangeD3     =  0.50 + 0.70; // Length of section 3                                                    
2013       const Float_t kRB26s3SFlangeRo     = 17.15/2.;     // Flange outer radius 
2014       const Float_t kRB26s3SFlangeRi1    = 12.30/2.;     // Flange inner radius section 1
2015       const Float_t kRB26s3SFlangeRi2    = 12.00/2.;     // Flange inner radius section 2
2016       const Float_t kRB26s3SFlangeRi3    = 12.30/2.;     // Flange inner radius section 3
2017       z0 = 0;
2018       TGeoPcon* shRB26s3SFlange = new TGeoPcon(0., 360., 6);
2019       z0 = 0.;
2020       shRB26s3SFlange->DefineSection(0, z0, kRB26s3SFlangeRi1, kRB26s3SFlangeRo);
2021       z0 += kRB26s3SFlangeD1;
2022       shRB26s3SFlange->DefineSection(1, z0, kRB26s3SFlangeRi1, kRB26s3SFlangeRo);
2023       shRB26s3SFlange->DefineSection(2, z0, kRB26s3SFlangeRi2, kRB26s3SFlangeRo);
2024       z0 += kRB26s3SFlangeD2;
2025       shRB26s3SFlange->DefineSection(3, z0, kRB26s3SFlangeRi2, kRB26s3SFlangeRo);
2026       shRB26s3SFlange->DefineSection(4, z0, kRB26s3SFlangeRi3, kRB26s3SFlangeRo);
2027       z0 += kRB26s3SFlangeD3;
2028       shRB26s3SFlange->DefineSection(5, z0, kRB26s3SFlangeRi3, kRB26s3SFlangeRo);
2029       TGeoVolume* voRB26s3SFlange = new TGeoVolume("RB26s3SFlange", shRB26s3SFlange, kMedSteel);
2030
2031       TGeoVolume* voRB26s3SFlangeM = new TGeoVolume("RB26s3SFlange", MakeMotherFromTemplate(shRB26s3SFlange, 0, 3), kMedVac);
2032       voRB26s3SFlangeM->AddNode(voRB26s3SFlange, 1, gGeoIdentity);
2033         
2034 ///////////////////////////////////
2035 //    RB26/3   Fixed Flange      //
2036 //    Drawing  LHCVFX___0004     //
2037 /////////////////////////////////// 
2038       const Float_t kRB26s3FFlangeL      =  2.99;    // Length of the flange
2039       const Float_t kRB26s3FFlangeD1     =  1.72;    // Length of section 1
2040       const Float_t kRB26s3FFlangeD2     =  0.30;    // Length of section 2                                                  
2041       const Float_t kRB26s3FFlangeD3     =  0.97;    // Length of section 3                                                        
2042       const Float_t kRB26s3FFlangeRo     = 36.20/2.; // Flange outer radius 
2043       const Float_t kRB26s3FFlangeRi1    = 30.60/2.; // Flange inner radius section 1
2044       const Float_t kRB26s3FFlangeRi2    = 30.00/2.; // Flange inner radius section 2
2045       const Float_t kRB26s3FFlangeRi3    = 30.60/2.; // Flange inner radius section 3
2046       z0 = 0;
2047       TGeoPcon* shRB26s3FFlange = new TGeoPcon(0., 360., 6);
2048       z0 = 0.;
2049       shRB26s3FFlange->DefineSection(0, z0, kRB26s3FFlangeRi1, kRB26s3FFlangeRo);
2050       z0 += kRB26s3FFlangeD1;
2051       shRB26s3FFlange->DefineSection(1, z0, kRB26s3FFlangeRi1, kRB26s3FFlangeRo);
2052       shRB26s3FFlange->DefineSection(2, z0, kRB26s3FFlangeRi2, kRB26s3FFlangeRo);
2053       z0 += kRB26s3FFlangeD2;
2054       shRB26s3FFlange->DefineSection(3, z0, kRB26s3FFlangeRi2, kRB26s3FFlangeRo);
2055       shRB26s3FFlange->DefineSection(4, z0, kRB26s3FFlangeRi3, kRB26s3FFlangeRo);
2056       z0 += kRB26s3FFlangeD3;
2057       shRB26s3FFlange->DefineSection(5, z0, kRB26s3FFlangeRi3, kRB26s3FFlangeRo);
2058       TGeoVolume* voRB26s3FFlange = new TGeoVolume("RB26s3FFlange", shRB26s3FFlange, kMedSteel);
2059       
2060       TGeoVolume* voRB26s3FFlangeM = new TGeoVolume("RB26s3FFlange", MakeMotherFromTemplate(shRB26s3FFlange, 2, 5), kMedVac);
2061       voRB26s3FFlangeM->AddNode(voRB26s3FFlange, 1, gGeoIdentity);
2062             
2063
2064
2065 ///////////////////////////////////
2066 //    RB26/3   Axial Compensator //
2067 //    Drawing  LHCVC2a_0065      //
2068 /////////////////////////////////// 
2069       const Float_t kRB26s3CompL              = 42.0;     // Length of the compensator (0.3 cm added for welding)
2070       const Float_t kRB26s3BellowRo           = 34.00/2.; // Bellow outer radius        [Pos 1]
2071       const Float_t kRB26s3BellowRi           = 30.10/2.; // Bellow inner radius        [Pos 1] 
2072       const Int_t   kRB26s3NumberOfPlies      = 13;       // Number of plies            [Pos 1] 
2073       const Float_t kRB26s3BellowUndL         = 17.70;    // Length of undulated region [Pos 1] 
2074       const Float_t kRB26s3PlieThickness      =  0.06;    // Plie thickness             [Pos 1]
2075       const Float_t kRB26s3ConnectionPlieR    =  0.21;    // Connection plie radius     [Pos 1] 
2076 //  Plie radius
2077       const Float_t kRB26s3PlieR = 
2078         (kRB26s3BellowUndL - 4. *  kRB26s3ConnectionPlieR + 2. * kRB26s3PlieThickness + 
2079          (2. *  kRB26s3NumberOfPlies - 2.) * kRB26s3PlieThickness) / (4. * kRB26s3NumberOfPlies - 2.);
2080
2081       //
2082       // The welding tubes have 3 sections with different radii and 2 transition regions.
2083       // Section 1: connection to the outside
2084       // Section 2: commection to the bellow
2085       // Section 3: between 1 and 2
2086       const Float_t kRB26s3CompTubeInnerR1    = 30.0/2.;  // Outer Connection tubes inner radius     [Pos 4 + 3]
2087       const Float_t kRB26s3CompTubeOuterR1    = 30.6/2.;  // Outer Connection tubes outer radius     [Pos 4 + 3]
2088       const Float_t kRB26s3CompTubeInnerR2    = 29.4/2.;  // Connection tubes inner radius           [Pos 4 + 3]
2089       const Float_t kRB26s3CompTubeOuterR2    = 30.0/2.;  // Connection tubes outer radius           [Pos 4 + 3]
2090       const Float_t kRB26s3CompTubeInnerR3    = 30.6/2.;  // Connection tubes inner radius at bellow [Pos 4 + 3]
2091       const Float_t kRB26s3CompTubeOuterR3    = 32.2/2.;  // Connection tubes outer radius at bellow [Pos 4 + 3]
2092  
2093       const Float_t kRB26s3WeldingTubeLeftL1  =  2.0;     // Left connection tube length             [Pos 4]
2094       const Float_t kRB26s3WeldingTubeLeftL2  =  3.4;     // Left connection tube length             [Pos 4]
2095       const Float_t kRB26s3WeldingTubeLeftL   =  7.0;     // Left connection tube total length       [Pos 4]
2096       const Float_t kRB26s3WeldingTubeRightL1 =  2.3;     // Right connection tube length            [Pos 3] (0.3 cm added for welding)
2097       const Float_t kRB26s3WeldingTubeRightL2 = 13.4;     // Right connection tube length            [Pos 3]
2098
2099       const Float_t kRB26s3WeldingTubeT1      =  0.6;     // Length of first r-transition            [Pos 4 + 3]
2100       const Float_t kRB26s3WeldingTubeT2      =  1.0;     // Length of 2nd   r-transition            [Pos 4 + 3]       
2101
2102       
2103       
2104       const Float_t kRB26s3RingOuterR         = 36.1/2.;  // Ring inner radius                       [Pos 4]
2105       const Float_t kRB26s3RingL              =  0.8/2.;  // Ring half length                        [Pos 4]
2106       const Float_t kRB26s3RingZ              =  3.7   ;  // Ring z-position                         [Pos 4]
2107       const Float_t kRB26s3ProtOuterR         = 36.2/2.;  // Protection tube outer radius            [Pos 2]
2108       const Float_t kRB26s3ProtL              = 27.0/2.;  // Protection tube half length             [Pos 2]
2109       const Float_t kRB26s3ProtZ              =  4.0   ;  // Protection tube z-position              [Pos 2]
2110    
2111       
2112 // Mother volume
2113 //
2114       TGeoPcon* shRB26s3Compensator  = new TGeoPcon(0., 360., 6);
2115       shRB26s3Compensator->DefineSection( 0,   0.0, 0., kRB26s3CompTubeOuterR1);
2116       shRB26s3Compensator->DefineSection( 1,   kRB26s3RingZ, 0., kRB26s3CompTubeOuterR1);      
2117       shRB26s3Compensator->DefineSection( 2,   kRB26s3RingZ, 0., kRB26s3ProtOuterR);      
2118       shRB26s3Compensator->DefineSection( 3,   kRB26s3ProtZ + 2. * kRB26s3ProtL, 0., kRB26s3ProtOuterR);            
2119       shRB26s3Compensator->DefineSection( 4,   kRB26s3ProtZ + 2. * kRB26s3ProtL, 0., kRB26s3CompTubeOuterR1);
2120       shRB26s3Compensator->DefineSection( 5,   kRB26s3CompL                    , 0., kRB26s3CompTubeOuterR1);            
2121       TGeoVolume* voRB26s3Compensator  =  
2122           new TGeoVolume("RB26s3Compensator", shRB26s3Compensator, kMedVac);
2123             
2124 //
2125 // [Pos 1] Bellow
2126 //      
2127 //
2128       TGeoVolume* voRB26s3Bellow = new TGeoVolume("RB26s3Bellow", 
2129                                                   new TGeoTube(kRB26s3BellowRi, kRB26s3BellowRo, kRB26s3BellowUndL/2.), kMedVac);
2130 //      
2131 //  Upper part of the undulation
2132 //
2133       TGeoTorus* shRB26s3PlieTorusU  =  new TGeoTorus(kRB26s3BellowRo - kRB26s3PlieR, kRB26s3PlieR - kRB26s3PlieThickness, kRB26s3PlieR);
2134       shRB26s3PlieTorusU->SetName("RB26s3TorusU");
2135       TGeoTube*  shRB26s3PlieTubeU   =  new TGeoTube (kRB26s3BellowRo - kRB26s3PlieR, kRB26s3BellowRo, kRB26s3PlieR);
2136       shRB26s3PlieTubeU->SetName("RB26s3TubeU");
2137       TGeoCompositeShape*  shRB26s3UpperPlie = new TGeoCompositeShape("RB26s3UpperPlie", "RB26s3TorusU*RB26s3TubeU");
2138  
2139       TGeoVolume* voRB26s3WiggleU = new TGeoVolume("RB26s3UpperPlie", shRB26s3UpperPlie, kMedSteel);
2140 //
2141 // Lower part of the undulation
2142       TGeoTorus* shRB26s3PlieTorusL =  new TGeoTorus(kRB26s3BellowRi + kRB26s3PlieR, kRB26s3PlieR - kRB26s3PlieThickness, kRB26s3PlieR);
2143       shRB26s3PlieTorusL->SetName("RB26s3TorusL");
2144       TGeoTube*  shRB26s3PlieTubeL   =  new TGeoTube (kRB26s3BellowRi, kRB26s3BellowRi + kRB26s3PlieR, kRB26s3PlieR);
2145       shRB26s3PlieTubeL->SetName("RB26s3TubeL");
2146       TGeoCompositeShape*  shRB26s3LowerPlie = new TGeoCompositeShape("RB26s3LowerPlie", "RB26s3TorusL*RB26s3TubeL");
2147       
2148       TGeoVolume* voRB26s3WiggleL = new TGeoVolume("RB26s3LowerPlie", shRB26s3LowerPlie, kMedSteel); 
2149
2150 //
2151 // Connection between upper and lower part of undulation
2152       TGeoVolume* voRB26s3WiggleC1 = new TGeoVolume("RB26s3PlieConn1",  
2153                                                     new TGeoTube(kRB26s3BellowRi + kRB26s3PlieR, 
2154                                                                  kRB26s3BellowRo - kRB26s3PlieR, kRB26s3PlieThickness / 2.), kMedSteel);
2155 //
2156 // One wiggle
2157       TGeoVolumeAssembly* voRB26s3Wiggle = new TGeoVolumeAssembly("RB26s3Wiggle");
2158       z0 =  -  kRB26s3PlieThickness / 2.;
2159       voRB26s3Wiggle->AddNode(voRB26s3WiggleC1,  1 , new TGeoTranslation(0., 0., z0));
2160       z0 += kRB26s3PlieR -  kRB26s3PlieThickness / 2.;
2161       voRB26s3Wiggle->AddNode(voRB26s3WiggleU,   1 , new TGeoTranslation(0., 0., z0));
2162       z0 += kRB26s3PlieR -  kRB26s3PlieThickness / 2.;
2163       voRB26s3Wiggle->AddNode(voRB26s3WiggleC1,  2 , new TGeoTranslation(0., 0., z0));
2164       z0 += kRB26s3PlieR -  kRB26s3PlieThickness;
2165       voRB26s3Wiggle->AddNode(voRB26s3WiggleL,  1 , new TGeoTranslation(0., 0., z0));
2166 // Positioning of the volumes
2167       z0   = - kRB26s3BellowUndL/2.+ kRB26s3ConnectionPlieR;
2168       voRB26s3Bellow->AddNode(voRB26s3WiggleL, 1, new TGeoTranslation(0., 0., z0));
2169       z0  +=  kRB26s3ConnectionPlieR;
2170       zsh  = 4. *  kRB26s3PlieR -  2. * kRB26s3PlieThickness;
2171       for (Int_t iw = 0; iw < kRB26s3NumberOfPlies; iw++) {
2172           Float_t zpos =  z0 + iw * zsh;        
2173           voRB26s3Bellow->AddNode(voRB26s3Wiggle,  iw + 1, new TGeoTranslation(0., 0., zpos -  kRB26s3PlieThickness));  
2174       }
2175
2176       voRB26s3Compensator->AddNode(voRB26s3Bellow, 1,  new TGeoTranslation(0., 0., kRB26s3WeldingTubeLeftL + kRB26s3BellowUndL/2.));
2177
2178
2179 //
2180 // [Pos 2] Outer Protecting Tube
2181 //      
2182       TGeoTube* shRB26s3CompProtTube = new TGeoTube(kRB26s3RingOuterR, kRB26s3ProtOuterR, kRB26s3ProtL);
2183       TGeoVolume* voRB26s3CompProtTube =  
2184           new TGeoVolume("RB26s3CompProtTube", shRB26s3CompProtTube, kMedSteel);
2185       voRB26s3Compensator->AddNode(voRB26s3CompProtTube, 1,  new TGeoTranslation(0., 0., kRB26s3ProtZ + kRB26s3ProtL));
2186       
2187
2188 //
2189 // [Pos 3] Right Welding Tube
2190 //      
2191       TGeoPcon* shRB26s3CompRightTube = new TGeoPcon(0., 360., 5);
2192       z0 = 0.;
2193       shRB26s3CompRightTube->DefineSection(0, z0,  kRB26s3CompTubeInnerR3, kRB26s3CompTubeOuterR3);
2194       z0 += kRB26s3WeldingTubeT2;
2195       shRB26s3CompRightTube->DefineSection(1, z0,  kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2196       z0 += kRB26s3WeldingTubeRightL2;
2197       shRB26s3CompRightTube->DefineSection(2, z0,  kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2198       z0 += kRB26s3WeldingTubeT1;
2199       shRB26s3CompRightTube->DefineSection(3, z0,  kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2200       z0 += kRB26s3WeldingTubeRightL1;
2201       shRB26s3CompRightTube->DefineSection(4, z0,  kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2202       
2203       TGeoVolume* voRB26s3CompRightTube =  
2204           new TGeoVolume("RB26s3CompRightTube", shRB26s3CompRightTube, kMedSteel);
2205       voRB26s3Compensator->AddNode(voRB26s3CompRightTube,  1, new TGeoTranslation(0., 0.,  kRB26s3CompL - z0));
2206
2207 //
2208 // [Pos 4] Left Welding Tube
2209 //      
2210       TGeoPcon* shRB26s3CompLeftTube = new TGeoPcon(0., 360., 5);
2211       z0 = 0.;
2212       shRB26s3CompLeftTube->DefineSection(0, z0,  kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2213       z0 += kRB26s3WeldingTubeLeftL1;
2214       shRB26s3CompLeftTube->DefineSection(1, z0,  kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2215       z0 += kRB26s3WeldingTubeT1;
2216       shRB26s3CompLeftTube->DefineSection(2, z0,  kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2217       z0 += kRB26s3WeldingTubeLeftL2;
2218       shRB26s3CompLeftTube->DefineSection(3, z0,  kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2219       z0 += kRB26s3WeldingTubeT2;
2220       shRB26s3CompLeftTube->DefineSection(4, z0,  kRB26s3CompTubeInnerR3, kRB26s3CompTubeOuterR3);
2221
2222       TGeoVolume* voRB26s3CompLeftTube =  
2223           new TGeoVolume("RB26s3CompLeftTube", shRB26s3CompLeftTube, kMedSteel);
2224       voRB26s3Compensator->AddNode(voRB26s3CompLeftTube, 1,  gGeoIdentity);
2225 //
2226 // [Pos 5] Ring
2227 //      
2228       TGeoTube* shRB26s3CompRing = new TGeoTube(kRB26s3CompTubeOuterR2, kRB26s3RingOuterR, kRB26s3RingL);
2229       TGeoVolume* voRB26s3CompRing =  
2230           new TGeoVolume("RB26s3CompRing", shRB26s3CompRing, kMedSteel);
2231       voRB26s3Compensator->AddNode(voRB26s3CompRing,  1, new TGeoTranslation(0., 0., kRB26s3RingZ + kRB26s3RingL));
2232
2233
2234
2235 ///////////////////////////////////////////
2236 //                                       //
2237 //    RB26/4-5                           //  
2238 //    Drawing LHCV2a_0012 [as installed] //
2239 ////////////////////////////////////////////
2240 //    Pos1 Vacuum Tubes        LHCVC2A__0014
2241 //    Pos2 Compensator         LHCVC2A__0066
2242 //    Pos3 Fixed Point Section LHCVC2A__0016
2243 //    Pos4 Split Flange        LHCVFX___0005
2244 //    Pos5 RotableFlange       LHCVFX___0009
2245 ////////////////////////////////////////////
2246
2247 ///////////////////////////////////
2248 //    RB26/4-5 Vacuum Tubes      //
2249 //    Drawing  LHCVC2a_0014      //
2250 /////////////////////////////////// 
2251       const Float_t kRB26s45TubeL = 593.12 + 0.3; // 0.3 cm added for welding
2252       
2253       TGeoPcon* shRB26s45Tube = new TGeoPcon(0., 360., 11);
2254       // Section 1: straight section
2255       shRB26s45Tube->DefineSection( 0,   0.00, 30.00/2., 30.60/2.);
2256       shRB26s45Tube->DefineSection( 1,   1.20, 30.00/2., 30.60/2.);
2257       shRB26s45Tube->DefineSection( 2,   1.20, 30.00/2., 30.80/2.);
2258       shRB26s45Tube->DefineSection( 3,  25.10, 30.00/2., 30.80/2.);      
2259       // Section 2: 0.932 deg opening cone
2260       shRB26s45Tube->DefineSection( 4, 486.10, 45.00/2., 45.80/2.);      
2261       // Section 3: straight section 4 mm 
2262       shRB26s45Tube->DefineSection( 5, 512.10, 45.00/2., 45.80/2.);
2263       // Section 4: straight section 3 mm
2264       shRB26s45Tube->DefineSection( 6, 512.10, 45.00/2., 45.60/2.);
2265       shRB26s45Tube->DefineSection( 7, 527.70, 45.00/2., 45.60/2.);
2266       // Section 4: closing cone 
2267       shRB26s45Tube->DefineSection( 8, 591.30, 10.00/2., 10.60/2.);      
2268       shRB26s45Tube->DefineSection( 9, 591.89, 10.00/2., 10.30/2.);      
2269
2270       shRB26s45Tube->DefineSection(10, kRB26s45TubeL, 10.00/2., 10.30/2.);      
2271       TGeoVolume* voRB26s45Tube  =  
2272           new TGeoVolume("RB26s45Tube", shRB26s45Tube, kMedSteel);
2273
2274       TGeoVolume* voRB26s45TubeM  = new TGeoVolume("RB26s45TubeM", MakeMotherFromTemplate(shRB26s45Tube), kMedVac);
2275       voRB26s45TubeM->AddNode(voRB26s45Tube, 1, gGeoIdentity);
2276             
2277       
2278
2279 ///////////////////////////////////
2280 //    RB26/5   Axial Compensator //
2281 //    Drawing  LHCVC2a_0066      //
2282 /////////////////////////////////// 
2283       const Float_t kRB26s5CompL             = 27.60;    // Length of the compensator (0.30 cm added for welding)
2284       const Float_t kRB26s5BellowRo          = 12.48/2.; // Bellow outer radius        [Pos 1]
2285       const Float_t kRB26s5BellowRi          = 10.32/2.; // Bellow inner radius        [Pos 1] 
2286       const Int_t   kRB26s5NumberOfPlies     = 15;       // Number of plies            [Pos 1] 
2287       const Float_t kRB26s5BellowUndL        = 10.50;    // Length of undulated region [Pos 1] 
2288       const Float_t kRB26s5PlieThickness     =  0.025;   // Plie thickness             [Pos 1]
2289       const Float_t kRB26s5ConnectionPlieR   =  0.21;    // Connection plie radius     [Pos 1] 
2290       const Float_t kRB26s5ConnectionR       = 11.2/2.;  // Bellow connection radius   [Pos 1] 
2291 //  Plie radius
2292       const Float_t kRB26s5PlieR = 
2293         (kRB26s5BellowUndL - 4. *  kRB26s5ConnectionPlieR + 2. * kRB26s5PlieThickness + 
2294          (2. *  kRB26s5NumberOfPlies - 2.) * kRB26s5PlieThickness) / (4. * kRB26s5NumberOfPlies - 2.);
2295       const Float_t kRB26s5CompTubeInnerR    = 10.00/2.;  // Connection tubes inner radius     [Pos 2 + 3]
2296       const Float_t kRB26s5CompTubeOuterR    = 10.30/2.;  // Connection tubes outer radius     [Pos 2 + 3]
2297       const Float_t kRB26s5WeldingTubeLeftL  =  3.70/2.;  // Left connection tube half length  [Pos 2]
2298       const Float_t kRB26s5WeldingTubeRightL = 13.42/2.;  // Right connection tube half length [Pos 3]   (0.3 cm added for welding)
2299       const Float_t kRB26s5RingInnerR        = 11.2/2.;   // Ring inner radius                 [Pos 4]
2300       const Float_t kRB26s5RingOuterR        = 16.0/2.;   // Ring inner radius                 [Pos 4]
2301       const Float_t kRB26s5RingL             =  0.4/2.;   // Ring half length                  [Pos 4]
2302       const Float_t kRB26s5RingZ             = 14.97;     // Ring z-position                   [Pos 4]
2303       const Float_t kRB26s5ProtOuterR        = 16.2/2.;   // Protection tube outer radius      [Pos 5]
2304       const Float_t kRB26s5ProtL             = 13.0/2.;   // Protection tube half length       [Pos 5]
2305       const Float_t kRB26s5ProtZ             =  2.17;     // Protection tube z-position        [Pos 5]
2306       const Float_t kRB26s5DetailZR          = 11.3/2.;   // Detail Z max radius
2307       
2308       
2309 // Mother volume
2310 //
2311       TGeoPcon* shRB26s5Compensator  = new TGeoPcon(0., 360., 8);
2312       shRB26s5Compensator->DefineSection( 0,   0.0,                                                  0., kRB26s5CompTubeOuterR);
2313       shRB26s5Compensator->DefineSection( 1,   kRB26s5ProtZ,                                         0., kRB26s5CompTubeOuterR);      
2314       shRB26s5Compensator->DefineSection( 2,   kRB26s5ProtZ,                                         0., kRB26s5ProtOuterR);
2315       shRB26s5Compensator->DefineSection( 3,   kRB26s5ProtZ + 2. * kRB26s5ProtL + 2. * kRB26s5RingL, 0., kRB26s5ProtOuterR);      
2316       shRB26s5Compensator->DefineSection( 4,   kRB26s5ProtZ + 2. * kRB26s5ProtL + 2. * kRB26s5RingL, 0., kRB26s5DetailZR);
2317       shRB26s5Compensator->DefineSection( 5,   kRB26s5CompL - 8.,                                    0., kRB26s5DetailZR);
2318       shRB26s5Compensator->DefineSection( 6,   kRB26s5CompL - 8.,                                    0., kRB26s5CompTubeOuterR);            
2319       shRB26s5Compensator->DefineSection( 7,   kRB26s5CompL,                                         0., kRB26s5CompTubeOuterR);            
2320       TGeoVolume* voRB26s5Compensator  = new TGeoVolume("RB26s5Compensator", shRB26s5Compensator, kMedVac);
2321             
2322 //
2323 // [Pos 1] Bellow
2324 //      
2325 //
2326       TGeoVolume* voRB26s5Bellow = new TGeoVolume("RB26s5Bellow", 
2327                                                   new TGeoTube(kRB26s5BellowRi, kRB26s5BellowRo, kRB26s5BellowUndL/2.), kMedVac);
2328 //      
2329 //  Upper part of the undulation
2330 //
2331       TGeoTorus* shRB26s5PlieTorusU  =  new TGeoTorus(kRB26s5BellowRo - kRB26s5PlieR, kRB26s5PlieR - kRB26s5PlieThickness, kRB26s5PlieR);
2332       shRB26s5PlieTorusU->SetName("RB26s5TorusU");
2333       TGeoTube*  shRB26s5PlieTubeU   =  new TGeoTube (kRB26s5BellowRo - kRB26s5PlieR, kRB26s5BellowRo, kRB26s5PlieR);
2334       shRB26s5PlieTubeU->SetName("RB26s5TubeU");
2335       TGeoCompositeShape*  shRB26s5UpperPlie = new TGeoCompositeShape("RB26s5UpperPlie", "RB26s5TorusU*RB26s5TubeU");
2336  
2337       TGeoVolume* voRB26s5WiggleU = new TGeoVolume("RB26s5UpperPlie", shRB26s5UpperPlie, kMedSteel);
2338 //
2339 // Lower part of the undulation
2340       TGeoTorus* shRB26s5PlieTorusL =  new TGeoTorus(kRB26s5BellowRi + kRB26s5PlieR, kRB26s5PlieR - kRB26s5PlieThickness, kRB26s5PlieR);
2341       shRB26s5PlieTorusL->SetName("RB26s5TorusL");
2342       TGeoTube*  shRB26s5PlieTubeL   =  new TGeoTube (kRB26s5BellowRi, kRB26s5BellowRi + kRB26s5PlieR, kRB26s5PlieR);
2343       shRB26s5PlieTubeL->SetName("RB26s5TubeL");
2344       TGeoCompositeShape*  shRB26s5LowerPlie = new TGeoCompositeShape("RB26s5LowerPlie", "RB26s5TorusL*RB26s5TubeL");
2345       
2346       TGeoVolume* voRB26s5WiggleL = new TGeoVolume("RB26s5LowerPlie", shRB26s5LowerPlie, kMedSteel); 
2347
2348 //
2349 // Connection between upper and lower part of undulation
2350       TGeoVolume* voRB26s5WiggleC1 = new TGeoVolume("RB26s5PlieConn1",  
2351                                                     new TGeoTube(kRB26s5BellowRi + kRB26s5PlieR, 
2352                                                                  kRB26s5BellowRo - kRB26s5PlieR, kRB26s5PlieThickness / 2.), kMedSteel);
2353 //
2354 // One wiggle
2355       TGeoVolumeAssembly* voRB26s5Wiggle = new TGeoVolumeAssembly("RB26s5Wiggle");
2356       z0 =  -  kRB26s5PlieThickness / 2.;
2357       voRB26s5Wiggle->AddNode(voRB26s5WiggleC1,  1 , new TGeoTranslation(0., 0., z0));
2358       z0 += kRB26s5PlieR -  kRB26s5PlieThickness / 2.;
2359       voRB26s5Wiggle->AddNode(voRB26s5WiggleU,   1 , new TGeoTranslation(0., 0., z0));
2360       z0 += kRB26s5PlieR -  kRB26s5PlieThickness / 2.;
2361       voRB26s5Wiggle->AddNode(voRB26s5WiggleC1,  2 , new TGeoTranslation(0., 0., z0));
2362       z0 += kRB26s5PlieR -  kRB26s5PlieThickness;
2363       voRB26s5Wiggle->AddNode(voRB26s5WiggleL ,  1 , new TGeoTranslation(0., 0., z0));
2364 // Positioning of the volumes
2365       z0   = - kRB26s5BellowUndL/2.+ kRB26s5ConnectionPlieR;
2366       voRB26s5Bellow->AddNode(voRB26s5WiggleL, 1, new TGeoTranslation(0., 0., z0));
2367       z0  +=  kRB26s5ConnectionPlieR;
2368       zsh  = 4. *  kRB26s5PlieR -  2. * kRB26s5PlieThickness;
2369       for (Int_t iw = 0; iw < kRB26s5NumberOfPlies; iw++) {
2370           Float_t zpos =  z0 + iw * zsh;        
2371           voRB26s5Bellow->AddNode(voRB26s5Wiggle,  iw + 1, new TGeoTranslation(0., 0., zpos -  kRB26s5PlieThickness));  
2372       }
2373
2374       voRB26s5Compensator->AddNode(voRB26s5Bellow, 1,  new TGeoTranslation(0., 0., 2. * kRB26s5WeldingTubeLeftL + kRB26s5BellowUndL/2.));
2375       
2376 //
2377 // [Pos 2] Left Welding Tube
2378 //      
2379       TGeoPcon* shRB26s5CompLeftTube = new TGeoPcon(0., 360., 3);
2380       z0 = 0;
2381       shRB26s5CompLeftTube->DefineSection(0, z0, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2382       z0 += 2 * kRB26s5WeldingTubeLeftL - ( kRB26s5ConnectionR - kRB26s5CompTubeOuterR);
2383       shRB26s5CompLeftTube->DefineSection(1, z0, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2384       z0 += ( kRB26s5ConnectionR - kRB26s5CompTubeOuterR);
2385       shRB26s5CompLeftTube->DefineSection(2, z0, kRB26s5ConnectionR - 0.15, kRB26s5ConnectionR);
2386       TGeoVolume* voRB26s5CompLeftTube = new TGeoVolume("RB26s5CompLeftTube", shRB26s5CompLeftTube, kMedSteel);
2387       voRB26s5Compensator->AddNode(voRB26s5CompLeftTube, 1,  gGeoIdentity);
2388 //
2389 // [Pos 3] Right Welding Tube
2390 //      
2391       TGeoPcon* shRB26s5CompRightTube = new TGeoPcon(0., 360., 11);
2392       // Detail Z
2393       shRB26s5CompRightTube->DefineSection( 0, 0.  , kRB26s5CompTubeInnerR + 0.22, 11.2/2.);
2394       shRB26s5CompRightTube->DefineSection( 1, 0.05, kRB26s5CompTubeInnerR + 0.18, 11.2/2.);
2395       shRB26s5CompRightTube->DefineSection( 2, 0.22, kRB26s5CompTubeInnerR       , 11.2/2. - 0.22);
2396       shRB26s5CompRightTube->DefineSection( 3, 0.44, kRB26s5CompTubeInnerR       , 11.2/2.);
2397       shRB26s5CompRightTube->DefineSection( 4, 1.70, kRB26s5CompTubeInnerR       , 11.2/2.);
2398       shRB26s5CompRightTube->DefineSection( 5, 2.10, kRB26s5CompTubeInnerR       , kRB26s5CompTubeOuterR);
2399       shRB26s5CompRightTube->DefineSection( 6, 2.80, kRB26s5CompTubeInnerR       , kRB26s5CompTubeOuterR);
2400       shRB26s5CompRightTube->DefineSection( 7, 2.80, kRB26s5CompTubeInnerR       , 11.3/2.);
2401       shRB26s5CompRightTube->DefineSection( 8, 3.40, kRB26s5CompTubeInnerR       , 11.3/2.);
2402       // Normal pipe
2403       shRB26s5CompRightTube->DefineSection( 9, 3.50, kRB26s5CompTubeInnerR       , kRB26s5CompTubeOuterR);
2404       shRB26s5CompRightTube->DefineSection(10, 2. * kRB26s5WeldingTubeRightL, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2405       
2406       TGeoVolume* voRB26s5CompRightTube =  
2407           new TGeoVolume("RB26s5CompRightTube", shRB26s5CompRightTube, kMedSteel);
2408       voRB26s5Compensator->AddNode(voRB26s5CompRightTube,  1, 
2409                                    new TGeoTranslation(0., 0.,  kRB26s5CompL - 2. * kRB26s5WeldingTubeRightL));
2410 //
2411 // [Pos 4] Ring
2412 //      
2413       TGeoTube* shRB26s5CompRing = new TGeoTube(kRB26s5RingInnerR, kRB26s5RingOuterR, kRB26s5RingL);
2414       TGeoVolume* voRB26s5CompRing =  
2415           new TGeoVolume("RB26s5CompRing", shRB26s5CompRing, kMedSteel);
2416       voRB26s5Compensator->AddNode(voRB26s5CompRing,  1, new TGeoTranslation(0., 0., kRB26s5RingZ + kRB26s5RingL));
2417
2418 //
2419 // [Pos 5] Outer Protecting Tube
2420 //      
2421       TGeoTube* shRB26s5CompProtTube = new TGeoTube(kRB26s5RingOuterR, kRB26s5ProtOuterR, kRB26s5ProtL);
2422       TGeoVolume* voRB26s5CompProtTube =  
2423           new TGeoVolume("RB26s5CompProtTube", shRB26s5CompProtTube, kMedSteel);
2424       voRB26s5Compensator->AddNode(voRB26s5CompProtTube, 1,  new TGeoTranslation(0., 0., kRB26s5ProtZ + kRB26s5ProtL));
2425
2426 ///////////////////////////////////////
2427 //    RB26/4   Fixed Point Section   //
2428 //    Drawing  LHCVC2a_0016          //
2429 /////////////////////////////////////// 
2430       const Float_t kRB26s4TubeRi            =  30.30/2. ; // Tube inner radius  (0.3 cm added for welding)
2431       const Float_t kRB26s4TubeRo            =  30.60/2. ; // Tube outer radius      
2432       const Float_t kRB26s4FixedPointL       =  12.63    ; // Length of the fixed point section
2433       const Float_t kRB26s4FixedPointZ       =  10.53    ; // Position of the ring (0.15 added for welding)
2434       const Float_t kRB26s4FixedPointD       =   0.595   ; // Width of the ring
2435       const Float_t kRB26s4FixedPointR       =  31.60/2. ; // Radius of the ring
2436       
2437       TGeoPcon* shRB26s4FixedPoint = new TGeoPcon(0., 360., 6);
2438       z0 = 0.;
2439       shRB26s4FixedPoint->DefineSection(0, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2440       z0 += kRB26s4FixedPointZ;
2441       shRB26s4FixedPoint->DefineSection(1, z0, kRB26s4TubeRi, kRB26s4TubeRo);      
2442       shRB26s4FixedPoint->DefineSection(2, z0, kRB26s4TubeRi, kRB26s4FixedPointR);                
2443       z0 += kRB26s4FixedPointD;
2444       shRB26s4FixedPoint->DefineSection(3, z0, kRB26s4TubeRi, kRB26s4FixedPointR);                
2445       shRB26s4FixedPoint->DefineSection(4, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2446       z0 = kRB26s4FixedPointL;
2447       shRB26s4FixedPoint->DefineSection(5, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2448       TGeoVolume* voRB26s4FixedPoint = new TGeoVolume("RB26s4FixedPoint", shRB26s4FixedPoint, kMedSteel);
2449       
2450       TGeoVolume* voRB26s4FixedPointM = new TGeoVolume("RB26s4FixedPointM", MakeMotherFromTemplate(shRB26s4FixedPoint), kMedVac);
2451       voRB26s4FixedPointM->AddNode(voRB26s4FixedPoint, 1, gGeoIdentity);
2452             
2453
2454 ///////////////////////////////////////
2455 //    RB26/4   Split Flange          //
2456 //    Drawing  LHCVFX__0005          //
2457 /////////////////////////////////////// 
2458       const Float_t kRB26s4SFlangeL      =  2.99;        // Length of the flange
2459       const Float_t kRB26s4SFlangeD1     =  0.85;        // Length of section 1
2460       const Float_t kRB26s4SFlangeD2     =  0.36;        // Length of section 2                                              
2461       const Float_t kRB26s4SFlangeD3     =  0.73 + 1.05; // Length of section 3                                                    
2462       const Float_t kRB26s4SFlangeRo     = 36.20/2.;     // Flange outer radius 
2463       const Float_t kRB26s4SFlangeRi1    = 30.60/2.;     // Flange inner radius section 1
2464       const Float_t kRB26s4SFlangeRi2    = 30.00/2.;     // Flange inner radius section 2
2465       const Float_t kRB26s4SFlangeRi3    = 30.60/2.;     // Flange inner radius section 3
2466       z0 = 0;
2467       TGeoPcon* shRB26s4SFlange = new TGeoPcon(0., 360., 6);
2468       z0 = 0.;
2469       shRB26s4SFlange->DefineSection(0, z0, kRB26s4SFlangeRi1, kRB26s4SFlangeRo);
2470       z0 += kRB26s4SFlangeD1;
2471       shRB26s4SFlange->DefineSection(1, z0, kRB26s4SFlangeRi1, kRB26s4SFlangeRo);
2472       shRB26s4SFlange->DefineSection(2, z0, kRB26s4SFlangeRi2, kRB26s4SFlangeRo);
2473       z0 += kRB26s4SFlangeD2;
2474       shRB26s4SFlange->DefineSection(3, z0, kRB26s4SFlangeRi2, kRB26s4SFlangeRo);
2475       shRB26s4SFlange->DefineSection(4, z0, kRB26s4SFlangeRi3, kRB26s4SFlangeRo);
2476       z0 += kRB26s4SFlangeD3;
2477       shRB26s4SFlange->DefineSection(5, z0, kRB26s4SFlangeRi3, kRB26s4SFlangeRo);
2478       TGeoVolume* voRB26s4SFlange = new TGeoVolume("RB26s4SFlange", shRB26s4SFlange, kMedSteel);
2479
2480       TGeoVolume* voRB26s4SFlangeM = new TGeoVolume("RB26s4SFlangeM", MakeMotherFromTemplate(shRB26s4SFlange, 0, 3), kMedVac);
2481       voRB26s4SFlangeM->AddNode(voRB26s4SFlange, 1, gGeoIdentity);
2482       
2483 ///////////////////////////////////////
2484 //    RB26/5   Rotable Flange        //
2485 //    Drawing  LHCVFX__0009          //
2486 /////////////////////////////////////// 
2487       const Float_t kRB26s5RFlangeL      =  1.86;    // Length of the flange
2488       const Float_t kRB26s5RFlangeD1     =  0.61;    // Length of section 1
2489       const Float_t kRB26s5RFlangeD2     =  0.15;    // Length of section 2                                                  
2490       const Float_t kRB26s5RFlangeD3     =  0.60;    // Length of section 3                                                        
2491       const Float_t kRB26s5RFlangeD4     =  0.50;    // Length of section 4                                                        
2492       const Float_t kRB26s5RFlangeRo     = 15.20/2.; // Flange outer radius 
2493       const Float_t kRB26s5RFlangeRi1    = 10.30/2.; // Flange inner radius section 1
2494       const Float_t kRB26s5RFlangeRi2    = 10.00/2.; // Flange inner radius section 2
2495       const Float_t kRB26s5RFlangeRi3    = 10.30/2.; // Flange inner radius section 3
2496       const Float_t kRB26s5RFlangeRi4    = 10.50/2.; // Flange inner radius section 4
2497
2498       z0 = 0;
2499       TGeoPcon* shRB26s5RFlange = new TGeoPcon(0., 360., 8);
2500       z0 = 0.;
2501       shRB26s5RFlange->DefineSection(0, z0, kRB26s5RFlangeRi4, kRB26s5RFlangeRo);
2502       z0 += kRB26s5RFlangeD4;
2503       shRB26s5RFlange->DefineSection(1, z0, kRB26s5RFlangeRi4, kRB26s5RFlangeRo);
2504       shRB26s5RFlange->DefineSection(2, z0, kRB26s5RFlangeRi3, kRB26s5RFlangeRo);
2505       z0 += kRB26s5RFlangeD3;
2506       shRB26s5RFlange->DefineSection(3, z0, kRB26s5RFlangeRi3, kRB26s5RFlangeRo);
2507       shRB26s5RFlange->DefineSection(4, z0, kRB26s5RFlangeRi2, kRB26s5RFlangeRo);
2508       z0 += kRB26s5RFlangeD2;
2509       shRB26s5RFlange->DefineSection(5, z0, kRB26s5RFlangeRi2, kRB26s5RFlangeRo);
2510       shRB26s5RFlange->DefineSection(6, z0, kRB26s5RFlangeRi1, kRB26s5RFlangeRo);
2511       z0 += kRB26s5RFlangeD1;
2512       shRB26s5RFlange->DefineSection(7, z0, kRB26s5RFlangeRi1, kRB26s5RFlangeRo);
2513       TGeoVolume* voRB26s5RFlange = new TGeoVolume("RB26s5RFlange", shRB26s5RFlange, kMedSteel);
2514
2515       TGeoVolume* voRB26s5RFlangeM = new TGeoVolume("RB26s5RFlangeM", MakeMotherFromTemplate(shRB26s5RFlange, 4, 7), kMedVac);
2516       voRB26s5RFlangeM->AddNode(voRB26s5RFlange, 1, gGeoIdentity);
2517
2518 //      
2519 // Assemble RB26/1-2
2520 //
2521       TGeoVolumeAssembly* asRB26s12 = new TGeoVolumeAssembly("RB26s12"); 
2522       z0 = 0.;
2523       asRB26s12->AddNode(voRB26s1RFlange,       1, gGeoIdentity);
2524       z0 += kRB26s1RFlangeIsL + kRB26s1RFlangeFpL;
2525       asRB26s12->AddNode(voRB26s12TubeM,         1, new TGeoTranslation(0., 0., z0));
2526       z0 += kRB26s12TubeL;
2527       asRB26s12->AddNode(voRB26s2Compensator,   1, new TGeoTranslation(0., 0., z0));
2528       z0 += kRB26s2CompL;
2529       z0 -= kRB26s2FFlangeD1;
2530       asRB26s12->AddNode(voRB26s2FFlangeM,       1, new TGeoTranslation(0., 0., z0));
2531       z0 += kRB26s2FFlangeL;
2532       const Float_t kRB26s12L = z0;
2533
2534 //
2535 // Assemble RB26/3
2536 //
2537       TGeoVolumeAssembly* asRB26s3 = new TGeoVolumeAssembly("RB26s3"); 
2538       z0 = 0.;
2539       asRB26s3->AddNode(voRB26s3SFlangeM,      1, gGeoIdentity);
2540       z0 +=  kRB26s3SFlangeL;
2541       z0 -=  kRB26s3SFlangeD3;
2542       asRB26s3->AddNode(voRB26s3FixedPointM,   1, new TGeoTranslation(0., 0., z0));
2543       z0 += kRB26s3FixedPointL;
2544       asRB26s3->AddNode(voRB26s3TubeM,         1, new TGeoTranslation(0., 0., z0));
2545       z0 += kRB26s3TubeL;
2546       asRB26s3->AddNode(voRB26s3Compensator,   1, new TGeoTranslation(0., 0., z0));
2547       z0 += kRB26s3CompL;
2548       z0 -= kRB26s3FFlangeD1;
2549       asRB26s3->AddNode(voRB26s3FFlangeM,      1, new TGeoTranslation(0., 0., z0));
2550       z0 += kRB26s3FFlangeL;
2551       const Float_t kRB26s3L = z0;
2552       
2553
2554 //
2555 // Assemble RB26/4-5
2556 //
2557       TGeoVolumeAssembly* asRB26s45 = new TGeoVolumeAssembly("RB26s45"); 
2558       z0 = 0.;
2559       asRB26s45->AddNode(voRB26s4SFlangeM,       1, gGeoIdentity);
2560       z0 +=  kRB26s4SFlangeL;
2561       z0 -=  kRB26s4SFlangeD3;
2562       asRB26s45->AddNode(voRB26s4FixedPointM,    1, new TGeoTranslation(0., 0., z0));
2563       z0 += kRB26s4FixedPointL;
2564       asRB26s45->AddNode(voRB26s45TubeM,         1, new TGeoTranslation(0., 0., z0));
2565       z0 += kRB26s45TubeL;
2566       asRB26s45->AddNode(voRB26s5Compensator,    1, new TGeoTranslation(0., 0., z0));
2567       z0 += kRB26s5CompL;
2568       z0 -= kRB26s5RFlangeD3;
2569       z0 -= kRB26s5RFlangeD4;
2570       asRB26s45->AddNode(voRB26s5RFlangeM,       1, new TGeoTranslation(0., 0., z0));
2571       z0 += kRB26s5RFlangeL;
2572       const Float_t kRB26s45L = z0;
2573       
2574 //
2575 // Assemble RB26
2576 //
2577       TGeoVolumeAssembly* asRB26Pipe = new TGeoVolumeAssembly("RB26Pipe"); 
2578       z0 = 0.;
2579       asRB26Pipe->AddNode(asRB26s12,       1, new TGeoTranslation(0., 0., z0));
2580       z0 +=  kRB26s12L;
2581       asRB26Pipe->AddNode(asRB26s3,        1, new TGeoTranslation(0., 0., z0));
2582       z0 +=  kRB26s3L;
2583       asRB26Pipe->AddNode(asRB26s45,       1, new TGeoTranslation(0., 0., z0));
2584       z0 +=  kRB26s45L;
2585       top->AddNode(asRB26Pipe, 1, new TGeoCombiTrans(0., 0., -82., rot180));
2586 }
2587
2588
2589
2590 //___________________________________________
2591 void AliPIPEv3::CreateMaterials()
2592 {
2593   //
2594   // Define materials for beam pipe
2595   //
2596
2597   AliDebugClass(1,"Create PIPEv3 materials");
2598   Int_t   isxfld = gAlice->Field()->Integ();
2599   Float_t sxmgmx = gAlice->Field()->Max();
2600   // Steel (Inox)  
2601   Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
2602   Float_t zsteel[4] = { 26.,24.,28.,14. };
2603   Float_t wsteel[4] = { .715,.18,.1,.005 };
2604   // AlBe - alloy 
2605   Float_t aAlBe[2] = { 26.98, 9.01};
2606   Float_t zAlBe[2] = { 13.00, 4.00};
2607   Float_t wAlBe[2] = { 0.4, 0.6};
2608   //
2609   // Polyamid
2610   Float_t aPA[4] = {16., 14., 12.,  1.};
2611   Float_t zPA[4] = { 8.,  7.,  6.,  1.};
2612   Float_t wPA[4] = { 1.,  1.,  6., 11.};
2613   //
2614   // Air 
2615   //
2616   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
2617   Float_t zAir[4]={6.,7.,8.,18.};
2618   Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
2619   Float_t dAir = 1.20479E-3;
2620   Float_t dAir1 = 1.20479E-10;
2621   //
2622   // Insulation powder
2623   //                    Si         O       Ti     Al
2624   Float_t ains[4] ={28.0855, 15.9994, 47.867,  26.982};
2625   Float_t zins[4] ={14.,      8.    , 22.   ,  13.   };
2626   Float_t wins[4] ={ 0.3019,  0.4887,  0.1914,  0.018};
2627   //
2628   //
2629   // Anticorodal
2630   //
2631   // Al Si7 Mg 0.6
2632   //
2633   Float_t aaco[3] ={26.982, 28.0855, 24.035};
2634   Float_t zaco[3] ={13.,    14.    , 12.   };
2635   Float_t waco[3] ={ 0.924,  0.07,  0.006};
2636   // Kapton
2637   //
2638   Float_t aKapton[4]={1.00794,12.0107, 14.010,15.9994};
2639   Float_t zKapton[4]={1.,6.,7.,8.};
2640   Float_t wKapton[4]={0.026362,0.69113,0.07327,0.209235};
2641   Float_t dKapton = 1.42;
2642
2643   //
2644   //     Berillium 
2645   AliMaterial(5, "BERILLIUM$", 9.01, 4., 1.848, 35.3, 36.7);
2646   //
2647   //     Carbon 
2648   AliMaterial(6,  "CARBON$   ", 12.01, 6., 2.265, 18.8, 49.9);
2649   //
2650   //     Aluminum 
2651   AliMaterial(9,  "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2);
2652   //
2653   //     Copper 
2654   AliMaterial(10, "COPPER", 63.55, 29, 8.96, 1.43, 85.6/8.96);
2655   //
2656   //     Air 
2657   AliMixture(15, "AIR$      ", aAir, zAir, dAir, 4, wAir);
2658   //
2659   //     Vacuum 
2660   AliMixture(16, "VACUUM$ ", aAir, zAir, dAir1, 4, wAir);
2661   //
2662   //     stainless Steel 
2663   AliMixture(19, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
2664   //
2665   //     reduced density steel to approximate pump getter material
2666   AliMixture(20, "GETTER$", asteel, zsteel, 1.00, 4, wsteel);
2667   //     Al-Be alloy
2668   //     
2669   AliMixture(21, "AlBe$", aAlBe, zAlBe, 2.07, 2, wAlBe);
2670   //     Polyamid
2671   //   
2672   AliMixture(22, "PA$", aPA, zPA, 1.14, -4, wPA);
2673   //
2674   //     Kapton
2675   AliMixture(23, "KAPTON", aKapton, zKapton, dKapton, 4, wKapton);
2676   // Anticorodal 
2677   AliMixture(24, "ANTICORODAL", aaco, zaco, 2.66, 3, waco);
2678
2679   //
2680   //     Insulation powder 
2681    AliMixture(14, "INSULATION0$", ains, zins, 0.41, 4, wins);
2682    AliMixture(34, "INSULATION1$", ains, zins, 0.41, 4, wins);
2683    AliMixture(54, "INSULATION2$", ains, zins, 0.41, 4, wins);
2684    // **************** 
2685    //     Defines tracking media parameters. 
2686    //
2687   Float_t epsil  = .001;    // Tracking precision, 
2688   Float_t stemax = -0.01;   // Maximum displacement for multiple scat 
2689   Float_t tmaxfd = -20.;    // Maximum angle due to field deflection 
2690   Float_t deemax = -.3;     // Maximum fractional energy loss, DLS 
2691   Float_t stmin  = -.8;
2692   // *************** 
2693   //
2694   //    Beryllium 
2695   
2696   AliMedium(5, "BE",       5, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2697
2698   //    Carbon 
2699   AliMedium(6, "C",        6, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2700   //
2701   //    Aluminum 
2702   AliMedium(9, "ALU",      9, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2703   //    Copper 
2704   AliMedium(10, "CU",      10, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2705   //
2706   //    Air 
2707   AliMedium(15, "AIR",    15, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2708   //
2709   //    Vacuum 
2710   AliMedium(16, "VACUUM", 16, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2711   //
2712   //    Steel 
2713   AliMedium(19, "INOX",   19, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2714   //
2715   //    Getter 
2716   AliMedium(20, "GETTER", 20, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2717   //
2718   //   AlBe - Aloy 
2719   AliMedium(21, "AlBe"  , 21, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2720   //
2721   //   Polyamid
2722   AliMedium(22, "PA"  ,   22, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2723   //   Antocorodal
2724   AliMedium(24, "ANTICORODAL",   24, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2725   //    Insulation Powder 
2726   AliMedium(14, "INS_C0          ", 14, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2727   AliMedium(34, "INS_C1          ", 34, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2728   AliMedium(54, "INS_C2          ", 54, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2729   //
2730   //   KAPTON
2731   AliMedium(23, "KAPTON", 23, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2732 }
2733
2734
2735 TGeoPcon* AliPIPEv3::MakeMotherFromTemplate(TGeoPcon* shape, Int_t imin, Int_t imax, Float_t r0, Int_t nz)
2736 {
2737 //
2738 //  Create a mother shape from a template setting some min radii to 0
2739 //
2740     Int_t nz0 = shape->GetNz();
2741     // if nz > -1 the number of planes is given by nz
2742     if (nz != -1) nz0 = nz;
2743     TGeoPcon* mother = new TGeoPcon(0., 360., nz0);
2744
2745     if (imin == -1 || imax == -1) {
2746         imin = 0;
2747         imax = shape->GetNz();
2748     } else if (imax >= nz0) {
2749         imax = nz0 - 1;
2750         printf("Warning: imax reset to nz-1 %5d %5d %5d %5d\n", imin, imax, nz, nz0);
2751     }
2752     
2753
2754     
2755     for (Int_t i = 0;  i < shape->GetNz(); i++) {
2756         Double_t rmin = shape->GetRmin(i);
2757         if ((i >= imin) && (i <= imax) ) rmin = r0;
2758         Double_t rmax = shape->GetRmax(i);
2759         Double_t    z = shape->GetZ(i);
2760         mother->DefineSection(i, z, rmin, rmax);
2761     }
2762     return mother;
2763     
2764 }
2765
2766 TGeoPcon* AliPIPEv3::MakeInsulationFromTemplate(TGeoPcon* shape)
2767 {
2768 //
2769 //  Create an beam pipe insulation layer shape from a template
2770 //
2771     Int_t nz = shape->GetNz();
2772     TGeoPcon* insu = new TGeoPcon(0., 360., nz);
2773     
2774     for (Int_t i = 0;  i < nz; i++) {
2775         Double_t    z = shape->GetZ(i);
2776         Double_t rmin = shape->GetRmin(i);
2777         Double_t rmax = shape->GetRmax(i);
2778         rmax += 0.5;
2779         shape->DefineSection(i, z, rmin, rmax); 
2780         rmin  = rmax - 0.5;
2781         insu->DefineSection(i, z, rmin, rmax);  
2782     }
2783     return insu;
2784     
2785 }
2786
2787
2788 TGeoVolume* AliPIPEv3::MakeBellow(char* ext, Int_t nc, Float_t rMin, Float_t rMax, Float_t dU, Float_t rPlie, Float_t dPlie)
2789 {
2790     // nc     Number of convolution
2791     // rMin   Inner radius of the bellow
2792     // rMax   Outer radius of the bellow
2793     // dU     Undulation length
2794     // rPlie  Plie radius
2795     // dPlie  Plie thickness
2796     const TGeoMedium* kMedVac    =  gGeoManager->GetMedium("PIPE_VACUUM");    
2797     const TGeoMedium* kMedSteel  =  gGeoManager->GetMedium("PIPE_INOX");   
2798
2799     char name[64], nameA[64], nameB[64], bools[64];
2800     TGeoVolume* voBellow = new TGeoVolume(name, new TGeoTube(rMin, rMax, dU/2.), kMedVac);
2801 //      
2802 //  Upper part of the undulation
2803 //
2804     TGeoTorus* shPlieTorusU  =  new TGeoTorus(rMax - rPlie, rPlie - dPlie, rPlie);
2805     sprintf(nameA, "%sTorusU", ext);
2806     shPlieTorusU->SetName(nameA);
2807     TGeoTube*  shPlieTubeU   =  new TGeoTube (rMax - rPlie, rMax, rPlie);
2808     sprintf(nameB, "%sTubeU", ext);
2809     shPlieTubeU->SetName(nameB);
2810     sprintf(name, "%sUpperPlie", ext);
2811     sprintf(bools, "%s*%s", nameA, nameB);
2812     TGeoCompositeShape*  shUpperPlie = new TGeoCompositeShape(name, bools);
2813     
2814     TGeoVolume* voWiggleU = new TGeoVolume(name, shUpperPlie, kMedSteel);
2815 //
2816 // Lower part of the undulation
2817     TGeoTorus* shPlieTorusL =  new TGeoTorus(rMin + rPlie, rPlie - dPlie, rPlie);
2818     sprintf(nameA, "%sTorusL", ext);
2819     shPlieTorusL->SetName(nameA);
2820     TGeoTube*  shPlieTubeL  =  new TGeoTube (rMin, rMin + rPlie, rPlie);
2821     sprintf(nameB, "%sTubeL", ext);
2822     shPlieTubeL->SetName(nameB);
2823     sprintf(name, "%sLowerPlie", ext);
2824     sprintf(bools, "%s*%s", nameA, nameB);
2825     TGeoCompositeShape*  shLowerPlie = new TGeoCompositeShape(name, bools);
2826     
2827     TGeoVolume* voWiggleL = new TGeoVolume(name, shLowerPlie, kMedSteel); 
2828     
2829 //
2830 // Connection between upper and lower part of undulation
2831     sprintf(name, "%sPlieConn1", ext);
2832     TGeoVolume* voWiggleC1 = new TGeoVolume(name, new TGeoTube(rMin + rPlie, rMax - rPlie, dPlie/2.), kMedSteel);
2833 //
2834 // One wiggle
2835     Float_t dz = rPlie -  dPlie / 2.;
2836     Float_t z0 = -  dPlie / 2.;
2837     sprintf(name, "%sWiggle", ext);
2838     TGeoVolumeAssembly* asWiggle = new TGeoVolumeAssembly(name);
2839     asWiggle->AddNode(voWiggleC1,  1 , new TGeoTranslation(0., 0., z0));
2840     z0 += dz;
2841     asWiggle->AddNode(voWiggleU,   1 , new TGeoTranslation(0., 0., z0));
2842     z0 += dz;
2843     asWiggle->AddNode(voWiggleC1,  2 , new TGeoTranslation(0., 0., z0));
2844     z0 += dz;
2845     asWiggle->AddNode(voWiggleL ,  1 , new TGeoTranslation(0., 0., z0));
2846 // Positioning of the volumes
2847     z0   = - dU / 2.+ rPlie;
2848     voBellow->AddNode(voWiggleL, 2, new TGeoTranslation(0., 0., z0));
2849     z0  +=  rPlie;
2850     Float_t zsh  = 4. *  rPlie -  2. * dPlie;
2851     for (Int_t iw = 0; iw < nc; iw++) {
2852         Float_t zpos =  z0 + iw * zsh;  
2853         voBellow->AddNode(asWiggle,  iw + 1, new TGeoTranslation(0., 0., zpos - dPlie));        
2854     }
2855     return voBellow;
2856 }
2857
2858
2859
2860