Project
Loading...
Searching...
No Matches
FT3Layer.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
20
21#include <TGeoManager.h> // for TGeoManager, gGeoManager
22#include <TGeoMatrix.h> // for TGeoCombiTrans, TGeoRotation, etc
23#include <TGeoTube.h> // for TGeoTube, TGeoTubeSeg
24#include <TGeoArb8.h> // for TGeoTrap
25#include <TGeoVolume.h> // for TGeoVolume, TGeoVolumeAssembly
26#include <TGeoCompositeShape.h> // for TGeoCompositeShape
27#include "TMathBase.h" // for Abs
28#include <TMath.h> // for Sin, RadToDeg, DegToRad, Cos, Tan, etc
29
30class TGeoMedium;
31
32using namespace TMath;
33using namespace o2::ft3;
34using namespace o2::itsmft;
35
37
38FT3Layer::~FT3Layer() = default;
39
40TGeoMaterial* FT3Layer::carbonFiberMat = nullptr;
41TGeoMedium* FT3Layer::medCarbonFiber = nullptr;
42
43TGeoMaterial* FT3Layer::kaptonMat = nullptr;
44TGeoMedium* FT3Layer::kaptonMed = nullptr;
45
46TGeoMaterial* FT3Layer::waterMat = nullptr;
47TGeoMedium* FT3Layer::waterMed = nullptr;
48
49TGeoMaterial* FT3Layer::foamMat = nullptr;
50TGeoMedium* FT3Layer::medFoam = nullptr;
51
52FT3Layer::FT3Layer(Int_t layerDirection, Int_t layerNumber, std::string layerName, Float_t z, Float_t rIn, Float_t rOut, Float_t Layerx2X0, bool partOfMiddleLayers)
53{
54 // Creates a simple parametrized EndCap layer covering the given
55 // pseudorapidity range at the z layer position
56 mDirection = layerDirection;
57 mLayerNumber = layerNumber;
58 mIsMiddleLayer = partOfMiddleLayers;
59 mLayerName = layerName;
60 mZ = layerDirection ? std::abs(z) : -std::abs(z);
61 mx2X0 = Layerx2X0;
62 mInnerRadius = rIn;
63 mOuterRadius = rOut;
64 const double Si_X0 = 9.5;
65 mChipThickness = Layerx2X0 * Si_X0;
66 mSensorThickness = 0.005; // assume 50 microns of active thickness (for sensor volumes for trapezoidal disks)
67
68 // Sanity checks
69 if (std::isnan(mZ)) {
70 LOG(fatal) << "FT3 Layer " << mLayerNumber << " has z = NaN, which is not a valid number.";
71 }
72 if (mZ < 0.001 && mZ > -0.001) {
73 LOG(fatal) << "FT3 Layer " << mLayerNumber << " has z = " << mZ << " cm, which is very close to 0.";
74 }
75
76 LOG(info) << "Creating FT3 Layer " << mLayerNumber << " ; direction " << mDirection;
77 LOG(info) << " Using silicon X0 = " << Si_X0 << " to emulate layer radiation length.";
78 LOG(info) << " Layer z = " << mZ << " ; R_in = " << mInnerRadius << " ; R_out = " << mOuterRadius << " ; x2X0 = " << mx2X0 << " ; ChipThickness = " << mChipThickness;
79}
80
82{
83
84 if (carbonFiberMat) {
85 return;
86 }
87
88 carbonFiberMat = new TGeoMaterial("CarbonFiber", 12.0, 6.0, 1.6);
89 medCarbonFiber = new TGeoMedium("CarbonFiber", 1, carbonFiberMat);
90
91 auto* itsC = new TGeoElement("FT3_C", "Carbon", 6, 12.0107);
92
93 auto* itsFoam = new TGeoMixture("FT3_Foam", 1);
94 itsFoam->AddElement(itsC, 1);
95 itsFoam->SetDensity(0.17);
96
97 medFoam = new TGeoMedium("FT3_Foam", 1, itsFoam);
98 foamMat = medFoam->GetMaterial();
99
100 kaptonMat = new TGeoMaterial("Kapton (cooling pipe)", 13.84, 6.88, 1.346);
101 kaptonMed = new TGeoMedium("Kapton (cooling pipe)", 1, kaptonMat);
102
103 waterMat = new TGeoMaterial("Water", 18.01528, 8.0, 1.064);
104 waterMed = new TGeoMedium("Water", 2, waterMat);
105}
106
107static double y_circle(double x, double radius)
108{
109 return (x * x < radius * radius) ? std::sqrt(radius * radius - x * x) : 0;
110}
111
112void FT3Layer::createSeparationLayer_waterCooling(TGeoVolume* motherVolume, const std::string& separationLayerName)
113{
114
116
117 const double carbonFiberThickness = 0.01; // cm
118 const double foamSpacingThickness = 0.5; // cm
119
120 TGeoTube* carbonFiberLayer = new TGeoTube(mInnerRadius, mOuterRadius, carbonFiberThickness / 2);
121
122 // volumes
123 TGeoVolume* carbonFiberLayerVol1 = new TGeoVolume((separationLayerName + "_CarbonFiber1").c_str(), carbonFiberLayer, medCarbonFiber);
124 TGeoVolume* carbonFiberLayerVol2 = new TGeoVolume((separationLayerName + "_CarbonFiber2").c_str(), carbonFiberLayer, medCarbonFiber);
125
126 carbonFiberLayerVol1->SetLineColor(kGray + 2);
127 carbonFiberLayerVol2->SetLineColor(kGray + 2);
128
129 const double zSeparation = foamSpacingThickness / 2.0 + carbonFiberThickness / 2.0;
130
131 motherVolume->AddNode(carbonFiberLayerVol1, 1, new TGeoTranslation(0, 0, mZ - zSeparation));
132 motherVolume->AddNode(carbonFiberLayerVol2, 1, new TGeoTranslation(0, 0, mZ + zSeparation));
133
134 const double pipeOuterRadius = 0.20;
135 const double kaptonThickness = 0.0025;
136 const double pipeInnerRadius = pipeOuterRadius - kaptonThickness;
137 const double pipeMaxLength = mOuterRadius * 2.0;
138
139 int name_it = 0;
140
141 // positions of the pipes depending on the overlap of the sensors inactive regions: (ALICE 3 dimensions)
142 // partial:
143 // std::vector<double> X_pos = {-63.2, -58.4, -53.6, -48.8, -44.0, -39.199999999999996, -34.4, -29.599999999999994, -24.799999999999997, -19.999999999999993, -15.199999999999998, -10.399999999999993, -5.599999999999998, -0.7999999999999936, 4.000000000000002, 8.800000000000006, 13.600000000000001, 18.400000000000006, 23.200000000000003, 28.000000000000007, 32.800000000000004, 37.60000000000001, 42.400000000000006, 47.20000000000001, 52.00000000000001, 56.80000000000001, 61.60000000000001, 66.4};
144 // complete:
145 // std::vector<double> X_pos = {-63.4, -58.8, -54.199999999999996, -49.599999999999994, -44.99999999999999, -40.39999999999999, -35.79999999999999, -31.199999999999992, -26.59999999999999, -21.999999999999993, -17.39999999999999, -12.799999999999994, -8.199999999999992, -3.5999999999999934, 1.000000000000008, 5.600000000000007, 10.200000000000008, 14.800000000000008, 19.40000000000001, 24.000000000000007, 28.60000000000001, 33.20000000000001, 37.80000000000001, 42.40000000000001, 47.000000000000014, 51.600000000000016, 56.20000000000002, 60.80000000000002, 65.40000000000002};
146 std::vector<double> X_pos = {-62.3168, -57.9836, -53.650400000000005, -49.317200000000014, -44.984000000000016, -40.65080000000002, -36.31760000000002, -31.984400000000026, -27.65120000000003, -23.318000000000037, -18.98480000000004, -14.651600000000043, -10.318400000000047, -5.98520000000005, -1.6520000000000519, 2.6811999999999445, 7.014399999999941, 11.347599999999936, 15.680799999999934, 20.01399999999993, 24.347199999999926, 28.68039999999992, 33.013599999999926, 37.34679999999992, 41.980000000000004, 46.613200000000006, 51.246399999999994, 55.87960000000001, 60.5128};
147
148 for (double xPos : X_pos) {
149
150 double pipeLength = pipeMaxLength;
151 double yMax = 0.0;
152
153 TGeoRotation* rotation = new TGeoRotation();
154 rotation->RotateX(90);
155
156 if (std::abs(xPos) < mInnerRadius) {
157 double yInner = std::abs(y_circle(xPos, mInnerRadius));
158 double yOuter = std::abs(y_circle(xPos, mOuterRadius));
159
160 yMax = 2 * yOuter;
161 pipeLength = yMax;
162
163 double positiveYLength = yOuter - yInner;
164
165 TGeoVolume* kaptonPipePos = new TGeoVolume((separationLayerName + "_KaptonPipePos_" + std::to_string(name_it)).c_str(), new TGeoTube(pipeInnerRadius, pipeOuterRadius, positiveYLength / 2), kaptonMed);
166 kaptonPipePos->SetLineColor(kGray);
167 TGeoVolume* waterVolumePos = new TGeoVolume((separationLayerName + "_WaterVolumePos_" + std::to_string(name_it)).c_str(), new TGeoTube(0.0, pipeInnerRadius, positiveYLength / 2), waterMed);
168 waterVolumePos->SetLineColor(kBlue);
169
170 motherVolume->AddNode(waterVolumePos, 1, new TGeoCombiTrans(xPos, (yInner + yOuter) / 2.0, mZ, rotation));
171
172 TGeoVolume* kaptonPipeNeg = new TGeoVolume((separationLayerName + "_KaptonPipeNeg_" + std::to_string(name_it)).c_str(), new TGeoTube(pipeInnerRadius, pipeOuterRadius, positiveYLength / 2), kaptonMed);
173 kaptonPipeNeg->SetLineColor(kGray);
174 TGeoVolume* waterVolumeNeg = new TGeoVolume((separationLayerName + "_WaterVolumeNeg_" + std::to_string(name_it)).c_str(), new TGeoTube(0.0, pipeInnerRadius, positiveYLength / 2), waterMed);
175 waterVolumeNeg->SetLineColor(kBlue);
176
177 motherVolume->AddNode(waterVolumeNeg, 1, new TGeoCombiTrans(xPos, -(yInner + yOuter) / 2.0, mZ, rotation));
178
179 motherVolume->AddNode(kaptonPipePos, 1, new TGeoCombiTrans(xPos, (yInner + yOuter) / 2.0, mZ, rotation));
180 motherVolume->AddNode(kaptonPipeNeg, 1, new TGeoCombiTrans(xPos, -(yInner + yOuter) / 2.0, mZ, rotation));
181
182 } else {
183
184 double yOuter = std::abs(y_circle(xPos, mOuterRadius));
185 yMax = 2 * yOuter;
186 pipeLength = yMax;
187
188 TGeoVolume* kaptonPipe = new TGeoVolume((separationLayerName + "_KaptonPipe_" + std::to_string(name_it)).c_str(), new TGeoTube(pipeInnerRadius, pipeOuterRadius, pipeLength / 2), kaptonMed);
189 kaptonPipe->SetLineColor(kGray);
190 TGeoVolume* waterVolume = new TGeoVolume((separationLayerName + "_WaterVolume_" + std::to_string(name_it)).c_str(), new TGeoTube(0.0, pipeInnerRadius, pipeLength / 2), waterMed);
191 waterVolume->SetLineColor(kBlue);
192
193 motherVolume->AddNode(waterVolume, 1, new TGeoCombiTrans(xPos, 0, mZ, rotation));
194 motherVolume->AddNode(kaptonPipe, 1, new TGeoCombiTrans(xPos, 0, mZ, rotation));
195 }
196
197 name_it++;
198 }
199}
200
201void FT3Layer::createSeparationLayer(TGeoVolume* motherVolume, const std::string& separationLayerName)
202{
203
205
206 constexpr double carbonFiberThickness = 0.01; // cm
207 constexpr double foamSpacingThickness = 1.0; // cm
208
209 TGeoTube* carbonFiberLayer = new TGeoTube(mInnerRadius, mOuterRadius, carbonFiberThickness / 2);
210 TGeoTube* foamLayer = new TGeoTube(mInnerRadius, mOuterRadius, foamSpacingThickness / 2);
211
212 // volumes
213 TGeoVolume* carbonFiberLayerVol1 = new TGeoVolume((separationLayerName + "_CarbonFiber1").c_str(), carbonFiberLayer, medCarbonFiber);
214 TGeoVolume* foamLayerVol = new TGeoVolume((separationLayerName + "_Foam").c_str(), foamLayer, medFoam);
215 TGeoVolume* carbonFiberLayerVol2 = new TGeoVolume((separationLayerName + "_CarbonFiber2").c_str(), carbonFiberLayer, medCarbonFiber);
216
217 carbonFiberLayerVol1->SetLineColor(kGray + 2);
218 foamLayerVol->SetLineColor(kBlack);
219 foamLayerVol->SetFillColorAlpha(kBlack, 1.0);
220 carbonFiberLayerVol2->SetLineColor(kGray + 2);
221
222 const double zSeparation = foamSpacingThickness / 2.0 + carbonFiberThickness / 2.0;
223
224 motherVolume->AddNode(carbonFiberLayerVol1, 1, new TGeoTranslation(0, 0, 0 - zSeparation));
225 motherVolume->AddNode(foamLayerVol, 1, new TGeoTranslation(0, 0, 0));
226 motherVolume->AddNode(carbonFiberLayerVol2, 1, new TGeoTranslation(0, 0, 0 + zSeparation));
227}
228
229void FT3Layer::createLayer(TGeoVolume* motherVolume)
230{
231 auto& ft3Params = FT3BaseParam::Instance();
232
233 if (mLayerNumber < 0) {
234 LOG(fatal) << "Invalid layer number " << mLayerNumber << " for FT3 layer.";
235 }
236
237 LOG(info) << "FT3: ft3Params.layoutFT3 = " << ft3Params.layoutFT3;
238
239 // ### options for ML and OT disk layout
240 if (ft3Params.layoutFT3 == kTrapezoidal || (mIsMiddleLayer && ft3Params.layoutFT3 == kSegmented)) {
241 // trapezoidal ML+OT disks
242 // (disks with TGeoTubes doesn'n work properly in ACTS, due to polar coordinates on TGeoTube sides)
243
244 // (!) Currently (March 12, 2026), only OT disks are segmented --> use Trapezoidal option for ML disks as a simplified segmentation
245 // To be changed to "true" paving with modules, as for the OT disks
246
247 std::string chipName = o2::ft3::GeometryTGeo::getFT3ChipPattern() + std::to_string(mLayerNumber);
248 std::string sensName = Form("%s_%d_%d", GeometryTGeo::getFT3SensorPattern(), mDirection, mLayerNumber);
249 std::string passiveName = o2::ft3::GeometryTGeo::getFT3PassivePattern() + std::to_string(mLayerNumber);
250
251 TGeoMedium* medSi = gGeoManager->GetMedium("FT3_SILICON$");
252 TGeoMedium* medAir = gGeoManager->GetMedium("FT3_AIR$");
253
254 TGeoTube* layer = new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
255 TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
256 layerVol->SetLineColor(kGray);
257
258 const int NtrapezoidalSegments = ft3Params.nTrapezoidalSegments;
259
260 const double dz = mChipThickness / 2;
261 const double dzSensor = mSensorThickness / 2;
262
263 const double dphi = 2.0 * TMath::Pi() / NtrapezoidalSegments;
264 double innerRadiusTrapezoidCorner = mInnerRadius / sin((TMath::Pi() - dphi) / 2); // to ensure that the trapezoid segments do not extend beyond the volume
265
266 const double rc = 0.5 * (innerRadiusTrapezoidCorner + mOuterRadius) * TMath::Cos(0.5 * dphi); // radius of tile center
267 const double h = 0.5 * (mOuterRadius - innerRadiusTrapezoidCorner) * TMath::Cos(0.5 * dphi); // half radial length
268
269 // chord lengths at inner/outer radii
270 const double bl = innerRadiusTrapezoidCorner * TMath::Sin(0.5 * dphi); // half lower base
271 const double tl = mOuterRadius * TMath::Sin(0.5 * dphi); // half upper base
272
273 // create trapezoids
274 for (int iTr = 0; iTr < NtrapezoidalSegments; ++iTr) {
275 // chip volume
276 auto trdShapeChip = new TGeoTrap(dz,
277 0.0, 0.0, // theta, phi
278 h, // h1
279 bl, // bl1
280 tl, // tl1
281 0.0, // alpha1
282 h, // h2
283 bl, // bl2
284 tl, // tl2
285 0.0); // alpha2
286 TGeoVolume* trapezoidChipVolume = new TGeoVolume(chipName.c_str(), trdShapeChip, medSi);
287 trapezoidChipVolume->SetLineColor(kCyan);
288 trapezoidChipVolume->SetTransparency(50);
289
290 // sensor volume
291 auto trdShapeSensor = new TGeoTrap(dzSensor,
292 0.0, 0.0, // theta, phi
293 h, // h1
294 bl, // bl1
295 tl, // tl1
296 0.0, // alpha1
297 h, // h2
298 bl, // bl2
299 tl, // tl2
300 0.0); // alpha2
301 TGeoVolume* trapezoidSensorVolume = new TGeoVolume(sensName.c_str(), trdShapeSensor, medSi);
302 trapezoidSensorVolume->SetLineColor(kYellow);
303
304 // placing sensor in chip:
305 const double zSensorInChip = (dz - dzSensor) * (mZ < 0 ? 1 : -1); // place sensor at the outer face of the chip, towards the incoming particles
306 TGeoCombiTrans* transSens = new TGeoCombiTrans();
307 transSens->SetTranslation(0, 0, zSensorInChip);
308 trapezoidChipVolume->AddNode(trapezoidSensorVolume, iTr, transSens);
309
310 // passive volume
311 auto trdShapePassive = new TGeoTrap(dz - dzSensor,
312 0.0, 0.0, // theta, phi
313 h, // h1
314 bl, // bl1
315 tl, // tl1
316 0.0, // alpha1
317 h, // h2
318 bl, // bl2
319 tl, // tl2
320 0.0); // alpha2
321 TGeoVolume* trapezoidPassiveVolume = new TGeoVolume(passiveName.c_str(), trdShapePassive, medSi);
322 trapezoidPassiveVolume->SetLineColor(kGray);
323
324 // placing passive volume in chip:
325 const double zPassiveInChip = (-dzSensor) * (mZ < 0 ? 1 : -1); // place passive volume at the outer face of the chip, towards the incoming particles
326 TGeoCombiTrans* transPassive = new TGeoCombiTrans();
327 transPassive->SetTranslation(0, 0, zPassiveInChip);
328 trapezoidChipVolume->AddNode(trapezoidPassiveVolume, iTr, transPassive);
329
330 // prepare placing of chip in layer:
331 const double phi_c = (iTr + 0.5) * dphi; // sector center
332 const double phi_deg = phi_c * 180.0 / TMath::Pi();
333
334 // center of tile
335 const double x = rc * TMath::Cos(phi_c);
336 const double y = rc * TMath::Sin(phi_c);
337 const double z = 0.0;
338
339 // local +Y should point radially outward
340 auto rot = new TGeoRotation();
341 rot->RotateZ(phi_deg - 90.0);
342 auto transf = new TGeoCombiTrans(x, y, z, rot);
343
344 layerVol->AddNode(trapezoidChipVolume, iTr, transf);
345 }
346
347 LOG(info) << "Inserting " << NtrapezoidalSegments << " trapezoidal segments (Rmin="
348 << mInnerRadius << ", Rmax=" << mOuterRadius << ", z = " << mZ << "cm) inside " << layerVol->GetName();
349
350 auto* diskRotation = new TGeoRotation("TrapezoidalDiskRotation", 0, 0, 0);
351 auto* diskCombiTrans = new TGeoCombiTrans(0, 0, mZ, diskRotation);
352 motherVolume->AddNode(layerVol, 1, diskCombiTrans);
353 } else if (ft3Params.layoutFT3 == kCylindrical) {
354 // cylindrical ML+OT disks
355
356 std::string chipName = o2::ft3::GeometryTGeo::getFT3ChipPattern() + std::to_string(mLayerNumber),
357 sensName = Form("%s_%d_%d", GeometryTGeo::getFT3SensorPattern(), mDirection, mLayerNumber);
358 TGeoTube* sensor = new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
359 TGeoTube* chip = new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
360 TGeoTube* layer = new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
361
362 TGeoMedium* medSi = gGeoManager->GetMedium("FT3_SILICON$");
363 TGeoMedium* medAir = gGeoManager->GetMedium("FT3_AIR$");
364
365 TGeoVolume* sensVol = new TGeoVolume(sensName.c_str(), sensor, medSi);
366 sensVol->SetLineColor(kYellow);
367 TGeoVolume* chipVol = new TGeoVolume(chipName.c_str(), chip, medSi);
368 chipVol->SetLineColor(kYellow);
369 TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
370 layerVol->SetLineColor(kYellow);
371
372 LOG(info) << "Inserting " << sensVol->GetName() << " inside " << chipVol->GetName();
373 chipVol->AddNode(sensVol, 1, nullptr);
374
375 LOG(info) << "Inserting " << chipVol->GetName() << " inside " << layerVol->GetName();
376 layerVol->AddNode(chipVol, 1, nullptr);
377
378 // Finally put everything in the mother volume
379 auto* FwdDiskRotation = new TGeoRotation("FwdDiskRotation", 0, 0, 180);
380 auto* FwdDiskCombiTrans = new TGeoCombiTrans(0, 0, mZ, FwdDiskRotation);
381
382 LOG(info) << "Inserting " << layerVol->GetName() << " inside " << motherVolume->GetName();
383 motherVolume->AddNode(layerVol, 1, FwdDiskCombiTrans);
384 } else if (ft3Params.layoutFT3 == kSegmented) {
385 FT3Module module;
386
387 // layer structure
388 std::string frontLayerName = o2::ft3::GeometryTGeo::getFT3LayerPattern() + std::to_string(mDirection) + std::to_string(mLayerNumber) + "_Front";
389 std::string backLayerName = o2::ft3::GeometryTGeo::getFT3LayerPattern() + std::to_string(mDirection) + std::to_string(mLayerNumber) + "_Back";
390 std::string separationLayerName = "FT3SeparationLayer" + std::to_string(mDirection) + std::to_string(mLayerNumber);
391
392 TGeoMedium* medAir = gGeoManager->GetMedium("FT3_AIR$");
393 TGeoTube* layer = new TGeoTube(mInnerRadius, mOuterRadius, 12 * mChipThickness / 2); // additional "thickness factor" is to avoid sub-volumes crossing the mother layer
394 TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
395 layerVol->SetLineColor(kYellow + 2);
396
397 // createSeparationLayer_waterCooling(motherVolume, separationLayerName);
398 createSeparationLayer(layerVol, separationLayerName);
399
400 // create disk faces
401 module.createModule(0, mLayerNumber, mDirection, mInnerRadius, mOuterRadius, 0., "front", "rectangular", layerVol);
402 module.createModule(0, mLayerNumber, mDirection, mInnerRadius, mOuterRadius, 0., "back", "rectangular", layerVol);
403
404 // Finally put everything in the mother volume
405 auto* FwdDiskRotation = new TGeoRotation("FwdDiskRotation", 0, 0, 180);
406 auto* FwdDiskCombiTrans = new TGeoCombiTrans(0, 0, mZ, FwdDiskRotation);
407
408 LOG(info) << "Inserting " << layerVol->GetName() << " inside " << motherVolume->GetName();
409 motherVolume->AddNode(layerVol, 1, FwdDiskCombiTrans);
410 } else {
411 LOG(fatal) << "Unknown FT3 layout option: " << static_cast<int>(ft3Params.layoutFT3);
412 }
413}
ClassImp(FT3Layer)
Definition of the FT3Layer class.
float & yMax
Definition of the GeometryTGeo class.
Class for time synchronization of RawReader instances.
static TGeoMaterial * waterMat
Definition FT3Layer.h:74
virtual void createLayer(TGeoVolume *motherVolume)
Definition FT3Layer.cxx:229
static TGeoMedium * medFoam
Definition FT3Layer.h:78
static TGeoMedium * medCarbonFiber
Definition FT3Layer.h:69
void createSeparationLayer_waterCooling(TGeoVolume *motherVolume, const std::string &separationLayerName)
Definition FT3Layer.cxx:112
static void initialize_mat()
Definition FT3Layer.cxx:81
static TGeoMedium * waterMed
Definition FT3Layer.h:75
~FT3Layer() override
Default destructor.
FT3Layer()=default
static TGeoMaterial * carbonFiberMat
Definition FT3Layer.h:68
static TGeoMedium * kaptonMed
Definition FT3Layer.h:72
static TGeoMaterial * kaptonMat
Definition FT3Layer.h:71
void createSeparationLayer(TGeoVolume *motherVolume, const std::string &separationLayerName)
Definition FT3Layer.cxx:201
static TGeoMaterial * foamMat
Definition FT3Layer.h:77
static const char * getFT3PassivePattern()
static const char * getFT3SensorPattern()
static const char * getFT3ChipPattern()
static const char * getFT3LayerPattern()
GLint GLenum GLint x
Definition glcorearb.h:403
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"