Project
Loading...
Searching...
No Matches
Pipe.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#include "DetectorsPassive/Pipe.h"
15#include <TGeoCompositeShape.h>
16#include <TGeoCone.h>
17#include <TGeoPcon.h>
18#include <TGeoTorus.h>
19#include <TGeoTube.h>
20#include <TGeoEltu.h>
21#include <TVirtualMC.h>
22#include "TGeoManager.h" // for TGeoManager, gGeoManager
23#include "TGeoMaterial.h" // for TGeoMaterial
24#include "TGeoMedium.h" // for TGeoMedium
25#include "TGeoVolume.h" // for TGeoVolume
26#include <TGeoArb8.h> // for TGeoTrap
27#include <TGeoTrd1.h> // for TGeoTrap
28// force availability of assert
29#ifdef NDEBUG
30#undef NDEBUG
31#endif
32#include <cassert>
33
34//-------------------------------------------------------------------------
35// Beam pipe class for ALICE ITS & MFT upgrade
36// Imported from AliRoot AliPIPEupdrage
37// Original Authors:
38// F. Manso
39// A. Morsch
40// R. Tieulent
41// M. Sitta
42//-------------------------------------------------------------------------
43
44using namespace o2::passive;
45
46Pipe::~Pipe() = default;
47Pipe::Pipe() : PassiveBase("PIPE", "") {}
48Pipe::Pipe(const char* name, const char* title, float rho, float thick)
49 : PassiveBase(name, title), mBePipeRmax(rho), mBePipeThick(thick)
50{
51}
52Pipe::Pipe(const Pipe& rhs) = default;
53
54Pipe& Pipe::operator=(const Pipe& rhs)
55{
56 // self assignment
57 if (this == &rhs) {
58 return *this;
59 }
60
61 // base class assignment
62 PassiveBase::operator=(rhs);
63
64 return *this;
65}
66
68{
69 createMaterials();
70 //
71 // Class describing the beam pipe geometry
72 //
73 Float_t z, zsh, z0;
74 //
75 // Rotation Matrices
76 //
77 const Float_t kDegRad = TMath::Pi() / 180.;
78 // Rotation by 180 deg
79 TGeoRotation* rot180 = new TGeoRotation("rot180", 90., 180., 90., 90., 180., 0.);
80 TGeoRotation* rotyz = new TGeoRotation("rotyz", 90., 180., 0., 180., 90., 90.);
81 TGeoRotation* rotxz = new TGeoRotation("rotxz", 0., 0., 90., 90., 90., 180.);
82 //
83
84 // Media
86 const TGeoMedium* kMedAir = matmgr.getTGeoMedium("PIPE_AIR");
87 const TGeoMedium* kMedAirNF = matmgr.getTGeoMedium("PIPE_AIR_NF");
88 const TGeoMedium* kMedAirHigh = matmgr.getTGeoMedium("PIPE_AIR_HIGH");
89
90 const TGeoMedium* kMedVac = matmgr.getTGeoMedium("PIPE_VACUUM");
91 const TGeoMedium* kMedVacNF = matmgr.getTGeoMedium("PIPE_VACUUM_NF");
92 const TGeoMedium* kMedVacHC = matmgr.getTGeoMedium("PIPE_VACUUM_HC");
93 const TGeoMedium* kMedVacNFHC = matmgr.getTGeoMedium("PIPE_VACUUM_NFHC");
94
95 const TGeoMedium* kMedInsu = matmgr.getTGeoMedium("PIPE_INS_C0");
96
97 const TGeoMedium* kMedSteel = matmgr.getTGeoMedium("PIPE_INOX");
98 const TGeoMedium* kMedSteelNF = matmgr.getTGeoMedium("PIPE_INOX_NF");
99 const TGeoMedium* kMedSteelHC = matmgr.getTGeoMedium("PIPE_INOX_HC");
100 const TGeoMedium* kMedSteelNFHC = matmgr.getTGeoMedium("PIPE_INOX_NFHC");
101
102 const TGeoMedium* kMedBe = matmgr.getTGeoMedium("PIPE_BE");
103
104 const TGeoMedium* kMedCu = matmgr.getTGeoMedium("PIPE_CU");
105 const TGeoMedium* kMedCuNF = matmgr.getTGeoMedium("PIPE_CU_NF");
106 const TGeoMedium* kMedCuHC = matmgr.getTGeoMedium("PIPE_CU_HC");
107 const TGeoMedium* kMedCuNFHC = matmgr.getTGeoMedium("PIPE_CU_NFHC");
108
109 const TGeoMedium* kMedAlu2219 = matmgr.getTGeoMedium("PIPE_AA2219");
110 const TGeoMedium* kMedRohacell = matmgr.getTGeoMedium("PIPE_ROHACELL");
111 const TGeoMedium* kMedPolyimide = matmgr.getTGeoMedium("PIPE_POLYIMIDE");
112 const TGeoMedium* kMedCarbonFiber = matmgr.getTGeoMedium("PIPE_M55J6K");
113 const TGeoMedium* kMedTitanium = matmgr.getTGeoMedium("PIPE_TITANIUM");
114 const TGeoMedium* kMedAlu7075 = matmgr.getTGeoMedium("PIPE_AA7075");
115
116 // Top volume
117 TGeoVolume* top = gGeoManager->GetVolume("cave");
118 TGeoVolume* barrel = gGeoManager->GetVolume("barrel");
119 TGeoVolume* caveRB24 = gGeoManager->GetVolume("caveRB24");
120 //
121 //
123 // //
124 // The Central Vacuum system //
125 // //
127 //
128 //
129 // The ALICE central beam-pipe according to drawing LHCVC2C_0001
130 // Drawings of sub-elements:
131 //
132 // Pos 7 - Minimised Flange: LHCVFX_P0025
133 // Pos 6 - Standard Flange: STDVFUHV0009
134 // Pos 8 - Bellow: LHCVBX__0001
135 //
136 // Absolute z-coordinates -82.0 - 400.0 cm
137 // Total length: 482.0 cm
138 // It consists of 3 main parts:
139 // CP/2 The flange on the non-absorber side: 36.5 cm
140 // CP/1 The central Be pipe: 405.0 cm
141 // CP/3 The double-bellow and flange on the absorber side: 40.5 cm
142
143 //
144 /*
145 // Starting position in z
146 const Float_t kCPz0 = -400.0;
147 // Length of the CP/1 section
148 const Float_t kCP1Length = 405.0;
149 // Length of the CP/2 section
150 const Float_t kCP2Length = 36.5;
151 // Length of the CP/3 section
152 const Float_t kCP3Length = 40.5;
153 // Position of the CP/2 section
154 // const Float_t kCP2pos = kCPz0 + kCP2Length / 2.;
155 // Position of the CP/3 section
156 const Float_t kCP3pos = kCPz0 + kCP2Length + kCP1Length + kCP3Length/2.;
157 */
158
160 // Authors: F. Manso, R. Tieulent
161 // Drawings from C. Gargiulo :
162 // \\cern.ch\dfs\Workspaces\c\cgargiul\EXPERIMENT\ALICE\ALICE_MECHANICS\ALICE_DATA_PACKAGE\IN\DETECTORS\ITS_UPGRADE\1-DESIGN\3D_cad_model\R14_20140311_ALI\
163 //
164 //
165 // central beam pipe
166 //------------------- Pipe version 4.7 March 2014 -----------------------------
167 TGeoVolumeAssembly* beamPipeCsideSection = new TGeoVolumeAssembly("BeamPipeCsideSection");
168 // If user set Rmax=0/Thick=0 use defaults, else use user input
169 const Float_t kBeryliumSectionOuterRadius = (mBePipeRmax > 0.) ? mBePipeRmax : 1.9;
170 const Float_t kBeryliumSectionThickness = (mBePipeThick > 0.) ? mBePipeThick : 0.08;
171 const Float_t kBeryliumSectionZmax = 44.4;
172 const Float_t kBeryliumSectionZmin = -44.4;
173
174 const Float_t kBellowSectionOuterRadius = 2.15;
175 const Float_t kCSideBPSOuterRadius = 2.22;
176 const Float_t kCSideBPSWallThickness = 0.15;
177 const Float_t kBellowSectionZmax = -55.35;
178 const Float_t kBellowOuterRadius = 2.8;
179 const Float_t kFirstConeAngle = 15. * TMath::DegToRad();
180 const Float_t kChangeThicknessAngle = 45. * TMath::DegToRad();
181 const Float_t kCSideBPSLength = 3.53;
182 const Float_t kDzFirstCone = (kCSideBPSOuterRadius - kBeryliumSectionOuterRadius) / TMath::Tan(kFirstConeAngle);
183 const Float_t kReduceThicknessPartAfterBPSLength = 1.52;
184 const Float_t kThinPartBeforeBellowLength = 1.025;
185
186 const Float_t kDistanceBetweenBellows = 2.5;
187
188 const Float_t kAdaptConeZmax = -77.43;
189 const Float_t kAdaptConeZmin = -80.6;
190 const Float_t kAdaptConeRmax = 3.0;
191 const Float_t kFlangeRmax = 4.3;
192 const Float_t kFlangeLength = 1.4;
193
194 const Float_t kBellowPlieRadius = 0.17; // radius of bellow plies
195 const Float_t kBellowPlieThickness = 0.03; // Thickness of bellow plies 300 microns
196 const Int_t kNBellowConvolutions = 7;
197
198 const Float_t kZ1 = kBeryliumSectionZmin; // z of Be - Al jonction on the C-side
199 const Float_t kZ2 =
200 kBellowSectionZmax + kDzFirstCone; // z of end of small diameter part (beginning of first cone before the bellow
201 const Float_t kZ3 = kBellowSectionZmax +
202 (kCSideBPSOuterRadius - kBellowSectionOuterRadius) /
203 TMath::Tan(kFirstConeAngle); // z of End of first cone part with 0.8mm thickness
204 const Float_t kZ4 = kBellowSectionZmax; // z of End of first Cone
205 const Float_t kZ5 = kBellowSectionZmax - kCSideBPSLength; // z of End of Beam Pipe support section
206 const Float_t kZ6 =
207 kBellowSectionZmax - kCSideBPSLength -
208 (kCSideBPSOuterRadius - kBellowSectionOuterRadius) /
209 TMath::Tan(kChangeThicknessAngle); // z of End of Beam Pipe support section after reduction of thickness
210 const Float_t kZ7 =
211 kZ6 - kReduceThicknessPartAfterBPSLength; // Z of end of 800 microns section after Beam Pipe Support
212 const Float_t kZ8 = kZ7 - (kBeryliumSectionThickness - kBellowPlieThickness) / TMath::Tan(kChangeThicknessAngle);
213 const Float_t kZ9 = kZ7 - kThinPartBeforeBellowLength; // Z of the start of first bellow
214 const Float_t kFirstBellowZmax = kZ9;
215
216 //---------------- Be pipe around the IP ----------
217 TGeoTube* berylliumTube =
218 new TGeoTube("IP_PIPEsh", kBeryliumSectionOuterRadius - kBeryliumSectionThickness, kBeryliumSectionOuterRadius,
219 (kBeryliumSectionZmax - kBeryliumSectionZmin) / 2);
220 TGeoVolume* voberylliumTube = new TGeoVolume("IP_PIPE", berylliumTube, kMedBe);
221 voberylliumTube->SetLineColor(kRed);
222
223 TGeoTube* berylliumTubeVacuum =
224 new TGeoTube("IP_PIPEVACUUMsh", 0., kBeryliumSectionOuterRadius,
225 (kBeryliumSectionZmax - kBeryliumSectionZmin) / 2);
226 TGeoVolume* voberylliumTubeVacuum = new TGeoVolume("IP_PIPEMOTHER", berylliumTubeVacuum, kMedVac);
227 voberylliumTubeVacuum->AddNode(voberylliumTube, 1, gGeoIdentity);
228 voberylliumTubeVacuum->SetVisibility(0);
229 voberylliumTubeVacuum->SetLineColor(kGreen);
230
231 beamPipeCsideSection->AddNode(voberylliumTubeVacuum, 1,
232 new TGeoTranslation(0., 0., (kBeryliumSectionZmax + kBeryliumSectionZmin) / 2));
233
234 //---------------- Al tube ------------------
235 TGeoPcon* aluBeforeBellows = new TGeoPcon(0., 360., 9);
236 aluBeforeBellows->DefineSection(0, kZ9, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness + kBellowPlieThickness);
237 aluBeforeBellows->DefineSection(1, kZ8, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness + kBellowPlieThickness);
238 aluBeforeBellows->DefineSection(2, kZ7, 0., kBellowSectionOuterRadius);
239 aluBeforeBellows->DefineSection(3, kZ6, 0., kBellowSectionOuterRadius);
240 aluBeforeBellows->DefineSection(4, kZ5, 0., kCSideBPSOuterRadius);
241 aluBeforeBellows->DefineSection(5, kZ4, 0., kCSideBPSOuterRadius);
242 aluBeforeBellows->DefineSection(6, kZ3, 0., kBellowSectionOuterRadius);
243 aluBeforeBellows->DefineSection(7, kZ2, 0., kBeryliumSectionOuterRadius);
244 aluBeforeBellows->DefineSection(8, kZ1, 0., kBeryliumSectionOuterRadius);
245 TGeoVolume* voaluBeforeBellows = new TGeoVolume("aluBeforeBellows", aluBeforeBellows, kMedAlu2219);
246 voaluBeforeBellows->SetLineColor(kBlue);
247 beamPipeCsideSection->AddNode(voaluBeforeBellows, 1, gGeoIdentity);
248
249 TGeoPcon* aluBeforeBellowsVacuum = new TGeoPcon(0., 360., 7);
250 aluBeforeBellowsVacuum->DefineSection(0, kZ9, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness);
251 aluBeforeBellowsVacuum->DefineSection(1, kZ6, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness);
252 aluBeforeBellowsVacuum->DefineSection(2, kZ5, 0., kCSideBPSOuterRadius - kCSideBPSWallThickness);
253 aluBeforeBellowsVacuum->DefineSection(3, kZ4, 0., kCSideBPSOuterRadius - kCSideBPSWallThickness);
254 aluBeforeBellowsVacuum->DefineSection(4, kZ3, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness);
255 aluBeforeBellowsVacuum->DefineSection(5, kZ2, 0., kBeryliumSectionOuterRadius - kBeryliumSectionThickness);
256 aluBeforeBellowsVacuum->DefineSection(6, kZ1, 0., kBeryliumSectionOuterRadius - kBeryliumSectionThickness);
257 TGeoVolume* voaluBeforeBellowsVacuum = new TGeoVolume("aluBeforeBellowsVacuum", aluBeforeBellowsVacuum, kMedVac);
258 voaluBeforeBellowsVacuum->SetVisibility(1);
259 voaluBeforeBellowsVacuum->SetLineColor(kGreen);
260 voaluBeforeBellows->AddNode(voaluBeforeBellowsVacuum, 1, gGeoIdentity);
261 //-------------------------------------------------
262
263 Float_t kBellowLength = kNBellowConvolutions * (4. * kBellowPlieRadius - 2. * kBellowPlieThickness);
264 // ------------------ First Bellow --------------------
265 TGeoVolume* vobellows1 =
266 MakeBellowCside("bellows1", kNBellowConvolutions, kBellowSectionOuterRadius - kBeryliumSectionThickness,
267 kBellowOuterRadius, kBellowPlieRadius, kBellowPlieThickness);
268 beamPipeCsideSection->AddNode(
269 vobellows1, 1, new TGeoTranslation(0., 0., kFirstBellowZmax - kBellowLength / 2. - 2. * kBellowPlieRadius));
270 //------------------------------------------------------
271
272 const Float_t kZ10 = kFirstBellowZmax - kBellowLength; // End of First bellow
273 const Float_t kZ12 = kZ10 - kThinPartBeforeBellowLength;
274 const Float_t kZ11 = kZ12 +
275 (kBeryliumSectionThickness - kBellowPlieThickness) /
276 TMath::Tan(kChangeThicknessAngle); // End of 300 microns thickness part after first bellow
277 const Float_t kZ13 = kZ12 - kDistanceBetweenBellows;
278 const Float_t kZ14 = kZ13 - (kBeryliumSectionThickness - kBellowPlieThickness) / TMath::Tan(kChangeThicknessAngle);
279 const Float_t kZ15 = kZ14 - kThinPartBeforeBellowLength;
280 const Float_t kSecondBellowZmax = kZ15;
281
282 //---------- Al tube between the bellows ----------
283 TGeoPcon* tube4 = new TGeoPcon(0., 360., 6);
284 tube4->DefineSection(0, kZ10, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness + kBellowPlieThickness);
285 tube4->DefineSection(1, kZ11, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness + kBellowPlieThickness);
286 tube4->DefineSection(2, kZ12, 0., kBellowSectionOuterRadius);
287 tube4->DefineSection(3, kZ13, 0., kBellowSectionOuterRadius);
288 tube4->DefineSection(4, kZ14, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness + kBellowPlieThickness);
289 tube4->DefineSection(5, kZ15, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness + kBellowPlieThickness);
290 TGeoVolume* votube4 = new TGeoVolume("votube4", tube4, kMedAlu2219);
291 votube4->SetLineColor(kBlue);
292 beamPipeCsideSection->AddNode(votube4, 1, gGeoIdentity);
293
294 TGeoTube* tube4Vacuum = new TGeoTube(0., kBellowSectionOuterRadius - kBeryliumSectionThickness, -(kZ15 - kZ10) / 2.);
295 TGeoVolume* votube4Vacuum = new TGeoVolume("tube4Vacuum", tube4Vacuum, kMedVac);
296 votube4Vacuum->SetVisibility(1);
297 votube4->AddNode(votube4Vacuum, 1, new TGeoTranslation(0., 0., (kZ10 + kZ15) / 2.));
298
299 // ------------------ Second Bellow --------------------
300 TGeoVolume* vobellows2 =
301 MakeBellowCside("bellows2", kNBellowConvolutions, kBellowSectionOuterRadius - kBeryliumSectionThickness,
302 kBellowOuterRadius, kBellowPlieRadius, kBellowPlieThickness);
303 beamPipeCsideSection->AddNode(
304 vobellows2, 1, new TGeoTranslation(0., 0., kSecondBellowZmax - kBellowLength / 2. - 2. * kBellowPlieRadius));
305 // -----------------------------------------------------
306
307 const Float_t kZ16 = kSecondBellowZmax - kBellowLength; // End of Second bellow
308 const Float_t kZ18 = kZ16 - kThinPartBeforeBellowLength;
309 const Float_t kZ17 = kZ18 +
310 (kBeryliumSectionThickness - kBellowPlieThickness) /
311 TMath::Tan(kChangeThicknessAngle); // End of 300 microns thickness part after first bellow
312 const Float_t kZ19 = kAdaptConeZmax; // Start of the Adpation Cone
313 const Float_t kZ20 = kAdaptConeZmin; // End of the Adpation Cone
314 const Float_t kZ21 = kAdaptConeZmin - kFlangeLength; // End of the Flange
315
316 //----------- 15 deg Conical adaptator + flange ----------
317 TGeoPcon* adaptator = new TGeoPcon(0., 360., 7);
318 adaptator->DefineSection(0, kZ16, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness + kBellowPlieThickness);
319 adaptator->DefineSection(1, kZ17, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness + kBellowPlieThickness);
320 adaptator->DefineSection(2, kZ18, 0., kBellowSectionOuterRadius);
321 adaptator->DefineSection(3, kZ19, 0., kBellowSectionOuterRadius);
322 adaptator->DefineSection(4, kZ20, 0., kAdaptConeRmax);
323 adaptator->DefineSection(5, kZ20, 0., kFlangeRmax);
324 adaptator->DefineSection(6, kZ21, 0., kFlangeRmax);
325 TGeoVolume* voadaptator = new TGeoVolume("voadaptator", adaptator, kMedAlu2219);
326 voadaptator->SetLineColor(kBlue);
327 beamPipeCsideSection->AddNode(voadaptator, 1, gGeoIdentity);
328
329 TGeoPcon* adaptatorvide = new TGeoPcon(0., 360., 4);
330 adaptatorvide->DefineSection(0, kZ16, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness);
331 adaptatorvide->DefineSection(1, kZ19, 0., kBellowSectionOuterRadius - kBeryliumSectionThickness);
332 adaptatorvide->DefineSection(2, kZ20, 0., kAdaptConeRmax - kBeryliumSectionThickness);
333 adaptatorvide->DefineSection(3, kZ21, 0., kAdaptConeRmax - kBeryliumSectionThickness);
334 TGeoVolume* voadaptatorvide = new TGeoVolume("voadaptatorvide", adaptatorvide, kMedVac);
335 voadaptatorvide->SetVisibility(1);
336 // voadaptatorvide->SetLineColor(kGreen);
337 voadaptator->AddNode(voadaptatorvide, 1, gGeoIdentity);
338 //------------------------------------------------------
339
340 barrel->AddNode(beamPipeCsideSection, 1, new TGeoTranslation(0., 30., 0.));
341
343 // Beam Pipe support F.M. 2021 rev 2023 //
345
346 // Beam Pipe Support
347 TGeoVolume* beamPipeSupport = new TGeoVolumeAssembly("BeamPipeSupport");
348 const Float_t kBeamPipesupportZpos = kZ5;
349
350 // Dimensions :
351 const Float_t kSupportXdim = 20.67;
352 const Float_t kBeamPipeRingZdim = 3.6;
353 const Float_t kVespelRmax = 2.3;
354 const Float_t kVespelRmin = 2.22;
355 const Float_t kBeampipeCarbonCollarRmin = 2.5;
356 const Float_t kBeampipeCarbonCollarRmax = 2.7;
357 const Float_t kFixationCarbonCollarRmin = 1.5;
358 const Float_t kFixationCarbonCollarRmax = 1.7;
359 const Float_t kFixationCarbonCollarDZ = 2.5;
360 const Float_t kSkinThickness = 0.3;
361 const Float_t kSkinXdim = 14.2;
362 const Float_t kSkinYdim = 1.4;
363 const Float_t kSkinZdim = kFixationCarbonCollarDZ;
364 const Float_t kCarbonEarsXdim = 2.8;
365 const Float_t kCarbonEarsYdimIn = 1.1;
366 const Float_t kCarbonEarsYdimOut = 0.6;
367 const Float_t kCarbonEarsZdim = kFixationCarbonCollarDZ;
368 const Float_t kScrewDiameter = 0.4;
369 const Float_t kScrewHeadHeight = 0.2;
370 const Float_t kScrewHeadDiameter = 0.6;
371 const Float_t kScrewPositionIn = 3.25;
372 const Float_t kScrewPositionOut = 21.80;
373 const Float_t kScrewThreadLength = 1.0;
374 const Float_t holeSightDiameterOut = 0.60;
375 const Float_t holeSightDiameterIn = 0.25;
376
377 // Support Bar
378 TGeoVolumeAssembly* supportBar = new TGeoVolumeAssembly("BPS_SupportBar");
379 TGeoBBox* carbonSkinBPS = new TGeoBBox("carbonSkinBPS", kSkinXdim / 2., kSkinYdim / 2., kSkinZdim / 2.);
380 TGeoBBox* foambarBPS = new TGeoBBox("foambarBPS", kSkinXdim / 2. - kSkinThickness, kSkinYdim / 2. - kSkinThickness,
381 kSkinZdim / 2. - kSkinThickness / 2.);
382 TGeoBBox* carbonEarsBPSin = new TGeoBBox("carbonEarsBPSin", kCarbonEarsXdim / 2., kCarbonEarsYdimIn / 2., kCarbonEarsZdim / 2.);
383 TGeoBBox* carbonEarsBPSout = new TGeoBBox("carbonEarsBPSout", kCarbonEarsXdim / 2., kCarbonEarsYdimOut / 2., kCarbonEarsZdim / 2.);
384
385 //===== building the main support bar in carbon ====
386 TGeoTranslation* tBP1 = new TGeoTranslation("tBP1", (kSkinXdim + kCarbonEarsXdim) / 2., -(kSkinYdim - kCarbonEarsYdimIn) / 2., 0.);
387 TGeoTranslation* tBP2 = new TGeoTranslation("tBP2", -(kSkinXdim + kCarbonEarsXdim) / 2., 0., 0.);
388 tBP1->RegisterYourself();
389 tBP2->RegisterYourself();
390
391 TGeoRotation* rotScrew = new TGeoRotation("rotScrew", 0., 90., 0.);
392 rotScrew->RegisterYourself();
393
394 TGeoTube* holeScrew = new TGeoTube("holeScrew", 0., kScrewDiameter / 2., kCarbonEarsYdimIn / 2. + 0.001);
395 TGeoTube* holeSight = new TGeoTube("holeSight", 0., holeSightDiameterOut / 2., kSkinZdim / 2. + 0.001);
396 TGeoTranslation* tHoleSight = new TGeoTranslation("tHoleSight", kSkinXdim / 2. + kCarbonEarsXdim + kBeampipeCarbonCollarRmax - 6.55, 0., 0.);
397 tHoleSight->RegisterYourself();
398 Double_t kXHoleIn = kSkinXdim / 2. + kCarbonEarsXdim + kBeampipeCarbonCollarRmax - kScrewPositionIn;
399 Double_t kXHoleOut = kSkinXdim / 2. + kCarbonEarsXdim + kBeampipeCarbonCollarRmax - kScrewPositionOut;
400 TGeoCombiTrans* tHoleScrew1 = new TGeoCombiTrans("tHoleScrew1", kXHoleIn, -(kSkinYdim - kCarbonEarsYdimIn) / 2., -0.7, rotScrew);
401 TGeoCombiTrans* tHoleScrew2 = new TGeoCombiTrans("tHoleScrew2", kXHoleIn, -(kSkinYdim - kCarbonEarsYdimIn) / 2., 0.7, rotScrew);
402 TGeoCombiTrans* tHoleScrew3 = new TGeoCombiTrans("tHoleScrew3", kXHoleOut, -(kSkinYdim - kCarbonEarsYdimIn) / 2., -0.7, rotScrew);
403 TGeoCombiTrans* tHoleScrew4 = new TGeoCombiTrans("tHoleScrew4", kXHoleOut, -(kSkinYdim - kCarbonEarsYdimIn) / 2., 0.7, rotScrew);
404 tHoleScrew1->RegisterYourself();
405 tHoleScrew2->RegisterYourself();
406 tHoleScrew3->RegisterYourself();
407 tHoleScrew4->RegisterYourself();
408
409 TGeoCompositeShape* supportBarCarbon = new TGeoCompositeShape("BPS_supportBarCarbon", "(carbonSkinBPS-foambarBPS)+carbonEarsBPSin:tBP1-holeScrew:tHoleScrew1-holeScrew:tHoleScrew2+carbonEarsBPSout:tBP2-holeSight:tHoleSight-holeScrew:tHoleScrew3-holeScrew:tHoleScrew4");
410 TGeoVolume* supportBarCarbonVol = new TGeoVolume("BPS_supportBarCarbon", supportBarCarbon, kMedCarbonFiber);
411 supportBarCarbonVol->SetLineColor(kGray + 2);
412 supportBar->AddNode(supportBarCarbonVol, 1, new TGeoTranslation(-(kSkinXdim / 2. + kCarbonEarsXdim + kBeampipeCarbonCollarRmax), 0, 0));
413 TGeoRotation* rotBar1 = new TGeoRotation("rotBar1", 0., 180., 180.);
414 rotBar1->RegisterYourself();
415 TGeoCombiTrans* transBar1 = new TGeoCombiTrans("transBar1", kSkinXdim / 2. + kCarbonEarsXdim + kBeampipeCarbonCollarRmax, 0, 0, rotBar1);
416 transBar1->RegisterYourself();
417 supportBar->AddNode(supportBarCarbonVol, 2, transBar1);
418 //==================================================
419
420 //==== Adding the internal foam volumes ============
421 TGeoCompositeShape* foamVolume = new TGeoCompositeShape("foamVolume", "foambarBPS-holeSight:tHoleSight");
422 TGeoVolume* FoamVolume = new TGeoVolume("supportBarFoam", foamVolume, kMedRohacell);
423 FoamVolume->SetLineColor(kGreen);
424 TGeoRotation* rotBar2 = new TGeoRotation("rotBar2", 0., 0., 180.);
425 rotBar2->RegisterYourself();
426 TGeoCombiTrans* transBar2 = new TGeoCombiTrans("transBar2", kSkinXdim / 2. + kCarbonEarsXdim + kBeampipeCarbonCollarRmax, 0, 0, rotBar2);
427 transBar2->RegisterYourself();
428 supportBar->AddNode(FoamVolume, 1, transBar1);
429 supportBar->AddNode(FoamVolume, 2, new TGeoTranslation(-(kSkinXdim / 2. + kCarbonEarsXdim + kBeampipeCarbonCollarRmax), 0, 0));
430 //==================================================
431
432 //================= Screws ====================
433 TGeoVolumeAssembly* screw = new TGeoVolumeAssembly("screw");
434 TGeoTube* headScrew = new TGeoTube("headScrew", 0., kScrewHeadDiameter / 2., kScrewHeadHeight / 2.);
435 TGeoVolume* HeadScrew = new TGeoVolume("HeadScrew", headScrew, kMedTitanium);
436 HeadScrew->SetLineColor(kRed);
437 TGeoTube* threadScrew = new TGeoTube("threadScrew", 0., kScrewDiameter / 2., kCarbonEarsYdimIn / 2.);
438 TGeoVolume* ThreadScrew = new TGeoVolume("ThreadScrew", threadScrew, kMedTitanium);
439 ThreadScrew->SetLineColor(kRed);
440 screw->AddNode(HeadScrew, 1, new TGeoTranslation(0., 0., -(kCarbonEarsYdimIn + kScrewHeadHeight) / 2.));
441 screw->AddNode(ThreadScrew, 1);
442 TGeoCombiTrans* tScrew1 = new TGeoCombiTrans("transScrew1", kScrewPositionIn, (kCarbonEarsYdimIn - kSkinYdim) / 2., -0.7, rotScrew);
443 TGeoCombiTrans* tScrew2 = new TGeoCombiTrans("transScrew2", kScrewPositionIn, (kCarbonEarsYdimIn - kSkinYdim) / 2., 0.7, rotScrew);
444 TGeoCombiTrans* tScrew3 = new TGeoCombiTrans("transScrew3", -kScrewPositionIn, (kCarbonEarsYdimIn - kSkinYdim) / 2., -0.7, rotScrew);
445 TGeoCombiTrans* tScrew4 = new TGeoCombiTrans("transScrew4", -kScrewPositionIn, (kCarbonEarsYdimIn - kSkinYdim) / 2., 0.7, rotScrew);
446 tScrew1->RegisterYourself();
447 tScrew2->RegisterYourself();
448 tScrew3->RegisterYourself();
449 tScrew4->RegisterYourself();
450 supportBar->AddNode(screw, 1, tScrew1);
451 supportBar->AddNode(screw, 2, tScrew2);
452 supportBar->AddNode(screw, 3, tScrew3);
453 supportBar->AddNode(screw, 4, tScrew4);
454 //==============================================
455
456 // === Optical sights (assuming the same than the MFT ones) ===
457 TGeoVolumeAssembly* fixationSight = new TGeoVolumeAssembly("fixationSight");
458 TGeoTube* screwSight = new TGeoTube("screwSight", holeSightDiameterIn / 2., holeSightDiameterOut / 2., kScrewThreadLength / 2.);
459 TGeoVolume* ScrewSight = new TGeoVolume("ScrewSight", screwSight, kMedSteel);
460 ScrewSight->SetLineColor(kBlue);
461 Double_t supportSightLength = 0.5;
462 TGeoTube* supportSight = new TGeoTube("supportSight", holeSightDiameterIn / 2., 1.4 / 2., supportSightLength / 2.);
463 TGeoVolume* SupportSight = new TGeoVolume("SupportSight", supportSight, kMedSteel);
464 SupportSight->SetLineColor(kBlue);
465 fixationSight->AddNode(ScrewSight, 1);
466 fixationSight->AddNode(SupportSight, 1, new TGeoTranslation(0., 0., (kScrewThreadLength + supportSightLength) / 2.));
467 SupportSight->SetVisibility(kTRUE);
468 fixationSight->SetVisibility(kTRUE);
469 TGeoTranslation* tSight1 = new TGeoTranslation("tSight1", 6.55, 0., (kSkinZdim - kScrewThreadLength) / 2.);
470 TGeoTranslation* tSight2 = new TGeoTranslation("tSight2", -6.55, 0., (kSkinZdim - kScrewThreadLength) / 2.);
471 tSight1->RegisterYourself();
472 tSight2->RegisterYourself();
473 supportBar->AddNode(fixationSight, 1, tSight1);
474 supportBar->AddNode(fixationSight, 2, tSight2);
475 // =====================
476
477 beamPipeSupport->AddNode(supportBar, 1);
478
479 //======================= Fixation to pipe ========================
480 TGeoTube* pipeSupportTubeCarbon = new TGeoTube(kBeampipeCarbonCollarRmin, kBeampipeCarbonCollarRmax, kFixationCarbonCollarDZ / 2.);
481 TGeoVolume* FixationToPipeVol = new TGeoVolume("FixationToPipe", pipeSupportTubeCarbon, kMedCarbonFiber);
482 FixationToPipeVol->SetLineColor(kGray + 2);
483 beamPipeSupport->AddNode(FixationToPipeVol, 1);
484 //==================================================================
485
486 //================ Beam Pipe Ring =================
487 TGeoVolumeAssembly* beamPipeRing = new TGeoVolumeAssembly("beamPipeRing");
488 TGeoTube* beamPipeRingCarbon = new TGeoTube(kVespelRmax, kBeampipeCarbonCollarRmin, kBeamPipeRingZdim / 2.);
489 TGeoVolume* beamPipeRingCarbonVol = new TGeoVolume("beamPipeRingCarbon", beamPipeRingCarbon, kMedCarbonFiber);
490 beamPipeRingCarbonVol->SetLineColor(kGray + 2);
491 beamPipeRing->AddNode(beamPipeRingCarbonVol, 1,
492 new TGeoTranslation(0., 0, (kBeamPipeRingZdim - kFixationCarbonCollarDZ) / 2.));
493 TGeoTube* beamPipeRingVespel = new TGeoTube(kVespelRmin, kVespelRmax, (kBeamPipeRingZdim + 0.4) / 2.);
494 TGeoVolume* beamPipeRingVespelVol = new TGeoVolume("beamPipeRingVespel", beamPipeRingVespel, kMedPolyimide);
495 beamPipeRingVespelVol->SetLineColor(kGreen + 2);
496 beamPipeRing->AddNode(beamPipeRingVespelVol, 1,
497 new TGeoTranslation(0., 0, (kBeamPipeRingZdim - kFixationCarbonCollarDZ) / 2.));
498 beamPipeSupport->AddNode(beamPipeRing, 1);
499 beamPipeSupport->SetVisibility(1);
500 beamPipeSupport->IsVisible();
501 //==================================================
502
503 //============ Wings (connecting the support bars to the cage support) ===============
504 TGeoVolumeAssembly* Wing = new TGeoVolumeAssembly("Wing");
505
506 // Tige
507 Double_t lengthRod = 28.7 - 1.0 - 1.0 - 1.9; // sligtly decreased to accomodate to the fixation pieces
508 Double_t diameterRod = 1.815; // sligtly increased to account of the two ends of the rod
509 Double_t xRod = 22.1;
510 TGeoTube* Rod = new TGeoTube(0., diameterRod / 2., lengthRod / 2.);
511 TGeoVolume* rod = new TGeoVolume("rod", Rod, kMedAlu7075);
512 rod->SetLineColor(kGray);
513
514 // Connecteur Tige / Beam support
515 Double_t lengthFixRod = 4.0;
516 Double_t diameterFixRod = 3.0;
517 //---------------------------------------
518 TGeoTube* RodBracket = new TGeoTube("RodBracket", 0., diameterFixRod / 2., lengthFixRod / 2.);
519 TGeoBBox* BracketPlane = new TGeoBBox("BracketPlane", 3., 3., 3.);
520 TGeoTranslation* tBracketPlane = new TGeoTranslation("tBracketPlane", 0., 3. - kCarbonEarsYdimOut / 2., (lengthFixRod + 6.) / 2. - 2.6);
521 tBracketPlane->RegisterYourself();
522 TGeoCompositeShape* Bracket = new TGeoCompositeShape("Bracket", "RodBracket-BracketPlane:tBracketPlane");
523 TGeoVolume* bracket = new TGeoVolume("bracket", Bracket, kMedAlu7075);
524 //---------------------------------------
525
526 // Carbon box surrounding the aluminum rod
527 TGeoVolumeAssembly* carbonBox = new TGeoVolumeAssembly("carbonBox");
528 Double_t eCarbonBox = 0.1;
529 Double_t trdWidth = 8.6;
530 Double_t trdLength = 11.05 - 1.0 - 0.6; // on each side to accomodate the bracket and TRDPlate
531 TGeoTrd1* trdOut = new TGeoTrd1("trdOut", 1.405 / 2, 6.632 / 2, trdLength / 2, trdWidth / 2);
532 TGeoTrd1* trdIn = new TGeoTrd1("trdIn", 1.405 / 2 - eCarbonBox, 6.632 / 2 - eCarbonBox, trdLength / 2 + eCarbonBox, trdWidth / 2 - eCarbonBox);
533 TGeoCompositeShape* trd = new TGeoCompositeShape("trd", "trdOut-trdIn");
534 TGeoVolume* TRD = new TGeoVolume("TRD", trd, kMedCarbonFiber);
535 TRD->SetLineColor(kGray);
536
537 // To close the carbon box
538 TGeoTrd1* trdPlate = new TGeoTrd1("trdPlate", 1.405 / 2, 6.632 / 2, 1.0 / 2, trdWidth / 2);
539 TGeoVolume* TRDPlate = new TGeoVolume("TDRPlate", trdPlate, kMedAlu7075);
540
541 // To connect on the main cage
542 TGeoBBox* plateBox = new TGeoBBox("plateBox", 7.5 / 2., 9.5 / 2., 1.9 / 2.);
543 TGeoBBox* removeBox = new TGeoBBox("removeBox", 2.1 / 2 + 0.0001, 2.5 / 2. + 0.0001, 1.9 / 2. + 0.0001);
544 TGeoTranslation* tRemove1 = new TGeoTranslation("tRemove1", (7.5 - 2.1) / 2, -(9.5 - 2.5) / 2, 0.);
545 TGeoTranslation* tRemove2 = new TGeoTranslation("tRemove2", -(7.5 - 2.1) / 2, -(9.5 - 2.5) / 2, 0.);
546 tRemove1->RegisterYourself();
547 tRemove2->RegisterYourself();
548
549 // Connectors Rod / Cage
550 TGeoCompositeShape* PlateBox = new TGeoCompositeShape("PlateBox", "plateBox-removeBox:tRemove1-removeBox:tRemove2");
551 TGeoVolume* PLATEBox = new TGeoVolume("PLATEBox", PlateBox, kMedAlu7075);
552
553 TGeoRotation* PlateRot = new TGeoRotation("PlateRot", 0., 0., 0.);
554 TGeoRotation* FrontRot = new TGeoRotation("FrontRot", 180., 90., 0.);
555 TGeoCombiTrans* tFrontCarbonBox = new TGeoCombiTrans("tFrontCarbonBox", 0., 0., 0., FrontRot);
556 PlateRot->RegisterYourself();
557 FrontRot->RegisterYourself();
558 tFrontCarbonBox->RegisterYourself();
559 TGeoCombiTrans* tTRDPlate = new TGeoCombiTrans("tTRDPlate", 0., 0., -(trdLength + 1.0) / 2, FrontRot);
560 tTRDPlate->RegisterYourself();
561 TRDPlate->SetLineColor(kGray + 2);
562 TGeoCombiTrans* tPlateBox = new TGeoCombiTrans("tPlateBox", 0., 0., -(trdLength + 1.9) / 2 - 1.0, PlateRot);
563 tPlateBox->RegisterYourself();
564 PLATEBox->SetLineColor(kGray);
565
566 Double_t xyOut[16] = {0};
567 xyOut[0] = 3.316;
568 xyOut[1] = 4.3;
569 xyOut[2] = 0.7025;
570 xyOut[3] = -xyOut[1];
571 xyOut[4] = -xyOut[2];
572 xyOut[5] = -xyOut[1];
573 xyOut[6] = -xyOut[0];
574 xyOut[7] = xyOut[1];
575 //--------------
576 xyOut[8] = 1.3;
577 xyOut[9] = 1.3 - xyOut[1] + xyOut[8];
578 xyOut[10] = xyOut[8];
579 xyOut[11] = -xyOut[8] - xyOut[1] + xyOut[8];
580 xyOut[12] = -xyOut[8];
581 xyOut[13] = -xyOut[8] - xyOut[1] + xyOut[8];
582 xyOut[14] = -xyOut[8];
583 xyOut[15] = xyOut[8] - xyOut[1] + xyOut[8];
584 Double_t ARB8Length = 15.35;
585 TGeoArb8* ARB8Out = new TGeoArb8("ARB8Out", ARB8Length / 2, xyOut);
586
587 Double_t xyIn[16] = {0};
588 xyIn[0] = xyOut[0] - eCarbonBox;
589 xyIn[1] = xyOut[1] - eCarbonBox;
590 xyIn[2] = 0.7025 - eCarbonBox;
591 xyIn[3] = -xyIn[1];
592 xyIn[4] = -xyIn[2];
593 xyIn[5] = -xyIn[1];
594 xyIn[6] = -xyIn[0];
595 xyIn[7] = xyIn[1];
596 //--------------
597 xyIn[8] = xyOut[8] - eCarbonBox;
598 xyIn[9] = xyOut[8] - xyIn[1] + xyIn[8] - eCarbonBox;
599 xyIn[10] = xyIn[8];
600 xyIn[11] = -xyIn[8] - xyOut[1] + xyOut[8];
601 xyIn[12] = -xyIn[8];
602 xyIn[13] = -xyIn[8] - xyOut[1] + xyOut[8];
603 xyIn[14] = -xyIn[8];
604 xyIn[15] = xyIn[8] - xyOut[1] + xyOut[8];
605 TGeoArb8* ARB8In = new TGeoArb8("ARB8In", ARB8Length / 2 + 0.0001, xyIn);
606
607 TGeoCompositeShape* arb8 = new TGeoCompositeShape("arb8", "ARB8Out-ARB8In");
608 TGeoVolume* ARB8 = new TGeoVolume("ARB8", arb8, kMedCarbonFiber);
609 ARB8->SetLineColor(kGray);
610 TGeoRotation* RearRot = new TGeoRotation("RearRot", 0., 0., 0.);
611 TGeoCombiTrans* tRearCarbonBox = new TGeoCombiTrans("tRearCarbonBox", 0., 0., (ARB8Length + trdLength) / 2, RearRot);
612 RearRot->RegisterYourself();
613 tRearCarbonBox->RegisterYourself();
614 //===============================================================
615
616 carbonBox->AddNode(TRD, 1, tFrontCarbonBox);
617 carbonBox->AddNode(ARB8, 1, tRearCarbonBox);
618 carbonBox->AddNode(TRDPlate, 1, tTRDPlate);
619 carbonBox->AddNode(PLATEBox, 1, tPlateBox);
620
621 TGeoRotation* CarbonBoxRot1 = new TGeoRotation("CarbonBoxRot1", 90., 0., 0.);
622 Double_t xCarbonBox = xRod + trdWidth / 2 - xyOut[8];
623 Double_t zCarbonBox = -trdLength / 2 - ARB8Length - lengthFixRod + 1.3;
624 TGeoCombiTrans* tCarbonBox1 = new TGeoCombiTrans("tCarbonBox1", -xCarbonBox, 0., zCarbonBox, CarbonBoxRot1);
625 CarbonBoxRot1->RegisterYourself();
626 tCarbonBox1->RegisterYourself();
627 TGeoRotation* CarbonBoxRot2 = new TGeoRotation("CarbonBoxRot2", 270., 0., 0.);
628 TGeoCombiTrans* tCarbonBox2 = new TGeoCombiTrans("tCarbonBox2", xCarbonBox, 0., zCarbonBox, CarbonBoxRot2);
629 CarbonBoxRot2->RegisterYourself();
630 tCarbonBox2->RegisterYourself();
631
632 Wing->AddNode(rod, 1, new TGeoTranslation(xRod, 0., -(lengthRod / 2. + lengthFixRod) + 1.3));
633 Wing->AddNode(rod, 2, new TGeoTranslation(-xRod, 0., -(lengthRod / 2. + lengthFixRod) + 1.3));
634 bracket->SetLineColor(kGray);
635 Wing->AddNode(bracket, 1, new TGeoTranslation(xRod, 0., -lengthFixRod / 2. + 1.3));
636 Wing->AddNode(bracket, 2, new TGeoTranslation(-xRod, 0., -lengthFixRod / 2. + 1.3));
637 Wing->AddNode(carbonBox, 1, tCarbonBox1);
638 Wing->AddNode(carbonBox, 2, tCarbonBox2);
639
640 beamPipeSupport->AddNode(Wing, 1);
641 Double_t mGlobalShift = 2.45; // to be closest to the first bellow according to Corrado blueprints
642 barrel->AddNode(beamPipeSupport, 1, new TGeoTranslation(0., 30, kBeamPipesupportZpos + kFixationCarbonCollarDZ / 2. - mGlobalShift));
643
645
647 // Side A section after Beryllium
648 // Authors: M.Sitta - 19 Sep 2014
649 // Drawings from C. Gargiulo :
650 // \\cern.ch\dfs\Workspaces\c\cgargiul\EXPERIMENT\ALICE\ALICE_MECHANICS\ALICE_DATA_PACKAGE\IN\DETECTORS\ITS_UPGRADE\1-DESIGN\0-IF_Control_Drawing\20140207_ICD_ITS_MFT_BP
652
653 //---------------- Al tube ------------------
654 Float_t kAluminumSectionThickness = 0.08;
655
656 Float_t kAluminum1stSectionOuterRadius = 1.9;
657 Float_t kAluminum1stSectionZmin = kBeryliumSectionZmax;
658 Float_t kAluminum1stSectionLength = 20.8;
659 Float_t kAluminumConesAngle = 15. * TMath::DegToRad();
660
661 Float_t kAluminum2ndSectionOuterRadius = 2.5;
662 Float_t kAluminum2ndSectionTotalLength = 361.8; /* was 402.8 - avoid overlap till we know where the pump will be */
663
664 Float_t kBeamPipeSupportZpos = 177.5;
665 Float_t kBeamPipeSupportLength = 5.25;
666 Float_t kBeamPipeSupportThickness = 0.18;
667
668 Float_t kZToAluminiumSecondCone = 3.08;
669 Float_t kAluminum3rdSectionOuterRadius = 3.0;
670 Float_t kFlangeATotalLength = 2.14;
671 Float_t kFlangeASteelSectionLength = 0.8;
672 Float_t kFlangeAExternalRadius = 7.6;
673
674 Float_t kSupportRingZpos = 8.0;
675 Float_t kSupportRingLength = 0.6;
676 Float_t kSupportRingRmax = 3.1;
677
678 Float_t kAluminumFirstConeLength =
679 (kAluminum2ndSectionOuterRadius - kAluminum1stSectionOuterRadius) / TMath::Tan(kAluminumConesAngle);
680 Float_t kAluminumSecondConeLength =
681 (kAluminum3rdSectionOuterRadius - kAluminum2ndSectionOuterRadius) / TMath::Tan(kAluminumConesAngle);
682
683 Float_t kZ26 = kAluminum1stSectionZmin;
684 Float_t kZ27 = kZ26 + kAluminum1stSectionLength;
685 Float_t kZ28 = kZ27 + kAluminumFirstConeLength;
686 Float_t kZ30 = kBeamPipeSupportZpos;
687 Float_t kZ29 = kZ30 - (kBeamPipeSupportThickness - kAluminumSectionThickness);
688 Float_t kZ32 = kZ29 + kBeamPipeSupportLength;
689 Float_t kZ31 = kZ32 - (kBeamPipeSupportThickness - kAluminumSectionThickness);
690 Float_t kZ36 = kZ27 + kAluminum2ndSectionTotalLength - kFlangeASteelSectionLength;
691 Float_t kZ35 = kZ36 - (kFlangeATotalLength - kFlangeASteelSectionLength);
692 Float_t kZ34 = kZ35 - (kZToAluminiumSecondCone - kFlangeATotalLength);
693 Float_t kZ33 = kZ34 - kAluminumSecondConeLength;
694
695 Float_t rMin, rMax;
696 Float_t zPos;
697
698 // The Aluminum Section till Flange. The sections are first defined with the real
699 // wall, so that the vacuum bore can be read off them, and the mother is then
700 // opened up to the beam axis so that it contains that bore itself.
701 TGeoPcon* aluSideA = new TGeoPcon(0., 360., 14);
702 rMax = kAluminum1stSectionOuterRadius;
703 rMin = rMax - kAluminumSectionThickness;
704 aluSideA->DefineSection(0, kZ26, rMin, rMax);
705 aluSideA->DefineSection(1, kZ27, rMin, rMax);
706
707 rMax = kAluminum2ndSectionOuterRadius;
708 rMin = rMax - kAluminumSectionThickness;
709 aluSideA->DefineSection(2, kZ28, rMin, rMax);
710 aluSideA->DefineSection(3, kZ29, rMin, rMax);
711
712 rMax = rMin + kBeamPipeSupportThickness;
713 aluSideA->DefineSection(4, kZ30, rMin, rMax);
714 aluSideA->DefineSection(5, kZ31, rMin, rMax);
715
716 aluSideA->DefineSection(6, kZ32, aluSideA->GetRmin(2), aluSideA->GetRmax(2));
717 aluSideA->DefineSection(7, kZ33, aluSideA->GetRmin(2), aluSideA->GetRmax(2));
718
719 rMax = kAluminum3rdSectionOuterRadius;
720 rMin = rMax - kAluminumSectionThickness;
721 aluSideA->DefineSection(8, kZ34, rMin, rMax);
722 aluSideA->DefineSection(9, kZ35, rMin, rMax);
723
724 rMax = kFlangeAExternalRadius;
725 aluSideA->DefineSection(10, kZ35, rMin, rMax);
726 aluSideA->DefineSection(11, kZ35 + kAluminumSectionThickness, rMin, rMax);
727
728 rMin = rMax - kAluminumSectionThickness;
729 aluSideA->DefineSection(12, kZ35 + kAluminumSectionThickness, rMin, rMax);
730 aluSideA->DefineSection(13, kZ36, rMin, rMax);
731
732 // The vacuum inside aluSideA, taken from the wall radii before they are zeroed.
733 TGeoPcon* aluSideAVac = new TGeoPcon(0., 360., 8);
734 aluSideAVac->DefineSection(0, aluSideA->GetZ(0), 0., aluSideA->GetRmin(0));
735 aluSideAVac->DefineSection(1, aluSideA->GetZ(1), 0., aluSideA->GetRmin(1));
736 aluSideAVac->DefineSection(2, aluSideA->GetZ(2), 0., aluSideA->GetRmin(2));
737 aluSideAVac->DefineSection(3, aluSideA->GetZ(7), 0., aluSideA->GetRmin(7));
738 aluSideAVac->DefineSection(4, aluSideA->GetZ(8), 0., aluSideA->GetRmin(8));
739 aluSideAVac->DefineSection(5, aluSideA->GetZ(11), 0., aluSideA->GetRmin(11));
740 aluSideAVac->DefineSection(6, aluSideA->GetZ(12), 0., aluSideA->GetRmin(12));
741 aluSideAVac->DefineSection(7, aluSideA->GetZ(13), 0., aluSideA->GetRmin(13));
742
743 // Open the aluminium to the beam axis. Without this the vacuum daughter lies
744 // entirely outside its mother, the navigator never enters it, and the bore is
745 // filled with the barrel's air instead of vacuum.
746 for (Int_t iSec = 0; iSec < aluSideA->GetNz(); ++iSec) {
747 aluSideA->DefineSection(iSec, aluSideA->GetZ(iSec), 0., aluSideA->GetRmax(iSec));
748 }
749
750 TGeoVolume* voaluSideA = new TGeoVolume("aluSideA", aluSideA, kMedAlu2219);
751 voaluSideA->SetLineColor(kBlue);
752 barrel->AddNode(voaluSideA, 1, new TGeoTranslation(0., 30., 0.));
753
754 TGeoVolume* voaluSideAVac = new TGeoVolume("aluSideAVac", aluSideAVac, kMedVac);
755 voaluSideAVac->SetLineColor(kGreen);
756 voaluSideAVac->SetVisibility(1);
757 voaluSideA->AddNode(voaluSideAVac, 1, gGeoIdentity);
758
759 // The Stainless Steel Flange Ring
760 rMax = kFlangeAExternalRadius;
761 rMin = rMax - kAluminumSectionThickness;
762 TGeoTube* flangeASteelRing = new TGeoTube(rMin, rMax, kFlangeASteelSectionLength / 2.);
763
764 TGeoVolume* voflangeASteelRing = new TGeoVolume("steelFlangeSideA", flangeASteelRing, kMedSteel);
765 voflangeASteelRing->SetLineColor(kRed);
766 zPos = aluSideA->GetZ(13) + flangeASteelRing->GetDz();
767 barrel->AddNode(voflangeASteelRing, 1, new TGeoTranslation(0., 30., zPos));
768
769 // The support ring on A Side
770 TGeoTube* sideASuppRing = new TGeoTube(kAluminum2ndSectionOuterRadius, kSupportRingRmax, kSupportRingLength / 2.);
771
772 TGeoVolume* vosideASuppRing = new TGeoVolume("sideASuppRing", sideASuppRing, kMedAlu2219);
773 vosideASuppRing->SetLineColor(kBlue);
774 zPos = aluSideA->GetZ(13) + 2 * flangeASteelRing->GetDz() - kSupportRingZpos - sideASuppRing->GetDz();
775 barrel->AddNode(vosideASuppRing, 1, new TGeoTranslation(0., 30., zPos));
776
777 //-------------------------------------------------
778
780 // //
781 // RB24/1 //
782 // //
784 //
785 //
786 // Drawing LHCVC2U_0001
787 // Copper Tube RB24/1 393.5 cm
788 // Warm module VMACA 18.0 cm
789 // Annular Ion Pump 35.0 cm
790 // Valve 7.5 cm
791 // Warm module VMABC 28.0 cm
792 // ================================
793 // 462.0 cm
794 //
795
796 // Copper Tube RB24/1
797 const Float_t kRB24CuTubeL = 381.5;
798 const Float_t kRB24cCuTubeL = 155.775 - 150.;
799 const Float_t kRB24bCuTubeL = kRB24CuTubeL - kRB24cCuTubeL;
800 const Float_t kRB24CuTubeRi = 8.0 / 2.;
801 const Float_t kRB24CuTubeRo = 8.4 / 2.;
802 const Float_t kRB24CuTubeFRo = 7.6;
803 const Float_t kRB24CuTubeFL = 1.86;
804 const Float_t kRB24CL = 2. * 597.9 - 150.;
805 //
806 // introduce cut at end of barrel 714.6m
807 //
808 // barrel part
809 TGeoVolume* voRB24CuTubeM =
810 new TGeoVolume("voRB24CuTubeM", new TGeoTube(0., kRB24CuTubeRo, kRB24bCuTubeL / 2.), kMedVac);
811 voRB24CuTubeM->SetVisibility(0);
812 TGeoVolume* voRB24CuTube =
813 new TGeoVolume("voRB24CuTube", new TGeoTube(kRB24CuTubeRi, kRB24CuTubeRo, kRB24bCuTubeL / 2.), kMedCu);
814 voRB24CuTubeM->AddNode(voRB24CuTube, 1, gGeoIdentity);
815 // outside barrel
816 TGeoVolume* voRB24cCuTubeM =
817 new TGeoVolume("voRB24cCuTubeM", new TGeoTube(0., kRB24CuTubeRo, kRB24cCuTubeL / 2.), kMedVacNFHC);
818 voRB24CuTubeM->SetVisibility(0);
819 TGeoVolume* voRB24cCuTube =
820 new TGeoVolume("voRB24cCuTube", new TGeoTube(kRB24CuTubeRi, kRB24CuTubeRo, kRB24cCuTubeL / 2.), kMedCuNFHC);
821 voRB24cCuTubeM->AddNode(voRB24cCuTube, 1, gGeoIdentity);
822
823 // Air outside tube with higher transport cuts
824 TGeoVolume* voRB24CuTubeA = new TGeoVolume("voRB24CuTubeA", new TGeoTube(79., 80., kRB24bCuTubeL / 2.), kMedAirHigh);
825 voRB24CuTubeA->SetVisibility(0);
826
827 // Simplified DN 100 Flange
828 TGeoVolume* voRB24CuTubeF =
829 new TGeoVolume("voRB24CuTubeF", new TGeoTube(kRB24CuTubeRo, kRB24CuTubeFRo, kRB24CuTubeFL / 2.), kMedSteelNF);
830
831 // Warm Module Type VMACA
832 // LHCVMACA_0002
833 //
834 // Pos 1 Warm Bellows DN100 LHCVBU__0012
835 // Pos 2 RF Contact D80 LHCVSR__0005
836 // Pos 3 Trans. Tube Flange LHCVSR__0065
837 // [Pos 4 Hex. Countersunk Screw Bossard BN4719]
838 // [Pos 5 Tension spring LHCVSR__0011]
839 //
840 //
841 //
842 // Pos1 Warm Bellows DN100
843 // Pos1.1 Bellows LHCVBU__0006
844 //
845 //
846 // Connection Tubes
847 // Connection tube inner r
848 const Float_t kRB24B1ConTubeRin = 10.0 / 2.;
849 // Connection tube outer r
850 const Float_t kRB24B1ConTubeRou = 10.3 / 2.;
851 // Connection tube length
852 const Float_t kRB24B1ConTubeL = 2.5;
853 //
854 const Float_t kRB24B1CompL = 16.375; // Length of the compensator
855 const Float_t kRB24B1BellowRi = 10.25 / 2.; // Bellow inner radius
856 const Float_t kRB24B1BellowRo = 11.40 / 2.; // Bellow outer radius
857 const Int_t kRB24B1NumberOfPlies = 27; // Number of plies
858 const Float_t kRB24B1BellowUndL = 11.00; // Length of undulated region
859 const Float_t kRB24B1PlieThickness = 0.015; // Plie thickness
860
861 const Float_t kRB24B1PlieRadius =
862 (kRB24B1BellowUndL + (2. * kRB24B1NumberOfPlies - 2.) * kRB24B1PlieThickness) / (4. * kRB24B1NumberOfPlies);
863
864 const Float_t kRB24B1ProtTubeThickness = 0.02; // Thickness of the protection tube
865 const Float_t kRB24B1ProtTubeLength = 4.2; // Length of the protection tube
866
867 const Float_t kRB24B1RFlangeL = 1.86; // Length of the flanges
868 const Float_t kRB24B1RFlangeLO = 0.26; // Flange overlap
869 const Float_t kRB24B1RFlangeRO = 11.18 / 2; // Inner radius at Flange overlap
870 const Float_t kRB24B1RFlangeRou = 15.20 / 2.; // Outer radius of flange
871 const Float_t kRB24B1RFlangeRecess = 0.98; // Flange recess
872 const Float_t kRB24B1L = kRB24B1CompL + 2. * (kRB24B1RFlangeL - kRB24B1RFlangeRecess);
873
875 //
876 // Bellow Section
877 TGeoVolume* voRB24B1Bellow = MakeBellow("RB24B1", kRB24B1NumberOfPlies, kRB24B1BellowRi, kRB24B1BellowRo,
878 kRB24B1BellowUndL, kRB24B1PlieRadius, kRB24B1PlieThickness);
879 voRB24B1Bellow->SetVisibility(0);
880 Float_t newRB24B1BellowUndL = 2 * (static_cast<TGeoTube*>(voRB24B1Bellow->GetShape()))->GetDz();
881
882 //
883 // Bellow mother volume
884 TGeoPcon* shRB24B1BellowM = new TGeoPcon(0., 360., 12);
885 // Connection Tube and Flange
886 z = 0.;
887 shRB24B1BellowM->DefineSection(0, z, 0., kRB24B1RFlangeRou);
888 z += kRB24B1RFlangeLO;
889 shRB24B1BellowM->DefineSection(1, z, 0., kRB24B1RFlangeRou);
890 z = kRB24B1RFlangeL;
891 shRB24B1BellowM->DefineSection(2, z, 0., kRB24B1RFlangeRou);
892 shRB24B1BellowM->DefineSection(3, z, 0., kRB24B1ConTubeRou);
893 z = kRB24B1ConTubeL + kRB24B1RFlangeL - kRB24B1RFlangeRecess;
894 shRB24B1BellowM->DefineSection(4, z, 0., kRB24B1ConTubeRou);
895 // Plie
896 shRB24B1BellowM->DefineSection(5, z, 0., kRB24B1BellowRo + kRB24B1ProtTubeThickness);
897 z += newRB24B1BellowUndL;
898 shRB24B1BellowM->DefineSection(6, z, 0., kRB24B1BellowRo + kRB24B1ProtTubeThickness);
899 shRB24B1BellowM->DefineSection(7, z, 0., kRB24B1ConTubeRou);
900 // Connection Tube and Flange
901 z = kRB24B1L - shRB24B1BellowM->GetZ(3);
902 shRB24B1BellowM->DefineSection(8, z, 0., kRB24B1ConTubeRou);
903 shRB24B1BellowM->DefineSection(9, z, 0., kRB24B1RFlangeRou);
904 z = kRB24B1L - shRB24B1BellowM->GetZ(1);
905 shRB24B1BellowM->DefineSection(10, z, 0., kRB24B1RFlangeRou);
906 z = kRB24B1L - shRB24B1BellowM->GetZ(0);
907 shRB24B1BellowM->DefineSection(11, z, 0., kRB24B1RFlangeRou);
908
909 TGeoVolume* voRB24B1BellowM = new TGeoVolume("RB24B1BellowM", shRB24B1BellowM, kMedVacNF);
910 voRB24B1BellowM->SetVisibility(0);
911 //
912 // End Parts (connection tube)
913 TGeoVolume* voRB24B1CT =
914 new TGeoVolume("RB24B1CT", new TGeoTube(kRB24B1ConTubeRin, kRB24B1ConTubeRou, kRB24B1ConTubeL / 2.), kMedSteelNF);
915 //
916 // Protection Tube
917 TGeoVolume* voRB24B1PT = new TGeoVolume(
918 "RB24B1PT", new TGeoTube(kRB24B1BellowRo, kRB24B1BellowRo + kRB24B1ProtTubeThickness, kRB24B1ProtTubeLength / 2.),
919 kMedSteelNF);
920
921 z = kRB24B1ConTubeL / 2. + (kRB24B1RFlangeL - kRB24B1RFlangeRecess);
922
923 voRB24B1BellowM->AddNode(voRB24B1CT, 1, new TGeoTranslation(0., 0., z));
924 z += (kRB24B1ConTubeL / 2. + newRB24B1BellowUndL / 2.);
925 voRB24B1BellowM->AddNode(voRB24B1Bellow, 1, new TGeoTranslation(0., 0., z));
926 z += (newRB24B1BellowUndL / 2. + kRB24B1ConTubeL / 2);
927 voRB24B1BellowM->AddNode(voRB24B1CT, 2, new TGeoTranslation(0., 0., z));
928 z = kRB24B1ConTubeL + kRB24B1ProtTubeLength / 2. + 1. + kRB24B1RFlangeLO;
929 voRB24B1BellowM->AddNode(voRB24B1PT, 1, new TGeoTranslation(0., 0., z));
930 z += kRB24B1ProtTubeLength + 0.6;
931 voRB24B1BellowM->AddNode(voRB24B1PT, 2, new TGeoTranslation(0., 0., z));
932
933 // Pos 1/2 Rotatable Flange LHCVBU__0013
934 // Pos 1/3 Flange DN100/103 LHCVBU__0018
935 // The two flanges can be represented by the same volume
936 // Outer Radius (including the outer movable ring).
937 // The inner ring has a diameter of 12.04 cm
938
939 TGeoPcon* shRB24B1RFlange = new TGeoPcon(0., 360., 10);
940 z = 0.;
941 shRB24B1RFlange->DefineSection(0, z, 10.30 / 2., kRB24B1RFlangeRou);
942 z += 0.55; // 5.5 mm added for outer ring
943 z += 0.43;
944 shRB24B1RFlange->DefineSection(1, z, 10.30 / 2., kRB24B1RFlangeRou);
945 shRB24B1RFlange->DefineSection(2, z, 10.06 / 2., kRB24B1RFlangeRou);
946 z += 0.15;
947 shRB24B1RFlange->DefineSection(3, z, 10.06 / 2., kRB24B1RFlangeRou);
948 // In reality this part is rounded
949 shRB24B1RFlange->DefineSection(4, z, 10.91 / 2., kRB24B1RFlangeRou);
950 z += 0.15;
951 shRB24B1RFlange->DefineSection(5, z, 10.91 / 2., kRB24B1RFlangeRou);
952 shRB24B1RFlange->DefineSection(6, z, 10.06 / 2., kRB24B1RFlangeRou);
953 z += 0.32;
954 shRB24B1RFlange->DefineSection(7, z, 10.06 / 2., kRB24B1RFlangeRou);
955 shRB24B1RFlange->DefineSection(8, z, kRB24B1RFlangeRO, kRB24B1RFlangeRou);
956 z += kRB24B1RFlangeLO;
957 shRB24B1RFlange->DefineSection(9, z, kRB24B1RFlangeRO, kRB24B1RFlangeRou);
958
959 TGeoVolume* voRB24B1RFlange = new TGeoVolume("RB24B1RFlange", shRB24B1RFlange, kMedSteelNF);
960
961 z = kRB24B1L - kRB24B1RFlangeL;
962 voRB24B1BellowM->AddNode(voRB24B1RFlange, 1, new TGeoTranslation(0., 0., z));
963 z = kRB24B1RFlangeL;
964 voRB24B1BellowM->AddNode(voRB24B1RFlange, 2, new TGeoCombiTrans(0., 0., z, rot180));
965 //
966 // Pos 2 RF Contact D80 LHCVSR__0005
967 //
968 // Pos 2.1 RF Contact Flange LHCVSR__0003
969 //
970 TGeoPcon* shRB24B1RCTFlange = new TGeoPcon(0., 360., 6);
971 const Float_t kRB24B1RCTFlangeRin = 8.06 / 2. + 0.05; // Inner radius
972 const Float_t kRB24B1RCTFlangeL = 1.45; // Length
973
974 z = 0.;
975 shRB24B1RCTFlange->DefineSection(0, z, kRB24B1RCTFlangeRin, 8.20 / 2.);
976 z += 0.15;
977 shRB24B1RCTFlange->DefineSection(1, z, kRB24B1RCTFlangeRin, 8.20 / 2.);
978 shRB24B1RCTFlange->DefineSection(2, z, kRB24B1RCTFlangeRin, 8.60 / 2.);
979 z += 1.05;
980 shRB24B1RCTFlange->DefineSection(3, z, kRB24B1RCTFlangeRin, 8.60 / 2.);
981 shRB24B1RCTFlange->DefineSection(4, z, kRB24B1RCTFlangeRin, 11.16 / 2.);
982 z += 0.25;
983 shRB24B1RCTFlange->DefineSection(5, z, kRB24B1RCTFlangeRin, 11.16 / 2.);
984 TGeoVolume* voRB24B1RCTFlange = new TGeoVolume("RB24B1RCTFlange", shRB24B1RCTFlange, kMedCuNF);
985 z = kRB24B1L - kRB24B1RCTFlangeL;
986
987 voRB24B1BellowM->AddNode(voRB24B1RCTFlange, 1, new TGeoTranslation(0., 0., z));
988 //
989 // Pos 2.2 RF-Contact LHCVSR__0004
990 //
991 TGeoPcon* shRB24B1RCT = new TGeoPcon(0., 360., 3);
992 const Float_t kRB24B1RCTRin = 8.00 / 2.; // Inner radius
993 const Float_t kRB24B1RCTCRin = 8.99 / 2.; // Max. inner radius conical section
994 const Float_t kRB24B1RCTL = 11.78; // Length
995 const Float_t kRB24B1RCTSL = 10.48; // Length of straight section
996 const Float_t kRB24B1RCTd = 0.03; // Thickness
997
998 z = 0;
999 shRB24B1RCT->DefineSection(0, z, kRB24B1RCTCRin, kRB24B1RCTCRin + kRB24B1RCTd);
1000 z = kRB24B1RCTL - kRB24B1RCTSL;
1001 // In the (VSR0004) this section is straight in (LHCVC2U_0001) it is conical ????
1002 shRB24B1RCT->DefineSection(1, z, kRB24B1RCTRin + 0.35, kRB24B1RCTRin + 0.35 + kRB24B1RCTd);
1003 z = kRB24B1RCTL - 0.03;
1004 shRB24B1RCT->DefineSection(2, z, kRB24B1RCTRin, kRB24B1RCTRin + kRB24B1RCTd);
1005
1006 TGeoVolume* voRB24B1RCT = new TGeoVolume("RB24B1RCT", shRB24B1RCT, kMedCuNF);
1007 z = kRB24B1L - kRB24B1RCTL - 0.45;
1008 voRB24B1BellowM->AddNode(voRB24B1RCT, 1, new TGeoTranslation(0., 0., z));
1009
1010 //
1011 // Pos 3 Trans. Tube Flange LHCVSR__0065
1012 //
1013 // Pos 3.1 Transition Tube D53 LHCVSR__0064
1014 // Pos 3.2 Transition Flange LHCVSR__0060
1015 // Pos 3.3 Transition Tube LHCVSR__0058
1016 TGeoPcon* shRB24B1TTF = new TGeoPcon(0., 360., 7);
1017 // Flange
1018 z = 0.;
1019 shRB24B1TTF->DefineSection(0, z, 6.30 / 2., 11.16 / 2.);
1020 z += 0.25;
1021 shRB24B1TTF->DefineSection(1, z, 6.30 / 2., 11.16 / 2.);
1022 shRB24B1TTF->DefineSection(2, z, 6.30 / 2., 9.3 / 2.);
1023 z += 0.55;
1024 shRB24B1TTF->DefineSection(3, z, 6.30 / 2., 9.3 / 2.);
1025 // Tube
1026 shRB24B1TTF->DefineSection(4, z, 6.30 / 2., 6.7 / 2.);
1027 z += 5.80;
1028 shRB24B1TTF->DefineSection(5, z, 6.30 / 2., 6.7 / 2.);
1029 // Transition Tube
1030 z += 3.75;
1031 shRB24B1TTF->DefineSection(6, z, 8.05 / 2., 8.45 / 2.);
1032 TGeoVolume* voRB24B1TTF = new TGeoVolume("RB24B1TTF", shRB24B1TTF, kMedSteelNF);
1033 z = 0.;
1034 voRB24B1BellowM->AddNode(voRB24B1TTF, 1, new TGeoTranslation(0., 0., z));
1035
1036 // Annular Ion Pump
1037 // LHCVC2U_0003
1038 //
1039 // Pos 1 Rotable Flange LHCVFX__0031
1040 // Pos 2 RF Screen Tube LHCVC2U_0005
1041 // Pos 3 Shell LHCVC2U_0007
1042 // Pos 4 Extruded Shell LHCVC2U_0006
1043 // Pos 5 Feedthrough Tube LHCVC2U_0004
1044 // Pos 6 Tubulated Flange STDVFUHV0021
1045 // Pos 7 Fixed Flange LHCVFX__0032
1046 // Pos 8 Pumping Elements
1047
1048 //
1049 // Pos 1 Rotable Flange LHCVFX__0031
1050 // pos 7 Fixed Flange LHCVFX__0032
1051 //
1052 // Mother volume
1053 const Float_t kRB24AIpML = 35.;
1054
1055 // TGeoVolume* voRB24AIpM = new TGeoVolume("voRB24AIpM", new TGeoTube(0., 10., kRB24AIpML/2.), kMedAir);
1056 TGeoVolume* voRB24AIpM = new TGeoVolumeAssembly("voRB24AIpM");
1057 voRB24AIpM->SetVisibility(0);
1058
1059 //
1060 // Length 35 cm
1061 // Flange 2 x 1.98 = 3.96
1062 // Tube = 32.84
1063 //==========================
1064 // 36.80
1065 // Overlap 2 * 0.90 = 1.80
1066
1067 const Float_t kRB24IpRFD1 = 0.68; // Length of section 1
1068 const Float_t kRB24IpRFD2 = 0.30; // Length of section 2
1069 const Float_t kRB24IpRFD3 = 0.10; // Length of section 3
1070 const Float_t kRB24IpRFD4 = 0.35; // Length of section 4
1071 const Float_t kRB24IpRFD5 = 0.55; // Length of section 5
1072
1073 const Float_t kRB24IpRFRo = 15.20 / 2.; // Flange outer radius
1074 const Float_t kRB24IpRFRi1 = 6.30 / 2.; // Flange inner radius section 1
1075 const Float_t kRB24IpRFRi2 = 6.00 / 2.; // Flange inner radius section 2
1076 const Float_t kRB24IpRFRi3 = 5.84 / 2.; // Flange inner radius section 3
1077 const Float_t kRB24IpRFRi4 = 6.00 / 2.; // Flange inner radius section 1
1078 const Float_t kRB24IpRFRi5 = 10.50 / 2.; // Flange inner radius section 2
1079
1080 TGeoPcon* shRB24IpRF = new TGeoPcon(0., 360., 9);
1081 z0 = 0.;
1082 shRB24IpRF->DefineSection(0, z0, kRB24IpRFRi1, kRB24IpRFRo);
1083 z0 += kRB24IpRFD1;
1084 shRB24IpRF->DefineSection(1, z0, kRB24IpRFRi2, kRB24IpRFRo);
1085 z0 += kRB24IpRFD2;
1086 shRB24IpRF->DefineSection(2, z0, kRB24IpRFRi2, kRB24IpRFRo);
1087 shRB24IpRF->DefineSection(3, z0, kRB24IpRFRi3, kRB24IpRFRo);
1088 z0 += kRB24IpRFD3;
1089 shRB24IpRF->DefineSection(4, z0, kRB24IpRFRi3, kRB24IpRFRo);
1090 shRB24IpRF->DefineSection(5, z0, kRB24IpRFRi4, kRB24IpRFRo);
1091 z0 += kRB24IpRFD4;
1092 shRB24IpRF->DefineSection(6, z0, kRB24IpRFRi4, kRB24IpRFRo);
1093 shRB24IpRF->DefineSection(7, z0, kRB24IpRFRi5, kRB24IpRFRo);
1094 z0 += kRB24IpRFD5;
1095 shRB24IpRF->DefineSection(8, z0, kRB24IpRFRi5, kRB24IpRFRo);
1096
1097 TGeoVolume* voRB24IpRF = new TGeoVolume("RB24IpRF", shRB24IpRF, kMedSteel);
1098
1099 //
1100 // Pos 2 RF Screen Tube LHCVC2U_0005
1101 //
1102
1103 //
1104 // Tube
1105 Float_t kRB24IpSTTL = 32.84; // Total length of the tube
1106 Float_t kRB24IpSTTRi = 5.80 / 2.; // Inner Radius
1107 Float_t kRB24IpSTTRo = 6.00 / 2.; // Outer Radius
1108 TGeoVolume* voRB24IpSTT =
1109 new TGeoVolume("RB24IpSTT", new TGeoTube(kRB24IpSTTRi, kRB24IpSTTRo, kRB24IpSTTL / 2.), kMedSteelNF);
1110 // Screen
1111 Float_t kRB24IpSTCL = 0.4; // Lenth of the crochet detail
1112 // Length of the screen
1113 Float_t kRB24IpSTSL = 9.00 - 2. * kRB24IpSTCL;
1114 // Rel. position of the screen
1115 Float_t kRB24IpSTSZ = 7.00 + kRB24IpSTCL;
1116 TGeoVolume* voRB24IpSTS =
1117 new TGeoVolume("RB24IpSTS", new TGeoTube(kRB24IpSTTRi, kRB24IpSTTRo, kRB24IpSTSL / 2.), kMedSteelNF);
1118 // Vacuum
1119 TGeoVolume* voRB24IpSTV = new TGeoVolume("RB24IpSTV", new TGeoTube(0., kRB24IpSTTRi, kRB24AIpML / 2.), kMedVacNF);
1120 //
1121 voRB24IpSTT->AddNode(voRB24IpSTS, 1, new TGeoTranslation(0., 0., kRB24IpSTSZ - kRB24IpSTTL / 2. + kRB24IpSTSL / 2.));
1122
1123 // Crochets
1124 // Inner radius
1125 Float_t kRB24IpSTCRi = kRB24IpSTTRo + 0.25;
1126 // Outer radius
1127 Float_t kRB24IpSTCRo = kRB24IpSTTRo + 0.35;
1128 // Length of 1stsection
1129 Float_t kRB24IpSTCL1 = 0.15;
1130 // Length of 2nd section
1131 Float_t kRB24IpSTCL2 = 0.15;
1132 // Length of 3rd section
1133 Float_t kRB24IpSTCL3 = 0.10;
1134 // Rel. position of 1st Crochet
1135
1136 TGeoPcon* shRB24IpSTC = new TGeoPcon(0., 360., 5);
1137 z0 = 0;
1138 shRB24IpSTC->DefineSection(0, z0, kRB24IpSTCRi, kRB24IpSTCRo);
1139 z0 += kRB24IpSTCL1;
1140 shRB24IpSTC->DefineSection(1, z0, kRB24IpSTCRi, kRB24IpSTCRo);
1141 shRB24IpSTC->DefineSection(2, z0, kRB24IpSTTRo, kRB24IpSTCRo);
1142 z0 += kRB24IpSTCL2;
1143 shRB24IpSTC->DefineSection(3, z0, kRB24IpSTTRo, kRB24IpSTCRo);
1144 z0 += kRB24IpSTCL3;
1145 shRB24IpSTC->DefineSection(4, z0, kRB24IpSTTRo, kRB24IpSTTRo + 0.001);
1146 TGeoVolume* voRB24IpSTC = new TGeoVolume("RB24IpSTC", shRB24IpSTC, kMedSteel);
1147
1148 // Pos 3 Shell LHCVC2U_0007
1149 // Pos 4 Extruded Shell LHCVC2U_0006
1150 Float_t kRB24IpShellL = 4.45; // Length of the Shell
1151 Float_t kRB24IpShellD = 0.10; // Wall thickness of the shell
1152 Float_t kRB24IpShellCTRi = 6.70 / 2.; // Inner radius of the connection tube
1153 Float_t kRB24IpShellCTL = 1.56; // Length of the connection tube
1154 Float_t kRB24IpShellCARi = 17.80 / 2.; // Inner radius of the cavity
1155 Float_t kRB24IpShellCCRo = 18.20 / 2.; // Inner radius at the centre
1156
1157 TGeoPcon* shRB24IpShell = new TGeoPcon(0., 360., 7);
1158 z0 = 0;
1159 shRB24IpShell->DefineSection(0, z0, kRB24IpShellCTRi, kRB24IpShellCTRi + kRB24IpShellD);
1160 z0 += kRB24IpShellCTL;
1161 shRB24IpShell->DefineSection(1, z0, kRB24IpShellCTRi, kRB24IpShellCTRi + kRB24IpShellD);
1162 shRB24IpShell->DefineSection(2, z0, kRB24IpShellCTRi, kRB24IpShellCARi + kRB24IpShellD);
1163 z0 += kRB24IpShellD;
1164 shRB24IpShell->DefineSection(3, z0, kRB24IpShellCARi, kRB24IpShellCARi + kRB24IpShellD);
1165 z0 = kRB24IpShellL - kRB24IpShellD;
1166 shRB24IpShell->DefineSection(4, z0, kRB24IpShellCARi, kRB24IpShellCARi + kRB24IpShellD);
1167 shRB24IpShell->DefineSection(5, z0, kRB24IpShellCARi, kRB24IpShellCCRo);
1168 z0 = kRB24IpShellL;
1169 shRB24IpShell->DefineSection(6, z0, kRB24IpShellCARi, kRB24IpShellCCRo);
1170 TGeoVolume* voRB24IpShell = new TGeoVolume("RB24IpShell", shRB24IpShell, kMedSteel);
1171
1172 TGeoPcon* shRB24IpShellM = MakeMotherFromTemplate(shRB24IpShell, 0, 6, kRB24IpShellCTRi, 13);
1173
1174 for (Int_t i = 0; i < 6; i++) {
1175 z = 2. * kRB24IpShellL - shRB24IpShellM->GetZ(5 - i);
1176 Float_t rmin = shRB24IpShellM->GetRmin(5 - i);
1177 Float_t rmax = shRB24IpShellM->GetRmax(5 - i);
1178 shRB24IpShellM->DefineSection(7 + i, z, rmin, rmax);
1179 }
1180
1181 TGeoVolume* voRB24IpShellM = new TGeoVolume("RB24IpShellM", shRB24IpShellM, kMedVac);
1182 voRB24IpShellM->SetVisibility(0);
1183 voRB24IpShellM->AddNode(voRB24IpShell, 1, gGeoIdentity);
1184 voRB24IpShellM->AddNode(voRB24IpShell, 2, new TGeoCombiTrans(0., 0., 2. * kRB24IpShellL, rot180));
1185 //
1186 // Pos 8 Pumping Elements
1187 //
1188 // Anode array
1189 TGeoVolume* voRB24IpPE = new TGeoVolume("voRB24IpPE", new TGeoTube(0.9, 1., 2.54 / 2.), kMedSteel);
1190 Float_t kRB24IpPEAR = 5.5;
1191
1192 for (Int_t i = 0; i < 15; i++) {
1193 Float_t phi = Float_t(i) * 24.;
1194 Float_t x = kRB24IpPEAR * TMath::Cos(kDegRad * phi);
1195 Float_t y = kRB24IpPEAR * TMath::Sin(kDegRad * phi);
1196 voRB24IpShellM->AddNode(voRB24IpPE, i + 1, new TGeoTranslation(x, y, kRB24IpShellL));
1197 }
1198
1199 //
1200 // Cathodes
1201 //
1202 // Here we could add some Ti strips
1203
1204 // Postioning of elements
1205 voRB24AIpM->AddNode(voRB24IpRF, 1, new TGeoTranslation(0., 0., -kRB24AIpML / 2.));
1206 voRB24AIpM->AddNode(voRB24IpRF, 2, new TGeoCombiTrans(0., 0., +kRB24AIpML / 2., rot180));
1207 voRB24AIpM->AddNode(voRB24IpSTT, 1, new TGeoTranslation(0., 0., 0.));
1208 voRB24AIpM->AddNode(voRB24IpSTV, 1, new TGeoTranslation(0., 0., 0.));
1209 voRB24AIpM->AddNode(voRB24IpShellM, 1, new TGeoTranslation(0., 0., -kRB24AIpML / 2. + 8.13));
1210 voRB24AIpM->AddNode(voRB24IpSTC, 1, new TGeoTranslation(0., 0., 8.13 - kRB24AIpML / 2.));
1211 voRB24AIpM->AddNode(voRB24IpSTC, 2, new TGeoCombiTrans(0., 0., 8.14 + 8.9 - kRB24AIpML / 2., rot180));
1212
1213 //
1214 // Valve
1215 // VAC Series 47 DN 63 with manual actuator
1216 //
1217 const Float_t kRB24ValveWz = 7.5;
1218 const Float_t kRB24ValveDN = 10.0 / 2.;
1219 //
1220 // Body containing the valve plate
1221 //
1222 const Float_t kRB24ValveBoWx = 15.6;
1223 const Float_t kRB24ValveBoWy = (21.5 + 23.1 - 5.);
1224 const Float_t kRB24ValveBoWz = 4.6;
1225 const Float_t kRB24ValveBoD = 0.5;
1226
1227 TGeoVolume* voRB24ValveBoM = new TGeoVolume(
1228 "RB24ValveBoM", new TGeoBBox(kRB24ValveBoWx / 2., kRB24ValveBoWy / 2., kRB24ValveBoWz / 2.), kMedAir);
1229 voRB24ValveBoM->SetVisibility(0);
1230 TGeoVolume* voRB24ValveBo = new TGeoVolume(
1231 "RB24ValveBo", 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(
1237 "RB24ValveBoI", new TGeoBBox(kRB24ValveBoWx / 2. - kRB24ValveBoD, kRB24ValveBoWy / 2. - kRB24ValveBoD / 2., kRB24ValveBoWz / 2. - kRB24ValveBoD),
1238 kMedVac);
1239 voRB24ValveBo->AddNode(voRB24ValveBoI, 1, new TGeoTranslation(0., kRB24ValveBoD / 2., 0.));
1240 //
1241 // Opening and Flanges
1242 const Float_t kRB24ValveFlRo = 18. / 2.;
1243 const Float_t kRB24ValveFlD = 1.45;
1244 TGeoVolume* voRB24ValveBoA =
1245 new TGeoVolume("RB24ValveBoA", new TGeoTube(0., kRB24ValveDN / 2., kRB24ValveBoD / 2.), kMedVac);
1246 voRB24ValveBo->AddNode(
1247 voRB24ValveBoA, 1, new TGeoTranslation(0., -kRB24ValveBoWy / 2. + 21.5, -kRB24ValveBoWz / 2. + kRB24ValveBoD / 2.));
1248 voRB24ValveBo->AddNode(
1249 voRB24ValveBoA, 2, new TGeoTranslation(0., -kRB24ValveBoWy / 2. + 21.5, +kRB24ValveBoWz / 2. - kRB24ValveBoD / 2.));
1250
1251 TGeoVolume* voRB24ValveFl =
1252 new TGeoVolume("RB24ValveFl", new TGeoTube(kRB24ValveDN / 2., kRB24ValveFlRo, kRB24ValveFlD / 2.), kMedSteel);
1253 TGeoVolume* voRB24ValveFlI =
1254 new TGeoVolume("RB24ValveFlI", new TGeoTube(0., kRB24ValveFlRo, kRB24ValveFlD / 2.), kMedVac);
1255 voRB24ValveFlI->AddNode(voRB24ValveFl, 1, gGeoIdentity);
1256
1257 //
1258 // Actuator Flange
1259 const Float_t kRB24ValveAFlWx = 18.9;
1260 const Float_t kRB24ValveAFlWy = 5.0;
1261 const Float_t kRB24ValveAFlWz = 7.7;
1262 TGeoVolume* voRB24ValveAFl = new TGeoVolume(
1263 "RB24ValveAFl", new TGeoBBox(kRB24ValveAFlWx / 2., kRB24ValveAFlWy / 2., kRB24ValveAFlWz / 2.), kMedSteel);
1264 //
1265 // Actuator Tube
1266 const Float_t kRB24ValveATRo = 9.7 / 2.;
1267 const Float_t kRB24ValveATH = 16.6;
1268 TGeoVolume* voRB24ValveAT = new TGeoVolume(
1269 "RB24ValveAT", new TGeoTube(kRB24ValveATRo - 2. * kRB24ValveBoD, kRB24ValveATRo, kRB24ValveATH / 2.), kMedSteel);
1270 //
1271 // Manual Actuator (my best guess)
1272 TGeoVolume* voRB24ValveMA1 = new TGeoVolume("RB24ValveMA1", new TGeoCone(2.5 / 2., 0., 0.5, 4.5, 5.), kMedSteel);
1273 TGeoVolume* voRB24ValveMA2 = new TGeoVolume("RB24ValveMA2", new TGeoTorus(5., 0., 1.25), kMedSteel);
1274 TGeoVolume* voRB24ValveMA3 = new TGeoVolume("RB24ValveMA3", new TGeoTube(0., 1.25, 2.5), kMedSteel);
1275
1276 //
1277 // Position all volumes
1278 Float_t y0;
1279 TGeoVolumeAssembly* voRB24ValveMo = new TGeoVolumeAssembly("RB24ValveMo");
1280 voRB24ValveMo->AddNode(voRB24ValveFl, 1, new TGeoTranslation(0., 0., -7.5 / 2. + kRB24ValveFlD / 2.));
1281 voRB24ValveMo->AddNode(voRB24ValveFl, 2, new TGeoTranslation(0., 0., +7.5 / 2. - kRB24ValveFlD / 2.));
1282 y0 = -21.5;
1283 voRB24ValveMo->AddNode(voRB24ValveBoM, 1, new TGeoTranslation(0., y0 + kRB24ValveBoWy / 2., 0.));
1284 y0 += kRB24ValveBoWy;
1285 voRB24ValveMo->AddNode(voRB24ValveAFl, 1, new TGeoTranslation(0., y0 + kRB24ValveAFlWy / 2., 0.));
1286 y0 += kRB24ValveAFlWy;
1287 voRB24ValveMo->AddNode(voRB24ValveAT, 1, new TGeoCombiTrans(0., y0 + kRB24ValveATH / 2., 0., rotyz));
1288 y0 += kRB24ValveATH;
1289 voRB24ValveMo->AddNode(voRB24ValveMA1, 1, new TGeoCombiTrans(0., y0 + 2.5 / 2., 0., rotyz));
1290 y0 += 2.5;
1291 voRB24ValveMo->AddNode(voRB24ValveMA2, 1, new TGeoCombiTrans(0., y0 + 2.5 / 2., 0., rotyz));
1292 y0 += 2.5;
1293 voRB24ValveMo->AddNode(voRB24ValveMA3, 1,
1294 new TGeoCombiTrans(5. / TMath::Sqrt(2.), y0 + 5.0 / 2., 5. / TMath::Sqrt(2.), rotyz));
1295 //
1296 // Warm Module Type VMABC
1297 // LHCVMABC_0002
1298 //
1299 //
1300 //
1301 // Flange 1.00
1302 // Central Piece 11.50
1303 // Bellow 14.50
1304 // End Flange 1.00
1305 //===================================
1306 // Total 28.00
1307 //
1308 // Pos 1 Warm Bellows DN100 LHCVBU__0016
1309 // Pos 2 Trans. Tube Flange LHCVSR__0062
1310 // Pos 3 RF Contact D63 LHCVSR__0057
1311 // [Pos 4 Hex. Countersunk Screw Bossard BN4719]
1312 // [Pos 5 Tension spring LHCVSR__00239]
1313 //
1314
1315 // Pos 1 Warm Bellows DN100 LHCVBU__0016
1316 // Pos 1.1 Right Body 2 Ports with Support LHCVBU__0014
1317 //
1318 // Tube 1
1319 const Float_t kRB24VMABCRBT1Ri = 10.0 / 2.;
1320 const Float_t kRB24VMABCRBT1Ro = 10.3 / 2.;
1321 const Float_t kRB24VMABCRBT1L = 11.5;
1322 const Float_t kRB24VMABCRBT1L2 = 8.;
1323 const Float_t kRB24VMABCL = 28.375;
1324
1325 TGeoTube* shRB24VMABCRBT1 = new TGeoTube(kRB24VMABCRBT1Ri, kRB24VMABCRBT1Ro, kRB24VMABCRBT1L / 2.);
1326 shRB24VMABCRBT1->SetName("RB24VMABCRBT1");
1327 TGeoTube* shRB24VMABCRBT1o = new TGeoTube(0., kRB24VMABCRBT1Ro, kRB24VMABCRBT1L / 2.);
1328 shRB24VMABCRBT1o->SetName("RB24VMABCRBT1o");
1329 TGeoTube* shRB24VMABCRBT1o2 = new TGeoTube(0., kRB24VMABCRBT1Ro + 0.3, kRB24VMABCRBT1L / 2.);
1330 shRB24VMABCRBT1o2->SetName("RB24VMABCRBT1o2");
1331 // Lower inforcement
1332 TGeoVolume* voRB24VMABCRBT12 = new TGeoVolume(
1333 "RB24VMABCRBT12", new TGeoTubeSeg(kRB24VMABCRBT1Ro, kRB24VMABCRBT1Ro + 0.3, kRB24VMABCRBT1L2 / 2., 220., 320.),
1334 kMedSteelNF);
1335 //
1336 // Tube 2
1337 const Float_t kRB24VMABCRBT2Ri = 6.0 / 2.;
1338 const Float_t kRB24VMABCRBT2Ro = 6.3 / 2.;
1339 const Float_t kRB24VMABCRBF2Ro = 11.4 / 2.;
1340 const Float_t kRB24VMABCRBT2L = 5.95 + 2.; // 2. cm added for welding
1341 const Float_t kRB24VMABCRBF2L = 1.75;
1342 TGeoTube* shRB24VMABCRBT2 = new TGeoTube(kRB24VMABCRBT2Ri, kRB24VMABCRBT2Ro, kRB24VMABCRBT2L / 2.);
1343 shRB24VMABCRBT2->SetName("RB24VMABCRBT2");
1344 TGeoTube* shRB24VMABCRBT2i = new TGeoTube(0., kRB24VMABCRBT2Ri, kRB24VMABCRBT2L / 2. + 2.);
1345 shRB24VMABCRBT2i->SetName("RB24VMABCRBT2i");
1346 TGeoCombiTrans* tRBT2 = new TGeoCombiTrans(-11.5 + kRB24VMABCRBT2L / 2., 0., 7.2 - kRB24VMABCRBT1L / 2., rotxz);
1347 tRBT2->SetName("tRBT2");
1348 tRBT2->RegisterYourself();
1349 TGeoCompositeShape* shRB24VMABCRBT2c =
1350 new TGeoCompositeShape("shRB24VMABCRBT2c", "RB24VMABCRBT2:tRBT2-RB24VMABCRBT1o");
1351 TGeoVolume* voRB24VMABCRBT2 = new TGeoVolume("shRB24VMABCRBT2", shRB24VMABCRBT2c, kMedSteelNF);
1352 // Flange
1353 // Pos 1.4 Flange DN63 LHCVBU__0008
1354 TGeoVolume* voRB24VMABCRBF2 =
1355 new TGeoVolume("RB24VMABCRBF2", new TGeoTube(kRB24VMABCRBT2Ro, kRB24VMABCRBF2Ro, kRB24VMABCRBF2L / 2.), kMedSteelNF);
1356 // DN63 Blank Flange (my best guess)
1357 TGeoVolume* voRB24VMABCRBF2B =
1358 new TGeoVolume("RB24VMABCRBF2B", new TGeoTube(0., kRB24VMABCRBF2Ro, kRB24VMABCRBF2L / 2.), kMedSteelNF);
1359 //
1360 // Tube 3
1361 const Float_t kRB24VMABCRBT3Ri = 3.5 / 2.;
1362 const Float_t kRB24VMABCRBT3Ro = 3.8 / 2.;
1363 const Float_t kRB24VMABCRBF3Ro = 7.0 / 2.;
1364 const Float_t kRB24VMABCRBT3L = 4.95 + 2.; // 2. cm added for welding
1365 const Float_t kRB24VMABCRBF3L = 1.27;
1366 TGeoTube* shRB24VMABCRBT3 = new TGeoTube(kRB24VMABCRBT3Ri, kRB24VMABCRBT3Ro, kRB24VMABCRBT3L / 2);
1367 shRB24VMABCRBT3->SetName("RB24VMABCRBT3");
1368 TGeoTube* shRB24VMABCRBT3i = new TGeoTube(0., kRB24VMABCRBT3Ri, kRB24VMABCRBT3L / 2. + 2.);
1369 shRB24VMABCRBT3i->SetName("RB24VMABCRBT3i");
1370 TGeoCombiTrans* tRBT3 = new TGeoCombiTrans(0., 10.5 - kRB24VMABCRBT3L / 2., 7.2 - kRB24VMABCRBT1L / 2., rotyz);
1371 tRBT3->SetName("tRBT3");
1372 tRBT3->RegisterYourself();
1373 TGeoCompositeShape* shRB24VMABCRBT3c =
1374 new TGeoCompositeShape("shRB24VMABCRBT3c", "RB24VMABCRBT3:tRBT3-RB24VMABCRBT1o");
1375 TGeoVolume* voRB24VMABCRBT3 = new TGeoVolume("shRB24VMABCRBT3", shRB24VMABCRBT3c, kMedSteel);
1376 // Flange
1377 // Pos 1.4 Flange DN35 LHCVBU__0007
1378 TGeoVolume* voRB24VMABCRBF3 =
1379 new TGeoVolume("RB24VMABCRBF3", new TGeoTube(kRB24VMABCRBT3Ro, kRB24VMABCRBF3Ro, kRB24VMABCRBF3L / 2.), kMedSteelNF);
1380 //
1381 // Tube 4
1382 const Float_t kRB24VMABCRBT4Ri = 6.0 / 2.;
1383 const Float_t kRB24VMABCRBT4Ro = 6.4 / 2.;
1384 const Float_t kRB24VMABCRBT4L = 6.6;
1385 TGeoTube* shRB24VMABCRBT4 = new TGeoTube(kRB24VMABCRBT4Ri, kRB24VMABCRBT4Ro, kRB24VMABCRBT4L / 2.);
1386 shRB24VMABCRBT4->SetName("RB24VMABCRBT4");
1387 TGeoCombiTrans* tRBT4 = new TGeoCombiTrans(0., -11. + kRB24VMABCRBT4L / 2., 7.2 - kRB24VMABCRBT1L / 2., rotyz);
1388 tRBT4->SetName("tRBT4");
1389 tRBT4->RegisterYourself();
1390 TGeoCompositeShape* shRB24VMABCRBT4c =
1391 new TGeoCompositeShape("shRB24VMABCRBT4c", "RB24VMABCRBT4:tRBT4-RB24VMABCRBT1o2");
1392 TGeoVolume* voRB24VMABCRBT4 = new TGeoVolume("shRB24VMABCRBT4", shRB24VMABCRBT4c, kMedSteelNF);
1393 TGeoCompositeShape* shRB24VMABCRB =
1394 new TGeoCompositeShape("shRB24VMABCRB", "RB24VMABCRBT1-(RB24VMABCRBT2i:tRBT2+RB24VMABCRBT3i:tRBT3)");
1395 TGeoVolume* voRB24VMABCRBI = new TGeoVolume("RB24VMABCRBI", shRB24VMABCRB, kMedSteelNF);
1396 //
1397 // Plate
1398 const Float_t kRB24VMABCRBBx = 16.0;
1399 const Float_t kRB24VMABCRBBy = 1.5;
1400 const Float_t kRB24VMABCRBBz = 15.0;
1401
1402 // Relative position of tubes
1403 const Float_t kRB24VMABCTz = 7.2;
1404 // Relative position of plate
1405 const Float_t kRB24VMABCPz = 3.6;
1406 const Float_t kRB24VMABCPy = -12.5;
1407
1408 TGeoVolume* voRB24VMABCRBP = new TGeoVolume(
1409 "RB24VMABCRBP", new TGeoBBox(kRB24VMABCRBBx / 2., kRB24VMABCRBBy / 2., kRB24VMABCRBBz / 2.), kMedSteelNF);
1410 //
1411 // Pirani Gauge (my best guess)
1412 //
1413 TGeoPcon* shRB24VMABCPirani = new TGeoPcon(0., 360., 15);
1414 // DN35/16 Coupling
1415 z = 0;
1416 shRB24VMABCPirani->DefineSection(0, z, 0.8, kRB24VMABCRBF3Ro);
1417 z += kRB24VMABCRBF3L; // 1.3
1418 shRB24VMABCPirani->DefineSection(1, z, 0.8, kRB24VMABCRBF3Ro);
1419 shRB24VMABCPirani->DefineSection(2, z, 0.8, 1.0);
1420 // Pipe
1421 z += 2.8;
1422 shRB24VMABCPirani->DefineSection(3, z, 0.8, 1.0);
1423 // Flange
1424 shRB24VMABCPirani->DefineSection(4, z, 0.8, 1.75);
1425 z += 1.6;
1426 shRB24VMABCPirani->DefineSection(5, z, 0.8, 1.75);
1427 shRB24VMABCPirani->DefineSection(6, z, 0.8, 1.0);
1428 z += 5.2;
1429 shRB24VMABCPirani->DefineSection(7, z, 0.8, 1.0);
1430 shRB24VMABCPirani->DefineSection(8, z, 0.8, 2.5);
1431 z += 2.0;
1432 shRB24VMABCPirani->DefineSection(9, z, 0.80, 2.50);
1433 shRB24VMABCPirani->DefineSection(10, z, 1.55, 1.75);
1434 z += 5.7;
1435 shRB24VMABCPirani->DefineSection(11, z, 1.55, 1.75);
1436 shRB24VMABCPirani->DefineSection(11, z, 0.00, 1.75);
1437 z += 0.2;
1438 shRB24VMABCPirani->DefineSection(12, z, 0.00, 1.75);
1439 shRB24VMABCPirani->DefineSection(13, z, 0.00, 0.75);
1440 z += 0.5;
1441 shRB24VMABCPirani->DefineSection(14, z, 0.00, 0.75);
1442 TGeoVolume* voRB24VMABCPirani = new TGeoVolume("RB24VMABCPirani", shRB24VMABCPirani, kMedSteelNF);
1443 //
1444 //
1445 //
1446
1447 //
1448 // Positioning of elements
1449 TGeoVolumeAssembly* voRB24VMABCRB = new TGeoVolumeAssembly("RB24VMABCRB");
1450 //
1451 voRB24VMABCRB->AddNode(voRB24VMABCRBI, 1, gGeoIdentity);
1452 // Plate
1453 voRB24VMABCRB->AddNode(voRB24VMABCRBP, 1,
1454 new TGeoTranslation(0., kRB24VMABCPy + kRB24VMABCRBBy / 2.,
1455 kRB24VMABCRBBz / 2. - kRB24VMABCRBT1L / 2. + kRB24VMABCPz));
1456 // Tube 2
1457 voRB24VMABCRB->AddNode(voRB24VMABCRBT2, 1, gGeoIdentity);
1458 // Flange Tube 2
1459 voRB24VMABCRB->AddNode(voRB24VMABCRBF2, 1, new TGeoCombiTrans(kRB24VMABCPy + kRB24VMABCRBF2L / 2., 0., kRB24VMABCTz - kRB24VMABCRBT1L / 2., rotxz));
1460 // Blank Flange Tube 2
1461 voRB24VMABCRB->AddNode(voRB24VMABCRBF2B, 1, new TGeoCombiTrans(kRB24VMABCPy - kRB24VMABCRBF2L / 2., 0., kRB24VMABCTz - kRB24VMABCRBT1L / 2., rotxz));
1462 // Tube 3
1463 voRB24VMABCRB->AddNode(voRB24VMABCRBT3, 1, gGeoIdentity);
1464 // Flange Tube 3
1465 voRB24VMABCRB->AddNode(voRB24VMABCRBF3, 1, new TGeoCombiTrans(0., 11.2 - kRB24VMABCRBF3L / 2., kRB24VMABCTz - kRB24VMABCRBT1L / 2., rotyz));
1466 // Pirani Gauge
1467 voRB24VMABCRB->AddNode(voRB24VMABCPirani, 1,
1468 new TGeoCombiTrans(0., 11.2, kRB24VMABCTz - kRB24VMABCRBT1L / 2., rotyz));
1469 // Tube 4
1470 voRB24VMABCRB->AddNode(voRB24VMABCRBT4, 1, gGeoIdentity);
1471 // Inforcement
1472 voRB24VMABCRB->AddNode(voRB24VMABCRBT12, 1,
1473 new TGeoTranslation(0., 0., kRB24VMABCRBT1L2 / 2. - kRB24VMABCRBT1L / 2. + 2.8));
1474
1475 // Pos 1.3 Bellows with end part LHCVBU__0002
1476 //
1477 // Connection Tube
1478 // Connection tube inner r
1479 const Float_t kRB24VMABBEConTubeRin = 10.0 / 2.;
1480 // Connection tube outer r
1481 const Float_t kRB24VMABBEConTubeRou = 10.3 / 2.;
1482 // Connection tube length
1483 const Float_t kRB24VMABBEConTubeL1 = 0.9;
1484 const Float_t kRB24VMABBEConTubeL2 = 2.6;
1485 // const Float_t RB24VMABBEBellowL = kRB24VMABBEConTubeL1 + kRB24VMABBEConTubeL2 + kRB24B1BellowUndL;
1486
1487 // Mother volume
1488 TGeoPcon* shRB24VMABBEBellowM = new TGeoPcon(0., 360., 6);
1489 // Connection Tube and Flange
1490 z = 0.;
1491 shRB24VMABBEBellowM->DefineSection(0, z, kRB24VMABBEConTubeRin, kRB24VMABBEConTubeRou);
1492 z += kRB24VMABBEConTubeL1;
1493 shRB24VMABBEBellowM->DefineSection(1, z, kRB24VMABBEConTubeRin, kRB24VMABBEConTubeRou);
1494 shRB24VMABBEBellowM->DefineSection(2, z, kRB24B1BellowRi, kRB24B1BellowRo + kRB24B1ProtTubeThickness);
1495 z += newRB24B1BellowUndL;
1496 shRB24VMABBEBellowM->DefineSection(3, z, kRB24B1BellowRi, kRB24B1BellowRo + kRB24B1ProtTubeThickness);
1497 shRB24VMABBEBellowM->DefineSection(4, z, kRB24VMABBEConTubeRin, kRB24VMABBEConTubeRou);
1498 z += kRB24VMABBEConTubeL2;
1499 shRB24VMABBEBellowM->DefineSection(5, z, kRB24VMABBEConTubeRin, kRB24VMABBEConTubeRou);
1500 TGeoVolume* voRB24VMABBEBellowM = new TGeoVolume("RB24VMABBEBellowM", shRB24VMABBEBellowM, kMedVacNF);
1501 voRB24VMABBEBellowM->SetVisibility(0);
1502
1503 // Connection tube left
1504 TGeoVolume* voRB24VMABBECT1 = new TGeoVolume(
1505 "RB24VMABBECT1", new TGeoTube(kRB24VMABBEConTubeRin, kRB24VMABBEConTubeRou, kRB24VMABBEConTubeL1 / 2.), kMedSteelNF);
1506 // Connection tube right
1507 TGeoVolume* voRB24VMABBECT2 = new TGeoVolume(
1508 "RB24VMABBECT2", new TGeoTube(kRB24VMABBEConTubeRin, kRB24VMABBEConTubeRou, kRB24VMABBEConTubeL2 / 2.), kMedSteelNF);
1509 z = kRB24VMABBEConTubeL1 / 2.;
1510 voRB24VMABBEBellowM->AddNode(voRB24VMABBECT1, 1, new TGeoTranslation(0., 0., z));
1511 z += kRB24VMABBEConTubeL1 / 2.;
1512 z += newRB24B1BellowUndL / 2.;
1513 voRB24VMABBEBellowM->AddNode(voRB24B1Bellow, 2, new TGeoTranslation(0., 0., z));
1514 z += newRB24B1BellowUndL / 2.;
1515 z += kRB24VMABBEConTubeL2 / 2.;
1516 voRB24VMABBEBellowM->AddNode(voRB24VMABBECT2, 1, new TGeoTranslation(0., 0., z));
1517 z += kRB24VMABBEConTubeL2 / 2.;
1518
1519 voRB24VMABCRB->AddNode(voRB24VMABBEBellowM, 1, new TGeoTranslation(0., 0., kRB24VMABCRBT1L / 2.));
1520
1521 // Pos 1.2 Rotable flange LHCVBU__0013[*]
1522 // Front
1523 voRB24VMABCRB->AddNode(voRB24B1RFlange, 3, new TGeoCombiTrans(0., 0., -kRB24VMABCRBT1L / 2. + 0.86, rot180));
1524 // End
1525 z = kRB24VMABCRBT1L / 2. + newRB24B1BellowUndL + kRB24VMABBEConTubeL1 + kRB24VMABBEConTubeL2;
1526 voRB24VMABCRB->AddNode(voRB24B1RFlange, 4, new TGeoTranslation(0., 0., z - 0.86));
1527
1528 // Pos 2 Trans. Tube Flange LHCVSR__0062
1529 // Pos 2.1 Transition Tube LHCVSR__0063
1530 // Pos 2.2 Transition Flange LHCVSR__0060
1531 //
1532 // Transition Tube with Flange
1533 TGeoPcon* shRB24VMABCTT = new TGeoPcon(0., 360., 7);
1534 z = 0.;
1535 shRB24VMABCTT->DefineSection(0, z, 6.3 / 2., 11.16 / 2.);
1536 z += 0.25;
1537 shRB24VMABCTT->DefineSection(1, z, 6.3 / 2., 11.16 / 2.);
1538 shRB24VMABCTT->DefineSection(2, z, 6.3 / 2., 9.30 / 2.);
1539 z += 0.25;
1540 shRB24VMABCTT->DefineSection(3, z, 6.3 / 2., 9.30 / 2.);
1541 shRB24VMABCTT->DefineSection(4, z, 6.3 / 2., 6.70 / 2.);
1542 z += (20.35 - 0.63);
1543 shRB24VMABCTT->DefineSection(5, z, 6.3 / 2., 6.7 / 2.);
1544 z += 0.63;
1545 shRB24VMABCTT->DefineSection(6, z, 6.3 / 2., 6.7 / 2.);
1546 TGeoVolume* voRB24VMABCTT = new TGeoVolume("RB24VMABCTT", shRB24VMABCTT, kMedSteelNF);
1547 voRB24VMABCRB->AddNode(voRB24VMABCTT, 1, new TGeoTranslation(0., 0., -kRB24VMABCRBT1L / 2. - 1.));
1548
1549 // Pos 3 RF Contact D63 LHCVSR__0057
1550 // Pos 3.1 RF Contact Flange LHCVSR__0017
1551 //
1552 TGeoPcon* shRB24VMABCCTFlange = new TGeoPcon(0., 360., 6);
1553 const Float_t kRB24VMABCCTFlangeRin = 6.36 / 2.; // Inner radius
1554 const Float_t kRB24VMABCCTFlangeL = 1.30; // Length
1555
1556 z = 0.;
1557 shRB24VMABCCTFlange->DefineSection(0, z, kRB24VMABCCTFlangeRin, 6.5 / 2.);
1558 z += 0.15;
1559 shRB24VMABCCTFlange->DefineSection(1, z, kRB24VMABCCTFlangeRin, 6.5 / 2.);
1560 shRB24VMABCCTFlange->DefineSection(2, z, kRB24VMABCCTFlangeRin, 6.9 / 2.);
1561 z += 0.9;
1562 shRB24VMABCCTFlange->DefineSection(3, z, kRB24VMABCCTFlangeRin, 6.9 / 2.);
1563 shRB24VMABCCTFlange->DefineSection(4, z, kRB24VMABCCTFlangeRin, 11.16 / 2.);
1564 z += 0.25;
1565 shRB24VMABCCTFlange->DefineSection(5, z, kRB24VMABCCTFlangeRin, 11.16 / 2.);
1566 TGeoVolume* voRB24VMABCCTFlange = new TGeoVolume("RB24VMABCCTFlange", shRB24VMABCCTFlange, kMedCuNF);
1567 //
1568 // Pos 3.2 RF-Contact LHCVSR__0056
1569 //
1570 TGeoPcon* shRB24VMABCCT = new TGeoPcon(0., 360., 4);
1571 const Float_t kRB24VMABCCTRin = 6.30 / 2.; // Inner radius
1572 const Float_t kRB24VMABCCTCRin = 7.29 / 2.; // Max. inner radius conical section
1573 const Float_t kRB24VMABCCTL = 11.88; // Length
1574 const Float_t kRB24VMABCCTSL = 10.48; // Length of straight section
1575 const Float_t kRB24VMABCCTd = 0.03; // Thickness
1576 z = 0;
1577 shRB24VMABCCT->DefineSection(0, z, kRB24VMABCCTCRin, kRB24VMABCCTCRin + kRB24VMABCCTd);
1578 z = kRB24VMABCCTL - kRB24VMABCCTSL;
1579 shRB24VMABCCT->DefineSection(1, z, kRB24VMABCCTRin + 0.35, kRB24VMABCCTRin + 0.35 + kRB24VMABCCTd);
1580 z = kRB24VMABCCTL - kRB24VMABCCTFlangeL;
1581 shRB24VMABCCT->DefineSection(2, z, kRB24VMABCCTRin, kRB24VMABCCTRin + kRB24VMABCCTd);
1582 z = kRB24VMABCCTL;
1583 shRB24VMABCCT->DefineSection(3, z, kRB24VMABCCTRin, kRB24VMABCCTRin + kRB24VMABCCTd);
1584
1585 TGeoVolume* voRB24VMABCCT = new TGeoVolume("RB24VMABCCT", shRB24VMABCCT, kMedCuNF);
1586
1587 TGeoVolumeAssembly* voRB24VMABRFCT = new TGeoVolumeAssembly("RB24VMABRFCT");
1588 voRB24VMABRFCT->AddNode(voRB24VMABCCT, 1, gGeoIdentity);
1589 voRB24VMABRFCT->AddNode(voRB24VMABCCTFlange, 1, new TGeoTranslation(0., 0., kRB24VMABCCTL - kRB24VMABCCTFlangeL));
1590
1591 z = kRB24VMABCRBT1L / 2. + newRB24B1BellowUndL + kRB24VMABBEConTubeL1 + kRB24VMABBEConTubeL2 - kRB24VMABCCTL + 1.;
1592 voRB24VMABCRB->AddNode(voRB24VMABRFCT, 1, new TGeoTranslation(0., 0., z));
1593
1594 //
1595 // Assembling RB24/1
1596 //
1597 // part places in the barrel
1598 TGeoVolumeAssembly* voRB24 = new TGeoVolumeAssembly("RB24");
1599 // Cu Tube with two simplified flanges in central barrel
1600 voRB24->AddNode(voRB24CuTubeM, 1, gGeoIdentity);
1601 voRB24->AddNode(voRB24CuTubeA, 1, gGeoIdentity);
1602
1603 // part which is placed in the cave
1604 // ->
1605 TGeoVolumeAssembly* voRB24C = new TGeoVolumeAssembly("RB24C");
1606 voRB24C->AddNode(voRB24cCuTubeM, 1, gGeoIdentity);
1607 // voRB24C->AddNode(voRB24cCuTubeA, 1, new TGeoTranslation(0., 0., -(900.-kRB24cCuTubeL)/2.));
1608 z = -kRB24cCuTubeL / 2 + kRB24CuTubeFL / 2.;
1609 voRB24C->AddNode(voRB24CuTubeF, 1, new TGeoTranslation(0., 0., z));
1610 // z = +kRB24cCuTubeL / 2 - kRB24CuTubeFL / 2.;
1611 // voRB24C->AddNode(voRB24CuTubeF, 2, new TGeoTranslation(0., 0., z));
1612 // VMABC close to compensator magnet
1613 z = -kRB24cCuTubeL / 2. - (kRB24VMABCL - kRB24VMABCRBT1L / 2) + 1.;
1614 voRB24C->AddNode(voRB24VMABCRB, 2, new TGeoTranslation(0., 0., z));
1615 // <-
1616
1617 // Bellow
1618 z = kRB24bCuTubeL / 2;
1619 voRB24->AddNode(voRB24B1BellowM, 1, new TGeoTranslation(0., 0., z));
1620 z += (kRB24B1L + kRB24AIpML / 2.);
1621 // Annular ion pump
1622 voRB24->AddNode(voRB24AIpM, 1, new TGeoTranslation(0., 0., z));
1623 z += (kRB24AIpML / 2. + kRB24ValveWz / 2.);
1624 // Valve
1625 voRB24->AddNode(voRB24ValveMo, 1, new TGeoTranslation(0., 0., z));
1626 z += (kRB24ValveWz / 2. + kRB24VMABCRBT1L / 2. + 1.);
1627 // VMABC close to forward detectors
1628 voRB24->AddNode(voRB24VMABCRB, 3, new TGeoTranslation(0., 0., z));
1629 //
1630 // RB24/2
1631 //
1632 // Copper Tube RB24/2
1633 // mainly inside the compensator magnet
1634 const Float_t kRB242CuTubeL = 350.0;
1635 // 20 cm straight - 20 cm transition to final oval - 270 oval - 20 cm transition to final oval - 20 cm straight
1636 //
1637 // mother volume for transition region
1638 TGeoVolume* voRB242CuOvTransMo = new TGeoVolume("voRB24CuOvTransMo", new TGeoTube(0., 4.75, 10.), kMedAir);
1639 const Int_t nTrans = 10;
1640 TGeoVolume* voRB242CuOvTransV[nTrans];
1641 TGeoVolume* voRB242CuOvTransI[nTrans];
1642 Float_t dovX = 4.;
1643 Float_t dovY = 4.;
1644 Float_t dovZ = -9.0;
1645 for (Int_t i = 0; i < nTrans; i++) {
1646 dovX -= 0.0625;
1647 dovY += 0.075;
1648 char vname[20];
1649 snprintf(vname, 20, "voRB242CuOvTransV%d", i);
1650 voRB242CuOvTransV[i] = new TGeoVolume(vname, new TGeoEltu(dovX, dovY, 1.0), kMedCuHC);
1651 snprintf(vname, 20, "voRB242CuOvTransI%d", i);
1652 voRB242CuOvTransI[i] = new TGeoVolume(vname, new TGeoEltu(dovX - 0.2, dovY - 0.2, 1.0), kMedVacHC);
1653 voRB242CuOvTransV[i]->AddNode(voRB242CuOvTransI[i], 1, gGeoIdentity);
1654 voRB242CuOvTransMo->AddNode(voRB242CuOvTransV[i], 1, new TGeoTranslation(0., 0., dovZ));
1655 dovZ += 2.;
1656 }
1657 //
1658 TGeoVolume* voRB242CuTubeM =
1659 new TGeoVolume("voRB242CuTubeM", new TGeoTube(0., kRB24CuTubeRo, 10.), kMedVacHC);
1660 TGeoVolume* voRB242CuTube =
1661 new TGeoVolume("voRB242CuTube", new TGeoTube(kRB24CuTubeRi, kRB24CuTubeRo, 10.), kMedCuHC);
1662 voRB242CuTubeM->AddNode(voRB242CuTube, 1, gGeoIdentity);
1663 TGeoVolume* voRB242CuOvalM =
1664 new TGeoVolume("voRB242CuOvalM", new TGeoEltu(3.375, 4.75, 135.), kMedCuHC);
1665 TGeoVolume* voRB242CuOval =
1666 new TGeoVolume("voRB242CuOval", new TGeoEltu(3.175, 4.55, 135.), kMedVacHC);
1667 voRB242CuOvalM->AddNode(voRB242CuOval, 1, gGeoIdentity);
1668 //
1669 TGeoVolumeAssembly* voRB242 = new TGeoVolumeAssembly("RB242");
1670 voRB242->AddNode(voRB242CuOvalM, 1, gGeoIdentity);
1671 z = -kRB242CuTubeL / 2 + kRB24CuTubeFL / 2.;
1672 voRB242->AddNode(voRB24CuTubeF, 3, new TGeoTranslation(0., 0., z));
1673 z = +kRB242CuTubeL / 2 - kRB24CuTubeFL / 2.;
1674 voRB242->AddNode(voRB24CuTubeF, 4, new TGeoTranslation(0., 0., z));
1675 z = 135. + 10.;
1676 voRB242->AddNode(voRB242CuOvTransMo, 1, new TGeoCombiTrans(0., 0., z, rot180));
1677 z = -135. - 10.;
1678 voRB242->AddNode(voRB242CuOvTransMo, 2, new TGeoTranslation(0., 0., z));
1679 z = -135. - 30.;
1680 voRB242->AddNode(voRB242CuTubeM, 1, new TGeoTranslation(0., 0., z));
1681 z = 135. + 30.;
1682 voRB242->AddNode(voRB242CuTubeM, 2, new TGeoTranslation(0., 0., z));
1683 z = -kRB24cCuTubeL / 2 - kRB24VMABCL - kRB242CuTubeL / 2. - 1.2;
1684 voRB24C->AddNode(voRB242, 1, new TGeoTranslation(0., 0., z));
1685 //
1686 // RB24/3
1687 //
1688 // Copper Tube RB24/3
1689 // the lenth of the tube is 296.85 on the drawing but this is inconsistent with the total length tube + bellow
1690 const Float_t kRB243CuTubeL = 297.85;
1691
1692 TGeoVolume* voRB243CuTubeM =
1693 new TGeoVolume("voRB243CuTubeM", new TGeoTube(0., kRB24CuTubeRo, kRB243CuTubeL / 2.), kMedVacNF);
1694 voRB24CuTubeM->SetVisibility(0);
1695 TGeoVolume* voRB243CuTube =
1696 new TGeoVolume("voRB243CuTube", new TGeoTube(kRB24CuTubeRi, kRB24CuTubeRo, kRB243CuTubeL / 2.), kMedCuNF);
1697 voRB243CuTubeM->AddNode(voRB243CuTube, 1, gGeoIdentity);
1698
1699 TGeoVolumeAssembly* voRB243 = new TGeoVolumeAssembly("RB243");
1700 TGeoVolumeAssembly* voRB243A = new TGeoVolumeAssembly("RB243A");
1701
1702 voRB243A->AddNode(voRB243CuTube, 1, gGeoIdentity);
1703 z = -kRB243CuTubeL / 2 + kRB24CuTubeFL / 2.;
1704 voRB243A->AddNode(voRB24CuTubeF, 5, new TGeoTranslation(0., 0., z));
1705 z = +kRB243CuTubeL / 2 - kRB24CuTubeFL / 2.;
1706 voRB243A->AddNode(voRB24CuTubeF, 6, new TGeoTranslation(0., 0., z));
1707 z = +kRB243CuTubeL / 2;
1708 voRB243A->AddNode(voRB24B1BellowM, 2, new TGeoTranslation(0., 0., z));
1709
1710 z = -kRB243CuTubeL / 2. - kRB24B1L;
1711 voRB243->AddNode(voRB243A, 1, new TGeoTranslation(0., 0., z));
1712 z = -(1.5 * kRB243CuTubeL + 2. * kRB24B1L);
1713 voRB243->AddNode(voRB243A, 2, new TGeoTranslation(0., 0., z));
1714
1715 z = -2. * (kRB243CuTubeL + kRB24B1L) - (kRB24VMABCL - kRB24VMABCRBT1L / 2) + 1.;
1716 voRB243->AddNode(voRB24VMABCRB, 3, new TGeoTranslation(0., 0., z));
1717
1718 z = -kRB24cCuTubeL / 2 - kRB24VMABCL - kRB242CuTubeL - 1.2;
1719 voRB24C->AddNode(voRB243, 1, new TGeoTranslation(0., 0., z));
1720
1721 //
1722 //
1723 caveRB24->AddNode(voRB24C, 1, new TGeoCombiTrans(0., 0., -kRB24CL / 2 + kRB24cCuTubeL / 2, rot180));
1724 barrel->AddNode(voRB24, 1, new TGeoCombiTrans(0., 30., kRB24bCuTubeL / 2 + 88.5 + 400. + 0.375, rot180));
1725 //
1727 // //
1728 // The Absorber Vacuum system //
1729 // //
1731 //
1732 // Rotable Flange starts at: 82.00 cm from IP
1733 // Length of rotable flange section: 10.68 cm
1734 // Weld 0.08 cm
1735 // Length of straight section 207.21 cm
1736 // =======================================================================
1737 // 299.97 cm [0.03 cm missing ?]
1738 // Length of opening cone 252.09 cm
1739 // Weld 0.15 cm
1740 // Length of compensator 30.54 cm
1741 // Weld 0.15 cm
1742 // Length of fixed flange 2.13 - 0.97 1.16 cm
1743 // =======================================================================
1744 // 584.06 cm [584.80 installed] [0.74 cm missing]
1745 // RB26/3
1746 // Length of split flange 2.13 - 1.2 0.93 cm
1747 // Weld 0.15 cm
1748 // Length of fixed point section 16.07 cm
1749 // Weld 0.15 cm
1750 // Length of opening cone 629.20 cm
1751 // Weld 0.30 cm
1752 // Kength of the compensator 41.70 cm
1753 // Weld 0.30 cm
1754 // Length of fixed flange 2.99 - 1.72 1.27 cm
1755 // =================================================
1756 // Length of RB26/3 690.07 cm [689.20 installed] [0.87 cm too much]
1757 //
1758 // RB26/4-5
1759 // Length of split flange 2.13 - 1.2 0.93 cm
1760 // Weld 0.15 cm
1761 // Length of fixed point section 16.07 cm
1762 // Weld 0.15 cm
1763 // Length of opening cone 629.20 cm
1764 // Weld 0.30 cm
1765 // Length of closing cone
1766 // Weld
1767 // Lenth of straight section
1768 // Kength of the compensator 41.70 cm
1769 // Weld 0.30 cm
1770 // Length of fixed flange 2.99 - 1.72 1.27 cm
1771 // =================================================
1772 // Length of RB26/3 690.07 cm [689.20 installed] [0.87 cm too much]
1773
1775 // //
1776 // RB26/1-2 //
1777 // Drawing LHCV2a_0050 [as installed] //
1778 // Drawing LHCV2a_0008 //
1779 // Drawing LHCV2a_0001 //
1781 // Pos1 Vacuum Tubes LHCVC2A__0010
1782 // Pos2 Compensator LHCVC2A__0064
1783 // Pos3 Rotable Flange LHCVFX___0016
1784 // Pos4 Fixed Flange LHCVFX___0006
1785 // Pos5 Bellow Tooling LHCVFX___0003
1786 //
1787 //
1788 //
1790 // RB26/1-2 Vacuum Tubes //
1791 // Drawing LHCVC2a_0010 //
1793 const Float_t kRB26s12TubeL0 = 459.45; // 0.15 cm added for welding
1794 const Float_t kRB26s12TubeL2 = 47.21; // part of this tube outside barrel region
1795 const Float_t kRB26s12TubeL = kRB26s12TubeL0 - kRB26s12TubeL2; // 392.115
1796 //
1797 // 184.905
1798 // 0.877
1799 // Add 1 cm on outer diameter for insulation
1800 //
1801 //
1802 // the section which is placed into the central barrel (ending at z = -505)
1803 TGeoPcon* shRB26s12Tube = new TGeoPcon(0., 360., 4);
1804 // Section 1: straight section
1805 shRB26s12Tube->DefineSection(0, 0.00, 5.84 / 2., 6.00 / 2.);
1806 shRB26s12Tube->DefineSection(1, 207.21, 5.84 / 2., 6.00 / 2.);
1807 // Section 2: 0.72 deg opening cone
1808 shRB26s12Tube->DefineSection(2, 207.21, 5.84 / 2., 6.14 / 2.);
1809 shRB26s12Tube->DefineSection(3, kRB26s12TubeL, 5.84 / 2 + 2.576, 6.14 / 2. + 2.576);
1810
1811 // the section which is placed into the muon spectrometer (starting at z = -505)
1812 TGeoPcon* shRB26s12msTube = new TGeoPcon(0., 360., 3);
1813 // conical part
1814 shRB26s12msTube->DefineSection(0, 0.00, shRB26s12Tube->GetRmin(3), shRB26s12Tube->GetRmax(3));
1815 shRB26s12msTube->DefineSection(1, 452.30 - kRB26s12TubeL, 12.0 / 2., 12.3 / 2.);
1816 // straight part until compensator
1817 shRB26s12msTube->DefineSection(2, kRB26s12TubeL2, 12.0 / 2., 12.3 / 2.);
1818
1819 TGeoVolume* voRB26s12Tube = new TGeoVolume("RB26s12Tube", shRB26s12Tube, kMedSteelHC);
1820 TGeoVolume* voRB26s12msTube = new TGeoVolume("RB26s12msTube", shRB26s12msTube, kMedSteelHC);
1821 // Add the insulation layer
1822 TGeoVolume* voRB26s12TubeIns = new TGeoVolume("RB26s12TubeIns", MakeInsulationFromTemplate(shRB26s12Tube), kMedInsu);
1823 TGeoVolume* voRB26s12msTubeIns = new TGeoVolume("RB26s12msTubeIns", MakeInsulationFromTemplate(shRB26s12msTube), kMedInsu);
1824 voRB26s12Tube->AddNode(voRB26s12TubeIns, 1, gGeoIdentity);
1825 voRB26s12msTube->AddNode(voRB26s12msTubeIns, 1, gGeoIdentity);
1826
1827 TGeoVolume* voRB26s12TubeM = new TGeoVolume("RB26s12TubeM", MakeMotherFromTemplate(shRB26s12Tube), kMedVacHC);
1828 voRB26s12TubeM->AddNode(voRB26s12Tube, 1, gGeoIdentity);
1829 TGeoVolume* voRB26s12msTubeM = new TGeoVolume("RB26s12msTubeM", MakeMotherFromTemplate(shRB26s12msTube), kMedVacHC);
1830 voRB26s12msTubeM->AddNode(voRB26s12msTube, 1, gGeoIdentity);
1831
1833 // RB26/2 Axial Compensator //
1834 // Drawing LHCVC2a_0064 //
1836 const Float_t kRB26s2CompL = 30.65; // Length of the compensator
1837 const Float_t kRB26s2BellowRo = 14.38 / 2.; // Bellow outer radius [Pos 1]
1838 const Float_t kRB26s2BellowRi = 12.12 / 2.; // Bellow inner radius [Pos 1]
1839 const Int_t kRB26s2NumberOfPlies = 14; // Number of plies [Pos 1]
1840 const Float_t kRB26s2BellowUndL =
1841 10.00; // Length of undulated region [Pos 1] [+10 mm installed including pretension ?]
1842 const Float_t kRB26s2PlieThickness = 0.025; // Plie thickness [Pos 1]
1843 const Float_t kRB26s2ConnectionPlieR = 0.21; // Connection plie radius [Pos 1]
1844 // Plie radius
1845 const Float_t kRB26s2PlieR = (kRB26s2BellowUndL - 4. * kRB26s2ConnectionPlieR + 2. * kRB26s2PlieThickness +
1846 (2. * kRB26s2NumberOfPlies - 2.) * kRB26s2PlieThickness) /
1847 (4. * kRB26s2NumberOfPlies - 2.);
1848 const Float_t kRB26s2CompTubeInnerR = 12.00 / 2.; // Connection tubes inner radius [Pos 2 + 3]
1849 const Float_t kRB26s2CompTubeOuterR = 12.30 / 2.; // Connection tubes outer radius [Pos 2 + 3]
1850 const Float_t kRB26s2WeldingTubeLeftL = 9.00 / 2.; // Left connection tube half length [Pos 2]
1851 const Float_t kRB26s2WeldingTubeRightL =
1852 11.65 / 2.; // Right connection tube half length [Pos 3] [+ 0.15 cm for welding]
1853 const Float_t kRB26s2RingOuterR = 18.10 / 2.; // Ring inner radius [Pos 4]
1854 const Float_t kRB26s2RingL = 0.40 / 2.; // Ring half length [Pos 4]
1855 const Float_t kRB26s2RingZ = 6.50; // Ring z-position [Pos 4]
1856 const Float_t kRB26s2ProtOuterR = 18.20 / 2.; // Protection tube outer radius [Pos 5]
1857 const Float_t kRB26s2ProtL = 15.00 / 2.; // Protection tube half length [Pos 5]
1858 const Float_t kRB26s2ProtZ = 6.70; // Protection tube z-position [Pos 5]
1859
1860 // Mother volume
1861 //
1862 TGeoPcon* shRB26s2Compensator = new TGeoPcon(0., 360., 6);
1863 shRB26s2Compensator->DefineSection(0, 0.0, 0., kRB26s2CompTubeOuterR);
1864 shRB26s2Compensator->DefineSection(1, kRB26s2RingZ, 0., kRB26s2CompTubeOuterR);
1865 shRB26s2Compensator->DefineSection(2, kRB26s2RingZ, 0., kRB26s2ProtOuterR);
1866 shRB26s2Compensator->DefineSection(3, kRB26s2ProtZ + 2. * kRB26s2ProtL, 0., kRB26s2ProtOuterR);
1867 shRB26s2Compensator->DefineSection(4, kRB26s2ProtZ + 2. * kRB26s2ProtL, 0., kRB26s2CompTubeOuterR);
1868 shRB26s2Compensator->DefineSection(5, kRB26s2CompL, 0., kRB26s2CompTubeOuterR);
1869 TGeoVolume* voRB26s2Compensator = new TGeoVolume("RB26s2Compensator", shRB26s2Compensator, kMedVacHC);
1870
1871 //
1872 // [Pos 1] Bellow
1873 //
1874 //
1875 TGeoVolume* voRB26s2Bellow =
1876 new TGeoVolume("RB26s2Bellow", new TGeoTube(kRB26s2BellowRi, kRB26s2BellowRo, kRB26s2BellowUndL / 2.), kMedVacHC);
1877 //
1878 // Upper part of the undulation
1879 //
1880 TGeoTorus* shRB26s2PlieTorusU =
1881 new TGeoTorus(kRB26s2BellowRo - kRB26s2PlieR, kRB26s2PlieR - kRB26s2PlieThickness, kRB26s2PlieR);
1882 shRB26s2PlieTorusU->SetName("RB26s2TorusU");
1883 TGeoTube* shRB26s2PlieTubeU = new TGeoTube(kRB26s2BellowRo - kRB26s2PlieR, kRB26s2BellowRo, kRB26s2PlieR);
1884 shRB26s2PlieTubeU->SetName("RB26s2TubeU");
1885 TGeoCompositeShape* shRB26s2UpperPlie = new TGeoCompositeShape("RB26s2UpperPlie", "RB26s2TorusU*RB26s2TubeU");
1886
1887 TGeoVolume* voRB26s2WiggleU = new TGeoVolume("RB26s2UpperPlie", shRB26s2UpperPlie, kMedSteelHC);
1888 //
1889 // Lower part of the undulation
1890 TGeoTorus* shRB26s2PlieTorusL =
1891 new TGeoTorus(kRB26s2BellowRi + kRB26s2PlieR, kRB26s2PlieR - kRB26s2PlieThickness, kRB26s2PlieR);
1892 shRB26s2PlieTorusL->SetName("RB26s2TorusL");
1893 TGeoTube* shRB26s2PlieTubeL = new TGeoTube(kRB26s2BellowRi, kRB26s2BellowRi + kRB26s2PlieR, kRB26s2PlieR);
1894 shRB26s2PlieTubeL->SetName("RB26s2TubeL");
1895 TGeoCompositeShape* shRB26s2LowerPlie = new TGeoCompositeShape("RB26s2LowerPlie", "RB26s2TorusL*RB26s2TubeL");
1896
1897 TGeoVolume* voRB26s2WiggleL = new TGeoVolume("RB26s2LowerPlie", shRB26s2LowerPlie, kMedSteelHC);
1898
1899 //
1900 // Connection between upper and lower part of undulation
1901 TGeoVolume* voRB26s2WiggleC1 = new TGeoVolume(
1902 "RB26s2PlieConn1",
1903 new TGeoTube(kRB26s2BellowRi + kRB26s2PlieR, kRB26s2BellowRo - kRB26s2PlieR, kRB26s2PlieThickness / 2.), kMedSteelHC);
1904 //
1905 // One wiggle
1906 TGeoVolumeAssembly* voRB26s2Wiggle = new TGeoVolumeAssembly("RB26s2Wiggle");
1907 z0 = -kRB26s2PlieThickness / 2.;
1908 voRB26s2Wiggle->AddNode(voRB26s2WiggleC1, 1, new TGeoTranslation(0., 0., z0));
1909 z0 += kRB26s2PlieR - kRB26s2PlieThickness / 2.;
1910 voRB26s2Wiggle->AddNode(voRB26s2WiggleU, 1, new TGeoTranslation(0., 0., z0));
1911 z0 += kRB26s2PlieR - kRB26s2PlieThickness / 2.;
1912 voRB26s2Wiggle->AddNode(voRB26s2WiggleC1, 2, new TGeoTranslation(0., 0., z0));
1913 z0 += kRB26s2PlieR - kRB26s2PlieThickness;
1914 voRB26s2Wiggle->AddNode(voRB26s2WiggleL, 1, new TGeoTranslation(0., 0., z0));
1915 // Positioning of the volumes
1916 z0 = -kRB26s2BellowUndL / 2. + kRB26s2ConnectionPlieR;
1917 voRB26s2Bellow->AddNode(voRB26s2WiggleL, 1, new TGeoTranslation(0., 0., z0));
1918 z0 += kRB26s2ConnectionPlieR;
1919 zsh = 4. * kRB26s2PlieR - 2. * kRB26s2PlieThickness;
1920 for (Int_t iw = 0; iw < kRB26s2NumberOfPlies; iw++) {
1921 Float_t zpos = z0 + iw * zsh;
1922 voRB26s2Bellow->AddNode(voRB26s2Wiggle, iw + 1, new TGeoTranslation(0., 0., zpos - kRB26s2PlieThickness));
1923 }
1924
1925 voRB26s2Compensator->AddNode(voRB26s2Bellow, 1,
1926 new TGeoTranslation(0., 0., 2. * kRB26s2WeldingTubeLeftL + kRB26s2BellowUndL / 2.));
1927
1928 //
1929 // [Pos 2] Left Welding Tube
1930 //
1931 TGeoTube* shRB26s2CompLeftTube = new TGeoTube(kRB26s2CompTubeInnerR, kRB26s2CompTubeOuterR, kRB26s2WeldingTubeLeftL);
1932 TGeoVolume* voRB26s2CompLeftTube = new TGeoVolume("RB26s2CompLeftTube", shRB26s2CompLeftTube, kMedSteelHC);
1933 voRB26s2Compensator->AddNode(voRB26s2CompLeftTube, 1, new TGeoTranslation(0., 0., kRB26s2WeldingTubeLeftL));
1934 //
1935 // [Pos 3] Right Welding Tube
1936 //
1937 TGeoTube* shRB26s2CompRightTube =
1938 new TGeoTube(kRB26s2CompTubeInnerR, kRB26s2CompTubeOuterR, kRB26s2WeldingTubeRightL);
1939 TGeoVolume* voRB26s2CompRightTube = new TGeoVolume("RB26s2CompRightTube", shRB26s2CompRightTube, kMedSteelHC);
1940 voRB26s2Compensator->AddNode(voRB26s2CompRightTube, 1,
1941 new TGeoTranslation(0., 0., kRB26s2CompL - kRB26s2WeldingTubeRightL));
1942 //
1943 // [Pos 4] Ring
1944 //
1945 TGeoTube* shRB26s2CompRing = new TGeoTube(kRB26s2CompTubeOuterR, kRB26s2RingOuterR, kRB26s2RingL);
1946 TGeoVolume* voRB26s2CompRing = new TGeoVolume("RB26s2CompRing", shRB26s2CompRing, kMedSteelHC);
1947 voRB26s2Compensator->AddNode(voRB26s2CompRing, 1, new TGeoTranslation(0., 0., kRB26s2RingZ + kRB26s2RingL));
1948
1949 //
1950 // [Pos 5] Outer Protecting Tube
1951 //
1952 TGeoTube* shRB26s2CompProtTube = new TGeoTube(kRB26s2RingOuterR, kRB26s2ProtOuterR, kRB26s2ProtL);
1953 TGeoVolume* voRB26s2CompProtTube = new TGeoVolume("RB26s2CompProtTube", shRB26s2CompProtTube, kMedSteelHC);
1954 voRB26s2Compensator->AddNode(voRB26s2CompProtTube, 1, new TGeoTranslation(0., 0., kRB26s2ProtZ + kRB26s2ProtL));
1955
1957 // Rotable Flange //
1958 // Drawing LHCVFX_0016 //
1960 const Float_t kRB26s1RFlangeTubeRi = 5.84 / 2.; // Tube inner radius
1961 const Float_t kRB26s1RFlangeTubeRo = 6.00 / 2.; // Tube outer radius
1962
1963 // Pos 1 Clamp Ring LHCVFX__0015
1964 const Float_t kRB26s1RFlangeCrL = 1.40; // Lenth of the clamp ring
1965 const Float_t kRB26s1RFlangeCrRi1 = 6.72 / 2.; // Ring inner radius section 1
1966 const Float_t kRB26s1RFlangeCrRi2 = 6.06 / 2.; // Ring inner radius section 2
1967 const Float_t kRB26s1RFlangeCrRo = 8.60 / 2.; // Ring outer radius
1968 const Float_t kRB26s1RFlangeCrD = 0.800; // Width section 1
1969
1970 TGeoPcon* shRB26s1RFlangeCr = new TGeoPcon(0., 360., 4);
1971 z0 = 0.;
1972 shRB26s1RFlangeCr->DefineSection(0, z0, kRB26s1RFlangeCrRi1, kRB26s1RFlangeCrRo);
1973 z0 += kRB26s1RFlangeCrD;
1974 shRB26s1RFlangeCr->DefineSection(1, z0, kRB26s1RFlangeCrRi1, kRB26s1RFlangeCrRo);
1975 shRB26s1RFlangeCr->DefineSection(2, z0, kRB26s1RFlangeCrRi2, kRB26s1RFlangeCrRo);
1976 z0 = kRB26s1RFlangeCrL;
1977 shRB26s1RFlangeCr->DefineSection(3, z0, kRB26s1RFlangeCrRi2, kRB26s1RFlangeCrRo);
1978 TGeoVolume* voRB26s1RFlangeCr = new TGeoVolume("RB26s1RFlangeCr", shRB26s1RFlangeCr, kMedSteelHC);
1979
1980 // Pos 2 Insert LHCVFX__0015
1981 const Float_t kRB26s1RFlangeIsL = 4.88; // Lenth of the insert
1982 const Float_t kRB26s1RFlangeIsR = 6.70 / 2.; // Ring radius
1983 const Float_t kRB26s1RFlangeIsD = 0.80; // Ring Width
1984
1985 TGeoPcon* shRB26s1RFlangeIs = new TGeoPcon(0., 360., 4);
1986 z0 = 0.;
1987 shRB26s1RFlangeIs->DefineSection(0, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeIsR);
1988 z0 += kRB26s1RFlangeIsD;
1989 shRB26s1RFlangeIs->DefineSection(1, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeIsR);
1990 shRB26s1RFlangeIs->DefineSection(2, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
1991 z0 = kRB26s1RFlangeIsL;
1992 shRB26s1RFlangeIs->DefineSection(3, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
1993 TGeoVolume* voRB26s1RFlangeIs = new TGeoVolume("RB26s1RFlangeIs", shRB26s1RFlangeIs, kMedSteelHC);
1994 // 4.88 + 3.7 = 8.58 (8.7 to avoid overlap)
1995 // Pos 3 Fixed Point Section LHCVC2A_0021
1996 const Float_t kRB26s1RFlangeFpL = 5.88; // Length of the fixed point section (0.08 cm added for welding)
1997 const Float_t kRB26s1RFlangeFpZ = 3.82; // Position of the ring
1998 const Float_t kRB26s1RFlangeFpD = 0.59; // Width of the ring
1999 const Float_t kRB26s1RFlangeFpR = 7.00 / 2.; // Radius of the ring
2000
2001 TGeoPcon* shRB26s1RFlangeFp = new TGeoPcon(0., 360., 6);
2002 z0 = 0.;
2003 shRB26s1RFlangeFp->DefineSection(0, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2004 z0 += kRB26s1RFlangeFpZ;
2005 shRB26s1RFlangeFp->DefineSection(1, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2006 shRB26s1RFlangeFp->DefineSection(2, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeFpR);
2007 z0 += kRB26s1RFlangeFpD;
2008 shRB26s1RFlangeFp->DefineSection(3, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeFpR);
2009 shRB26s1RFlangeFp->DefineSection(4, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2010 z0 = kRB26s1RFlangeFpL;
2011 shRB26s1RFlangeFp->DefineSection(5, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2012 TGeoVolume* voRB26s1RFlangeFp = new TGeoVolume("RB26s1RFlangeFp", shRB26s1RFlangeFp, kMedSteelHC);
2013
2014 // Put everything in a mother volume
2015 TGeoPcon* shRB26s1RFlange = new TGeoPcon(0., 360., 8);
2016 z0 = 0.;
2017 shRB26s1RFlange->DefineSection(0, z0, 0., kRB26s1RFlangeCrRo);
2018 z0 += kRB26s1RFlangeCrL;
2019 shRB26s1RFlange->DefineSection(1, z0, 0., kRB26s1RFlangeCrRo);
2020 shRB26s1RFlange->DefineSection(2, z0, 0., kRB26s1RFlangeTubeRo);
2021 z0 = kRB26s1RFlangeIsL + kRB26s1RFlangeFpZ;
2022 shRB26s1RFlange->DefineSection(3, z0, 0., kRB26s1RFlangeTubeRo);
2023 shRB26s1RFlange->DefineSection(4, z0, 0., kRB26s1RFlangeFpR);
2024 z0 += kRB26s1RFlangeFpD;
2025 shRB26s1RFlange->DefineSection(5, z0, 0., kRB26s1RFlangeFpR);
2026 shRB26s1RFlange->DefineSection(6, z0, 0., kRB26s1RFlangeTubeRo);
2027 z0 = kRB26s1RFlangeIsL + kRB26s1RFlangeFpL;
2028 shRB26s1RFlange->DefineSection(7, z0, 0., kRB26s1RFlangeTubeRo);
2029 TGeoVolume* voRB26s1RFlange = new TGeoVolume("RB26s1RFlange", shRB26s1RFlange, kMedVacHC);
2030
2031 voRB26s1RFlange->AddNode(voRB26s1RFlangeIs, 1, gGeoIdentity);
2032 voRB26s1RFlange->AddNode(voRB26s1RFlangeCr, 1, gGeoIdentity);
2033 voRB26s1RFlange->AddNode(voRB26s1RFlangeFp, 1, new TGeoTranslation(0., 0., kRB26s1RFlangeIsL));
2034
2036 // Fixed Flange //
2037 // Drawing LHCVFX_0006 //
2039 const Float_t kRB26s2FFlangeL = 2.13; // Length of the flange
2040 const Float_t kRB26s2FFlangeD1 = 0.97; // Length of section 1
2041 const Float_t kRB26s2FFlangeD2 = 0.29; // Length of section 2
2042 const Float_t kRB26s2FFlangeD3 = 0.87; // Length of section 3
2043 const Float_t kRB26s2FFlangeRo = 17.15 / 2.; // Flange outer radius
2044 const Float_t kRB26s2FFlangeRi1 = 12.30 / 2.; // Flange inner radius section 1
2045 const Float_t kRB26s2FFlangeRi2 = 12.00 / 2.; // Flange inner radius section 2
2046 const Float_t kRB26s2FFlangeRi3 = 12.30 / 2.; // Flange inner radius section 3
2047 z0 = 0;
2048 TGeoPcon* shRB26s2FFlange = new TGeoPcon(0., 360., 6);
2049 z0 = 0.;
2050 shRB26s2FFlange->DefineSection(0, z0, kRB26s2FFlangeRi1, kRB26s2FFlangeRo);
2051 z0 += kRB26s2FFlangeD1;
2052 shRB26s2FFlange->DefineSection(1, z0, kRB26s2FFlangeRi1, kRB26s2FFlangeRo);
2053 shRB26s2FFlange->DefineSection(2, z0, kRB26s2FFlangeRi2, kRB26s2FFlangeRo);
2054 z0 += kRB26s2FFlangeD2;
2055 shRB26s2FFlange->DefineSection(3, z0, kRB26s2FFlangeRi2, kRB26s2FFlangeRo);
2056 shRB26s2FFlange->DefineSection(4, z0, kRB26s2FFlangeRi3, kRB26s2FFlangeRo);
2057 z0 += kRB26s2FFlangeD3;
2058 shRB26s2FFlange->DefineSection(5, z0, kRB26s2FFlangeRi3, kRB26s2FFlangeRo);
2059 TGeoVolume* voRB26s2FFlange = new TGeoVolume("RB26s2FFlange", shRB26s2FFlange, kMedSteelHC);
2060
2061 TGeoVolume* voRB26s2FFlangeM =
2062 new TGeoVolume("RB26s2FFlangeM", MakeMotherFromTemplate(shRB26s2FFlange, 2, 5), kMedVacHC);
2063 voRB26s2FFlangeM->AddNode(voRB26s2FFlange, 1, gGeoIdentity);
2064
2066 // //
2067 // RB26/3 //
2068 // Drawing LHCV2a_0048 //
2069 // Drawing LHCV2a_0002 //
2071 //
2072 // Pos 1 Vacuum Tubes LHCVC2A__0003
2073 // Pos 2 Fixed Point LHCVFX___0005
2074 // Pos 3 Split Flange LHCVFX___0007
2075 // Pos 4 Fixed Flange LHCVFX___0004
2076 // Pos 5 Axial Compensator LHCVC2A__0065
2077 //
2078 //
2079 //
2080 //
2082 // Vacuum Tube //
2083 // Drawing LHCVC2A_0003 //
2085 const Float_t kRB26s3TubeL = 629.35 + 0.3; // 0.3 cm added for welding
2086 const Float_t kRB26s3TubeR1 = 12. / 2.;
2087 const Float_t kRB26s3TubeR2 = kRB26s3TubeR1 + 215.8 * TMath::Tan(0.829 / 180. * TMath::Pi());
2088
2089 TGeoPcon* shRB26s3Tube = new TGeoPcon(0., 360., 7);
2090 // Section 1: straight section
2091 shRB26s3Tube->DefineSection(0, 0.00, kRB26s3TubeR1, kRB26s3TubeR1 + 0.15);
2092 shRB26s3Tube->DefineSection(1, 2.00, kRB26s3TubeR1, kRB26s3TubeR1 + 0.15);
2093 // Section 2: 0.829 deg opening cone
2094 shRB26s3Tube->DefineSection(2, 2.00, kRB26s3TubeR1, kRB26s3TubeR1 + 0.20);
2095
2096 shRB26s3Tube->DefineSection(3, 217.80, kRB26s3TubeR2, kRB26s3TubeR2 + 0.20);
2097 shRB26s3Tube->DefineSection(4, 217.80, kRB26s3TubeR2, kRB26s3TubeR2 + 0.30);
2098
2099 shRB26s3Tube->DefineSection(5, 622.20, 30.00 / 2., 30.60 / 2.);
2100 shRB26s3Tube->DefineSection(6, kRB26s3TubeL, 30.00 / 2., 30.60 / 2.);
2101
2102 TGeoVolume* voRB26s3Tube = new TGeoVolume("RB26s3Tube", shRB26s3Tube, kMedSteelHC);
2103 // Add the insulation layer
2104 TGeoVolume* voRB26s3TubeIns = new TGeoVolume("RB26s3TubeIns", MakeInsulationFromTemplate(shRB26s3Tube), kMedInsu);
2105 voRB26s3Tube->AddNode(voRB26s3TubeIns, 1, gGeoIdentity);
2106
2107 TGeoVolume* voRB26s3TubeM = new TGeoVolume("RB26s3TubeM", MakeMotherFromTemplate(shRB26s3Tube), kMedVacHC);
2108 voRB26s3TubeM->AddNode(voRB26s3Tube, 1, gGeoIdentity);
2109
2111 // Fixed Point //
2112 // Drawing LHCVFX_0005 //
2114 const Float_t kRB26s3FixedPointL = 16.37; // Length of the fixed point section (0.3 cm added for welding)
2115 const Float_t kRB26s3FixedPointZ = 9.72; // Position of the ring (0.15 cm added for welding)
2116 const Float_t kRB26s3FixedPointD = 0.595; // Width of the ring
2117 const Float_t kRB26s3FixedPointR = 13.30 / 2.; // Radius of the ring
2118 const Float_t kRB26s3FixedPointRi = 12.00 / 2.; // Inner radius of the tube
2119 const Float_t kRB26s3FixedPointRo1 = 12.30 / 2.; // Outer radius of the tube (in)
2120 const Float_t kRB26s3FixedPointRo2 = 12.40 / 2.; // Outer radius of the tube (out)
2121 const Float_t kRB26s3FixedPointDs = 1.5; // Width of straight section behind ring
2122 const Float_t kRB26s3FixedPointDc = 3.15; // Width of conical section behind ring (0.15 cm added for welding)
2123
2124 TGeoPcon* shRB26s3FixedPoint = new TGeoPcon(0., 360., 8);
2125 z0 = 0.;
2126 shRB26s3FixedPoint->DefineSection(0, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
2127 z0 += kRB26s3FixedPointZ;
2128 shRB26s3FixedPoint->DefineSection(1, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
2129 shRB26s3FixedPoint->DefineSection(2, z0, kRB26s3FixedPointRi, kRB26s3FixedPointR);
2130 z0 += kRB26s3FixedPointD;
2131 shRB26s3FixedPoint->DefineSection(3, z0, kRB26s3FixedPointRi, kRB26s3FixedPointR);
2132 shRB26s3FixedPoint->DefineSection(4, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
2133 z0 += kRB26s3FixedPointDs;
2134 shRB26s3FixedPoint->DefineSection(5, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
2135 z0 += kRB26s3FixedPointDc;
2136 shRB26s3FixedPoint->DefineSection(6, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo2);
2137 z0 = kRB26s3FixedPointL;
2138 shRB26s3FixedPoint->DefineSection(7, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo2);
2139 TGeoVolume* voRB26s3FixedPoint = new TGeoVolume("RB26s3FixedPoint", shRB26s3FixedPoint, kMedSteelHC);
2140
2141 TGeoVolume* voRB26s3FixedPointM =
2142 new TGeoVolume("RB26s3FixedPointM", MakeMotherFromTemplate(shRB26s3FixedPoint), kMedVacHC);
2143 voRB26s3FixedPointM->AddNode(voRB26s3FixedPoint, 1, gGeoIdentity);
2144
2146 // Split Flange //
2147 // Drawing LHCVFX_0005 //
2149 const Float_t kRB26s3SFlangeL = 2.13; // Length of the flange
2150 const Float_t kRB26s3SFlangeD1 = 0.57; // Length of section 1
2151 const Float_t kRB26s3SFlangeD2 = 0.36; // Length of section 2
2152 const Float_t kRB26s3SFlangeD3 = 0.50 + 0.70; // Length of section 3
2153 const Float_t kRB26s3SFlangeRo = 17.15 / 2.; // Flange outer radius
2154 const Float_t kRB26s3SFlangeRi1 = 12.30 / 2.; // Flange inner radius section 1
2155 const Float_t kRB26s3SFlangeRi2 = 12.00 / 2.; // Flange inner radius section 2
2156 const Float_t kRB26s3SFlangeRi3 = 12.30 / 2.; // Flange inner radius section 3
2157 z0 = 0;
2158 TGeoPcon* shRB26s3SFlange = new TGeoPcon(0., 360., 6);
2159 z0 = 0.;
2160 shRB26s3SFlange->DefineSection(0, z0, kRB26s3SFlangeRi1, kRB26s3SFlangeRo);
2161 z0 += kRB26s3SFlangeD1;
2162 shRB26s3SFlange->DefineSection(1, z0, kRB26s3SFlangeRi1, kRB26s3SFlangeRo);
2163 shRB26s3SFlange->DefineSection(2, z0, kRB26s3SFlangeRi2, kRB26s3SFlangeRo);
2164 z0 += kRB26s3SFlangeD2;
2165 shRB26s3SFlange->DefineSection(3, z0, kRB26s3SFlangeRi2, kRB26s3SFlangeRo);
2166 shRB26s3SFlange->DefineSection(4, z0, kRB26s3SFlangeRi3, kRB26s3SFlangeRo);
2167 z0 += kRB26s3SFlangeD3;
2168 shRB26s3SFlange->DefineSection(5, z0, kRB26s3SFlangeRi3, kRB26s3SFlangeRo);
2169 TGeoVolume* voRB26s3SFlange = new TGeoVolume("RB26s3SFlange", shRB26s3SFlange, kMedSteelHC);
2170
2171 TGeoVolume* voRB26s3SFlangeM =
2172 new TGeoVolume("RB26s3SFlangeM", MakeMotherFromTemplate(shRB26s3SFlange, 0, 3), kMedVacHC);
2173 voRB26s3SFlangeM->AddNode(voRB26s3SFlange, 1, gGeoIdentity);
2174
2176 // RB26/3 Fixed Flange //
2177 // Drawing LHCVFX___0004 //
2179 const Float_t kRB26s3FFlangeL = 2.99; // Length of the flange
2180 const Float_t kRB26s3FFlangeD1 = 1.72; // Length of section 1
2181 const Float_t kRB26s3FFlangeD2 = 0.30; // Length of section 2
2182 const Float_t kRB26s3FFlangeD3 = 0.97; // Length of section 3
2183 const Float_t kRB26s3FFlangeRo = 36.20 / 2.; // Flange outer radius
2184 const Float_t kRB26s3FFlangeRi1 = 30.60 / 2.; // Flange inner radius section 1
2185 const Float_t kRB26s3FFlangeRi2 = 30.00 / 2.; // Flange inner radius section 2
2186 const Float_t kRB26s3FFlangeRi3 = 30.60 / 2.; // Flange inner radius section 3
2187 z0 = 0;
2188 TGeoPcon* shRB26s3FFlange = new TGeoPcon(0., 360., 6);
2189 z0 = 0.;
2190 shRB26s3FFlange->DefineSection(0, z0, kRB26s3FFlangeRi1, kRB26s3FFlangeRo);
2191 z0 += kRB26s3FFlangeD1;
2192 shRB26s3FFlange->DefineSection(1, z0, kRB26s3FFlangeRi1, kRB26s3FFlangeRo);
2193 shRB26s3FFlange->DefineSection(2, z0, kRB26s3FFlangeRi2, kRB26s3FFlangeRo);
2194 z0 += kRB26s3FFlangeD2;
2195 shRB26s3FFlange->DefineSection(3, z0, kRB26s3FFlangeRi2, kRB26s3FFlangeRo);
2196 shRB26s3FFlange->DefineSection(4, z0, kRB26s3FFlangeRi3, kRB26s3FFlangeRo);
2197 z0 += kRB26s3FFlangeD3;
2198 shRB26s3FFlange->DefineSection(5, z0, kRB26s3FFlangeRi3, kRB26s3FFlangeRo);
2199 TGeoVolume* voRB26s3FFlange = new TGeoVolume("RB26s3FFlange", shRB26s3FFlange, kMedSteelHC);
2200
2201 TGeoVolume* voRB26s3FFlangeM =
2202 new TGeoVolume("RB26s3FFlangeM", MakeMotherFromTemplate(shRB26s3FFlange, 2, 5), kMedVacHC);
2203 voRB26s3FFlangeM->AddNode(voRB26s3FFlange, 1, gGeoIdentity);
2204
2206 // RB26/3 Axial Compensator //
2207 // Drawing LHCVC2a_0065 //
2209 const Float_t kRB26s3CompL = 42.3; // Length of the compensator (0.3 cm added for welding)
2210 const Float_t kRB26s3BellowRo = 34.00 / 2.; // Bellow outer radius [Pos 1]
2211 const Float_t kRB26s3BellowRi = 30.10 / 2.; // Bellow inner radius [Pos 1]
2212 const Int_t kRB26s3NumberOfPlies = 13; // Number of plies [Pos 1]
2213 const Float_t kRB26s3BellowUndL = 17.70; // Length of undulated region [Pos 1]
2214 const Float_t kRB26s3PlieThickness = 0.06; // Plie thickness [Pos 1]
2215 const Float_t kRB26s3ConnectionPlieR = 0.21; // Connection plie radius [Pos 1]
2216 // Plie radius
2217 const Float_t kRB26s3PlieR = (kRB26s3BellowUndL - 4. * kRB26s3ConnectionPlieR + 2. * kRB26s3PlieThickness +
2218 (2. * kRB26s3NumberOfPlies - 2.) * kRB26s3PlieThickness) /
2219 (4. * kRB26s3NumberOfPlies - 2.);
2220
2221 //
2222 // The welding tubes have 3 sections with different radii and 2 transition regions.
2223 // Section 1: connection to the outside
2224 // Section 2: commection to the bellow
2225 // Section 3: between 1 and 2
2226 const Float_t kRB26s3CompTubeInnerR1 = 30.0 / 2.; // Outer Connection tubes inner radius [Pos 4 + 3]
2227 const Float_t kRB26s3CompTubeOuterR1 = 30.6 / 2.; // Outer Connection tubes outer radius [Pos 4 + 3]
2228 const Float_t kRB26s3CompTubeInnerR2 = 29.4 / 2.; // Connection tubes inner radius [Pos 4 + 3]
2229 const Float_t kRB26s3CompTubeOuterR2 = 30.0 / 2.; // Connection tubes outer radius [Pos 4 + 3]
2230 const Float_t kRB26s3CompTubeInnerR3 = 30.6 / 2.; // Connection tubes inner radius at bellow [Pos 4 + 3]
2231 const Float_t kRB26s3CompTubeOuterR3 = 32.2 / 2.; // Connection tubes outer radius at bellow [Pos 4 + 3]
2232
2233 const Float_t kRB26s3WeldingTubeLeftL1 = 2.0; // Left connection tube length [Pos 4]
2234 const Float_t kRB26s3WeldingTubeLeftL2 = 3.4; // Left connection tube length [Pos 4]
2235 const Float_t kRB26s3WeldingTubeLeftL = 7.0; // Left connection tube total length [Pos 4]
2236 const Float_t kRB26s3WeldingTubeRightL1 =
2237 2.3; // Right connection tube length [Pos 3] (0.3 cm added for welding)
2238 const Float_t kRB26s3WeldingTubeRightL2 = 13.4; // Right connection tube length [Pos 3]
2239
2240 const Float_t kRB26s3WeldingTubeT1 = 0.6; // Length of first r-transition [Pos 4 + 3]
2241 const Float_t kRB26s3WeldingTubeT2 = 1.0; // Length of 2nd r-transition [Pos 4 + 3]
2242
2243 const Float_t kRB26s3RingOuterR = 36.1 / 2.; // Ring inner radius [Pos 4]
2244 const Float_t kRB26s3RingL = 0.8 / 2.; // Ring half length [Pos 4]
2245 const Float_t kRB26s3RingZ = 3.7; // Ring z-position [Pos 4]
2246 const Float_t kRB26s3ProtOuterR = 36.2 / 2.; // Protection tube outer radius [Pos 2]
2247 const Float_t kRB26s3ProtL = 27.0 / 2.; // Protection tube half length [Pos 2]
2248 const Float_t kRB26s3ProtZ = 4.0; // Protection tube z-position [Pos 2]
2249
2250 // Mother volume
2251 //
2252 TGeoPcon* shRB26s3Compensator = new TGeoPcon(0., 360., 6);
2253 shRB26s3Compensator->DefineSection(0, 0.0, 0., kRB26s3CompTubeOuterR1);
2254 shRB26s3Compensator->DefineSection(1, kRB26s3RingZ, 0., kRB26s3CompTubeOuterR1);
2255 shRB26s3Compensator->DefineSection(2, kRB26s3RingZ, 0., kRB26s3ProtOuterR);
2256 shRB26s3Compensator->DefineSection(3, kRB26s3ProtZ + 2. * kRB26s3ProtL, 0., kRB26s3ProtOuterR);
2257 shRB26s3Compensator->DefineSection(4, kRB26s3ProtZ + 2. * kRB26s3ProtL, 0., kRB26s3CompTubeOuterR1);
2258 shRB26s3Compensator->DefineSection(5, kRB26s3CompL, 0., kRB26s3CompTubeOuterR1);
2259 TGeoVolume* voRB26s3Compensator = new TGeoVolume("RB26s3Compensator", shRB26s3Compensator, kMedVacHC);
2260
2261 //
2262 // [Pos 1] Bellow
2263 //
2264 //
2265
2266 //
2267 // Upper part of the undulation
2268 //
2269 TGeoTorus* shRB26s3PlieTorusU =
2270 new TGeoTorus(kRB26s3BellowRo - kRB26s3PlieR, kRB26s3PlieR - kRB26s3PlieThickness, kRB26s3PlieR);
2271 shRB26s3PlieTorusU->SetName("RB26s3TorusU");
2272 TGeoTube* shRB26s3PlieTubeU = new TGeoTube(kRB26s3BellowRo - kRB26s3PlieR, kRB26s3BellowRo, kRB26s3PlieR);
2273 shRB26s3PlieTubeU->SetName("RB26s3TubeU");
2274 TGeoCompositeShape* shRB26s3UpperPlie = new TGeoCompositeShape("RB26s3UpperPlie", "RB26s3TorusU*RB26s3TubeU");
2275
2276 TGeoVolume* voRB26s3WiggleU = new TGeoVolume("RB26s3UpperPlie", shRB26s3UpperPlie, kMedSteelHC);
2277 //
2278 // Lower part of the undulation
2279 TGeoTorus* shRB26s3PlieTorusL =
2280 new TGeoTorus(kRB26s3BellowRi + kRB26s3PlieR, kRB26s3PlieR - kRB26s3PlieThickness, kRB26s3PlieR);
2281 shRB26s3PlieTorusL->SetName("RB26s3TorusL");
2282 TGeoTube* shRB26s3PlieTubeL = new TGeoTube(kRB26s3BellowRi, kRB26s3BellowRi + kRB26s3PlieR, kRB26s3PlieR);
2283 shRB26s3PlieTubeL->SetName("RB26s3TubeL");
2284 TGeoCompositeShape* shRB26s3LowerPlie = new TGeoCompositeShape("RB26s3LowerPlie", "RB26s3TorusL*RB26s3TubeL");
2285
2286 TGeoVolume* voRB26s3WiggleL = new TGeoVolume("RB26s3LowerPlie", shRB26s3LowerPlie, kMedSteelHC);
2287
2288 //
2289 // Connection between upper and lower part of undulation
2290 TGeoVolume* voRB26s3WiggleC1 = new TGeoVolume(
2291 "RB26s3PlieConn1",
2292 new TGeoTube(kRB26s3BellowRi + kRB26s3PlieR, kRB26s3BellowRo - kRB26s3PlieR, kRB26s3PlieThickness / 2.), kMedSteelHC);
2293 //
2294 // One wiggle
2295 TGeoVolumeAssembly* voRB26s3Wiggle = new TGeoVolumeAssembly("RB26s3Wiggle");
2296 z0 = -kRB26s3PlieThickness / 2.;
2297 voRB26s3Wiggle->AddNode(voRB26s3WiggleC1, 1, new TGeoTranslation(0., 0., z0));
2298 z0 += kRB26s3PlieR - kRB26s3PlieThickness / 2.;
2299 voRB26s3Wiggle->AddNode(voRB26s3WiggleU, 1, new TGeoTranslation(0., 0., z0));
2300 z0 += kRB26s3PlieR - kRB26s3PlieThickness / 2.;
2301 voRB26s3Wiggle->AddNode(voRB26s3WiggleC1, 2, new TGeoTranslation(0., 0., z0));
2302 z0 += kRB26s3PlieR - kRB26s3PlieThickness;
2303 voRB26s3Wiggle->AddNode(voRB26s3WiggleL, 1, new TGeoTranslation(0., 0., z0));
2304 voRB26s3Wiggle->GetShape()->ComputeBBox(); // enforce recomputing of BBox
2305
2306 //
2307 // The bellow itself
2308 Float_t zBellowTot = kRB26s3NumberOfPlies * (static_cast<TGeoBBox*>(voRB26s3Wiggle->GetShape()))->GetDZ();
2309 TGeoVolume* voRB26s3Bellow =
2310 new TGeoVolume("RB26s3Bellow", new TGeoTube(kRB26s3BellowRi, kRB26s3BellowRo, zBellowTot), kMedVacHC);
2311
2312 // Positioning of the volumes.
2313 //
2314 // A thirteen-convolution bellow has fourteen inner roots, so one lower plie
2315 // leads the thirteen wiggles. The pitch is not 4*PlieR - 2*PlieThickness: a
2316 // torus-and-disc wiggle is longer than the convolution it stands for, and at
2317 // that pitch the stack does not fit the bellow. There is no room to grow it
2318 // either, since only 0.01 cm separates this bellow from the right welding
2319 // tube. The pitch is therefore the one that makes the fourteen roots span the
2320 // bellow exactly, which is 1.5 per cent shorter.
2321 const Float_t kRB26s3PliePitch =
2322 (2. * zBellowTot - 2. * kRB26s3PlieR) / kRB26s3NumberOfPlies;
2323 const Float_t kRB26s3RootToWiggle = 3. * kRB26s3PlieR - 5. * kRB26s3PlieThickness / 2.;
2324
2325 z0 = -zBellowTot + kRB26s3PlieR;
2326 voRB26s3Bellow->AddNode(voRB26s3WiggleL, 1, new TGeoTranslation(0., 0., z0));
2327 for (Int_t iw = 0; iw < kRB26s3NumberOfPlies; iw++) {
2328 Float_t zpos = z0 + (iw + 1) * kRB26s3PliePitch - kRB26s3RootToWiggle;
2329 voRB26s3Bellow->AddNode(voRB26s3Wiggle, iw + 1, new TGeoTranslation(0., 0., zpos));
2330 }
2331
2332 voRB26s3Compensator->AddNode(voRB26s3Bellow, 1,
2333 new TGeoTranslation(0., 0., kRB26s3WeldingTubeLeftL + zBellowTot));
2334
2335 //
2336 // [Pos 2] Outer Protecting Tube
2337 //
2338 TGeoTube* shRB26s3CompProtTube = new TGeoTube(kRB26s3RingOuterR, kRB26s3ProtOuterR, kRB26s3ProtL);
2339 TGeoVolume* voRB26s3CompProtTube = new TGeoVolume("RB26s3CompProtTube", shRB26s3CompProtTube, kMedSteelHC);
2340 voRB26s3Compensator->AddNode(voRB26s3CompProtTube, 1, new TGeoTranslation(0., 0., kRB26s3ProtZ + kRB26s3ProtL));
2341
2342 //
2343 // [Pos 3] Right Welding Tube
2344 //
2345 TGeoPcon* shRB26s3CompRightTube = new TGeoPcon(0., 360., 5);
2346 z0 = 0.;
2347 shRB26s3CompRightTube->DefineSection(0, z0, kRB26s3CompTubeInnerR3, kRB26s3CompTubeOuterR3);
2348 z0 += kRB26s3WeldingTubeT2;
2349 shRB26s3CompRightTube->DefineSection(1, z0, kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2350 z0 += kRB26s3WeldingTubeRightL2;
2351 shRB26s3CompRightTube->DefineSection(2, z0, kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2352 z0 += kRB26s3WeldingTubeT1;
2353 shRB26s3CompRightTube->DefineSection(3, z0, kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2354 z0 += kRB26s3WeldingTubeRightL1;
2355 shRB26s3CompRightTube->DefineSection(4, z0, kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2356
2357 TGeoVolume* voRB26s3CompRightTube = new TGeoVolume("RB26s3CompRightTube", shRB26s3CompRightTube, kMedSteelHC);
2358 voRB26s3Compensator->AddNode(voRB26s3CompRightTube, 1, new TGeoTranslation(0., 0., kRB26s3CompL - z0));
2359
2360 //
2361 // [Pos 4] Left Welding Tube
2362 //
2363 TGeoPcon* shRB26s3CompLeftTube = new TGeoPcon(0., 360., 5);
2364 z0 = 0.;
2365 shRB26s3CompLeftTube->DefineSection(0, z0, kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2366 z0 += kRB26s3WeldingTubeLeftL1;
2367 shRB26s3CompLeftTube->DefineSection(1, z0, kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2368 z0 += kRB26s3WeldingTubeT1;
2369 shRB26s3CompLeftTube->DefineSection(2, z0, kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2370 z0 += kRB26s3WeldingTubeLeftL2;
2371 shRB26s3CompLeftTube->DefineSection(3, z0, kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2372 z0 += kRB26s3WeldingTubeT2;
2373 shRB26s3CompLeftTube->DefineSection(4, z0, kRB26s3CompTubeInnerR3, kRB26s3CompTubeOuterR3);
2374
2375 TGeoVolume* voRB26s3CompLeftTube = new TGeoVolume("RB26s3CompLeftTube", shRB26s3CompLeftTube, kMedSteelHC);
2376 voRB26s3Compensator->AddNode(voRB26s3CompLeftTube, 1, gGeoIdentity);
2377 //
2378 // [Pos 5] Ring
2379 //
2380 TGeoTube* shRB26s3CompRing = new TGeoTube(kRB26s3CompTubeOuterR2, kRB26s3RingOuterR, kRB26s3RingL);
2381 TGeoVolume* voRB26s3CompRing = new TGeoVolume("RB26s3CompRing", shRB26s3CompRing, kMedSteelHC);
2382 voRB26s3Compensator->AddNode(voRB26s3CompRing, 1, new TGeoTranslation(0., 0., kRB26s3RingZ + kRB26s3RingL));
2383
2385 // //
2386 // RB26/4-5 //
2387 // Drawing LHCV2a_0012 [as installed] //
2389 // Pos1 Vacuum Tubes LHCVC2A__0014
2390 // Pos2 Compensator LHCVC2A__0066
2391 // Pos3 Fixed Point Section LHCVC2A__0016
2392 // Pos4 Split Flange LHCVFX___0005
2393 // Pos5 RotableFlange LHCVFX___0009
2395
2397 // RB26/4-5 Vacuum Tubes //
2398 // Drawing LHCVC2a_0014 //
2400 const Float_t kRB26s45TubeL = 593.12 + 0.3; // 0.3 cm added for welding
2401
2402 TGeoPcon* shRB26s45Tube = new TGeoPcon(0., 360., 11);
2403 // Section 1: straight section
2404 shRB26s45Tube->DefineSection(0, 0.00, 30.00 / 2., 30.60 / 2.);
2405 shRB26s45Tube->DefineSection(1, 1.20, 30.00 / 2., 30.60 / 2.);
2406 shRB26s45Tube->DefineSection(2, 1.20, 30.00 / 2., 30.80 / 2.);
2407 shRB26s45Tube->DefineSection(3, 25.10, 30.00 / 2., 30.80 / 2.);
2408 // Section 2: 0.932 deg opening cone
2409 shRB26s45Tube->DefineSection(4, 486.10, 45.00 / 2., 45.80 / 2.);
2410 // Section 3: straight section 4 mm
2411 shRB26s45Tube->DefineSection(5, 512.10, 45.00 / 2., 45.80 / 2.);
2412 // Section 4: straight section 3 mm
2413 shRB26s45Tube->DefineSection(6, 512.10, 45.00 / 2., 45.60 / 2.);
2414 shRB26s45Tube->DefineSection(7, 527.70, 45.00 / 2., 45.60 / 2.);
2415 // Section 4: closing cone
2416 shRB26s45Tube->DefineSection(8, 591.30, 10.00 / 2., 10.60 / 2.);
2417 shRB26s45Tube->DefineSection(9, 591.89, 10.00 / 2., 10.30 / 2.);
2418
2419 shRB26s45Tube->DefineSection(10, kRB26s45TubeL, 10.00 / 2., 10.30 / 2.);
2420 TGeoVolume* voRB26s45Tube = new TGeoVolume("RB26s45Tube", shRB26s45Tube, kMedSteelHC);
2421
2422 TGeoVolume* voRB26s45TubeM = new TGeoVolume("RB26s45TubeM", MakeMotherFromTemplate(shRB26s45Tube), kMedVacHC);
2423 voRB26s45TubeM->AddNode(voRB26s45Tube, 1, gGeoIdentity);
2424
2426 // RB26/5 Axial Compensator //
2427 // Drawing LHCVC2a_0066 //
2429 const Float_t kRB26s5CompL = 27.60; // Length of the compensator (0.30 cm added for welding)
2430 const Float_t kRB26s5BellowRo = 12.48 / 2.; // Bellow outer radius [Pos 1]
2431 const Float_t kRB26s5BellowRi = 10.32 / 2.; // Bellow inner radius [Pos 1]
2432 const Int_t kRB26s5NumberOfPlies = 15; // Number of plies [Pos 1]
2433 const Float_t kRB26s5BellowUndL = 10.50; // Length of undulated region [Pos 1]
2434 const Float_t kRB26s5PlieThickness = 0.025; // Plie thickness [Pos 1]
2435 const Float_t kRB26s5ConnectionPlieR = 0.21; // Connection plie radius [Pos 1]
2436 const Float_t kRB26s5ConnectionR = 11.2 / 2.; // Bellow connection radius [Pos 1]
2437 // Plie radius
2438 const Float_t kRB26s5PlieR = (kRB26s5BellowUndL - 4. * kRB26s5ConnectionPlieR + 2. * kRB26s5PlieThickness +
2439 (2. * kRB26s5NumberOfPlies - 2.) * kRB26s5PlieThickness) /
2440 (4. * kRB26s5NumberOfPlies - 2.);
2441 const Float_t kRB26s5CompTubeInnerR = 10.00 / 2.; // Connection tubes inner radius [Pos 2 + 3]
2442 const Float_t kRB26s5CompTubeOuterR = 10.30 / 2.; // Connection tubes outer radius [Pos 2 + 3]
2443 const Float_t kRB26s5WeldingTubeLeftL = 3.70 / 2.; // Left connection tube half length [Pos 2]
2444 const Float_t kRB26s5WeldingTubeRightL =
2445 13.40 / 2.; // Right connection tube half length [Pos 3] (0.3 cm added for welding)
2446 const Float_t kRB26s5RingInnerR = 11.2 / 2.; // Ring inner radius [Pos 4]
2447 const Float_t kRB26s5RingOuterR = 16.0 / 2.; // Ring inner radius [Pos 4]
2448 const Float_t kRB26s5RingL = 0.4 / 2.; // Ring half length [Pos 4]
2449 const Float_t kRB26s5RingZ = 14.97; // Ring z-position [Pos 4]
2450 const Float_t kRB26s5ProtOuterR = 16.2 / 2.; // Protection tube outer radius [Pos 5]
2451 const Float_t kRB26s5ProtL = 13.0 / 2.; // Protection tube half length [Pos 5]
2452 const Float_t kRB26s5ProtZ = 2.17; // Protection tube z-position [Pos 5]
2453 const Float_t kRB26s5DetailZR = 11.3 / 2.; // Detail Z max radius
2454
2455 // Mother volume
2456 //
2457 TGeoPcon* shRB26s5Compensator = new TGeoPcon(0., 360., 8);
2458 shRB26s5Compensator->DefineSection(0, 0.0, 0., kRB26s5CompTubeOuterR);
2459 shRB26s5Compensator->DefineSection(1, kRB26s5ProtZ, 0., kRB26s5CompTubeOuterR);
2460 shRB26s5Compensator->DefineSection(2, kRB26s5ProtZ, 0., kRB26s5ProtOuterR);
2461 shRB26s5Compensator->DefineSection(3, kRB26s5ProtZ + 2. * kRB26s5ProtL + 2. * kRB26s5RingL, 0., kRB26s5ProtOuterR);
2462 shRB26s5Compensator->DefineSection(4, kRB26s5ProtZ + 2. * kRB26s5ProtL + 2. * kRB26s5RingL, 0., kRB26s5DetailZR);
2463 shRB26s5Compensator->DefineSection(5, kRB26s5CompL - 8., 0., kRB26s5DetailZR);
2464 shRB26s5Compensator->DefineSection(6, kRB26s5CompL - 8., 0., kRB26s5CompTubeOuterR);
2465 shRB26s5Compensator->DefineSection(7, kRB26s5CompL, 0., kRB26s5CompTubeOuterR);
2466 TGeoVolume* voRB26s5Compensator = new TGeoVolume("RB26s5Compensator", shRB26s5Compensator, kMedVacHC);
2467
2468 //
2469 // [Pos 1] Bellow
2470 //
2471 //
2472 TGeoVolume* voRB26s5Bellow =
2473 new TGeoVolume("RB26s5Bellow", new TGeoTube(kRB26s5BellowRi, kRB26s5BellowRo, kRB26s5BellowUndL / 2.), kMedVacHC);
2474 //
2475 // Upper part of the undulation
2476 //
2477 TGeoTorus* shRB26s5PlieTorusU =
2478 new TGeoTorus(kRB26s5BellowRo - kRB26s5PlieR, kRB26s5PlieR - kRB26s5PlieThickness, kRB26s5PlieR);
2479 shRB26s5PlieTorusU->SetName("RB26s5TorusU");
2480 TGeoTube* shRB26s5PlieTubeU = new TGeoTube(kRB26s5BellowRo - kRB26s5PlieR, kRB26s5BellowRo, kRB26s5PlieR);
2481 shRB26s5PlieTubeU->SetName("RB26s5TubeU");
2482 TGeoCompositeShape* shRB26s5UpperPlie = new TGeoCompositeShape("RB26s5UpperPlie", "RB26s5TorusU*RB26s5TubeU");
2483
2484 TGeoVolume* voRB26s5WiggleU = new TGeoVolume("RB26s5UpperPlie", shRB26s5UpperPlie, kMedSteelHC);
2485 //
2486 // Lower part of the undulation
2487 TGeoTorus* shRB26s5PlieTorusL =
2488 new TGeoTorus(kRB26s5BellowRi + kRB26s5PlieR, kRB26s5PlieR - kRB26s5PlieThickness, kRB26s5PlieR);
2489 shRB26s5PlieTorusL->SetName("RB26s5TorusL");
2490 TGeoTube* shRB26s5PlieTubeL = new TGeoTube(kRB26s5BellowRi, kRB26s5BellowRi + kRB26s5PlieR, kRB26s5PlieR);
2491 shRB26s5PlieTubeL->SetName("RB26s5TubeL");
2492 TGeoCompositeShape* shRB26s5LowerPlie = new TGeoCompositeShape("RB26s5LowerPlie", "RB26s5TorusL*RB26s5TubeL");
2493
2494 TGeoVolume* voRB26s5WiggleL = new TGeoVolume("RB26s5LowerPlie", shRB26s5LowerPlie, kMedSteelHC);
2495
2496 //
2497 // Connection between upper and lower part of undulation
2498 TGeoVolume* voRB26s5WiggleC1 = new TGeoVolume(
2499 "RB26s5PlieConn1",
2500 new TGeoTube(kRB26s5BellowRi + kRB26s5PlieR, kRB26s5BellowRo - kRB26s5PlieR, kRB26s5PlieThickness / 2.), kMedSteelHC);
2501 //
2502 // One wiggle
2503 TGeoVolumeAssembly* voRB26s5Wiggle = new TGeoVolumeAssembly("RB26s5Wiggle");
2504 z0 = -kRB26s5PlieThickness / 2.;
2505 voRB26s5Wiggle->AddNode(voRB26s5WiggleC1, 1, new TGeoTranslation(0., 0., z0));
2506 z0 += kRB26s5PlieR - kRB26s5PlieThickness / 2.;
2507 voRB26s5Wiggle->AddNode(voRB26s5WiggleU, 1, new TGeoTranslation(0., 0., z0));
2508 z0 += kRB26s5PlieR - kRB26s5PlieThickness / 2.;
2509 voRB26s5Wiggle->AddNode(voRB26s5WiggleC1, 2, new TGeoTranslation(0., 0., z0));
2510 z0 += kRB26s5PlieR - kRB26s5PlieThickness;
2511 voRB26s5Wiggle->AddNode(voRB26s5WiggleL, 1, new TGeoTranslation(0., 0., z0));
2512 // Positioning of the volumes
2513 z0 = -kRB26s5BellowUndL / 2. + kRB26s5ConnectionPlieR;
2514 voRB26s5Bellow->AddNode(voRB26s5WiggleL, 1, new TGeoTranslation(0., 0., z0));
2515 z0 += kRB26s5ConnectionPlieR;
2516 zsh = 4. * kRB26s5PlieR - 2. * kRB26s5PlieThickness;
2517 for (Int_t iw = 0; iw < kRB26s5NumberOfPlies; iw++) {
2518 Float_t zpos = z0 + iw * zsh;
2519 voRB26s5Bellow->AddNode(voRB26s5Wiggle, iw + 1, new TGeoTranslation(0., 0., zpos - kRB26s5PlieThickness));
2520 }
2521
2522 voRB26s5Compensator->AddNode(voRB26s5Bellow, 1,
2523 new TGeoTranslation(0., 0., 2. * kRB26s5WeldingTubeLeftL + kRB26s5BellowUndL / 2.));
2524
2525 //
2526 // [Pos 2] Left Welding Tube
2527 //
2528 TGeoPcon* shRB26s5CompLeftTube = new TGeoPcon(0., 360., 3);
2529 z0 = 0;
2530 shRB26s5CompLeftTube->DefineSection(0, z0, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2531 z0 += 2 * kRB26s5WeldingTubeLeftL - (kRB26s5ConnectionR - kRB26s5CompTubeOuterR);
2532 shRB26s5CompLeftTube->DefineSection(1, z0, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2533 z0 += (kRB26s5ConnectionR - kRB26s5CompTubeOuterR);
2534 shRB26s5CompLeftTube->DefineSection(2, z0, kRB26s5ConnectionR - 0.15, kRB26s5ConnectionR);
2535 TGeoVolume* voRB26s5CompLeftTube = new TGeoVolume("RB26s5CompLeftTube", shRB26s5CompLeftTube, kMedSteelHC);
2536 voRB26s5Compensator->AddNode(voRB26s5CompLeftTube, 1, gGeoIdentity);
2537 //
2538 // [Pos 3] Right Welding Tube
2539 //
2540 TGeoPcon* shRB26s5CompRightTube = new TGeoPcon(0., 360., 11);
2541 // Detail Z
2542 shRB26s5CompRightTube->DefineSection(0, 0., kRB26s5CompTubeInnerR + 0.22, 11.2 / 2.);
2543 shRB26s5CompRightTube->DefineSection(1, 0.05, kRB26s5CompTubeInnerR + 0.18, 11.2 / 2.);
2544 shRB26s5CompRightTube->DefineSection(2, 0.22, kRB26s5CompTubeInnerR, 11.2 / 2. - 0.22);
2545 shRB26s5CompRightTube->DefineSection(3, 0.44, kRB26s5CompTubeInnerR, 11.2 / 2.);
2546 shRB26s5CompRightTube->DefineSection(4, 1.70, kRB26s5CompTubeInnerR, 11.2 / 2.);
2547 shRB26s5CompRightTube->DefineSection(5, 2.10, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2548 shRB26s5CompRightTube->DefineSection(6, 2.80, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2549 shRB26s5CompRightTube->DefineSection(7, 2.80, kRB26s5CompTubeInnerR, 11.3 / 2.);
2550 shRB26s5CompRightTube->DefineSection(8, 3.40, kRB26s5CompTubeInnerR, 11.3 / 2.);
2551 // Normal pipe
2552 shRB26s5CompRightTube->DefineSection(9, 3.50, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2553 shRB26s5CompRightTube->DefineSection(10, 2. * kRB26s5WeldingTubeRightL, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2554
2555 TGeoVolume* voRB26s5CompRightTube = new TGeoVolume("RB26s5CompRightTube", shRB26s5CompRightTube, kMedSteelHC);
2556 voRB26s5Compensator->AddNode(voRB26s5CompRightTube, 1,
2557 new TGeoTranslation(0., 0., kRB26s5CompL - 2. * kRB26s5WeldingTubeRightL));
2558 //
2559 // [Pos 4] Ring
2560 //
2561 TGeoTube* shRB26s5CompRing = new TGeoTube(kRB26s5RingInnerR, kRB26s5RingOuterR, kRB26s5RingL);
2562 TGeoVolume* voRB26s5CompRing = new TGeoVolume("RB26s5CompRing", shRB26s5CompRing, kMedSteelHC);
2563 voRB26s5Compensator->AddNode(voRB26s5CompRing, 1, new TGeoTranslation(0., 0., kRB26s5RingZ + kRB26s5RingL));
2564
2565 //
2566 // [Pos 5] Outer Protecting Tube
2567 //
2568 TGeoTube* shRB26s5CompProtTube = new TGeoTube(kRB26s5RingOuterR, kRB26s5ProtOuterR, kRB26s5ProtL);
2569 TGeoVolume* voRB26s5CompProtTube = new TGeoVolume("RB26s5CompProtTube", shRB26s5CompProtTube, kMedSteelHC);
2570 voRB26s5Compensator->AddNode(voRB26s5CompProtTube, 1, new TGeoTranslation(0., 0., kRB26s5ProtZ + kRB26s5ProtL));
2571
2573 // RB26/4 Fixed Point Section //
2574 // Drawing LHCVC2a_0016 //
2576 const Float_t kRB26s4TubeRi = 30.30 / 2.; // Tube inner radius (0.3 cm added for welding)
2577 const Float_t kRB26s4TubeRo = 30.60 / 2.; // Tube outer radius
2578 const Float_t kRB26s4FixedPointL = 12.63; // Length of the fixed point section
2579 const Float_t kRB26s4FixedPointZ = 10.53; // Position of the ring (0.15 added for welding)
2580 const Float_t kRB26s4FixedPointD = 0.595; // Width of the ring
2581 const Float_t kRB26s4FixedPointR = 31.60 / 2.; // Radius of the ring
2582
2583 TGeoPcon* shRB26s4FixedPoint = new TGeoPcon(0., 360., 6);
2584 z0 = 0.;
2585 shRB26s4FixedPoint->DefineSection(0, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2586 z0 += kRB26s4FixedPointZ;
2587 shRB26s4FixedPoint->DefineSection(1, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2588 shRB26s4FixedPoint->DefineSection(2, z0, kRB26s4TubeRi, kRB26s4FixedPointR);
2589 z0 += kRB26s4FixedPointD;
2590 shRB26s4FixedPoint->DefineSection(3, z0, kRB26s4TubeRi, kRB26s4FixedPointR);
2591 shRB26s4FixedPoint->DefineSection(4, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2592 z0 = kRB26s4FixedPointL;
2593 shRB26s4FixedPoint->DefineSection(5, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2594 TGeoVolume* voRB26s4FixedPoint = new TGeoVolume("RB26s4FixedPoint", shRB26s4FixedPoint, kMedSteelHC);
2595
2596 TGeoVolume* voRB26s4FixedPointM =
2597 new TGeoVolume("RB26s4FixedPointM", MakeMotherFromTemplate(shRB26s4FixedPoint), kMedVacHC);
2598 voRB26s4FixedPointM->AddNode(voRB26s4FixedPoint, 1, gGeoIdentity);
2599
2601 // RB26/4 Split Flange //
2602 // Drawing LHCVFX__0005 //
2604 const Float_t kRB26s4SFlangeL = 2.99; // Length of the flange
2605 const Float_t kRB26s4SFlangeD1 = 0.85; // Length of section 1
2606 const Float_t kRB26s4SFlangeD2 = 0.36; // Length of section 2
2607 const Float_t kRB26s4SFlangeD3 = 0.73 + 1.05; // Length of section 3
2608 const Float_t kRB26s4SFlangeRo = 36.20 / 2.; // Flange outer radius
2609 const Float_t kRB26s4SFlangeRi1 = 30.60 / 2.; // Flange inner radius section 1
2610 const Float_t kRB26s4SFlangeRi2 = 30.00 / 2.; // Flange inner radius section 2
2611 const Float_t kRB26s4SFlangeRi3 = 30.60 / 2.; // Flange inner radius section 3
2612 z0 = 0;
2613 TGeoPcon* shRB26s4SFlange = new TGeoPcon(0., 360., 6);
2614 z0 = 0.;
2615 shRB26s4SFlange->DefineSection(0, z0, kRB26s4SFlangeRi1, kRB26s4SFlangeRo);
2616 z0 += kRB26s4SFlangeD1;
2617 shRB26s4SFlange->DefineSection(1, z0, kRB26s4SFlangeRi1, kRB26s4SFlangeRo);
2618 shRB26s4SFlange->DefineSection(2, z0, kRB26s4SFlangeRi2, kRB26s4SFlangeRo);
2619 z0 += kRB26s4SFlangeD2;
2620 shRB26s4SFlange->DefineSection(3, z0, kRB26s4SFlangeRi2, kRB26s4SFlangeRo);
2621 shRB26s4SFlange->DefineSection(4, z0, kRB26s4SFlangeRi3, kRB26s4SFlangeRo);
2622 z0 += kRB26s4SFlangeD3;
2623 shRB26s4SFlange->DefineSection(5, z0, kRB26s4SFlangeRi3, kRB26s4SFlangeRo);
2624 TGeoVolume* voRB26s4SFlange = new TGeoVolume("RB26s4SFlange", shRB26s4SFlange, kMedSteelHC);
2625
2626 TGeoVolume* voRB26s4SFlangeM =
2627 new TGeoVolume("RB26s4SFlangeM", MakeMotherFromTemplate(shRB26s4SFlange, 0, 3), kMedVacHC);
2628 voRB26s4SFlangeM->AddNode(voRB26s4SFlange, 1, gGeoIdentity);
2629
2631 // RB26/5 Rotable Flange //
2632 // Drawing LHCVFX__0009 //
2634 const Float_t kRB26s5RFlangeL = 1.86; // Length of the flange
2635 const Float_t kRB26s5RFlangeD1 = 0.61; // Length of section 1
2636 const Float_t kRB26s5RFlangeD2 = 0.15; // Length of section 2
2637 const Float_t kRB26s5RFlangeD3 = 0.60; // Length of section 3
2638 const Float_t kRB26s5RFlangeD4 = 0.50; // Length of section 4
2639 const Float_t kRB26s5RFlangeRo = 15.20 / 2.; // Flange outer radius
2640 const Float_t kRB26s5RFlangeRi1 = 10.30 / 2.; // Flange inner radius section 1
2641 const Float_t kRB26s5RFlangeRi2 = 10.00 / 2.; // Flange inner radius section 2
2642 const Float_t kRB26s5RFlangeRi3 = 10.30 / 2.; // Flange inner radius section 3
2643 const Float_t kRB26s5RFlangeRi4 = 10.50 / 2.; // Flange inner radius section 4
2644
2645 z0 = 0;
2646 TGeoPcon* shRB26s5RFlange = new TGeoPcon(0., 360., 8);
2647 z0 = 0.;
2648 shRB26s5RFlange->DefineSection(0, z0, kRB26s5RFlangeRi4, kRB26s5RFlangeRo);
2649 z0 += kRB26s5RFlangeD4;
2650 shRB26s5RFlange->DefineSection(1, z0, kRB26s5RFlangeRi4, kRB26s5RFlangeRo);
2651 shRB26s5RFlange->DefineSection(2, z0, kRB26s5RFlangeRi3, kRB26s5RFlangeRo);
2652 z0 += kRB26s5RFlangeD3;
2653 shRB26s5RFlange->DefineSection(3, z0, kRB26s5RFlangeRi3, kRB26s5RFlangeRo);
2654 shRB26s5RFlange->DefineSection(4, z0, kRB26s5RFlangeRi2, kRB26s5RFlangeRo);
2655 z0 += kRB26s5RFlangeD2;
2656 shRB26s5RFlange->DefineSection(5, z0, kRB26s5RFlangeRi2, kRB26s5RFlangeRo);
2657 shRB26s5RFlange->DefineSection(6, z0, kRB26s5RFlangeRi1, kRB26s5RFlangeRo);
2658 z0 += kRB26s5RFlangeD1;
2659 shRB26s5RFlange->DefineSection(7, z0, kRB26s5RFlangeRi1, kRB26s5RFlangeRo);
2660 TGeoVolume* voRB26s5RFlange = new TGeoVolume("RB26s5RFlange", shRB26s5RFlange, kMedSteelHC);
2661
2662 TGeoVolume* voRB26s5RFlangeM =
2663 new TGeoVolume("RB26s5RFlangeM", MakeMotherFromTemplate(shRB26s5RFlange, 4, 7), kMedVacHC);
2664 voRB26s5RFlangeM->AddNode(voRB26s5RFlange, 1, gGeoIdentity);
2665
2666 //
2667 // Assemble RB26/1-2
2668 //
2669 TGeoVolumeAssembly* asRB26s12 = new TGeoVolumeAssembly("RB26s12");
2670 z0 = 0.;
2671 // asRB26s12->AddNode(voRB26s1RFlange, 1, gGeoIdentity);
2672 barrel->AddNode(voRB26s1RFlange, 1, new TGeoCombiTrans(0., 30., -82, rot180));
2673 z0 += kRB26s1RFlangeIsL + kRB26s1RFlangeFpL;
2674 barrel->AddNode(voRB26s12TubeM, 1, new TGeoCombiTrans(0., 30., -82. - z0, rot180));
2675 z0 += kRB26s12TubeL;
2676 asRB26s12->AddNode(voRB26s12msTubeM, 1, new TGeoTranslation(0., 0., z0));
2677 z0 += kRB26s12TubeL2;
2678 asRB26s12->AddNode(voRB26s2Compensator, 1, new TGeoTranslation(0., 0., z0));
2679 z0 += kRB26s2CompL;
2680 z0 -= kRB26s2FFlangeD1;
2681 asRB26s12->AddNode(voRB26s2FFlangeM, 1, new TGeoTranslation(0., 0., z0));
2682 z0 += kRB26s2FFlangeL;
2683 const Float_t kRB26s12L = z0;
2684
2685 //
2686 // Assemble RB26/3
2687 //
2688 TGeoVolumeAssembly* asRB26s3 = new TGeoVolumeAssembly("RB26s3");
2689 z0 = 0.;
2690 asRB26s3->AddNode(voRB26s3SFlangeM, 1, gGeoIdentity);
2691 z0 += kRB26s3SFlangeL;
2692 z0 -= kRB26s3SFlangeD3;
2693 asRB26s3->AddNode(voRB26s3FixedPointM, 1, new TGeoTranslation(0., 0., z0));
2694 z0 += kRB26s3FixedPointL;
2695 asRB26s3->AddNode(voRB26s3TubeM, 1, new TGeoTranslation(0., 0., z0));
2696 z0 += kRB26s3TubeL;
2697 asRB26s3->AddNode(voRB26s3Compensator, 1, new TGeoTranslation(0., 0., z0));
2698 z0 += kRB26s3CompL;
2699 z0 -= kRB26s3FFlangeD1;
2700 asRB26s3->AddNode(voRB26s3FFlangeM, 1, new TGeoTranslation(0., 0., z0));
2701 z0 += kRB26s3FFlangeL;
2702 const Float_t kRB26s3L = z0;
2703
2704 //
2705 // Assemble RB26/4-5
2706 //
2707 TGeoVolumeAssembly* asRB26s45 = new TGeoVolumeAssembly("RB26s45");
2708 z0 = 0.;
2709 asRB26s45->AddNode(voRB26s4SFlangeM, 1, gGeoIdentity);
2710 z0 += kRB26s4SFlangeL;
2711 z0 -= kRB26s4SFlangeD3;
2712 asRB26s45->AddNode(voRB26s4FixedPointM, 1, new TGeoTranslation(0., 0., z0));
2713 z0 += kRB26s4FixedPointL;
2714 asRB26s45->AddNode(voRB26s45TubeM, 1, new TGeoTranslation(0., 0., z0));
2715 z0 += kRB26s45TubeL;
2716 asRB26s45->AddNode(voRB26s5Compensator, 1, new TGeoTranslation(0., 0., z0));
2717 z0 += kRB26s5CompL;
2718 z0 -= kRB26s5RFlangeD3;
2719 z0 -= kRB26s5RFlangeD4;
2720 asRB26s45->AddNode(voRB26s5RFlangeM, 1, new TGeoTranslation(0., 0., z0));
2721 z0 += kRB26s5RFlangeL;
2722 const Float_t kRB26s45L = z0;
2723
2724 //
2725 // Assemble RB26
2726 //
2727 TGeoVolumeAssembly* asRB26Pipe = new TGeoVolumeAssembly("RB26Pipe");
2728 z0 = 0.;
2729 asRB26Pipe->AddNode(asRB26s12, 1, new TGeoTranslation(0., 0., z0));
2730 z0 += kRB26s12L;
2731 asRB26Pipe->AddNode(asRB26s3, 1, new TGeoTranslation(0., 0., z0));
2732 z0 += kRB26s3L;
2733 asRB26Pipe->AddNode(asRB26s45, 1, new TGeoTranslation(0., 0., z0));
2734 z0 += kRB26s45L;
2735 top->AddNode(asRB26Pipe, 1, new TGeoCombiTrans(0., 0., -82., rot180));
2736}
2737
2738void Pipe::createMaterials()
2739{
2740 //
2741 // Define materials for beam pipe
2742 //
2743 Int_t isxfld = 2.;
2744 Float_t sxmgmx = 10.;
2746
2747 // Steel (Inox)
2748 Float_t asteel[4] = {55.847, 51.9961, 58.6934, 28.0855};
2749 Float_t zsteel[4] = {26., 24., 28., 14.};
2750 Float_t wsteel[4] = {.715, .18, .1, .005};
2751 // AlBe - alloy
2752 Float_t aAlBe[2] = {26.98, 9.01}; // al=2.702 be=1.8477
2753 Float_t zAlBe[2] = {13.00, 4.00};
2754 Float_t wAlBe[2] = {0.4, 0.6};
2755 // Polyamid
2756 Float_t aPA[4] = {16., 14., 12., 1.};
2757 Float_t zPA[4] = {8., 7., 6., 1.};
2758 Float_t wPA[4] = {1., 1., 6., 11.};
2759 // Polyimide film
2760 Float_t aPI[4] = {16., 14., 12., 1.};
2761 Float_t zPI[4] = {8., 7., 6., 1.};
2762 Float_t wPI[4] = {5., 2., 22., 10.};
2763 // Rohacell
2764 Float_t aRohacell[4] = {16., 14., 12., 1.};
2765 Float_t zRohacell[4] = {8., 7., 6., 1.};
2766 Float_t wRohacell[4] = {2., 1., 9., 13.};
2767 // Air
2768 Float_t aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
2769 Float_t zAir[4] = {6., 7., 8., 18.};
2770 Float_t wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
2771 Float_t dAir = 1.20479E-3;
2772 Float_t dAir1 = 1.20479E-11;
2773 // Insulation powder
2774 // Si O Ti Al
2775 Float_t ains[4] = {28.0855, 15.9994, 47.867, 26.982};
2776 Float_t zins[4] = {14., 8., 22., 13.};
2777 Float_t wins[4] = {0.3019, 0.4887, 0.1914, 0.018};
2778 //
2779 //
2780 // Anticorodal
2781 //
2782 // Al Si7 Mg 0.6
2783 //
2784 Float_t aaco[3] = {26.982, 28.0855, 24.035};
2785 Float_t zaco[3] = {13., 14., 12.};
2786 Float_t waco[3] = {0.924, 0.07, 0.006};
2787 // Kapton
2788 //
2789 Float_t aKapton[4] = {1.00794, 12.0107, 14.010, 15.9994};
2790 Float_t zKapton[4] = {1., 6., 7., 8.};
2791 Float_t wKapton[4] = {0.026362, 0.69113, 0.07327, 0.209235};
2792 Float_t dKapton = 1.42;
2793 // NEG coating
2794 // Ti V Zr
2795 Float_t aNEG[4] = {47.87, 50.94, 91.24};
2796 Float_t zNEG[4] = {22.00, 23.00, 40.00};
2797 Float_t wNEG[4] = {1. / 3., 1. / 3., 1. / 3.};
2798 Float_t dNEG = 5.6; // ?
2799
2800 //---------------------------------
2801 // Aluminium AA 5083 for MFT: Al Manganese(Mn) Magnesium(Mg) Chrome(Cr)
2802 Float_t aALU5083[4] = {26.982, 54.938, 24.305, 51.996}; // Mg pas meme a que la ligne Anticorodal!
2803 Float_t zALU5083[4] = {13., 25., 12., 24.};
2804 Float_t wALU5083[4] = {0.947, 0.007, 0.044, 0.0015};
2805 // Aluminium AA 2219 for MFT: Al Cu Mn Ti V Zr
2806 Float_t aALU2219[6] = {26.982, 63.546, 54.938, 47.867, 50.941, 91.224};
2807 Float_t zALU2219[6] = {13., 29., 25., 22., 23., 40.};
2808 Float_t wALU2219[6] = {0.93, 0.063, 0.003, 0.0006, 0.001, 0.0018};
2809 // Aluminium AA 7075 for beam pipe support (wings): Al Zn Mg Cu
2810 Float_t aALU7075[4] = {26.982, 65.38, 24.305, 63.546};
2811 Float_t zALU7075[4] = {13., 30., 12., 29.};
2812 Float_t wALU7075[4] = {0.902, 0.06, 0.024, 0.014};
2813 //---------------------------------
2814
2815 // ****************
2816 // Defines tracking media parameters.
2817 //
2818 Float_t epsil = .1; // Tracking precision,
2819 Float_t stemax = -0.01; // Maximum displacement for multiple scat
2820 Float_t tmaxfd = -20.; // Maximum angle due to field deflection
2821 Float_t deemax = -.3; // Maximum fractional energy loss, DLS
2822 Float_t stmin = -.8;
2823 // ***************
2824 //
2825
2826 auto& matmgr = o2::base::MaterialManager::Instance();
2827
2828 // Beryllium
2829 matmgr.Material("PIPE", 5, "BERILLIUM$", 9.01, 4., 1.848, 35.3, 36.7);
2830 matmgr.Medium("PIPE", 5, "BE", 5, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2831
2832 // Copper
2833 matmgr.Material("PIPE", 10, "COPPER", 63.55, 29, 8.96, 1.43, 85.6 / 8.96);
2834 matmgr.Material("PIPE", 30, "COPPER_NF", 63.55, 29, 8.96, 1.43, 85.6 / 8.96);
2835 matmgr.Material("PIPE", 50, "COPPER_HC", 63.55, 29, 8.96, 1.43, 85.6 / 8.96);
2836 matmgr.Material("PIPE", 70, "COPPER_NFHC", 63.55, 29, 8.96, 1.43, 85.6 / 8.96);
2837
2838 matmgr.Medium("PIPE", 10, "CU", 10, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2839 matmgr.Medium("PIPE", 30, "CU_NF", 30, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2840 matmgr.Medium("PIPE", 50, "CU_HC", 50, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2841 matmgr.Medium("PIPE", 70, "CU_NFHC", 70, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2842
2843 // Air
2844 matmgr.Mixture("PIPE", 15, "AIR$ ", aAir, zAir, dAir, 4, wAir);
2845 matmgr.Mixture("PIPE", 35, "AIR_HIGH$ ", aAir, zAir, dAir, 4, wAir);
2846 matmgr.Mixture("PIPE", 55, "AIR_NF ", aAir, zAir, dAir, 4, wAir);
2847 matmgr.Medium("PIPE", 15, "AIR", 15, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2848 matmgr.Medium("PIPE", 35, "AIR_HIGH", 35, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2849 matmgr.Medium("PIPE", 55, "AIR_NF", 55, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2850
2851 // Insulation
2852 matmgr.Mixture("PIPE", 14, "INSULATION0$", ains, zins, 0.41, 4, wins);
2853 matmgr.Medium("PIPE", 14, "INS_C0", 14, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2854
2855 //
2856 // Vacuum
2857 matmgr.Mixture("PIPE", 16, "VACUUM$ ", aAir, zAir, dAir1, 4, wAir);
2858 matmgr.Mixture("PIPE", 36, "VACUUM$_NF", aAir, zAir, dAir1, 4, wAir);
2859 matmgr.Mixture("PIPE", 56, "VACUUM$_HC ", aAir, zAir, dAir1, 4, wAir);
2860 matmgr.Mixture("PIPE", 76, "VACUUM$_NFHC", aAir, zAir, dAir1, 4, wAir);
2861
2862 matmgr.Medium("PIPE", 16, "VACUUM", 16, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2863 matmgr.Medium("PIPE", 36, "VACUUM_NF", 36, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2864 matmgr.Medium("PIPE", 56, "VACUUM_HC", 56, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2865 matmgr.Medium("PIPE", 76, "VACUUM_NFHC", 76, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2866
2867 //
2868 // Steel
2869 matmgr.Mixture("PIPE", 19, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
2870 matmgr.Mixture("PIPE", 39, "STAINLESS STEEL$_NF", asteel, zsteel, 7.88, 4, wsteel);
2871 matmgr.Mixture("PIPE", 59, "STAINLESS STEEL$_HC", asteel, zsteel, 7.88, 4, wsteel);
2872 matmgr.Mixture("PIPE", 79, "STAINLESS STEEL$_NFHC", asteel, zsteel, 7.88, 4, wsteel);
2873
2874 matmgr.Medium("PIPE", 19, "INOX", 19, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2875 matmgr.Medium("PIPE", 39, "INOX_NF", 39, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2876 matmgr.Medium("PIPE", 59, "INOX_HC", 59, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2877 matmgr.Medium("PIPE", 79, "INOX_NFHC", 79, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2878
2879 //----------------- for the MFT ----------------------
2880 matmgr.Mixture("PIPE", 63, "ALUMINIUM5083$", aALU5083, zALU5083, 2.66, 4, wALU5083); // from aubertduval.fr
2881 matmgr.Mixture("PIPE", 64, "ALUMINIUM2219$", aALU2219, zALU2219, 2.84, 6, wALU2219); // from aubertduval.fr
2882 matmgr.Medium("PIPE", 63, "AA5083", 63, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2883 matmgr.Medium("PIPE", 64, "AA2219", 64, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2884
2885 //----------------------------------------------------
2886 matmgr.Mixture("PIPE", 65, "PI$", aPI, zPI, 1.42, -4, wPI);
2887 matmgr.Medium("PIPE", 65, "POLYIMIDE", 65, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2888
2889 //---------------------------------
2890 // Carbon Fiber M55J
2891 matmgr.Material("PIPE", 66, "M55J6K$", 12.0107, 6, 1.92, 999, 999);
2892 matmgr.Medium("PIPE", 66, "M55J6K", 66, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2893
2894 // Rohacell
2895 matmgr.Mixture("PIPE", 67, "Rohacell$", aRohacell, zRohacell, 0.03, -4, wRohacell);
2896 matmgr.Medium("PIPE", 67, "ROHACELL", 67, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2897
2898 // Titanium
2899 matmgr.Material("PIPE", 22, "Titanium$", 47.867, 22, 4.54, 3.560, 27.80);
2900 matmgr.Medium("PIPE", 22, "TITANIUM", 22, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2901
2902 // Alu 7075 (ZICRAL)
2903 matmgr.Mixture("PIPE", 68, "ALUMINIUM7075$", aALU7075, zALU7075, 2.810, -4, wALU7075);
2904 matmgr.Medium("PIPE", 68, "AA7075", 68, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2905}
2906
2907TGeoPcon* Pipe::MakeMotherFromTemplate(const TGeoPcon* shape, Int_t imin, Int_t imax, Float_t r0, Int_t nz)
2908{
2909 //
2910 // Create a mother shape from a template setting some min radii to 0
2911 //
2912 Int_t nz0 = shape->GetNz();
2913 // if nz > -1 the number of planes is given by nz
2914 if (nz != -1) {
2915 nz0 = nz;
2916 }
2917 TGeoPcon* mother = new TGeoPcon(0., 360., nz0);
2918
2919 if (imin == -1 || imax == -1) {
2920 imin = 0;
2921 imax = shape->GetNz();
2922 } else if (imax >= nz0) {
2923 imax = nz0 - 1;
2924 printf("Warning: imax reset to nz-1 %5d %5d %5d %5d\n", imin, imax, nz, nz0);
2925 }
2926
2927 // construct the sections dynamically since duplications have to be avoided
2928 std::vector<double> pconparams;
2929 pconparams.reserve(nz0);
2930 pconparams.push_back(0.);
2931 pconparams.push_back(360);
2932 pconparams.push_back(nz0);
2933 int zplanecounter = 0;
2934
2935 auto addSection = [&pconparams, &zplanecounter](double z, double rmin, double rmax) {
2936 pconparams.push_back(z);
2937 pconparams.push_back(rmin);
2938 pconparams.push_back(rmax);
2939 zplanecounter++;
2940 };
2941
2942 double zlast, rminlast, rmaxlast;
2943 for (Int_t i = 0; i < shape->GetNz(); i++) {
2944 Double_t rmin = shape->GetRmin(i);
2945 if ((i >= imin) && (i <= imax)) {
2946 rmin = r0;
2947 }
2948 Double_t rmax = shape->GetRmax(i);
2949 Double_t z = shape->GetZ(i);
2950 if (i == 0 || (z != zlast || rmin != rminlast || rmax != rmaxlast)) {
2951 addSection(z, rmin, rmax);
2952 }
2953 zlast = z;
2954 rminlast = rmin;
2955 rmaxlast = rmax;
2956 }
2957 // correct dimension (unless the user chose the number of sections)
2958 if (nz == -1) {
2959 pconparams[2] = zplanecounter;
2960 // reinit polycon from parameters
2961 mother->SetDimensions(pconparams.data());
2962 } else {
2963 for (Int_t i = 0; i < zplanecounter; i++) {
2964 mother->DefineSection(i, pconparams[3 + 3 * i], pconparams[4 + 3 * i], pconparams[5 + 3 * i]);
2965 }
2966 }
2967
2968 return mother;
2969}
2970
2971TGeoPcon* Pipe::MakeInsulationFromTemplate(TGeoPcon* shape)
2972{
2973 //
2974 // Create an beam pipe insulation layer shape from a template
2975 //
2976 Int_t nz = shape->GetNz();
2977 TGeoPcon* insu = new TGeoPcon(0., 360., nz);
2978
2979 for (Int_t i = 0; i < nz; i++) {
2980 Double_t z = shape->GetZ(i);
2981 Double_t rmin = shape->GetRmin(i);
2982 Double_t rmax = shape->GetRmax(i);
2983 rmax += 0.5;
2984 shape->DefineSection(i, z, rmin, rmax);
2985 rmin = rmax - 0.5;
2986 insu->DefineSection(i, z, rmin, rmax);
2987 }
2988 return insu;
2989}
2990
2991TGeoVolume* Pipe::MakeBellow(const char* ext, Int_t nc, Float_t rMin, Float_t rMax, Float_t dU, Float_t rPlie,
2992 Float_t dPlie)
2993{
2994 // nc Number of convolution
2995 // rMin Inner radius of the bellow
2996 // rMax Outer radius of the bellow
2997 // dU Undulation length
2998 // rPlie Plie radius
2999 // dPlie Plie thickness
3000 auto& matmgr = o2::base::MaterialManager::Instance();
3001 const TGeoMedium* kMedVac = matmgr.getTGeoMedium("PIPE_VACUUM");
3002 const TGeoMedium* kMedSteel = matmgr.getTGeoMedium("PIPE_INOX");
3003 //
3004 // Upper part of the undulation
3005 //
3006 std::string name, nameA, nameB;
3007 TGeoTorus* shPlieTorusU = new TGeoTorus(rMax - rPlie, rPlie - dPlie, rPlie);
3008 nameA = fmt::format("{:s}TorusU", ext);
3009 shPlieTorusU->SetName(nameA.c_str());
3010 TGeoTube* shPlieTubeU = new TGeoTube(rMax - rPlie, rMax, rPlie);
3011 nameB = fmt::format("{:s}TubeU", ext);
3012 shPlieTubeU->SetName(nameB.c_str());
3013 name = fmt::format("{:s}UpperPlie", ext);
3014 TGeoCompositeShape* shUpperPlie = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}", nameA, nameB).c_str());
3015
3016 TGeoVolume* voWiggleU = new TGeoVolume(name.c_str(), shUpperPlie, kMedSteel);
3017 //
3018 // Lower part of the undulation
3019 TGeoTorus* shPlieTorusL = new TGeoTorus(rMin + rPlie, rPlie - dPlie, rPlie);
3020 nameA = fmt::format("{:s}TorusL", ext);
3021 shPlieTorusL->SetName(nameA.c_str());
3022 TGeoTube* shPlieTubeL = new TGeoTube(rMin, rMin + rPlie, rPlie);
3023 nameB = fmt::format("{:s}TubeL", ext);
3024 shPlieTubeL->SetName(nameB.c_str());
3025 name = fmt::format("{:s}LowerPlie", ext);
3026 TGeoCompositeShape* shLowerPlie = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}", nameA, nameB).c_str());
3027
3028 TGeoVolume* voWiggleL = new TGeoVolume(name.c_str(), shLowerPlie, kMedSteel);
3029
3030 //
3031 // Connection between upper and lower part of undulation
3032 TGeoVolume* voWiggleC1 = new TGeoVolume(fmt::format("{:s}PlieConn1", ext).c_str(), new TGeoTube(rMin + rPlie, rMax - rPlie, dPlie / 2.), kMedSteel);
3033 //
3034 // One wiggle
3035 Float_t dz = rPlie - dPlie / 2.;
3036 Float_t z0 = -dPlie / 2.;
3037 TGeoVolumeAssembly* asWiggle = new TGeoVolumeAssembly(fmt::format("{:s}Wiggle", ext).c_str());
3038 asWiggle->AddNode(voWiggleC1, 1, new TGeoTranslation(0., 0., z0));
3039 z0 += dz;
3040 asWiggle->AddNode(voWiggleU, 1, new TGeoTranslation(0., 0., z0));
3041 z0 += dz;
3042 asWiggle->AddNode(voWiggleC1, 2, new TGeoTranslation(0., 0., z0));
3043 z0 += dz;
3044 asWiggle->AddNode(voWiggleL, 1, new TGeoTranslation(0., 0., z0));
3045 asWiggle->GetShape()->ComputeBBox(); // enforce recomputing of BBox
3046 //
3047 Float_t zBellowTot = nc * (static_cast<TGeoBBox*>(asWiggle->GetShape()))->GetDZ();
3048 TGeoVolume* voBellow = new TGeoVolume(fmt::format("{:s}BellowUS", ext).c_str(), new TGeoTube(rMin, rMax, zBellowTot), kMedVac);
3049 // Positioning of the volumes
3050 z0 = -dU / 2. + rPlie;
3051 voBellow->AddNode(voWiggleL, 2, new TGeoTranslation(0., 0., z0));
3052 z0 += rPlie;
3053 Float_t zsh = 4. * rPlie - 2. * dPlie;
3054 for (Int_t iw = 0; iw < nc; iw++) {
3055 Float_t zpos = z0 + iw * zsh;
3056 voBellow->AddNode(asWiggle, iw + 1, new TGeoTranslation(0., 0., zpos - dPlie));
3057 }
3058 return voBellow;
3059}
3060
3061TGeoVolume* Pipe::MakeBellowCside(const char* ext, Int_t nc, Float_t rMin, Float_t rMax, Float_t rPlie, Float_t dPlie)
3062{
3063 // nc Number of convolution
3064 // rMin Inner radius of the bellow
3065 // rMax Outer radius of the bellow
3066 // dU Undulation length
3067 // rPlie Plie radius
3068 // dPlie Plie thickness
3069 auto& matmgr = o2::base::MaterialManager::Instance();
3070 const TGeoMedium* kMedVac = matmgr.getTGeoMedium("PIPE_VACUUM");
3071 const TGeoMedium* kMedAlu5083 = matmgr.getTGeoMedium("PIPE_AA5083"); // fm
3072
3073 Float_t dU = nc * (4. * rPlie - 2. * dPlie);
3074
3075 std::string name, nameA, nameB;
3076 name = fmt::format("{:s}BellowUS", ext);
3077 // TGeoVolume* voBellow = new TGeoVolume(name, new TGeoTube(rMin, rMax, dU/2.), kMedVac);
3078 TGeoVolumeAssembly* voBellow = new TGeoVolumeAssembly(name.c_str());
3079 //
3080 // Upper part of the undulation
3081 //
3082
3083 TGeoTorus* shPlieTorusU = new TGeoTorus(rMax - rPlie, rPlie - dPlie, rPlie);
3084 nameA = fmt::format("{:s}TorusU", ext);
3085 shPlieTorusU->SetName(nameA.c_str());
3086 TGeoTube* shPlieTubeU = new TGeoTube(rMax - rPlie, rMax, rPlie);
3087 nameB = fmt::format("{:s}TubeU", ext);
3088 shPlieTubeU->SetName(nameB.c_str());
3089 name = fmt::format("{:s}UpperPlie", ext);
3090 TGeoCompositeShape* shUpperPlie = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}", nameA, nameB).c_str());
3091
3092 TGeoVolume* voWiggleU = new TGeoVolume(name.c_str(), shUpperPlie, kMedAlu5083);
3093 voWiggleU->SetLineColor(kOrange); // fm
3094
3095 // First Lower part of the ondulation
3096 TGeoTorus* shPlieTorusL = new TGeoTorus(rMin + rPlie, rPlie - dPlie, rPlie);
3097 nameA = fmt::format("{:s}TorusL", ext);
3098 shPlieTorusL->SetName(nameA.c_str());
3099 TGeoTranslation* t1 = new TGeoTranslation("t1", 0, 0, -rPlie / 2.);
3100 t1->RegisterYourself();
3101
3102 TGeoTube* shPlieTubeL = new TGeoTube(rMin, rMin + rPlie, rPlie / 2.);
3103 nameB = fmt::format("{:s}TubeL", ext);
3104 shPlieTubeL->SetName(nameB.c_str());
3105 name = fmt::format("{:s}LowerPlie", ext);
3106 TGeoCompositeShape* shLowerPlie1 = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}:t1", nameA, nameB).c_str());
3107
3108 TGeoVolume* voWiggleL1 = new TGeoVolume(name.c_str(), shLowerPlie1, kMedAlu5083);
3109 voWiggleL1->SetLineColor(kOrange); // fm
3110
3111 // Second Lower part of the undulation
3112 TGeoTranslation* t2 = new TGeoTranslation("t2", 0, 0, rPlie / 2.);
3113 t2->RegisterYourself();
3114
3115 TGeoCompositeShape* shLowerPlie2 = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}:t2", nameA, nameB).c_str());
3116
3117 TGeoVolume* voWiggleL2 = new TGeoVolume(name.c_str(), shLowerPlie2, kMedAlu5083);
3118 voWiggleL2->SetLineColor(kOrange); // fm
3119
3120 // Connection between upper and lower part of undulation
3121 name = fmt::format("{:s}PlieConn1", ext);
3122 TGeoVolume* voWiggleC1 = new TGeoVolume(name.c_str(), new TGeoTube(rMin + rPlie, rMax - rPlie, dPlie / 2.), kMedAlu5083);
3123 voWiggleC1->SetLineColor(kOrange); // fm
3124
3125 //
3126 // Vacuum Part
3127 //
3128
3129 //--Upper part of the ondulation
3130
3131 TGeoTorus* vacPlieTorusU = new TGeoTorus(rMax - rPlie, 0., rPlie - dPlie);
3132 nameA = fmt::format("{:s}vacTorusU", ext);
3133 vacPlieTorusU->SetName(nameA.c_str());
3134 TGeoTube* vacPlieTubeU = new TGeoTube(0., rMax - rPlie, rPlie - dPlie);
3135 nameB = fmt::format("{:s}vacTubeU", ext);
3136 vacPlieTubeU->SetName(nameB.c_str());
3137 name = fmt::format("{:s}vacUpperPlie", ext);
3138 TGeoCompositeShape* vacUpperPlie = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}+{:s}", nameA, nameB).c_str());
3139
3140 TGeoVolume* voVacWiggleU = new TGeoVolume(name.c_str(), vacUpperPlie, kMedVac);
3141 voVacWiggleU->SetVisibility(0);
3142
3143 // First Lower part of the undulation
3144 TGeoTorus* vacPlieTorusL = new TGeoTorus(rMin + rPlie, 0., rPlie);
3145 nameA = fmt::format("{:s}vacTorusL", ext);
3146 vacPlieTorusL->SetName(nameA.c_str());
3147
3148 TGeoTube* vacPlieTubeL = new TGeoTube(0., rMin + rPlie, rPlie / 2.);
3149 nameB = fmt::format("{:s}vacTubeL", ext);
3150 vacPlieTubeL->SetName(nameB.c_str());
3151 name = fmt::format("{:s}vacLowerPlie", ext);
3152 TGeoCompositeShape* vacLowerPlie1 = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}:t1-{:s}", nameB, nameA).c_str());
3153
3154 TGeoVolume* voVacWiggleL1 = new TGeoVolume(name.c_str(), vacLowerPlie1, kMedVac);
3155 voVacWiggleL1->SetVisibility(0);
3156
3157 // Second Lower part of the undulation
3158 TGeoCompositeShape* vacLowerPlie2 = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}:t2-{:s}", nameB, nameA).c_str());
3159
3160 TGeoVolume* voVacWiggleL2 = new TGeoVolume(name.c_str(), vacLowerPlie2, kMedVac);
3161 voVacWiggleL2->SetVisibility(0);
3162
3163 // One wiggle
3164 Float_t dz = rPlie - dPlie / 2.;
3165 Float_t z0 = 2. * rPlie;
3166 name = fmt::format("{:s}Wiggle", ext);
3167 TGeoVolumeAssembly* asWiggle = new TGeoVolumeAssembly(name.c_str());
3168
3169 asWiggle->AddNode(voWiggleL1, 1, new TGeoTranslation(0., 0., z0));
3170 asWiggle->AddNode(voVacWiggleL1, 1, new TGeoTranslation(0., 0., z0));
3171 z0 -= dz;
3172 asWiggle->AddNode(voWiggleC1, 1, new TGeoTranslation(0., 0., z0));
3173 z0 -= dz;
3174 asWiggle->AddNode(voWiggleU, 1, new TGeoTranslation(0., 0., z0));
3175 asWiggle->AddNode(voVacWiggleU, 1, new TGeoTranslation(0., 0., z0));
3176 z0 -= dz;
3177 asWiggle->AddNode(voWiggleC1, 2, new TGeoTranslation(0., 0., z0));
3178 z0 -= dz;
3179 asWiggle->AddNode(voWiggleL2, 1, new TGeoTranslation(0., 0., z0));
3180 asWiggle->AddNode(voVacWiggleL2, 1, new TGeoTranslation(0., 0., z0));
3181
3182 // Positioning of the volumes
3183 z0 = +dU / 2.;
3184 Float_t zsh = 4. * dz;
3185 // for (Int_t iw = 0; iw < 1; iw++) {
3186 for (Int_t iw = 0; iw < nc; iw++) {
3187 Float_t zpos = z0 - iw * zsh;
3188 voBellow->AddNode(asWiggle, iw + 1, new TGeoTranslation(0., 0., zpos));
3189 }
3190 return voBellow;
3191}
3192
3193// ----------------------------------------------------------------------------
3194FairModule* Pipe::CloneModule() const { return new Pipe(*this); }
Definition of the Detector class.
int32_t i
ClassImp(IdPath)
static void initFieldTrackingParams(int &mode, float &maxfield)
Definition Detector.cxx:143
static MaterialManager & Instance()
a common base class for passive modules - implementing generic functions
Definition PassiveBase.h:24
void ConstructGeometry() override
Definition Pipe.cxx:67
~Pipe() override
FairModule * CloneModule() const override
Clone this object (used in MT mode only)
Definition Pipe.cxx:3194
GLint GLenum GLint x
Definition glcorearb.h:403
GLdouble GLdouble GLdouble GLdouble top
Definition glcorearb.h:4077
GLuint const GLchar * name
Definition glcorearb.h:781
GLuint GLfloat GLfloat y0
Definition glcorearb.h:5034
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
Definition glcorearb.h:5034