20#include <TGeoCompositeShape.h>
22#include <TGeoVolume.h>
36 : mLayerNumber(layerNumber), mLayerName(layerName), mInnerRadius(rInn), mLength(
length)
53 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
56 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
57 sensVol->SetLineColor(kYellow);
64 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
67 TGeoVolume* metalVol =
new TGeoVolume(metalName.c_str(), metalStack, medSi);
68 metalVol->SetLineColor(kGray);
75 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
77 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
78 layerVol->SetLineColor(kYellow);
81 LOGP(
debug,
"Inserting {} in {} ", sensVol->GetName(), layerVol->GetName());
82 layerVol->AddNode(sensVol, 1,
nullptr);
85 LOGP(
debug,
"Inserting {} in {} ", metalVol->GetName(), layerVol->GetName());
86 layerVol->AddNode(metalVol, 1,
nullptr);
88 LOGP(
debug,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
89 motherVolume->AddNode(layerVol, 1,
nullptr);
95 :
TRKCylindricalLayer(layerNumber, layerName, rInn, numberOfModules * sModuleLength, thickOrX2X0,
mode), mTiltAngle(tiltAngle), mNumberOfStaves(numberOfStaves), mNumberOfModules(numberOfModules)
97 assert(numberOfStaves % 2 == 0 &&
"Error: numberOfStaves must be even!");
102 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
105 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
106 sensVol->SetLineColor(kYellow);
113 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
116 TGeoVolume* deadVol =
new TGeoVolume(deadName.c_str(), deadzone, medSi);
117 deadVol->SetLineColor(kGray);
124 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
127 TGeoVolume* metalVol =
new TGeoVolume(metalName.c_str(), metalStack, medSi);
128 metalVol->SetLineColor(kGray);
135 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
138 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
139 chipVol->SetLineColor(kYellow);
144 TGeoCombiTrans* transSens =
new TGeoCombiTrans();
145 TGeoCombiTrans* transDead =
new TGeoCombiTrans();
146 TGeoCombiTrans* transMetal =
new TGeoCombiTrans();
152 transMetal->SetTranslation(0, metalY, 0);
154 chipVol->AddNode(sensVol, 1, transSens);
155 chipVol->AddNode(deadVol, 1, transDead);
156 chipVol->AddNode(metalVol, 1, transMetal);
163 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
165 TGeoShape*
module = new TGeoBBox(sModuleWidth / 2, mChipThickness / 2, sModuleLength / 2);
166 TGeoVolume* moduleVol =
new TGeoVolume(moduleName.c_str(), module, medSi);
167 moduleVol->SetLineColor(kYellow);
173 TGeoCombiTrans* transLeft =
new TGeoCombiTrans();
174 transLeft->SetTranslation(xLeft, 0, zLeft);
175 TGeoRotation* rot =
new TGeoRotation();
177 transLeft->SetRotation(rot);
178 LOGP(
debug,
"Inserting {} in {} ", chipVolLeft->GetName(), moduleVol->GetName());
179 moduleVol->AddNode(chipVolLeft, iChip * 2, transLeft);
184 TGeoCombiTrans* transRight =
new TGeoCombiTrans();
185 transRight->SetTranslation(xRight, 0, zRight);
186 LOGP(
debug,
"Inserting {} in {} ", chipVolRight->GetName(), moduleVol->GetName());
187 moduleVol->AddNode(chipVolRight, iChip * 2 + 1, transRight);
196 const float staveSizeX = staveWidth;
207 double u_max = avgRadius * std::sin(
alpha) + staveSizeX / 2.0;
208 double v_max = avgRadius * std::cos(
alpha) + staveSizeY / 2.0;
209 double radiusMax = std::sqrt(u_max * u_max + v_max * v_max);
212 double perpDistance = avgRadius * std::cos(
alpha) - staveSizeY / 2.0;
215 double projDistance = avgRadius * std::sin(
alpha);
218 if (projDistance <= staveSizeX / 2.0) {
221 radiusMin = perpDistance;
224 double u_min = projDistance - staveSizeX / 2.0;
225 radiusMin = std::sqrt(u_min * u_min + perpDistance * perpDistance);
229 const float precisionMargin = 0.05f;
231 return {radiusMin - precisionMargin, radiusMax + precisionMargin};
237 :
TRKSegmentedLayer(layerNumber, layerName, rInn, tiltAngle, numberOfStaves, numberOfModules, thickOrX2X0,
mode), mStaggerOffset(staggerOffset)
243 mStaggerOffset = -staggerOffset;
244 LOGP(info,
"Layer {} is flipped: sensor and metal stack positions are switched",
mLayerNumber);
250 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
253 TGeoVolume* staveVol =
new TGeoVolume(staveName.c_str(), stave, medAir);
254 staveVol->SetLineColor(kYellow);
259 TGeoCombiTrans* trans =
new TGeoCombiTrans();
260 trans->SetTranslation(0, 0, zPos);
261 LOGP(
debug,
"Inserting {} in {} ", moduleVol->GetName(), staveVol->GetName());
262 staveVol->AddNode(moduleVol, iModule, trans);
271 auto [rMin, rMax] = getBoundingRadii(sStaveWidth);
273 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
275 TGeoTube*
layer =
new TGeoTube(rMin, rMax,
mLength / 2);
276 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
277 layerVol->SetLineColor(kYellow);
285 const double avgRadiusOuter = avgRadiusInner + mStaggerOffset;
289 double theta1 = std::atan(sStaveWidth / 2 /
mInnerRadius);
290 double st = std::sin(theta);
291 double ct = std::cos(theta);
294 LOGP(info,
"Creating a layer with {} staves and {} mm overlap",
mNumberOfStaves, overlap * 10);
298 TGeoCombiTrans* trans =
new TGeoCombiTrans();
300 double phi = (
mNumberOfStaves % 4 == 0) ? theta * (iStave + 0.5) : theta * iStave;
301 double phiDeg = phi * TMath::RadToDeg();
302 TGeoRotation* rot =
new TGeoRotation(
"rot", phiDeg + 90 +
mTiltAngle, 0, 0);
303 trans->SetRotation(rot);
305 float trueRadius = (
mLayerNumber == 3 ||
mLayerNumber == 4) ? (iStave % 2 == 0 ? avgRadiusInner : avgRadiusOuter) : avgRadiusInner;
306 trans->SetTranslation(trueRadius * std::cos(phi), trueRadius * std::sin(phi), 0);
307 LOGP(
debug,
"Inserting {} in {} ", staveVol->GetName(), layerVol->GetName());
308 layerVol->AddNode(staveVol, iStave, trans);
311 LOGP(
debug,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
312 motherVolume->AddNode(layerVol, 1,
nullptr);
315std::pair<float, float> TRKMLLayer::getBoundingRadii(
double staveWidth)
const
322 return {defaultRadiusMin, defaultRadiusMax};
337 const float avgRadiusStaggered = avgRadiusInner + mStaggerOffset;
339 const float staveSizeX = staveWidth;
343 const float precisionMargin = 0.05f;
348 float u_max = avgRadiusStaggered * std::sin(
alpha) + staveSizeX / 2.0;
349 float v_max = avgRadiusStaggered * std::cos(
alpha) + staveSizeY / 2.0;
350 float radiusMax = std::sqrt(u_max * u_max + v_max * v_max);
352 return {defaultRadiusMin, radiusMax + precisionMargin};
357 double perpDistance = avgRadiusStaggered * std::cos(
alpha) - staveSizeY / 2.0;
358 double projDistance = avgRadiusStaggered * std::sin(
alpha);
361 if (projDistance <= staveSizeX / 2.0) {
362 newRadiusMin = perpDistance;
364 double u_min = projDistance - staveSizeX / 2.0;
365 newRadiusMin = std::sqrt(u_min * u_min + perpDistance * perpDistance);
368 return {newRadiusMin - precisionMargin, defaultRadiusMax};
375 :
TRKSegmentedLayer(layerNumber, layerName, rInn, tiltAngle, numberOfStaves, numberOfModules, thickOrX2X0,
mode)
381 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
383 float lengthHalfBarrel =
mLength / 2;
385 TGeoVolume* halfStaveVol =
new TGeoVolume(halfStaveName.c_str(), halfStave, medSi);
386 halfStaveVol->SetLineColor(kYellow);
389 for (
int iModule = 0; iModule < nModulesPerHalfBarrel; iModule++) {
391 TGeoCombiTrans* trans =
new TGeoCombiTrans();
392 trans->SetTranslation(0, 0, zPos);
402 TGeoVolume* staveVol =
new TGeoVolumeAssembly(staveName.c_str());
404 TGeoCombiTrans* transLeft =
new TGeoCombiTrans();
405 transLeft->SetTranslation(-(sHalfStaveWidth - sInStaveOverlap) / 2, 0, 0);
408 TGeoCombiTrans* transRight =
new TGeoCombiTrans();
409 transRight->SetTranslation((sHalfStaveWidth - sInStaveOverlap) / 2, 0.2, 0);
417 auto [rMin, rMax] = getBoundingRadii(sStaveWidth);
419 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
421 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
422 layerVol->SetLineColor(kYellow);
424 int nStavesHalfBarrel = (
int)std::ceil(
mInnerRadius * 2 * TMath::Pi() / sStaveWidth);
425 nStavesHalfBarrel += nStavesHalfBarrel % 2;
428 const double theta = 2. * TMath::Pi() / nStavesHalfBarrel;
429 const float lengthHalfBarrel =
mLength / 2;
430 const int nStaves = nStavesHalfBarrel * 2;
431 LOGP(info,
"Creating OT layer {} with two half-barrels of {} staves each",
mLayerNumber, nStavesHalfBarrel);
433 for (
int iStave = 0; iStave < nStaves; iStave++) {
434 int whichHalfBarrel = iStave / nStavesHalfBarrel;
435 double phi = theta * iStave;
436 TGeoRotation* rot =
new TGeoRotation(
"rot");
437 if (whichHalfBarrel == 1) {
440 rot->RotateZ(phi * TMath::RadToDeg() + 90 + (whichHalfBarrel == 0 ? +1 : -1) *
mTiltAngle);
442 TGeoCombiTrans* trans =
new TGeoCombiTrans();
443 trans->SetRotation(rot);
444 trans->SetTranslation(avgRadius * std::cos(phi), avgRadius * std::sin(phi), zPos);
448 motherVolume->AddNode(layerVol, 1,
nullptr);
451std::pair<float, float> TRKOTLayer::getBoundingRadii(
double staveWidth)
const
454 return {radiusMin - 0.201f, radiusMax};
460 :
TRKSegmentedLayer(layerNumber, layerName, rInn, tiltAngle, numberOfStaves, numberOfModules, thickOrX2X0,
mode)
470 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
473 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
474 chipVol->SetLineColor(kYellow);
482TGeoVolume* TRKOTLayerRealistic::createFPC()
484 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_FPC$");
487 vol->SetLineColor(kOrange);
491TGeoVolume* TRKOTLayerRealistic::createColdPlate()
493 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_CARBONFIBER$");
496 vol->SetLineColor(kGray + 2);
500double TRKOTLayerRealistic::getRowHalfLength()
const
506double TRKOTLayerRealistic::getPipeTrim()
const
514TGeoVolume* TRKOTLayerRealistic::createSupportRing(
double rMin,
double rMax,
double phi1,
double phi2,
int id)
517 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_CARBONFIBER$");
521 new TGeoTubeSeg((base +
"_outsh").c_str(), rMin, rMax, dz, phi1, phi2);
522 new TGeoTubeSeg((base +
"_insh").c_str(), rMin + t, rMax - t, dz - t, phi1, phi2);
523 TGeoShape* shape =
new TGeoCompositeShape((base +
"sh").c_str(), (base +
"_outsh-" + base +
"_insh").c_str());
524 TGeoVolume* vol =
new TGeoVolume(base.c_str(), shape, med);
525 vol->SetLineColor(kGray + 2);
529TGeoVolume* TRKOTLayerRealistic::createCoolingPipe()
531 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_CARBONFIBER$");
533 getRowHalfLength() - getPipeTrim() / 2);
535 vol->SetLineColor(kBlue + 2);
539TGeoVolume* TRKOTLayerRealistic::createEndOfStaveCard()
541 TGeoMedium* medFR4 = gGeoManager->GetMedium(
"TRK_FR4$");
542 TGeoMedium* medCu = gGeoManager->GetMedium(
"TRK_COPPER$");
546 TGeoVolume* cardVol =
new TGeoVolume(
name.c_str(), board, medFR4);
547 cardVol->SetLineColor(kGreen + 3);
554 LOGP(fatal,
"TRKBase.otEosCardCuThickness = {} cm x {} planes does not fit in the {} cm end-of-stave card",
558 TGeoVolume* planeVol =
new TGeoVolume((
name +
"_Cu").c_str(), plane, medCu);
559 planeVol->SetLineColor(kOrange + 7);
563 for (
int iPlane = 0; iPlane < nPlanes; iPlane++) {
564 const double y = (nPlanes > 1) ? -span / 2 + iPlane * span / (nPlanes - 1) : 0.;
565 cardVol->AddNode(planeVol, iPlane,
new TGeoTranslation(0,
y, 0));
571void TRKOTLayerRealistic::addConnector(TGeoVolume* moduleVol,
double rMid)
573 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_LCPCU$");
576 TGeoVolume* vol =
new TGeoVolume(
name.c_str(), shape, med);
577 vol->SetLineColor(kBlue);
581 moduleVol->AddNode(vol, 0,
new TGeoTranslation(0, rMid,
z));
584void TRKOTLayerRealistic::addCapacitors(TGeoVolume* moduleVol,
double rMid)
586 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_BATIO3$");
589 TGeoVolume* vol =
new TGeoVolume(
name.c_str(), shape, med);
590 vol->SetLineColor(kCyan);
596 const double dX[5] = {-0.80, +0.80, -0.80, +0.80, 0.0};
597 const double dZ[5] = {-0.95, -0.95, +0.95, +0.95, 0.0};
605 for (
int iZ = 0; iZ < 4; iZ++) {
606 for (
int iX = 0; iX < 2; iX++) {
608 const double x = chipX[iX] + dX[iCap];
609 const double z = chipZ[iZ] + dZ[iCap];
610 if (std::abs(
x) < skipX && std::abs(
z - connZ) < skipZ) {
613 moduleVol->AddNode(vol, capCopy++,
new TGeoTranslation(
x, rMid,
z));
619void TRKOTLayerRealistic::addBrackets(TGeoVolume* moduleVol,
double rMid)
621 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_PEEK$");
624 TGeoVolume* vol =
new TGeoVolume(
name.c_str(), shape, med);
625 vol->SetLineColor(kGreen + 2);
628 moduleVol->AddNode(vol, 0,
new TGeoTranslation(0, rMid, -
z));
629 moduleVol->AddNode(vol, 1,
new TGeoTranslation(0, rMid, +
z));
635 TGeoVolume* moduleVol =
new TGeoVolumeAssembly(modName.c_str());
648 const double chipX[2] = {-0.5 * pitchX, +0.5 * pitchX};
649 const double chipZ[4] = {-1.5 * pitchZ, -0.5 * pitchZ, +0.5 * pitchZ, +1.5 * pitchZ};
651 moduleVol->AddNode(createColdPlate(), 0,
new TGeoTranslation(0, coldPlateMidY, 0));
654 for (
int iZ = 0; iZ < 4; iZ++) {
655 for (
int iX = 0; iX < 2; iX++) {
656 TGeoCombiTrans* trans =
new TGeoCombiTrans();
657 trans->SetTranslation(chipX[iX], 0., chipZ[iZ]);
659 TGeoRotation* rot =
new TGeoRotation();
661 trans->SetRotation(rot);
663 moduleVol->AddNode(
createChip(), chipCopy++, trans);
667 moduleVol->AddNode(createFPC(), 0,
new TGeoTranslation(0, fpcMidY, 0));
668 addConnector(moduleVol, connMidY);
669 addCapacitors(moduleVol, capMidY);
670 addBrackets(moduleVol, bracketMidY);
677 TGeoVolume* rowVol =
new TGeoVolumeAssembly(rowName.c_str());
682 const double rowHalfLen = getRowHalfLength();
684 for (
int iModule = 0; iModule < nModulesPerRow; iModule++) {
685 double zPos = -rowHalfLen + moduleLength / 2 + iModule * step;
686 TGeoCombiTrans* trans =
new TGeoCombiTrans();
687 trans->SetTranslation(0, 0, zPos);
697 TGeoVolume* staveVol =
new TGeoVolumeAssembly(staveName.c_str());
706 TGeoCombiTrans* tRow0 =
new TGeoCombiTrans();
707 tRow0->SetTranslation(-rowOffset / 2, 0, 0);
709 TGeoCombiTrans* tRow1 =
new TGeoCombiTrans();
714 TGeoCombiTrans* tPipe =
new TGeoCombiTrans();
716 staveVol->AddNode(createCoolingPipe(), 0, tPipe);
719 TGeoCombiTrans* tCard =
new TGeoCombiTrans();
722 staveVol->AddNode(createEndOfStaveCard(), 0, tCard);
733 const double lengthHalfBarrel = 2 * getRowHalfLength();
742 const bool hasWalls = wallThickness > 0.;
747 LOGP(fatal,
"TRKBase.otBarrelWallThickness = {} cm leaves no room for the staves in the {} cm gap between the eta half-barrels",
751 auto [rMin, rMax] = getBoundingRadii(staveWidth);
752 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
753 TGeoShape*
layer =
nullptr;
755 const std::string tubeName =
mLayerName +
"_envelopesh";
756 const std::string slotName =
mLayerName +
"_wallslotsh";
757 const std::string zSlotName =
mLayerName +
"_midslotsh";
758 new TGeoTube(tubeName.c_str(), rMin, rMax, halfLength);
759 new TGeoBBox(slotName.c_str(), slotHalfWidth, rMax + 1., halfLength + 1.);
760 new TGeoBBox(zSlotName.c_str(), rMax + 1., rMax + 1., zSlotHalfWidth);
761 layer =
new TGeoCompositeShape((
mLayerName +
"sh").c_str(), (tubeName +
"-" + slotName +
"-" + zSlotName).c_str());
763 layer =
new TGeoTube(rMin, rMax, halfLength);
765 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
766 layerVol->SetLineColor(kYellow);
777 const double activeStaveWidth = staveWidth - 2 * edgeDead;
778 int nStavesHalfBarrel = (
int)std::ceil(2. + (avgRadius * 2 * TMath::Pi() - 2 * (activeStaveWidth + accGap)) /
780 nStavesHalfBarrel += nStavesHalfBarrel % 2;
782 const int nHalf = nStavesHalfBarrel / 2;
783 const double thetaGap = (activeStaveWidth + accGap) / avgRadius;
784 const double thetaInt = (2. * TMath::Pi() - 2. * thetaGap) / (nStavesHalfBarrel - 2);
785 const double overlap = activeStaveWidth - avgRadius * thetaInt;
786 LOGP(info,
"Creating realistic OT layer {}: {} staves/half-barrel, internal overlap {} mm, boundary gap {} mm, flipped={}",
789 const int nStaves = nStavesHalfBarrel * 2;
791 for (
int iStave = 0; iStave < nStaves; iStave++) {
792 int whichHalfBarrel = iStave / nStavesHalfBarrel;
793 int sInHB = iStave % nStavesHalfBarrel;
794 int azHalf = sInHB / nHalf;
795 int sInAz = sInHB % nHalf;
799 const double phiCut = TMath::Pi() / 2;
800 double phi = phiCut + azHalf * TMath::Pi() + thetaGap / 2 + sInAz * thetaInt;
802 TGeoRotation* rot =
new TGeoRotation(
"rot");
804 if (whichHalfBarrel == 1) {
810 rot->RotateZ(phi * TMath::RadToDeg() + 90 + (whichHalfBarrel == 0 ? +1 : -1) *
mTiltAngle);
813 TGeoCombiTrans* trans =
new TGeoCombiTrans();
814 trans->SetRotation(rot);
815 trans->SetTranslation(avgRadius * std::cos(phi), avgRadius * std::sin(phi), zPos);
825 const double ringDPhi = TMath::RadToDeg() *
832 for (
int azHalf = 0; azHalf < 2; ++azHalf) {
833 TGeoVolume* ringVol = createSupportRing(ringRMin, ringRMax,
834 90. + 180. * azHalf + ringDPhi,
835 270. + 180. * azHalf - ringDPhi, azHalf);
837 for (
int whichHalfBarrel = 0; whichHalfBarrel < 2; ++whichHalfBarrel) {
838 const double zSign = (whichHalfBarrel == 0) ? -1. : 1.;
839 for (
double zAbs : {zRingMid, zRingEos}) {
840 layerVol->AddNode(ringVol, iRing++,
new TGeoTranslation(0., 0., zSign * zAbs));
845 motherVolume->AddNode(layerVol, 1,
nullptr);
848std::pair<float, float> TRKOTLayerRealistic::getBoundingRadii(
double staveWidth)
const
854 const float outerReach = std::max(pipeOuterReach, ringReach);
855 const float margin = 0.1f;
857 return {radiusMin - connectorReach - margin, radiusMax + outerReach + margin};
859 return {radiusMin - outerReach - margin, radiusMax + connectorReach + margin};
static const TRKBaseParam & Instance()
static const char * getTRKStavePattern()
static const char * getTRKChipPattern()
static const char * getTRKSensorPattern()
static const char * getTRKDeadzonePattern()
static const char * getTRKLayerPattern()
static const char * getTRKHalfStavePattern()
static const char * getTRKMetalStackPattern()
static const char * getTRKModulePattern()
TRKCylindricalLayer()=default
static constexpr float Si_X0
virtual void createLayer(TGeoVolume *motherVolume)
virtual TGeoVolume * createSensor()
virtual TGeoVolume * createMetalStack()
static constexpr double sSensorThickness
void createLayer(TGeoVolume *motherVolume) override
TGeoVolume * createStave() override
TGeoVolume * createModule() override
TRKOTLayerRealistic()=default
TGeoVolume * createChip() override
void createLayer(TGeoVolume *motherVolume) override
TGeoVolume * createHalfStave()
TGeoVolume * createStave() override
TGeoVolume * createHalfStave()
void createLayer(TGeoVolume *motherVolume) override
static constexpr float sGapBetweenOuterTrackerBarrelHalves
TGeoVolume * createStave() override
static constexpr double sChipWidth
TGeoVolume * createMetalStack() override
static constexpr int sHalfNumberOfChips
TGeoVolume * createSensor() override
TRKSegmentedLayer()=default
virtual TGeoVolume * createModule()
static constexpr double sChipLength
virtual TGeoVolume * createChip()
static constexpr double sDeadzoneWidth
static constexpr double sModuleLength
static constexpr double sModuleWidth
TGeoVolume * createDeadzone()
virtual std::pair< float, float > getBoundingRadii(double staveWidth) const
GLfloat GLfloat GLfloat alpha
GLuint const GLchar * name
GLuint GLsizei GLsizei * length
GLenum GLuint GLint GLint layer
GLdouble GLdouble GLdouble z
constexpr double thickness
constexpr double thickness
constexpr double thickness
constexpr double thickness
constexpr double rLocalOffset
constexpr int nCopperLayers
constexpr double thickness
constexpr double thickness
constexpr double radialHeight
constexpr double wallThickness
constexpr double zClearance
constexpr double sensorThickness
constexpr double halfBarrelChipGap
constexpr double bracketZDepth
constexpr double interModuleGap
constexpr double rowActiveOverlap
constexpr double connectorZDepth
constexpr double interChipGap
constexpr double rowRadialStagger
constexpr double barrelWallClearance
constexpr double barrelWallSlotMargin
constexpr double barrelHalvesZGap
constexpr double outerEdgeLongSide
constexpr double outerEdgeShortSide
constexpr double interChips
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string to_string(gsl::span< T, Size > span)