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
17#include <TGeoVolume.h>
18#include <TGeoNode.h>
19#include <TGeoTube.h>
20#include <TGeoCompositeShape.h>
21#include <TColor.h>
22#include <Rtypes.h>
23#include <numeric>
24
25#include <Framework/Logger.h>
26
27using std::string;
28
29namespace o2
30{
31namespace trk
32{
33
35{
36 int ifield = 2; // ?
37 float fieldm = 10.0; // ?
38
39 // Defines tracking media parameters.
40 float epsil = .1; // Tracking precision,
41 float stemax = -0.01; // Maximum displacement for multiple scat
42 float tmaxfd = -20.; // Maximum angle due to field deflection
43 float deemax = -.3; // Maximum fractional energy loss, DLS
44 float stmin = -.8;
45
47
48 // Ceramic (Aluminium Oxide)
49 float aCer[2] = {26.981538, 15.9994};
50 float zCer[2] = {13., 8.};
51 float wCer[2] = {0.5294, 0.4706}; // Mass %, which makes sense. TODO: check if Mixture needs mass% or comp%
52 float dCer = 3.97;
53
54 // Air
55 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
56 float zAir[4] = {6., 7., 8., 18.};
57 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
58 float dAir = 1.20479E-3;
59 float dAir1 = 1.20479E-11; // vacuum denisity inside pipe
60
61 // Water
62 float aWater[2] = {1.00794, 15.9994};
63 float zWater[2] = {1., 8.};
64 float wWater[2] = {0.111894, 0.888106};
65 float dWater = 1.0;
66
67 // Fused silica SiO2 https://pdg.lbl.gov/2023/AtomicNuclearProperties/HTML/silicon_dioxide_fused_quartz.html
68 float aSiO2[2] = {28.0855, 15.9990};
69 float zSiO2[2] = {14., 8.};
70 float wSiO2[2] = {0.467, 0.533};
71 float dSiO2 = 2.2;
72
73 // Polyethylene from alice 2 absorber
74 float aPolyethylene[2] = {12.01, 1.};
75 float zPolyethylene[2] = {6., 1.};
76 float wPolyethylene[2] = {.33, .67};
77
78 // Polyurethane [HN-CO-O] from alice 2 mft
79 int nPolyurethane = 4;
80 float aPolyurethane[4] = {1.00794, 14.010, 12.0107, 15.9994};
81 float zPolyurethane[4] = {1.0, 7.0, 6.0, 8.0};
82 float wPolyurethane[4] = {0.017077588, 0.237314387, 0.203327619, 0.542280405};
83 float dPolyurethane = 1.25;
84
85 // Aluminium 5083 - alloy of Mn, Fe, Cu, Mg, Si, Zn, Cr, Ti, Al
86 // Al5083 is considered as material for the iris vacuum vessel
87 // https://www.smithmetal.com/5083.htm
88 float aAl5083[9] = {54.938, 55.845, 63.546, 24.305, 28.086, 65.38, 51.996, 47.867, 26.982};
89 float zAl5083[9] = {25., 26., 29., 12., 14., 30., 24., 22., 13.};
90 // 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
91 float wAl5083[9] = {0.007, 0.004, 0.001, 0.0445, 0.004, 0.0025, 0.0015, 0.0015, 0.934};
92 float dAl5083 = 2.650;
93
94 // AlBeMet AM162H is a nanocomposite, not an alloy
95 // 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
96 float aAlBeMet[2] = {26.982, 9.012};
97 float zAlBeMet[2] = {13., 4.};
98 float wAlBeMet[2] = {0.38, 0.62};
99 float dAlBeMet = 2.071;
100
101 matmgr.Mixture("ALICE3_TRKSERVICES", 66, "CERAMIC", aCer, zCer, dCer, 2, wCer); // Ceramic for cold plate
102 matmgr.Mixture("ALICE3_TRKSERVICES", 68, "AIR", aAir, zAir, dAir, 4, wAir); // Air for placeholding cables
103 matmgr.Mixture("ALICE3_TRKSERVICES", 69, "POLYETHYLENE", aPolyethylene, zPolyethylene, .95, 2, wPolyethylene); // Polyethylene for fibers
104 matmgr.Mixture("ALICE3_TRKSERVICES", 70, "POLYURETHANE", aPolyurethane, zPolyurethane, dPolyurethane, nPolyurethane, wPolyurethane); // Polyurethane for cooling pipes
105 matmgr.Mixture("ALICE3_TRKSERVICES", 71, "SILICONDIOXIDE", aSiO2, zSiO2, dSiO2, 2, wSiO2); // Fused silica SiO2
106 matmgr.Mixture("ALICE3_TRKSERVICES", 72, "WATER", aWater, zWater, dWater, 2, wWater); // Water for cooling pipes
107 matmgr.Material("ALICE3_TRKSERVICES", 67, "COPPER", 63.546, 29, 8.96, 1.43, 15.1); // Copper for cables
108 matmgr.Material("ALICE3_TRKSERVICES", 73, "BERYLLIUM", 9.01, 4., 1.848, 35.3, 36.7); // Beryllium - Candidate for IRIS vacuum vessel
109 matmgr.Mixture("ALICE3_TRKSERVICES", 74, "ALUMINIUM5083", aAl5083, zAl5083, dAl5083, 9, wAl5083); // AL5083 - Candidate for IRIS vacuum vessel
110 matmgr.Mixture("ALICE3_TRKSERVICES", 75, "ALUMINIUMBERYLLIUMMETAL", aAlBeMet, zAlBeMet, dAlBeMet, 2, wAlBeMet); // Aluminium-Beryllium metal - Candidate for IRIS vacuum vessel
111 matmgr.Material("ALICE3_TRKSERVICES", 76, "CARBONFIBERM55J6K", 12.0107, 6, 1.92, 22.4, 999); // Carbon Fiber M55J
112 matmgr.Mixture("ALICE3_PIPE", 77, "VACUUM", aAir, zAir, dAir1, 4, wAir);
113
114 matmgr.Medium("ALICE3_TRKSERVICES", 1, "CERAMIC", 66, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Ceramic for cold plate
115 matmgr.Medium("ALICE3_TRKSERVICES", 2, "COPPER", 67, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Copper for cables
116 matmgr.Medium("ALICE3_TRKSERVICES", 3, "AIR", 68, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Air for placeholding cables
117 matmgr.Medium("ALICE3_TRKSERVICES", 4, "POLYETHYLENE", 69, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Polyethylene for fibers
118 matmgr.Medium("ALICE3_TRKSERVICES", 5, "POLYURETHANE", 70, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Polyurethane for cooling pipes
119 matmgr.Medium("ALICE3_TRKSERVICES", 6, "SILICONDIOXIDE", 71, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Fused silica SiO2
120 matmgr.Medium("ALICE3_TRKSERVICES", 7, "WATER", 72, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Water for cooling pipes
121 matmgr.Medium("ALICE3_TRKSERVICES", 8, "BERYLLIUM", 73, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Beryllium for IRIS vacuum vessel
122 matmgr.Medium("ALICE3_TRKSERVICES", 9, "ALUMINIUM5083", 74, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Al5083 for IRIS vacuum vessel
123 matmgr.Medium("ALICE3_TRKSERVICES", 10, "ALUMINIUMBERYLLIUMMETAL", 75, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // AlBeMet for IRIS vacuum vessel
124 matmgr.Medium("ALICE3_TRKSERVICES", 11, "CARBONFIBERM55J6K", 76, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Carbon Fiber M55J
125 matmgr.Medium("ALICE3_PIPE", 12, "VACUUM", 77, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin); // Vacuum inside the beam pipe
126}
127
128void TRKServices::createServices(TGeoVolume* motherVolume)
129{
130
131 TGeoVolumeAssembly* vol = new TGeoVolumeAssembly(GeometryTGeo::getTRKServiceVolPattern());
132 motherVolume->AddNode(vol, 2, new TGeoTranslation(0, 0., 0));
135 auto& trkPars = TRKBaseParam::Instance();
136 if (trkPars.getLayoutSRV() == kLOISymm) {
137 LOGP(info, "TRK services: LoI version");
141 } else {
142 LOGP(info, "TRK services: Peacock layout");
145 }
146}
147
149{
150 Double_t pipeRIn = 1.8f;
151 Double_t A3IPLength = 1000.f;
152 Double_t vacuumVesselRIn = 5.6f;
153 Double_t vacuumVesselThickness = 0.08f;
154 Double_t vacuumVesselLength = 76.f;
155
156 // Vacuum for A and C Side
157 Double_t vacuumASideLength = A3IPLength / 2. - vacuumVesselThickness - vacuumVesselLength / 2.;
158 Double_t vacuumCSideLength = A3IPLength / 2. + vacuumVesselLength / 2.;
159
160 // Vacuum tubes
161 TGeoTube* vacuumASide = new TGeoTube("VACUUM_Ash", 0., pipeRIn, vacuumASideLength / 2.);
162 TGeoTube* vacuumCSide = new TGeoTube("VACUUM_Csh", 0., vacuumVesselRIn, vacuumCSideLength / 2.);
163
164 // Vacuum positions
165 TGeoTranslation* posVacuumASide = new TGeoTranslation("VACUUM_ASIDE_POSITION", 0, 0, vacuumVesselLength / 2. + vacuumVesselThickness + vacuumASideLength / 2.);
166 posVacuumASide->RegisterYourself();
167 TGeoTranslation* posVacuumCSide = new TGeoTranslation("VACUUM_CSIDE_POSITION", 0, 0, vacuumVesselLength / 2. - vacuumCSideLength / 2.);
168 posVacuumCSide->RegisterYourself();
169
171 "VACUUM_Ash:VACUUM_ASIDE_POSITION"
172 "+VACUUM_Csh:VACUUM_CSIDE_POSITION";
173}
174
175void TRKServices::excavateFromVacuum(TString shapeToExcavate)
176{
178 mVacuumCompositeFormula += shapeToExcavate;
179}
180
181void TRKServices::registerVacuum(TGeoVolume* motherVolume)
182{
184 const TGeoMedium* kMedVac = matmgr.getTGeoMedium("ALICE3_PIPE_VACUUM");
185
186 TGeoCompositeShape* vacuumComposite = new TGeoCompositeShape("A3IP_VACUUMsh", mVacuumCompositeFormula);
187 TGeoVolume* vacuumVolume = new TGeoVolume("A3IP_VACUUM", vacuumComposite, kMedVac);
188
189 // Add the vacuum to the barrel
190 vacuumVolume->SetLineColor(kAzure + 7);
191 vacuumVolume->SetTransparency(80);
192
193 motherVolume->AddNode(vacuumVolume, 1, new TGeoTranslation(0, 0, 0));
194}
195
196void TRKServices::createOuterDisksServices(TGeoVolume* motherVolume)
197{
198 // This method hardcoes the pink shape for the inner services
200
201 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
202 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
203 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
204 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
205 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
206
207 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
208 // Create fibers: 2.12mm
209 float siO2FiberThick = 0.5 * 0.212;
210 float peFiberThick = 0.5 * 0.212;
211
212 float rMinInnerServices = 68.5f; // 68.5cm
213 float zLengthInnerServices = 201.f; // 201cm
214 float translation = (int)orientation * (149.f + zLengthInnerServices / 2); // ±149cm
215
216 TGeoTube* outerDisksFiberSIO2 = new TGeoTube("TRK_OUTERDISKS_FIBER_SIO2sh", rMinInnerServices, rMinInnerServices + siO2FiberThick, zLengthInnerServices / 2);
217 TGeoTube* outerDisksFiberPE = new TGeoTube("TRK_OUTERDISKS_FIBER_PEsh", rMinInnerServices + siO2FiberThick, rMinInnerServices + siO2FiberThick + peFiberThick, zLengthInnerServices / 2);
218 rMinInnerServices += siO2FiberThick + peFiberThick;
219 TGeoVolume* outerDisksFiberSIO2Volume = new TGeoVolume("TRK_OUTERDISKS_FIBER_SIO2", outerDisksFiberSIO2, medSiO2);
220 TGeoVolume* outerDisksFiberPEVolume = new TGeoVolume("TRK_OUTERDISKS_FIBER_PE", outerDisksFiberPE, medPE);
221 outerDisksFiberSIO2Volume->SetLineColor(kGray);
222 outerDisksFiberPEVolume->SetLineColor(kGray);
223 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, nullptr);
224 motherVolume->AddNode(outerDisksFiberSIO2Volume, 1, combiTrans);
225 motherVolume->AddNode(outerDisksFiberPEVolume, 1, combiTrans);
226
227 // Create power lines: 11.86mm
228 float cuPowerThick = 0.09 * 1.186;
229 float pePowerThick = 0.91 * 1.186;
230
231 TGeoTube* outerDisksPowerCu = new TGeoTube("TRK_OUTERDISKS_POWER_CUsh", rMinInnerServices, rMinInnerServices + cuPowerThick, zLengthInnerServices / 2);
232 TGeoTube* outerDisksPowerPE = new TGeoTube("TRK_OUTERDISKS_POWER_PEsh", rMinInnerServices + cuPowerThick, rMinInnerServices + cuPowerThick + pePowerThick, zLengthInnerServices / 2);
233 rMinInnerServices += cuPowerThick + pePowerThick;
234 TGeoVolume* outerDisksPowerCuVolume = new TGeoVolume("TRK_OUTERDISKS_POWER_CU", outerDisksPowerCu, medCu);
235 TGeoVolume* outerDisksPowerPEVolume = new TGeoVolume("TRK_OUTERDISKS_POWER_PE", outerDisksPowerPE, medPE);
236 outerDisksPowerCuVolume->SetLineColor(kGray);
237 outerDisksPowerPEVolume->SetLineColor(kGray);
238 motherVolume->AddNode(outerDisksPowerCuVolume, 1, combiTrans);
239 motherVolume->AddNode(outerDisksPowerPEVolume, 1, combiTrans);
240
241 // Create cooling: 6.47mm
242 float puCoolingThick = 0.56 * 0.647;
243 float h2oCoolingThick = 0.44 * 0.647;
244
245 TGeoTube* outerDisksCoolingPU = new TGeoTube("TRK_OUTERDISKS_COOLING_PUsh", rMinInnerServices, rMinInnerServices + puCoolingThick, zLengthInnerServices / 2);
246 TGeoTube* outerDisksCoolingH2O = new TGeoTube("TRK_OUTERDISKS_COOLING_H2Osh", rMinInnerServices + puCoolingThick, rMinInnerServices + puCoolingThick + h2oCoolingThick, zLengthInnerServices / 2);
247 // rMinInnerServices += puCoolingThick + h2oCoolingThick;
248 TGeoVolume* outerDisksCoolingPUVolume = new TGeoVolume("TRK_OUTERDISKS_COOLING_PU", outerDisksCoolingPU, medPU);
249 TGeoVolume* outerDisksCoolingH2OVolume = new TGeoVolume("TRK_OUTERDISKS_COOLING_H2O", outerDisksCoolingH2O, medH2O);
250 outerDisksCoolingPUVolume->SetLineColor(kGray);
251 outerDisksCoolingH2OVolume->SetLineColor(kGray);
252 motherVolume->AddNode(outerDisksCoolingPUVolume, 1, combiTrans);
253 motherVolume->AddNode(outerDisksCoolingH2OVolume, 1, combiTrans);
254 }
255}
256
257void TRKServices::createMiddleServices(TGeoVolume* motherVolume)
258{
259 // This method hardcoes the yellow shape for the middle services
261
262 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
263 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
264 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
265 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
266 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
267 TGeoMedium* medCFiber = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_CARBONFIBERM55J6K");
268
269 // Create fibers: 3.07mm, 50% SiO2, 50% PE
270 float siO2FiberThick = 0.5 * 0.307;
271 float peFiberThick = 0.5 * 0.307;
272 float puCoolingThick = 0.56 * 0.474;
273 float h2oCoolingThick = 0.44 * 0.474;
274 float cuPowerThick = 0.09 * 1.09;
275 float pePowerThick = 0.91 * 1.09;
276 const float totalThickness = siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick;
277
278 // Carbon Fiber Cylinder support for the middle tracker
279 float rMinMiddleCarbonSupport = 34.8f; // Arbitrary value
280 float rMaxMiddleCarbonSupport = 35.f; // 2 mm of carbon fiber
281 const float zLengthMiddleCarbon = 129.f;
282 TGeoTube* middleBarrelCarbonSupport = new TGeoTube("TRK_MID_CARBONSUPPORTsh", rMinMiddleCarbonSupport, rMaxMiddleCarbonSupport, zLengthMiddleCarbon / 2.);
283 TGeoVolume* middleBarrelCarbonSupportVolume = new TGeoVolume("TRK_MID_CARBONSUPPORT", middleBarrelCarbonSupport, medCFiber);
284 middleBarrelCarbonSupportVolume->SetLineColor(kGray);
285 LOGP(info, "Creating carbon fiber support for Middle Tracker");
286 motherVolume->AddNode(middleBarrelCarbonSupportVolume, 1, nullptr);
287
288 // Get geometry information from TRK which is already present
289 float rMinMiddleServices = 35.f;
290 float rMinMiddleBarrel = rMinMiddleServices;
291 const float zLengthCylinderMiddleServices = 40.5f;
292 const float zLengthMiddleServices = 143.f;
293 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
294 rMinMiddleServices = 35.f;
295 LOGP(info, "Building services for Middle Tracker rminMiddleServices");
296 TGeoTube* middleBarrelFiberSIO2 = new TGeoTube(Form("TRK_MID_FIBER_SIO2sh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + siO2FiberThick, zLengthCylinderMiddleServices /* + totalThickness*/);
297 rMinMiddleServices += siO2FiberThick;
298 TGeoTube* middleBarrelFiberPE = new TGeoTube(Form("TRK_MID_FIBER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + peFiberThick, zLengthCylinderMiddleServices /* + totalThickness*/);
299 rMinMiddleServices += peFiberThick;
300 TGeoVolume* middleBarrelFiberSIO2Volume = new TGeoVolume(Form("TRK_MID_FIBER_SIO2_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelFiberSIO2, medSiO2);
301 TGeoVolume* middleBarrelFiberPEVolume = new TGeoVolume(Form("TRK_MID_FIBER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelFiberPE, medPE);
302 middleBarrelFiberSIO2Volume->SetLineColor(kGray);
303 middleBarrelFiberPEVolume->SetLineColor(kGray);
304 auto* combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zLengthMiddleServices - zLengthCylinderMiddleServices), nullptr);
305 motherVolume->AddNode(middleBarrelFiberSIO2Volume, 1, combiTrans);
306 motherVolume->AddNode(middleBarrelFiberPEVolume, 1, combiTrans);
307
308 // Create powerlines: 10.9mm, 9% Cu, 91% PE
309 TGeoTube* middleBarrelPowerCu = new TGeoTube(Form("TRK_MID_POWER_CUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + cuPowerThick, zLengthCylinderMiddleServices /* + totalThickness*/);
310 rMinMiddleServices += cuPowerThick;
311 TGeoTube* middleBarrelPowerPE = new TGeoTube(Form("TRK_MID_POWER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + pePowerThick, zLengthCylinderMiddleServices /* + totalThickness*/);
312 rMinMiddleServices += pePowerThick;
313 TGeoVolume* middleBarrelPowerCuVolume = new TGeoVolume(Form("TRK_MID_POWER_CU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelPowerCu, medCu);
314 TGeoVolume* middleBarrelPowerPEVolume = new TGeoVolume(Form("TRK_MID_POWER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelPowerPE, medPE);
315 middleBarrelPowerCuVolume->SetLineColor(kGray);
316 middleBarrelPowerPEVolume->SetLineColor(kGray);
317 motherVolume->AddNode(middleBarrelPowerCuVolume, 1, combiTrans);
318 motherVolume->AddNode(middleBarrelPowerPEVolume, 1, combiTrans);
319
320 // Create cooling pipes: 4.74mm, 56% PU, 44% H2O
321 TGeoTube* middleBarrelCoolingPU = new TGeoTube(Form("TRK_MID_COOLING_PUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + puCoolingThick, zLengthCylinderMiddleServices /* + totalThickness*/);
322 rMinMiddleServices += puCoolingThick;
323 TGeoTube* middleBarrelCoolingH2O = new TGeoTube(Form("TRK_MID_COOLING_H2Osh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + h2oCoolingThick, zLengthCylinderMiddleServices /* + totalThickness*/);
324 rMinMiddleServices = rMinMiddleServices += h2oCoolingThick;
325 TGeoVolume* middleBarrelCoolingPUVolume = new TGeoVolume(Form("TRK_MID_COOLING_PU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelCoolingPU, medPU);
326 TGeoVolume* middleBarrelCoolingH2OVolume = new TGeoVolume(Form("TRK_MID_COOLING_H2O_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelCoolingH2O, medH2O);
327 middleBarrelCoolingPUVolume->SetLineColor(kGray);
328 middleBarrelCoolingH2OVolume->SetLineColor(kGray);
329 motherVolume->AddNode(middleBarrelCoolingPUVolume, 1, combiTrans);
330 motherVolume->AddNode(middleBarrelCoolingH2OVolume, 1, combiTrans);
331 }
332 // Middle barrel connection disks
333 const float rMinMiddleBarrelDisk = 5.68f;
334 const float rMaxMiddleBarrelDisk = 35.f;
335 const float zLengthMiddleBarrel = 64.5f;
336 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
337 TGeoTube* middleBarrelConnDiskSIO2 = new TGeoTube(Form("TRK_MIDBARCONN_DISK_FIBER_SIO2sh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, siO2FiberThick / 2.);
338 TGeoTube* middleBarrelConnDiskPE = new TGeoTube(Form("TRK_MIDBARCONN_DISK_FIBER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, peFiberThick / 2.);
339 TGeoVolume* middleBarrelConnDiskSIO2Volume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_FIBER_SIO2_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskSIO2, medSiO2);
340 TGeoVolume* middleBarrelConnDiskPEVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_FIBER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskPE, medPE);
341 middleBarrelConnDiskSIO2Volume->SetLineColor(kGray);
342 middleBarrelConnDiskPEVolume->SetLineColor(kGray);
343 auto* rot = new TGeoRotation("", 0, 0, 180);
344 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick / 2. + zLengthMiddleBarrel), rot);
345 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick / 2. + zLengthMiddleBarrel), rot);
346 motherVolume->AddNode(middleBarrelConnDiskSIO2Volume, 1, combiTransSIO2);
347 motherVolume->AddNode(middleBarrelConnDiskPEVolume, 1, combiTransPE);
348
349 TGeoTube* middleBarrelConnDiskCu = new TGeoTube(Form("TRK_MIDBARCONN_DISK_POWER_CUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, cuPowerThick / 2.);
350 TGeoTube* middleBarrelConnDiskPEPower = new TGeoTube(Form("TRK_MIDBARCONN_DISK_POWER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, pePowerThick / 2.);
351 TGeoVolume* middleBarrelConnDiskCuVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_POWER_CU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskCu, medCu);
352 TGeoVolume* middleBarrelConnDiskPEPowerVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_POWER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskPEPower, medPE);
353 middleBarrelConnDiskCuVolume->SetLineColor(kGray);
354 middleBarrelConnDiskPEPowerVolume->SetLineColor(kGray);
355 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick / 2. + zLengthMiddleBarrel), rot);
356 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick / 2. + zLengthMiddleBarrel), rot);
357 motherVolume->AddNode(middleBarrelConnDiskCuVolume, 1, combiTransCu);
358 motherVolume->AddNode(middleBarrelConnDiskPEPowerVolume, 1, combiTransPEPower);
359
360 TGeoTube* middleBarrelConnDiskPU = new TGeoTube(Form("TRK_MIDBARCONN_DISK_PUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, puCoolingThick / 2.);
361 TGeoTube* middleBarrelConnDiskH2O = new TGeoTube(Form("TRK_MIDBARCONN_DISK_H2Osh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, h2oCoolingThick / 2.);
362 TGeoVolume* middleBarrelConnDiskPUVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_PU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskPU, medPU);
363 TGeoVolume* middleBarrelConnDiskH2OVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_H2O_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskH2O, medH2O);
364 middleBarrelConnDiskPUVolume->SetLineColor(kGray);
365 middleBarrelConnDiskH2OVolume->SetLineColor(kGray);
366 auto* combiTransPU = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick / 2. + zLengthMiddleBarrel), rot);
367 auto* combiTransH2O = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick / 2. + zLengthMiddleBarrel), rot);
368 motherVolume->AddNode(middleBarrelConnDiskPUVolume, 1, combiTransPU);
369 motherVolume->AddNode(middleBarrelConnDiskH2OVolume, 1, combiTransH2O);
370 }
371
372 // Barrel to forward connection disks
373 float rMaxMiddleServicesBarFwd = 74.5f + siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick;
374 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
375 // Create fibers: 3.07mm, 50% SiO2, 50% PE
376 TGeoTube* middleBarFwdFiberSIO2 = new TGeoTube("TRK_MIDBARFWD_FIBER_SIO2sh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, siO2FiberThick / 2.);
377 TGeoTube* middleBarFwdFiberPE = new TGeoTube("TRK_MIDBARFWD_FIBER_PEsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, peFiberThick / 2.);
378 TGeoVolume* middleBarFwdFiberSIO2Volume = new TGeoVolume("TRK_MIDBARFWD_FIBER_SIO2", middleBarFwdFiberSIO2, medSiO2);
379 TGeoVolume* middleBarFwdFiberPEVolume = new TGeoVolume("TRK_MIDBARFWD_FIBER_PE", middleBarFwdFiberPE, medPE);
380 middleBarFwdFiberSIO2Volume->SetLineColor(kGray);
381 middleBarFwdFiberPEVolume->SetLineColor(kGray);
382 auto* rot = new TGeoRotation("", 0, 0, 180);
383 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick / 2. + zLengthMiddleServices), rot);
384 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick / 2. + zLengthMiddleServices), rot);
385 motherVolume->AddNode(middleBarFwdFiberSIO2Volume, 1, combiTransSIO2);
386 motherVolume->AddNode(middleBarFwdFiberPEVolume, 1, combiTransPE);
387
388 // Create powerlines: 10.9mm, 9% Cu, 91% PE
389 TGeoTube* middleBarFwdPowerCu = new TGeoTube("TRK_MIDBARFWD_POWER_CUsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, cuPowerThick / 2.);
390 TGeoTube* middleBarFwdPowerPE = new TGeoTube("TRK_MIDBARFWD_POWER_PEsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, pePowerThick / 2.);
391 TGeoVolume* middleBarFwdPowerCuVolume = new TGeoVolume("TRK_MIDBARFWD_POWER_CU", middleBarFwdPowerCu, medCu);
392 TGeoVolume* middleBarFwdPowerPEVolume = new TGeoVolume("TRK_MIDBARFWD_POWER_PE", middleBarFwdPowerPE, medPE);
393 middleBarFwdPowerCuVolume->SetLineColor(kGray);
394 middleBarFwdPowerPEVolume->SetLineColor(kGray);
395 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick / 2. + zLengthMiddleServices), rot);
396 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick / 2. + zLengthMiddleServices), rot);
397 motherVolume->AddNode(middleBarFwdPowerCuVolume, 1, combiTransCu);
398 motherVolume->AddNode(middleBarFwdPowerPEVolume, 1, combiTransPEPower);
399
400 // Create cooling pipes: 4.74mm, 56% PU, 44% H2O
401 TGeoTube* middleBarFwdCoolingPU = new TGeoTube("TRK_MIDBARFWD_COOLING_PUsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, puCoolingThick / 2.);
402 TGeoTube* middleBarFwdCoolingH2O = new TGeoTube("TRK_MIDBARFWD_COOLING_H2Osh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, h2oCoolingThick / 2.);
403 TGeoVolume* middleBarFwdCoolingPUVolume = new TGeoVolume("TRK_MIDBARFWD_COOLING_PU", middleBarFwdCoolingPU, medPU);
404 TGeoVolume* middleBarFwdCoolingH2OVolume = new TGeoVolume("TRK_MIDBARFWD_COOLING_H2O", middleBarFwdCoolingH2O, medH2O);
405 middleBarFwdCoolingPUVolume->SetLineColor(kGray);
406 middleBarFwdCoolingH2OVolume->SetLineColor(kGray);
407 auto* combiTransCoolingPU = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick / 2. + zLengthMiddleServices), rot);
408 auto* combiTransCoolingH2O = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick / 2. + zLengthMiddleServices), rot);
409 motherVolume->AddNode(middleBarFwdCoolingPUVolume, 1, combiTransCoolingPU);
410 motherVolume->AddNode(middleBarFwdCoolingH2OVolume, 1, combiTransCoolingH2O);
411 }
412
413 // Forward part
414 const float zLengthMiddleServicesFwd = 350.f - (143.f + totalThickness);
415
416 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
417 // Create fibers: 3.07mm, 50% SiO2, 50% PE
418 float siO2FiberThick = 0.5 * 0.307;
419 float peFiberThick = 0.5 * 0.307;
420 float rMinMiddleServicesFwd = 74.5f; // 74.5cm
421
422 float translation = (int)orientation * (143.f + totalThickness + zLengthMiddleServicesFwd / 2);
423
424 TGeoTube* middleFwdFiberSIO2 = new TGeoTube("TRK_MIDFWD_FIBER_SIO2sh", rMinMiddleServicesFwd, rMinMiddleServicesFwd + siO2FiberThick, zLengthMiddleServicesFwd / 2);
425 TGeoTube* middleFwdFiberPE = new TGeoTube("TRK_MIDFWD_FIBER_PEsh", rMinMiddleServicesFwd + siO2FiberThick, rMinMiddleServicesFwd + siO2FiberThick + peFiberThick, zLengthMiddleServicesFwd / 2);
426 rMinMiddleServicesFwd += siO2FiberThick + peFiberThick;
427 TGeoVolume* middleFwdFiberSIO2Volume = new TGeoVolume("TRK_MIDFWD_FIBER_SIO2", middleFwdFiberSIO2, medSiO2);
428 TGeoVolume* middleFwdFiberPEVolume = new TGeoVolume("TRK_MIDFWD_FIBER_PE", middleFwdFiberPE, medPE);
429 middleFwdFiberSIO2Volume->SetLineColor(kGray);
430 middleFwdFiberPEVolume->SetLineColor(kGray);
431 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, nullptr);
432 motherVolume->AddNode(middleFwdFiberSIO2Volume, 1, combiTrans);
433 motherVolume->AddNode(middleFwdFiberPEVolume, 1, combiTrans);
434
435 // Create powerlines: 10.9mm, 9% Cu, 91% PE
436 float cuPowerThick = 0.09 * 1.09;
437 float pePowerThick = 0.91 * 1.09;
438
439 TGeoTube* middleFwdPowerCu = new TGeoTube("TRK_MIDFWD_POWER_CUsh", rMinMiddleServicesFwd, rMinMiddleServicesFwd + cuPowerThick, zLengthMiddleServicesFwd / 2);
440 TGeoTube* middleFwdPowerPE = new TGeoTube("TRK_MIDFWD_POWER_PEsh", rMinMiddleServicesFwd + cuPowerThick, rMinMiddleServicesFwd + cuPowerThick + pePowerThick, zLengthMiddleServicesFwd / 2);
441 rMinMiddleServicesFwd += cuPowerThick + pePowerThick;
442 TGeoVolume* middleFwdPowerCuVolume = new TGeoVolume("TRK_MIDFWD_POWER_CU", middleFwdPowerCu, medCu);
443 TGeoVolume* middleFwdPowerPEVolume = new TGeoVolume("TRK_MIDFWD_POWER_PE", middleFwdPowerPE, medPE);
444 middleFwdPowerCuVolume->SetLineColor(kGray);
445 middleFwdPowerPEVolume->SetLineColor(kGray);
446 motherVolume->AddNode(middleFwdPowerCuVolume, 1, combiTrans);
447 motherVolume->AddNode(middleFwdPowerPEVolume, 1, combiTrans);
448
449 // Create cooling pipes: 4.74mm, 56% PU, 44% H2O
450 float puCoolingThick = 0.56 * 0.474;
451 float h2oCoolingThick = 0.44 * 0.474;
452
453 TGeoTube* middleFwdCoolingPU = new TGeoTube("TRK_MIDFWD_COOLING_PUsh", rMinMiddleServicesFwd, rMinMiddleServicesFwd + puCoolingThick, zLengthMiddleServicesFwd / 2);
454 TGeoTube* middleFwdCoolingH2O = new TGeoTube("TRK_MIDFWD_COOLING_H2Osh", rMinMiddleServicesFwd + puCoolingThick, rMinMiddleServicesFwd + puCoolingThick + h2oCoolingThick, zLengthMiddleServicesFwd / 2);
455 // rMinMiddleServicesFwd += puCoolingThick + h2oCoolingThick;
456 TGeoVolume* middleFwdCoolingPUVolume = new TGeoVolume("TRK_MIDFWD_COOLING_PU", middleFwdCoolingPU, medPU);
457 TGeoVolume* middleFwdCoolingH2OVolume = new TGeoVolume("TRK_MIDFWD_COOLING_H2O", middleFwdCoolingH2O, medH2O);
458 middleFwdCoolingPUVolume->SetLineColor(kGray);
459 middleFwdCoolingH2OVolume->SetLineColor(kGray);
460 motherVolume->AddNode(middleFwdCoolingPUVolume, 1, combiTrans);
461 motherVolume->AddNode(middleFwdCoolingH2OVolume, 1, combiTrans);
462 }
463}
464
465void TRKServices::createOuterBarrelServices(TGeoVolume* motherVolume)
466{
467 // This implements a service barrel around the full outer tracker which is probably not needed:
468 // power, data and cooling should be implemented on the staves
469 // Used only for 'LOI' geometry
470
472
473 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
474 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
475 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
476 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
477 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
478
479 // Fiber 0.269 cm
480 const float siO2FiberThick = 0.5 * 0.269;
481 const float peFiberThick = 0.5 * 0.269;
482 float rMinOuterBarrelServices = ((TGeoTube*)motherVolume->GetNode(Form("%s7_1", GeometryTGeo::getTRKLayerPattern()))->GetVolume()->GetShape())->GetRmax();
483 const float zLengthOuterBarrelServices = 350.f; // 175cm
484
485 TGeoTube* outerBarrelFiberSIO2 = new TGeoTube("TRK_OUTERBARREL_FIBER_SIO2sh", rMinOuterBarrelServices, rMinOuterBarrelServices + siO2FiberThick, zLengthOuterBarrelServices);
486 TGeoTube* outerBarrelFiberPE = new TGeoTube("TRK_OUTERBARREL_FIBER_PEsh", rMinOuterBarrelServices + siO2FiberThick, rMinOuterBarrelServices + siO2FiberThick + peFiberThick, zLengthOuterBarrelServices);
487 rMinOuterBarrelServices += siO2FiberThick + peFiberThick;
488 TGeoVolume* outerBarrelFiberSIO2Volume = new TGeoVolume("TRK_OUTERBARREL_FIBER_SIO2", outerBarrelFiberSIO2, medSiO2);
489 TGeoVolume* outerBarrelFiberPEVolume = new TGeoVolume("TRK_OUTERBARREL_FIBER_PE", outerBarrelFiberPE, medPE);
490 outerBarrelFiberSIO2Volume->SetLineColor(kGray);
491 outerBarrelFiberPEVolume->SetLineColor(kGray);
492 motherVolume->AddNode(outerBarrelFiberSIO2Volume, 1, nullptr);
493 motherVolume->AddNode(outerBarrelFiberPEVolume, 1, nullptr);
494
495 // Power 0.430 cm
496 const float cuPowerThick = 0.09 * 0.430;
497 const float pePowerThick = 0.91 * 0.430;
498
499 TGeoTube* outerBarrelPowerCu = new TGeoTube("TRK_OUTERBARREL_POWER_CUsh", rMinOuterBarrelServices, rMinOuterBarrelServices + cuPowerThick, zLengthOuterBarrelServices);
500 TGeoTube* outerBarrelPowerPE = new TGeoTube("TRK_OUTERBARREL_POWER_PEsh", rMinOuterBarrelServices + cuPowerThick, rMinOuterBarrelServices + cuPowerThick + pePowerThick, zLengthOuterBarrelServices);
501 rMinOuterBarrelServices += cuPowerThick + pePowerThick;
502 TGeoVolume* outerBarrelPowerCuVolume = new TGeoVolume("TRK_OUTERBARREL_POWER_CU", outerBarrelPowerCu, medCu);
503 TGeoVolume* outerBarrelPowerPEVolume = new TGeoVolume("TRK_OUTERBARREL_POWER_PE", outerBarrelPowerPE, medPE);
504 outerBarrelPowerCuVolume->SetLineColor(kGray);
505 outerBarrelPowerPEVolume->SetLineColor(kGray);
506 motherVolume->AddNode(outerBarrelPowerCuVolume, 1, nullptr);
507 motherVolume->AddNode(outerBarrelPowerPEVolume, 1, nullptr);
508
509 // Cooling 1.432 cm
510 const float puCoolingThick = 0.56 * 1.432;
511 const float h2oCoolingThick = 0.44 * 1.432;
512
513 TGeoTube* outerBarrelCoolingPU = new TGeoTube("TRK_OUTERBARREL_COOLING_PUsh", rMinOuterBarrelServices, rMinOuterBarrelServices + puCoolingThick, zLengthOuterBarrelServices);
514 TGeoTube* outerBarrelCoolingH2O = new TGeoTube("TRK_OUTERBARREL_COOLING_H2Osh", rMinOuterBarrelServices + puCoolingThick, rMinOuterBarrelServices + puCoolingThick + h2oCoolingThick, zLengthOuterBarrelServices);
515 // rMinOuterBarrelServices += puCoolingThick + h2oCoolingThick;
516 TGeoVolume* outerBarrelCoolingPUVolume = new TGeoVolume("TRK_OUTERBARREL_COOLING_PU", outerBarrelCoolingPU, medPU);
517 TGeoVolume* outerBarrelCoolingH2OVolume = new TGeoVolume("TRK_OUTERBARREL_COOLING_H2O", outerBarrelCoolingH2O, medH2O);
518 outerBarrelCoolingPUVolume->SetLineColor(kGray);
519 outerBarrelCoolingH2OVolume->SetLineColor(kGray);
520 motherVolume->AddNode(outerBarrelCoolingPUVolume, 1, nullptr);
521 motherVolume->AddNode(outerBarrelCoolingH2OVolume, 1, nullptr);
522}
523
524void TRKServices::createMLServicesPeacock(TGeoVolume* motherVolume)
525{
526 // This method hardcoes the yellow shape for the middle services
528
529 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
530 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
531 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
532 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
533 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
534 TGeoMedium* medCFiber = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_CARBONFIBERM55J6K");
535
536 // Barrel service constants
537 const int ITBarrelnFiber = 70;
538 const int ITBarrelnPower = 70;
539 float siO2FiberAreaB = ITBarrelnFiber * mFiberArea * mFiberComposition[0];
540 float peFiberAreaB = ITBarrelnFiber * mFiberArea * mFiberComposition[1];
541
542 float puCoolingAreaB = 0;
543 float h2oCoolingAreaB = 0;
544 float cuPowerAreaB = ITBarrelnPower * mPowerBundleArea * mPowerBundleComposition[0];
545 float pePowerAreaB = ITBarrelnPower * mPowerBundleArea * mPowerBundleComposition[1];
546
547 // Disk service constants
548 const int ITDisknFiber = 3 * 24;
549 const int ITDisknPower = 3 * 16;
550 float siO2FiberAreaD = ITDisknFiber * mFiberArea * mFiberComposition[0];
551 float peFiberAreaD = ITDisknFiber * mFiberArea * mFiberComposition[1];
552
553 float puCoolingAreaD = 0;
554 float h2oCoolingAreaD = 0;
555 float cuPowerAreaD = ITDisknPower * mPowerBundleArea * mPowerBundleComposition[0];
556 float pePowerAreaD = ITDisknPower * mPowerBundleArea * mPowerBundleComposition[1];
557
558 // Carbon Fiber Cylinder support for the middle tracker
559 float rMinMiddleCarbonSupport = 34.8f; // Arbitrary value
560 float rMaxMiddleCarbonSupport = 35.f; // 2 mm of carbon fiber
561 const float zLengthMiddleCarbon = 129.f;
562 TGeoTube* middleBarrelCarbonSupport = new TGeoTube("TRK_MID_CARBONSUPPORTsh", rMinMiddleCarbonSupport, rMaxMiddleCarbonSupport, zLengthMiddleCarbon / 2.);
563 TGeoVolume* middleBarrelCarbonSupportVolume = new TGeoVolume("TRK_MID_CARBONSUPPORT", middleBarrelCarbonSupport, medCFiber);
564 middleBarrelCarbonSupportVolume->SetLineColor(kGray);
565 LOGP(info, "Creating carbon fiber support for Middle Tracker");
566 motherVolume->AddNode(middleBarrelCarbonSupportVolume, 1, nullptr);
567
568 // Get geometry information from TRK which is already present
569 float rMinMiddleServices = 35.f;
570 float rMinMiddleBarrel = rMinMiddleServices;
571 const float zLengthCylinderMiddleServices = 40.5f;
572 const float zLengthMiddleServices = 143.f;
573
574 // Middle layer barrel services are only on A side
575 rMinMiddleServices = 35.f;
576 LOGP(info, "Building services for Middle Tracker rminMiddleServices");
577
578 // Middle barrel connection disks
579 const float rMinMiddleBarrelDisk = 5.68f;
580 const float rMaxMiddleBarrelDisk = 35.f;
581 const float zLengthMiddleBarrel = 64.5f;
582 auto orientation = Orientation::kASide;
583 float diskCircumference = rMaxMiddleBarrelDisk * 3.14; // Use only half circumference
584
585 double zCur = zLengthMiddleBarrel;
586 double dZ = siO2FiberAreaB / diskCircumference / 2.;
587 TGeoTube* middleBarrelConnDiskSIO2 = new TGeoTube("TRK_MIDBARCONN_DISK_FIBER_SIO2sh", rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, dZ);
588 TGeoVolume* middleBarrelConnDiskSIO2Volume = new TGeoVolume("TRK_MIDBARCONN_DISK_FIBER_SIO2", middleBarrelConnDiskSIO2, medSiO2);
589 middleBarrelConnDiskSIO2Volume->SetLineColor(kGray);
590 auto* rot = new TGeoRotation("", 0, 0, 180); // Why this?
591 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
592
593 zCur += 2. * dZ;
594 dZ = peFiberAreaB / diskCircumference / 2.;
595 TGeoTube* middleBarrelConnDiskPE = new TGeoTube("TRK_MIDBARCONN_DISK_FIBER_PEsh", rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, dZ);
596 TGeoVolume* middleBarrelConnDiskPEVolume = new TGeoVolume("TRK_MIDBARCONN_DISK_FIBER_PE", middleBarrelConnDiskPE, medPE);
597 middleBarrelConnDiskPEVolume->SetLineColor(kGray);
598 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
599
600 motherVolume->AddNode(middleBarrelConnDiskSIO2Volume, 1, combiTransSIO2);
601 motherVolume->AddNode(middleBarrelConnDiskPEVolume, 1, combiTransPE);
602
603 zCur += 2. * dZ;
604 dZ = cuPowerAreaB / diskCircumference / 2.;
605 TGeoTube* middleBarrelConnDiskCu = new TGeoTube("TRK_MIDBARCONN_DISK_POWER_CUsh", rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, dZ);
606 TGeoVolume* middleBarrelConnDiskCuVolume = new TGeoVolume("TRK_MIDBARCONN_DISK_POWER_CU", middleBarrelConnDiskCu, medCu);
607 middleBarrelConnDiskCuVolume->SetLineColor(kGray);
608 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
609
610 zCur += 2. * dZ;
611 dZ = pePowerAreaB / diskCircumference / 2.;
612 TGeoTube* middleBarrelConnDiskPEPower = new TGeoTube("TRK_MIDBARCONN_DISK_POWER_PEsh", rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, dZ);
613 TGeoVolume* middleBarrelConnDiskPEPowerVolume = new TGeoVolume("TRK_MIDBARCONN_DISK_POWER_PE", middleBarrelConnDiskPEPower, medPE);
614 middleBarrelConnDiskPEPowerVolume->SetLineColor(kGray);
615 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
616 motherVolume->AddNode(middleBarrelConnDiskCuVolume, 1, combiTransCu);
617 motherVolume->AddNode(middleBarrelConnDiskPEPowerVolume, 1, combiTransPEPower);
618
619 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
620 for (int iSide = 0; iSide < 2; iSide++) { // left/right or top/bottom
621 float refAngle = 0;
622 string orLabel("A");
623 if (orientation == Orientation::kCSide) {
624 orLabel = "C";
625 refAngle = 90;
626 }
627 // Add ML Disk services
628 // create data fiber volumes
629 double rCur = rMinMiddleServices;
630 double dR = siO2FiberAreaD / (3.14 * rCur);
631 TGeoTubeSeg* middleDiskFiberSIO2 = new TGeoTubeSeg(Form("TRK_MLD_FIBER_SIO2sh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthCylinderMiddleServices, -45, 45);
632 TGeoVolume* middleDiskFiberSIO2Volume = new TGeoVolume(Form("TRK_MLD_FIBER_SIO2_%s%d", orLabel.c_str(), iSide), middleDiskFiberSIO2, medSiO2);
633 middleDiskFiberSIO2Volume->SetLineColor(kGray);
634
635 rCur += dR;
636 dR = peFiberAreaD / (3.14 * rCur);
637 TGeoTubeSeg* middleDiskFiberPE = new TGeoTubeSeg(Form("TRK_MLD_FIBER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthCylinderMiddleServices, -45, 45);
638 TGeoVolume* middleDiskFiberPEVolume = new TGeoVolume(Form("TRK_MLD_FIBER_PE_%s%d", orLabel.c_str(), iSide), middleDiskFiberPE, medPE);
639 middleDiskFiberPEVolume->SetLineColor(kGray);
640 auto* combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zLengthMiddleServices - zLengthCylinderMiddleServices), new TGeoRotation("", refAngle + iSide * 180., 0, 0));
641 motherVolume->AddNode(middleDiskFiberSIO2Volume, 1, combiTrans);
642 motherVolume->AddNode(middleDiskFiberPEVolume, 1, combiTrans);
643
644 // Create powerlines
645 rCur += dR;
646 dR = cuPowerAreaD / (3.14 * rCur);
647 TGeoTubeSeg* middleDiskPowerCu = new TGeoTubeSeg(Form("TRK_MLD_POWER_CUsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthCylinderMiddleServices, -45, 45);
648 TGeoVolume* middleDiskPowerCuVolume = new TGeoVolume(Form("TRK_MLD_POWER_CU_%s%d", orLabel.c_str(), iSide), middleDiskPowerCu, medCu);
649 middleDiskPowerCuVolume->SetLineColor(kGray);
650
651 rCur += dR;
652 dR = pePowerAreaD / (3.14 * rCur);
653 TGeoTubeSeg* middleDiskPowerPE = new TGeoTubeSeg(Form("TRK_MLD_POWER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthCylinderMiddleServices, -45, 45);
654 TGeoVolume* middleDiskPowerPEVolume = new TGeoVolume(Form("TRK_MLD_POWER_PE_%s%d", orLabel.c_str(), iSide), middleDiskPowerPE, medPE);
655 middleDiskPowerPEVolume->SetLineColor(kGray);
656
657 motherVolume->AddNode(middleDiskPowerCuVolume, 1, combiTrans);
658 motherVolume->AddNode(middleDiskPowerPEVolume, 1, combiTrans);
659
660 if (orientation == Orientation::kASide) {
661 // Add Barrel services
662 // create data fiber volumes
663 rCur += dR;
664 dR = siO2FiberAreaB / (3.14 * rCur);
665 TGeoTubeSeg* middleBarrelFiberSIO2 = new TGeoTubeSeg(Form("TRK_MLB_FIBER_SIO2sh_A%d", iSide), rCur, rCur + dR, zLengthCylinderMiddleServices, -45, 45);
666 TGeoVolume* middleBarrelFiberSIO2Volume = new TGeoVolume(Form("TRK_MLB_FIBER_SIO2_A%d", iSide), middleBarrelFiberSIO2, medSiO2);
667 middleBarrelFiberSIO2Volume->SetLineColor(kGray);
668
669 rCur += dR;
670 dR = peFiberAreaB / (3.14 * rCur);
671 TGeoTubeSeg* middleBarrelFiberPE = new TGeoTubeSeg(Form("TRK_MLB_FIBER_PEsh_A%d", iSide), rCur, rCur + dR, zLengthCylinderMiddleServices, -45, 45);
672 TGeoVolume* middleBarrelFiberPEVolume = new TGeoVolume(Form("TRK_MLB_FIBER_PE_A%d", iSide), middleBarrelFiberPE, medPE);
673 middleBarrelFiberPEVolume->SetLineColor(kGray);
674 auto* combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zLengthMiddleServices - zLengthCylinderMiddleServices), new TGeoRotation(nullptr, refAngle + iSide * 180., 0, 0));
675 motherVolume->AddNode(middleBarrelFiberSIO2Volume, 1, combiTrans);
676 motherVolume->AddNode(middleBarrelFiberPEVolume, 1, combiTrans);
677
678 // Create powerlines
679 rCur += dR;
680 dR = cuPowerAreaB / (3.14 * rCur);
681 TGeoTubeSeg* middleBarrelPowerCu = new TGeoTubeSeg(Form("TRK_MLB_POWER_CUsh_A%d", iSide), rCur, rCur + dR, zLengthCylinderMiddleServices, -45, 45);
682 TGeoVolume* middleBarrelPowerCuVolume = new TGeoVolume(Form("TRK_MLB_POWER_CU_A%d", iSide), middleBarrelPowerCu, medCu);
683 middleBarrelPowerCuVolume->SetLineColor(kGray);
684
685 rCur += dR;
686 dR = pePowerAreaB / (3.14 * rCur);
687 TGeoTubeSeg* middleBarrelPowerPE = new TGeoTubeSeg(Form("TRK_MLB_POWER_PEsh_A%d", iSide), rCur, rCur + dR, zLengthCylinderMiddleServices, -45, 45);
688 TGeoVolume* middleBarrelPowerPEVolume = new TGeoVolume(Form("TRK_MLB_POWER_PE_A%d", iSide), middleBarrelPowerPE, medPE);
689 middleBarrelPowerPEVolume->SetLineColor(kGray);
690
691 motherVolume->AddNode(middleBarrelPowerCuVolume, 1, combiTrans);
692 motherVolume->AddNode(middleBarrelPowerPEVolume, 1, combiTrans);
693
694 // TODO: add cooling ducts/pipes
695 }
696 }
697 }
698
699 // Barrel to forward connection disks
700 // A side: barrel + disk services
701 // C side: only disk services
702 float rMaxMiddleServicesBarFwd = 74.5f; // TODO: add thickness of service barrels
703 diskCircumference = rMaxMiddleServicesBarFwd * 3.14; // Only half of the area is used
704 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
705 float refAngle = 0;
706 string orLabel("A");
707 if (orientation == Orientation::kCSide) {
708 refAngle = 90;
709 orLabel = "C";
710 }
711 double totalThickness = 0;
712 for (int iSide = 0; iSide < 2; iSide++) {
713 // Create fibers
714 double zCur = zLengthMiddleServices; // Change to f
715 double dZ = siO2FiberAreaD / diskCircumference / 2.;
716 totalThickness += 2 * dZ;
717 if (orientation == Orientation::kASide) {
718 dZ += siO2FiberAreaB / diskCircumference / 2.;
719 }
720 TGeoTubeSeg* middleBarFwdFiberSIO2 = new TGeoTubeSeg(Form("TRK_MIDBARFWD_FIBER_SIO2sh_%s%d", orLabel.c_str(), iSide), rMinMiddleBarrel, rMaxMiddleServicesBarFwd, dZ, -45, 45);
721 TGeoVolume* middleBarFwdFiberSIO2Volume = new TGeoVolume(Form("TRK_MIDBARFWD_FIBER_SIO2_%s%d", orLabel.c_str(), iSide), middleBarFwdFiberSIO2, medSiO2);
722 auto* rot = new TGeoRotation("", refAngle + iSide * 180., 0, 180.);
723 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
724
725 zCur += 2 * dZ;
726 dZ = peFiberAreaD / diskCircumference / 2.;
727 totalThickness += 2 * dZ;
728 if (orientation == Orientation::kASide) {
729 dZ += peFiberAreaB / diskCircumference / 2.;
730 }
731 TGeoTubeSeg* middleBarFwdFiberPE = new TGeoTubeSeg(Form("TRK_MIDBARFWD_FIBER_PEsh_%s%d", orLabel.c_str(), iSide), rMinMiddleBarrel, rMaxMiddleServicesBarFwd, dZ, -45, 45);
732 TGeoVolume* middleBarFwdFiberPEVolume = new TGeoVolume(Form("TRK_MIDBARFWD_FIBER_PE_%s%d", orLabel.c_str(), iSide), middleBarFwdFiberPE, medPE);
733 middleBarFwdFiberSIO2Volume->SetLineColor(kGray);
734 middleBarFwdFiberPEVolume->SetLineColor(kGray);
735 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
736 motherVolume->AddNode(middleBarFwdFiberSIO2Volume, 1, combiTransSIO2);
737 motherVolume->AddNode(middleBarFwdFiberPEVolume, 1, combiTransPE);
738
739 // Create powerlines
740 zCur += 2 * dZ;
741 dZ = cuPowerAreaD / diskCircumference / 2.;
742 totalThickness += 2 * dZ;
743 if (orientation == Orientation::kASide) {
744 dZ += cuPowerAreaB / diskCircumference / 2.;
745 }
746 TGeoTubeSeg* middleBarFwdPowerCu = new TGeoTubeSeg(Form("TRK_MIDBARFWD_POWER_CUsh_%s%d", orLabel.c_str(), iSide), rMinMiddleBarrel, rMaxMiddleServicesBarFwd, dZ, -45, 45);
747 TGeoVolume* middleBarFwdPowerCuVolume = new TGeoVolume(Form("TRK_MIDBARFWD_POWER_CU_%s%d", orLabel.c_str(), iSide), middleBarFwdPowerCu, medCu);
748 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
749
750 zCur += 2 * dZ;
751 dZ = pePowerAreaD / diskCircumference / 2.;
752 totalThickness += 2 * dZ;
753 if (orientation == Orientation::kASide) {
754 dZ += pePowerAreaB / diskCircumference / 2.;
755 }
756 TGeoTubeSeg* middleBarFwdPowerPE = new TGeoTubeSeg(Form("TRK_MIDBARFWD_POWER_PEsh_%s%d", orLabel.c_str(), iSide), rMinMiddleBarrel, rMaxMiddleServicesBarFwd, dZ, -45, 45);
757 TGeoVolume* middleBarFwdPowerPEVolume = new TGeoVolume(Form("TRK_MIDBARFWD_POWER_PE_%s%d", orLabel.c_str(), iSide), middleBarFwdPowerPE, medPE);
758 middleBarFwdPowerCuVolume->SetLineColor(kGray);
759 middleBarFwdPowerPEVolume->SetLineColor(kGray);
760 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), rot);
761 motherVolume->AddNode(middleBarFwdPowerCuVolume, 1, combiTransCu);
762 motherVolume->AddNode(middleBarFwdPowerPEVolume, 1, combiTransPEPower);
763
764 // TODO: add cooling ducts/pipes
765 }
766
767 // Forward part
768 float zLengthMiddleServicesFwd = 350.f - (143.f + totalThickness);
769
770 for (int iSide = 0; iSide < 2; iSide++) {
771 // Create fibers
772 float rMinMiddleServicesFwd = 74.5f; // 74.5cm
773
774 float translation = (int)orientation * (143.f + totalThickness + zLengthMiddleServicesFwd / 2);
775
776 double rCur = rMinMiddleServicesFwd;
777 double dR = siO2FiberAreaD / (3.14 * rCur);
778 if (orientation == Orientation::kASide) {
779 dR += siO2FiberAreaB / (3.14 * rCur);
780 }
781 TGeoTubeSeg* middleFwdFiberSIO2 = new TGeoTubeSeg(Form("TRK_MIDFWD_FIBER_SIO2sh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthMiddleServicesFwd / 2, -45, 45);
782 TGeoVolume* middleFwdFiberSIO2Volume = new TGeoVolume(Form("TRK_MIDFWD_FIBER_SIO2_%s%d", orLabel.c_str(), iSide), middleFwdFiberSIO2, medSiO2);
783 middleFwdFiberSIO2Volume->SetLineColor(kGray);
784
785 rCur += dR;
786 dR = peFiberAreaD / (3.14 * rCur);
787 if (orientation == Orientation::kASide) {
788 dR += peFiberAreaB / (3.14 * rCur);
789 }
790 TGeoTubeSeg* middleFwdFiberPE = new TGeoTubeSeg(Form("TRK_MIDFWD_FIBER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthMiddleServicesFwd / 2, -45, 45);
791 TGeoVolume* middleFwdFiberPEVolume = new TGeoVolume(Form("TRK_MIDFWD_FIBER_PE_%s%d", orLabel.c_str(), iSide), middleFwdFiberPE, medPE);
792 middleFwdFiberPEVolume->SetLineColor(kGray);
793
794 auto* rot = new TGeoRotation("", refAngle + iSide * 180., 0, 0.);
795 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, rot);
796 motherVolume->AddNode(middleFwdFiberSIO2Volume, 1, combiTrans);
797 motherVolume->AddNode(middleFwdFiberPEVolume, 1, combiTrans);
798
799 // Create powerlines
800 rCur += dR;
801 dR = cuPowerAreaD / (3.14 * rCur);
802 if (orientation == Orientation::kASide) {
803 dR += cuPowerAreaB / (3.14 * rCur);
804 }
805 TGeoTubeSeg* middleFwdPowerCu = new TGeoTubeSeg(Form("TRK_MIDFWD_POWER_CUsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthMiddleServicesFwd / 2, -45, 45);
806 TGeoVolume* middleFwdPowerCuVolume = new TGeoVolume(Form("TRK_MIDFWD_POWER_CU_%s%d", orLabel.c_str(), iSide), middleFwdPowerCu, medCu);
807 middleFwdPowerCuVolume->SetLineColor(kGray);
808
809 rCur += dR;
810 dR = pePowerAreaD / (3.14 * rCur);
811 if (orientation == Orientation::kASide) {
812 dR += pePowerAreaB / (3.14 * rCur);
813 }
814 TGeoTubeSeg* middleFwdPowerPE = new TGeoTubeSeg(Form("TRK_MIDFWD_POWER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthMiddleServicesFwd / 2, -45, 45);
815 TGeoVolume* middleFwdPowerPEVolume = new TGeoVolume(Form("TRK_MIDFWD_POWER_PE_%s%d", orLabel.c_str(), iSide), middleFwdPowerPE, medPE);
816 middleFwdPowerPEVolume->SetLineColor(kGray);
817 motherVolume->AddNode(middleFwdPowerCuVolume, 1, combiTrans);
818 motherVolume->AddNode(middleFwdPowerPEVolume, 1, combiTrans);
819
820 // TODO: add cooling ducts/pipes
821 }
822 }
823}
824
825void TRKServices::createOTServicesPeacock(TGeoVolume* motherVolume)
826{
827 // This implments the service barrels for power + data for the OT barrels and disks
828 // TODO: add cooling
829
831
832 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
833 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
834 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
835 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
836 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
837 TGeoMedium* medCFiber = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_CARBONFIBERM55J6K");
838
839 // OT Disk service constants
840 const int OTDisknFiber = 3 * 51;
841 const int OTDisknPower = 3 * 34;
842 float siO2FiberAreaD = OTDisknFiber * mFiberArea * mFiberComposition[0];
843 float peFiberAreaD = OTDisknFiber * mFiberArea * mFiberComposition[1];
844
845 float puCoolingAreaD = 0;
846 float h2oCoolingAreaD = 0;
847 float cuPowerAreaD = OTDisknPower * mPowerBundleArea * mPowerBundleComposition[0];
848 float pePowerAreaD = OTDisknPower * mPowerBundleArea * mPowerBundleComposition[1];
849
850 // OT Barrel service constants
851 const int OTBarrelnFiber = 460;
852 const int OTBarrelnPower = 306;
853 float siO2FiberAreaB = OTBarrelnFiber * mFiberArea * mFiberComposition[0];
854 float peFiberAreaB = OTBarrelnFiber * mFiberArea * mFiberComposition[1];
855
856 float puCoolingAreaB = 0;
857 float h2oCoolingAreaB = 0;
858 float cuPowerAreaB = OTBarrelnPower * mPowerBundleArea * mPowerBundleComposition[0];
859 float pePowerAreaB = OTBarrelnPower * mPowerBundleArea * mPowerBundleComposition[1];
860
861 float rMinOuterServices = 68.5f; // 68.5cm
862 float zLengthOuterServices = 201.f; // 201cm
863
864 // Carbon Fiber Cylinder support for the middle tracker
865 float rMinOuterCarbonSupport = 82.0f; // TODO: get more precise location
866 float rMaxOuterCarbonSupport = 82.4f; // 4 mm of carbon fiber
867 const float zLengthOuterCarbon = 280.0f; // Rough guess for now
868 TGeoTube* outerBarrelCarbonSupport = new TGeoTube("TRK_OT_CARBONSUPPORTsh", rMinOuterCarbonSupport, rMaxOuterCarbonSupport, zLengthOuterCarbon / 2.);
869 TGeoVolume* outerBarrelCarbonSupportVolume = new TGeoVolume("TRK_OT_CARBONSUPPORT", outerBarrelCarbonSupport, medCFiber);
870 outerBarrelCarbonSupportVolume->SetLineColor(kGray);
871 LOGP(info, "Creating carbon fiber support for Outer Tracker");
872 motherVolume->AddNode(outerBarrelCarbonSupportVolume, 1, nullptr);
873
874 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
875 string orLabel = "A";
876 float refAngle = 0;
877 if (orientation == Orientation::kCSide) {
878 orLabel = "C";
879 refAngle = 90;
880 }
881 // TODO: add cables/connections at ends of OT barrels
882 // Set rMin, rMax and dZ
883
884 double rMin = 45.0;
885 double rMax = rMinOuterServices;
886 double zCur = 145.0;
887 double dZ = siO2FiberAreaB / (4 * 3.14 * rMax);
888 TGeoTube* outerBarrelFiberSIO2 = new TGeoTube(Form("TRK_OUTERBARREL_FIBER_SIO2sh_%s", orLabel.c_str()), rMin, rMax, dZ);
889 TGeoVolume* outerBarrelFiberSIO2Volume = new TGeoVolume(Form("TRK_OUTERBARREL_FIBER_SIO2_%s", orLabel.c_str()), outerBarrelFiberSIO2, medSiO2);
890 outerBarrelFiberSIO2Volume->SetLineColor(kGray);
891 auto* combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), nullptr);
892 motherVolume->AddNode(outerBarrelFiberSIO2Volume, 1, combiTrans);
893
894 zCur += 2 * dZ;
895 dZ = peFiberAreaB / (4 * 3.14 * rMax);
896 TGeoTube* outerBarrelFiberPE = new TGeoTube(Form("TRK_OUTERBARREL_FIBER_PEsh_%s", orLabel.c_str()), rMin, rMax, dZ);
897 TGeoVolume* outerBarrelFiberPEVolume = new TGeoVolume(Form("TRK_OUTERBARREL_FIBER_PE_%s", orLabel.c_str()), outerBarrelFiberPE, medPE);
898 outerBarrelFiberPEVolume->SetLineColor(kGray);
899 combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), nullptr);
900 motherVolume->AddNode(outerBarrelFiberPEVolume, 1, combiTrans);
901
902 zCur += 2 * dZ;
903 dZ = cuPowerAreaB / (4 * 3.14 * rMax);
904 TGeoTube* outerBarrelPowerCu = new TGeoTube(Form("TRK_OUTERBARREL_POWER_CUsh_%s", orLabel.c_str()), rMin, rMax, dZ);
905 TGeoVolume* outerBarrelPowerCuVolume = new TGeoVolume(Form("TRK_OUTERBARREL_POWER_CU_%s", orLabel.c_str()), outerBarrelPowerCu, medCu);
906 outerBarrelFiberSIO2Volume->SetLineColor(kGray);
907 combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), nullptr);
908 motherVolume->AddNode(outerBarrelPowerCuVolume, 1, combiTrans);
909
910 zCur += 2 * dZ;
911 dZ = pePowerAreaB / (4 * 3.14 * rMax);
912 TGeoTube* outerBarrelPowerPE = new TGeoTube(Form("TRK_OUTERBARREL_POWER_PEsh_%s", orLabel.c_str()), rMin, rMax, dZ);
913 TGeoVolume* outerBarrelPowerPEVolume = new TGeoVolume(Form("TRK_OUTERBARREL_POWER_PE_%s", orLabel.c_str()), outerBarrelPowerPE, medPE);
914 outerBarrelPowerPEVolume->SetLineColor(kGray);
915 combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zCur + dZ), nullptr);
916 motherVolume->AddNode(outerBarrelPowerPEVolume, 1, combiTrans);
917
918 for (int iSide = 0; iSide < 2; iSide++) {
919 // Create fibers
920 double rCur = rMinOuterServices;
921 double dR = (siO2FiberAreaD + siO2FiberAreaB) / (3.14 * rCur);
922 TGeoTubeSeg* outerDisksFiberSIO2 = new TGeoTubeSeg(Form("TRK_OUTERDISKS_FIBER_SIO2sh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterServices / 2, -45, 45);
923 TGeoVolume* outerDisksFiberSIO2Volume = new TGeoVolume(Form("TRK_OUTERDISKS_FIBER_SIO2_%s%d", orLabel.c_str(), iSide), outerDisksFiberSIO2, medSiO2);
924 outerDisksFiberSIO2Volume->SetLineColor(kGray);
925
926 rCur += dR;
927 dR = (peFiberAreaD + peFiberAreaB) / (3.14 * rCur);
928 TGeoTubeSeg* outerDisksFiberPE = new TGeoTubeSeg(Form("TRK_OUTERDISKS_FIBER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterServices / 2, -45, 45);
929 TGeoVolume* outerDisksFiberPEVolume = new TGeoVolume(Form("TRK_OUTERDISKS_FIBER_PE_%s%d", orLabel.c_str(), iSide), outerDisksFiberPE, medPE);
930 outerDisksFiberPEVolume->SetLineColor(kGray);
931
932 float translation = (int)orientation * (149.f + zLengthOuterServices / 2); // ±149cm
933 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, new TGeoRotation("", refAngle + iSide * 180., 0, 0));
934 motherVolume->AddNode(outerDisksFiberSIO2Volume, 1, combiTrans);
935 motherVolume->AddNode(outerDisksFiberPEVolume, 1, combiTrans);
936
937 // Create power lines
938 rCur += dR;
939 dR = (cuPowerAreaD + cuPowerAreaB) / (3.14 * rCur);
940 TGeoTubeSeg* outerDisksPowerCu = new TGeoTubeSeg(Form("TRK_OUTERDISKS_POWER_CUsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterServices / 2, -45, 45);
941 TGeoVolume* outerDisksPowerCuVolume = new TGeoVolume(Form("TRK_OUTERDISKS_POWER_CU_%s%d", orLabel.c_str(), iSide), outerDisksPowerCu, medCu);
942 outerDisksPowerCuVolume->SetLineColor(kGray);
943
944 rCur += dR;
945 dR = (pePowerAreaD + pePowerAreaB) / (3.14 * rCur);
946 TGeoTubeSeg* outerDisksPowerPE = new TGeoTubeSeg(Form("TRK_OUTERDISKS_POWER_PEsh_%s%d", orLabel.c_str(), iSide), rCur, rCur + dR, zLengthOuterServices / 2, -45, 45);
947 TGeoVolume* outerDisksPowerPEVolume = new TGeoVolume(Form("TRK_OUTERDISKS_POWER_PE_%s%d", orLabel.c_str(), iSide), outerDisksPowerPE, medPE);
948 outerDisksPowerPEVolume->SetLineColor(kGray);
949 motherVolume->AddNode(outerDisksPowerCuVolume, 1, combiTrans);
950 motherVolume->AddNode(outerDisksPowerPEVolume, 1, combiTrans);
951
952 // TODO: add cooling ducts/pipes
953 }
954 }
955}
956
957} // namespace trk
958} // namespace o2
Definition of the GeometryTGeo class.
static MaterialManager & Instance()
static const char * getTRKServiceVolPattern()
static const char * getTRKLayerPattern()
TString mVacuumCompositeFormula
Definition TRKServices.h:62
void registerVacuum(TGeoVolume *motherVolume)
void createOTServicesPeacock(TGeoVolume *motherVolume)
void createOuterBarrelServices(TGeoVolume *motherVolume)
float mPowerBundleComposition[2]
Definition TRKServices.h:73
void createServices(TGeoVolume *motherVolume)
void createMLServicesPeacock(TGeoVolume *motherVolume)
void excavateFromVacuum(TString shapeToExcavate)
void createOuterDisksServices(TGeoVolume *motherVolume)
float mFiberComposition[2]
Definition TRKServices.h:72
void createMiddleServices(TGeoVolume *motherVolume)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...