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);
252 TGeoVolume* staveVol =
new TGeoVolumeAssembly(staveName.c_str());
253 staveVol->SetLineColor(kYellow);
258 TGeoCombiTrans* trans =
new TGeoCombiTrans();
259 trans->SetTranslation(0, 0, zPos);
260 LOGP(
debug,
"Inserting {} in {} ", moduleVol->GetName(), staveVol->GetName());
261 staveVol->AddNode(moduleVol, iModule, trans);
266 TGeoCombiTrans* tCard =
new TGeoCombiTrans();
268 staveVol->AddNode(createEndOfStaveCard(), 0, tCard);
273TGeoVolume* TRKMLLayer::createEndOfStaveCard()
278 TGeoMedium* medFR4 = gGeoManager->GetMedium(
"TRK_FR4$");
279 TGeoMedium* medCu = gGeoManager->GetMedium(
"TRK_COPPER$");
283 TGeoVolume* cardVol =
new TGeoVolume(
name.c_str(), board, medFR4);
284 cardVol->SetLineColor(kGreen + 3);
289 LOGP(fatal,
"TRKBase.mlEosCardCuThickness = {} cm x {} planes does not fit in the {} cm ML end-of-stave card",
293 TGeoVolume* planeVol =
new TGeoVolume((
name +
"_Cu").c_str(), plane, medCu);
294 planeVol->SetLineColor(kOrange + 7);
298 for (
int iPlane = 0; iPlane < nPlanes; iPlane++) {
299 const double y = (nPlanes > 1) ? -span / 2 + iPlane * span / (nPlanes - 1) : 0.;
300 cardVol->AddNode(planeVol, iPlane,
new TGeoTranslation(0,
y, 0));
309 auto [rMin, rMax] = getBoundingRadii(sStaveWidth);
311 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
315 TGeoTube*
layer =
new TGeoTube(rMin, rMax, halfLengthZ);
316 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
317 layerVol->SetLineColor(kYellow);
325 const double avgRadiusOuter = avgRadiusInner + mStaggerOffset;
329 double theta1 = std::atan(sStaveWidth / 2 /
mInnerRadius);
330 double st = std::sin(theta);
331 double ct = std::cos(theta);
334 LOGP(info,
"Creating a layer with {} staves and {} mm overlap",
mNumberOfStaves, overlap * 10);
338 TGeoCombiTrans* trans =
new TGeoCombiTrans();
340 double phi = (
mNumberOfStaves % 4 == 0) ? theta * (iStave + 0.5) : theta * iStave;
341 double phiDeg = phi * TMath::RadToDeg();
342 TGeoRotation* rot =
new TGeoRotation(
"rot", phiDeg + 90 +
mTiltAngle, 0, 0);
343 trans->SetRotation(rot);
345 float trueRadius = (
mLayerNumber == 3 ||
mLayerNumber == 4) ? (iStave % 2 == 0 ? avgRadiusInner : avgRadiusOuter) : avgRadiusInner;
346 trans->SetTranslation(trueRadius * std::cos(phi), trueRadius * std::sin(phi), 0);
347 LOGP(
debug,
"Inserting {} in {} ", staveVol->GetName(), layerVol->GetName());
348 layerVol->AddNode(staveVol, iStave, trans);
351 LOGP(
debug,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
352 motherVolume->AddNode(layerVol, 1,
nullptr);
355std::pair<float, float> TRKMLLayer::getBoundingRadii(
double staveWidth)
const
362 return {defaultRadiusMin, defaultRadiusMax};
377 const float avgRadiusStaggered = avgRadiusInner + mStaggerOffset;
379 const float staveSizeX = staveWidth;
383 const float precisionMargin = 0.05f;
388 float u_max = avgRadiusStaggered * std::sin(
alpha) + staveSizeX / 2.0;
389 float v_max = avgRadiusStaggered * std::cos(
alpha) + staveSizeY / 2.0;
390 float radiusMax = std::sqrt(u_max * u_max + v_max * v_max);
392 return {defaultRadiusMin, radiusMax + precisionMargin};
397 double perpDistance = avgRadiusStaggered * std::cos(
alpha) - staveSizeY / 2.0;
398 double projDistance = avgRadiusStaggered * std::sin(
alpha);
401 if (projDistance <= staveSizeX / 2.0) {
402 newRadiusMin = perpDistance;
404 double u_min = projDistance - staveSizeX / 2.0;
405 newRadiusMin = std::sqrt(u_min * u_min + perpDistance * perpDistance);
408 return {newRadiusMin - precisionMargin, defaultRadiusMax};
415 :
TRKSegmentedLayer(layerNumber, layerName, rInn, tiltAngle, numberOfStaves, numberOfModules, thickOrX2X0,
mode)
421 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
423 float lengthHalfBarrel =
mLength / 2;
425 TGeoVolume* halfStaveVol =
new TGeoVolume(halfStaveName.c_str(), halfStave, medSi);
426 halfStaveVol->SetLineColor(kYellow);
429 for (
int iModule = 0; iModule < nModulesPerHalfBarrel; iModule++) {
431 TGeoCombiTrans* trans =
new TGeoCombiTrans();
432 trans->SetTranslation(0, 0, zPos);
442 TGeoVolume* staveVol =
new TGeoVolumeAssembly(staveName.c_str());
444 TGeoCombiTrans* transLeft =
new TGeoCombiTrans();
445 transLeft->SetTranslation(-(sHalfStaveWidth - sInStaveOverlap) / 2, 0, 0);
448 TGeoCombiTrans* transRight =
new TGeoCombiTrans();
449 transRight->SetTranslation((sHalfStaveWidth - sInStaveOverlap) / 2, 0.2, 0);
457 auto [rMin, rMax] = getBoundingRadii(sStaveWidth);
459 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
461 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
462 layerVol->SetLineColor(kYellow);
464 int nStavesHalfBarrel = (int)std::ceil(
mInnerRadius * 2 * TMath::Pi() / sStaveWidth);
465 nStavesHalfBarrel += nStavesHalfBarrel % 2;
468 const double theta = 2. * TMath::Pi() / nStavesHalfBarrel;
469 const float lengthHalfBarrel =
mLength / 2;
470 const int nStaves = nStavesHalfBarrel * 2;
471 LOGP(info,
"Creating OT layer {} with two half-barrels of {} staves each",
mLayerNumber, nStavesHalfBarrel);
473 for (
int iStave = 0; iStave < nStaves; iStave++) {
474 int whichHalfBarrel = iStave / nStavesHalfBarrel;
475 double phi = theta * iStave;
476 TGeoRotation* rot =
new TGeoRotation(
"rot");
477 if (whichHalfBarrel == 1) {
480 rot->RotateZ(phi * TMath::RadToDeg() + 90 + (whichHalfBarrel == 0 ? +1 : -1) *
mTiltAngle);
482 TGeoCombiTrans* trans =
new TGeoCombiTrans();
483 trans->SetRotation(rot);
484 trans->SetTranslation(avgRadius * std::cos(phi), avgRadius * std::sin(phi), zPos);
488 motherVolume->AddNode(layerVol, 1,
nullptr);
491std::pair<float, float> TRKOTLayer::getBoundingRadii(
double staveWidth)
const
494 return {radiusMin - 0.201f, radiusMax};
500 :
TRKSegmentedLayer(layerNumber, layerName, rInn, tiltAngle, numberOfStaves, numberOfModules, thickOrX2X0,
mode)
510 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
513 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
514 chipVol->SetLineColor(kYellow);
522TGeoVolume* TRKOTLayerRealistic::createFPC()
524 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_FPC$");
527 vol->SetLineColor(kOrange);
531TGeoVolume* TRKOTLayerRealistic::createColdPlate()
533 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_CARBONFIBER$");
536 vol->SetLineColor(kGray + 2);
540double TRKOTLayerRealistic::getRowHalfLength()
const
546double TRKOTLayerRealistic::getPipeTrim()
const
554TGeoVolume* TRKOTLayerRealistic::createSupportRing(
double rMin,
double rMax,
double phi1,
double phi2,
int id)
557 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_CARBONFIBER$");
561 new TGeoTubeSeg((base +
"_outsh").c_str(), rMin, rMax, dz, phi1, phi2);
562 new TGeoTubeSeg((base +
"_insh").c_str(), rMin + t, rMax - t, dz - t, phi1, phi2);
563 TGeoShape* shape =
new TGeoCompositeShape((base +
"sh").c_str(), (base +
"_outsh-" + base +
"_insh").c_str());
564 TGeoVolume* vol =
new TGeoVolume(base.c_str(), shape, med);
565 vol->SetLineColor(kGray + 2);
569TGeoVolume* TRKOTLayerRealistic::createCoolingPipe()
571 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_CARBONFIBER$");
573 getRowHalfLength() - getPipeTrim() / 2);
575 vol->SetLineColor(kBlue + 2);
579TGeoVolume* TRKOTLayerRealistic::createEndOfStaveCard()
581 TGeoMedium* medFR4 = gGeoManager->GetMedium(
"TRK_FR4$");
582 TGeoMedium* medCu = gGeoManager->GetMedium(
"TRK_COPPER$");
586 TGeoVolume* cardVol =
new TGeoVolume(
name.c_str(), board, medFR4);
587 cardVol->SetLineColor(kGreen + 3);
594 LOGP(fatal,
"TRKBase.otEosCardCuThickness = {} cm x {} planes does not fit in the {} cm end-of-stave card",
598 TGeoVolume* planeVol =
new TGeoVolume((
name +
"_Cu").c_str(), plane, medCu);
599 planeVol->SetLineColor(kOrange + 7);
603 for (
int iPlane = 0; iPlane < nPlanes; iPlane++) {
604 const double y = (nPlanes > 1) ? -span / 2 + iPlane * span / (nPlanes - 1) : 0.;
605 cardVol->AddNode(planeVol, iPlane,
new TGeoTranslation(0,
y, 0));
611void TRKOTLayerRealistic::addConnector(TGeoVolume* moduleVol,
double rMid)
613 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_LCPCU$");
616 TGeoVolume* vol =
new TGeoVolume(
name.c_str(), shape, med);
617 vol->SetLineColor(kBlue);
621 moduleVol->AddNode(vol, 0,
new TGeoTranslation(0, rMid,
z));
624void TRKOTLayerRealistic::addCapacitors(TGeoVolume* moduleVol,
double rMid)
626 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_BATIO3$");
629 TGeoVolume* vol =
new TGeoVolume(
name.c_str(), shape, med);
630 vol->SetLineColor(kCyan);
636 const double dX[5] = {-0.80, +0.80, -0.80, +0.80, 0.0};
637 const double dZ[5] = {-0.95, -0.95, +0.95, +0.95, 0.0};
645 for (
int iZ = 0; iZ < 4; iZ++) {
646 for (
int iX = 0; iX < 2; iX++) {
648 const double x = chipX[iX] + dX[iCap];
649 const double z = chipZ[iZ] + dZ[iCap];
650 if (std::abs(
x) < skipX && std::abs(
z - connZ) < skipZ) {
653 moduleVol->AddNode(vol, capCopy++,
new TGeoTranslation(
x, rMid,
z));
659void TRKOTLayerRealistic::addBrackets(TGeoVolume* moduleVol,
double rMid)
661 TGeoMedium* med = gGeoManager->GetMedium(
"TRK_PEEK$");
664 TGeoVolume* vol =
new TGeoVolume(
name.c_str(), shape, med);
665 vol->SetLineColor(kGreen + 2);
668 moduleVol->AddNode(vol, 0,
new TGeoTranslation(0, rMid, -
z));
669 moduleVol->AddNode(vol, 1,
new TGeoTranslation(0, rMid, +
z));
675 TGeoVolume* moduleVol =
new TGeoVolumeAssembly(modName.c_str());
688 const double chipX[2] = {-0.5 * pitchX, +0.5 * pitchX};
689 const double chipZ[4] = {-1.5 * pitchZ, -0.5 * pitchZ, +0.5 * pitchZ, +1.5 * pitchZ};
691 moduleVol->AddNode(createColdPlate(), 0,
new TGeoTranslation(0, coldPlateMidY, 0));
694 for (
int iZ = 0; iZ < 4; iZ++) {
695 for (
int iX = 0; iX < 2; iX++) {
696 TGeoCombiTrans* trans =
new TGeoCombiTrans();
697 trans->SetTranslation(chipX[iX], 0., chipZ[iZ]);
699 TGeoRotation* rot =
new TGeoRotation();
701 trans->SetRotation(rot);
703 moduleVol->AddNode(
createChip(), chipCopy++, trans);
707 moduleVol->AddNode(createFPC(), 0,
new TGeoTranslation(0, fpcMidY, 0));
708 addConnector(moduleVol, connMidY);
709 addCapacitors(moduleVol, capMidY);
710 addBrackets(moduleVol, bracketMidY);
717 TGeoVolume* rowVol =
new TGeoVolumeAssembly(rowName.c_str());
722 const double rowHalfLen = getRowHalfLength();
724 for (
int iModule = 0; iModule < nModulesPerRow; iModule++) {
725 double zPos = -rowHalfLen + moduleLength / 2 + iModule * step;
726 TGeoCombiTrans* trans =
new TGeoCombiTrans();
727 trans->SetTranslation(0, 0, zPos);
737 TGeoVolume* staveVol =
new TGeoVolumeAssembly(staveName.c_str());
746 TGeoCombiTrans* tRow0 =
new TGeoCombiTrans();
747 tRow0->SetTranslation(-rowOffset / 2, 0, 0);
749 TGeoCombiTrans* tRow1 =
new TGeoCombiTrans();
754 TGeoCombiTrans* tPipe =
new TGeoCombiTrans();
756 staveVol->AddNode(createCoolingPipe(), 0, tPipe);
759 TGeoCombiTrans* tCard =
new TGeoCombiTrans();
762 staveVol->AddNode(createEndOfStaveCard(), 0, tCard);
773 const double lengthHalfBarrel = 2 * getRowHalfLength();
782 const bool hasWalls = wallThickness > 0.;
787 LOGP(fatal,
"TRKBase.otBarrelWallThickness = {} cm leaves no room for the staves in the {} cm gap between the eta half-barrels",
791 auto [rMin, rMax] = getBoundingRadii(staveWidth);
792 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
793 TGeoShape*
layer =
nullptr;
795 const std::string tubeName =
mLayerName +
"_envelopesh";
796 const std::string slotName =
mLayerName +
"_wallslotsh";
797 const std::string zSlotName =
mLayerName +
"_midslotsh";
798 new TGeoTube(tubeName.c_str(), rMin, rMax, halfLength);
799 new TGeoBBox(slotName.c_str(), slotHalfWidth, rMax + 1., halfLength + 1.);
800 new TGeoBBox(zSlotName.c_str(), rMax + 1., rMax + 1., zSlotHalfWidth);
801 layer =
new TGeoCompositeShape((
mLayerName +
"sh").c_str(), (tubeName +
"-" + slotName +
"-" + zSlotName).c_str());
803 layer =
new TGeoTube(rMin, rMax, halfLength);
805 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
806 layerVol->SetLineColor(kYellow);
817 const double activeStaveWidth = staveWidth - 2 * edgeDead;
818 int nStavesHalfBarrel = (int)std::ceil(2. + (avgRadius * 2 * TMath::Pi() - 2 * (activeStaveWidth + accGap)) /
820 nStavesHalfBarrel += nStavesHalfBarrel % 2;
822 const int nHalf = nStavesHalfBarrel / 2;
823 const double thetaGap = (activeStaveWidth + accGap) / avgRadius;
824 const double thetaInt = (2. * TMath::Pi() - 2. * thetaGap) / (nStavesHalfBarrel - 2);
825 const double overlap = activeStaveWidth - avgRadius * thetaInt;
826 LOGP(info,
"Creating realistic OT layer {}: {} staves/half-barrel, internal overlap {} mm, boundary gap {} mm, flipped={}",
829 const int nStaves = nStavesHalfBarrel * 2;
831 for (
int iStave = 0; iStave < nStaves; iStave++) {
832 int whichHalfBarrel = iStave / nStavesHalfBarrel;
833 int sInHB = iStave % nStavesHalfBarrel;
834 int azHalf = sInHB / nHalf;
835 int sInAz = sInHB % nHalf;
839 const double phiCut = TMath::Pi() / 2;
840 double phi =
phiCut + azHalf * TMath::Pi() + thetaGap / 2 + sInAz * thetaInt;
842 TGeoRotation* rot =
new TGeoRotation(
"rot");
844 if (whichHalfBarrel == 1) {
850 rot->RotateZ(phi * TMath::RadToDeg() + 90 + (whichHalfBarrel == 0 ? +1 : -1) *
mTiltAngle);
853 TGeoCombiTrans* trans =
new TGeoCombiTrans();
854 trans->SetRotation(rot);
855 trans->SetTranslation(avgRadius * std::cos(phi), avgRadius * std::sin(phi), zPos);
865 const double ringDPhi = TMath::RadToDeg() *
872 for (
int azHalf = 0; azHalf < 2; ++azHalf) {
873 TGeoVolume* ringVol = createSupportRing(ringRMin, ringRMax,
874 90. + 180. * azHalf + ringDPhi,
875 270. + 180. * azHalf - ringDPhi, azHalf);
877 for (
int whichHalfBarrel = 0; whichHalfBarrel < 2; ++whichHalfBarrel) {
878 const double zSign = (whichHalfBarrel == 0) ? -1. : 1.;
879 for (
double zAbs : {zRingMid, zRingEos}) {
880 layerVol->AddNode(ringVol, iRing++,
new TGeoTranslation(0., 0., zSign * zAbs));
885 motherVolume->AddNode(layerVol, 1,
nullptr);
888std::pair<float, float> TRKOTLayerRealistic::getBoundingRadii(
double staveWidth)
const
894 const float outerReach = std::max(pipeOuterReach, ringReach);
895 const float margin = 0.1f;
897 return {radiusMin - connectorReach - margin, radiusMax + outerReach + margin};
899 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 int nCopperLayers
constexpr double thickness
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)