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(voRB24ValveFlI, 1, new TGeoTranslation(0., 0., -7.5 / 2. + kRB24ValveFlD / 2.));
1281 voRB24ValveMo->AddNode(voRB24ValveFlI, 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 // Vacuum in the bore, from the transition tube to the end of the RF contact, at the inner radius
1595 // of both. Placed beside the copies in caveRB24 only: in the barrel the aluSideA pipe runs through it.
1596 const double kRB24VMABCVacZ0 = -kRB24VMABCRBT1L / 2. - 1.;
1597 const double kRB24VMABCVacZ1 = z + kRB24VMABCCTL;
1598 const double kRB24VMABCVacZc = (kRB24VMABCVacZ0 + kRB24VMABCVacZ1) / 2.;
1599 TGeoVolume* voRB24VMABCVac = new TGeoVolume(
1600 "RB24VMABCVac", new TGeoTube(0., 6.3 / 2., (kRB24VMABCVacZ1 - kRB24VMABCVacZ0) / 2.), kMedVacNF);
1601 voRB24VMABCVac->SetVisibility(0);
1602
1603 //
1604 // Assembling RB24/1
1605 //
1606 // part places in the barrel
1607 TGeoVolumeAssembly* voRB24 = new TGeoVolumeAssembly("RB24");
1608 // Cu Tube with two simplified flanges in central barrel
1609 voRB24->AddNode(voRB24CuTubeM, 1, gGeoIdentity);
1610 voRB24->AddNode(voRB24CuTubeA, 1, gGeoIdentity);
1611
1612 // part which is placed in the cave
1613 // ->
1614 TGeoVolumeAssembly* voRB24C = new TGeoVolumeAssembly("RB24C");
1615 voRB24C->AddNode(voRB24cCuTubeM, 1, gGeoIdentity);
1616 // voRB24C->AddNode(voRB24cCuTubeA, 1, new TGeoTranslation(0., 0., -(900.-kRB24cCuTubeL)/2.));
1617 z = -kRB24cCuTubeL / 2 + kRB24CuTubeFL / 2.;
1618 voRB24C->AddNode(voRB24CuTubeF, 1, new TGeoTranslation(0., 0., z));
1619 // z = +kRB24cCuTubeL / 2 - kRB24CuTubeFL / 2.;
1620 // voRB24C->AddNode(voRB24CuTubeF, 2, new TGeoTranslation(0., 0., z));
1621 // VMABC close to compensator magnet
1622 z = -kRB24cCuTubeL / 2. - (kRB24VMABCL - kRB24VMABCRBT1L / 2) + 1.;
1623 voRB24C->AddNode(voRB24VMABCRB, 2, new TGeoTranslation(0., 0., z));
1624 voRB24C->AddNode(voRB24VMABCVac, 2, new TGeoTranslation(0., 0., z + kRB24VMABCVacZc));
1625 // <-
1626
1627 // Bellow
1628 z = kRB24bCuTubeL / 2;
1629 voRB24->AddNode(voRB24B1BellowM, 1, new TGeoTranslation(0., 0., z));
1630 z += (kRB24B1L + kRB24AIpML / 2.);
1631 // Annular ion pump
1632 voRB24->AddNode(voRB24AIpM, 1, new TGeoTranslation(0., 0., z));
1633 z += (kRB24AIpML / 2. + kRB24ValveWz / 2.);
1634 // Valve
1635 voRB24->AddNode(voRB24ValveMo, 1, new TGeoTranslation(0., 0., z));
1636 z += (kRB24ValveWz / 2. + kRB24VMABCRBT1L / 2. + 1.);
1637 // VMABC close to forward detectors
1638 voRB24->AddNode(voRB24VMABCRB, 3, new TGeoTranslation(0., 0., z));
1639 //
1640 // RB24/2
1641 //
1642 // Copper Tube RB24/2
1643 // mainly inside the compensator magnet
1644 const Float_t kRB242CuTubeL = 350.0;
1645 // 20 cm straight - 20 cm transition to final oval - 270 oval - 20 cm transition to final oval - 20 cm straight
1646 //
1647 // mother volume for transition region
1648 TGeoVolume* voRB242CuOvTransMo = new TGeoVolume("voRB24CuOvTransMo", new TGeoTube(0., 4.75, 10.), kMedAir);
1649 const Int_t nTrans = 10;
1650 TGeoVolume* voRB242CuOvTransV[nTrans];
1651 TGeoVolume* voRB242CuOvTransI[nTrans];
1652 Float_t dovX = 4.;
1653 Float_t dovY = 4.;
1654 Float_t dovZ = -9.0;
1655 for (Int_t i = 0; i < nTrans; i++) {
1656 dovX -= 0.0625;
1657 dovY += 0.075;
1658 char vname[20];
1659 snprintf(vname, 20, "voRB242CuOvTransV%d", i);
1660 voRB242CuOvTransV[i] = new TGeoVolume(vname, new TGeoEltu(dovX, dovY, 1.0), kMedCuHC);
1661 snprintf(vname, 20, "voRB242CuOvTransI%d", i);
1662 voRB242CuOvTransI[i] = new TGeoVolume(vname, new TGeoEltu(dovX - 0.2, dovY - 0.2, 1.0), kMedVacHC);
1663 voRB242CuOvTransV[i]->AddNode(voRB242CuOvTransI[i], 1, gGeoIdentity);
1664 voRB242CuOvTransMo->AddNode(voRB242CuOvTransV[i], 1, new TGeoTranslation(0., 0., dovZ));
1665 dovZ += 2.;
1666 }
1667 //
1668 TGeoVolume* voRB242CuTubeM =
1669 new TGeoVolume("voRB242CuTubeM", new TGeoTube(0., kRB24CuTubeRo, 10.), kMedVacHC);
1670 TGeoVolume* voRB242CuTube =
1671 new TGeoVolume("voRB242CuTube", new TGeoTube(kRB24CuTubeRi, kRB24CuTubeRo, 10.), kMedCuHC);
1672 voRB242CuTubeM->AddNode(voRB242CuTube, 1, gGeoIdentity);
1673 TGeoVolume* voRB242CuOvalM =
1674 new TGeoVolume("voRB242CuOvalM", new TGeoEltu(3.375, 4.75, 135.), kMedCuHC);
1675 TGeoVolume* voRB242CuOval =
1676 new TGeoVolume("voRB242CuOval", new TGeoEltu(3.175, 4.55, 135.), kMedVacHC);
1677 voRB242CuOvalM->AddNode(voRB242CuOval, 1, gGeoIdentity);
1678 //
1679 TGeoVolumeAssembly* voRB242 = new TGeoVolumeAssembly("RB242");
1680 voRB242->AddNode(voRB242CuOvalM, 1, gGeoIdentity);
1681 z = -kRB242CuTubeL / 2 + kRB24CuTubeFL / 2.;
1682 voRB242->AddNode(voRB24CuTubeF, 3, new TGeoTranslation(0., 0., z));
1683 z = +kRB242CuTubeL / 2 - kRB24CuTubeFL / 2.;
1684 voRB242->AddNode(voRB24CuTubeF, 4, new TGeoTranslation(0., 0., z));
1685 z = 135. + 10.;
1686 voRB242->AddNode(voRB242CuOvTransMo, 1, new TGeoCombiTrans(0., 0., z, rot180));
1687 z = -135. - 10.;
1688 voRB242->AddNode(voRB242CuOvTransMo, 2, new TGeoTranslation(0., 0., z));
1689 z = -135. - 30.;
1690 voRB242->AddNode(voRB242CuTubeM, 1, new TGeoTranslation(0., 0., z));
1691 z = 135. + 30.;
1692 voRB242->AddNode(voRB242CuTubeM, 2, new TGeoTranslation(0., 0., z));
1693 z = -kRB24cCuTubeL / 2 - kRB24VMABCL - kRB242CuTubeL / 2. - 1.2;
1694 voRB24C->AddNode(voRB242, 1, new TGeoTranslation(0., 0., z));
1695 //
1696 // RB24/3
1697 //
1698 // Copper Tube RB24/3
1699 // the lenth of the tube is 296.85 on the drawing but this is inconsistent with the total length tube + bellow
1700 const Float_t kRB243CuTubeL = 297.85;
1701
1702 TGeoVolume* voRB243CuTubeM =
1703 new TGeoVolume("voRB243CuTubeM", new TGeoTube(0., kRB24CuTubeRo, kRB243CuTubeL / 2.), kMedVacNF);
1704 voRB243CuTubeM->SetVisibility(0);
1705 TGeoVolume* voRB243CuTube =
1706 new TGeoVolume("voRB243CuTube", new TGeoTube(kRB24CuTubeRi, kRB24CuTubeRo, kRB243CuTubeL / 2.), kMedCuNF);
1707 voRB243CuTubeM->AddNode(voRB243CuTube, 1, gGeoIdentity);
1708
1709 TGeoVolumeAssembly* voRB243 = new TGeoVolumeAssembly("RB243");
1710 TGeoVolumeAssembly* voRB243A = new TGeoVolumeAssembly("RB243A");
1711
1712 voRB243A->AddNode(voRB243CuTubeM, 1, gGeoIdentity);
1713 z = -kRB243CuTubeL / 2 + kRB24CuTubeFL / 2.;
1714 voRB243A->AddNode(voRB24CuTubeF, 5, new TGeoTranslation(0., 0., z));
1715 z = +kRB243CuTubeL / 2 - kRB24CuTubeFL / 2.;
1716 voRB243A->AddNode(voRB24CuTubeF, 6, new TGeoTranslation(0., 0., z));
1717 z = +kRB243CuTubeL / 2;
1718 voRB243A->AddNode(voRB24B1BellowM, 2, new TGeoTranslation(0., 0., z));
1719
1720 z = -kRB243CuTubeL / 2. - kRB24B1L;
1721 voRB243->AddNode(voRB243A, 1, new TGeoTranslation(0., 0., z));
1722 z = -(1.5 * kRB243CuTubeL + 2. * kRB24B1L);
1723 voRB243->AddNode(voRB243A, 2, new TGeoTranslation(0., 0., z));
1724
1725 z = -2. * (kRB243CuTubeL + kRB24B1L) - (kRB24VMABCL - kRB24VMABCRBT1L / 2) + 1.;
1726 voRB243->AddNode(voRB24VMABCRB, 3, new TGeoTranslation(0., 0., z));
1727 voRB243->AddNode(voRB24VMABCVac, 3, new TGeoTranslation(0., 0., z + kRB24VMABCVacZc));
1728
1729 z = -kRB24cCuTubeL / 2 - kRB24VMABCL - kRB242CuTubeL - 1.2;
1730 voRB24C->AddNode(voRB243, 1, new TGeoTranslation(0., 0., z));
1731
1732 //
1733 //
1734 caveRB24->AddNode(voRB24C, 1, new TGeoCombiTrans(0., 0., -kRB24CL / 2 + kRB24cCuTubeL / 2, rot180));
1735 barrel->AddNode(voRB24, 1, new TGeoCombiTrans(0., 30., kRB24bCuTubeL / 2 + 88.5 + 400. + 0.375, rot180));
1736 //
1738 // //
1739 // The Absorber Vacuum system //
1740 // //
1742 //
1743 // Rotable Flange starts at: 82.00 cm from IP
1744 // Length of rotable flange section: 10.68 cm
1745 // Weld 0.08 cm
1746 // Length of straight section 207.21 cm
1747 // =======================================================================
1748 // 299.97 cm [0.03 cm missing ?]
1749 // Length of opening cone 252.09 cm
1750 // Weld 0.15 cm
1751 // Length of compensator 30.54 cm
1752 // Weld 0.15 cm
1753 // Length of fixed flange 2.13 - 0.97 1.16 cm
1754 // =======================================================================
1755 // 584.06 cm [584.80 installed] [0.74 cm missing]
1756 // RB26/3
1757 // Length of split flange 2.13 - 1.2 0.93 cm
1758 // Weld 0.15 cm
1759 // Length of fixed point section 16.07 cm
1760 // Weld 0.15 cm
1761 // Length of opening cone 629.20 cm
1762 // Weld 0.30 cm
1763 // Kength of the compensator 41.70 cm
1764 // Weld 0.30 cm
1765 // Length of fixed flange 2.99 - 1.72 1.27 cm
1766 // =================================================
1767 // Length of RB26/3 690.07 cm [689.20 installed] [0.87 cm too much]
1768 //
1769 // RB26/4-5
1770 // Length of split flange 2.13 - 1.2 0.93 cm
1771 // Weld 0.15 cm
1772 // Length of fixed point section 16.07 cm
1773 // Weld 0.15 cm
1774 // Length of opening cone 629.20 cm
1775 // Weld 0.30 cm
1776 // Length of closing cone
1777 // Weld
1778 // Lenth of straight section
1779 // Kength of the compensator 41.70 cm
1780 // Weld 0.30 cm
1781 // Length of fixed flange 2.99 - 1.72 1.27 cm
1782 // =================================================
1783 // Length of RB26/3 690.07 cm [689.20 installed] [0.87 cm too much]
1784
1786 // //
1787 // RB26/1-2 //
1788 // Drawing LHCV2a_0050 [as installed] //
1789 // Drawing LHCV2a_0008 //
1790 // Drawing LHCV2a_0001 //
1792 // Pos1 Vacuum Tubes LHCVC2A__0010
1793 // Pos2 Compensator LHCVC2A__0064
1794 // Pos3 Rotable Flange LHCVFX___0016
1795 // Pos4 Fixed Flange LHCVFX___0006
1796 // Pos5 Bellow Tooling LHCVFX___0003
1797 //
1798 //
1799 //
1801 // RB26/1-2 Vacuum Tubes //
1802 // Drawing LHCVC2a_0010 //
1804 const Float_t kRB26s12TubeL0 = 459.45; // 0.15 cm added for welding
1805 const Float_t kRB26s12TubeL2 = 47.21; // part of this tube outside barrel region
1806 const Float_t kRB26s12TubeL = kRB26s12TubeL0 - kRB26s12TubeL2; // 392.115
1807 //
1808 // 184.905
1809 // 0.877
1810 // Add 1 cm on outer diameter for insulation
1811 //
1812 //
1813 // the section which is placed into the central barrel (ending at z = -505)
1814 TGeoPcon* shRB26s12Tube = new TGeoPcon(0., 360., 4);
1815 // Section 1: straight section
1816 shRB26s12Tube->DefineSection(0, 0.00, 5.84 / 2., 6.00 / 2.);
1817 shRB26s12Tube->DefineSection(1, 207.21, 5.84 / 2., 6.00 / 2.);
1818 // Section 2: 0.72 deg opening cone
1819 shRB26s12Tube->DefineSection(2, 207.21, 5.84 / 2., 6.14 / 2.);
1820 shRB26s12Tube->DefineSection(3, kRB26s12TubeL, 5.84 / 2 + 2.576, 6.14 / 2. + 2.576);
1821
1822 // the section which is placed into the muon spectrometer (starting at z = -505)
1823 TGeoPcon* shRB26s12msTube = new TGeoPcon(0., 360., 3);
1824 // conical part
1825 shRB26s12msTube->DefineSection(0, 0.00, shRB26s12Tube->GetRmin(3), shRB26s12Tube->GetRmax(3));
1826 shRB26s12msTube->DefineSection(1, 452.30 - kRB26s12TubeL, 12.0 / 2., 12.3 / 2.);
1827 // straight part until compensator
1828 shRB26s12msTube->DefineSection(2, kRB26s12TubeL2, 12.0 / 2., 12.3 / 2.);
1829
1830 TGeoVolume* voRB26s12Tube = new TGeoVolume("RB26s12Tube", shRB26s12Tube, kMedSteelHC);
1831 TGeoVolume* voRB26s12msTube = new TGeoVolume("RB26s12msTube", shRB26s12msTube, kMedSteelHC);
1832 // Add the insulation layer
1833 TGeoVolume* voRB26s12TubeIns = new TGeoVolume("RB26s12TubeIns", MakeInsulationFromTemplate(shRB26s12Tube), kMedInsu);
1834 TGeoVolume* voRB26s12msTubeIns = new TGeoVolume("RB26s12msTubeIns", MakeInsulationFromTemplate(shRB26s12msTube), kMedInsu);
1835 voRB26s12Tube->AddNode(voRB26s12TubeIns, 1, gGeoIdentity);
1836 voRB26s12msTube->AddNode(voRB26s12msTubeIns, 1, gGeoIdentity);
1837
1838 TGeoVolume* voRB26s12TubeM = new TGeoVolume("RB26s12TubeM", MakeMotherFromTemplate(shRB26s12Tube), kMedVacHC);
1839 voRB26s12TubeM->AddNode(voRB26s12Tube, 1, gGeoIdentity);
1840 TGeoVolume* voRB26s12msTubeM = new TGeoVolume("RB26s12msTubeM", MakeMotherFromTemplate(shRB26s12msTube), kMedVacHC);
1841 voRB26s12msTubeM->AddNode(voRB26s12msTube, 1, gGeoIdentity);
1842
1844 // RB26/2 Axial Compensator //
1845 // Drawing LHCVC2a_0064 //
1847 const Float_t kRB26s2CompL = 30.65; // Length of the compensator
1848 const Float_t kRB26s2BellowRo = 14.38 / 2.; // Bellow outer radius [Pos 1]
1849 const Float_t kRB26s2BellowRi = 12.12 / 2.; // Bellow inner radius [Pos 1]
1850 const Int_t kRB26s2NumberOfPlies = 14; // Number of plies [Pos 1]
1851 const Float_t kRB26s2BellowUndL =
1852 10.00; // Length of undulated region [Pos 1] [+10 mm installed including pretension ?]
1853 const Float_t kRB26s2PlieThickness = 0.025; // Plie thickness [Pos 1]
1854 const Float_t kRB26s2ConnectionPlieR = 0.21; // Connection plie radius [Pos 1]
1855 // Plie radius
1856 const Float_t kRB26s2PlieR = (kRB26s2BellowUndL - 4. * kRB26s2ConnectionPlieR + 2. * kRB26s2PlieThickness +
1857 (2. * kRB26s2NumberOfPlies - 2.) * kRB26s2PlieThickness) /
1858 (4. * kRB26s2NumberOfPlies - 2.);
1859 const Float_t kRB26s2CompTubeInnerR = 12.00 / 2.; // Connection tubes inner radius [Pos 2 + 3]
1860 const Float_t kRB26s2CompTubeOuterR = 12.30 / 2.; // Connection tubes outer radius [Pos 2 + 3]
1861 const Float_t kRB26s2WeldingTubeLeftL = 9.00 / 2.; // Left connection tube half length [Pos 2]
1862 const Float_t kRB26s2WeldingTubeRightL =
1863 11.65 / 2.; // Right connection tube half length [Pos 3] [+ 0.15 cm for welding]
1864 const Float_t kRB26s2RingOuterR = 18.10 / 2.; // Ring inner radius [Pos 4]
1865 const Float_t kRB26s2RingL = 0.40 / 2.; // Ring half length [Pos 4]
1866 const Float_t kRB26s2RingZ = 6.50; // Ring z-position [Pos 4]
1867 const Float_t kRB26s2ProtOuterR = 18.20 / 2.; // Protection tube outer radius [Pos 5]
1868 const Float_t kRB26s2ProtL = 15.00 / 2.; // Protection tube half length [Pos 5]
1869 const Float_t kRB26s2ProtZ = 6.70; // Protection tube z-position [Pos 5]
1870
1871 // Mother volume
1872 //
1873 TGeoPcon* shRB26s2Compensator = new TGeoPcon(0., 360., 6);
1874 shRB26s2Compensator->DefineSection(0, 0.0, 0., kRB26s2CompTubeOuterR);
1875 shRB26s2Compensator->DefineSection(1, kRB26s2RingZ, 0., kRB26s2CompTubeOuterR);
1876 shRB26s2Compensator->DefineSection(2, kRB26s2RingZ, 0., kRB26s2ProtOuterR);
1877 shRB26s2Compensator->DefineSection(3, kRB26s2ProtZ + 2. * kRB26s2ProtL, 0., kRB26s2ProtOuterR);
1878 shRB26s2Compensator->DefineSection(4, kRB26s2ProtZ + 2. * kRB26s2ProtL, 0., kRB26s2CompTubeOuterR);
1879 shRB26s2Compensator->DefineSection(5, kRB26s2CompL, 0., kRB26s2CompTubeOuterR);
1880 TGeoVolume* voRB26s2Compensator = new TGeoVolume("RB26s2Compensator", shRB26s2Compensator, kMedVacHC);
1881
1882 //
1883 // [Pos 1] Bellow
1884 //
1885 //
1886 TGeoVolume* voRB26s2Bellow =
1887 new TGeoVolume("RB26s2Bellow", new TGeoTube(kRB26s2BellowRi, kRB26s2BellowRo, kRB26s2BellowUndL / 2.), kMedVacHC);
1888 //
1889 // Upper part of the undulation
1890 //
1891 TGeoTorus* shRB26s2PlieTorusU =
1892 new TGeoTorus(kRB26s2BellowRo - kRB26s2PlieR, kRB26s2PlieR - kRB26s2PlieThickness, kRB26s2PlieR);
1893 shRB26s2PlieTorusU->SetName("RB26s2TorusU");
1894 TGeoTube* shRB26s2PlieTubeU = new TGeoTube(kRB26s2BellowRo - kRB26s2PlieR, kRB26s2BellowRo, kRB26s2PlieR);
1895 shRB26s2PlieTubeU->SetName("RB26s2TubeU");
1896 TGeoCompositeShape* shRB26s2UpperPlie = new TGeoCompositeShape("RB26s2UpperPlie", "RB26s2TorusU*RB26s2TubeU");
1897
1898 TGeoVolume* voRB26s2WiggleU = new TGeoVolume("RB26s2UpperPlie", shRB26s2UpperPlie, kMedSteelHC);
1899 //
1900 // Lower part of the undulation
1901 TGeoTorus* shRB26s2PlieTorusL =
1902 new TGeoTorus(kRB26s2BellowRi + kRB26s2PlieR, kRB26s2PlieR - kRB26s2PlieThickness, kRB26s2PlieR);
1903 shRB26s2PlieTorusL->SetName("RB26s2TorusL");
1904 TGeoTube* shRB26s2PlieTubeL = new TGeoTube(kRB26s2BellowRi, kRB26s2BellowRi + kRB26s2PlieR, kRB26s2PlieR);
1905 shRB26s2PlieTubeL->SetName("RB26s2TubeL");
1906 TGeoCompositeShape* shRB26s2LowerPlie = new TGeoCompositeShape("RB26s2LowerPlie", "RB26s2TorusL*RB26s2TubeL");
1907
1908 TGeoVolume* voRB26s2WiggleL = new TGeoVolume("RB26s2LowerPlie", shRB26s2LowerPlie, kMedSteelHC);
1909
1910 //
1911 // Connection between upper and lower part of undulation
1912 TGeoVolume* voRB26s2WiggleC1 = new TGeoVolume(
1913 "RB26s2PlieConn1",
1914 new TGeoTube(kRB26s2BellowRi + kRB26s2PlieR, kRB26s2BellowRo - kRB26s2PlieR, kRB26s2PlieThickness / 2.), kMedSteelHC);
1915 //
1916 // One wiggle
1917 TGeoVolumeAssembly* voRB26s2Wiggle = new TGeoVolumeAssembly("RB26s2Wiggle");
1918 z0 = -kRB26s2PlieThickness / 2.;
1919 voRB26s2Wiggle->AddNode(voRB26s2WiggleC1, 1, new TGeoTranslation(0., 0., z0));
1920 z0 += kRB26s2PlieR - kRB26s2PlieThickness / 2.;
1921 voRB26s2Wiggle->AddNode(voRB26s2WiggleU, 1, new TGeoTranslation(0., 0., z0));
1922 z0 += kRB26s2PlieR - kRB26s2PlieThickness / 2.;
1923 voRB26s2Wiggle->AddNode(voRB26s2WiggleC1, 2, new TGeoTranslation(0., 0., z0));
1924 z0 += kRB26s2PlieR - kRB26s2PlieThickness;
1925 voRB26s2Wiggle->AddNode(voRB26s2WiggleL, 1, new TGeoTranslation(0., 0., z0));
1926 // Positioning of the volumes
1927 z0 = -kRB26s2BellowUndL / 2. + kRB26s2ConnectionPlieR;
1928 voRB26s2Bellow->AddNode(voRB26s2WiggleL, 1, new TGeoTranslation(0., 0., z0));
1929 z0 += kRB26s2ConnectionPlieR;
1930 zsh = 4. * kRB26s2PlieR - 2. * kRB26s2PlieThickness;
1931 for (Int_t iw = 0; iw < kRB26s2NumberOfPlies; iw++) {
1932 Float_t zpos = z0 + iw * zsh;
1933 voRB26s2Bellow->AddNode(voRB26s2Wiggle, iw + 1, new TGeoTranslation(0., 0., zpos - kRB26s2PlieThickness));
1934 }
1935
1936 voRB26s2Compensator->AddNode(voRB26s2Bellow, 1,
1937 new TGeoTranslation(0., 0., 2. * kRB26s2WeldingTubeLeftL + kRB26s2BellowUndL / 2.));
1938
1939 //
1940 // [Pos 2] Left Welding Tube
1941 //
1942 TGeoTube* shRB26s2CompLeftTube = new TGeoTube(kRB26s2CompTubeInnerR, kRB26s2CompTubeOuterR, kRB26s2WeldingTubeLeftL);
1943 TGeoVolume* voRB26s2CompLeftTube = new TGeoVolume("RB26s2CompLeftTube", shRB26s2CompLeftTube, kMedSteelHC);
1944 voRB26s2Compensator->AddNode(voRB26s2CompLeftTube, 1, new TGeoTranslation(0., 0., kRB26s2WeldingTubeLeftL));
1945 //
1946 // [Pos 3] Right Welding Tube
1947 //
1948 TGeoTube* shRB26s2CompRightTube =
1949 new TGeoTube(kRB26s2CompTubeInnerR, kRB26s2CompTubeOuterR, kRB26s2WeldingTubeRightL);
1950 TGeoVolume* voRB26s2CompRightTube = new TGeoVolume("RB26s2CompRightTube", shRB26s2CompRightTube, kMedSteelHC);
1951 voRB26s2Compensator->AddNode(voRB26s2CompRightTube, 1,
1952 new TGeoTranslation(0., 0., kRB26s2CompL - kRB26s2WeldingTubeRightL));
1953 //
1954 // [Pos 4] Ring
1955 //
1956 TGeoTube* shRB26s2CompRing = new TGeoTube(kRB26s2CompTubeOuterR, kRB26s2RingOuterR, kRB26s2RingL);
1957 TGeoVolume* voRB26s2CompRing = new TGeoVolume("RB26s2CompRing", shRB26s2CompRing, kMedSteelHC);
1958 voRB26s2Compensator->AddNode(voRB26s2CompRing, 1, new TGeoTranslation(0., 0., kRB26s2RingZ + kRB26s2RingL));
1959
1960 //
1961 // [Pos 5] Outer Protecting Tube
1962 //
1963 TGeoTube* shRB26s2CompProtTube = new TGeoTube(kRB26s2RingOuterR, kRB26s2ProtOuterR, kRB26s2ProtL);
1964 TGeoVolume* voRB26s2CompProtTube = new TGeoVolume("RB26s2CompProtTube", shRB26s2CompProtTube, kMedSteelHC);
1965 voRB26s2Compensator->AddNode(voRB26s2CompProtTube, 1, new TGeoTranslation(0., 0., kRB26s2ProtZ + kRB26s2ProtL));
1966
1968 // Rotable Flange //
1969 // Drawing LHCVFX_0016 //
1971 const Float_t kRB26s1RFlangeTubeRi = 5.84 / 2.; // Tube inner radius
1972 const Float_t kRB26s1RFlangeTubeRo = 6.00 / 2.; // Tube outer radius
1973
1974 // Pos 1 Clamp Ring LHCVFX__0015
1975 const Float_t kRB26s1RFlangeCrL = 1.40; // Lenth of the clamp ring
1976 const Float_t kRB26s1RFlangeCrRi1 = 6.72 / 2.; // Ring inner radius section 1
1977 const Float_t kRB26s1RFlangeCrRi2 = 6.06 / 2.; // Ring inner radius section 2
1978 const Float_t kRB26s1RFlangeCrRo = 8.60 / 2.; // Ring outer radius
1979 const Float_t kRB26s1RFlangeCrD = 0.800; // Width section 1
1980
1981 TGeoPcon* shRB26s1RFlangeCr = new TGeoPcon(0., 360., 4);
1982 z0 = 0.;
1983 shRB26s1RFlangeCr->DefineSection(0, z0, kRB26s1RFlangeCrRi1, kRB26s1RFlangeCrRo);
1984 z0 += kRB26s1RFlangeCrD;
1985 shRB26s1RFlangeCr->DefineSection(1, z0, kRB26s1RFlangeCrRi1, kRB26s1RFlangeCrRo);
1986 shRB26s1RFlangeCr->DefineSection(2, z0, kRB26s1RFlangeCrRi2, kRB26s1RFlangeCrRo);
1987 z0 = kRB26s1RFlangeCrL;
1988 shRB26s1RFlangeCr->DefineSection(3, z0, kRB26s1RFlangeCrRi2, kRB26s1RFlangeCrRo);
1989 TGeoVolume* voRB26s1RFlangeCr = new TGeoVolume("RB26s1RFlangeCr", shRB26s1RFlangeCr, kMedSteelHC);
1990
1991 // Pos 2 Insert LHCVFX__0015
1992 const Float_t kRB26s1RFlangeIsL = 4.88; // Lenth of the insert
1993 const Float_t kRB26s1RFlangeIsR = 6.70 / 2.; // Ring radius
1994 const Float_t kRB26s1RFlangeIsD = 0.80; // Ring Width
1995
1996 TGeoPcon* shRB26s1RFlangeIs = new TGeoPcon(0., 360., 4);
1997 z0 = 0.;
1998 shRB26s1RFlangeIs->DefineSection(0, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeIsR);
1999 z0 += kRB26s1RFlangeIsD;
2000 shRB26s1RFlangeIs->DefineSection(1, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeIsR);
2001 shRB26s1RFlangeIs->DefineSection(2, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2002 z0 = kRB26s1RFlangeIsL;
2003 shRB26s1RFlangeIs->DefineSection(3, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2004 TGeoVolume* voRB26s1RFlangeIs = new TGeoVolume("RB26s1RFlangeIs", shRB26s1RFlangeIs, kMedSteelHC);
2005 // 4.88 + 3.7 = 8.58 (8.7 to avoid overlap)
2006 // Pos 3 Fixed Point Section LHCVC2A_0021
2007 const Float_t kRB26s1RFlangeFpL = 5.88; // Length of the fixed point section (0.08 cm added for welding)
2008 const Float_t kRB26s1RFlangeFpZ = 3.82; // Position of the ring
2009 const Float_t kRB26s1RFlangeFpD = 0.59; // Width of the ring
2010 const Float_t kRB26s1RFlangeFpR = 7.00 / 2.; // Radius of the ring
2011
2012 TGeoPcon* shRB26s1RFlangeFp = new TGeoPcon(0., 360., 6);
2013 z0 = 0.;
2014 shRB26s1RFlangeFp->DefineSection(0, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2015 z0 += kRB26s1RFlangeFpZ;
2016 shRB26s1RFlangeFp->DefineSection(1, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2017 shRB26s1RFlangeFp->DefineSection(2, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeFpR);
2018 z0 += kRB26s1RFlangeFpD;
2019 shRB26s1RFlangeFp->DefineSection(3, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeFpR);
2020 shRB26s1RFlangeFp->DefineSection(4, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2021 z0 = kRB26s1RFlangeFpL;
2022 shRB26s1RFlangeFp->DefineSection(5, z0, kRB26s1RFlangeTubeRi, kRB26s1RFlangeTubeRo);
2023 TGeoVolume* voRB26s1RFlangeFp = new TGeoVolume("RB26s1RFlangeFp", shRB26s1RFlangeFp, kMedSteelHC);
2024
2025 // Put everything in a mother volume
2026 TGeoPcon* shRB26s1RFlange = new TGeoPcon(0., 360., 8);
2027 z0 = 0.;
2028 shRB26s1RFlange->DefineSection(0, z0, 0., kRB26s1RFlangeCrRo);
2029 z0 += kRB26s1RFlangeCrL;
2030 shRB26s1RFlange->DefineSection(1, z0, 0., kRB26s1RFlangeCrRo);
2031 shRB26s1RFlange->DefineSection(2, z0, 0., kRB26s1RFlangeTubeRo);
2032 z0 = kRB26s1RFlangeIsL + kRB26s1RFlangeFpZ;
2033 shRB26s1RFlange->DefineSection(3, z0, 0., kRB26s1RFlangeTubeRo);
2034 shRB26s1RFlange->DefineSection(4, z0, 0., kRB26s1RFlangeFpR);
2035 z0 += kRB26s1RFlangeFpD;
2036 shRB26s1RFlange->DefineSection(5, z0, 0., kRB26s1RFlangeFpR);
2037 shRB26s1RFlange->DefineSection(6, z0, 0., kRB26s1RFlangeTubeRo);
2038 z0 = kRB26s1RFlangeIsL + kRB26s1RFlangeFpL;
2039 shRB26s1RFlange->DefineSection(7, z0, 0., kRB26s1RFlangeTubeRo);
2040 TGeoVolume* voRB26s1RFlange = new TGeoVolume("RB26s1RFlange", shRB26s1RFlange, kMedVacHC);
2041
2042 voRB26s1RFlange->AddNode(voRB26s1RFlangeIs, 1, gGeoIdentity);
2043 voRB26s1RFlange->AddNode(voRB26s1RFlangeCr, 1, gGeoIdentity);
2044 voRB26s1RFlange->AddNode(voRB26s1RFlangeFp, 1, new TGeoTranslation(0., 0., kRB26s1RFlangeIsL));
2045
2047 // Fixed Flange //
2048 // Drawing LHCVFX_0006 //
2050 const Float_t kRB26s2FFlangeL = 2.13; // Length of the flange
2051 const Float_t kRB26s2FFlangeD1 = 0.97; // Length of section 1
2052 const Float_t kRB26s2FFlangeD2 = 0.29; // Length of section 2
2053 const Float_t kRB26s2FFlangeD3 = 0.87; // Length of section 3
2054 const Float_t kRB26s2FFlangeRo = 17.15 / 2.; // Flange outer radius
2055 const Float_t kRB26s2FFlangeRi1 = 12.30 / 2.; // Flange inner radius section 1
2056 const Float_t kRB26s2FFlangeRi2 = 12.00 / 2.; // Flange inner radius section 2
2057 const Float_t kRB26s2FFlangeRi3 = 12.30 / 2.; // Flange inner radius section 3
2058 z0 = 0;
2059 TGeoPcon* shRB26s2FFlange = new TGeoPcon(0., 360., 6);
2060 z0 = 0.;
2061 shRB26s2FFlange->DefineSection(0, z0, kRB26s2FFlangeRi1, kRB26s2FFlangeRo);
2062 z0 += kRB26s2FFlangeD1;
2063 shRB26s2FFlange->DefineSection(1, z0, kRB26s2FFlangeRi1, kRB26s2FFlangeRo);
2064 shRB26s2FFlange->DefineSection(2, z0, kRB26s2FFlangeRi2, kRB26s2FFlangeRo);
2065 z0 += kRB26s2FFlangeD2;
2066 shRB26s2FFlange->DefineSection(3, z0, kRB26s2FFlangeRi2, kRB26s2FFlangeRo);
2067 shRB26s2FFlange->DefineSection(4, z0, kRB26s2FFlangeRi3, kRB26s2FFlangeRo);
2068 z0 += kRB26s2FFlangeD3;
2069 shRB26s2FFlange->DefineSection(5, z0, kRB26s2FFlangeRi3, kRB26s2FFlangeRo);
2070 TGeoVolume* voRB26s2FFlange = new TGeoVolume("RB26s2FFlange", shRB26s2FFlange, kMedSteelHC);
2071
2072 TGeoVolume* voRB26s2FFlangeM =
2073 new TGeoVolume("RB26s2FFlangeM", MakeMotherFromTemplate(shRB26s2FFlange, 2, 5), kMedVacHC);
2074 voRB26s2FFlangeM->AddNode(voRB26s2FFlange, 1, gGeoIdentity);
2075
2077 // //
2078 // RB26/3 //
2079 // Drawing LHCV2a_0048 //
2080 // Drawing LHCV2a_0002 //
2082 //
2083 // Pos 1 Vacuum Tubes LHCVC2A__0003
2084 // Pos 2 Fixed Point LHCVFX___0005
2085 // Pos 3 Split Flange LHCVFX___0007
2086 // Pos 4 Fixed Flange LHCVFX___0004
2087 // Pos 5 Axial Compensator LHCVC2A__0065
2088 //
2089 //
2090 //
2091 //
2093 // Vacuum Tube //
2094 // Drawing LHCVC2A_0003 //
2096 const Float_t kRB26s3TubeL = 629.35 + 0.3; // 0.3 cm added for welding
2097 const Float_t kRB26s3TubeR1 = 12. / 2.;
2098 const Float_t kRB26s3TubeR2 = kRB26s3TubeR1 + 215.8 * TMath::Tan(0.829 / 180. * TMath::Pi());
2099
2100 TGeoPcon* shRB26s3Tube = new TGeoPcon(0., 360., 7);
2101 // Section 1: straight section
2102 shRB26s3Tube->DefineSection(0, 0.00, kRB26s3TubeR1, kRB26s3TubeR1 + 0.15);
2103 shRB26s3Tube->DefineSection(1, 2.00, kRB26s3TubeR1, kRB26s3TubeR1 + 0.15);
2104 // Section 2: 0.829 deg opening cone
2105 shRB26s3Tube->DefineSection(2, 2.00, kRB26s3TubeR1, kRB26s3TubeR1 + 0.20);
2106
2107 shRB26s3Tube->DefineSection(3, 217.80, kRB26s3TubeR2, kRB26s3TubeR2 + 0.20);
2108 shRB26s3Tube->DefineSection(4, 217.80, kRB26s3TubeR2, kRB26s3TubeR2 + 0.30);
2109
2110 shRB26s3Tube->DefineSection(5, 622.20, 30.00 / 2., 30.60 / 2.);
2111 shRB26s3Tube->DefineSection(6, kRB26s3TubeL, 30.00 / 2., 30.60 / 2.);
2112
2113 TGeoVolume* voRB26s3Tube = new TGeoVolume("RB26s3Tube", shRB26s3Tube, kMedSteelHC);
2114 // Add the insulation layer
2115 TGeoVolume* voRB26s3TubeIns = new TGeoVolume("RB26s3TubeIns", MakeInsulationFromTemplate(shRB26s3Tube), kMedInsu);
2116 voRB26s3Tube->AddNode(voRB26s3TubeIns, 1, gGeoIdentity);
2117
2118 TGeoVolume* voRB26s3TubeM = new TGeoVolume("RB26s3TubeM", MakeMotherFromTemplate(shRB26s3Tube), kMedVacHC);
2119 voRB26s3TubeM->AddNode(voRB26s3Tube, 1, gGeoIdentity);
2120
2122 // Fixed Point //
2123 // Drawing LHCVFX_0005 //
2125 const Float_t kRB26s3FixedPointL = 16.37; // Length of the fixed point section (0.3 cm added for welding)
2126 const Float_t kRB26s3FixedPointZ = 9.72; // Position of the ring (0.15 cm added for welding)
2127 const Float_t kRB26s3FixedPointD = 0.595; // Width of the ring
2128 const Float_t kRB26s3FixedPointR = 13.30 / 2.; // Radius of the ring
2129 const Float_t kRB26s3FixedPointRi = 12.00 / 2.; // Inner radius of the tube
2130 const Float_t kRB26s3FixedPointRo1 = 12.30 / 2.; // Outer radius of the tube (in)
2131 const Float_t kRB26s3FixedPointRo2 = 12.40 / 2.; // Outer radius of the tube (out)
2132 const Float_t kRB26s3FixedPointDs = 1.5; // Width of straight section behind ring
2133 const Float_t kRB26s3FixedPointDc = 3.15; // Width of conical section behind ring (0.15 cm added for welding)
2134
2135 TGeoPcon* shRB26s3FixedPoint = new TGeoPcon(0., 360., 8);
2136 z0 = 0.;
2137 shRB26s3FixedPoint->DefineSection(0, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
2138 z0 += kRB26s3FixedPointZ;
2139 shRB26s3FixedPoint->DefineSection(1, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
2140 shRB26s3FixedPoint->DefineSection(2, z0, kRB26s3FixedPointRi, kRB26s3FixedPointR);
2141 z0 += kRB26s3FixedPointD;
2142 shRB26s3FixedPoint->DefineSection(3, z0, kRB26s3FixedPointRi, kRB26s3FixedPointR);
2143 shRB26s3FixedPoint->DefineSection(4, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
2144 z0 += kRB26s3FixedPointDs;
2145 shRB26s3FixedPoint->DefineSection(5, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo1);
2146 z0 += kRB26s3FixedPointDc;
2147 shRB26s3FixedPoint->DefineSection(6, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo2);
2148 z0 = kRB26s3FixedPointL;
2149 shRB26s3FixedPoint->DefineSection(7, z0, kRB26s3FixedPointRi, kRB26s3FixedPointRo2);
2150 TGeoVolume* voRB26s3FixedPoint = new TGeoVolume("RB26s3FixedPoint", shRB26s3FixedPoint, kMedSteelHC);
2151
2152 TGeoVolume* voRB26s3FixedPointM =
2153 new TGeoVolume("RB26s3FixedPointM", MakeMotherFromTemplate(shRB26s3FixedPoint), kMedVacHC);
2154 voRB26s3FixedPointM->AddNode(voRB26s3FixedPoint, 1, gGeoIdentity);
2155
2157 // Split Flange //
2158 // Drawing LHCVFX_0005 //
2160 const Float_t kRB26s3SFlangeL = 2.13; // Length of the flange
2161 const Float_t kRB26s3SFlangeD1 = 0.57; // Length of section 1
2162 const Float_t kRB26s3SFlangeD2 = 0.36; // Length of section 2
2163 const Float_t kRB26s3SFlangeD3 = 0.50 + 0.70; // Length of section 3
2164 const Float_t kRB26s3SFlangeRo = 17.15 / 2.; // Flange outer radius
2165 const Float_t kRB26s3SFlangeRi1 = 12.30 / 2.; // Flange inner radius section 1
2166 const Float_t kRB26s3SFlangeRi2 = 12.00 / 2.; // Flange inner radius section 2
2167 const Float_t kRB26s3SFlangeRi3 = 12.30 / 2.; // Flange inner radius section 3
2168 z0 = 0;
2169 TGeoPcon* shRB26s3SFlange = new TGeoPcon(0., 360., 6);
2170 z0 = 0.;
2171 shRB26s3SFlange->DefineSection(0, z0, kRB26s3SFlangeRi1, kRB26s3SFlangeRo);
2172 z0 += kRB26s3SFlangeD1;
2173 shRB26s3SFlange->DefineSection(1, z0, kRB26s3SFlangeRi1, kRB26s3SFlangeRo);
2174 shRB26s3SFlange->DefineSection(2, z0, kRB26s3SFlangeRi2, kRB26s3SFlangeRo);
2175 z0 += kRB26s3SFlangeD2;
2176 shRB26s3SFlange->DefineSection(3, z0, kRB26s3SFlangeRi2, kRB26s3SFlangeRo);
2177 shRB26s3SFlange->DefineSection(4, z0, kRB26s3SFlangeRi3, kRB26s3SFlangeRo);
2178 z0 += kRB26s3SFlangeD3;
2179 shRB26s3SFlange->DefineSection(5, z0, kRB26s3SFlangeRi3, kRB26s3SFlangeRo);
2180 TGeoVolume* voRB26s3SFlange = new TGeoVolume("RB26s3SFlange", shRB26s3SFlange, kMedSteelHC);
2181
2182 TGeoVolume* voRB26s3SFlangeM =
2183 new TGeoVolume("RB26s3SFlangeM", MakeMotherFromTemplate(shRB26s3SFlange, 0, 3), kMedVacHC);
2184 voRB26s3SFlangeM->AddNode(voRB26s3SFlange, 1, gGeoIdentity);
2185
2187 // RB26/3 Fixed Flange //
2188 // Drawing LHCVFX___0004 //
2190 const Float_t kRB26s3FFlangeL = 2.99; // Length of the flange
2191 const Float_t kRB26s3FFlangeD1 = 1.72; // Length of section 1
2192 const Float_t kRB26s3FFlangeD2 = 0.30; // Length of section 2
2193 const Float_t kRB26s3FFlangeD3 = 0.97; // Length of section 3
2194 const Float_t kRB26s3FFlangeRo = 36.20 / 2.; // Flange outer radius
2195 const Float_t kRB26s3FFlangeRi1 = 30.60 / 2.; // Flange inner radius section 1
2196 const Float_t kRB26s3FFlangeRi2 = 30.00 / 2.; // Flange inner radius section 2
2197 const Float_t kRB26s3FFlangeRi3 = 30.60 / 2.; // Flange inner radius section 3
2198 z0 = 0;
2199 TGeoPcon* shRB26s3FFlange = new TGeoPcon(0., 360., 6);
2200 z0 = 0.;
2201 shRB26s3FFlange->DefineSection(0, z0, kRB26s3FFlangeRi1, kRB26s3FFlangeRo);
2202 z0 += kRB26s3FFlangeD1;
2203 shRB26s3FFlange->DefineSection(1, z0, kRB26s3FFlangeRi1, kRB26s3FFlangeRo);
2204 shRB26s3FFlange->DefineSection(2, z0, kRB26s3FFlangeRi2, kRB26s3FFlangeRo);
2205 z0 += kRB26s3FFlangeD2;
2206 shRB26s3FFlange->DefineSection(3, z0, kRB26s3FFlangeRi2, kRB26s3FFlangeRo);
2207 shRB26s3FFlange->DefineSection(4, z0, kRB26s3FFlangeRi3, kRB26s3FFlangeRo);
2208 z0 += kRB26s3FFlangeD3;
2209 shRB26s3FFlange->DefineSection(5, z0, kRB26s3FFlangeRi3, kRB26s3FFlangeRo);
2210 TGeoVolume* voRB26s3FFlange = new TGeoVolume("RB26s3FFlange", shRB26s3FFlange, kMedSteelHC);
2211
2212 TGeoVolume* voRB26s3FFlangeM =
2213 new TGeoVolume("RB26s3FFlangeM", MakeMotherFromTemplate(shRB26s3FFlange, 2, 5), kMedVacHC);
2214 voRB26s3FFlangeM->AddNode(voRB26s3FFlange, 1, gGeoIdentity);
2215
2217 // RB26/3 Axial Compensator //
2218 // Drawing LHCVC2a_0065 //
2220 const Float_t kRB26s3CompL = 42.3; // Length of the compensator (0.3 cm added for welding)
2221 const Float_t kRB26s3BellowRo = 34.00 / 2.; // Bellow outer radius [Pos 1]
2222 const Float_t kRB26s3BellowRi = 30.10 / 2.; // Bellow inner radius [Pos 1]
2223 const Int_t kRB26s3NumberOfPlies = 13; // Number of plies [Pos 1]
2224 const Float_t kRB26s3BellowUndL = 17.70; // Length of undulated region [Pos 1]
2225 const Float_t kRB26s3PlieThickness = 0.06; // Plie thickness [Pos 1]
2226 const Float_t kRB26s3ConnectionPlieR = 0.21; // Connection plie radius [Pos 1]
2227 // Plie radius
2228 const Float_t kRB26s3PlieR = (kRB26s3BellowUndL - 4. * kRB26s3ConnectionPlieR + 2. * kRB26s3PlieThickness +
2229 (2. * kRB26s3NumberOfPlies - 2.) * kRB26s3PlieThickness) /
2230 (4. * kRB26s3NumberOfPlies - 2.);
2231
2232 //
2233 // The welding tubes have 3 sections with different radii and 2 transition regions.
2234 // Section 1: connection to the outside
2235 // Section 2: commection to the bellow
2236 // Section 3: between 1 and 2
2237 const Float_t kRB26s3CompTubeInnerR1 = 30.0 / 2.; // Outer Connection tubes inner radius [Pos 4 + 3]
2238 const Float_t kRB26s3CompTubeOuterR1 = 30.6 / 2.; // Outer Connection tubes outer radius [Pos 4 + 3]
2239 const Float_t kRB26s3CompTubeInnerR2 = 29.4 / 2.; // Connection tubes inner radius [Pos 4 + 3]
2240 const Float_t kRB26s3CompTubeOuterR2 = 30.0 / 2.; // Connection tubes outer radius [Pos 4 + 3]
2241 const Float_t kRB26s3CompTubeInnerR3 = 30.6 / 2.; // Connection tubes inner radius at bellow [Pos 4 + 3]
2242 const Float_t kRB26s3CompTubeOuterR3 = 32.2 / 2.; // Connection tubes outer radius at bellow [Pos 4 + 3]
2243
2244 const Float_t kRB26s3WeldingTubeLeftL1 = 2.0; // Left connection tube length [Pos 4]
2245 const Float_t kRB26s3WeldingTubeLeftL2 = 3.4; // Left connection tube length [Pos 4]
2246 const Float_t kRB26s3WeldingTubeLeftL = 7.0; // Left connection tube total length [Pos 4]
2247 const Float_t kRB26s3WeldingTubeRightL1 =
2248 2.3; // Right connection tube length [Pos 3] (0.3 cm added for welding)
2249 const Float_t kRB26s3WeldingTubeRightL2 = 13.4; // Right connection tube length [Pos 3]
2250
2251 const Float_t kRB26s3WeldingTubeT1 = 0.6; // Length of first r-transition [Pos 4 + 3]
2252 const Float_t kRB26s3WeldingTubeT2 = 1.0; // Length of 2nd r-transition [Pos 4 + 3]
2253
2254 const Float_t kRB26s3RingOuterR = 36.1 / 2.; // Ring inner radius [Pos 4]
2255 const Float_t kRB26s3RingL = 0.8 / 2.; // Ring half length [Pos 4]
2256 const Float_t kRB26s3RingZ = 3.7; // Ring z-position [Pos 4]
2257 const Float_t kRB26s3ProtOuterR = 36.2 / 2.; // Protection tube outer radius [Pos 2]
2258 const Float_t kRB26s3ProtL = 27.0 / 2.; // Protection tube half length [Pos 2]
2259 const Float_t kRB26s3ProtZ = 4.0; // Protection tube z-position [Pos 2]
2260
2261 // Mother volume
2262 //
2263 TGeoPcon* shRB26s3Compensator = new TGeoPcon(0., 360., 6);
2264 shRB26s3Compensator->DefineSection(0, 0.0, 0., kRB26s3CompTubeOuterR1);
2265 shRB26s3Compensator->DefineSection(1, kRB26s3RingZ, 0., kRB26s3CompTubeOuterR1);
2266 shRB26s3Compensator->DefineSection(2, kRB26s3RingZ, 0., kRB26s3ProtOuterR);
2267 shRB26s3Compensator->DefineSection(3, kRB26s3ProtZ + 2. * kRB26s3ProtL, 0., kRB26s3ProtOuterR);
2268 shRB26s3Compensator->DefineSection(4, kRB26s3ProtZ + 2. * kRB26s3ProtL, 0., kRB26s3CompTubeOuterR1);
2269 shRB26s3Compensator->DefineSection(5, kRB26s3CompL, 0., kRB26s3CompTubeOuterR1);
2270 TGeoVolume* voRB26s3Compensator = new TGeoVolume("RB26s3Compensator", shRB26s3Compensator, kMedVacHC);
2271
2272 //
2273 // [Pos 1] Bellow
2274 //
2275 //
2276
2277 //
2278 // Upper part of the undulation
2279 //
2280 TGeoTorus* shRB26s3PlieTorusU =
2281 new TGeoTorus(kRB26s3BellowRo - kRB26s3PlieR, kRB26s3PlieR - kRB26s3PlieThickness, kRB26s3PlieR);
2282 shRB26s3PlieTorusU->SetName("RB26s3TorusU");
2283 TGeoTube* shRB26s3PlieTubeU = new TGeoTube(kRB26s3BellowRo - kRB26s3PlieR, kRB26s3BellowRo, kRB26s3PlieR);
2284 shRB26s3PlieTubeU->SetName("RB26s3TubeU");
2285 TGeoCompositeShape* shRB26s3UpperPlie = new TGeoCompositeShape("RB26s3UpperPlie", "RB26s3TorusU*RB26s3TubeU");
2286
2287 TGeoVolume* voRB26s3WiggleU = new TGeoVolume("RB26s3UpperPlie", shRB26s3UpperPlie, kMedSteelHC);
2288 //
2289 // Lower part of the undulation
2290 TGeoTorus* shRB26s3PlieTorusL =
2291 new TGeoTorus(kRB26s3BellowRi + kRB26s3PlieR, kRB26s3PlieR - kRB26s3PlieThickness, kRB26s3PlieR);
2292 shRB26s3PlieTorusL->SetName("RB26s3TorusL");
2293 TGeoTube* shRB26s3PlieTubeL = new TGeoTube(kRB26s3BellowRi, kRB26s3BellowRi + kRB26s3PlieR, kRB26s3PlieR);
2294 shRB26s3PlieTubeL->SetName("RB26s3TubeL");
2295 TGeoCompositeShape* shRB26s3LowerPlie = new TGeoCompositeShape("RB26s3LowerPlie", "RB26s3TorusL*RB26s3TubeL");
2296
2297 TGeoVolume* voRB26s3WiggleL = new TGeoVolume("RB26s3LowerPlie", shRB26s3LowerPlie, kMedSteelHC);
2298
2299 //
2300 // Connection between upper and lower part of undulation
2301 TGeoVolume* voRB26s3WiggleC1 = new TGeoVolume(
2302 "RB26s3PlieConn1",
2303 new TGeoTube(kRB26s3BellowRi + kRB26s3PlieR, kRB26s3BellowRo - kRB26s3PlieR, kRB26s3PlieThickness / 2.), kMedSteelHC);
2304 //
2305 // One wiggle
2306 TGeoVolumeAssembly* voRB26s3Wiggle = new TGeoVolumeAssembly("RB26s3Wiggle");
2307 z0 = -kRB26s3PlieThickness / 2.;
2308 voRB26s3Wiggle->AddNode(voRB26s3WiggleC1, 1, new TGeoTranslation(0., 0., z0));
2309 z0 += kRB26s3PlieR - kRB26s3PlieThickness / 2.;
2310 voRB26s3Wiggle->AddNode(voRB26s3WiggleU, 1, new TGeoTranslation(0., 0., z0));
2311 z0 += kRB26s3PlieR - kRB26s3PlieThickness / 2.;
2312 voRB26s3Wiggle->AddNode(voRB26s3WiggleC1, 2, new TGeoTranslation(0., 0., z0));
2313 z0 += kRB26s3PlieR - kRB26s3PlieThickness;
2314 voRB26s3Wiggle->AddNode(voRB26s3WiggleL, 1, new TGeoTranslation(0., 0., z0));
2315 voRB26s3Wiggle->GetShape()->ComputeBBox(); // enforce recomputing of BBox
2316
2317 //
2318 // The bellow itself
2319 Float_t zBellowTot = kRB26s3NumberOfPlies * (static_cast<TGeoBBox*>(voRB26s3Wiggle->GetShape()))->GetDZ();
2320 TGeoVolume* voRB26s3Bellow =
2321 new TGeoVolume("RB26s3Bellow", new TGeoTube(kRB26s3BellowRi, kRB26s3BellowRo, zBellowTot), kMedVacHC);
2322
2323 // Positioning of the volumes.
2324 //
2325 // A thirteen-convolution bellow has fourteen inner roots, so one lower plie
2326 // leads the thirteen wiggles. The pitch is not 4*PlieR - 2*PlieThickness: a
2327 // torus-and-disc wiggle is longer than the convolution it stands for, and at
2328 // that pitch the stack does not fit the bellow. There is no room to grow it
2329 // either, since only 0.01 cm separates this bellow from the right welding
2330 // tube. The pitch is therefore the one that makes the fourteen roots span the
2331 // bellow exactly, which is 1.5 per cent shorter.
2332 const Float_t kRB26s3PliePitch =
2333 (2. * zBellowTot - 2. * kRB26s3PlieR) / kRB26s3NumberOfPlies;
2334 const Float_t kRB26s3RootToWiggle = 3. * kRB26s3PlieR - 5. * kRB26s3PlieThickness / 2.;
2335
2336 z0 = -zBellowTot + kRB26s3PlieR;
2337 voRB26s3Bellow->AddNode(voRB26s3WiggleL, 1, new TGeoTranslation(0., 0., z0));
2338 for (Int_t iw = 0; iw < kRB26s3NumberOfPlies; iw++) {
2339 Float_t zpos = z0 + (iw + 1) * kRB26s3PliePitch - kRB26s3RootToWiggle;
2340 voRB26s3Bellow->AddNode(voRB26s3Wiggle, iw + 1, new TGeoTranslation(0., 0., zpos));
2341 }
2342
2343 voRB26s3Compensator->AddNode(voRB26s3Bellow, 1,
2344 new TGeoTranslation(0., 0., kRB26s3WeldingTubeLeftL + zBellowTot));
2345
2346 //
2347 // [Pos 2] Outer Protecting Tube
2348 //
2349 TGeoTube* shRB26s3CompProtTube = new TGeoTube(kRB26s3RingOuterR, kRB26s3ProtOuterR, kRB26s3ProtL);
2350 TGeoVolume* voRB26s3CompProtTube = new TGeoVolume("RB26s3CompProtTube", shRB26s3CompProtTube, kMedSteelHC);
2351 voRB26s3Compensator->AddNode(voRB26s3CompProtTube, 1, new TGeoTranslation(0., 0., kRB26s3ProtZ + kRB26s3ProtL));
2352
2353 //
2354 // [Pos 3] Right Welding Tube
2355 //
2356 TGeoPcon* shRB26s3CompRightTube = new TGeoPcon(0., 360., 5);
2357 z0 = 0.;
2358 shRB26s3CompRightTube->DefineSection(0, z0, kRB26s3CompTubeInnerR3, kRB26s3CompTubeOuterR3);
2359 z0 += kRB26s3WeldingTubeT2;
2360 shRB26s3CompRightTube->DefineSection(1, z0, kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2361 z0 += kRB26s3WeldingTubeRightL2;
2362 shRB26s3CompRightTube->DefineSection(2, z0, kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2363 z0 += kRB26s3WeldingTubeT1;
2364 shRB26s3CompRightTube->DefineSection(3, z0, kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2365 z0 += kRB26s3WeldingTubeRightL1;
2366 shRB26s3CompRightTube->DefineSection(4, z0, kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2367
2368 TGeoVolume* voRB26s3CompRightTube = new TGeoVolume("RB26s3CompRightTube", shRB26s3CompRightTube, kMedSteelHC);
2369 voRB26s3Compensator->AddNode(voRB26s3CompRightTube, 1, new TGeoTranslation(0., 0., kRB26s3CompL - z0));
2370
2371 //
2372 // [Pos 4] Left Welding Tube
2373 //
2374 TGeoPcon* shRB26s3CompLeftTube = new TGeoPcon(0., 360., 5);
2375 z0 = 0.;
2376 shRB26s3CompLeftTube->DefineSection(0, z0, kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2377 z0 += kRB26s3WeldingTubeLeftL1;
2378 shRB26s3CompLeftTube->DefineSection(1, z0, kRB26s3CompTubeInnerR1, kRB26s3CompTubeOuterR1);
2379 z0 += kRB26s3WeldingTubeT1;
2380 shRB26s3CompLeftTube->DefineSection(2, z0, kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2381 z0 += kRB26s3WeldingTubeLeftL2;
2382 shRB26s3CompLeftTube->DefineSection(3, z0, kRB26s3CompTubeInnerR2, kRB26s3CompTubeOuterR2);
2383 z0 += kRB26s3WeldingTubeT2;
2384 shRB26s3CompLeftTube->DefineSection(4, z0, kRB26s3CompTubeInnerR3, kRB26s3CompTubeOuterR3);
2385
2386 TGeoVolume* voRB26s3CompLeftTube = new TGeoVolume("RB26s3CompLeftTube", shRB26s3CompLeftTube, kMedSteelHC);
2387 voRB26s3Compensator->AddNode(voRB26s3CompLeftTube, 1, gGeoIdentity);
2388 //
2389 // [Pos 5] Ring
2390 //
2391 TGeoTube* shRB26s3CompRing = new TGeoTube(kRB26s3CompTubeOuterR2, kRB26s3RingOuterR, kRB26s3RingL);
2392 TGeoVolume* voRB26s3CompRing = new TGeoVolume("RB26s3CompRing", shRB26s3CompRing, kMedSteelHC);
2393 voRB26s3Compensator->AddNode(voRB26s3CompRing, 1, new TGeoTranslation(0., 0., kRB26s3RingZ + kRB26s3RingL));
2394
2396 // //
2397 // RB26/4-5 //
2398 // Drawing LHCV2a_0012 [as installed] //
2400 // Pos1 Vacuum Tubes LHCVC2A__0014
2401 // Pos2 Compensator LHCVC2A__0066
2402 // Pos3 Fixed Point Section LHCVC2A__0016
2403 // Pos4 Split Flange LHCVFX___0005
2404 // Pos5 RotableFlange LHCVFX___0009
2406
2408 // RB26/4-5 Vacuum Tubes //
2409 // Drawing LHCVC2a_0014 //
2411 const Float_t kRB26s45TubeL = 593.12 + 0.3; // 0.3 cm added for welding
2412
2413 TGeoPcon* shRB26s45Tube = new TGeoPcon(0., 360., 11);
2414 // Section 1: straight section
2415 shRB26s45Tube->DefineSection(0, 0.00, 30.00 / 2., 30.60 / 2.);
2416 shRB26s45Tube->DefineSection(1, 1.20, 30.00 / 2., 30.60 / 2.);
2417 shRB26s45Tube->DefineSection(2, 1.20, 30.00 / 2., 30.80 / 2.);
2418 shRB26s45Tube->DefineSection(3, 25.10, 30.00 / 2., 30.80 / 2.);
2419 // Section 2: 0.932 deg opening cone
2420 shRB26s45Tube->DefineSection(4, 486.10, 45.00 / 2., 45.80 / 2.);
2421 // Section 3: straight section 4 mm
2422 shRB26s45Tube->DefineSection(5, 512.10, 45.00 / 2., 45.80 / 2.);
2423 // Section 4: straight section 3 mm
2424 shRB26s45Tube->DefineSection(6, 512.10, 45.00 / 2., 45.60 / 2.);
2425 shRB26s45Tube->DefineSection(7, 527.70, 45.00 / 2., 45.60 / 2.);
2426 // Section 4: closing cone
2427 shRB26s45Tube->DefineSection(8, 591.30, 10.00 / 2., 10.60 / 2.);
2428 shRB26s45Tube->DefineSection(9, 591.89, 10.00 / 2., 10.30 / 2.);
2429
2430 shRB26s45Tube->DefineSection(10, kRB26s45TubeL, 10.00 / 2., 10.30 / 2.);
2431 TGeoVolume* voRB26s45Tube = new TGeoVolume("RB26s45Tube", shRB26s45Tube, kMedSteelHC);
2432
2433 TGeoVolume* voRB26s45TubeM = new TGeoVolume("RB26s45TubeM", MakeMotherFromTemplate(shRB26s45Tube), kMedVacHC);
2434 voRB26s45TubeM->AddNode(voRB26s45Tube, 1, gGeoIdentity);
2435
2437 // RB26/5 Axial Compensator //
2438 // Drawing LHCVC2a_0066 //
2440 const Float_t kRB26s5CompL = 27.60; // Length of the compensator (0.30 cm added for welding)
2441 const Float_t kRB26s5BellowRo = 12.48 / 2.; // Bellow outer radius [Pos 1]
2442 const Float_t kRB26s5BellowRi = 10.32 / 2.; // Bellow inner radius [Pos 1]
2443 const Int_t kRB26s5NumberOfPlies = 15; // Number of plies [Pos 1]
2444 const Float_t kRB26s5BellowUndL = 10.50; // Length of undulated region [Pos 1]
2445 const Float_t kRB26s5PlieThickness = 0.025; // Plie thickness [Pos 1]
2446 const Float_t kRB26s5ConnectionPlieR = 0.21; // Connection plie radius [Pos 1]
2447 const Float_t kRB26s5ConnectionR = 11.2 / 2.; // Bellow connection radius [Pos 1]
2448 // Plie radius
2449 const Float_t kRB26s5PlieR = (kRB26s5BellowUndL - 4. * kRB26s5ConnectionPlieR + 2. * kRB26s5PlieThickness +
2450 (2. * kRB26s5NumberOfPlies - 2.) * kRB26s5PlieThickness) /
2451 (4. * kRB26s5NumberOfPlies - 2.);
2452 const Float_t kRB26s5CompTubeInnerR = 10.00 / 2.; // Connection tubes inner radius [Pos 2 + 3]
2453 const Float_t kRB26s5CompTubeOuterR = 10.30 / 2.; // Connection tubes outer radius [Pos 2 + 3]
2454 const Float_t kRB26s5WeldingTubeLeftL = 3.70 / 2.; // Left connection tube half length [Pos 2]
2455 const Float_t kRB26s5WeldingTubeRightL =
2456 13.40 / 2.; // Right connection tube half length [Pos 3] (0.3 cm added for welding)
2457 const Float_t kRB26s5RingInnerR = 11.2 / 2.; // Ring inner radius [Pos 4]
2458 const Float_t kRB26s5RingOuterR = 16.0 / 2.; // Ring inner radius [Pos 4]
2459 const Float_t kRB26s5RingL = 0.4 / 2.; // Ring half length [Pos 4]
2460 const Float_t kRB26s5RingZ = 14.97; // Ring z-position [Pos 4]
2461 const Float_t kRB26s5ProtOuterR = 16.2 / 2.; // Protection tube outer radius [Pos 5]
2462 const Float_t kRB26s5ProtL = 13.0 / 2.; // Protection tube half length [Pos 5]
2463 const Float_t kRB26s5ProtZ = 2.17; // Protection tube z-position [Pos 5]
2464 const Float_t kRB26s5DetailZR = 11.3 / 2.; // Detail Z max radius
2465
2466 // Mother volume
2467 //
2468 TGeoPcon* shRB26s5Compensator = new TGeoPcon(0., 360., 8);
2469 shRB26s5Compensator->DefineSection(0, 0.0, 0., kRB26s5CompTubeOuterR);
2470 shRB26s5Compensator->DefineSection(1, kRB26s5ProtZ, 0., kRB26s5CompTubeOuterR);
2471 shRB26s5Compensator->DefineSection(2, kRB26s5ProtZ, 0., kRB26s5ProtOuterR);
2472 shRB26s5Compensator->DefineSection(3, kRB26s5ProtZ + 2. * kRB26s5ProtL + 2. * kRB26s5RingL, 0., kRB26s5ProtOuterR);
2473 shRB26s5Compensator->DefineSection(4, kRB26s5ProtZ + 2. * kRB26s5ProtL + 2. * kRB26s5RingL, 0., kRB26s5DetailZR);
2474 shRB26s5Compensator->DefineSection(5, kRB26s5CompL - 8., 0., kRB26s5DetailZR);
2475 shRB26s5Compensator->DefineSection(6, kRB26s5CompL - 8., 0., kRB26s5CompTubeOuterR);
2476 shRB26s5Compensator->DefineSection(7, kRB26s5CompL, 0., kRB26s5CompTubeOuterR);
2477 TGeoVolume* voRB26s5Compensator = new TGeoVolume("RB26s5Compensator", shRB26s5Compensator, kMedVacHC);
2478
2479 //
2480 // [Pos 1] Bellow
2481 //
2482 //
2483 TGeoVolume* voRB26s5Bellow =
2484 new TGeoVolume("RB26s5Bellow", new TGeoTube(kRB26s5BellowRi, kRB26s5BellowRo, kRB26s5BellowUndL / 2.), kMedVacHC);
2485 //
2486 // Upper part of the undulation
2487 //
2488 TGeoTorus* shRB26s5PlieTorusU =
2489 new TGeoTorus(kRB26s5BellowRo - kRB26s5PlieR, kRB26s5PlieR - kRB26s5PlieThickness, kRB26s5PlieR);
2490 shRB26s5PlieTorusU->SetName("RB26s5TorusU");
2491 TGeoTube* shRB26s5PlieTubeU = new TGeoTube(kRB26s5BellowRo - kRB26s5PlieR, kRB26s5BellowRo, kRB26s5PlieR);
2492 shRB26s5PlieTubeU->SetName("RB26s5TubeU");
2493 TGeoCompositeShape* shRB26s5UpperPlie = new TGeoCompositeShape("RB26s5UpperPlie", "RB26s5TorusU*RB26s5TubeU");
2494
2495 TGeoVolume* voRB26s5WiggleU = new TGeoVolume("RB26s5UpperPlie", shRB26s5UpperPlie, kMedSteelHC);
2496 //
2497 // Lower part of the undulation
2498 TGeoTorus* shRB26s5PlieTorusL =
2499 new TGeoTorus(kRB26s5BellowRi + kRB26s5PlieR, kRB26s5PlieR - kRB26s5PlieThickness, kRB26s5PlieR);
2500 shRB26s5PlieTorusL->SetName("RB26s5TorusL");
2501 TGeoTube* shRB26s5PlieTubeL = new TGeoTube(kRB26s5BellowRi, kRB26s5BellowRi + kRB26s5PlieR, kRB26s5PlieR);
2502 shRB26s5PlieTubeL->SetName("RB26s5TubeL");
2503 TGeoCompositeShape* shRB26s5LowerPlie = new TGeoCompositeShape("RB26s5LowerPlie", "RB26s5TorusL*RB26s5TubeL");
2504
2505 TGeoVolume* voRB26s5WiggleL = new TGeoVolume("RB26s5LowerPlie", shRB26s5LowerPlie, kMedSteelHC);
2506
2507 //
2508 // Connection between upper and lower part of undulation
2509 TGeoVolume* voRB26s5WiggleC1 = new TGeoVolume(
2510 "RB26s5PlieConn1",
2511 new TGeoTube(kRB26s5BellowRi + kRB26s5PlieR, kRB26s5BellowRo - kRB26s5PlieR, kRB26s5PlieThickness / 2.), kMedSteelHC);
2512 //
2513 // One wiggle
2514 TGeoVolumeAssembly* voRB26s5Wiggle = new TGeoVolumeAssembly("RB26s5Wiggle");
2515 z0 = -kRB26s5PlieThickness / 2.;
2516 voRB26s5Wiggle->AddNode(voRB26s5WiggleC1, 1, new TGeoTranslation(0., 0., z0));
2517 z0 += kRB26s5PlieR - kRB26s5PlieThickness / 2.;
2518 voRB26s5Wiggle->AddNode(voRB26s5WiggleU, 1, new TGeoTranslation(0., 0., z0));
2519 z0 += kRB26s5PlieR - kRB26s5PlieThickness / 2.;
2520 voRB26s5Wiggle->AddNode(voRB26s5WiggleC1, 2, new TGeoTranslation(0., 0., z0));
2521 z0 += kRB26s5PlieR - kRB26s5PlieThickness;
2522 voRB26s5Wiggle->AddNode(voRB26s5WiggleL, 1, new TGeoTranslation(0., 0., z0));
2523 // Positioning of the volumes
2524 z0 = -kRB26s5BellowUndL / 2. + kRB26s5ConnectionPlieR;
2525 voRB26s5Bellow->AddNode(voRB26s5WiggleL, 1, new TGeoTranslation(0., 0., z0));
2526 z0 += kRB26s5ConnectionPlieR;
2527 zsh = 4. * kRB26s5PlieR - 2. * kRB26s5PlieThickness;
2528 for (Int_t iw = 0; iw < kRB26s5NumberOfPlies; iw++) {
2529 Float_t zpos = z0 + iw * zsh;
2530 voRB26s5Bellow->AddNode(voRB26s5Wiggle, iw + 1, new TGeoTranslation(0., 0., zpos - kRB26s5PlieThickness));
2531 }
2532
2533 voRB26s5Compensator->AddNode(voRB26s5Bellow, 1,
2534 new TGeoTranslation(0., 0., 2. * kRB26s5WeldingTubeLeftL + kRB26s5BellowUndL / 2.));
2535
2536 //
2537 // [Pos 2] Left Welding Tube
2538 //
2539 TGeoPcon* shRB26s5CompLeftTube = new TGeoPcon(0., 360., 3);
2540 z0 = 0;
2541 shRB26s5CompLeftTube->DefineSection(0, z0, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2542 z0 += 2 * kRB26s5WeldingTubeLeftL - (kRB26s5ConnectionR - kRB26s5CompTubeOuterR);
2543 shRB26s5CompLeftTube->DefineSection(1, z0, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2544 z0 += (kRB26s5ConnectionR - kRB26s5CompTubeOuterR);
2545 shRB26s5CompLeftTube->DefineSection(2, z0, kRB26s5ConnectionR - 0.15, kRB26s5ConnectionR);
2546 TGeoVolume* voRB26s5CompLeftTube = new TGeoVolume("RB26s5CompLeftTube", shRB26s5CompLeftTube, kMedSteelHC);
2547 voRB26s5Compensator->AddNode(voRB26s5CompLeftTube, 1, gGeoIdentity);
2548 //
2549 // [Pos 3] Right Welding Tube
2550 //
2551 TGeoPcon* shRB26s5CompRightTube = new TGeoPcon(0., 360., 11);
2552 // Detail Z
2553 shRB26s5CompRightTube->DefineSection(0, 0., kRB26s5CompTubeInnerR + 0.22, 11.2 / 2.);
2554 shRB26s5CompRightTube->DefineSection(1, 0.05, kRB26s5CompTubeInnerR + 0.18, 11.2 / 2.);
2555 shRB26s5CompRightTube->DefineSection(2, 0.22, kRB26s5CompTubeInnerR, 11.2 / 2. - 0.22);
2556 shRB26s5CompRightTube->DefineSection(3, 0.44, kRB26s5CompTubeInnerR, 11.2 / 2.);
2557 shRB26s5CompRightTube->DefineSection(4, 1.70, kRB26s5CompTubeInnerR, 11.2 / 2.);
2558 shRB26s5CompRightTube->DefineSection(5, 2.10, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2559 shRB26s5CompRightTube->DefineSection(6, 2.80, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2560 shRB26s5CompRightTube->DefineSection(7, 2.80, kRB26s5CompTubeInnerR, 11.3 / 2.);
2561 shRB26s5CompRightTube->DefineSection(8, 3.40, kRB26s5CompTubeInnerR, 11.3 / 2.);
2562 // Normal pipe
2563 shRB26s5CompRightTube->DefineSection(9, 3.50, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2564 shRB26s5CompRightTube->DefineSection(10, 2. * kRB26s5WeldingTubeRightL, kRB26s5CompTubeInnerR, kRB26s5CompTubeOuterR);
2565
2566 TGeoVolume* voRB26s5CompRightTube = new TGeoVolume("RB26s5CompRightTube", shRB26s5CompRightTube, kMedSteelHC);
2567 voRB26s5Compensator->AddNode(voRB26s5CompRightTube, 1,
2568 new TGeoTranslation(0., 0., kRB26s5CompL - 2. * kRB26s5WeldingTubeRightL));
2569 //
2570 // [Pos 4] Ring
2571 //
2572 TGeoTube* shRB26s5CompRing = new TGeoTube(kRB26s5RingInnerR, kRB26s5RingOuterR, kRB26s5RingL);
2573 TGeoVolume* voRB26s5CompRing = new TGeoVolume("RB26s5CompRing", shRB26s5CompRing, kMedSteelHC);
2574 voRB26s5Compensator->AddNode(voRB26s5CompRing, 1, new TGeoTranslation(0., 0., kRB26s5RingZ + kRB26s5RingL));
2575
2576 //
2577 // [Pos 5] Outer Protecting Tube
2578 //
2579 TGeoTube* shRB26s5CompProtTube = new TGeoTube(kRB26s5RingOuterR, kRB26s5ProtOuterR, kRB26s5ProtL);
2580 TGeoVolume* voRB26s5CompProtTube = new TGeoVolume("RB26s5CompProtTube", shRB26s5CompProtTube, kMedSteelHC);
2581 voRB26s5Compensator->AddNode(voRB26s5CompProtTube, 1, new TGeoTranslation(0., 0., kRB26s5ProtZ + kRB26s5ProtL));
2582
2584 // RB26/4 Fixed Point Section //
2585 // Drawing LHCVC2a_0016 //
2587 const Float_t kRB26s4TubeRi = 30.30 / 2.; // Tube inner radius (0.3 cm added for welding)
2588 const Float_t kRB26s4TubeRo = 30.60 / 2.; // Tube outer radius
2589 const Float_t kRB26s4FixedPointL = 12.63; // Length of the fixed point section
2590 const Float_t kRB26s4FixedPointZ = 10.53; // Position of the ring (0.15 added for welding)
2591 const Float_t kRB26s4FixedPointD = 0.595; // Width of the ring
2592 const Float_t kRB26s4FixedPointR = 31.60 / 2.; // Radius of the ring
2593
2594 TGeoPcon* shRB26s4FixedPoint = new TGeoPcon(0., 360., 6);
2595 z0 = 0.;
2596 shRB26s4FixedPoint->DefineSection(0, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2597 z0 += kRB26s4FixedPointZ;
2598 shRB26s4FixedPoint->DefineSection(1, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2599 shRB26s4FixedPoint->DefineSection(2, z0, kRB26s4TubeRi, kRB26s4FixedPointR);
2600 z0 += kRB26s4FixedPointD;
2601 shRB26s4FixedPoint->DefineSection(3, z0, kRB26s4TubeRi, kRB26s4FixedPointR);
2602 shRB26s4FixedPoint->DefineSection(4, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2603 z0 = kRB26s4FixedPointL;
2604 shRB26s4FixedPoint->DefineSection(5, z0, kRB26s4TubeRi, kRB26s4TubeRo);
2605 TGeoVolume* voRB26s4FixedPoint = new TGeoVolume("RB26s4FixedPoint", shRB26s4FixedPoint, kMedSteelHC);
2606
2607 TGeoVolume* voRB26s4FixedPointM =
2608 new TGeoVolume("RB26s4FixedPointM", MakeMotherFromTemplate(shRB26s4FixedPoint), kMedVacHC);
2609 voRB26s4FixedPointM->AddNode(voRB26s4FixedPoint, 1, gGeoIdentity);
2610
2612 // RB26/4 Split Flange //
2613 // Drawing LHCVFX__0005 //
2615 const Float_t kRB26s4SFlangeL = 2.99; // Length of the flange
2616 const Float_t kRB26s4SFlangeD1 = 0.85; // Length of section 1
2617 const Float_t kRB26s4SFlangeD2 = 0.36; // Length of section 2
2618 const Float_t kRB26s4SFlangeD3 = 0.73 + 1.05; // Length of section 3
2619 const Float_t kRB26s4SFlangeRo = 36.20 / 2.; // Flange outer radius
2620 const Float_t kRB26s4SFlangeRi1 = 30.60 / 2.; // Flange inner radius section 1
2621 const Float_t kRB26s4SFlangeRi2 = 30.00 / 2.; // Flange inner radius section 2
2622 const Float_t kRB26s4SFlangeRi3 = 30.60 / 2.; // Flange inner radius section 3
2623 z0 = 0;
2624 TGeoPcon* shRB26s4SFlange = new TGeoPcon(0., 360., 6);
2625 z0 = 0.;
2626 shRB26s4SFlange->DefineSection(0, z0, kRB26s4SFlangeRi1, kRB26s4SFlangeRo);
2627 z0 += kRB26s4SFlangeD1;
2628 shRB26s4SFlange->DefineSection(1, z0, kRB26s4SFlangeRi1, kRB26s4SFlangeRo);
2629 shRB26s4SFlange->DefineSection(2, z0, kRB26s4SFlangeRi2, kRB26s4SFlangeRo);
2630 z0 += kRB26s4SFlangeD2;
2631 shRB26s4SFlange->DefineSection(3, z0, kRB26s4SFlangeRi2, kRB26s4SFlangeRo);
2632 shRB26s4SFlange->DefineSection(4, z0, kRB26s4SFlangeRi3, kRB26s4SFlangeRo);
2633 z0 += kRB26s4SFlangeD3;
2634 shRB26s4SFlange->DefineSection(5, z0, kRB26s4SFlangeRi3, kRB26s4SFlangeRo);
2635 TGeoVolume* voRB26s4SFlange = new TGeoVolume("RB26s4SFlange", shRB26s4SFlange, kMedSteelHC);
2636
2637 TGeoVolume* voRB26s4SFlangeM =
2638 new TGeoVolume("RB26s4SFlangeM", MakeMotherFromTemplate(shRB26s4SFlange, 0, 3), kMedVacHC);
2639 voRB26s4SFlangeM->AddNode(voRB26s4SFlange, 1, gGeoIdentity);
2640
2642 // RB26/5 Rotable Flange //
2643 // Drawing LHCVFX__0009 //
2645 const Float_t kRB26s5RFlangeL = 1.86; // Length of the flange
2646 const Float_t kRB26s5RFlangeD1 = 0.61; // Length of section 1
2647 const Float_t kRB26s5RFlangeD2 = 0.15; // Length of section 2
2648 const Float_t kRB26s5RFlangeD3 = 0.60; // Length of section 3
2649 const Float_t kRB26s5RFlangeD4 = 0.50; // Length of section 4
2650 const Float_t kRB26s5RFlangeRo = 15.20 / 2.; // Flange outer radius
2651 const Float_t kRB26s5RFlangeRi1 = 10.30 / 2.; // Flange inner radius section 1
2652 const Float_t kRB26s5RFlangeRi2 = 10.00 / 2.; // Flange inner radius section 2
2653 const Float_t kRB26s5RFlangeRi3 = 10.30 / 2.; // Flange inner radius section 3
2654 const Float_t kRB26s5RFlangeRi4 = 10.50 / 2.; // Flange inner radius section 4
2655
2656 z0 = 0;
2657 TGeoPcon* shRB26s5RFlange = new TGeoPcon(0., 360., 8);
2658 z0 = 0.;
2659 shRB26s5RFlange->DefineSection(0, z0, kRB26s5RFlangeRi4, kRB26s5RFlangeRo);
2660 z0 += kRB26s5RFlangeD4;
2661 shRB26s5RFlange->DefineSection(1, z0, kRB26s5RFlangeRi4, kRB26s5RFlangeRo);
2662 shRB26s5RFlange->DefineSection(2, z0, kRB26s5RFlangeRi3, kRB26s5RFlangeRo);
2663 z0 += kRB26s5RFlangeD3;
2664 shRB26s5RFlange->DefineSection(3, z0, kRB26s5RFlangeRi3, kRB26s5RFlangeRo);
2665 shRB26s5RFlange->DefineSection(4, z0, kRB26s5RFlangeRi2, kRB26s5RFlangeRo);
2666 z0 += kRB26s5RFlangeD2;
2667 shRB26s5RFlange->DefineSection(5, z0, kRB26s5RFlangeRi2, kRB26s5RFlangeRo);
2668 shRB26s5RFlange->DefineSection(6, z0, kRB26s5RFlangeRi1, kRB26s5RFlangeRo);
2669 z0 += kRB26s5RFlangeD1;
2670 shRB26s5RFlange->DefineSection(7, z0, kRB26s5RFlangeRi1, kRB26s5RFlangeRo);
2671 TGeoVolume* voRB26s5RFlange = new TGeoVolume("RB26s5RFlange", shRB26s5RFlange, kMedSteelHC);
2672
2673 TGeoVolume* voRB26s5RFlangeM =
2674 new TGeoVolume("RB26s5RFlangeM", MakeMotherFromTemplate(shRB26s5RFlange, 4, 7), kMedVacHC);
2675 voRB26s5RFlangeM->AddNode(voRB26s5RFlange, 1, gGeoIdentity);
2676
2677 //
2678 // Assemble RB26/1-2
2679 //
2680 TGeoVolumeAssembly* asRB26s12 = new TGeoVolumeAssembly("RB26s12");
2681 z0 = 0.;
2682 // asRB26s12->AddNode(voRB26s1RFlange, 1, gGeoIdentity);
2683 barrel->AddNode(voRB26s1RFlange, 1, new TGeoCombiTrans(0., 30., -82, rot180));
2684 z0 += kRB26s1RFlangeIsL + kRB26s1RFlangeFpL;
2685 barrel->AddNode(voRB26s12TubeM, 1, new TGeoCombiTrans(0., 30., -82. - z0, rot180));
2686 z0 += kRB26s12TubeL;
2687 asRB26s12->AddNode(voRB26s12msTubeM, 1, new TGeoTranslation(0., 0., z0));
2688 z0 += kRB26s12TubeL2;
2689 asRB26s12->AddNode(voRB26s2Compensator, 1, new TGeoTranslation(0., 0., z0));
2690 z0 += kRB26s2CompL;
2691 z0 -= kRB26s2FFlangeD1;
2692 asRB26s12->AddNode(voRB26s2FFlangeM, 1, new TGeoTranslation(0., 0., z0));
2693 z0 += kRB26s2FFlangeL;
2694 const Float_t kRB26s12L = z0;
2695
2696 //
2697 // Assemble RB26/3
2698 //
2699 TGeoVolumeAssembly* asRB26s3 = new TGeoVolumeAssembly("RB26s3");
2700 z0 = 0.;
2701 asRB26s3->AddNode(voRB26s3SFlangeM, 1, gGeoIdentity);
2702 z0 += kRB26s3SFlangeL;
2703 z0 -= kRB26s3SFlangeD3;
2704 asRB26s3->AddNode(voRB26s3FixedPointM, 1, new TGeoTranslation(0., 0., z0));
2705 z0 += kRB26s3FixedPointL;
2706 asRB26s3->AddNode(voRB26s3TubeM, 1, new TGeoTranslation(0., 0., z0));
2707 z0 += kRB26s3TubeL;
2708 asRB26s3->AddNode(voRB26s3Compensator, 1, new TGeoTranslation(0., 0., z0));
2709 z0 += kRB26s3CompL;
2710 z0 -= kRB26s3FFlangeD1;
2711 asRB26s3->AddNode(voRB26s3FFlangeM, 1, new TGeoTranslation(0., 0., z0));
2712 z0 += kRB26s3FFlangeL;
2713 const Float_t kRB26s3L = z0;
2714
2715 //
2716 // Assemble RB26/4-5
2717 //
2718 TGeoVolumeAssembly* asRB26s45 = new TGeoVolumeAssembly("RB26s45");
2719 z0 = 0.;
2720 asRB26s45->AddNode(voRB26s4SFlangeM, 1, gGeoIdentity);
2721 z0 += kRB26s4SFlangeL;
2722 z0 -= kRB26s4SFlangeD3;
2723 asRB26s45->AddNode(voRB26s4FixedPointM, 1, new TGeoTranslation(0., 0., z0));
2724 z0 += kRB26s4FixedPointL;
2725 asRB26s45->AddNode(voRB26s45TubeM, 1, new TGeoTranslation(0., 0., z0));
2726 z0 += kRB26s45TubeL;
2727 asRB26s45->AddNode(voRB26s5Compensator, 1, new TGeoTranslation(0., 0., z0));
2728 z0 += kRB26s5CompL;
2729 z0 -= kRB26s5RFlangeD3;
2730 z0 -= kRB26s5RFlangeD4;
2731 asRB26s45->AddNode(voRB26s5RFlangeM, 1, new TGeoTranslation(0., 0., z0));
2732 z0 += kRB26s5RFlangeL;
2733 const Float_t kRB26s45L = z0;
2734
2735 //
2736 // Assemble RB26
2737 //
2738 TGeoVolumeAssembly* asRB26Pipe = new TGeoVolumeAssembly("RB26Pipe");
2739 z0 = 0.;
2740 asRB26Pipe->AddNode(asRB26s12, 1, new TGeoTranslation(0., 0., z0));
2741 z0 += kRB26s12L;
2742 asRB26Pipe->AddNode(asRB26s3, 1, new TGeoTranslation(0., 0., z0));
2743 z0 += kRB26s3L;
2744 asRB26Pipe->AddNode(asRB26s45, 1, new TGeoTranslation(0., 0., z0));
2745 z0 += kRB26s45L;
2746 top->AddNode(asRB26Pipe, 1, new TGeoCombiTrans(0., 0., -82., rot180));
2747}
2748
2749void Pipe::createMaterials()
2750{
2751 //
2752 // Define materials for beam pipe
2753 //
2754 Int_t isxfld = 2.;
2755 Float_t sxmgmx = 10.;
2757
2758 // Steel (Inox)
2759 Float_t asteel[4] = {55.847, 51.9961, 58.6934, 28.0855};
2760 Float_t zsteel[4] = {26., 24., 28., 14.};
2761 Float_t wsteel[4] = {.715, .18, .1, .005};
2762 // AlBe - alloy
2763 Float_t aAlBe[2] = {26.98, 9.01}; // al=2.702 be=1.8477
2764 Float_t zAlBe[2] = {13.00, 4.00};
2765 Float_t wAlBe[2] = {0.4, 0.6};
2766 // Polyamid
2767 Float_t aPA[4] = {16., 14., 12., 1.};
2768 Float_t zPA[4] = {8., 7., 6., 1.};
2769 Float_t wPA[4] = {1., 1., 6., 11.};
2770 // Polyimide film
2771 Float_t aPI[4] = {16., 14., 12., 1.};
2772 Float_t zPI[4] = {8., 7., 6., 1.};
2773 Float_t wPI[4] = {5., 2., 22., 10.};
2774 // Rohacell
2775 Float_t aRohacell[4] = {16., 14., 12., 1.};
2776 Float_t zRohacell[4] = {8., 7., 6., 1.};
2777 Float_t wRohacell[4] = {2., 1., 9., 13.};
2778 // Air
2779 Float_t aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
2780 Float_t zAir[4] = {6., 7., 8., 18.};
2781 Float_t wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
2782 Float_t dAir = 1.20479E-3;
2783 Float_t dAir1 = 1.20479E-11;
2784 // Insulation powder
2785 // Si O Ti Al
2786 Float_t ains[4] = {28.0855, 15.9994, 47.867, 26.982};
2787 Float_t zins[4] = {14., 8., 22., 13.};
2788 Float_t wins[4] = {0.3019, 0.4887, 0.1914, 0.018};
2789 //
2790 //
2791 // Anticorodal
2792 //
2793 // Al Si7 Mg 0.6
2794 //
2795 Float_t aaco[3] = {26.982, 28.0855, 24.035};
2796 Float_t zaco[3] = {13., 14., 12.};
2797 Float_t waco[3] = {0.924, 0.07, 0.006};
2798 // Kapton
2799 //
2800 Float_t aKapton[4] = {1.00794, 12.0107, 14.010, 15.9994};
2801 Float_t zKapton[4] = {1., 6., 7., 8.};
2802 Float_t wKapton[4] = {0.026362, 0.69113, 0.07327, 0.209235};
2803 Float_t dKapton = 1.42;
2804 // NEG coating
2805 // Ti V Zr
2806 Float_t aNEG[4] = {47.87, 50.94, 91.24};
2807 Float_t zNEG[4] = {22.00, 23.00, 40.00};
2808 Float_t wNEG[4] = {1. / 3., 1. / 3., 1. / 3.};
2809 Float_t dNEG = 5.6; // ?
2810
2811 //---------------------------------
2812 // Aluminium AA 5083 for MFT: Al Manganese(Mn) Magnesium(Mg) Chrome(Cr)
2813 Float_t aALU5083[4] = {26.982, 54.938, 24.305, 51.996}; // Mg pas meme a que la ligne Anticorodal!
2814 Float_t zALU5083[4] = {13., 25., 12., 24.};
2815 Float_t wALU5083[4] = {0.947, 0.007, 0.044, 0.0015};
2816 // Aluminium AA 2219 for MFT: Al Cu Mn Ti V Zr
2817 Float_t aALU2219[6] = {26.982, 63.546, 54.938, 47.867, 50.941, 91.224};
2818 Float_t zALU2219[6] = {13., 29., 25., 22., 23., 40.};
2819 Float_t wALU2219[6] = {0.93, 0.063, 0.003, 0.0006, 0.001, 0.0018};
2820 // Aluminium AA 7075 for beam pipe support (wings): Al Zn Mg Cu
2821 Float_t aALU7075[4] = {26.982, 65.38, 24.305, 63.546};
2822 Float_t zALU7075[4] = {13., 30., 12., 29.};
2823 Float_t wALU7075[4] = {0.902, 0.06, 0.024, 0.014};
2824 //---------------------------------
2825
2826 // ****************
2827 // Defines tracking media parameters.
2828 //
2829 Float_t epsil = .1; // Tracking precision,
2830 Float_t stemax = -0.01; // Maximum displacement for multiple scat
2831 Float_t tmaxfd = -20.; // Maximum angle due to field deflection
2832 Float_t deemax = -.3; // Maximum fractional energy loss, DLS
2833 Float_t stmin = -.8;
2834 // ***************
2835 //
2836
2837 auto& matmgr = o2::base::MaterialManager::Instance();
2838
2839 // Beryllium
2840 matmgr.Material("PIPE", 5, "BERILLIUM$", 9.01, 4., 1.848, 35.3, 36.7);
2841 matmgr.Medium("PIPE", 5, "BE", 5, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2842
2843 // Copper
2844 matmgr.Material("PIPE", 10, "COPPER", 63.55, 29, 8.96, 1.43, 85.6 / 8.96);
2845 matmgr.Material("PIPE", 30, "COPPER_NF", 63.55, 29, 8.96, 1.43, 85.6 / 8.96);
2846 matmgr.Material("PIPE", 50, "COPPER_HC", 63.55, 29, 8.96, 1.43, 85.6 / 8.96);
2847 matmgr.Material("PIPE", 70, "COPPER_NFHC", 63.55, 29, 8.96, 1.43, 85.6 / 8.96);
2848
2849 matmgr.Medium("PIPE", 10, "CU", 10, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2850 matmgr.Medium("PIPE", 30, "CU_NF", 30, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2851 matmgr.Medium("PIPE", 50, "CU_HC", 50, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2852 matmgr.Medium("PIPE", 70, "CU_NFHC", 70, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2853
2854 // Air
2855 matmgr.Mixture("PIPE", 15, "AIR$ ", aAir, zAir, dAir, 4, wAir);
2856 matmgr.Mixture("PIPE", 35, "AIR_HIGH$ ", aAir, zAir, dAir, 4, wAir);
2857 matmgr.Mixture("PIPE", 55, "AIR_NF ", aAir, zAir, dAir, 4, wAir);
2858 matmgr.Medium("PIPE", 15, "AIR", 15, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2859 matmgr.Medium("PIPE", 35, "AIR_HIGH", 35, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2860 matmgr.Medium("PIPE", 55, "AIR_NF", 55, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2861
2862 // Insulation
2863 matmgr.Mixture("PIPE", 14, "INSULATION0$", ains, zins, 0.41, 4, wins);
2864 matmgr.Medium("PIPE", 14, "INS_C0", 14, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2865
2866 //
2867 // Vacuum
2868 matmgr.Mixture("PIPE", 16, "VACUUM$ ", aAir, zAir, dAir1, 4, wAir);
2869 matmgr.Mixture("PIPE", 36, "VACUUM$_NF", aAir, zAir, dAir1, 4, wAir);
2870 matmgr.Mixture("PIPE", 56, "VACUUM$_HC ", aAir, zAir, dAir1, 4, wAir);
2871 matmgr.Mixture("PIPE", 76, "VACUUM$_NFHC", aAir, zAir, dAir1, 4, wAir);
2872
2873 matmgr.Medium("PIPE", 16, "VACUUM", 16, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2874 matmgr.Medium("PIPE", 36, "VACUUM_NF", 36, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2875 matmgr.Medium("PIPE", 56, "VACUUM_HC", 56, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2876 matmgr.Medium("PIPE", 76, "VACUUM_NFHC", 76, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2877
2878 //
2879 // Steel
2880 matmgr.Mixture("PIPE", 19, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
2881 matmgr.Mixture("PIPE", 39, "STAINLESS STEEL$_NF", asteel, zsteel, 7.88, 4, wsteel);
2882 matmgr.Mixture("PIPE", 59, "STAINLESS STEEL$_HC", asteel, zsteel, 7.88, 4, wsteel);
2883 matmgr.Mixture("PIPE", 79, "STAINLESS STEEL$_NFHC", asteel, zsteel, 7.88, 4, wsteel);
2884
2885 matmgr.Medium("PIPE", 19, "INOX", 19, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2886 matmgr.Medium("PIPE", 39, "INOX_NF", 39, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2887 matmgr.Medium("PIPE", 59, "INOX_HC", 59, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2888 matmgr.Medium("PIPE", 79, "INOX_NFHC", 79, 0, 0, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2889
2890 //----------------- for the MFT ----------------------
2891 matmgr.Mixture("PIPE", 63, "ALUMINIUM5083$", aALU5083, zALU5083, 2.66, 4, wALU5083); // from aubertduval.fr
2892 matmgr.Mixture("PIPE", 64, "ALUMINIUM2219$", aALU2219, zALU2219, 2.84, 6, wALU2219); // from aubertduval.fr
2893 matmgr.Medium("PIPE", 63, "AA5083", 63, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2894 matmgr.Medium("PIPE", 64, "AA2219", 64, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2895
2896 //----------------------------------------------------
2897 matmgr.Mixture("PIPE", 65, "PI$", aPI, zPI, 1.42, -4, wPI);
2898 matmgr.Medium("PIPE", 65, "POLYIMIDE", 65, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2899
2900 //---------------------------------
2901 // Carbon Fiber M55J
2902 matmgr.Material("PIPE", 66, "M55J6K$", 12.0107, 6, 1.92, 999, 999);
2903 matmgr.Medium("PIPE", 66, "M55J6K", 66, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2904
2905 // Rohacell
2906 matmgr.Mixture("PIPE", 67, "Rohacell$", aRohacell, zRohacell, 0.03, -4, wRohacell);
2907 matmgr.Medium("PIPE", 67, "ROHACELL", 67, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2908
2909 // Titanium
2910 matmgr.Material("PIPE", 22, "Titanium$", 47.867, 22, 4.54, 3.560, 27.80);
2911 matmgr.Medium("PIPE", 22, "TITANIUM", 22, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2912
2913 // Alu 7075 (ZICRAL)
2914 matmgr.Mixture("PIPE", 68, "ALUMINIUM7075$", aALU7075, zALU7075, 2.810, -4, wALU7075);
2915 matmgr.Medium("PIPE", 68, "AA7075", 68, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
2916}
2917
2918TGeoPcon* Pipe::MakeMotherFromTemplate(const TGeoPcon* shape, Int_t imin, Int_t imax, Float_t r0, Int_t nz)
2919{
2920 //
2921 // Create a mother shape from a template setting some min radii to 0
2922 //
2923 Int_t nz0 = shape->GetNz();
2924 // if nz > -1 the number of planes is given by nz
2925 if (nz != -1) {
2926 nz0 = nz;
2927 }
2928 TGeoPcon* mother = new TGeoPcon(0., 360., nz0);
2929
2930 if (imin == -1 || imax == -1) {
2931 imin = 0;
2932 imax = shape->GetNz();
2933 } else if (imax >= nz0) {
2934 imax = nz0 - 1;
2935 printf("Warning: imax reset to nz-1 %5d %5d %5d %5d\n", imin, imax, nz, nz0);
2936 }
2937
2938 // construct the sections dynamically since duplications have to be avoided
2939 std::vector<double> pconparams;
2940 pconparams.reserve(nz0);
2941 pconparams.push_back(0.);
2942 pconparams.push_back(360);
2943 pconparams.push_back(nz0);
2944 int zplanecounter = 0;
2945
2946 auto addSection = [&pconparams, &zplanecounter](double z, double rmin, double rmax) {
2947 pconparams.push_back(z);
2948 pconparams.push_back(rmin);
2949 pconparams.push_back(rmax);
2950 zplanecounter++;
2951 };
2952
2953 double zlast, rminlast, rmaxlast;
2954 for (Int_t i = 0; i < shape->GetNz(); i++) {
2955 Double_t rmin = shape->GetRmin(i);
2956 if ((i >= imin) && (i <= imax)) {
2957 rmin = r0;
2958 }
2959 Double_t rmax = shape->GetRmax(i);
2960 Double_t z = shape->GetZ(i);
2961 if (i == 0 || (z != zlast || rmin != rminlast || rmax != rmaxlast)) {
2962 addSection(z, rmin, rmax);
2963 }
2964 zlast = z;
2965 rminlast = rmin;
2966 rmaxlast = rmax;
2967 }
2968 // correct dimension (unless the user chose the number of sections)
2969 if (nz == -1) {
2970 pconparams[2] = zplanecounter;
2971 // reinit polycon from parameters
2972 mother->SetDimensions(pconparams.data());
2973 } else {
2974 for (Int_t i = 0; i < zplanecounter; i++) {
2975 mother->DefineSection(i, pconparams[3 + 3 * i], pconparams[4 + 3 * i], pconparams[5 + 3 * i]);
2976 }
2977 }
2978
2979 return mother;
2980}
2981
2982TGeoPcon* Pipe::MakeInsulationFromTemplate(TGeoPcon* shape)
2983{
2984 //
2985 // Create an beam pipe insulation layer shape from a template
2986 //
2987 Int_t nz = shape->GetNz();
2988 TGeoPcon* insu = new TGeoPcon(0., 360., nz);
2989
2990 for (Int_t i = 0; i < nz; i++) {
2991 Double_t z = shape->GetZ(i);
2992 Double_t rmin = shape->GetRmin(i);
2993 Double_t rmax = shape->GetRmax(i);
2994 rmax += 0.5;
2995 shape->DefineSection(i, z, rmin, rmax);
2996 rmin = rmax - 0.5;
2997 insu->DefineSection(i, z, rmin, rmax);
2998 }
2999 return insu;
3000}
3001
3002TGeoVolume* Pipe::MakeBellow(const char* ext, Int_t nc, Float_t rMin, Float_t rMax, Float_t dU, Float_t rPlie,
3003 Float_t dPlie)
3004{
3005 // nc Number of convolution
3006 // rMin Inner radius of the bellow
3007 // rMax Outer radius of the bellow
3008 // dU Undulation length
3009 // rPlie Plie radius
3010 // dPlie Plie thickness
3011 auto& matmgr = o2::base::MaterialManager::Instance();
3012 const TGeoMedium* kMedVac = matmgr.getTGeoMedium("PIPE_VACUUM");
3013 const TGeoMedium* kMedSteel = matmgr.getTGeoMedium("PIPE_INOX");
3014 //
3015 // Upper part of the undulation
3016 //
3017 std::string name, nameA, nameB;
3018 TGeoTorus* shPlieTorusU = new TGeoTorus(rMax - rPlie, rPlie - dPlie, rPlie);
3019 nameA = fmt::format("{:s}TorusU", ext);
3020 shPlieTorusU->SetName(nameA.c_str());
3021 TGeoTube* shPlieTubeU = new TGeoTube(rMax - rPlie, rMax, rPlie);
3022 nameB = fmt::format("{:s}TubeU", ext);
3023 shPlieTubeU->SetName(nameB.c_str());
3024 name = fmt::format("{:s}UpperPlie", ext);
3025 TGeoCompositeShape* shUpperPlie = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}", nameA, nameB).c_str());
3026
3027 TGeoVolume* voWiggleU = new TGeoVolume(name.c_str(), shUpperPlie, kMedSteel);
3028 //
3029 // Lower part of the undulation
3030 TGeoTorus* shPlieTorusL = new TGeoTorus(rMin + rPlie, rPlie - dPlie, rPlie);
3031 nameA = fmt::format("{:s}TorusL", ext);
3032 shPlieTorusL->SetName(nameA.c_str());
3033 TGeoTube* shPlieTubeL = new TGeoTube(rMin, rMin + rPlie, rPlie);
3034 nameB = fmt::format("{:s}TubeL", ext);
3035 shPlieTubeL->SetName(nameB.c_str());
3036 name = fmt::format("{:s}LowerPlie", ext);
3037 TGeoCompositeShape* shLowerPlie = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}", nameA, nameB).c_str());
3038
3039 TGeoVolume* voWiggleL = new TGeoVolume(name.c_str(), shLowerPlie, kMedSteel);
3040
3041 //
3042 // Connection between upper and lower part of undulation
3043 TGeoVolume* voWiggleC1 = new TGeoVolume(fmt::format("{:s}PlieConn1", ext).c_str(), new TGeoTube(rMin + rPlie, rMax - rPlie, dPlie / 2.), kMedSteel);
3044 //
3045 // One wiggle
3046 Float_t dz = rPlie - dPlie / 2.;
3047 Float_t z0 = -dPlie / 2.;
3048 TGeoVolumeAssembly* asWiggle = new TGeoVolumeAssembly(fmt::format("{:s}Wiggle", ext).c_str());
3049 asWiggle->AddNode(voWiggleC1, 1, new TGeoTranslation(0., 0., z0));
3050 z0 += dz;
3051 asWiggle->AddNode(voWiggleU, 1, new TGeoTranslation(0., 0., z0));
3052 z0 += dz;
3053 asWiggle->AddNode(voWiggleC1, 2, new TGeoTranslation(0., 0., z0));
3054 z0 += dz;
3055 asWiggle->AddNode(voWiggleL, 1, new TGeoTranslation(0., 0., z0));
3056 asWiggle->GetShape()->ComputeBBox(); // enforce recomputing of BBox
3057 //
3058 Float_t zBellowTot = nc * (static_cast<TGeoBBox*>(asWiggle->GetShape()))->GetDZ();
3059 TGeoVolume* voBellow = new TGeoVolume(fmt::format("{:s}BellowUS", ext).c_str(), new TGeoTube(rMin, rMax, zBellowTot), kMedVac);
3060 // Positioning of the volumes
3061 z0 = -dU / 2. + rPlie;
3062 voBellow->AddNode(voWiggleL, 2, new TGeoTranslation(0., 0., z0));
3063 z0 += rPlie;
3064 Float_t zsh = 4. * rPlie - 2. * dPlie;
3065 for (Int_t iw = 0; iw < nc; iw++) {
3066 Float_t zpos = z0 + iw * zsh;
3067 voBellow->AddNode(asWiggle, iw + 1, new TGeoTranslation(0., 0., zpos - dPlie));
3068 }
3069 return voBellow;
3070}
3071
3072TGeoVolume* Pipe::MakeBellowCside(const char* ext, Int_t nc, Float_t rMin, Float_t rMax, Float_t rPlie, Float_t dPlie)
3073{
3074 // nc Number of convolution
3075 // rMin Inner radius of the bellow
3076 // rMax Outer radius of the bellow
3077 // dU Undulation length
3078 // rPlie Plie radius
3079 // dPlie Plie thickness
3080 auto& matmgr = o2::base::MaterialManager::Instance();
3081 const TGeoMedium* kMedVac = matmgr.getTGeoMedium("PIPE_VACUUM");
3082 const TGeoMedium* kMedAlu5083 = matmgr.getTGeoMedium("PIPE_AA5083"); // fm
3083
3084 Float_t dU = nc * (4. * rPlie - 2. * dPlie);
3085
3086 std::string name, nameA, nameB;
3087 name = fmt::format("{:s}BellowUS", ext);
3088 // TGeoVolume* voBellow = new TGeoVolume(name, new TGeoTube(rMin, rMax, dU/2.), kMedVac);
3089 TGeoVolumeAssembly* voBellow = new TGeoVolumeAssembly(name.c_str());
3090 //
3091 // Upper part of the undulation
3092 //
3093
3094 TGeoTorus* shPlieTorusU = new TGeoTorus(rMax - rPlie, rPlie - dPlie, rPlie);
3095 nameA = fmt::format("{:s}TorusU", ext);
3096 shPlieTorusU->SetName(nameA.c_str());
3097 TGeoTube* shPlieTubeU = new TGeoTube(rMax - rPlie, rMax, rPlie);
3098 nameB = fmt::format("{:s}TubeU", ext);
3099 shPlieTubeU->SetName(nameB.c_str());
3100 name = fmt::format("{:s}UpperPlie", ext);
3101 TGeoCompositeShape* shUpperPlie = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}", nameA, nameB).c_str());
3102
3103 TGeoVolume* voWiggleU = new TGeoVolume(name.c_str(), shUpperPlie, kMedAlu5083);
3104 voWiggleU->SetLineColor(kOrange); // fm
3105
3106 // First Lower part of the ondulation
3107 TGeoTorus* shPlieTorusL = new TGeoTorus(rMin + rPlie, rPlie - dPlie, rPlie);
3108 nameA = fmt::format("{:s}TorusL", ext);
3109 shPlieTorusL->SetName(nameA.c_str());
3110 TGeoTranslation* t1 = new TGeoTranslation("t1", 0, 0, -rPlie / 2.);
3111 t1->RegisterYourself();
3112
3113 TGeoTube* shPlieTubeL = new TGeoTube(rMin, rMin + rPlie, rPlie / 2.);
3114 nameB = fmt::format("{:s}TubeL", ext);
3115 shPlieTubeL->SetName(nameB.c_str());
3116 name = fmt::format("{:s}LowerPlie", ext);
3117 TGeoCompositeShape* shLowerPlie1 = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}:t1", nameA, nameB).c_str());
3118
3119 TGeoVolume* voWiggleL1 = new TGeoVolume(name.c_str(), shLowerPlie1, kMedAlu5083);
3120 voWiggleL1->SetLineColor(kOrange); // fm
3121
3122 // Second Lower part of the undulation
3123 TGeoTranslation* t2 = new TGeoTranslation("t2", 0, 0, rPlie / 2.);
3124 t2->RegisterYourself();
3125
3126 TGeoCompositeShape* shLowerPlie2 = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}*{:s}:t2", nameA, nameB).c_str());
3127
3128 TGeoVolume* voWiggleL2 = new TGeoVolume(name.c_str(), shLowerPlie2, kMedAlu5083);
3129 voWiggleL2->SetLineColor(kOrange); // fm
3130
3131 // Connection between upper and lower part of undulation
3132 name = fmt::format("{:s}PlieConn1", ext);
3133 TGeoVolume* voWiggleC1 = new TGeoVolume(name.c_str(), new TGeoTube(rMin + rPlie, rMax - rPlie, dPlie / 2.), kMedAlu5083);
3134 voWiggleC1->SetLineColor(kOrange); // fm
3135
3136 //
3137 // Vacuum Part
3138 //
3139
3140 //--Upper part of the ondulation
3141
3142 TGeoTorus* vacPlieTorusU = new TGeoTorus(rMax - rPlie, 0., rPlie - dPlie);
3143 nameA = fmt::format("{:s}vacTorusU", ext);
3144 vacPlieTorusU->SetName(nameA.c_str());
3145 TGeoTube* vacPlieTubeU = new TGeoTube(0., rMax - rPlie, rPlie - dPlie);
3146 nameB = fmt::format("{:s}vacTubeU", ext);
3147 vacPlieTubeU->SetName(nameB.c_str());
3148 name = fmt::format("{:s}vacUpperPlie", ext);
3149 TGeoCompositeShape* vacUpperPlie = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}+{:s}", nameA, nameB).c_str());
3150
3151 TGeoVolume* voVacWiggleU = new TGeoVolume(name.c_str(), vacUpperPlie, kMedVac);
3152 voVacWiggleU->SetVisibility(0);
3153
3154 // First Lower part of the undulation
3155 TGeoTorus* vacPlieTorusL = new TGeoTorus(rMin + rPlie, 0., rPlie);
3156 nameA = fmt::format("{:s}vacTorusL", ext);
3157 vacPlieTorusL->SetName(nameA.c_str());
3158
3159 TGeoTube* vacPlieTubeL = new TGeoTube(0., rMin + rPlie, rPlie / 2.);
3160 nameB = fmt::format("{:s}vacTubeL", ext);
3161 vacPlieTubeL->SetName(nameB.c_str());
3162 name = fmt::format("{:s}vacLowerPlie", ext);
3163 TGeoCompositeShape* vacLowerPlie1 = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}:t1-{:s}", nameB, nameA).c_str());
3164
3165 TGeoVolume* voVacWiggleL1 = new TGeoVolume(name.c_str(), vacLowerPlie1, kMedVac);
3166 voVacWiggleL1->SetVisibility(0);
3167
3168 // Second Lower part of the undulation
3169 TGeoCompositeShape* vacLowerPlie2 = new TGeoCompositeShape(name.c_str(), fmt::format("{:s}:t2-{:s}", nameB, nameA).c_str());
3170
3171 TGeoVolume* voVacWiggleL2 = new TGeoVolume(name.c_str(), vacLowerPlie2, kMedVac);
3172 voVacWiggleL2->SetVisibility(0);
3173
3174 // One wiggle
3175 Float_t dz = rPlie - dPlie / 2.;
3176 Float_t z0 = 2. * rPlie;
3177 name = fmt::format("{:s}Wiggle", ext);
3178 TGeoVolumeAssembly* asWiggle = new TGeoVolumeAssembly(name.c_str());
3179
3180 asWiggle->AddNode(voWiggleL1, 1, new TGeoTranslation(0., 0., z0));
3181 asWiggle->AddNode(voVacWiggleL1, 1, new TGeoTranslation(0., 0., z0));
3182 z0 -= dz;
3183 asWiggle->AddNode(voWiggleC1, 1, new TGeoTranslation(0., 0., z0));
3184 z0 -= dz;
3185 asWiggle->AddNode(voWiggleU, 1, new TGeoTranslation(0., 0., z0));
3186 asWiggle->AddNode(voVacWiggleU, 1, new TGeoTranslation(0., 0., z0));
3187 z0 -= dz;
3188 asWiggle->AddNode(voWiggleC1, 2, new TGeoTranslation(0., 0., z0));
3189 z0 -= dz;
3190 asWiggle->AddNode(voWiggleL2, 1, new TGeoTranslation(0., 0., z0));
3191 asWiggle->AddNode(voVacWiggleL2, 1, new TGeoTranslation(0., 0., z0));
3192
3193 // Positioning of the volumes
3194 z0 = +dU / 2.;
3195 Float_t zsh = 4. * dz;
3196 // for (Int_t iw = 0; iw < 1; iw++) {
3197 for (Int_t iw = 0; iw < nc; iw++) {
3198 Float_t zpos = z0 - iw * zsh;
3199 voBellow->AddNode(asWiggle, iw + 1, new TGeoTranslation(0., 0., zpos));
3200 }
3201 return voBellow;
3202}
3203
3204// ----------------------------------------------------------------------------
3205FairModule* 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:3205
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
GLint y
Definition glcorearb.h:270
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