Project
Loading...
Searching...
No Matches
TRKServices.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
13#include <Framework/Logger.h>
14
15#include <TColor.h>
16#include <TGeoBBox.h>
17#include <TGeoCompositeShape.h>
18#include <TGeoNode.h>
19#include <TGeoTube.h>
20#include <TGeoVolume.h>
21#include <TMath.h>
23#include <TRKBase/Specs.h>
26
27#include <Rtypes.h>
28
29#include <cmath>
30#include <numeric>
31#include <string>
32
33namespace o2
34{
35namespace trk
36{
37
39{
40 int ifield = 2; // ?
41 float fieldm = 10.0; // ?
42
43 // Defines tracking media parameters.
44 float epsil = .1; // Tracking precision,
45 float stemax = -0.01; // Maximum displacement for multiple scat
46 float tmaxfd = -20.; // Maximum angle due to field deflection
47 float deemax = -.3; // Maximum fractional energy loss, DLS
48 float stmin = -.8;
49
51
52 // Ceramic (Aluminium Oxide)
53 float aCer[2] = {26.981538, 15.9994};
54 float zCer[2] = {13., 8.};
55 float wCer[2] = {0.5294, 0.4706}; // Mass %, which makes sense. TODO: check if Mixture needs mass% or comp%
56 float dCer = 3.97;
57
58 // Air
59 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
60 float zAir[4] = {6., 7., 8., 18.};
61 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
62 float dAir = 1.20479E-3;
63 float dAir1 = 1.20479E-11; // vacuum denisity inside pipe
64
65 // Water
66 float aWater[2] = {1.00794, 15.9994};
67 float zWater[2] = {1., 8.};
68 float wWater[2] = {0.111894, 0.888106};
69 float dWater = 1.0;
70
71 // Fused silica SiO2 https://pdg.lbl.gov/2023/AtomicNuclearProperties/HTML/silicon_dioxide_fused_quartz.html
72 float aSiO2[2] = {28.0855, 15.9990};
73 float zSiO2[2] = {14., 8.};
74 float wSiO2[2] = {0.467, 0.533};
75 float dSiO2 = 2.2;
76
77 // Polyethylene from alice 2 absorber
78 float aPolyethylene[2] = {12.01, 1.};
79 float zPolyethylene[2] = {6., 1.};
80 float wPolyethylene[2] = {.33, .67};
81
82 // Polyurethane [HN-CO-O] from alice 2 mft
83 int nPolyurethane = 4;
84 float aPolyurethane[4] = {1.00794, 14.010, 12.0107, 15.9994};
85 float zPolyurethane[4] = {1.0, 7.0, 6.0, 8.0};
86 float wPolyurethane[4] = {0.017077588, 0.237314387, 0.203327619, 0.542280405};
87 float dPolyurethane = 1.25;
88
89 // Aluminium 5083 - alloy of Mn, Fe, Cu, Mg, Si, Zn, Cr, Ti, Al
90 // Al5083 is considered as material for the iris vacuum vessel
91 // https://www.smithmetal.com/5083.htm
92 float aAl5083[9] = {54.938, 55.845, 63.546, 24.305, 28.086, 65.38, 51.996, 47.867, 26.982};
93 float zAl5083[9] = {25., 26., 29., 12., 14., 30., 24., 22., 13.};
94 // The concentration of certain metals in Al5083 have a range. What will be used for the alloy for the iris vacuum vessel will have to be checked
95 float wAl5083[9] = {0.007, 0.004, 0.001, 0.0445, 0.004, 0.0025, 0.0015, 0.0015, 0.934};
96 float dAl5083 = 2.650;
97
98 // AlBeMet AM162H is a nanocomposite, not an alloy
99 // Considered here as well https://indico.cern.ch/event/1168385/contributions/5355805/attachments/2681743/4652030/Jul%2010%201030-1045%20AM%20(Hawaii)%20M1Or1C-05%20AlBeMet.pdf
100 float aAlBeMet[2] = {26.982, 9.012};
101 float zAlBeMet[2] = {13., 4.};
102 float wAlBeMet[2] = {0.38, 0.62};
103 float dAlBeMet = 2.071;
104
105 matmgr.Mixture("ALICE3_TRKSERVICES", 66, "CERAMIC", aCer, zCer, dCer, 2, wCer); // Ceramic for cold plate
106 matmgr.Mixture("ALICE3_TRKSERVICES", 68, "AIR", aAir, zAir, dAir, 4, wAir); // Air for placeholding cables
107 matmgr.Mixture("ALICE3_TRKSERVICES", 69, "POLYETHYLENE", aPolyethylene, zPolyethylene, .95, 2, wPolyethylene); // Polyethylene for fibers
108 matmgr.Mixture("ALICE3_TRKSERVICES", 70, "POLYURETHANE", aPolyurethane, zPolyurethane, dPolyurethane, nPolyurethane, wPolyurethane); // Polyurethane for cooling pipes
109 matmgr.Mixture("ALICE3_TRKSERVICES", 71, "SILICONDIOXIDE", aSiO2, zSiO2, dSiO2, 2, wSiO2); // Fused silica SiO2
110 matmgr.Mixture("ALICE3_TRKSERVICES", 72, "WATER", aWater, zWater, dWater, 2, wWater); // Water for cooling pipes
111 matmgr.Material("ALICE3_TRKSERVICES", 67, "COPPER", 63.546, 29, 8.96, 1.43, 15.1); // Copper for cables
112 matmgr.Material("ALICE3_TRKSERVICES", 73, "BERYLLIUM", 9.01, 4., 1.848, 35.3, 36.7); // Beryllium - Candidate for IRIS vacuum vessel
113 matmgr.Mixture("ALICE3_TRKSERVICES", 74, "ALUMINIUM5083", aAl5083, zAl5083, dAl5083, 9, wAl5083); // AL5083 - Candidate for IRIS vacuum vessel
114 matmgr.Mixture("ALICE3_TRKSERVICES", 75, "ALUMINIUMBERYLLIUMMETAL", aAlBeMet, zAlBeMet, dAlBeMet, 2, wAlBeMet); // Aluminium-Beryllium metal - Candidate for IRIS vacuum vessel
115 matmgr.Material("ALICE3_TRKSERVICES", 76, "CARBONFIBERM55J6K", 12.0107, 6, 1.92, 22.4, 45.4); // Carbon Fiber M55J
116 matmgr.Material("ALICE3_TRKSERVICES", 78, "ALUMINIUM", 26.9815, 13, 2.70, 8.897, 39.70); // Aluminium for the IRIS service modules
117 matmgr.Mixture("ALICE3_PIPE", 77, "VACUUM", aAir, zAir, dAir1, 4, wAir);
118
119 matmgr.Medium("ALICE3_TRKSERVICES", 1, "CERAMIC", 66, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Ceramic for cold plate
120 matmgr.Medium("ALICE3_TRKSERVICES", 2, "COPPER", 67, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Copper for cables
121 matmgr.Medium("ALICE3_TRKSERVICES", 3, "AIR", 68, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Air for placeholding cables
122 matmgr.Medium("ALICE3_TRKSERVICES", 4, "POLYETHYLENE", 69, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Polyethylene for fibers
123 matmgr.Medium("ALICE3_TRKSERVICES", 5, "POLYURETHANE", 70, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Polyurethane for cooling pipes
124 matmgr.Medium("ALICE3_TRKSERVICES", 6, "SILICONDIOXIDE", 71, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Fused silica SiO2
125 matmgr.Medium("ALICE3_TRKSERVICES", 7, "WATER", 72, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Water for cooling pipes
126 matmgr.Medium("ALICE3_TRKSERVICES", 8, "BERYLLIUM", 73, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Beryllium for IRIS vacuum vessel
127 matmgr.Medium("ALICE3_TRKSERVICES", 9, "ALUMINIUM5083", 74, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Al5083 for IRIS vacuum vessel
128 matmgr.Medium("ALICE3_TRKSERVICES", 10, "ALUMINIUMBERYLLIUMMETAL", 75, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // AlBeMet for IRIS vacuum vessel
129 matmgr.Medium("ALICE3_TRKSERVICES", 11, "CARBONFIBERM55J6K", 76, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Carbon Fiber M55J
130 matmgr.Medium("ALICE3_PIPE", 12, "VACUUM", 77, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Vacuum inside the beam pipe
131 matmgr.Medium("ALICE3_TRKSERVICES", 13, "ALUMINIUM", 78, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Aluminium for the IRIS service modules
132}
133
134void TRKServices::createServices(TGeoVolume* motherVolume)
135{
136
137 TGeoVolumeAssembly* vol = new TGeoVolumeAssembly(GeometryTGeo::getTRKServiceVolPattern());
138 motherVolume->AddNode(vol, 2, new TGeoTranslation(0, 0., 0));
141 auto& trkPars = TRKBaseParam::Instance();
142 if (trkPars.getLayoutSRV() == kLOISymm) {
143 LOGP(info, "TRK services: LoI version");
147 } else {
148 LOGP(info, "TRK services: Peacock layout");
149 if (trkPars.includeLowServices) {
151 }
155 }
156}
157
159{
160 Double_t pipeRIn = 1.8f;
161 Double_t A3IPLength = 1000.f;
162 Double_t vacuumVesselRIn = 5.6f;
163 Double_t vacuumVesselThickness = 0.08f;
164 Double_t vacuumVesselLength = 76.f;
165
166 // Vacuum for A and C Side
167 Double_t vacuumASideLength = A3IPLength / 2. - vacuumVesselThickness - vacuumVesselLength / 2.;
168 Double_t vacuumCSideLength = A3IPLength / 2. + vacuumVesselLength / 2.;
169
170 // Vacuum tubes
171 TGeoTube* vacuumASide = new TGeoTube("VACUUM_Ash", 0., pipeRIn, vacuumASideLength / 2.);
172 TGeoTube* vacuumCSide = new TGeoTube("VACUUM_Csh", 0., vacuumVesselRIn, vacuumCSideLength / 2.);
173
174 // Vacuum positions
175 TGeoTranslation* posVacuumASide = new TGeoTranslation("VACUUM_ASIDE_POSITION", 0, 0, vacuumVesselLength / 2. + vacuumVesselThickness + vacuumASideLength / 2.);
176 posVacuumASide->RegisterYourself();
177 TGeoTranslation* posVacuumCSide = new TGeoTranslation("VACUUM_CSIDE_POSITION", 0, 0, vacuumVesselLength / 2. - vacuumCSideLength / 2.);
178 posVacuumCSide->RegisterYourself();
179
181 "VACUUM_Ash:VACUUM_ASIDE_POSITION"
182 "+VACUUM_Csh:VACUUM_CSIDE_POSITION";
183}
184
185void TRKServices::excavateFromVacuum(TString shapeToExcavate)
186{
188 mVacuumCompositeFormula += shapeToExcavate;
189}
190
191void TRKServices::registerVacuum(TGeoVolume* motherVolume)
192{
194 const TGeoMedium* kMedVac = matmgr.getTGeoMedium("ALICE3_PIPE_VACUUM");
195
196 TGeoCompositeShape* vacuumComposite = new TGeoCompositeShape("A3IP_VACUUMsh", mVacuumCompositeFormula);
197 TGeoVolume* vacuumVolume = new TGeoVolume("A3IP_VACUUM", vacuumComposite, kMedVac);
198
199 // Add the vacuum to the barrel
200 vacuumVolume->SetLineColor(kAzure + 6);
201 vacuumVolume->SetTransparency(80);
202
203 motherVolume->AddNode(vacuumVolume, 1, new TGeoTranslation(0, 0, 0));
204}
205
206void TRKServices::createOuterDisksServices(TGeoVolume* motherVolume)
207{
208 // This method hardcoes the pink shape for the inner services
210
211 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
212 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
213 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
214 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
215 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
216
217 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
218 // Create fibers: 2.12mm
219 float siO2FiberThick = 0.5 * 0.212;
220 float peFiberThick = 0.5 * 0.212;
221
222 float rMinInnerServices = 68.5f; // 68.5cm
223 float zLengthInnerServices = 201.f; // 201cm
224 float translation = (int)orientation * (149.f + zLengthInnerServices / 2); // ±149cm
225
226 TGeoTube* outerDisksFiberSIO2 = new TGeoTube("TRK_OUTERDISKS_FIBER_SIO2sh", rMinInnerServices, rMinInnerServices + siO2FiberThick, zLengthInnerServices / 2);
227 TGeoTube* outerDisksFiberPE = new TGeoTube("TRK_OUTERDISKS_FIBER_PEsh", rMinInnerServices + siO2FiberThick, rMinInnerServices + siO2FiberThick + peFiberThick, zLengthInnerServices / 2);
228 rMinInnerServices += siO2FiberThick + peFiberThick;
229 TGeoVolume* outerDisksFiberSIO2Volume = new TGeoVolume("TRK_OUTERDISKS_FIBER_SIO2", outerDisksFiberSIO2, medSiO2);
230 TGeoVolume* outerDisksFiberPEVolume = new TGeoVolume("TRK_OUTERDISKS_FIBER_PE", outerDisksFiberPE, medPE);
231 outerDisksFiberSIO2Volume->SetLineColor(kGray);
232 outerDisksFiberPEVolume->SetLineColor(kGray);
233 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, nullptr);
234 motherVolume->AddNode(outerDisksFiberSIO2Volume, 1, combiTrans);
235 motherVolume->AddNode(outerDisksFiberPEVolume, 1, combiTrans);
236
237 // Create power lines: 11.86mm
238 float cuPowerThick = 0.09 * 1.186;
239 float pePowerThick = 0.91 * 1.186;
240
241 TGeoTube* outerDisksPowerCu = new TGeoTube("TRK_OUTERDISKS_POWER_CUsh", rMinInnerServices, rMinInnerServices + cuPowerThick, zLengthInnerServices / 2);
242 TGeoTube* outerDisksPowerPE = new TGeoTube("TRK_OUTERDISKS_POWER_PEsh", rMinInnerServices + cuPowerThick, rMinInnerServices + cuPowerThick + pePowerThick, zLengthInnerServices / 2);
243 rMinInnerServices += cuPowerThick + pePowerThick;
244 TGeoVolume* outerDisksPowerCuVolume = new TGeoVolume("TRK_OUTERDISKS_POWER_CU", outerDisksPowerCu, medCu);
245 TGeoVolume* outerDisksPowerPEVolume = new TGeoVolume("TRK_OUTERDISKS_POWER_PE", outerDisksPowerPE, medPE);
246 outerDisksPowerCuVolume->SetLineColor(kGray);
247 outerDisksPowerPEVolume->SetLineColor(kGray);
248 motherVolume->AddNode(outerDisksPowerCuVolume, 1, combiTrans);
249 motherVolume->AddNode(outerDisksPowerPEVolume, 1, combiTrans);
250
251 // Create cooling: 6.47mm
252 float puCoolingThick = 0.56 * 0.647;
253 float h2oCoolingThick = 0.44 * 0.647;
254
255 TGeoTube* outerDisksCoolingPU = new TGeoTube("TRK_OUTERDISKS_COOLING_PUsh", rMinInnerServices, rMinInnerServices + puCoolingThick, zLengthInnerServices / 2);
256 TGeoTube* outerDisksCoolingH2O = new TGeoTube("TRK_OUTERDISKS_COOLING_H2Osh", rMinInnerServices + puCoolingThick, rMinInnerServices + puCoolingThick + h2oCoolingThick, zLengthInnerServices / 2);
257 // rMinInnerServices += puCoolingThick + h2oCoolingThick;
258 TGeoVolume* outerDisksCoolingPUVolume = new TGeoVolume("TRK_OUTERDISKS_COOLING_PU", outerDisksCoolingPU, medPU);
259 TGeoVolume* outerDisksCoolingH2OVolume = new TGeoVolume("TRK_OUTERDISKS_COOLING_H2O", outerDisksCoolingH2O, medH2O);
260 outerDisksCoolingPUVolume->SetLineColor(kGray);
261 outerDisksCoolingH2OVolume->SetLineColor(kGray);
262 motherVolume->AddNode(outerDisksCoolingPUVolume, 1, combiTrans);
263 motherVolume->AddNode(outerDisksCoolingH2OVolume, 1, combiTrans);
264 }
265}
266
267void TRKServices::createMiddleServices(TGeoVolume* motherVolume)
268{
269 // This method hardcoes the yellow shape for the middle services
271
272 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
273 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
274 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
275 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
276 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
277 TGeoMedium* medCFiber = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_CARBONFIBERM55J6K");
278
279 // Create fibers: 3.07mm, 50% SiO2, 50% PE
280 float siO2FiberThick = 0.5 * 0.307;
281 float peFiberThick = 0.5 * 0.307;
282 float puCoolingThick = 0.56 * 0.474;
283 float h2oCoolingThick = 0.44 * 0.474;
284 float cuPowerThick = 0.09 * 1.09;
285 float pePowerThick = 0.91 * 1.09;
286 const float totalThickness = siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick;
287
288 // Carbon Fiber Cylinder support for the middle tracker
289 float rMinMiddleCarbonSupport = 34.8f; // Arbitrary value
290 float rMaxMiddleCarbonSupport = 35.f; // 2 mm of carbon fiber
291 const float zLengthMiddleCarbon = 129.f;
292 TGeoTube* middleBarrelCarbonSupport = new TGeoTube("TRK_MID_CARBONSUPPORTsh", rMinMiddleCarbonSupport, rMaxMiddleCarbonSupport, zLengthMiddleCarbon / 2.);
293 TGeoVolume* middleBarrelCarbonSupportVolume = new TGeoVolume("TRK_MID_CARBONSUPPORT", middleBarrelCarbonSupport, medCFiber);
294 middleBarrelCarbonSupportVolume->SetLineColor(kGray);
295 LOGP(info, "Creating carbon fiber support for Middle Tracker");
296 motherVolume->AddNode(middleBarrelCarbonSupportVolume, 1, nullptr);
297
298 // Get geometry information from TRK which is already present
299 float rMinMiddleServices = 35.f;
300 float rMinMiddleBarrel = rMinMiddleServices;
301 const float zLengthCylinderMiddleServices = 40.5f;
302 const float zLengthMiddleServices = 143.f;
303 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
304 rMinMiddleServices = 35.f;
305 LOGP(info, "Building services for Middle Tracker rminMiddleServices");
306 TGeoTube* middleBarrelFiberSIO2 = new TGeoTube(Form("TRK_MID_FIBER_SIO2sh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + siO2FiberThick, zLengthCylinderMiddleServices /* + totalThickness*/);
307 rMinMiddleServices += siO2FiberThick;
308 TGeoTube* middleBarrelFiberPE = new TGeoTube(Form("TRK_MID_FIBER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + peFiberThick, zLengthCylinderMiddleServices /* + totalThickness*/);
309 rMinMiddleServices += peFiberThick;
310 TGeoVolume* middleBarrelFiberSIO2Volume = new TGeoVolume(Form("TRK_MID_FIBER_SIO2_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelFiberSIO2, medSiO2);
311 TGeoVolume* middleBarrelFiberPEVolume = new TGeoVolume(Form("TRK_MID_FIBER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelFiberPE, medPE);
312 middleBarrelFiberSIO2Volume->SetLineColor(kGray);
313 middleBarrelFiberPEVolume->SetLineColor(kGray);
314 auto* combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zLengthMiddleServices - zLengthCylinderMiddleServices), nullptr);
315 motherVolume->AddNode(middleBarrelFiberSIO2Volume, 1, combiTrans);
316 motherVolume->AddNode(middleBarrelFiberPEVolume, 1, combiTrans);
317
318 // Create powerlines: 10.9mm, 9% Cu, 91% PE
319 TGeoTube* middleBarrelPowerCu = new TGeoTube(Form("TRK_MID_POWER_CUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + cuPowerThick, zLengthCylinderMiddleServices /* + totalThickness*/);
320 rMinMiddleServices += cuPowerThick;
321 TGeoTube* middleBarrelPowerPE = new TGeoTube(Form("TRK_MID_POWER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + pePowerThick, zLengthCylinderMiddleServices /* + totalThickness*/);
322 rMinMiddleServices += pePowerThick;
323 TGeoVolume* middleBarrelPowerCuVolume = new TGeoVolume(Form("TRK_MID_POWER_CU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelPowerCu, medCu);
324 TGeoVolume* middleBarrelPowerPEVolume = new TGeoVolume(Form("TRK_MID_POWER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelPowerPE, medPE);
325 middleBarrelPowerCuVolume->SetLineColor(kGray);
326 middleBarrelPowerPEVolume->SetLineColor(kGray);
327 motherVolume->AddNode(middleBarrelPowerCuVolume, 1, combiTrans);
328 motherVolume->AddNode(middleBarrelPowerPEVolume, 1, combiTrans);
329
330 // Create cooling pipes: 4.74mm, 56% PU, 44% H2O
331 TGeoTube* middleBarrelCoolingPU = new TGeoTube(Form("TRK_MID_COOLING_PUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + puCoolingThick, zLengthCylinderMiddleServices /* + totalThickness*/);
332 rMinMiddleServices += puCoolingThick;
333 TGeoTube* middleBarrelCoolingH2O = new TGeoTube(Form("TRK_MID_COOLING_H2Osh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + h2oCoolingThick, zLengthCylinderMiddleServices /* + totalThickness*/);
334 rMinMiddleServices = rMinMiddleServices += h2oCoolingThick;
335 TGeoVolume* middleBarrelCoolingPUVolume = new TGeoVolume(Form("TRK_MID_COOLING_PU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelCoolingPU, medPU);
336 TGeoVolume* middleBarrelCoolingH2OVolume = new TGeoVolume(Form("TRK_MID_COOLING_H2O_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelCoolingH2O, medH2O);
337 middleBarrelCoolingPUVolume->SetLineColor(kGray);
338 middleBarrelCoolingH2OVolume->SetLineColor(kGray);
339 motherVolume->AddNode(middleBarrelCoolingPUVolume, 1, combiTrans);
340 motherVolume->AddNode(middleBarrelCoolingH2OVolume, 1, combiTrans);
341 }
342 // Middle barrel connection disks
343 const float rMinMiddleBarrelDisk = 5.68f;
344 const float rMaxMiddleBarrelDisk = 35.f;
345 const float zLengthMiddleBarrel = 64.5f;
346 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
347 TGeoTube* middleBarrelConnDiskSIO2 = new TGeoTube(Form("TRK_MIDBARCONN_DISK_FIBER_SIO2sh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, siO2FiberThick / 2.);
348 TGeoTube* middleBarrelConnDiskPE = new TGeoTube(Form("TRK_MIDBARCONN_DISK_FIBER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, peFiberThick / 2.);
349 TGeoVolume* middleBarrelConnDiskSIO2Volume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_FIBER_SIO2_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskSIO2, medSiO2);
350 TGeoVolume* middleBarrelConnDiskPEVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_FIBER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskPE, medPE);
351 middleBarrelConnDiskSIO2Volume->SetLineColor(kGray);
352 middleBarrelConnDiskPEVolume->SetLineColor(kGray);
353 auto* rot = new TGeoRotation("", 0, 0, 180);
354 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick / 2. + zLengthMiddleBarrel), rot);
355 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick / 2. + zLengthMiddleBarrel), rot);
356 motherVolume->AddNode(middleBarrelConnDiskSIO2Volume, 1, combiTransSIO2);
357 motherVolume->AddNode(middleBarrelConnDiskPEVolume, 1, combiTransPE);
358
359 TGeoTube* middleBarrelConnDiskCu = new TGeoTube(Form("TRK_MIDBARCONN_DISK_POWER_CUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, cuPowerThick / 2.);
360 TGeoTube* middleBarrelConnDiskPEPower = new TGeoTube(Form("TRK_MIDBARCONN_DISK_POWER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, pePowerThick / 2.);
361 TGeoVolume* middleBarrelConnDiskCuVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_POWER_CU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskCu, medCu);
362 TGeoVolume* middleBarrelConnDiskPEPowerVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_POWER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskPEPower, medPE);
363 middleBarrelConnDiskCuVolume->SetLineColor(kGray);
364 middleBarrelConnDiskPEPowerVolume->SetLineColor(kGray);
365 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick / 2. + zLengthMiddleBarrel), rot);
366 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick / 2. + zLengthMiddleBarrel), rot);
367 motherVolume->AddNode(middleBarrelConnDiskCuVolume, 1, combiTransCu);
368 motherVolume->AddNode(middleBarrelConnDiskPEPowerVolume, 1, combiTransPEPower);
369
370 TGeoTube* middleBarrelConnDiskPU = new TGeoTube(Form("TRK_MIDBARCONN_DISK_PUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, puCoolingThick / 2.);
371 TGeoTube* middleBarrelConnDiskH2O = new TGeoTube(Form("TRK_MIDBARCONN_DISK_H2Osh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, h2oCoolingThick / 2.);
372 TGeoVolume* middleBarrelConnDiskPUVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_PU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskPU, medPU);
373 TGeoVolume* middleBarrelConnDiskH2OVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_H2O_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskH2O, medH2O);
374 middleBarrelConnDiskPUVolume->SetLineColor(kGray);
375 middleBarrelConnDiskH2OVolume->SetLineColor(kGray);
376 auto* combiTransPU = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick / 2. + zLengthMiddleBarrel), rot);
377 auto* combiTransH2O = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick / 2. + zLengthMiddleBarrel), rot);
378 motherVolume->AddNode(middleBarrelConnDiskPUVolume, 1, combiTransPU);
379 motherVolume->AddNode(middleBarrelConnDiskH2OVolume, 1, combiTransH2O);
380 }
381
382 // Barrel to forward connection disks
383 float rMaxMiddleServicesBarFwd = 74.5f + siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick;
384 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
385 // Create fibers: 3.07mm, 50% SiO2, 50% PE
386 TGeoTube* middleBarFwdFiberSIO2 = new TGeoTube("TRK_MIDBARFWD_FIBER_SIO2sh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, siO2FiberThick / 2.);
387 TGeoTube* middleBarFwdFiberPE = new TGeoTube("TRK_MIDBARFWD_FIBER_PEsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, peFiberThick / 2.);
388 TGeoVolume* middleBarFwdFiberSIO2Volume = new TGeoVolume("TRK_MIDBARFWD_FIBER_SIO2", middleBarFwdFiberSIO2, medSiO2);
389 TGeoVolume* middleBarFwdFiberPEVolume = new TGeoVolume("TRK_MIDBARFWD_FIBER_PE", middleBarFwdFiberPE, medPE);
390 middleBarFwdFiberSIO2Volume->SetLineColor(kGray);
391 middleBarFwdFiberPEVolume->SetLineColor(kGray);
392 auto* rot = new TGeoRotation("", 0, 0, 180);
393 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick / 2. + zLengthMiddleServices), rot);
394 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick / 2. + zLengthMiddleServices), rot);
395 motherVolume->AddNode(middleBarFwdFiberSIO2Volume, 1, combiTransSIO2);
396 motherVolume->AddNode(middleBarFwdFiberPEVolume, 1, combiTransPE);
397
398 // Create powerlines: 10.9mm, 9% Cu, 91% PE
399 TGeoTube* middleBarFwdPowerCu = new TGeoTube("TRK_MIDBARFWD_POWER_CUsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, cuPowerThick / 2.);
400 TGeoTube* middleBarFwdPowerPE = new TGeoTube("TRK_MIDBARFWD_POWER_PEsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, pePowerThick / 2.);
401 TGeoVolume* middleBarFwdPowerCuVolume = new TGeoVolume("TRK_MIDBARFWD_POWER_CU", middleBarFwdPowerCu, medCu);
402 TGeoVolume* middleBarFwdPowerPEVolume = new TGeoVolume("TRK_MIDBARFWD_POWER_PE", middleBarFwdPowerPE, medPE);
403 middleBarFwdPowerCuVolume->SetLineColor(kGray);
404 middleBarFwdPowerPEVolume->SetLineColor(kGray);
405 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick / 2. + zLengthMiddleServices), rot);
406 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick / 2. + zLengthMiddleServices), rot);
407 motherVolume->AddNode(middleBarFwdPowerCuVolume, 1, combiTransCu);
408 motherVolume->AddNode(middleBarFwdPowerPEVolume, 1, combiTransPEPower);
409
410 // Create cooling pipes: 4.74mm, 56% PU, 44% H2O
411 TGeoTube* middleBarFwdCoolingPU = new TGeoTube("TRK_MIDBARFWD_COOLING_PUsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, puCoolingThick / 2.);
412 TGeoTube* middleBarFwdCoolingH2O = new TGeoTube("TRK_MIDBARFWD_COOLING_H2Osh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, h2oCoolingThick / 2.);
413 TGeoVolume* middleBarFwdCoolingPUVolume = new TGeoVolume("TRK_MIDBARFWD_COOLING_PU", middleBarFwdCoolingPU, medPU);
414 TGeoVolume* middleBarFwdCoolingH2OVolume = new TGeoVolume("TRK_MIDBARFWD_COOLING_H2O", middleBarFwdCoolingH2O, medH2O);
415 middleBarFwdCoolingPUVolume->SetLineColor(kGray);
416 middleBarFwdCoolingH2OVolume->SetLineColor(kGray);
417 auto* combiTransCoolingPU = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick / 2. + zLengthMiddleServices), rot);
418 auto* combiTransCoolingH2O = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick / 2. + zLengthMiddleServices), rot);
419 motherVolume->AddNode(middleBarFwdCoolingPUVolume, 1, combiTransCoolingPU);
420 motherVolume->AddNode(middleBarFwdCoolingH2OVolume, 1, combiTransCoolingH2O);
421 }
422
423 // Forward part
424 const float zLengthMiddleServicesFwd = 350.f - (143.f + totalThickness);
425
426 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
427 // Create fibers: 3.07mm, 50% SiO2, 50% PE
428 float siO2FiberThick = 0.5 * 0.307;
429 float peFiberThick = 0.5 * 0.307;
430 float rMinMiddleServicesFwd = 74.5f; // 74.5cm
431
432 float translation = (int)orientation * (143.f + totalThickness + zLengthMiddleServicesFwd / 2);
433
434 TGeoTube* middleFwdFiberSIO2 = new TGeoTube("TRK_MIDFWD_FIBER_SIO2sh", rMinMiddleServicesFwd, rMinMiddleServicesFwd + siO2FiberThick, zLengthMiddleServicesFwd / 2);
435 TGeoTube* middleFwdFiberPE = new TGeoTube("TRK_MIDFWD_FIBER_PEsh", rMinMiddleServicesFwd + siO2FiberThick, rMinMiddleServicesFwd + siO2FiberThick + peFiberThick, zLengthMiddleServicesFwd / 2);
436 rMinMiddleServicesFwd += siO2FiberThick + peFiberThick;
437 TGeoVolume* middleFwdFiberSIO2Volume = new TGeoVolume("TRK_MIDFWD_FIBER_SIO2", middleFwdFiberSIO2, medSiO2);
438 TGeoVolume* middleFwdFiberPEVolume = new TGeoVolume("TRK_MIDFWD_FIBER_PE", middleFwdFiberPE, medPE);
439 middleFwdFiberSIO2Volume->SetLineColor(kGray);
440 middleFwdFiberPEVolume->SetLineColor(kGray);
441 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, nullptr);
442 motherVolume->AddNode(middleFwdFiberSIO2Volume, 1, combiTrans);
443 motherVolume->AddNode(middleFwdFiberPEVolume, 1, combiTrans);
444
445 // Create powerlines: 10.9mm, 9% Cu, 91% PE
446 float cuPowerThick = 0.09 * 1.09;
447 float pePowerThick = 0.91 * 1.09;
448
449 TGeoTube* middleFwdPowerCu = new TGeoTube("TRK_MIDFWD_POWER_CUsh", rMinMiddleServicesFwd, rMinMiddleServicesFwd + cuPowerThick, zLengthMiddleServicesFwd / 2);
450 TGeoTube* middleFwdPowerPE = new TGeoTube("TRK_MIDFWD_POWER_PEsh", rMinMiddleServicesFwd + cuPowerThick, rMinMiddleServicesFwd + cuPowerThick + pePowerThick, zLengthMiddleServicesFwd / 2);
451 rMinMiddleServicesFwd += cuPowerThick + pePowerThick;
452 TGeoVolume* middleFwdPowerCuVolume = new TGeoVolume("TRK_MIDFWD_POWER_CU", middleFwdPowerCu, medCu);
453 TGeoVolume* middleFwdPowerPEVolume = new TGeoVolume("TRK_MIDFWD_POWER_PE", middleFwdPowerPE, medPE);
454 middleFwdPowerCuVolume->SetLineColor(kGray);
455 middleFwdPowerPEVolume->SetLineColor(kGray);
456 motherVolume->AddNode(middleFwdPowerCuVolume, 1, combiTrans);
457 motherVolume->AddNode(middleFwdPowerPEVolume, 1, combiTrans);
458
459 // Create cooling pipes: 4.74mm, 56% PU, 44% H2O
460 float puCoolingThick = 0.56 * 0.474;
461 float h2oCoolingThick = 0.44 * 0.474;
462
463 TGeoTube* middleFwdCoolingPU = new TGeoTube("TRK_MIDFWD_COOLING_PUsh", rMinMiddleServicesFwd, rMinMiddleServicesFwd + puCoolingThick, zLengthMiddleServicesFwd / 2);
464 TGeoTube* middleFwdCoolingH2O = new TGeoTube("TRK_MIDFWD_COOLING_H2Osh", rMinMiddleServicesFwd + puCoolingThick, rMinMiddleServicesFwd + puCoolingThick + h2oCoolingThick, zLengthMiddleServicesFwd / 2);
465 // rMinMiddleServicesFwd += puCoolingThick + h2oCoolingThick;
466 TGeoVolume* middleFwdCoolingPUVolume = new TGeoVolume("TRK_MIDFWD_COOLING_PU", middleFwdCoolingPU, medPU);
467 TGeoVolume* middleFwdCoolingH2OVolume = new TGeoVolume("TRK_MIDFWD_COOLING_H2O", middleFwdCoolingH2O, medH2O);
468 middleFwdCoolingPUVolume->SetLineColor(kGray);
469 middleFwdCoolingH2OVolume->SetLineColor(kGray);
470 motherVolume->AddNode(middleFwdCoolingPUVolume, 1, combiTrans);
471 motherVolume->AddNode(middleFwdCoolingH2OVolume, 1, combiTrans);
472 }
473}
474
475void TRKServices::createOuterBarrelServices(TGeoVolume* motherVolume)
476{
477 // This implements a service barrel around the full outer tracker which is probably not needed:
478 // power, data and cooling should be implemented on the staves
479 // Used only for 'LOI' geometry
480
482
483 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
484 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
485 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
486 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
487 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
488
489 // Fiber 0.269 cm
490 const float siO2FiberThick = 0.5 * 0.269;
491 const float peFiberThick = 0.5 * 0.269;
492 float rMinOuterBarrelServices = ((TGeoTube*)motherVolume->GetNode(Form("%s7_1", GeometryTGeo::getTRKLayerPattern()))->GetVolume()->GetShape())->GetRmax();
493 const float zLengthOuterBarrelServices = 350.f; // 175cm
494
495 TGeoTube* outerBarrelFiberSIO2 = new TGeoTube("TRK_OUTERBARREL_FIBER_SIO2sh", rMinOuterBarrelServices, rMinOuterBarrelServices + siO2FiberThick, zLengthOuterBarrelServices);
496 TGeoTube* outerBarrelFiberPE = new TGeoTube("TRK_OUTERBARREL_FIBER_PEsh", rMinOuterBarrelServices + siO2FiberThick, rMinOuterBarrelServices + siO2FiberThick + peFiberThick, zLengthOuterBarrelServices);
497 rMinOuterBarrelServices += siO2FiberThick + peFiberThick;
498 TGeoVolume* outerBarrelFiberSIO2Volume = new TGeoVolume("TRK_OUTERBARREL_FIBER_SIO2", outerBarrelFiberSIO2, medSiO2);
499 TGeoVolume* outerBarrelFiberPEVolume = new TGeoVolume("TRK_OUTERBARREL_FIBER_PE", outerBarrelFiberPE, medPE);
500 outerBarrelFiberSIO2Volume->SetLineColor(kGray);
501 outerBarrelFiberPEVolume->SetLineColor(kGray);
502 motherVolume->AddNode(outerBarrelFiberSIO2Volume, 1, nullptr);
503 motherVolume->AddNode(outerBarrelFiberPEVolume, 1, nullptr);
504
505 // Power 0.430 cm
506 const float cuPowerThick = 0.09 * 0.430;
507 const float pePowerThick = 0.91 * 0.430;
508
509 TGeoTube* outerBarrelPowerCu = new TGeoTube("TRK_OUTERBARREL_POWER_CUsh", rMinOuterBarrelServices, rMinOuterBarrelServices + cuPowerThick, zLengthOuterBarrelServices);
510 TGeoTube* outerBarrelPowerPE = new TGeoTube("TRK_OUTERBARREL_POWER_PEsh", rMinOuterBarrelServices + cuPowerThick, rMinOuterBarrelServices + cuPowerThick + pePowerThick, zLengthOuterBarrelServices);
511 rMinOuterBarrelServices += cuPowerThick + pePowerThick;
512 TGeoVolume* outerBarrelPowerCuVolume = new TGeoVolume("TRK_OUTERBARREL_POWER_CU", outerBarrelPowerCu, medCu);
513 TGeoVolume* outerBarrelPowerPEVolume = new TGeoVolume("TRK_OUTERBARREL_POWER_PE", outerBarrelPowerPE, medPE);
514 outerBarrelPowerCuVolume->SetLineColor(kGray);
515 outerBarrelPowerPEVolume->SetLineColor(kGray);
516 motherVolume->AddNode(outerBarrelPowerCuVolume, 1, nullptr);
517 motherVolume->AddNode(outerBarrelPowerPEVolume, 1, nullptr);
518
519 // Cooling 1.432 cm
520 const float puCoolingThick = 0.56 * 1.432;
521 const float h2oCoolingThick = 0.44 * 1.432;
522
523 TGeoTube* outerBarrelCoolingPU = new TGeoTube("TRK_OUTERBARREL_COOLING_PUsh", rMinOuterBarrelServices, rMinOuterBarrelServices + puCoolingThick, zLengthOuterBarrelServices);
524 TGeoTube* outerBarrelCoolingH2O = new TGeoTube("TRK_OUTERBARREL_COOLING_H2Osh", rMinOuterBarrelServices + puCoolingThick, rMinOuterBarrelServices + puCoolingThick + h2oCoolingThick, zLengthOuterBarrelServices);
525 // rMinOuterBarrelServices += puCoolingThick + h2oCoolingThick;
526 TGeoVolume* outerBarrelCoolingPUVolume = new TGeoVolume("TRK_OUTERBARREL_COOLING_PU", outerBarrelCoolingPU, medPU);
527 TGeoVolume* outerBarrelCoolingH2OVolume = new TGeoVolume("TRK_OUTERBARREL_COOLING_H2O", outerBarrelCoolingH2O, medH2O);
528 outerBarrelCoolingPUVolume->SetLineColor(kGray);
529 outerBarrelCoolingH2OVolume->SetLineColor(kGray);
530 motherVolume->AddNode(outerBarrelCoolingPUVolume, 1, nullptr);
531 motherVolume->AddNode(outerBarrelCoolingH2OVolume, 1, nullptr);
532}
533
534void TRKServices::createServicesAroundBeamPipe(TGeoVolume* motherVolume)
535{
536 // This method hardcodes the shape for the low services around the beam pipe
538
539 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
540
541 const float tolleranceLowServices = 0.3f;
542
543 // Low services start longitudinally from middle barrel on the C side, while from the middle barrel connection disks on the A side
544 const float zStartASideFirstBlock = 65.265f + tolleranceLowServices;
545 const float zStartCSideFirstBlock = 64.5f + tolleranceLowServices;
546 const float zStartSecondBlock = 150.f;
547 const float zStartThirdBlock = 365.f;
548 const float zEndThirdBlock = 400.f;
549
550 // Low services start radially from IRIS out-vacuum services on the A side, while from beam pipe on the C side
551 const float rInASide = 3.333f + tolleranceLowServices;
552 const float rInCSide = 5.6f + tolleranceLowServices;
553
554 // Low services end radially at the disks inners radius
555 const float rOutFirstBlock = 10.f - tolleranceLowServices;
556 const float rOutSecondBlock = 20.f - tolleranceLowServices;
557 const float rOutThirdBlock = 15.f - tolleranceLowServices;
558
559 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
560 std::string orLabel = orientation == Orientation::kASide ? "A" : "C";
561
562 float zStartLowServices = orientation == Orientation::kASide ? zStartASideFirstBlock : zStartCSideFirstBlock;
563 float rInLowServices = orientation == Orientation::kASide ? rInASide : rInCSide;
564
565 TGeoTube* lowServicesFirstBlock = new TGeoTube(Form("TRK_LOWSERVICES_FIRSTBLOCKsh_%s", orLabel.c_str()), rInLowServices, rOutFirstBlock, (zStartSecondBlock - zStartLowServices) / 2.);
566 TGeoVolume* lowServicesFirstBlockVolume = new TGeoVolume(Form("TRK_LOWSERVICES_FIRSTBLOCK_%s", orLabel.c_str()), lowServicesFirstBlock, medCu);
567 lowServicesFirstBlockVolume->SetLineColor(kGray);
568
569 TGeoTube* lowServicesSecondBlock = new TGeoTube(Form("TRK_LOWSERVICES_SECONDBLOCKsh_%s", orLabel.c_str()), rInLowServices, rOutSecondBlock, (zStartThirdBlock - zStartSecondBlock) / 2.);
570 TGeoVolume* lowServicesSecondBlockVolume = new TGeoVolume(Form("TRK_LOWSERVICES_SECONDBLOCK_%s", orLabel.c_str()), lowServicesSecondBlock, medCu);
571 lowServicesSecondBlockVolume->SetLineColor(kGray);
572
573 TGeoTube* lowServicesThirdBlock = new TGeoTube(Form("TRK_LOWSERVICES_THIRDBLOCKsh_%s", orLabel.c_str()), rInLowServices, rOutThirdBlock, (zEndThirdBlock - zStartThirdBlock) / 2.);
574 TGeoVolume* lowServicesThirdBlockVolume = new TGeoVolume(Form("TRK_LOWSERVICES_THIRDBLOCK_%s", orLabel.c_str()), lowServicesThirdBlock, medCu);
575 lowServicesThirdBlockVolume->SetLineColor(kGray);
576
577 auto* rot = new TGeoRotation("", 0, 0, 180);
578 auto* combiTransFirstBlock = new TGeoCombiTrans(0, 0, (int)orientation * (zStartLowServices + (zStartSecondBlock - zStartLowServices) / 2.), rot);
579 auto* combiTransSecondBlock = new TGeoCombiTrans(0, 0, (int)orientation * (zStartSecondBlock + (zStartThirdBlock - zStartSecondBlock) / 2.), rot);
580 auto* combiTransThirdBlock = new TGeoCombiTrans(0, 0, (int)orientation * (zStartThirdBlock + (zEndThirdBlock - zStartThirdBlock) / 2.), rot);
581
582 motherVolume->AddNode(lowServicesFirstBlockVolume, 1, combiTransFirstBlock);
583 motherVolume->AddNode(lowServicesSecondBlockVolume, 1, combiTransSecondBlock);
584 motherVolume->AddNode(lowServicesThirdBlockVolume, 1, combiTransThirdBlock);
585 }
586}
587
588void TRKServices::createMLServicesPeacock(TGeoVolume* motherVolume)
589{
590 // This method hardcodes the yellow shape for the middle services
592
593 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
594 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
595 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
596 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
597 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
598 TGeoMedium* medCFiber = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_CARBONFIBERM55J6K");
599
600 // Barrel service constants
601 const int ITBarrelnFiber = 70;
602 const int ITBarrelnPower = 70;
603 float siO2FiberAreaB = ITBarrelnFiber * mFiberArea * mFiberComposition[0];
604 float peFiberAreaB = ITBarrelnFiber * mFiberArea * mFiberComposition[1];
605
606 float puCoolingAreaB = 0;
607 float h2oCoolingAreaB = 0;
608 float cuPowerAreaB = ITBarrelnPower * mPowerBundleArea * mPowerBundleComposition[0];
609 float pePowerAreaB = ITBarrelnPower * mPowerBundleArea * mPowerBundleComposition[1];
610
611 // Disk service constants
612 const int ITDisknFiber = 3 * 24;
613 const int ITDisknPower = 3 * 16;
614 float siO2FiberAreaD = ITDisknFiber * mFiberArea * mFiberComposition[0];
615 float peFiberAreaD = ITDisknFiber * mFiberArea * mFiberComposition[1];
616
617 float puCoolingAreaD = 0;
618 float h2oCoolingAreaD = 0;
619 float cuPowerAreaD = ITDisknPower * mPowerBundleArea * mPowerBundleComposition[0];
620 float pePowerAreaD = ITDisknPower * mPowerBundleArea * mPowerBundleComposition[1];
621
622 // Carbon Fiber Cylinder support for the middle tracker
623 // (from ICD_ALICE3_V3.b.3 drawing: 38.5 cm are allocated for staves and services, + 1 cm for the support; we assume less for the support - to be reconsidered if necessary)
624 float rMaxMiddleCarbonSupport = sMLOTShellRMax; // cm
625 float rMinMiddleCarbonSupport = sMLOTShellRMax - sMLOTShellThickness; // cm, 2 mm of carbon fiber, ~0.88% X/X0
626 const float zLengthMiddleCarbon = 282.f; // cm, to cover the full length of ML barrel and disks, from Corrado's drawing
627 TGeoTube* middleBarrelCarbonSupport = new TGeoTube("TRK_MID_CARBONSUPPORTsh", rMinMiddleCarbonSupport, rMaxMiddleCarbonSupport, zLengthMiddleCarbon / 2.);
628 TGeoVolume* middleBarrelCarbonSupportVolume = new TGeoVolume("TRK_MID_CARBONSUPPORT", middleBarrelCarbonSupport, medCFiber);
629 middleBarrelCarbonSupportVolume->SetLineColor(kGray);
630 LOGP(info, "Creating carbon fiber support for Middle Tracker");
631 motherVolume->AddNode(middleBarrelCarbonSupportVolume, 1, nullptr);
632
633 // Get geometry information from TRK which is already present
634 float rMinMiddleServices = 38.0f; // cm, start radius of the ML services = maximum radius allowed for sensors (35 cm), plus some margin for disk paving with modules
635 const float zMiddleServicesBarrel = 74.0f; // cm, z position of the first barrel ML service disk
636 const float zMiddleServicesBarrelFwdConnection = 143.f; // cm, z position of barrel to forward connection services
637 const float zLengthCylinderMiddleServicesBarrel = zMiddleServicesBarrelFwdConnection - zMiddleServicesBarrel;
638
639 const float zStartServicesForMiddleDisks = 77.0f; // cm, starting z position of ML disk services, assumed to be the same as of the first ML disk
640 const float zLengthCylinderMiddleServicesDisk = zMiddleServicesBarrelFwdConnection - zStartServicesForMiddleDisks;
641
642 // Middle layer barrel services are only on A side
643 LOGP(info, "Building services for barrel Middle Layers");
644
645 // Middle barrel connection disks
646 const float rMinMiddleBarrelDisk = 5.68f;
647 const float rMaxMiddleBarrelDisk = rMinMiddleServices;
648 auto orientation = Orientation::kASide;
649 float diskCircumference = rMaxMiddleBarrelDisk * 3.14; // Use only half circumference
650
651 double zCur = zMiddleServicesBarrel;
652 double dZ = siO2FiberAreaB / diskCircumference / 2.;
653 TGeoTube* middleBarrelConnDiskSIO2 = new TGeoTube("TRK_MIDBARCONN_DISK_FIBER_SIO2sh", rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, dZ);
654 TGeoVolume* middleBarrelConnDiskSIO2Volume = new TGeoVolume("TRK_MIDBARCONN_DISK_FIBER_SIO2", middleBarrelConnDiskSIO2, medSiO2);
655 middleBarrelConnDiskSIO2Volume->SetLineColor(kOrange - 9);
656 auto* rot = new TGeoRotation("", 0, 0, 180); // Why this?
657 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
658
659 zCur += 2. * dZ;
660 dZ = peFiberAreaB / diskCircumference / 2.;
661 TGeoTube* middleBarrelConnDiskPE = new TGeoTube("TRK_MIDBARCONN_DISK_FIBER_PEsh", rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, dZ);
662 TGeoVolume* middleBarrelConnDiskPEVolume = new TGeoVolume("TRK_MIDBARCONN_DISK_FIBER_PE", middleBarrelConnDiskPE, medPE);
663 middleBarrelConnDiskPEVolume->SetLineColor(kOrange - 9);
664 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
665
666 motherVolume->AddNode(middleBarrelConnDiskSIO2Volume, 1, combiTransSIO2);
667 motherVolume->AddNode(middleBarrelConnDiskPEVolume, 1, combiTransPE);
668
669 zCur += 2. * dZ;
670 dZ = cuPowerAreaB / diskCircumference / 2.;
671 TGeoTube* middleBarrelConnDiskCu = new TGeoTube("TRK_MIDBARCONN_DISK_POWER_CUsh", rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, dZ);
672 TGeoVolume* middleBarrelConnDiskCuVolume = new TGeoVolume("TRK_MIDBARCONN_DISK_POWER_CU", middleBarrelConnDiskCu, medCu);
673 middleBarrelConnDiskCuVolume->SetLineColor(kOrange - 9);
674 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
675
676 zCur += 2. * dZ;
677 dZ = pePowerAreaB / diskCircumference / 2.;
678 TGeoTube* middleBarrelConnDiskPEPower = new TGeoTube("TRK_MIDBARCONN_DISK_POWER_PEsh", rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, dZ);
679 TGeoVolume* middleBarrelConnDiskPEPowerVolume = new TGeoVolume("TRK_MIDBARCONN_DISK_POWER_PE", middleBarrelConnDiskPEPower, medPE);
680 middleBarrelConnDiskPEPowerVolume->SetLineColor(kOrange - 9);
681 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
682 motherVolume->AddNode(middleBarrelConnDiskCuVolume, 1, combiTransCu);
683 motherVolume->AddNode(middleBarrelConnDiskPEPowerVolume, 1, combiTransPEPower);
684
685 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
686 for (int iSide = 0; iSide < 2; iSide++) { // left/right or top/bottom
687 float refAngle = 0;
688 std::string orLabel("A");
689 if (orientation == Orientation::kCSide) {
690 orLabel = "C";
691 refAngle = 90;
692 }
693 // Add ML Disk services
694 // create data fiber volumes
695 double rCur = rMinMiddleServices;
696 double dR = siO2FiberAreaD / (3.14 * rCur);
697 TGeoTubeSeg* middleDiskFiberSIO2 = new TGeoTubeSeg(Form("TRK_MLD_FIBER_SIO2sh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthCylinderMiddleServicesDisk / 2, -45, 45);
698 TGeoVolume* middleDiskFiberSIO2Volume = new TGeoVolume(Form("TRK_MLD_FIBER_SIO2_%s%d", orLabel.c_str(), iSide), middleDiskFiberSIO2, medSiO2);
699 middleDiskFiberSIO2Volume->SetLineColor(kOrange + 1);
700
701 rCur += dR;
702 dR = peFiberAreaD / (3.14 * rCur);
703 TGeoTubeSeg* middleDiskFiberPE = new TGeoTubeSeg(Form("TRK_MLD_FIBER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthCylinderMiddleServicesDisk / 2, -45, 45);
704 TGeoVolume* middleDiskFiberPEVolume = new TGeoVolume(Form("TRK_MLD_FIBER_PE_%s%d", orLabel.c_str(), iSide), middleDiskFiberPE, medPE);
705 middleDiskFiberPEVolume->SetLineColor(kOrange + 1);
706 auto* combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zMiddleServicesBarrelFwdConnection - zLengthCylinderMiddleServicesDisk / 2), new TGeoRotation("", refAngle + iSide * 180., 0, 0));
707 motherVolume->AddNode(middleDiskFiberSIO2Volume, 1, combiTrans);
708 motherVolume->AddNode(middleDiskFiberPEVolume, 1, combiTrans);
709
710 // Create powerlines
711 rCur += dR;
712 dR = cuPowerAreaD / (3.14 * rCur);
713 TGeoTubeSeg* middleDiskPowerCu = new TGeoTubeSeg(Form("TRK_MLD_POWER_CUsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthCylinderMiddleServicesDisk / 2, -45, 45);
714 TGeoVolume* middleDiskPowerCuVolume = new TGeoVolume(Form("TRK_MLD_POWER_CU_%s%d", orLabel.c_str(), iSide), middleDiskPowerCu, medCu);
715 middleDiskPowerCuVolume->SetLineColor(kOrange + 1);
716
717 rCur += dR;
718 dR = pePowerAreaD / (3.14 * rCur);
719 TGeoTubeSeg* middleDiskPowerPE = new TGeoTubeSeg(Form("TRK_MLD_POWER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthCylinderMiddleServicesDisk / 2, -45, 45);
720 TGeoVolume* middleDiskPowerPEVolume = new TGeoVolume(Form("TRK_MLD_POWER_PE_%s%d", orLabel.c_str(), iSide), middleDiskPowerPE, medPE);
721 middleDiskPowerPEVolume->SetLineColor(kOrange + 1);
722
723 motherVolume->AddNode(middleDiskPowerCuVolume, 1, combiTrans);
724 motherVolume->AddNode(middleDiskPowerPEVolume, 1, combiTrans);
725
726 if (orientation == Orientation::kASide) {
727 // Add Barrel services
728 // create data fiber volumes
729 rCur += dR;
730 dR = siO2FiberAreaB / (3.14 * rCur);
731 TGeoTubeSeg* middleBarrelFiberSIO2 = new TGeoTubeSeg(Form("TRK_MLB_FIBER_SIO2sh_A%d", iSide), rCur, rCur + dR, zLengthCylinderMiddleServicesBarrel / 2, -45, 45);
732 TGeoVolume* middleBarrelFiberSIO2Volume = new TGeoVolume(Form("TRK_MLB_FIBER_SIO2_A%d", iSide), middleBarrelFiberSIO2, medSiO2);
733 middleBarrelFiberSIO2Volume->SetLineColor(kOrange - 9);
734
735 rCur += dR;
736 dR = peFiberAreaB / (3.14 * rCur);
737 TGeoTubeSeg* middleBarrelFiberPE = new TGeoTubeSeg(Form("TRK_MLB_FIBER_PEsh_A%d", iSide), rCur, rCur + dR, zLengthCylinderMiddleServicesBarrel / 2, -45, 45);
738 TGeoVolume* middleBarrelFiberPEVolume = new TGeoVolume(Form("TRK_MLB_FIBER_PE_A%d", iSide), middleBarrelFiberPE, medPE);
739 middleBarrelFiberPEVolume->SetLineColor(kOrange - 9);
740 auto* combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zMiddleServicesBarrelFwdConnection - zLengthCylinderMiddleServicesBarrel / 2), new TGeoRotation(nullptr, refAngle + iSide * 180., 0, 0));
741 motherVolume->AddNode(middleBarrelFiberSIO2Volume, 1, combiTrans);
742 motherVolume->AddNode(middleBarrelFiberPEVolume, 1, combiTrans);
743
744 // Create powerlines
745 rCur += dR;
746 dR = cuPowerAreaB / (3.14 * rCur);
747 TGeoTubeSeg* middleBarrelPowerCu = new TGeoTubeSeg(Form("TRK_MLB_POWER_CUsh_A%d", iSide), rCur, rCur + dR, zLengthCylinderMiddleServicesBarrel / 2, -45, 45);
748 TGeoVolume* middleBarrelPowerCuVolume = new TGeoVolume(Form("TRK_MLB_POWER_CU_A%d", iSide), middleBarrelPowerCu, medCu);
749 middleBarrelPowerCuVolume->SetLineColor(kOrange - 9);
750
751 rCur += dR;
752 dR = pePowerAreaB / (3.14 * rCur);
753 TGeoTubeSeg* middleBarrelPowerPE = new TGeoTubeSeg(Form("TRK_MLB_POWER_PEsh_A%d", iSide), rCur, rCur + dR, zLengthCylinderMiddleServicesBarrel / 2, -45, 45);
754 TGeoVolume* middleBarrelPowerPEVolume = new TGeoVolume(Form("TRK_MLB_POWER_PE_A%d", iSide), middleBarrelPowerPE, medPE);
755 middleBarrelPowerPEVolume->SetLineColor(kOrange - 9);
756
757 motherVolume->AddNode(middleBarrelPowerCuVolume, 1, combiTrans);
758 motherVolume->AddNode(middleBarrelPowerPEVolume, 1, combiTrans);
759
760 // TODO: add cooling ducts/pipes
761 }
762 }
763 }
764
765 // Barrel to forward connection disks
766 // A side: barrel + disk services
767 // C side: only disk services
768 float rMaxMiddleServicesBarFwd = 74.5f; // TODO: add thickness of service barrels
769 float rMinMiddleBarrel = rMinMiddleServices; // min radius of the service disk
770 diskCircumference = rMaxMiddleServicesBarFwd * 3.14; // Only half of the area is used
771 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
772 float refAngle = 0;
773 std::string orLabel("A");
774 if (orientation == Orientation::kCSide) {
775 refAngle = 90;
776 orLabel = "C";
777 }
778 double totalThickness = 0;
779 for (int iSide = 0; iSide < 2; iSide++) {
780 // Create fibers
781 double zCur = zMiddleServicesBarrelFwdConnection; // Change to f
782 double dZ = siO2FiberAreaD / diskCircumference / 2.;
783 totalThickness += 2 * dZ;
784 if (orientation == Orientation::kASide) {
785 dZ += siO2FiberAreaB / diskCircumference / 2.;
786 }
787 TGeoTubeSeg* middleBarFwdFiberSIO2 = new TGeoTubeSeg(Form("TRK_MIDBARFWD_FIBER_SIO2sh_%s%d", orLabel.c_str(), iSide), rMinMiddleBarrel, rMaxMiddleServicesBarFwd, dZ, -45, 45);
788 TGeoVolume* middleBarFwdFiberSIO2Volume = new TGeoVolume(Form("TRK_MIDBARFWD_FIBER_SIO2_%s%d", orLabel.c_str(), iSide), middleBarFwdFiberSIO2, medSiO2);
789 auto* rot = new TGeoRotation("", refAngle + iSide * 180., 0, 180.);
790 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
791
792 zCur += 2 * dZ;
793 dZ = peFiberAreaD / diskCircumference / 2.;
794 totalThickness += 2 * dZ;
795 if (orientation == Orientation::kASide) {
796 dZ += peFiberAreaB / diskCircumference / 2.;
797 }
798 TGeoTubeSeg* middleBarFwdFiberPE = new TGeoTubeSeg(Form("TRK_MIDBARFWD_FIBER_PEsh_%s%d", orLabel.c_str(), iSide), rMinMiddleBarrel, rMaxMiddleServicesBarFwd, dZ, -45, 45);
799 TGeoVolume* middleBarFwdFiberPEVolume = new TGeoVolume(Form("TRK_MIDBARFWD_FIBER_PE_%s%d", orLabel.c_str(), iSide), middleBarFwdFiberPE, medPE);
800 middleBarFwdFiberSIO2Volume->SetLineColor(kOrange + 1);
801 middleBarFwdFiberPEVolume->SetLineColor(kOrange + 1);
802 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
803 motherVolume->AddNode(middleBarFwdFiberSIO2Volume, 1, combiTransSIO2);
804 motherVolume->AddNode(middleBarFwdFiberPEVolume, 1, combiTransPE);
805
806 // Create powerlines
807 zCur += 2 * dZ;
808 dZ = cuPowerAreaD / diskCircumference / 2.;
809 totalThickness += 2 * dZ;
810 if (orientation == Orientation::kASide) {
811 dZ += cuPowerAreaB / diskCircumference / 2.;
812 }
813 TGeoTubeSeg* middleBarFwdPowerCu = new TGeoTubeSeg(Form("TRK_MIDBARFWD_POWER_CUsh_%s%d", orLabel.c_str(), iSide), rMinMiddleBarrel, rMaxMiddleServicesBarFwd, dZ, -45, 45);
814 TGeoVolume* middleBarFwdPowerCuVolume = new TGeoVolume(Form("TRK_MIDBARFWD_POWER_CU_%s%d", orLabel.c_str(), iSide), middleBarFwdPowerCu, medCu);
815 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
816
817 zCur += 2 * dZ;
818 dZ = pePowerAreaD / diskCircumference / 2.;
819 totalThickness += 2 * dZ;
820 if (orientation == Orientation::kASide) {
821 dZ += pePowerAreaB / diskCircumference / 2.;
822 }
823 TGeoTubeSeg* middleBarFwdPowerPE = new TGeoTubeSeg(Form("TRK_MIDBARFWD_POWER_PEsh_%s%d", orLabel.c_str(), iSide), rMinMiddleBarrel, rMaxMiddleServicesBarFwd, dZ, -45, 45);
824 TGeoVolume* middleBarFwdPowerPEVolume = new TGeoVolume(Form("TRK_MIDBARFWD_POWER_PE_%s%d", orLabel.c_str(), iSide), middleBarFwdPowerPE, medPE);
825 middleBarFwdPowerCuVolume->SetLineColor(kOrange + 1);
826 middleBarFwdPowerPEVolume->SetLineColor(kOrange + 1);
827 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
828 motherVolume->AddNode(middleBarFwdPowerCuVolume, 1, combiTransCu);
829 motherVolume->AddNode(middleBarFwdPowerPEVolume, 1, combiTransPEPower);
830
831 // TODO: add cooling ducts/pipes
832 }
833
834 // Forward part
835 float zLengthMiddleServicesFwd = 350.f - (zMiddleServicesBarrelFwdConnection + totalThickness);
836 float rMinMiddleServicesFwd = 74.5f; // 74.5cm
837
838 for (int iSide = 0; iSide < 2; iSide++) {
839 // Create fibers
840
841 float translation = (int)orientation * (zMiddleServicesBarrelFwdConnection + totalThickness + zLengthMiddleServicesFwd / 2);
842
843 double rCur = rMinMiddleServicesFwd;
844 double dR = siO2FiberAreaD / (3.14 * rCur);
845 if (orientation == Orientation::kASide) {
846 dR += siO2FiberAreaB / (3.14 * rCur);
847 }
848 TGeoTubeSeg* middleFwdFiberSIO2 = new TGeoTubeSeg(Form("TRK_MIDFWD_FIBER_SIO2sh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthMiddleServicesFwd / 2, -45, 45);
849 TGeoVolume* middleFwdFiberSIO2Volume = new TGeoVolume(Form("TRK_MIDFWD_FIBER_SIO2_%s%d", orLabel.c_str(), iSide), middleFwdFiberSIO2, medSiO2);
850 middleFwdFiberSIO2Volume->SetLineColor(kOrange + 1);
851
852 rCur += dR;
853 dR = peFiberAreaD / (3.14 * rCur);
854 if (orientation == Orientation::kASide) {
855 dR += peFiberAreaB / (3.14 * rCur);
856 }
857 TGeoTubeSeg* middleFwdFiberPE = new TGeoTubeSeg(Form("TRK_MIDFWD_FIBER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthMiddleServicesFwd / 2, -45, 45);
858 TGeoVolume* middleFwdFiberPEVolume = new TGeoVolume(Form("TRK_MIDFWD_FIBER_PE_%s%d", orLabel.c_str(), iSide), middleFwdFiberPE, medPE);
859 middleFwdFiberPEVolume->SetLineColor(kOrange + 1);
860
861 auto* rot = new TGeoRotation("", refAngle + iSide * 180., 0, 0.);
862 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, rot);
863 motherVolume->AddNode(middleFwdFiberSIO2Volume, 1, combiTrans);
864 motherVolume->AddNode(middleFwdFiberPEVolume, 1, combiTrans);
865
866 // Create powerlines
867 rCur += dR;
868 dR = cuPowerAreaD / (3.14 * rCur);
869 if (orientation == Orientation::kASide) {
870 dR += cuPowerAreaB / (3.14 * rCur);
871 }
872 TGeoTubeSeg* middleFwdPowerCu = new TGeoTubeSeg(Form("TRK_MIDFWD_POWER_CUsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthMiddleServicesFwd / 2, -45, 45);
873 TGeoVolume* middleFwdPowerCuVolume = new TGeoVolume(Form("TRK_MIDFWD_POWER_CU_%s%d", orLabel.c_str(), iSide), middleFwdPowerCu, medCu);
874 middleFwdPowerCuVolume->SetLineColor(kOrange + 1);
875
876 rCur += dR;
877 dR = pePowerAreaD / (3.14 * rCur);
878 if (orientation == Orientation::kASide) {
879 dR += pePowerAreaB / (3.14 * rCur);
880 }
881 TGeoTubeSeg* middleFwdPowerPE = new TGeoTubeSeg(Form("TRK_MIDFWD_POWER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthMiddleServicesFwd / 2, -45, 45);
882 TGeoVolume* middleFwdPowerPEVolume = new TGeoVolume(Form("TRK_MIDFWD_POWER_PE_%s%d", orLabel.c_str(), iSide), middleFwdPowerPE, medPE);
883 middleFwdPowerPEVolume->SetLineColor(kOrange + 1);
884 motherVolume->AddNode(middleFwdPowerCuVolume, 1, combiTrans);
885 motherVolume->AddNode(middleFwdPowerPEVolume, 1, combiTrans);
886
887 // TODO: add cooling ducts/pipes
888 }
889 }
890}
891
892void TRKServices::createOTBarrelWalls(TGeoVolume* motherVolume)
893{
894 // Closes each OT quarter barrel azimuthally (a wall in the cut plane) and at mid-rapidity
895 // (a half disk at z = 0); radially the two cylindrical shells already do it. Both run
896 // continuously between the shells, through the slots in the layer envelopes.
898 TGeoMedium* medCFiber = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_CARBONFIBERM55J6K");
899
900 // Only the realistic OT barrel is built in quarters with slotted envelopes.
901 if (TRKBaseParam::Instance().getLayoutMLOT() != kSimplifiedRealistic) {
902 LOGP(info, "OT barrel separation walls skipped: they belong to the kSimplifiedRealistic OT barrel");
903 return;
904 }
905
906 const float thickness = TRKBaseParam::Instance().otBarrelWallThickness;
907 if (thickness <= 0.f) {
908 LOGP(info, "OT barrel separation walls disabled (TRKBase.otBarrelWallThickness = {})", thickness);
909 return;
910 }
911
912 const float zWallOuter = 142.0f; // cm, up to the OT barrel service disk
913 const float phiCut = 90.f; // deg, the vertical cut plane, as in TRKOTLayerRealistic::createLayer
914
915 // The wall is a box, so its outer edge is pulled in until the corners, not the face,
916 // sit on the outer shell.
917 const float zLength = zWallOuter - thickness;
918 const float rHiBox = std::sqrt(sOTShellRMin * sOTShellRMin - thickness * thickness / 4.f);
919 const float rMidWall = 0.5 * (sMLOTShellRMax + rHiBox);
920 LOGP(info, "Creating OT barrel separation walls, {} cm of carbon fibre, continuous over r = [{}, {}] cm", thickness, sMLOTShellRMax, rHiBox);
921
922 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
923 const std::string orLabel = (orientation == Orientation::kASide) ? "A" : "C";
924 const int zSign = (int)orientation;
925
926 for (int iSide = 0; iSide < 2; ++iSide) {
927 const double phi = (phiCut + iSide * 180.f) * TMath::DegToRad();
928 TGeoBBox* wallSh = new TGeoBBox(Form("TRK_OT_WALL_PHIsh_%s%d", orLabel.c_str(), iSide),
929 (rHiBox - sMLOTShellRMax) / 2., thickness / 2., zLength / 2.);
930 TGeoVolume* wallVol = new TGeoVolume(Form("TRK_OT_WALL_PHI_%s%d", orLabel.c_str(), iSide), wallSh, medCFiber);
931 wallVol->SetLineColor(kGray);
932 auto* rot = new TGeoRotation("", phiCut + iSide * 180.f, 0, 0);
933 motherVolume->AddNode(wallVol, 1,
934 new TGeoCombiTrans(rMidWall * std::cos(phi), rMidWall * std::sin(phi),
935 zSign * (thickness + zLength / 2.), rot));
936 }
937 }
938
939 // One per azimuthal half and per eta half-barrel, back to back in the gap between them.
940 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
941 const std::string orLabel = (orientation == Orientation::kASide) ? "A" : "C";
942 const int zSign = (int)orientation;
943 for (int iHalf = 0; iHalf < 2; ++iHalf) {
944 TGeoTubeSeg* diskSh = new TGeoTubeSeg(Form("TRK_OT_WALL_Z0sh_%s%d", orLabel.c_str(), iHalf),
945 sMLOTShellRMax, sOTShellRMin, thickness / 2., phiCut + iHalf * 180.f, phiCut + (iHalf + 1) * 180.f);
946 TGeoVolume* diskVol = new TGeoVolume(Form("TRK_OT_WALL_Z0_%s%d", orLabel.c_str(), iHalf), diskSh, medCFiber);
947 diskVol->SetLineColor(kGray);
948 motherVolume->AddNode(diskVol, 1, new TGeoTranslation(0, 0, zSign * thickness / 2.));
949 }
950 }
951}
952
953void TRKServices::createOTServicesPeacock(TGeoVolume* motherVolume)
954{
955 // This implments the service barrels for power + data for the OT barrels and disks
956 // TODO: add cooling
957
959
960 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
961 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
962 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
963 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
964 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
965 TGeoMedium* medCFiber = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_CARBONFIBERM55J6K");
966
967 // OT Disk service constants
968 const int OTDisknFiber = 3 * 51;
969 const int OTDisknPower = 3 * 34;
970 float siO2FiberAreaD = OTDisknFiber * mFiberArea * mFiberComposition[0];
971 float peFiberAreaD = OTDisknFiber * mFiberArea * mFiberComposition[1];
972
973 float puCoolingAreaD = 0;
974 float h2oCoolingAreaD = 0;
975 float cuPowerAreaD = OTDisknPower * mPowerBundleArea * mPowerBundleComposition[0];
976 float pePowerAreaD = OTDisknPower * mPowerBundleArea * mPowerBundleComposition[1];
977
978 // OT Barrel service constants
979 const int OTBarrelnFiber = 460;
980 const int OTBarrelnPower = 306;
981 float siO2FiberAreaB = OTBarrelnFiber * mFiberArea * mFiberComposition[0];
982 float peFiberAreaB = OTBarrelnFiber * mFiberArea * mFiberComposition[1];
983
984 float puCoolingAreaB = 0;
985 float h2oCoolingAreaB = 0;
986 float cuPowerAreaB = OTBarrelnPower * mPowerBundleArea * mPowerBundleComposition[0];
987 float pePowerAreaB = OTBarrelnPower * mPowerBundleArea * mPowerBundleComposition[1];
988
989 // geometry of service "disk" for OT barrel
990 double rMinOTbarrelServices = 45.0; // cm, radius of first OT barrel layer
991 double rMaxOTbarrelServices = 78.0; // cm, radius of last OT barrel layer
992 double zOTbarrelServices = 142.0; // cm, approximate position of OT services in z
993
994 // geometry of service "tubes" for OT barrel
995 float rMinOuterBarrelTubeServices = rMaxOTbarrelServices; // cm, IA, May 11, 2026: temporary radius (?)
996 float zStartOuterBarrelTubeServices = zOTbarrelServices + 0.8f; // cm, IA, May 11, 2026: start "OT service tubes" close in z to the "OT service disks"
997 float zLengthOuterBarrelTubeServices = 215.f; // cm, IA, May 11, 2026: temporary length (?)
998
999 // geometry of service "tubes" for OT disks
1000 float rMinOuterDiskServices = 71.f; // cm
1001 float zStartOuterDiskServices = 149.f; // cm
1002 float zLengthOuterDiskServices = 201.f; // cm
1003
1004 // Carbon Fiber Cylinder support for the middle tracker
1005 float rMinOuterCarbonSupport = sOTShellRMin; // TODO: get more precise location
1006 float rMaxOuterCarbonSupport = sOTShellRMin + sOTShellThickness; // 4 mm of carbon fiber, the only load-bearing wall
1007 const float zLengthOuterCarbon = 280.0f; // Rough guess for now
1008 TGeoTube* outerBarrelCarbonSupport = new TGeoTube("TRK_OT_CARBONSUPPORTsh", rMinOuterCarbonSupport, rMaxOuterCarbonSupport, zLengthOuterCarbon / 2.);
1009 TGeoVolume* outerBarrelCarbonSupportVolume = new TGeoVolume("TRK_OT_CARBONSUPPORT", outerBarrelCarbonSupport, medCFiber);
1010 outerBarrelCarbonSupportVolume->SetLineColor(kGray);
1011 LOGP(info, "Creating carbon fiber support for Outer Tracker");
1012 motherVolume->AddNode(outerBarrelCarbonSupportVolume, 1, nullptr);
1013
1014 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
1015 std::string orLabel = "A";
1016 float refAngle = 0;
1017 if (orientation == Orientation::kCSide) {
1018 orLabel = "C";
1019 refAngle = 90;
1020 }
1021 // TODO: add cables/connections at ends of OT barrels
1022 double zCur = zOTbarrelServices;
1023
1024 double dZ = siO2FiberAreaB / (4 * 3.14 * rMaxOTbarrelServices);
1025 TGeoTube* outerBarrelFiberSIO2 = new TGeoTube(Form("TRK_OUTERBARREL_FIBER_SIO2sh_%s", orLabel.c_str()), rMinOTbarrelServices, rMaxOTbarrelServices, dZ);
1026 TGeoVolume* outerBarrelFiberSIO2Volume = new TGeoVolume(Form("TRK_OUTERBARREL_FIBER_SIO2_%s", orLabel.c_str()), outerBarrelFiberSIO2, medSiO2);
1027 outerBarrelFiberSIO2Volume->SetLineColor(kAzure + 6);
1028 auto* combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), nullptr);
1029 motherVolume->AddNode(outerBarrelFiberSIO2Volume, 1, combiTrans);
1030
1031 zCur += 2 * dZ;
1032 dZ = peFiberAreaB / (4 * 3.14 * rMaxOTbarrelServices);
1033 TGeoTube* outerBarrelFiberPE = new TGeoTube(Form("TRK_OUTERBARREL_FIBER_PEsh_%s", orLabel.c_str()), rMinOTbarrelServices, rMaxOTbarrelServices, dZ);
1034 TGeoVolume* outerBarrelFiberPEVolume = new TGeoVolume(Form("TRK_OUTERBARREL_FIBER_PE_%s", orLabel.c_str()), outerBarrelFiberPE, medPE);
1035 outerBarrelFiberPEVolume->SetLineColor(kAzure + 6);
1036 combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), nullptr);
1037 motherVolume->AddNode(outerBarrelFiberPEVolume, 1, combiTrans);
1038
1039 zCur += 2 * dZ;
1040 dZ = cuPowerAreaB / (4 * 3.14 * rMaxOTbarrelServices);
1041 TGeoTube* outerBarrelPowerCu = new TGeoTube(Form("TRK_OUTERBARREL_POWER_CUsh_%s", orLabel.c_str()), rMinOTbarrelServices, rMaxOTbarrelServices, dZ);
1042 TGeoVolume* outerBarrelPowerCuVolume = new TGeoVolume(Form("TRK_OUTERBARREL_POWER_CU_%s", orLabel.c_str()), outerBarrelPowerCu, medCu);
1043 outerBarrelPowerCuVolume->SetLineColor(kAzure + 6);
1044 combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), nullptr);
1045 motherVolume->AddNode(outerBarrelPowerCuVolume, 1, combiTrans);
1046
1047 zCur += 2 * dZ;
1048 dZ = pePowerAreaB / (4 * 3.14 * rMaxOTbarrelServices);
1049 TGeoTube* outerBarrelPowerPE = new TGeoTube(Form("TRK_OUTERBARREL_POWER_PEsh_%s", orLabel.c_str()), rMinOTbarrelServices, rMaxOTbarrelServices, dZ);
1050 TGeoVolume* outerBarrelPowerPEVolume = new TGeoVolume(Form("TRK_OUTERBARREL_POWER_PE_%s", orLabel.c_str()), outerBarrelPowerPE, medPE);
1051 outerBarrelPowerPEVolume->SetLineColor(kAzure + 6);
1052 combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), nullptr);
1053 motherVolume->AddNode(outerBarrelPowerPEVolume, 1, combiTrans);
1054
1055 for (int iSide = 0; iSide < 2; iSide++) {
1056 // #### OT barrel services, implemented as tubes
1057 // Create fibers for service barrel tubes
1058 double rCur = rMinOuterBarrelTubeServices; // set starting radius for barrel service tube
1059 double dR = siO2FiberAreaB / (3.14 * rCur);
1060 TGeoTubeSeg* outerBarrelTubeFiberSIO2 = new TGeoTubeSeg(Form("TRK_OUTERBARREL_TUBE_FIBER_SIO2sh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterBarrelTubeServices / 2, -45, 45);
1061 TGeoVolume* outerBarrelTubeFiberSIO2Volume = new TGeoVolume(Form("TRK_OUTERBARREL_TUBE_FIBER_SIO2_%s%d", orLabel.c_str(), iSide), outerBarrelTubeFiberSIO2, medSiO2);
1062 outerBarrelTubeFiberSIO2Volume->SetLineColor(kAzure + 6);
1063
1064 rCur += dR;
1065 dR = peFiberAreaB / (3.14 * rCur);
1066 TGeoTubeSeg* outerBarrelTubeFiberPE = new TGeoTubeSeg(Form("TRK_OUTERBARREL_TUBE_FIBER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterBarrelTubeServices / 2, -45, 45);
1067 TGeoVolume* outerBarrelTubeFiberPEVolume = new TGeoVolume(Form("TRK_OUTERBARREL_TUBE_FIBER_PE_%s%d", orLabel.c_str(), iSide), outerBarrelTubeFiberPE, medPE);
1068 outerBarrelTubeFiberPEVolume->SetLineColor(kAzure + 6);
1069
1070 float translation = (int)orientation * (zStartOuterBarrelTubeServices + zLengthOuterBarrelTubeServices / 2);
1071 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, new TGeoRotation("", refAngle + iSide * 180., 0, 0));
1072 motherVolume->AddNode(outerBarrelTubeFiberSIO2Volume, 1, combiTrans);
1073 motherVolume->AddNode(outerBarrelTubeFiberPEVolume, 1, combiTrans);
1074
1075 // Create power lines for service barrel tubes
1076 rCur += dR;
1077 dR = cuPowerAreaB / (3.14 * rCur);
1078 TGeoTubeSeg* outerBarrelTubePowerCu = new TGeoTubeSeg(Form("TRK_OUTERBARREL_TUBE_POWER_CUsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterBarrelTubeServices / 2, -45, 45);
1079 TGeoVolume* outerBarrelTubePowerCuVolume = new TGeoVolume(Form("TRK_OUTERBARREL_TUBE_POWER_CU_%s%d", orLabel.c_str(), iSide), outerBarrelTubePowerCu, medCu);
1080 outerBarrelTubePowerCuVolume->SetLineColor(kAzure + 6);
1081
1082 rCur += dR;
1083 dR = pePowerAreaB / (3.14 * rCur);
1084 TGeoTubeSeg* outerBarrelTubePowerPE = new TGeoTubeSeg(Form("TRK_OUTERBARREL_TUBE_POWER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterBarrelTubeServices / 2, -45, 45);
1085 TGeoVolume* outerBarrelTubePowerPEVolume = new TGeoVolume(Form("TRK_OUTERBARREL_TUBE_POWER_PE_%s%d", orLabel.c_str(), iSide), outerBarrelTubePowerPE, medPE);
1086 outerBarrelTubePowerPEVolume->SetLineColor(kAzure + 6);
1087 motherVolume->AddNode(outerBarrelTubePowerCuVolume, 1, combiTrans);
1088 motherVolume->AddNode(outerBarrelTubePowerPEVolume, 1, combiTrans);
1089
1090 // #### OT disk services, implemented as tubes
1091 // Create fibers for disks
1092 rCur = rMinOuterDiskServices; // set starting radius for disk service tube
1093 dR = siO2FiberAreaD / (3.14 * rCur);
1094 TGeoTubeSeg* outerDisksFiberSIO2 = new TGeoTubeSeg(Form("TRK_OUTERDISKS_FIBER_SIO2sh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterDiskServices / 2, -45, 45);
1095 TGeoVolume* outerDisksFiberSIO2Volume = new TGeoVolume(Form("TRK_OUTERDISKS_FIBER_SIO2_%s%d", orLabel.c_str(), iSide), outerDisksFiberSIO2, medSiO2);
1096 outerDisksFiberSIO2Volume->SetLineColor(kMagenta);
1097
1098 rCur += dR;
1099 dR = peFiberAreaD / (3.14 * rCur);
1100 TGeoTubeSeg* outerDisksFiberPE = new TGeoTubeSeg(Form("TRK_OUTERDISKS_FIBER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterDiskServices / 2, -45, 45);
1101 TGeoVolume* outerDisksFiberPEVolume = new TGeoVolume(Form("TRK_OUTERDISKS_FIBER_PE_%s%d", orLabel.c_str(), iSide), outerDisksFiberPE, medPE);
1102 outerDisksFiberPEVolume->SetLineColor(kMagenta);
1103
1104 translation = (int)orientation * (zStartOuterDiskServices + zLengthOuterDiskServices / 2);
1105 combiTrans = new TGeoCombiTrans(0, 0, translation, new TGeoRotation("", refAngle + iSide * 180., 0, 0));
1106 motherVolume->AddNode(outerDisksFiberSIO2Volume, 1, combiTrans);
1107 motherVolume->AddNode(outerDisksFiberPEVolume, 1, combiTrans);
1108
1109 // Create power lines for disks
1110 rCur += dR;
1111 dR = cuPowerAreaD / (3.14 * rCur);
1112 TGeoTubeSeg* outerDisksPowerCu = new TGeoTubeSeg(Form("TRK_OUTERDISKS_POWER_CUsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterDiskServices / 2, -45, 45);
1113 TGeoVolume* outerDisksPowerCuVolume = new TGeoVolume(Form("TRK_OUTERDISKS_POWER_CU_%s%d", orLabel.c_str(), iSide), outerDisksPowerCu, medCu);
1114 outerDisksPowerCuVolume->SetLineColor(kMagenta + 1);
1115
1116 rCur += dR;
1117 dR = pePowerAreaD / (3.14 * rCur);
1118 TGeoTubeSeg* outerDisksPowerPE = new TGeoTubeSeg(Form("TRK_OUTERDISKS_POWER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterDiskServices / 2, -45, 45);
1119 TGeoVolume* outerDisksPowerPEVolume = new TGeoVolume(Form("TRK_OUTERDISKS_POWER_PE_%s%d", orLabel.c_str(), iSide), outerDisksPowerPE, medPE);
1120 outerDisksPowerPEVolume->SetLineColor(kMagenta + 1);
1121 motherVolume->AddNode(outerDisksPowerCuVolume, 1, combiTrans);
1122 motherVolume->AddNode(outerDisksPowerPEVolume, 1, combiTrans);
1123
1124 // TODO: add cooling ducts/pipes
1125 }
1126 }
1127}
1128
1129} // namespace trk
1130} // namespace o2
float phiCut
Definition Tracker.cxx:213
specs of the ALICE3 TRK
static MaterialManager & Instance()
static const char * getTRKServiceVolPattern()
static const char * getTRKLayerPattern()
TString mVacuumCompositeFormula
Definition TRKServices.h:71
void registerVacuum(TGeoVolume *motherVolume)
void createServicesAroundBeamPipe(TGeoVolume *motherVolume)
void createOTServicesPeacock(TGeoVolume *motherVolume)
void createOuterBarrelServices(TGeoVolume *motherVolume)
float mPowerBundleComposition[2]
Definition TRKServices.h:82
static constexpr float sMLOTShellThickness
Definition TRKServices.h:66
static constexpr float sMLOTShellRMax
Definition TRKServices.h:65
static constexpr float sOTShellThickness
Definition TRKServices.h:68
void createServices(TGeoVolume *motherVolume)
void createMLServicesPeacock(TGeoVolume *motherVolume)
void excavateFromVacuum(TString shapeToExcavate)
void createOTBarrelWalls(TGeoVolume *motherVolume)
static constexpr float sOTShellRMin
Definition TRKServices.h:67
void createOuterDisksServices(TGeoVolume *motherVolume)
float mFiberComposition[2]
Definition TRKServices.h:81
void createMiddleServices(TGeoVolume *motherVolume)
@ kSimplifiedRealistic
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...