]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STRUCT/AliPIPEvGEO.cxx
Small correction in comments.
[u/mrichter/AliRoot.git] / STRUCT / AliPIPEvGEO.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 #include <Riostream.h>
25
26 #include <TSystem.h>
27 #include <TVirtualMC.h>
28 #include <TGeoManager.h>
29 #include <TGeoVolume.h>
30 #include <TGeoTorus.h>
31 #include <TGeoTube.h>
32 #include <TGeoPcon.h>
33 #include <TGeoCompositeShape.h>
34
35 #include "AliConst.h"
36 #include "AliMagF.h"
37 #include "AliPIPEvGEO.h"
38 #include "AliRun.h"
39 #include "AliLog.h"
40  
41 ClassImp(AliPIPEvGEO)
42  
43 //_____________________________________________________________________________
44 AliPIPEvGEO::AliPIPEvGEO()
45 {
46 // Constructor
47 }
48
49 //_____________________________________________________________________________
50 AliPIPEvGEO::AliPIPEvGEO(const char *name, const char *title)
51   : AliPIPE(name,title)
52 {
53 // Constructor
54 }
55
56  
57 //___________________________________________
58 void AliPIPEvGEO::CreateGeometry()
59 {
60 //Begin_Html
61 /*
62 <img src="picts/pipe.gif">
63 */
64 //End_Html
65
66
67 //Begin_Html
68 /*
69 <img src="picts/tree_pipe.gif">
70 */
71 //End_Html
72 //
73 //
74 //  The ALICE central beam-pipe according to drawing         LHCVC2C_0001 
75 //  Drawings of sub-elements:
76 //  
77 //  Pos 7 - Minimised Flange:                                LHCVFX_P0025
78 //  Pos 6 - Standard Flange:                                 STDVFUHV0009
79 //  Pos 8 - Bellow:                                          LHCVBX__0001
80 //
81 //  Absolute z-coordinates -82.0 - 400.0 cm 
82 //  Total length:                                          482.0 cm
83 //  It consists of 3 main parts:
84 //  CP/1 The central Be pipe:                              405.0 cm 
85 //  CP/2 The flange on the non-absorber side:               36.5 cm  
86 //  CP/3 The double-bellow and flange on the absorber side: 40.5 cm 
87 //
88 //
89     AliDebug(1,"Create PIPEv0 geometry");
90     Int_t *idtmed = fIdtmed->GetArray();
91     Float_t dz;
92     Float_t cpcon[39];
93     Float_t cpTube[3];
94     Int_t   idrotm[2099];  
95 //
96 // Rotation Matrices
97 //
98 // Rotation by 180 deg
99     AliMatrix(idrotm[2012],90.,180., 90., 90.,180.,  0.);
100
101 //
102     const Float_t kCPz0      = -400.0;
103     const Float_t kCP1Length =  405.0;    
104     const Float_t kCP2Length =   36.6;
105     const Float_t kCP3Length =   40.5;
106     
107     const Float_t kCP2pos    = kCPz0 + kCP2Length / 2.;
108     const Float_t kCP1pos    = kCPz0 + kCP2Length + kCP1Length / 2.;
109     const Float_t kCP3pos    = kCPz0 + kCP2Length + kCP1Length + kCP3Length/2.;
110 ///////////////////
111 //      CP/1     //
112 ///////////////////
113 //  Inner and outer radii of the Be-section [Pos 1]
114     const Float_t kCP1BeRi = 2.90;
115     const Float_t kCP1BeRo = 2.98;
116 //
117 // Be-Stainless Steel adaptor tube [Pos 2] at both ends of the Be-section. Length 5 cm
118     const Float_t kCP1BeStAdaptorLength = 5.00;
119 //
120 // Bulge of the Be-Stainless Steel adaptor Tube [Pos 2]
121     const Float_t kCP1BeStRo = 3.05;
122 //
123 //  Length of bulge [Pos 2]
124     const Float_t kCP1BulgeLength = 0.50;
125 //
126 //  Distance between bulges [Pos 2]
127     const Float_t kCP1BulgeBulgeDistance = 1.00;
128 //
129 // Length of Be-pipe
130     const Float_t kCP1BeLength =  kCP1Length - 2. *  kCP1BeStAdaptorLength;
131 //
132 // CP/1 Mother volume 
133     cpTube[0] = 0.;
134     cpTube[1] = kCP1BeStRo;
135     cpTube[2] = kCP1Length / 2.;
136     gMC->Gsvolu("Q1MO","TUBE", idtmed[kAir], cpTube, 3);    
137     gMC->Gspos("Q1MO", 1, "ALIC", 0., 0., kCP1pos, 0, "ONLY");
138
139 //
140 // CP/1 Be-Section
141 //    
142     cpTube[0] = 0.;
143     cpTube[1] = kCP1BeRo;
144     cpTube[2] = kCP1BeLength / 2.;
145     gMC->Gsvolu("Q1BE","TUBE", idtmed[kBe], cpTube, 3);    
146     cpTube[0] = 0.;
147     cpTube[1] = kCP1BeRi;
148     gMC->Gsvolu("Q1BV","TUBE", idtmed[kVac], cpTube, 3);    
149     gMC->Gspos("Q1BV", 1, "Q1BE", 0., 0., 0., 0, "ONLY");
150     gMC->Gspos("Q1BE", 1, "Q1MO", 0., 0., 0., 0, "ONLY");
151 //
152 //   CP/1 Be-Stainless Steel adaptor tube
153 //
154     cpcon[0 ]  =   0;
155     cpcon[1 ]  = 360;
156     cpcon[2 ]  =  8;
157 //  1 First Bulge 
158     cpcon[3 ]  = - kCP1BeStAdaptorLength / 2.;
159     cpcon[4 ]  = 0.;
160     cpcon[5 ]  = kCP1BeStRo;
161 //  2
162     cpcon[6 ]  = cpcon[3] + kCP1BulgeLength;
163     cpcon[7 ]  = 0.;
164     cpcon[8 ]  = kCP1BeStRo;
165 //  3 
166     cpcon[9 ]  = cpcon[6];
167     cpcon[10]  = 0.;
168     cpcon[11]  = kCP1BeRo;
169 //  4 Between the bulges
170     cpcon[12]  = cpcon[9] + kCP1BulgeBulgeDistance;
171     cpcon[13]  = 0.;
172     cpcon[14]  = kCP1BeRo;
173 //  5 
174     cpcon[15]  = cpcon[12];
175     cpcon[16]  = 0.;
176     cpcon[17]  = kCP1BeStRo;
177 //  6 Second bulge 
178     cpcon[18]  = cpcon[15] + kCP1BulgeLength;
179     cpcon[19]  = 0.;
180     cpcon[20]  = kCP1BeStRo;
181 //  7 
182     cpcon[21]  = cpcon[18] + kCP1BulgeLength;
183     cpcon[22]  = 0.;
184     cpcon[23]  = kCP1BeRo;
185 // 8 Straight piece
186     cpcon[24]  = kCP1BeStAdaptorLength / 2.;
187     cpcon[25]  = 0.;
188     cpcon[26]  = kCP1BeRo;
189 //
190     gMC->Gsvolu("Q1AT","PCON", idtmed[kInox], cpcon, 27);    
191 // 
192 //  Vacuum
193     cpTube[0] =  0.;
194     cpTube[1] = kCP1BeRi;
195     cpTube[2] = -1.;
196     gMC->Gsvolu("Q1AV","TUBE", idtmed[kVac], cpTube, 3);
197     gMC->Gspos("Q1AV", 1, "Q1AT", 0., 0., 0., 0, "ONLY");
198 //  Position adaptor tube at both ends
199     dz = kCP1Length / 2. -  kCP1BeStAdaptorLength / 2.;
200     gMC->Gspos("Q1AT", 1, "Q1MO", 0., 0.,  -dz, 0,            "ONLY");
201     gMC->Gspos("Q1AT", 2, "Q1MO", 0., 0.,   dz, idrotm[2012], "ONLY");
202 //
203 ///////////////////
204 //      CP/2     //
205 ///////////////////
206 //
207 // Fixed Point tube [Pos 5]
208 //
209 // Inner and outer radii of the Stainless Steel pipe    
210     const Float_t kCP2StRi = 2.90;
211     const Float_t kCP2StRo = 2.98;
212 //  
213 // Transition to central Be-pipe (Bulge)   
214 // Length
215     const Float_t kCP2BulgeLength = 0.80;
216 //     
217 // Bulge outer radius
218     const Float_t kCP2BulgeRo = 3.05;
219 //
220 // Fixed Point at z = 391.7 (IP)
221 //
222 // Position of fixed point
223     const Float_t kCP2FixedPointZ = 8.30;
224 //
225 // Outer radius of fixed point
226     const Float_t kCP2FixedPointRo = 3.50;
227 //
228 // Length of fixed point
229     const Float_t kCP2FixedPointLength = 0.60;
230 //
231 // Fixed Flange [Pos 6]    
232 //
233 // Fixed flange outer radius
234     const Float_t kCP2FixedFlangeRo = 7.60;
235 //
236 // Fixed flange inner radius
237     const Float_t kCP2FixedFlangeRi = 3.00;
238 // Fixed flange inner radius bulge
239     const Float_t kCP2FixedFlangeBulgeRi = 2.90;
240 // Fixed flange lengths of sections at inner radius
241     const Float_t  kCP2FixedFlangeRecessLengths[3] ={1., 0.08, 0.9};
242 // Fixed flange length
243     const Float_t kCP2FixedFlangeLength = 1.98;
244 //
245 // Fixed flange bulge
246 // Outer radius
247      const Float_t kCP2FixedFlangeBulgeRo = 3.00;
248 //
249 // Length    
250      const Float_t kCP2FixedFlangeBulgeLength = 2.00;
251 //
252 // CP/2 Mother Volume
253 //
254     cpcon[0 ]  =   0;
255     cpcon[1 ]  = 360;
256     cpcon[2 ]  =  8;
257 //  1 Flange 
258     cpcon[3 ]  = - kCP2Length / 2.;
259     cpcon[4 ]  = 0.;
260     cpcon[5 ]  = kCP2FixedFlangeRo;
261 //  2
262     cpcon[6 ]  = cpcon[3] + kCP2FixedFlangeLength;
263     cpcon[7 ]  = 0.;
264     cpcon[8 ]  = kCP2FixedFlangeRo;
265 //  3 Straight section between Flange and Fixed Point
266     cpcon[9 ]  = cpcon[6];
267     cpcon[10]  = 0.;
268     cpcon[11]  = kCP2FixedFlangeBulgeRo;
269 //  4 
270     cpcon[12]  = cpcon[3] + kCP2FixedPointZ - kCP2FixedPointLength / 2.;
271     cpcon[13]  = 0.;
272     cpcon[14]  = kCP2FixedFlangeBulgeRo;
273 //  5 Fixed Point
274     cpcon[15]  = cpcon[12];
275     cpcon[16]  = 0.;
276     cpcon[17]  = kCP2FixedPointRo;
277 //  6 
278     cpcon[18]  = cpcon[15] + kCP2FixedPointLength;
279     cpcon[19]  = 0.;
280     cpcon[20]  = kCP2FixedPointRo;
281 //  7 Straight section between Fixed Point and transition bulge
282     cpcon[21]  = cpcon[18];
283     cpcon[22]  = 0.;
284     cpcon[23]  = kCP2BulgeRo;
285 //  8
286     cpcon[24]  = kCP2Length / 2.;
287     cpcon[25]  = 0.;
288     cpcon[26]  = kCP2BulgeRo;
289     gMC->Gsvolu("Q2MO","PCON", idtmed[kAir], cpcon, 27);
290     dz =  kCP2pos;
291     gMC->Gspos("Q2MO", 1, "ALIC", 0., 0., dz, 0, "ONLY");
292 //
293 //  CP/2 Fixed Flange [Pos 6] 
294 //
295     cpcon[0 ]  =   0;
296     cpcon[1 ]  = 360;
297     cpcon[2 ]  =   4;
298 //  1 
299     cpcon[3 ]  = - kCP2FixedFlangeLength / 2.;
300     cpcon[4 ]  = 0.;
301     cpcon[5 ]  = kCP2FixedFlangeRo;
302 //  2 
303     cpcon[6 ]  = cpcon[3] + kCP2FixedFlangeRecessLengths[0] + kCP2FixedFlangeRecessLengths[1];
304     cpcon[7 ]  = 0.;
305     cpcon[8 ]  = kCP2FixedFlangeRo;
306 //  3 
307     cpcon[9 ]  = cpcon[6];
308     cpcon[10]  = kCP2FixedFlangeRi;
309     cpcon[11]  = kCP2FixedFlangeRo;
310 //  4 
311     cpcon[12]  = - cpcon[3];
312     cpcon[13]  = kCP2FixedFlangeRi;
313     cpcon[14]  = kCP2FixedFlangeRo;
314     gMC->Gsvolu("Q2FL","PCON", idtmed[kInox], cpcon, 15);    
315 //
316 //  Vacuum to be placed into Fixed Flange
317     cpcon[0 ]  =   0;
318     cpcon[1 ]  = 360;
319     cpcon[2 ]  =   4;
320 //  1 
321     cpcon[3 ]  = - (kCP2FixedFlangeRecessLengths[0] + kCP2FixedFlangeRecessLengths[1]) / 2.;
322     cpcon[4 ]  = 0.;
323     cpcon[5 ]  = kCP2FixedFlangeRi;
324 //  2 
325     cpcon[6 ]  = cpcon[3] + kCP2FixedFlangeRecessLengths[0];
326     cpcon[7 ]  = 0.;
327     cpcon[8 ]  = kCP2FixedFlangeRi; 
328 //  3 Bulge
329     cpcon[9 ]  = cpcon[6];
330     cpcon[10]  = 0.;
331     cpcon[11]  = kCP2FixedFlangeBulgeRi;
332 //  4 
333     cpcon[12]  = -cpcon[3];
334     cpcon[13]  = 0.;
335     cpcon[14]  = kCP2FixedFlangeBulgeRi;
336     gMC->Gsvolu("Q2V1","PCON", idtmed[kVac], cpcon, 15);   
337     dz =  - kCP2FixedFlangeLength / 2. - cpcon[3];
338     gMC->Gspos("Q2V1", 1, "Q2FL", 0., 0., dz, 0, "ONLY");
339 // 
340     dz =  - kCP2Length / 2. +  kCP2FixedFlangeLength / 2.;
341     gMC->Gspos("Q2FL", 1, "Q2MO", 0., 0., dz, 0, "ONLY");
342 //
343 //  CP/2 Beam pipe with fixed point and transition bulges
344 //    
345     cpcon[0 ]  =   0;
346     cpcon[1 ]  = 360;
347     cpcon[2 ]  =  10;
348 //  1 Bulge at transition to flange 
349     cpcon[3 ]  = - (kCP2Length -  kCP2FixedFlangeRecessLengths[0] - kCP2FixedFlangeRecessLengths[1]) / 2.;
350     cpcon[4 ]  = 0.;
351     cpcon[5 ]  = kCP2FixedFlangeBulgeRo;
352 //  2
353     cpcon[6 ]  = cpcon[3] +  kCP2FixedFlangeBulgeLength;
354     cpcon[7 ]  = 0.;
355     cpcon[8 ]  = kCP2FixedFlangeBulgeRo;
356 //  3 Straight section between Bulge and Fixed Point
357     cpcon[9 ]  = cpcon[6];
358     cpcon[10]  = 0.;
359     cpcon[11]  = kCP2StRo;
360 //  4 
361     cpcon[12]  = cpcon[3] + (kCP2FixedPointZ - kCP2FixedFlangeRecessLengths[0] - kCP2FixedFlangeRecessLengths[1])  - kCP2FixedPointLength / 2.;
362     cpcon[13]  = 0.;
363     cpcon[14]  = kCP2StRo;
364 //  5 Fixed Point
365     cpcon[15]  = cpcon[12];
366     cpcon[16]  = 0.;
367     cpcon[17]  = kCP2FixedPointRo;
368 //  6 
369     cpcon[18]  = cpcon[15] + kCP2FixedPointLength;
370     cpcon[19]  = 0.;
371     cpcon[20]  = kCP2FixedPointRo;
372 //  7 Straight section between Fixed Point and transition bulge
373     cpcon[21]  = cpcon[18];
374     cpcon[22]  = 0.;
375     cpcon[23]  = kCP2StRo;
376 //  8
377     cpcon[24]  = - cpcon[3] - kCP2BulgeLength;
378     cpcon[25]  = 0.;
379     cpcon[26]  = kCP2StRo;
380 // 9 Bulge at transition to Be pipe
381     cpcon[27]  = cpcon[24];
382     cpcon[28]  = 0.;
383     cpcon[29]  = kCP2BulgeRo;
384 // 10 
385     cpcon[30]  = - cpcon[3];
386     cpcon[31]  = 0.;
387     cpcon[32]  = kCP2BulgeRo;
388     gMC->Gsvolu("Q2PI","PCON", idtmed[kInox], cpcon, 33);    
389 //
390 //  Vacuum to be place into CP/2 beam pipe
391     cpTube[0] = 0.;
392     cpTube[1] = kCP2StRi;
393     cpTube[2] = -1.;
394     gMC->Gsvolu("Q2V2","TUBE", idtmed[kVac], cpTube, 3);   
395
396     gMC->Gspos("Q2V2", 1, "Q2PI", 0., 0., 0., 0, "ONLY");    
397     dz = (kCP2FixedFlangeRecessLengths[0] + kCP2FixedFlangeRecessLengths[1]) / 2.;
398     gMC->Gspos("Q2PI", 1, "Q2MO", 0., 0., dz, 0, "ONLY");    
399 //
400 ///////////////////
401 //      CP/3     //
402 ///////////////////
403 //
404 // Adaptor tube [Pos 4]
405 // 
406 // Adaptor tube length 
407     const Float_t  kCP3AdaptorTubeLength = 5.50;
408 //
409 // Inner and outer radii
410      const Float_t kCP3AdaptorTubeRi = 2.92;
411      const Float_t kCP3AdaptorTubeRo = 3.00;
412 //
413 // Bulge at transition point
414 // Inner and outer radii
415      const Float_t kCP3AdaptorTubeBulgeRi = 2.90;
416      const Float_t kCP3AdaptorTubeBulgeRo = 3.05;    
417 //
418 // Length of bulge
419     const Float_t  kCP3AdaptorTubeBulgeLength = 0.80;
420 //
421 // Bellow [Pos 8]
422 //
423 //  Total length    
424     const Float_t kCP3BellowLength = 13.00;
425 //  Outer Radius
426     const Float_t kCP3BellowRo = 3.6;
427 //  Inner Radius 
428     const Float_t kCP3BellowRi = 2.8;
429 //  Number of plies
430     const Int_t   kCP3NumberOfPlies = 18;
431 //  Length of undulated region
432     const Float_t kCP3BellowUndulatedLength  = 8.30; 
433 //  Plie thickness
434     const Float_t kCP3PlieThickness = 0.02;   
435 //  Connection Plie radies (at transition been undulated region and beam pipe)
436     const Float_t kCP3ConnectionPlieR = 0.21;
437 //  Plie radius
438 //  const Float_t kCP3PlieR = 0.118286;
439     const Float_t kCP3PlieR = 
440         (kCP3BellowUndulatedLength - 4. *  kCP3ConnectionPlieR + 2. * kCP3PlieThickness + (2. *  kCP3NumberOfPlies - 2.) * kCP3PlieThickness) 
441         / (4. * kCP3NumberOfPlies - 2.);
442 //  Length of connection pipe
443     const Float_t kCP3BellowConnectionLength = 2.35;
444 //
445 //  Tube between bellows [Pos 3]  
446 //    
447 //  Length of tube
448     const Float_t kCP3TubeLength = 4.00;
449 //
450 //  Minimised fixed flange [Pos 7]
451 //  
452 //  Length of flange connection tube
453     const Float_t kCP3FlangeConnectorLength = 5.0 - 1.4;
454 //  Length of Flange
455     const Float_t kCP3FlangeLength = 1.40;
456 //  Outer radius    
457     const Float_t kCP3FlangeRo     = 4.30;
458
459 //
460 // CP/3 Mother volume
461 //
462     cpcon[0 ]  =   0;
463     cpcon[1 ]  = 360;
464     cpcon[2 ]  =  12;
465 //  1 From transition to first bellow
466     cpcon[3 ]  = - kCP3Length / 2.;
467     cpcon[4 ]  = 0.;
468     cpcon[5 ]  = kCP3AdaptorTubeBulgeRo;
469 //  2
470     cpcon[6 ]  = cpcon[3] + kCP3BellowConnectionLength + kCP3AdaptorTubeLength;
471     cpcon[7 ]  = 0.;
472     cpcon[8 ]  = kCP3AdaptorTubeBulgeRo;
473 //  3 First Bellow
474     cpcon[9 ]  = cpcon[6];
475     cpcon[10]  = 0.;
476     cpcon[11]  = kCP3BellowRo;
477 //  4 
478     cpcon[12]  = cpcon[9] +  kCP3BellowUndulatedLength;
479     cpcon[13]  = 0.;
480     cpcon[14]  = kCP3BellowRo;
481 //  5 Connection between the two bellows
482     cpcon[15]  = cpcon[12];
483     cpcon[16]  = 0.;
484     cpcon[17]  = kCP3AdaptorTubeBulgeRo;
485 //  6 
486     cpcon[18]  = cpcon[15] + 2. * kCP3BellowConnectionLength + kCP3TubeLength;
487     cpcon[19]  = 0.;
488     cpcon[20]  = kCP3AdaptorTubeBulgeRo;
489 //  7 Second bellow
490     cpcon[21]  = cpcon[18];
491     cpcon[22]  = 0.;
492     cpcon[23]  = kCP3BellowRo;
493 //  8
494     cpcon[24]  = cpcon[21] + kCP3BellowUndulatedLength;
495     cpcon[25]  = 0.;
496     cpcon[26]  = kCP3BellowRo;
497 //  9 Pipe between second Bellow and Flange 
498     cpcon[27]  = cpcon[24];
499     cpcon[28]  = 0.;
500     cpcon[29]  = kCP3AdaptorTubeBulgeRo;
501 //  10 
502     cpcon[30]  = cpcon[27] + kCP3BellowConnectionLength +  kCP3FlangeConnectorLength;
503     cpcon[31]  = 0.;
504     cpcon[32]  = kCP3AdaptorTubeBulgeRo;
505 //  11 Flange 
506     cpcon[33]  = cpcon[30];
507     cpcon[34]  = 0.;
508     cpcon[35]  = kCP3FlangeRo;
509 //  12 
510     cpcon[36]  = - cpcon[3];
511     cpcon[37]  = 0.;
512     cpcon[38]  = kCP3FlangeRo;
513 //
514     gMC->Gsvolu("Q3MO","PCON", idtmed[kAir], cpcon, 39);
515     dz = kCP3pos;
516     gMC->Gspos("Q3MO", 1, "ALIC", 0., 0., dz, 0, "ONLY");
517 //
518 // CP/3 Adaptor tube
519 //
520     cpcon[0 ]  =   0;
521     cpcon[1 ]  = 360;
522     cpcon[2 ]  =  4;
523 //  1 Bulge at transition
524     cpcon[3 ]  = - kCP3AdaptorTubeLength / 2.;
525     cpcon[4 ]  = 0.;
526     cpcon[5 ]  = kCP3AdaptorTubeBulgeRo;
527 //  2
528     cpcon[6 ]  = cpcon[3] + kCP3AdaptorTubeBulgeLength;
529     cpcon[7 ]  = 0.;
530     cpcon[8 ]  = kCP3AdaptorTubeBulgeRo;
531 //  3 Tube
532     cpcon[9 ]  = cpcon[6];
533     cpcon[10]  = 0.;
534     cpcon[11]  = kCP3AdaptorTubeRo;
535 //  4 
536     cpcon[12]  = - cpcon[3];
537     cpcon[13]  = 0.;
538     cpcon[14]  = kCP3AdaptorTubeRo;
539     gMC->Gsvolu("Q3ATO","PCON", idtmed[kVac], cpcon, 15);
540
541 //  1 Bulge at transition
542     cpcon[4 ]  = kCP3AdaptorTubeBulgeRi;
543 //  2
544     cpcon[7 ]  = kCP3AdaptorTubeBulgeRi;;
545 //  3 Tube
546     cpcon[10]  = kCP3AdaptorTubeRi;
547 //  4 
548     cpcon[13]  = kCP3AdaptorTubeRi;
549
550     gMC->Gsvolu("Q3ATI","PCON", idtmed[kInox], cpcon, 15);
551     gMC->Gspos("Q3ATI", 1, "Q3ATO", 0., 0., 0., 0, "ONLY");
552     dz = - kCP3Length / 2. +  kCP3AdaptorTubeLength / 2.;
553     gMC->Gspos("Q3ATO", 1, "Q3MO", 0., 0., dz, 0, "ONLY");
554 //
555 // CP/3 Bellow section
556 //
557 //    TGeoMedium* mAir    =  gGeoManager->GetMedium("AIR");
558     TGeoMedium* mVacuum =  gGeoManager->GetMedium("VACUUM");    
559     TGeoMedium* mSteel  =  gGeoManager->GetMedium("INOX");        
560 //
561 //  Upper part of the undulation
562     TGeoTorus* plieTorusUO =  new TGeoTorus(kCP3BellowRo - kCP3PlieR, 0. , kCP3PlieR);
563     plieTorusUO->SetName("TorusUO");
564     TGeoTorus* plieTorusUI =  new TGeoTorus(kCP3BellowRo - kCP3PlieR, kCP3PlieR - kCP3PlieThickness, kCP3PlieR);
565     plieTorusUI->SetName("TorusUI");
566     TGeoTube*  plieTubeU   =  new TGeoTube (kCP3BellowRo - kCP3PlieR, kCP3BellowRo, kCP3PlieR / 2.);
567     plieTubeU->SetName("TubeU");
568     
569     TGeoCompositeShape*  upperPlieO = new TGeoCompositeShape("upperPlieO", "TorusUO*TubeU");
570     TGeoCompositeShape*  upperPlieI = new TGeoCompositeShape("upperPlieI", "TorusUI*TubeU");
571  
572     TGeoVolume* wiggleUO = new TGeoVolume("Q3WUO", upperPlieO, mVacuum);
573     TGeoVolume* wiggleUI = new TGeoVolume("Q3WUI", upperPlieI, mSteel);
574     wiggleUO->AddNode(wiggleUI, 1,  new TGeoTranslation(0., 0., 0.));    
575 //
576 // Lower part of the undulation
577     TGeoTorus* plieTorusLO =  new TGeoTorus(kCP3BellowRi + kCP3PlieR, 0. , kCP3PlieR);
578     plieTorusLO->SetName("TorusLO");
579     TGeoTorus* plieTorusLI =  new TGeoTorus(kCP3BellowRi + kCP3PlieR, kCP3PlieR - kCP3PlieThickness, kCP3PlieR);
580     plieTorusLI->SetName("TorusLI");
581     TGeoTube*  plieTubeL   =  new TGeoTube (kCP3BellowRi, kCP3BellowRi + kCP3PlieR, kCP3PlieR);
582     plieTubeL->SetName("TubeL");
583
584     TGeoCompositeShape*  lowerPlieO = new TGeoCompositeShape("lowerPlieO", "TorusLO*TubeL");
585     TGeoCompositeShape*  lowerPlieI = new TGeoCompositeShape("lowerPlieI", "TorusLI*TubeL");
586
587     TGeoVolume* wiggleLO = new TGeoVolume("Q3WLO", lowerPlieO, mVacuum);
588     TGeoVolume* wiggleLI = new TGeoVolume("Q3WLI", lowerPlieI, mSteel);
589     wiggleLO->AddNode(wiggleLI, 1,  new TGeoTranslation(0., 0., 0.));    
590
591 //
592 // Connection between upper and lower part of undulation
593     TGeoVolume* wiggleC1 = new TGeoVolume("Q3WCO1",  
594                                           new TGeoTube(kCP3BellowRi + kCP3PlieR, kCP3BellowRo - kCP3PlieR, kCP3PlieThickness / 2.),
595                                           mSteel);
596     TGeoVolume* wiggleC2 = new TGeoVolume("Q3WCO2",  
597                                           new TGeoTube(kCP3BellowRi + kCP3ConnectionPlieR, kCP3BellowRo - kCP3PlieR, kCP3PlieThickness / 2.),
598                                           mSteel);
599 //
600 // Conncetion between undulated section and beam pipe
601     TGeoTorus* plieTorusCO =  new TGeoTorus(kCP3BellowRi + kCP3ConnectionPlieR, 0. , kCP3ConnectionPlieR);
602     plieTorusCO->SetName("TorusCO");
603     TGeoTorus* plieTorusCI =  new TGeoTorus(kCP3BellowRi + kCP3ConnectionPlieR, kCP3ConnectionPlieR - kCP3PlieThickness, kCP3ConnectionPlieR);
604     plieTorusCI->SetName("TorusCI");
605     TGeoTube*  plieTubeC   =  new TGeoTube (kCP3BellowRi, kCP3BellowRi + kCP3ConnectionPlieR, kCP3ConnectionPlieR);
606     plieTubeC->SetName("TubeC");
607
608     TGeoCompositeShape*  connectionPlieO = new TGeoCompositeShape("connectionPlieO", "TorusCO*TubeC");
609     TGeoCompositeShape*  connectionPlieI = new TGeoCompositeShape("connectionPlieI", "TorusCI*TubeC");
610
611     TGeoVolume* connectionPO = new TGeoVolume("Q3CPO", connectionPlieO, mVacuum);
612     TGeoVolume* connectionPI = new TGeoVolume("Q3CPI", connectionPlieI, mSteel);
613     connectionPO->AddNode(connectionPI, 1,  new TGeoTranslation(0., 0., 0.));    
614 //
615 // Connecting pipes
616     TGeoVolume* connectionPipeO = new TGeoVolume("Q3BECO",  
617                                                  new TGeoTube(0., kCP3AdaptorTubeRo, kCP3BellowConnectionLength / 2.),
618                                                  mVacuum);
619     TGeoVolume* connectionPipeI = new TGeoVolume("Q3BECI",  
620                                                  new TGeoTube(kCP3AdaptorTubeRi, kCP3AdaptorTubeRo, kCP3BellowConnectionLength / 2.),
621                                                  mSteel);
622   
623     connectionPipeO->AddNode(connectionPipeI, 1,  new TGeoTranslation(0., 0., 0.));
624     
625 //
626 // Bellow mother
627     TGeoPcon* bellowMotherPC = new TGeoPcon(0., 360., 6);
628     dz =  - kCP3BellowLength / 2;
629     bellowMotherPC->DefineSection(0, dz, 0.,  kCP3AdaptorTubeRo);
630     dz +=  kCP3BellowConnectionLength;
631     bellowMotherPC->DefineSection(1, dz, 0.,  kCP3AdaptorTubeRo);
632     bellowMotherPC->DefineSection(2, dz, 0.,  kCP3BellowRo);
633     dz =  kCP3BellowLength /2. -  kCP3BellowConnectionLength;;
634     bellowMotherPC->DefineSection(3, dz, 0.,  kCP3BellowRo);
635     bellowMotherPC->DefineSection(4, dz, 0.,  kCP3AdaptorTubeRo);
636     dz +=  kCP3BellowConnectionLength;
637     bellowMotherPC->DefineSection(5, dz, 0.,  kCP3AdaptorTubeRo);
638
639     TGeoVolume* bellowMother = new TGeoVolume("Q3BeMO", bellowMotherPC, mVacuum);
640 //
641 // Add undulations
642     Float_t z0 =  - kCP3BellowLength / 2. +  kCP3BellowConnectionLength + 2. * kCP3ConnectionPlieR - kCP3PlieThickness;
643     Float_t zsh  = 4. *  kCP3PlieR -  2. * kCP3PlieThickness;
644     for (Int_t iw = 0; iw < 18; iw++) {
645         Float_t zpos =  z0 + iw * zsh;  
646         if (iw > 0) 
647             bellowMother->AddNode(wiggleC1,  iw + 1 , new TGeoTranslation(0., 0., zpos + kCP3PlieThickness / 2.));      
648         else
649             bellowMother->AddNode(wiggleC2,  iw + 1 , new TGeoTranslation(0., 0., zpos + kCP3PlieThickness / 2.));      
650
651         zpos += kCP3PlieR;
652         bellowMother->AddNode(wiggleUO, iw + 1,  new TGeoTranslation(0., 0., zpos));    
653
654         zpos += kCP3PlieR;
655         if (iw < 17) 
656             bellowMother->AddNode(wiggleC1,  iw + 19, new TGeoTranslation(0., 0., zpos - kCP3PlieThickness / 2.));
657         else
658             bellowMother->AddNode(wiggleC2,  iw + 19, new TGeoTranslation(0., 0., zpos - kCP3PlieThickness / 2.));
659
660         if (iw < 17) {
661             zpos += kCP3PlieR;
662             bellowMother->AddNode(wiggleLO, iw + 1, new TGeoTranslation(0., 0., zpos -  kCP3PlieThickness));
663         }
664     }
665 //
666 // Add connecting undulation between bellow and connecting pipe
667     dz = - kCP3BellowUndulatedLength / 2. + kCP3ConnectionPlieR;
668     bellowMother->AddNode(connectionPO, 1,  new TGeoTranslation(0., 0.,  dz));
669     bellowMother->AddNode(connectionPO, 2,  new TGeoTranslation(0., 0., -dz));
670 //
671 // Add connecting pipe
672     dz =  - kCP3BellowLength / 2. +  kCP3BellowConnectionLength / 2.;
673     bellowMother->AddNode(connectionPipeO, 1,  new TGeoTranslation(0., 0.,   dz));
674     bellowMother->AddNode(connectionPipeO, 2,  new TGeoTranslation(0., 0.,  -dz));
675 //
676 // Add bellow to CP/3 mother    
677     TGeoVolume* mother = gGeoManager->GetVolume("Q3MO");
678     dz = - kCP3Length / 2. +  kCP3AdaptorTubeLength +  kCP3BellowLength / 2.;
679     mother->AddNode(bellowMother, 1,  new TGeoTranslation(0., 0., dz));
680     dz += (kCP3BellowLength +  kCP3TubeLength);
681     mother->AddNode(bellowMother, 2,  new TGeoTranslation(0., 0., dz));
682 //
683 // Beam pipe section between bellows
684 //
685     cpTube[0] = 0.;
686     cpTube[1] = kCP3AdaptorTubeRo;
687     cpTube[2] = kCP3TubeLength / 2.;
688     gMC->Gsvolu("Q3BCO","TUBE", idtmed[kVac], cpTube, 3);
689
690     cpTube[0] = kCP3AdaptorTubeRi;
691     cpTube[1] = kCP3AdaptorTubeRo;
692     cpTube[2] = kCP3TubeLength / 2.;
693     gMC->Gsvolu("Q3BCI","TUBE", idtmed[kInox], cpTube, 3);
694   
695     gMC->Gspos("Q3BCI", 1, "Q3BCO", 0., 0., 0., 0, "ONLY");
696     dz = - kCP3Length / 2. +   kCP3AdaptorTubeLength +  kCP3BellowLength +  kCP3TubeLength / 2.;
697     gMC->Gspos("Q3BCO", 1, "Q3MO", 0., 0., dz, 0, "ONLY");
698     
699
700 // CP3 Minimised Flange
701 //
702     cpcon[0 ]  =   0;
703     cpcon[1 ]  = 360;
704     cpcon[2 ]  =  4;
705 //  1 Connection Tube
706     cpcon[3 ]  = - (kCP3FlangeConnectorLength + kCP3FlangeLength) / 2.;
707     cpcon[4 ]  = 0.;
708     cpcon[5 ]  = kCP3AdaptorTubeRo;
709 //  2
710     cpcon[6 ]  = cpcon[3] + kCP3FlangeConnectorLength;
711     cpcon[7 ]  = 0.;
712     cpcon[8 ]  = kCP3AdaptorTubeRo;
713 //  3 Flange
714     cpcon[9 ]  = cpcon[6];
715     cpcon[10]  = 0.;
716     cpcon[11]  = kCP3FlangeRo;
717 //  4 
718     cpcon[12]  = - cpcon[3];
719     cpcon[13]  = 0.;
720     cpcon[14]  = kCP3FlangeRo;
721     gMC->Gsvolu("Q3MFO","PCON", idtmed[kVac], cpcon, 15);
722
723     cpcon[4 ]  = cpcon[7 ] = cpcon [10] = cpcon[13] = kCP3AdaptorTubeRi;
724     gMC->Gsvolu("Q3MFI","PCON", idtmed[kInox], cpcon, 15);
725
726     gMC->Gspos("Q3MFI", 1, "Q3MFO", 0., 0., 0., 0, "ONLY");
727     dz =  kCP3Length / 2. - (kCP3FlangeConnectorLength + kCP3FlangeLength) / 2.;
728     gMC->Gspos("Q3MFO", 1, "Q3MO", 0., 0., dz, 0, "ONLY");
729 }
730
731
732
733 //___________________________________________
734 void AliPIPEvGEO::CreateMaterials()
735 {
736   //
737   // Define materials for beam pipe
738   //
739
740   AliDebugClass(1,"Create PIPEvGEO materials");
741   Int_t   isxfld = gAlice->Field()->Integ();
742   Float_t sxmgmx = gAlice->Field()->Max();
743   // Steel (Inox)  
744   Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
745   Float_t zsteel[4] = { 26.,24.,28.,14. };
746   Float_t wsteel[4] = { .715,.18,.1,.005 };
747   // AlBe - alloy 
748   Float_t aAlBe[2] = { 26.98, 9.01};
749   Float_t zAlBe[2] = { 13.00, 4.00};
750   Float_t wAlBe[2] = { 0.4, 0.6};
751   //
752   // Polyamid
753   Float_t aPA[4] = {16., 14., 12.,  1.};
754   Float_t zPA[4] = { 8.,  7.,  6.,  1.};
755   Float_t wPA[4] = { 1.,  1.,  6., 11.};
756   //
757   // Air 
758   //
759   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
760   Float_t zAir[4]={6.,7.,8.,18.};
761   Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
762   Float_t dAir = 1.20479E-3;
763   Float_t dAir1 = 1.20479E-10;
764
765   //
766   //     Berillium 
767   AliMaterial(5, "BERILLIUM$", 9.01, 4., 1.848, 35.3, 36.7);
768   //
769   //     Carbon 
770   AliMaterial(6,  "CARBON$   ", 12.01, 6., 2.265, 18.8, 49.9);
771   //
772   //     Aluminum 
773   AliMaterial(9,  "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2);
774   //
775   //     Air 
776   AliMixture(15, "AIR$      ", aAir, zAir, dAir, 4, wAir);
777   //
778   //     Vacuum 
779   AliMixture(16, "VACUUM$ ", aAir, zAir, dAir1, 4, wAir);
780   //
781   //     stainless Steel 
782   AliMixture(19, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
783   //
784   //     reduced density steel to approximate pump getter material
785   AliMixture(20, "GETTER$", asteel, zsteel, 1.00, 4, wsteel);
786   //     Al-Be alloy
787   //     
788   AliMixture(21, "AlBe$", aAlBe, zAlBe, 2.07, 2, wAlBe);
789   //     Polyamid
790   //   
791   AliMixture(22, "PA$", aPA, zPA, 1.14, -4, wPA);
792   //
793
794   // **************** 
795   //     Defines tracking media parameters. 
796   //
797   Float_t epsil  = .001;    // Tracking precision, 
798   Float_t stemax = -0.01;   // Maximum displacement for multiple scat 
799   Float_t tmaxfd = -20.;    // Maximum angle due to field deflection 
800   Float_t deemax = -.3;     // Maximum fractional energy loss, DLS 
801   Float_t stmin  = -.8;
802   // *************** 
803   //
804   //    Beryllium 
805   
806   AliMedium(5, "BE",       5, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
807
808   //    Carbon 
809   AliMedium(6, "C",        6, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
810   //
811   //    Aluminum 
812   AliMedium(9, "ALU",      9, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
813   //
814   //    Air 
815   AliMedium(15, "AIR",    15, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
816   //
817   //    Vacuum 
818   AliMedium(16, "VACUUM", 16, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
819   //
820   //    Steel 
821   AliMedium(19, "INOX",   19, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
822   //
823   //    Getter 
824   AliMedium(20, "GETTER", 20, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
825   //
826   //   AlBe - Aloy 
827   AliMedium(21, "AlBe"  , 21, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
828   //
829   //   Polyamid
830   AliMedium(22, "PA"  ,   22, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
831
832 }
833
834
835
836
837
838
839
840
841
842