20#include <TGeoVolume.h>
29 : mLayerNumber(layerNumber), mLayerName(layerName), mInnerRadius(rInn), mLength(
length)
46 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
49 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
50 sensVol->SetLineColor(kYellow);
57 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
60 TGeoVolume* metalVol =
new TGeoVolume(metalName.c_str(), metalStack, medSi);
61 metalVol->SetLineColor(kGray);
68 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
70 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
71 layerVol->SetLineColor(kYellow);
74 LOGP(
debug,
"Inserting {} in {} ", sensVol->GetName(), layerVol->GetName());
75 layerVol->AddNode(sensVol, 1,
nullptr);
78 LOGP(
debug,
"Inserting {} in {} ", metalVol->GetName(), layerVol->GetName());
79 layerVol->AddNode(metalVol, 1,
nullptr);
81 LOGP(
debug,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
82 motherVolume->AddNode(layerVol, 1,
nullptr);
88 :
TRKCylindricalLayer(layerNumber, layerName, rInn, numberOfModules * sModuleLength, thickOrX2X0,
mode), mNumberOfModules(numberOfModules)
94 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
97 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
98 sensVol->SetLineColor(kYellow);
105 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
108 TGeoVolume* deadVol =
new TGeoVolume(deadName.c_str(), deadzone, medSi);
109 deadVol->SetLineColor(kGray);
116 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
119 TGeoVolume* metalVol =
new TGeoVolume(metalName.c_str(), metalStack, medSi);
120 metalVol->SetLineColor(kGray);
127 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
130 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
131 chipVol->SetLineColor(kYellow);
134 TGeoCombiTrans* transSens =
new TGeoCombiTrans();
137 LOGP(
debug,
"Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
138 chipVol->AddNode(sensVol, 1, transSens);
141 TGeoCombiTrans* transDead =
new TGeoCombiTrans();
144 LOGP(
debug,
"Inserting {} in {} ", deadVol->GetName(), chipVol->GetName());
145 chipVol->AddNode(deadVol, 1, transDead);
148 TGeoCombiTrans* transMetal =
new TGeoCombiTrans();
151 LOGP(
debug,
"Inserting {} in {} ", metalVol->GetName(), chipVol->GetName());
152 chipVol->AddNode(metalVol, 1, transMetal);
159 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
161 TGeoShape*
module = new TGeoBBox(sModuleWidth / 2, mChipThickness / 2, sModuleLength / 2);
162 TGeoVolume* moduleVol =
new TGeoVolume(moduleName.c_str(), module, medSi);
163 moduleVol->SetLineColor(kYellow);
169 TGeoCombiTrans* transLeft =
new TGeoCombiTrans();
170 transLeft->SetTranslation(xLeft, 0, zLeft);
171 TGeoRotation* rot =
new TGeoRotation();
173 transLeft->SetRotation(rot);
174 LOGP(
debug,
"Inserting {} in {} ", chipVolLeft->GetName(), moduleVol->GetName());
175 moduleVol->AddNode(chipVolLeft, iChip * 2, transLeft);
180 TGeoCombiTrans* transRight =
new TGeoCombiTrans();
181 transRight->SetTranslation(xRight, 0, zRight);
182 LOGP(
debug,
"Inserting {} in {} ", chipVolRight->GetName(), moduleVol->GetName());
183 moduleVol->AddNode(chipVolRight, iChip * 2 + 1, transRight);
198 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
201 TGeoVolume* staveVol =
new TGeoVolume(staveName.c_str(), stave, medAir);
202 staveVol->SetLineColor(kYellow);
207 TGeoCombiTrans* trans =
new TGeoCombiTrans();
208 trans->SetTranslation(0, 0, zPos);
209 LOGP(
debug,
"Inserting {} in {} ", moduleVol->GetName(), staveVol->GetName());
210 staveVol->AddNode(moduleVol, iModule, trans);
218 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
220 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
221 layerVol->SetLineColor(kYellow);
224 int nStaves = (
int)std::ceil(
mInnerRadius * 2 * TMath::Pi() / sStaveWidth);
225 nStaves += nStaves % 2;
228 double theta = 2 * TMath::Pi() / nStaves;
229 double theta1 = std::atan(sStaveWidth / 2 /
mInnerRadius);
230 double st = std::sin(theta);
231 double ct = std::cos(theta);
234 LOGP(info,
"Creating a layer with {} staves and {} mm overlap", nStaves, overlap * 10);
236 for (
int iStave = 0; iStave < nStaves; iStave++) {
238 TGeoCombiTrans* trans =
new TGeoCombiTrans();
239 double theta = 360. * iStave / nStaves;
241 TGeoRotation* rot =
new TGeoRotation(
"rot", theta + 90 + 4, 0, 0);
242 trans->SetRotation(rot);
243 trans->SetTranslation(
mInnerRadius * std::cos(2. * TMath::Pi() * iStave / nStaves),
mInnerRadius * std::sin(2 * TMath::Pi() * iStave / nStaves), 0);
244 LOGP(
debug,
"Inserting {} in {} ", staveVol->GetName(), layerVol->GetName());
245 layerVol->AddNode(staveVol, iStave, trans);
248 LOGP(
debug,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
249 motherVolume->AddNode(layerVol, 1,
nullptr);
261 TGeoMedium* medSi = gGeoManager->GetMedium(
"TRK_SILICON$");
264 TGeoVolume* halfStaveVol =
new TGeoVolume(halfStaveName.c_str(), halfStave, medSi);
265 halfStaveVol->SetLineColor(kYellow);
270 TGeoCombiTrans* trans =
new TGeoCombiTrans();
271 trans->SetTranslation(0, 0, zPos);
272 LOGP(
debug,
"Inserting {} in {} ", moduleVol->GetName(), halfStaveVol->GetName());
273 halfStaveVol->AddNode(moduleVol, iModule, trans);
282 TGeoVolume* staveVol =
new TGeoVolumeAssembly(staveName.c_str());
285 TGeoCombiTrans* transLeft =
new TGeoCombiTrans();
286 transLeft->SetTranslation(-(sHalfStaveWidth - sInStaveOverlap) / 2, 0, 0);
287 LOGP(
debug,
"Inserting {} in {} ", halfStaveVolLeft->GetName(), staveVol->GetName());
288 staveVol->AddNode(halfStaveVolLeft, 0, transLeft);
291 TGeoCombiTrans* transRight =
new TGeoCombiTrans();
292 transRight->SetTranslation((sHalfStaveWidth - sInStaveOverlap) / 2, 0.2, 0);
293 LOGP(
debug,
"Inserting {} in {} ", halfStaveVolRight->GetName(), staveVol->GetName());
294 staveVol->AddNode(halfStaveVolRight, 1, transRight);
301 TGeoMedium* medAir = gGeoManager->GetMedium(
"TRK_AIR$");
303 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
304 layerVol->SetLineColor(kYellow);
307 int nStaves = (
int)std::ceil(
mInnerRadius * 2 * TMath::Pi() / sStaveWidth);
308 nStaves += nStaves % 2;
311 double theta = 2 * TMath::Pi() / nStaves;
312 double theta1 = std::atan(sStaveWidth / 2 /
mInnerRadius);
313 double st = std::sin(theta);
314 double ct = std::cos(theta);
317 LOGP(info,
"Creating a layer with {} staves and {} mm overlap", nStaves, overlap * 10);
319 for (
int iStave = 0; iStave < nStaves; iStave++) {
321 TGeoCombiTrans* trans =
new TGeoCombiTrans();
322 double theta = 360. * iStave / nStaves;
324 TGeoRotation* rot =
new TGeoRotation(
"rot", theta + 90, 0, 0);
325 trans->SetRotation(rot);
326 trans->SetTranslation(
mInnerRadius * std::cos(2. * TMath::Pi() * iStave / nStaves),
mInnerRadius * std::sin(2 * TMath::Pi() * iStave / nStaves), 0);
327 LOGP(
debug,
"Inserting {} in {} ", staveVol->GetName(), layerVol->GetName());
328 layerVol->AddNode(staveVol, iStave, trans);
331 LOGP(
debug,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
332 motherVolume->AddNode(layerVol, 1,
nullptr);
static const char * getTRKStavePattern()
static const char * getTRKChipPattern()
static const char * getTRKSensorPattern()
static const char * getTRKDeadzonePattern()
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 * createHalfStave()
void createLayer(TGeoVolume *motherVolume) override
TGeoVolume * createStave() override
static constexpr double sChipWidth
TGeoVolume * createMetalStack() override
static constexpr float sLogicalVolumeThickness
static constexpr int sHalfNumberOfChips
TGeoVolume * createSensor() override
TRKSegmentedLayer()=default
TGeoVolume * createModule()
static constexpr double sChipLength
TGeoVolume * createChip()
static constexpr double sDeadzoneWidth
static constexpr double sModuleLength
static constexpr double sModuleWidth
TGeoVolume * createDeadzone()
GLuint GLsizei GLsizei * length
GLenum GLuint GLint GLint layer
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)