163 TGeoMedium* medSi = gGeoManager->GetMedium(
"TF3_SILICON$");
164 TGeoMedium* medAir = gGeoManager->GetMedium(
"TF3_AIR$");
165 LOGP(info,
"Media: {} {}", (
void*)medSi, (
void*)medAir);
173 TGeoVolume* sensVol =
new TGeoVolume(sensName, sensor, medSi);
174 TGeoVolume* chipVol =
new TGeoVolume(chipName, chip, medSi);
175 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
180 LOGP(info,
"Inserting Barrel {} in {} ", sensVol->GetName(), chipVol->GetName());
182 chipVol->AddNode(sensVol, 1,
nullptr);
184 LOGP(info,
"Inserting Barrel {} in {} ", chipVol->GetName(), layerVol->GetName());
185 layerVol->AddNode(chipVol, 1,
nullptr);
187 LOGP(info,
"Inserting Barrel {} in {} ", layerVol->GetName(), motherVolume->GetName());
188 motherVolume->AddNode(layerVol, 1,
nullptr);
200 const double staveSizeX =
mStaves.second;
207 const double uCorners[4] = {-0.5 * staveSizeY, 0.5 * staveSizeY, 0.5 * staveSizeY, -0.5 * staveSizeY};
208 const double vCorners[4] = {-0.5 * staveSizeX, -0.5 * staveSizeX, 0.5 * staveSizeX, 0.5 * staveSizeX};
209 double radiusMin = 1.e10;
210 double radiusMax = 0.0;
211 for (
const int s : {-1, 1}) {
212 const double rStave = avgRadius + s * halfShift;
213 const double u0 = -rStave * std::cos(
alpha);
214 const double v0 = -rStave * std::sin(
alpha);
215 const double uClamped = -0.5 * staveSizeY;
216 const double vClamped = std::max(-0.5 * staveSizeX, std::min(0.5 * staveSizeX,
v0));
217 radiusMin = std::min(radiusMin, std::hypot(uClamped - u0, vClamped -
v0));
218 for (
int i = 0;
i < 4; ++
i) {
219 radiusMax = std::max(radiusMax, std::hypot(uCorners[
i] - u0, vCorners[
i] -
v0));
222 TGeoTube*
layer =
new TGeoTube(radiusMin, radiusMax,
mZLength / 2);
223 LOGP(info,
"iTOF: min. layer radius = {}, max. ayer radius = {}", radiusMin, radiusMax);
224 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
235 TGeoBBox*
module = new TGeoBBox(0.5 * moduleSizeX, moduleSizeY * 0.5, moduleSizeZ * 0.5);
236 TGeoVolume* moduleVol =
new TGeoVolume(moduleName, module, medAir);
240 TGeoVolume* staveVol =
new TGeoVolumeAssembly(staveName);
243 TGeoBBox* staveService =
new TGeoBBox(staveSizeX * 0.5, (staveSizeY - moduleSizeY) * 0.5, staveSizeZ * 0.5);
244 TGeoVolume* staveServiceVol =
new TGeoVolume(
"service", staveService, medSi);
254 rotation =
new TGeoRotation(Form(
"segmentRotChip%d",
i + 1), 90, 180, 90, 90, 180, 0);
256 rotation =
new TGeoRotation(Form(
"segmentRotChip%d",
i + 1), 0, 0, 0);
266 auto* translation =
new TGeoTranslation(0., (staveSizeY - moduleSizeY) * 0.5, (
j + 0.5) * moduleSizeZ +
j *
sModuleGap - 0.5 * staveSizeZ);
267 staveVol->AddNode(moduleVol, 1 +
j, translation);
269 auto* translation =
new TGeoTranslation(0., -0.5 * moduleSizeY, 0.);
270 staveVol->AddNode(staveServiceVol, 1, translation);
274 LOGP(info,
"iTOF: Creating stave {}/{} for layer {}",
i + 1,
mStaves.first, layerVol->GetName());
275 const double phi = TMath::TwoPi() *
i /
mStaves.first;
277 const double rStave = avgRadius + (staggered ? ((
i % 2 == 0) ? -halfShift : halfShift) : 0.);
278 const double x = rStave * TMath::Cos(phi);
279 const double y = rStave * TMath::Sin(phi);
280 auto*
rotation =
new TGeoRotation(Form(
"segmentRot%d",
i + 1), phi * TMath::RadToDeg() + 90 +
mTiltAngle, 0, 0);
283 LOGP(info,
"Inserting Barrel {} in {} ", staveVol->GetName(), layerVol->GetName());
286 LOGP(info,
"Inserting Barrel {} in {} at r={} cm{}", layerVol->GetName(), motherVolume->GetName(), avgRadius, staggered ?
" (staggered)" :
"");
287 motherVolume->AddNode(layerVol, 1,
nullptr);
304 TGeoMedium* medSi = gGeoManager->GetMedium(
"TF3_SILICON$");
305 TGeoMedium* medAir = gGeoManager->GetMedium(
"TF3_AIR$");
306 LOGP(info,
"Media: {} {}", (
void*)medSi, (
void*)medAir);
314 TGeoVolume* sensVol =
new TGeoVolume(sensName, sensor, medSi);
315 TGeoVolume* chipVol =
new TGeoVolume(chipName, chip, medSi);
316 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
321 LOGP(info,
"Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
323 chipVol->AddNode(sensVol, 1,
nullptr);
325 LOGP(info,
"Inserting {} in {} ", chipVol->GetName(), layerVol->GetName());
326 layerVol->AddNode(chipVol, 1,
nullptr);
328 LOGP(info,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
329 motherVolume->AddNode(layerVol, 1,
nullptr);
336 const double staveSizeX =
mStaves.second;
341 const double subStaveSizeZ =
mZLength;
345 double radiusMin = 1.e10;
346 double radiusMax = 0;
347 const double u0 = -avgRadius * std::cos(
alpha);
348 const double v0 = -avgRadius * std::sin(
alpha);
349 for (
const int s : {-1, 1}) {
352 const double vMin = 0.5 * (-subStaveSizeX + s * (subStaveSizeX -
sSubStavesOverlapX));
355 const double uClosest = std::clamp(u0, uMin, uMax);
356 const double vClosest = std::clamp(
v0, vMin, vMax);
358 radiusMin = std::min(radiusMin, std::hypot(uClosest - u0, vClosest -
v0));
360 const double uCorners[4] = {uMin, uMax, uMax, uMin};
361 const double vCorners[4] = {vMin, vMin, vMax, vMax};
362 for (
int i = 0;
i < 4; ++
i) {
363 radiusMax = std::max(radiusMax, std::hypot(uCorners[
i] - u0, vCorners[
i] -
v0));
366 TGeoTube*
layer =
new TGeoTube(radiusMin, radiusMax,
mZLength / 2);
367 LOGP(info,
"oTOF: min. layer radius = {}, max. ayer radius = {}", radiusMin, radiusMax);
368 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
379 TGeoBBox*
module = new TGeoBBox(0.5 * moduleSizeX, moduleSizeY * 0.5, moduleSizeZ * 0.5);
380 TGeoVolume* moduleVol =
new TGeoVolume(moduleName, module, medAir);
384 TGeoVolume* staveVol =
new TGeoVolumeAssembly(staveName);
389 TGeoBBox* subStave =
new TGeoBBox(subStaveSizeX * 0.5, subStaveSizeY * 0.5, subStaveSizeZ * 0.5);
390 TGeoVolume* subStaveVol =
new TGeoVolume(subStaveName, subStave, medAir);
393 TGeoBBox* staveService =
new TGeoBBox(subStaveSizeX * 0.5, (subStaveSizeY - moduleSizeY) * 0.5, subStaveSizeZ * 0.5);
394 TGeoVolume* staveServiceVol =
new TGeoVolume(
"service", staveService, medSi);
404 rotation =
new TGeoRotation(Form(
"segmentRotChip%d",
i + 1), 90, 180, 90, 90, 180, 0);
406 rotation =
new TGeoRotation(Form(
"segmentRotChip%d",
i + 1), 0, 0, 0);
414 for (
int j = 0;
j < modulesPerSubStave; ++
j) {
415 LOGP(info,
"oTOF: Creating module for substave {}/{}",
j + 1, modulesPerSubStave);
416 auto* translation =
new TGeoTranslation(0., (subStaveSizeY - moduleSizeY) * 0.5, (
j + 0.5) * moduleSizeZ +
j *
sModuleGap - 0.5 * subStaveSizeZ);
417 subStaveVol->AddNode(moduleVol, 1 +
j, translation);
419 auto* translation =
new TGeoTranslation(0., -0.5 * moduleSizeY, 0.);
420 subStaveVol->AddNode(staveServiceVol, 1, translation);
423 for (
int i = 0;
i < 2; ++
i) {
424 LOGP(info,
"oTOF: Creating substave {}/{} for stave {}/{}",
i + 1, 2, 1, 1);
425 int sign =
i > 0 ? 1 : -1;
427 staveVol->AddNode(subStaveVol,
i + 1, translation2);
432 LOGP(info,
"oTOF: Creating stave {}/{} for layer {}",
i + 1,
mStaves.first, layerVol->GetName());
433 const double phi = TMath::TwoPi() *
i /
mStaves.first;
434 const double x = avgRadius * TMath::Cos(phi);
435 const double y = avgRadius * TMath::Sin(phi);
436 auto*
rotation =
new TGeoRotation(Form(
"segmentRot%d",
i + 1), phi * TMath::RadToDeg() + 90 +
mTiltAngle, 0, 0);
439 LOGP(info,
"Inserting Barrel {} in {} ", chipVol->GetName(), layerVol->GetName());
442 LOGP(info,
"Inserting Barrel {} in {} at r={} cm", layerVol->GetName(), motherVolume->GetName(), avgRadius);
443 motherVolume->AddNode(layerVol, 1,
nullptr);
460 TGeoMedium* medSi = gGeoManager->GetMedium(
"TF3_SILICON$");
461 TGeoMedium* medAir = gGeoManager->GetMedium(
"TF3_AIR$");
463 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
464 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
465 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
470 LOGP(info,
"Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
471 chipVol->AddNode(sensVol, 1,
nullptr);
473 LOGP(info,
"Inserting {} in {} ", chipVol->GetName(), layerVol->GetName());
474 layerVol->AddNode(chipVol, 1,
nullptr);
476 auto* fwdTOFRotation =
new TGeoRotation(
"fwdTOFRotation", 0, 0, 180);
477 auto* fwdTOFCombiTrans =
new TGeoCombiTrans(0, 0,
mZOffset, fwdTOFRotation);
479 LOGP(info,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
480 motherVolume->AddNode(layerVol, 1, fwdTOFCombiTrans);
492 TGeoMedium* medSi = gGeoManager->GetMedium(
"TF3_SILICON$");
493 TGeoMedium* medAir = gGeoManager->GetMedium(
"TF3_AIR$");
495 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
496 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
497 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
502 LOGP(info,
"Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
503 chipVol->AddNode(sensVol, 1,
nullptr);
505 LOGP(info,
"Inserting {} in {} ", chipVol->GetName(), layerVol->GetName());
506 layerVol->AddNode(chipVol, 1,
nullptr);
508 auto* bwdTOFRotation =
new TGeoRotation(
"bwdTOFRotation", 0, 0, 180);
509 auto* fwdTOFCombiTrans =
new TGeoCombiTrans(0, 0,
mZOffset, bwdTOFRotation);
511 LOGP(info,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
512 motherVolume->AddNode(layerVol, 1, fwdTOFCombiTrans);