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
16#include <TGeoVolume.h>
17#include <TGeoNode.h>
18#include <TGeoTube.h>
19#include <TGeoCompositeShape.h>
20#include <TColor.h>
21#include <Rtypes.h>
22#include <numeric>
23
24#include <Framework/Logger.h>
25
26namespace o2
27{
28namespace trk
29{
30TRKServices::TRKServices(float rMin, float zLength, float thickness)
31{
32 mColdPlateRMin = rMin;
33 mColdPlateZLength = zLength;
34 mColdPlateThickness = thickness;
35 mZLengthIRISVacV = 70.;
36 mThicknessIRISVacV = 150.e-4;
37 mRInIRISVacV = 0.48;
39}
40
42{
43 int ifield = 2; // ?
44 float fieldm = 10.0; // ?
45
46 // Defines tracking media parameters.
47 float epsil = .1; // Tracking precision,
48 float stemax = -0.01; // Maximum displacement for multiple scat
49 float tmaxfd = -20.; // Maximum angle due to field deflection
50 float deemax = -.3; // Maximum fractional energy loss, DLS
51 float stmin = -.8;
52
54
55 // Ceramic (Aluminium Oxide)
56 float aCer[2] = {26.981538, 15.9994};
57 float zCer[2] = {13., 8.};
58 float wCer[2] = {0.5294, 0.4706}; // Mass %, which makes sense. TODO: check if Mixture needs mass% or comp%
59 float dCer = 3.97;
60
61 // Air
62 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
63 float zAir[4] = {6., 7., 8., 18.};
64 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
65 float dAir = 1.20479E-3;
66
67 // Water
68 float aWater[2] = {1.00794, 15.9994};
69 float zWater[2] = {1., 8.};
70 float wWater[2] = {0.111894, 0.888106};
71 float dWater = 1.0;
72
73 // Fused silica SiO2 https://pdg.lbl.gov/2023/AtomicNuclearProperties/HTML/silicon_dioxide_fused_quartz.html
74 float aSiO2[2] = {28.0855, 15.9990};
75 float zSiO2[2] = {14., 8.};
76 float wSiO2[2] = {0.467, 0.533};
77 float dSiO2 = 2.2;
78
79 // Polyethylene from alice 2 absorber
80 float aPolyethylene[2] = {12.01, 1.};
81 float zPolyethylene[2] = {6., 1.};
82 float wPolyethylene[2] = {.33, .67};
83
84 // Polyurethane [HN-CO-O] from alice 2 mft
85 int nPolyurethane = 4;
86 float aPolyurethane[4] = {1.00794, 14.010, 12.0107, 15.9994};
87 float zPolyurethane[4] = {1.0, 7.0, 6.0, 8.0};
88 float wPolyurethane[4] = {0.017077588, 0.237314387, 0.203327619, 0.542280405};
89 float dPolyurethane = 1.25;
90
91 // Aluminium 5083 - alloy of Mn, Fe, Cu, Mg, Si, Zn, Cr, Ti, Al
92 // Al5083 is considered as material for the iris vacuum vessel
93 // https://www.smithmetal.com/5083.htm
94 float aAl5083[9] = {54.938, 55.845, 63.546, 24.305, 28.086, 65.38, 51.996, 47.867, 26.982};
95 float zAl5083[9] = {25., 26., 29., 12., 14., 30., 24., 22., 13.};
96 // 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
97 float wAl5083[9] = {0.007, 0.004, 0.001, 0.0445, 0.004, 0.0025, 0.0015, 0.0015, 0.934};
98 float dAl5083 = 2.650;
99
100 // AlBeMet AM162H is a nanocomposite, not an alloy
101 // 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
102 float aAlBeMet[2] = {26.982, 9.012};
103 float zAlBeMet[2] = {13., 4.};
104 float wAlBeMet[2] = {0.38, 0.62};
105 float dAlBeMet = 2.071;
106
107 matmgr.Mixture("ALICE3_TRKSERVICES", 66, "CERAMIC", aCer, zCer, dCer, 2, wCer); // Ceramic for cold plate
108 matmgr.Mixture("ALICE3_TRKSERVICES", 68, "AIR", aAir, zAir, dAir, 4, wAir); // Air for placeholding cables
109 matmgr.Mixture("ALICE3_TRKSERVICES", 69, "POLYETHYLENE", aPolyethylene, zPolyethylene, .95, 2, wPolyethylene); // Polyethylene for fibers
110 matmgr.Mixture("ALICE3_TRKSERVICES", 70, "POLYURETHANE", aPolyurethane, zPolyurethane, dPolyurethane, nPolyurethane, wPolyurethane); // Polyurethane for cooling pipes
111 matmgr.Mixture("ALICE3_TRKSERVICES", 71, "SILICONDIOXIDE", aSiO2, zSiO2, dSiO2, 2, wSiO2); // Fused silica SiO2
112 matmgr.Mixture("ALICE3_TRKSERVICES", 72, "WATER", aWater, zWater, dWater, 2, wWater); // Water for cooling pipes
113 matmgr.Material("ALICE3_TRKSERVICES", 67, "COPPER", 63.546, 29, 8.96, 1.43, 15.1); // Copper for cables
114 matmgr.Material("ALICE3_TRKSERVICES", 73, "BERYLLIUM", 9.01, 4., 1.848, 35.3, 36.7); // Beryllium - Candidate for IRIS vacuum vessel
115 matmgr.Mixture("ALICE3_TRKSERVICES", 74, "ALUMINIUM5083", aAl5083, zAl5083, dAl5083, 9, wAl5083); // AL5083 - Candidate for IRIS vacuum vessel
116 matmgr.Mixture("ALICE3_TRKSERVICES", 75, "ALUMINIUMBERYLLIUMMETAL", aAlBeMet, zAlBeMet, dAlBeMet, 2, wAlBeMet); // Aluminium-Beryllium metal - Candidate for IRIS vacuum vessel
117 matmgr.Material("ALICE3_TRKSERVICES", 76, "CARBONFIBERM55J6K", 12.0107, 6, 1.92, 999, 999); // Carbon Fiber M55J
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}
131
132void TRKServices::createServices(TGeoVolume* motherVolume)
133{
135 createColdplate(motherVolume);
136 createMiddleServices(motherVolume);
137 createOuterDisksServices(motherVolume);
138 createOuterBarrelServices(motherVolume);
139}
140
141void TRKServices::createColdplate(TGeoVolume* motherVolume)
142{
144 const TGeoMedium* medCeramic = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_CERAMIC");
145
146 TGeoTube* coldPlate = new TGeoTube("TRK_COLDPLATEsh", mColdPlateRMin, mColdPlateRMin + mColdPlateThickness, mColdPlateZLength / 2.);
147 TGeoVolume* coldPlateVolume = new TGeoVolume("TRK_COLDPLATE", coldPlate, medCeramic);
148 coldPlateVolume->SetVisibility(1);
149 coldPlateVolume->SetLineColor(kGray);
150
151 LOGP(info, "Creating cold plate service");
152
153 LOGP(info, "Inserting {} in {} ", coldPlateVolume->GetName(), motherVolume->GetName());
154 motherVolume->AddNode(coldPlateVolume, 1, nullptr);
155
156 // IRIS Tracker Vacuum Vessel
157 TGeoTube* irisVacuumVesselInnerTube = new TGeoTube("TRK_IRISVACUUMVESSEL_INNERTUBEsh", mRInIRISVacV, mRInIRISVacV + mThicknessIRISVacV, mZLengthIRISVacV / 2.);
158 TGeoTube* irisVacuumVesselOuterTube = new TGeoTube("TRK_IRISVACUUMVESSEL_OUTERTUBEsh", mROutIRISVacV, mROutIRISVacV + mThicknessIRISVacV, mZLengthIRISVacV / 2.);
159 TGeoTube* irisVacuumVesselWall = new TGeoTube("TRK_IRISVACUUMVESSEL_WALLsh", mRInIRISVacV, mROutIRISVacV + mThicknessIRISVacV, mThicknessIRISVacV / 2.);
160 TGeoTranslation* irisVacVWallNegZ = new TGeoTranslation("IRISVACVWALLNEGZ", 0., 0., -mZLengthIRISVacV / 2. - mThicknessIRISVacV / 2.);
161 irisVacVWallNegZ->RegisterYourself();
162 TGeoTranslation* irisVacVWallPosZ = new TGeoTranslation("IRISVACVWALLPOSZ", 0., 0., mZLengthIRISVacV / 2. + mThicknessIRISVacV / 2.);
163 irisVacVWallPosZ->RegisterYourself();
164 TString irisCompositeFormula =
165 "TRK_IRISVACUUMVESSEL_INNERTUBEsh"
166 "+TRK_IRISVACUUMVESSEL_OUTERTUBEsh"
167 "+TRK_IRISVACUUMVESSEL_WALLsh:IRISVACVWALLNEGZ"
168 "+TRK_IRISVACUUMVESSEL_WALLsh:IRISVACVWALLPOSZ";
169 TGeoCompositeShape* irisVacuumVesselComposite = new TGeoCompositeShape("TRK_IRISVACUUMVESSELsh", irisCompositeFormula);
170
171 const TGeoMedium* medBe = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_BERYLLIUM");
172 TGeoVolume* irisVacuumVesselVolume = new TGeoVolume("TRK_IRISVACUUMVESSEL", irisVacuumVesselComposite, medBe);
173
174 irisVacuumVesselVolume->SetVisibility(1);
175 irisVacuumVesselVolume->SetLineColor(kGray);
176
177 LOGP(info, "Creating IRIS Tracker vacuum vessel");
178 LOGP(info, "Inserting {} in {} ", irisVacuumVesselVolume->GetName(), motherVolume->GetName());
179 motherVolume->AddNode(irisVacuumVesselVolume, 1, nullptr);
180}
181
182void TRKServices::createOuterDisksServices(TGeoVolume* motherVolume)
183{
184 // This method hardcoes the pink shape for the inner services
186
187 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
188 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
189 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
190 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
191 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
192
193 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
194 // Create fibers: 2.12mm
195 float siO2FiberThick = 0.5 * 0.212;
196 float peFiberThick = 0.5 * 0.212;
197
198 float rMinInnerServices = 68.5f; // 68.5cm
199 float zLengthInnerServices = 201.f; // 201cm
200 float translation = (int)orientation * (149.f + zLengthInnerServices / 2); // ±149cm
201
202 TGeoTube* outerDisksFiberSIO2 = new TGeoTube("TRK_OUTERDISKS_FIBER_SIO2sh", rMinInnerServices, rMinInnerServices + siO2FiberThick, zLengthInnerServices / 2);
203 TGeoTube* outerDisksFiberPE = new TGeoTube("TRK_OUTERDISKS_FIBER_PEsh", rMinInnerServices + siO2FiberThick, rMinInnerServices + siO2FiberThick + peFiberThick, zLengthInnerServices / 2);
204 rMinInnerServices += siO2FiberThick + peFiberThick;
205 TGeoVolume* outerDisksFiberSIO2Volume = new TGeoVolume("TRK_OUTERDISKS_FIBER_SIO2", outerDisksFiberSIO2, medSiO2);
206 TGeoVolume* outerDisksFiberPEVolume = new TGeoVolume("TRK_OUTERDISKS_FIBER_PE", outerDisksFiberPE, medPE);
207 outerDisksFiberSIO2Volume->SetLineColor(kGray);
208 outerDisksFiberPEVolume->SetLineColor(kGray);
209 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, nullptr);
210 motherVolume->AddNode(outerDisksFiberSIO2Volume, 1, combiTrans);
211 motherVolume->AddNode(outerDisksFiberPEVolume, 1, combiTrans);
212
213 // Create power lines: 11.86mm
214 float cuPowerThick = 0.09 * 1.186;
215 float pePowerThick = 0.91 * 1.186;
216
217 TGeoTube* outerDisksPowerCu = new TGeoTube("TRK_OUTERDISKS_POWER_CUsh", rMinInnerServices, rMinInnerServices + cuPowerThick, zLengthInnerServices / 2);
218 TGeoTube* outerDisksPowerPE = new TGeoTube("TRK_OUTERDISKS_POWER_PEsh", rMinInnerServices + cuPowerThick, rMinInnerServices + cuPowerThick + pePowerThick, zLengthInnerServices / 2);
219 rMinInnerServices += cuPowerThick + pePowerThick;
220 TGeoVolume* outerDisksPowerCuVolume = new TGeoVolume("TRK_OUTERDISKS_POWER_CU", outerDisksPowerCu, medCu);
221 TGeoVolume* outerDisksPowerPEVolume = new TGeoVolume("TRK_OUTERDISKS_POWER_PE", outerDisksPowerPE, medPE);
222 outerDisksPowerCuVolume->SetLineColor(kGray);
223 outerDisksPowerPEVolume->SetLineColor(kGray);
224 motherVolume->AddNode(outerDisksPowerCuVolume, 1, combiTrans);
225 motherVolume->AddNode(outerDisksPowerPEVolume, 1, combiTrans);
226
227 // Create cooling: 6.47mm
228 float puCoolingThick = 0.56 * 0.647;
229 float h2oCoolingThick = 0.44 * 0.647;
230
231 TGeoTube* outerDisksCoolingPU = new TGeoTube("TRK_OUTERDISKS_COOLING_PUsh", rMinInnerServices, rMinInnerServices + puCoolingThick, zLengthInnerServices / 2);
232 TGeoTube* outerDisksCoolingH2O = new TGeoTube("TRK_OUTERDISKS_COOLING_H2Osh", rMinInnerServices + puCoolingThick, rMinInnerServices + puCoolingThick + h2oCoolingThick, zLengthInnerServices / 2);
233 // rMinInnerServices += puCoolingThick + h2oCoolingThick;
234 TGeoVolume* outerDisksCoolingPUVolume = new TGeoVolume("TRK_OUTERDISKS_COOLING_PU", outerDisksCoolingPU, medPU);
235 TGeoVolume* outerDisksCoolingH2OVolume = new TGeoVolume("TRK_OUTERDISKS_COOLING_H2O", outerDisksCoolingH2O, medH2O);
236 outerDisksCoolingPUVolume->SetLineColor(kGray);
237 outerDisksCoolingH2OVolume->SetLineColor(kGray);
238 motherVolume->AddNode(outerDisksCoolingPUVolume, 1, combiTrans);
239 motherVolume->AddNode(outerDisksCoolingH2OVolume, 1, combiTrans);
240 }
241}
242
243void TRKServices::createMiddleServices(TGeoVolume* motherVolume)
244{
245 // This method hardcoes the yellow shape for the middle services
247
248 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
249 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
250 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
251 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
252 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
253 TGeoMedium* medCFiber = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_CARBONFIBERM55J6K");
254
255 // Create fibers: 3.07mm, 50% SiO2, 50% PE
256 float siO2FiberThick = 0.5 * 0.307;
257 float peFiberThick = 0.5 * 0.307;
258 float puCoolingThick = 0.56 * 0.474;
259 float h2oCoolingThick = 0.44 * 0.474;
260 float cuPowerThick = 0.09 * 1.09;
261 float pePowerThick = 0.91 * 1.09;
262 const float totalThickness = siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick;
263
264 // Carbon Fiber Cylinder support for the middle tracker
265 float rMinMiddleCarbonSupport = 34.8f; // Arbitrary value
266 float rMaxMiddleCarbonSupport = 35.f; // 2 mm of carbon fiber
267 const float zLengthMiddleCarbon = 62.f;
268 TGeoTube* middleBarrelCarbonSupport = new TGeoTube("TRK_MID_CARBONSUPPORTsh", rMinMiddleCarbonSupport, rMaxMiddleCarbonSupport, zLengthMiddleCarbon);
269 TGeoVolume* middleBarrelCarbonSupportVolume = new TGeoVolume("TRK_MID_CARBONSUPPORT", middleBarrelCarbonSupport, medCFiber);
270 middleBarrelCarbonSupportVolume->SetLineColor(kGray);
271 LOGP(info, "Creating carbon fiber support for Middle Tracker");
272 motherVolume->AddNode(middleBarrelCarbonSupportVolume, 1, nullptr);
273
274 // Get geometry information from TRK which is already present
275 float rMinMiddleServices = 35.f;
276 float rMinMiddleBarrel = rMinMiddleServices;
277 const float zLengthCylinderMiddleServices = 40.5f;
278 const float zLengthMiddleServices = 143.f;
279 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
280 rMinMiddleServices = 35.f;
281 LOGP(info, "Building services for Middle Tracker rminMiddleServices");
282 TGeoTube* middleBarrelFiberSIO2 = new TGeoTube(Form("TRK_MID_FIBER_SIO2sh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + siO2FiberThick, zLengthCylinderMiddleServices /* + totalThickness*/);
283 rMinMiddleServices += siO2FiberThick;
284 TGeoTube* middleBarrelFiberPE = new TGeoTube(Form("TRK_MID_FIBER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + peFiberThick, zLengthCylinderMiddleServices /* + totalThickness*/);
285 rMinMiddleServices += peFiberThick;
286 TGeoVolume* middleBarrelFiberSIO2Volume = new TGeoVolume(Form("TRK_MID_FIBER_SIO2_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelFiberSIO2, medSiO2);
287 TGeoVolume* middleBarrelFiberPEVolume = new TGeoVolume(Form("TRK_MID_FIBER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelFiberPE, medPE);
288 middleBarrelFiberSIO2Volume->SetLineColor(kGray);
289 middleBarrelFiberPEVolume->SetLineColor(kGray);
290 auto* combiTrans = new TGeoCombiTrans(0, 0, (int)orientation * (zLengthMiddleServices - zLengthCylinderMiddleServices), nullptr);
291 motherVolume->AddNode(middleBarrelFiberSIO2Volume, 1, combiTrans);
292 motherVolume->AddNode(middleBarrelFiberPEVolume, 1, combiTrans);
293
294 // Create powerlines: 10.9mm, 9% Cu, 91% PE
295 TGeoTube* middleBarrelPowerCu = new TGeoTube(Form("TRK_MID_POWER_CUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + cuPowerThick, zLengthCylinderMiddleServices /* + totalThickness*/);
296 rMinMiddleServices += cuPowerThick;
297 TGeoTube* middleBarrelPowerPE = new TGeoTube(Form("TRK_MID_POWER_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + pePowerThick, zLengthCylinderMiddleServices /* + totalThickness*/);
298 rMinMiddleServices += pePowerThick;
299 TGeoVolume* middleBarrelPowerCuVolume = new TGeoVolume(Form("TRK_MID_POWER_CU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelPowerCu, medCu);
300 TGeoVolume* middleBarrelPowerPEVolume = new TGeoVolume(Form("TRK_MID_POWER_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelPowerPE, medPE);
301 middleBarrelPowerCuVolume->SetLineColor(kGray);
302 middleBarrelPowerPEVolume->SetLineColor(kGray);
303 motherVolume->AddNode(middleBarrelPowerCuVolume, 1, combiTrans);
304 motherVolume->AddNode(middleBarrelPowerPEVolume, 1, combiTrans);
305
306 // Create cooling pipes: 4.74mm, 56% PU, 44% H2O
307 TGeoTube* middleBarrelCoolingPU = new TGeoTube(Form("TRK_MID_COOLING_PUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + puCoolingThick, zLengthCylinderMiddleServices /* + totalThickness*/);
308 rMinMiddleServices += puCoolingThick;
309 TGeoTube* middleBarrelCoolingH2O = new TGeoTube(Form("TRK_MID_COOLING_H2Osh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleServices, rMinMiddleServices + h2oCoolingThick, zLengthCylinderMiddleServices /* + totalThickness*/);
310 rMinMiddleServices = rMinMiddleServices += h2oCoolingThick;
311 TGeoVolume* middleBarrelCoolingPUVolume = new TGeoVolume(Form("TRK_MID_COOLING_PU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelCoolingPU, medPU);
312 TGeoVolume* middleBarrelCoolingH2OVolume = new TGeoVolume(Form("TRK_MID_COOLING_H2O_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelCoolingH2O, medH2O);
313 middleBarrelCoolingPUVolume->SetLineColor(kGray);
314 middleBarrelCoolingH2OVolume->SetLineColor(kGray);
315 motherVolume->AddNode(middleBarrelCoolingPUVolume, 1, combiTrans);
316 motherVolume->AddNode(middleBarrelCoolingH2OVolume, 1, combiTrans);
317 }
318 // Middle barrel connection disks
319 const float rMinMiddleBarrelDisk = 5.68f;
320 const float rMaxMiddleBarrelDisk = 35.f;
321 const float zLengthMiddleBarrel = 62.f;
322 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
323 TGeoTube* middleBarrelConnDiskSIO2 = new TGeoTube(Form("TRK_MIDBARCONN_DISK_SIO2sh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, siO2FiberThick);
324 TGeoTube* middleBarrelConnDiskPE = new TGeoTube(Form("TRK_MIDBARCONN_DISK_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, peFiberThick);
325 TGeoVolume* middleBarrelConnDiskSIO2Volume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_SIO2_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskSIO2, medSiO2);
326 TGeoVolume* middleBarrelConnDiskPEVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskPE, medPE);
327 middleBarrelConnDiskSIO2Volume->SetLineColor(kGray);
328 middleBarrelConnDiskPEVolume->SetLineColor(kGray);
329 auto* rot = new TGeoRotation("", 0, 0, 180);
330 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick / 2 + zLengthMiddleBarrel), rot);
331 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick / 2 + zLengthMiddleBarrel), rot);
332 motherVolume->AddNode(middleBarrelConnDiskSIO2Volume, 1, combiTransSIO2);
333 motherVolume->AddNode(middleBarrelConnDiskPEVolume, 1, combiTransPE);
334
335 TGeoTube* middleBarrelConnDiskCu = new TGeoTube(Form("TRK_MIDBARCONN_DISK_CUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, cuPowerThick);
336 TGeoTube* middleBarrelConnDiskPEPower = new TGeoTube(Form("TRK_MIDBARCONN_DISK_PEsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, pePowerThick);
337 TGeoVolume* middleBarrelConnDiskCuVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_CU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskCu, medCu);
338 TGeoVolume* middleBarrelConnDiskPEPowerVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_PE_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskPEPower, medPE);
339 middleBarrelConnDiskCuVolume->SetLineColor(kGray);
340 middleBarrelConnDiskPEPowerVolume->SetLineColor(kGray);
341 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick / 2 + zLengthMiddleBarrel), rot);
342 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick / 2 + zLengthMiddleBarrel), rot);
343 motherVolume->AddNode(middleBarrelConnDiskCuVolume, 1, combiTransCu);
344 motherVolume->AddNode(middleBarrelConnDiskPEPowerVolume, 1, combiTransPEPower);
345
346 TGeoTube* middleBarrelConnDiskPU = new TGeoTube(Form("TRK_MIDBARCONN_DISK_PUsh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, puCoolingThick);
347 TGeoTube* middleBarrelConnDiskH2O = new TGeoTube(Form("TRK_MIDBARCONN_DISK_H2Osh_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), rMinMiddleBarrelDisk, rMaxMiddleBarrelDisk, h2oCoolingThick);
348 TGeoVolume* middleBarrelConnDiskPUVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_PU_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskPU, medPU);
349 TGeoVolume* middleBarrelConnDiskH2OVolume = new TGeoVolume(Form("TRK_MIDBARCONN_DISK_H2O_%s", orientation == Orientation::kASide ? "bwd" : "fwd"), middleBarrelConnDiskH2O, medH2O);
350 middleBarrelConnDiskPUVolume->SetLineColor(kGray);
351 middleBarrelConnDiskH2OVolume->SetLineColor(kGray);
352 motherVolume->AddNode(middleBarrelConnDiskPUVolume, 1, combiTransCu);
353 motherVolume->AddNode(middleBarrelConnDiskH2OVolume, 1, combiTransPEPower);
354 }
355
356 // Barrel to forward connection disks
357 float rMaxMiddleServicesBarFwd = 74.5f + siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick;
358 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
359 // Create fibers: 3.07mm, 50% SiO2, 50% PE
360 TGeoTube* middleBarFwdFiberSIO2 = new TGeoTube("TRK_MIDBARFWD_FIBER_SIO2sh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, siO2FiberThick);
361 TGeoTube* middleBarFwdFiberPE = new TGeoTube("TRK_MIDBARFWD_FIBER_PEsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, peFiberThick);
362 TGeoVolume* middleBarFwdFiberSIO2Volume = new TGeoVolume("TRK_MIDBARFWD_FIBER_SIO2", middleBarFwdFiberSIO2, medSiO2);
363 TGeoVolume* middleBarFwdFiberPEVolume = new TGeoVolume("TRK_MIDBARFWD_FIBER_PE", middleBarFwdFiberPE, medPE);
364 middleBarFwdFiberSIO2Volume->SetLineColor(kGray);
365 middleBarFwdFiberPEVolume->SetLineColor(kGray);
366 auto* rot = new TGeoRotation("", 0, 0, 180);
367 auto* combiTransSIO2 = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick / 2 + zLengthMiddleServices), rot);
368 auto* combiTransPE = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick / 2 + zLengthMiddleServices), rot);
369 motherVolume->AddNode(middleBarFwdFiberSIO2Volume, 1, combiTransSIO2);
370 motherVolume->AddNode(middleBarFwdFiberPEVolume, 1, combiTransPE);
371
372 // Create powerlines: 10.9mm, 9% Cu, 91% PE
373 TGeoTube* middleBarFwdPowerCu = new TGeoTube("TRK_MIDBARFWD_POWER_CUsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, cuPowerThick);
374 TGeoTube* middleBarFwdPowerPE = new TGeoTube("TRK_MIDBARFWD_POWER_PEsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, pePowerThick);
375 TGeoVolume* middleBarFwdPowerCuVolume = new TGeoVolume("TRK_MIDBARFWD_POWER_CU", middleBarFwdPowerCu, medCu);
376 TGeoVolume* middleBarFwdPowerPEVolume = new TGeoVolume("TRK_MIDBARFWD_POWER_PE", middleBarFwdPowerPE, medPE);
377 middleBarFwdPowerCuVolume->SetLineColor(kGray);
378 middleBarFwdPowerPEVolume->SetLineColor(kGray);
379 auto* combiTransCu = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick / 2 + zLengthMiddleServices), rot);
380 auto* combiTransPEPower = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick / 2 + zLengthMiddleServices), rot);
381 motherVolume->AddNode(middleBarFwdPowerCuVolume, 1, combiTransCu);
382 motherVolume->AddNode(middleBarFwdPowerPEVolume, 1, combiTransPEPower);
383
384 // Create cooling pipes: 4.74mm, 56% PU, 44% H2O
385 TGeoTube* middleBarFwdCoolingPU = new TGeoTube("TRK_MIDBARFWD_COOLING_PUsh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, puCoolingThick);
386 TGeoTube* middleBarFwdCoolingH2O = new TGeoTube("TRK_MIDBARFWD_COOLING_H2Osh", rMinMiddleBarrel, rMaxMiddleServicesBarFwd, h2oCoolingThick);
387 TGeoVolume* middleBarFwdCoolingPUVolume = new TGeoVolume("TRK_MIDBARFWD_COOLING_PU", middleBarFwdCoolingPU, medPU);
388 TGeoVolume* middleBarFwdCoolingH2OVolume = new TGeoVolume("TRK_MIDBARFWD_COOLING_H2O", middleBarFwdCoolingH2O, medH2O);
389 middleBarFwdCoolingPUVolume->SetLineColor(kGray);
390 middleBarFwdCoolingH2OVolume->SetLineColor(kGray);
391 auto* combiTransCoolingPU = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick / 2 + zLengthMiddleServices), rot);
392 auto* combiTransCoolingH2O = new TGeoCombiTrans(0, 0, (int)orientation * (siO2FiberThick + peFiberThick + cuPowerThick + pePowerThick + puCoolingThick + h2oCoolingThick / 2 + zLengthMiddleServices), rot);
393 motherVolume->AddNode(middleBarFwdCoolingPUVolume, 1, combiTransCoolingPU);
394 motherVolume->AddNode(middleBarFwdCoolingH2OVolume, 1, combiTransCoolingH2O);
395 }
396
397 // Forward part
398 const float zLengthMiddleServicesFwd = 350.f - (143.f + totalThickness);
399
400 for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
401 // Create fibers: 3.07mm, 50% SiO2, 50% PE
402 float siO2FiberThick = 0.5 * 0.307;
403 float peFiberThick = 0.5 * 0.307;
404 float rMinMiddleServicesFwd = 74.5f; // 74.5cm
405
406 float translation = (int)orientation * (143.f + totalThickness + zLengthMiddleServicesFwd / 2);
407
408 TGeoTube* middleFwdFiberSIO2 = new TGeoTube("TRK_MIDFWD_FIBER_SIO2sh", rMinMiddleServicesFwd, rMinMiddleServicesFwd + siO2FiberThick, zLengthMiddleServicesFwd / 2);
409 TGeoTube* middleFwdFiberPE = new TGeoTube("TRK_MIDFWD_FIBER_PEsh", rMinMiddleServicesFwd + siO2FiberThick, rMinMiddleServicesFwd + siO2FiberThick + peFiberThick, zLengthMiddleServicesFwd / 2);
410 rMinMiddleServicesFwd += siO2FiberThick + peFiberThick;
411 TGeoVolume* middleFwdFiberSIO2Volume = new TGeoVolume("TRK_MIDFWD_FIBER_SIO2", middleFwdFiberSIO2, medSiO2);
412 TGeoVolume* middleFwdFiberPEVolume = new TGeoVolume("TRK_MIDFWD_FIBER_PE", middleFwdFiberPE, medPE);
413 middleFwdFiberSIO2Volume->SetLineColor(kGray);
414 middleFwdFiberPEVolume->SetLineColor(kGray);
415 auto* combiTrans = new TGeoCombiTrans(0, 0, translation, nullptr);
416 motherVolume->AddNode(middleFwdFiberSIO2Volume, 1, combiTrans);
417 motherVolume->AddNode(middleFwdFiberPEVolume, 1, combiTrans);
418
419 // Create powerlines: 10.9mm, 9% Cu, 91% PE
420 float cuPowerThick = 0.09 * 1.09;
421 float pePowerThick = 0.91 * 1.09;
422
423 TGeoTube* middleFwdPowerCu = new TGeoTube("TRK_MIDFWD_POWER_CUsh", rMinMiddleServicesFwd, rMinMiddleServicesFwd + cuPowerThick, zLengthMiddleServicesFwd / 2);
424 TGeoTube* middleFwdPowerPE = new TGeoTube("TRK_MIDFWD_POWER_PEsh", rMinMiddleServicesFwd + cuPowerThick, rMinMiddleServicesFwd + cuPowerThick + pePowerThick, zLengthMiddleServicesFwd / 2);
425 rMinMiddleServicesFwd += cuPowerThick + pePowerThick;
426 TGeoVolume* middleFwdPowerCuVolume = new TGeoVolume("TRK_MIDFWD_POWER_CU", middleFwdPowerCu, medCu);
427 TGeoVolume* middleFwdPowerPEVolume = new TGeoVolume("TRK_MIDFWD_POWER_PE", middleFwdPowerPE, medPE);
428 middleFwdPowerCuVolume->SetLineColor(kGray);
429 middleFwdPowerPEVolume->SetLineColor(kGray);
430 motherVolume->AddNode(middleFwdPowerCuVolume, 1, combiTrans);
431 motherVolume->AddNode(middleFwdPowerPEVolume, 1, combiTrans);
432
433 // Create cooling pipes: 4.74mm, 56% PU, 44% H2O
434 float puCoolingThick = 0.56 * 0.474;
435 float h2oCoolingThick = 0.44 * 0.474;
436
437 TGeoTube* middleFwdCoolingPU = new TGeoTube("TRK_MIDFWD_COOLING_PUsh", rMinMiddleServicesFwd, rMinMiddleServicesFwd + puCoolingThick, zLengthMiddleServicesFwd / 2);
438 TGeoTube* middleFwdCoolingH2O = new TGeoTube("TRK_MIDFWD_COOLING_H2Osh", rMinMiddleServicesFwd + puCoolingThick, rMinMiddleServicesFwd + puCoolingThick + h2oCoolingThick, zLengthMiddleServicesFwd / 2);
439 // rMinMiddleServicesFwd += puCoolingThick + h2oCoolingThick;
440 TGeoVolume* middleFwdCoolingPUVolume = new TGeoVolume("TRK_MIDFWD_COOLING_PU", middleFwdCoolingPU, medPU);
441 TGeoVolume* middleFwdCoolingH2OVolume = new TGeoVolume("TRK_MIDFWD_COOLING_H2O", middleFwdCoolingH2O, medH2O);
442 middleFwdCoolingPUVolume->SetLineColor(kGray);
443 middleFwdCoolingH2OVolume->SetLineColor(kGray);
444 motherVolume->AddNode(middleFwdCoolingPUVolume, 1, combiTrans);
445 motherVolume->AddNode(middleFwdCoolingH2OVolume, 1, combiTrans);
446 }
447}
448
449void TRKServices::createOuterBarrelServices(TGeoVolume* motherVolume)
450{
452
453 TGeoMedium* medSiO2 = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_SILICONDIOXIDE");
454 TGeoMedium* medPE = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYETHYLENE");
455 TGeoMedium* medCu = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_COPPER");
456 TGeoMedium* medPU = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_POLYURETHANE");
457 TGeoMedium* medH2O = matmgr.getTGeoMedium("ALICE3_TRKSERVICES_WATER");
458
459 // Fiber 0.269 cm
460 const float siO2FiberThick = 0.5 * 0.269;
461 const float peFiberThick = 0.5 * 0.269;
462 float rMinOuterBarrelServices = ((TGeoTube*)motherVolume->GetNode(Form("%s10_1", GeometryTGeo::getTRKLayerPattern()))->GetVolume()->GetShape())->GetRmax();
463 const float zLengthOuterBarrelServices = 350.f; // 175cm
464
465 TGeoTube* outerBarrelFiberSIO2 = new TGeoTube("TRK_OUTERBARREL_FIBER_SIO2sh", rMinOuterBarrelServices, rMinOuterBarrelServices + siO2FiberThick, zLengthOuterBarrelServices);
466 TGeoTube* outerBarrelFiberPE = new TGeoTube("TRK_OUTERBARREL_FIBER_PEsh", rMinOuterBarrelServices + siO2FiberThick, rMinOuterBarrelServices + siO2FiberThick + peFiberThick, zLengthOuterBarrelServices);
467 rMinOuterBarrelServices += siO2FiberThick + peFiberThick;
468 TGeoVolume* outerBarrelFiberSIO2Volume = new TGeoVolume("TRK_OUTERBARREL_FIBER_SIO2", outerBarrelFiberSIO2, medSiO2);
469 TGeoVolume* outerBarrelFiberPEVolume = new TGeoVolume("TRK_OUTERBARREL_FIBER_PE", outerBarrelFiberPE, medPE);
470 outerBarrelFiberSIO2Volume->SetLineColor(kGray);
471 outerBarrelFiberPEVolume->SetLineColor(kGray);
472 motherVolume->AddNode(outerBarrelFiberSIO2Volume, 1, nullptr);
473 motherVolume->AddNode(outerBarrelFiberPEVolume, 1, nullptr);
474
475 // Power 0.430 cm
476 const float cuPowerThick = 0.09 * 0.430;
477 const float pePowerThick = 0.91 * 0.430;
478
479 TGeoTube* outerBarrelPowerCu = new TGeoTube("TRK_OUTERBARREL_POWER_CUsh", rMinOuterBarrelServices, rMinOuterBarrelServices + cuPowerThick, zLengthOuterBarrelServices);
480 TGeoTube* outerBarrelPowerPE = new TGeoTube("TRK_OUTERBARREL_POWER_PEsh", rMinOuterBarrelServices + cuPowerThick, rMinOuterBarrelServices + cuPowerThick + pePowerThick, zLengthOuterBarrelServices);
481 rMinOuterBarrelServices += cuPowerThick + pePowerThick;
482 TGeoVolume* outerBarrelPowerCuVolume = new TGeoVolume("TRK_OUTERBARREL_POWER_CU", outerBarrelPowerCu, medCu);
483 TGeoVolume* outerBarrelPowerPEVolume = new TGeoVolume("TRK_OUTERBARREL_POWER_PE", outerBarrelPowerPE, medPE);
484 outerBarrelPowerCuVolume->SetLineColor(kGray);
485 outerBarrelPowerPEVolume->SetLineColor(kGray);
486 motherVolume->AddNode(outerBarrelPowerCuVolume, 1, nullptr);
487 motherVolume->AddNode(outerBarrelPowerPEVolume, 1, nullptr);
488
489 // Cooling 1.432 cm
490 const float puCoolingThick = 0.56 * 1.432;
491 const float h2oCoolingThick = 0.44 * 1.432;
492
493 TGeoTube* outerBarrelCoolingPU = new TGeoTube("TRK_OUTERBARREL_COOLING_PUsh", rMinOuterBarrelServices, rMinOuterBarrelServices + puCoolingThick, zLengthOuterBarrelServices);
494 TGeoTube* outerBarrelCoolingH2O = new TGeoTube("TRK_OUTERBARREL_COOLING_H2Osh", rMinOuterBarrelServices + puCoolingThick, rMinOuterBarrelServices + puCoolingThick + h2oCoolingThick, zLengthOuterBarrelServices);
495 // rMinOuterBarrelServices += puCoolingThick + h2oCoolingThick;
496 TGeoVolume* outerBarrelCoolingPUVolume = new TGeoVolume("TRK_OUTERBARREL_COOLING_PU", outerBarrelCoolingPU, medPU);
497 TGeoVolume* outerBarrelCoolingH2OVolume = new TGeoVolume("TRK_OUTERBARREL_COOLING_H2O", outerBarrelCoolingH2O, medH2O);
498 outerBarrelCoolingPUVolume->SetLineColor(kGray);
499 outerBarrelCoolingH2OVolume->SetLineColor(kGray);
500 motherVolume->AddNode(outerBarrelCoolingPUVolume, 1, nullptr);
501 motherVolume->AddNode(outerBarrelCoolingH2OVolume, 1, nullptr);
502}
503} // namespace trk
504} // namespace o2
Definition of the GeometryTGeo class.
static MaterialManager & Instance()
static const char * getTRKLayerPattern()
void createOuterBarrelServices(TGeoVolume *motherVolume)
void createServices(TGeoVolume *motherVolume)
void createOuterDisksServices(TGeoVolume *motherVolume)
void createColdplate(TGeoVolume *motherVolume)
void createMiddleServices(TGeoVolume *motherVolume)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...