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