Project
Loading...
Searching...
No Matches
VDLayer.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
14#include "TRKBase/Specs.h"
15
16#include "Framework/Logger.h"
17
18#include "TGeoTube.h"
19#include "TGeoBBox.h"
20#include "TGeoVolume.h"
21#include "TGeoMatrix.h"
22#include "TGeoManager.h"
23
24#include "TMath.h"
25
26namespace o2
27{
28namespace trk
29{
30
31// Helper function for floating point comparison
32inline bool isFullCircle(double phiSpanDeg, double epsilon = 0.005)
33{
34 return (std::fabs(phiSpanDeg - 360.0) < epsilon);
35}
36
37// Base layer constructor
38VDLayer::VDLayer(int layerNumber, const std::string& layerName, double layerX2X0)
39 : mLayerNumber(layerNumber), mLayerName(layerName), mX2X0(layerX2X0), mModuleWidth(4.54)
40{
41 constexpr double kSiX0_cm = 9.5; // Radiation length of Silicon in cm
42 mChipThickness = mX2X0 * kSiX0_cm;
43
45}
46
47// VDCylindricalLayer constructor
48VDCylindricalLayer::VDCylindricalLayer(int layerNumber, const std::string& layerName, double layerX2X0, double radius,
49 double phiSpanDeg, double lengthZ, double lengthSensZ)
50 : VDLayer(layerNumber, layerName, layerX2X0), mRadius(radius), mPhiSpanDeg(phiSpanDeg), mLengthZ(lengthZ), mLengthSensZ(lengthSensZ)
51{
52 LOGP(info, "Creating VD cylindrical layer: id: {} name: {} x2X0: {} radius: {} phiSpanDeg: {} lengthZ: {} lengthSensZ: {} chipThickness = {} cm",
53 mLayerNumber, layerName, mX2X0, radius, phiSpanDeg, lengthZ, lengthSensZ, mChipThickness);
54}
55
56// VDRectangularLayer constructor
57VDRectangularLayer::VDRectangularLayer(int layerNumber, const std::string& layerName, double layerX2X0,
58 double width, double lengthZ, double lengthSensZ)
59 : VDLayer(layerNumber, layerName, layerX2X0), mWidth(width), mLengthZ(lengthZ), mLengthSensZ(lengthSensZ)
60{
61
62 if (mLengthSensZ <= 0 || mLengthSensZ > mLengthZ) {
63 LOGP(fatal, "Invalid sensor length: sensZ={} layerZ={}", mLengthSensZ, mLengthZ);
64 }
65 LOGP(info, "Creating VD rectangular layer: id: {} name: {} x2X0: {} width: {} lengthZ: {} lengthSensZ: {} chipThickness = {} cm",
66 mLayerNumber, layerName, mX2X0, width, lengthZ, lengthSensZ, mChipThickness);
67}
68
69// VDDiskLayer constructor
70VDDiskLayer::VDDiskLayer(int layerNumber, const std::string& layerName, double layerX2X0, double rMin, double rMax,
71 double phiSpanDeg, double zPos)
72 : VDLayer(layerNumber, layerName, layerX2X0), mRMin(rMin), mRMax(rMax), mPhiSpanDeg(phiSpanDeg), mZPos(zPos)
73{
74
75 LOGP(info, "Creating VD disk layer: id: {} name: {} x2X0: {} rMin: {} rMax: {} phiSpanDeg: {} zPos: {} chipThickness = {} cm",
76 mLayerNumber, layerName, mX2X0, rMin, rMax, phiSpanDeg, zPos, mChipThickness);
77}
78
79/*
80** Create sensor
81*/
82
84{
85 if (!gGeoManager) {
86 LOGP(error, "gGeoManager is null");
87 return nullptr;
88 }
89 auto* medSi = gGeoManager->GetMedium("TRK_SILICON$");
90 if (!medSi) {
91 LOGP(error, "Missing medium TRK_SILICON$");
92 return nullptr;
93 }
94 std::string sensName = Form("%s_%s%d", this->mLayerName.c_str(), GeometryTGeo::getTRKSensorPattern(), this->mLayerNumber);
95 const double rIn = mRadius;
96 const double rOut = mRadius + mSensorThickness;
97 const double halfZ = 0.5 * mLengthSensZ;
98 TGeoShape* shape;
99 if (isFullCircle(mPhiSpanDeg)) {
100 shape = new TGeoTube(rIn, rOut, halfZ);
101 } else {
102 const double halfPhi = 0.5 * mPhiSpanDeg; // degrees
103 shape = new TGeoTubeSeg(rIn, rOut, halfZ, -halfPhi, +halfPhi);
104 }
105 auto* vol = new TGeoVolume(sensName.c_str(), shape, medSi);
106 vol->SetLineColor(kYellow);
107 vol->SetTransparency(30);
108 return vol;
109}
110
112{
113 if (!gGeoManager) {
114 LOGP(error, "gGeoManager is null");
115 return nullptr;
116 }
117 auto* medSi = gGeoManager->GetMedium("TRK_SILICON$");
118 if (!medSi) {
119 LOGP(error, "Missing medium TRK_SILICON$");
120 return nullptr;
121 }
122 std::string sensName = Form("%s_%s%d", this->mLayerName.c_str(), GeometryTGeo::getTRKSensorPattern(), this->mLayerNumber);
123 const double hx = 0.5 * mWidth;
124 const double hy = 0.5 * mSensorThickness;
125 const double hz = 0.5 * mLengthSensZ; // <-- use sensor Z length, not full layer
126
127 auto* shape = new TGeoBBox(hx, hy, hz);
128 auto* vol = new TGeoVolume(sensName.c_str(), shape, medSi);
129 vol->SetLineColor(kYellow);
130 vol->SetTransparency(30);
131
132 return vol;
133}
134
135TGeoVolume* VDDiskLayer::createSensor() const
136{
137 if (!gGeoManager) {
138 LOGP(error, "gGeoManager is null");
139 return nullptr;
140 }
141 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
142 if (!medSi) {
143 LOGP(error, "Missing medium TRK_SILICON$");
144 return nullptr;
145 }
146 if (mRMin < 0 || mRMax <= mRMin || mChipThickness <= 0 || mPhiSpanDeg <= 0 || mPhiSpanDeg > 360.0) {
147 LOGP(error, "Invalid disk sensor dims: rMin={}, rMax={}, t={}, phiSpanDeg={}",
148 mRMin, mRMax, mChipThickness, mPhiSpanDeg);
149 return nullptr;
150 }
151 std::string sensName = Form("%s_%s%d", this->mLayerName.c_str(), GeometryTGeo::getTRKSensorPattern(), this->mLayerNumber);
152 const double halfThickness = 0.5 * mSensorThickness; // active sensor thickness along Z
153
154 // Same geometry as the layer (identical radii + phi span + thickness)
155 TGeoShape* shape;
156 if (isFullCircle(mPhiSpanDeg)) {
157 shape = new TGeoTube(mRMin, mRMax, halfThickness);
158 } else {
159 const double halfPhi = 0.5 * mPhiSpanDeg; // degrees
160 shape = new TGeoTubeSeg(mRMin, mRMax, halfThickness, -halfPhi, +halfPhi);
161 }
162
163 auto* sensVol = new TGeoVolume(sensName.c_str(), shape, medSi);
164 sensVol->SetLineColor(kYellow);
165 sensVol->SetTransparency(30);
166
167 return sensVol;
168}
169
170/*
171** Create metal stack
172*/
173
175{
176 if (!gGeoManager) {
177 LOGP(error, "gGeoManager is null");
178 return nullptr;
179 }
180 auto* medSi = gGeoManager->GetMedium("TRK_SILICON$");
181 if (!medSi) {
182 LOGP(error, "Missing medium TRK_SILICON$");
183 return nullptr;
184 }
185
186 const double metalT = mChipThickness - mSensorThickness;
187 if (metalT <= 0) {
188 return nullptr; // nothing to add
189 }
190
191 std::string name = Form("%s_%s%d", mLayerName.c_str(),
193
194 const double rIn = mRadius + mSensorThickness;
195 const double rOut = mRadius + mChipThickness;
196 const double halfZ = 0.5 * mLengthSensZ;
197
198 TGeoShape* shape;
199 if (isFullCircle(mPhiSpanDeg)) {
200 shape = new TGeoTube(rIn, rOut, halfZ);
201 } else {
202 const double halfPhi = 0.5 * mPhiSpanDeg;
203 shape = new TGeoTubeSeg(rIn, rOut, halfZ, -halfPhi, +halfPhi);
204 }
205 auto* vol = new TGeoVolume(name.c_str(), shape, medSi);
206 vol->SetLineColor(kGray);
207 vol->SetTransparency(30);
208 return vol;
209}
210
212{
213 if (!gGeoManager) {
214 LOGP(error, "gGeoManager is null");
215 return nullptr;
216 }
217 auto* medSi = gGeoManager->GetMedium("TRK_SILICON$");
218 if (!medSi) {
219 LOGP(error, "Missing medium TRK_SILICON$");
220 return nullptr;
221 }
222
223 const double metalT = mChipThickness - mSensorThickness;
224 if (metalT <= 0) {
225 return nullptr;
226 }
227
228 std::string name = Form("%s_%s%d", mLayerName.c_str(),
230
231 const double hx = 0.5 * mWidth;
232 const double hy = 0.5 * metalT;
233 const double hz = 0.5 * mLengthSensZ;
234
235 auto* shape = new TGeoBBox(hx, hy, hz);
236 auto* vol = new TGeoVolume(name.c_str(), shape, medSi);
237 vol->SetLineColor(kGray);
238 vol->SetTransparency(30);
239 return vol;
240}
241
243{
244 if (!gGeoManager) {
245 LOGP(error, "gGeoManager is null");
246 return nullptr;
247 }
248 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
249 if (!medSi) {
250 LOGP(error, "Missing medium TRK_SILICON$");
251 return nullptr;
252 }
253
254 const double metalT = mChipThickness - mSensorThickness;
255 if (metalT <= 0) {
256 return nullptr;
257 }
258
259 if (mRMin < 0 || mRMax <= mRMin || mPhiSpanDeg <= 0 || mPhiSpanDeg > 360.0) {
260 LOGP(error, "Invalid disk metal dims: rMin={}, rMax={}, metalT={}, phiSpanDeg={}",
261 mRMin, mRMax, metalT, mPhiSpanDeg);
262 return nullptr;
263 }
264
265 std::string name = Form("%s_%s%d", mLayerName.c_str(),
267
268 const double halfThickness = 0.5 * metalT;
269
270 TGeoShape* shape;
271 if (isFullCircle(mPhiSpanDeg)) {
272 shape = new TGeoTube(mRMin, mRMax, halfThickness);
273 } else {
274 const double halfPhi = 0.5 * mPhiSpanDeg;
275 shape = new TGeoTubeSeg(mRMin, mRMax, halfThickness, -halfPhi, +halfPhi);
276 }
277 auto* vol = new TGeoVolume(name.c_str(), shape, medSi);
278 vol->SetLineColor(kGray);
279 vol->SetTransparency(30);
280 return vol;
281}
282
283/*
284** Create chip
285*/
286
288{
289 if (!gGeoManager) {
290 LOGP(error, "gGeoManager is null");
291 return nullptr;
292 }
293 auto* medSi = gGeoManager->GetMedium("TRK_SILICON$");
294 if (!medSi) {
295 LOGP(error, "Missing medium TRK_SILICON$");
296 return nullptr;
297 }
298
299 std::string chipName = Form("%s_%s%d", mLayerName.c_str(),
301
302 const double rIn = mRadius;
303 const double rOut = mRadius + mChipThickness;
304 const double halfZ = 0.5 * mLengthSensZ;
305
306 TGeoShape* chipShape;
307 if (isFullCircle(mPhiSpanDeg)) {
308 chipShape = new TGeoTube(rIn, rOut, halfZ);
309 } else {
310 const double halfPhi = 0.5 * mPhiSpanDeg;
311 chipShape = new TGeoTubeSeg(rIn, rOut, halfZ, -halfPhi, +halfPhi);
312 }
313 auto* chipVol = new TGeoVolume(chipName.c_str(), chipShape, medSi);
314
315 // sensor
316 if (auto* sensVol = createSensor()) {
317 LOGP(debug, "Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
318 chipVol->AddNode(sensVol, 1, nullptr);
319 }
320
321 // metal stack
322 if (auto* metalVol = createMetalStack()) {
323 LOGP(debug, "Inserting {} in {} ", metalVol->GetName(), chipVol->GetName());
324 chipVol->AddNode(metalVol, 1, nullptr); // concentric, no translation needed
325 }
326
327 chipVol->SetLineColor(kYellow);
328 chipVol->SetTransparency(30);
329 return chipVol;
330}
331
333{
334 if (!gGeoManager) {
335 LOGP(error, "gGeoManager is null");
336 return nullptr;
337 }
338 auto* medSi = gGeoManager->GetMedium("TRK_SILICON$");
339 if (!medSi) {
340 LOGP(error, "Missing medium TRK_SILICON$");
341 return nullptr;
342 }
343
344 std::string chipName = Form("%s_%s%d", mLayerName.c_str(),
346
347 const double hx = 0.5 * mWidth;
348 const double hy = 0.5 * mChipThickness;
349 const double hz = 0.5 * mLengthSensZ;
350
351 auto* chipShape = new TGeoBBox(hx, hy, hz);
352 auto* chipVol = new TGeoVolume(chipName.c_str(), chipShape, medSi);
353
354 // sensor (place it on the "bottom" side, like TRK)
355 if (auto* sensVol = createSensor()) {
356 auto* transSens = new TGeoTranslation(0.0, -(mChipThickness - mSensorThickness) / 2, 0.0);
357 LOGP(debug, "Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
358 chipVol->AddNode(sensVol, 1, transSens);
359 }
360
361 // metal stack (remaining thickness on top)
362 if (auto* metalVol = createMetalStack()) {
363 auto* transMetal = new TGeoTranslation(0.0, +mSensorThickness / 2, 0.0);
364 LOGP(debug, "Inserting {} in {} ", metalVol->GetName(), chipVol->GetName());
365 chipVol->AddNode(metalVol, 1, transMetal);
366 }
367
368 chipVol->SetLineColor(kYellow);
369 chipVol->SetTransparency(30);
370 return chipVol;
371}
372
373TGeoVolume* VDDiskLayer::createChip() const
374{
375 if (!gGeoManager) {
376 LOGP(error, "gGeoManager is null");
377 return nullptr;
378 }
379 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
380 if (!medSi) {
381 LOGP(error, "Missing medium TRK_SILICON$");
382 return nullptr;
383 }
384
385 if (mRMin < 0 || mRMax <= mRMin || mChipThickness <= 0 ||
386 mPhiSpanDeg <= 0 || mPhiSpanDeg > 360.0) {
387 LOGP(error, "Invalid disk chip dims: rMin={}, rMax={}, t={}, phi={}",
388 mRMin, mRMax, mChipThickness, mPhiSpanDeg);
389 return nullptr;
390 }
391
392 std::string chipName = Form("%s_%s%d", mLayerName.c_str(),
394
395 const double halfThickness = 0.5 * mChipThickness;
396
397 TGeoShape* chipShape;
398 if (isFullCircle(mPhiSpanDeg)) {
399 chipShape = new TGeoTube(mRMin, mRMax, halfThickness);
400 } else {
401 const double halfPhi = 0.5 * mPhiSpanDeg;
402 chipShape = new TGeoTubeSeg(mRMin, mRMax, halfThickness, -halfPhi, +halfPhi);
403 }
404 auto* chipVol = new TGeoVolume(chipName.c_str(), chipShape, medSi);
405 chipVol->SetLineColor(kYellow);
406 chipVol->SetTransparency(30);
407
408 // Sensor slab (sensitive) placed on one side in Z (TRK-like stacking convention)
409 if (auto* sensVol = createSensor()) {
410 const double zSens = -(mChipThickness - mSensorThickness) / 2.0;
411 auto* tSens = new TGeoTranslation(0.0, 0.0, zSens);
412 LOGP(debug, "Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
413 chipVol->AddNode(sensVol, 1, tSens);
414 }
415
416 // Metal stack slab (non-sensitive), remaining thickness, also silicon
417 if (auto* metalVol = createMetalStack()) {
418 const double zMetal = +mSensorThickness / 2.0;
419 auto* tMetal = new TGeoTranslation(0.0, 0.0, zMetal);
420 LOGP(debug, "Inserting {} in {} ", metalVol->GetName(), chipVol->GetName());
421 chipVol->AddNode(metalVol, 1, tMetal);
422 }
423
424 return chipVol;
425}
426
427/*
428** Create layer
429*/
430
431// Cylindrical layer
432void VDCylindricalLayer::createLayer(TGeoVolume* motherVolume, TGeoMatrix* combiTrans) const
433{
434 if (!motherVolume || !gGeoManager) {
435 LOGP(error, "Null motherVolume or gGeoManager");
436 return;
437 }
438 TGeoMedium* medAir = gGeoManager->GetMedium("TRK_AIR$");
439 if (!medAir) {
440 LOGP(error, "Missing TRK_AIR$");
441 return;
442 }
443
444 // Sanity
445 if (mRadius <= 0 || mChipThickness <= 0 || mLengthZ <= 0 ||
446 mPhiSpanDeg <= 0 || mPhiSpanDeg > 360.0 ||
447 mLengthSensZ <= 0 || mLengthSensZ > mLengthZ) {
448 LOGP(error, "Invalid cylindrical dimensions: r={}, t={}, Z={}, phi={}, sensZ={}",
449 mRadius, mChipThickness, mLengthZ, mPhiSpanDeg, mLengthSensZ);
450 return;
451 }
452
453 // AIR container (layer)
454 const double rIn = mRadius;
455 const double rOut = mRadius + mChipThickness;
456 const double halfZ = 0.5 * mLengthZ;
457
458 TGeoShape* layerShape;
459 if (isFullCircle(mPhiSpanDeg)) {
460 layerShape = new TGeoTube(rIn, rOut, halfZ);
461 } else {
462 const double halfPhi = 0.5 * mPhiSpanDeg; // degrees
463 layerShape = new TGeoTubeSeg(rIn, rOut, halfZ, -halfPhi, +halfPhi);
464 }
465 auto* layerVol = new TGeoVolume(mLayerName.c_str(), layerShape, medAir);
466 layerVol->SetLineColor(kYellow);
467 layerVol->SetTransparency(30);
468
469 // Chip volume (must use mLengthSensZ internally)
470 TGeoVolume* chipVol = VDCylindricalLayer::createChip();
471 if (!chipVol) {
472 LOGP(error, "VDCylindricalLayer::createChip() returned null");
473 return;
474 }
475 LOGP(debug, "Inserting {} in {} ", chipVol->GetName(), layerVol->GetName());
476 layerVol->AddNode(chipVol, 1, nullptr);
477
478 // Tiling: edge-to-edge if sensor shorter than layer; else single centered
479 // const auto zCenters = (mLengthSensZ < mLengthZ)
480 // ? centersNoGapZ(mLengthZ, mLengthSensZ)
481 // : std::vector<double>{0.0};
482 //
483 // int copyNo = 1;
484 // for (double zc : zCenters) {
485 // TGeoTranslation tz(0.0, 0.0, zc);
486 // layerVol->AddNode(sensorVol, copyNo++, (zc == 0.0 && zCenters.size() == 1) ? nullptr : &tz);
487 // }
488
489 motherVolume->AddNode(layerVol, 1, combiTrans);
490}
491
492// Rectangular layer
493void VDRectangularLayer::createLayer(TGeoVolume* motherVolume, TGeoMatrix* combiTrans) const
494{
495 if (!motherVolume || !gGeoManager) {
496 LOGP(error, "Null motherVolume or gGeoManager");
497 return;
498 }
499 TGeoMedium* medAir = gGeoManager->GetMedium("TRK_AIR$");
500 if (!medAir) {
501 LOGP(error, "Missing TRK_AIR$");
502 return;
503 }
504
505 if (mWidth <= 0 || mChipThickness <= 0 || mLengthZ <= 0 ||
506 mLengthSensZ <= 0 || mLengthSensZ > mLengthZ) {
507 LOGP(error, "Invalid rectangular dims: W={}, t={}, Z={}, sensZ={}",
508 mWidth, mChipThickness, mLengthZ, mLengthSensZ);
509 return;
510 }
511
512 // AIR container (layer)
513 const double hx = 0.5 * mWidth;
514 const double hy = 0.5 * mChipThickness;
515 const double hz = 0.5 * mLengthZ;
516
517 auto* layerShape = new TGeoBBox(hx, hy, hz);
518 auto* layerVol = new TGeoVolume(mLayerName.c_str(), layerShape, medAir);
519 layerVol->SetLineColor(kYellow);
520 layerVol->SetTransparency(30);
521
522 // Sensor volume (uses mLengthSensZ internally)
523 TGeoVolume* chipVol = VDRectangularLayer::createChip();
524 if (!chipVol) {
525 LOGP(error, "VDRectangularLayer::chipVol() returned null");
526 return;
527 }
528
529 LOGP(debug, "Inserting {} in {} ", chipVol->GetName(), layerVol->GetName());
530 layerVol->AddNode(chipVol, 1, nullptr);
531
532 // Tiling along Z, edge - to - edge if needed
533 // const auto zCenters = (mLengthSensZ < mLengthZ)
534 // ? centersNoGapZ(mLengthZ, mLengthSensZ)
535 // : std::vector<double>{0.0};
536 //
537 // int copyNo = 1;
538 // for (double zc : zCenters) {
539 // TGeoTranslation tz(0.0, 0.0, zc);
540 // layerVol->AddNode(sensorVol, copyNo++, (zc == 0.0 && zCenters.size() == 1) ? nullptr : &tz);
541 // }
542
543 motherVolume->AddNode(layerVol, 1, combiTrans);
544}
545
546// Disk layer
547void VDDiskLayer::createLayer(TGeoVolume* motherVolume, TGeoMatrix* combiTrans) const
548{
549 if (!motherVolume || !gGeoManager) {
550 LOGP(error, "Null motherVolume or gGeoManager");
551 return;
552 }
553 TGeoMedium* medAir = gGeoManager->GetMedium("TRK_AIR$");
554 if (!medAir) {
555 LOGP(error, "Missing TRK_AIR$");
556 return;
557 }
558
559 if (mRMin < 0 || mRMax <= mRMin || mChipThickness <= 0 ||
560 mPhiSpanDeg <= 0 || mPhiSpanDeg > 360.0) {
561 LOGP(error, "Invalid disk dims: rMin={}, rMax={}, t={}, phi={}",
562 mRMin, mRMax, mChipThickness, mPhiSpanDeg);
563 return;
564 }
565
566 // For disks the thickness is along Z and equals mChipThickness
567 const double halfThickness = 0.5 * mChipThickness;
568
569 // AIR container (layer)
570 TGeoShape* layerShape;
571 if (isFullCircle(mPhiSpanDeg)) {
572 layerShape = new TGeoTube(mRMin, mRMax, halfThickness);
573 } else {
574 const double halfPhi = 0.5 * mPhiSpanDeg;
575 layerShape = new TGeoTubeSeg(mRMin, mRMax, halfThickness, -halfPhi, +halfPhi);
576 }
577 auto* layerVol = new TGeoVolume(mLayerName.c_str(), layerShape, medAir);
578 layerVol->SetLineColor(kYellow);
579 layerVol->SetTransparency(30);
580
581 // Sensor (same size & shape as the layer for disks)
582 TGeoVolume* chipVol = VDDiskLayer::createChip();
583 if (!chipVol) {
584 LOGP(error, "VDDiskLayer::createChip() returned null");
585 return;
586 }
587
588 // Insert single sensor (no Z-segmentation for disks)
589 layerVol->AddNode(chipVol, 1, nullptr);
590
591 TGeoTranslation tz(0.0, 0.0, mZPos);
592 motherVolume->AddNode(layerVol, 1, combiTrans ? combiTrans : &tz);
593}
594
595// ClassImp(VDLayer);
596// ClassImp(VDCylindricalLayer);
597// ClassImp(VDRectangularLayer);
598// ClassImp(VDDiskLayer);
599
600} // namespace trk
601} // namespace o2
std::ostringstream debug
specs of the ALICE3 TRK
static const char * getTRKChipPattern()
static const char * getTRKSensorPattern()
static const char * getTRKMetalStackPattern()
VDCylindricalLayer(int layerNumber, const std::string &layerName, double layerX2X0, double radius, double phiSpanDeg, double lengthZ, double lengthSensZ)
Definition VDLayer.cxx:48
void createLayer(TGeoVolume *motherVolume, TGeoMatrix *combiTrans=nullptr) const override
Definition VDLayer.cxx:432
TGeoVolume * createSensor() const
Definition VDLayer.cxx:83
TGeoVolume * createChip() const
Definition VDLayer.cxx:287
TGeoVolume * createMetalStack() const
Definition VDLayer.cxx:174
TGeoVolume * createMetalStack() const
Definition VDLayer.cxx:242
void createLayer(TGeoVolume *motherVolume, TGeoMatrix *combiTrans=nullptr) const override
Definition VDLayer.cxx:547
TGeoVolume * createChip() const
Definition VDLayer.cxx:373
VDDiskLayer(int layerNumber, const std::string &layerName, double layerX2X0, double rMin, double rMax, double phiSpanDeg, double zPos)
Definition VDLayer.cxx:70
TGeoVolume * createSensor() const
Definition VDLayer.cxx:135
std::string mLayerName
Definition VDLayer.h:41
double mSensorThickness
Definition VDLayer.h:44
VDLayer()=default
double mChipThickness
Definition VDLayer.h:43
TGeoVolume * createSensor() const
Definition VDLayer.cxx:111
void createLayer(TGeoVolume *motherVolume, TGeoMatrix *combiTrans=nullptr) const override
Definition VDLayer.cxx:493
TGeoVolume * createMetalStack() const
Definition VDLayer.cxx:211
VDRectangularLayer(int layerNumber, const std::string &layerName, double layerX2X0, double width, double lengthZ, double lengthSensZ)
Definition VDLayer.cxx:57
TGeoVolume * createChip() const
Definition VDLayer.cxx:332
GLuint const GLchar * name
Definition glcorearb.h:781
GLint GLsizei width
Definition glcorearb.h:270
constexpr double thickness
Definition Specs.h:37
bool isFullCircle(double phiSpanDeg, double epsilon=0.005)
Definition VDLayer.cxx:32
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...