134 TGeoMedium* medSi = gGeoManager->GetMedium(
"TF3_SILICON$");
135 TGeoMedium* medAir = gGeoManager->GetMedium(
"TF3_AIR$");
136 LOGP(info,
"Media: {} {}", (
void*)medSi, (
void*)medAir);
144 TGeoVolume* sensVol =
new TGeoVolume(sensName, sensor, medSi);
145 TGeoVolume* chipVol =
new TGeoVolume(chipName, chip, medSi);
146 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
151 LOGP(info,
"Inserting Barrel {} in {} ", sensVol->GetName(), chipVol->GetName());
153 chipVol->AddNode(sensVol, 1,
nullptr);
155 LOGP(info,
"Inserting Barrel {} in {} ", chipVol->GetName(), layerVol->GetName());
156 layerVol->AddNode(chipVol, 1,
nullptr);
158 LOGP(info,
"Inserting Barrel {} in {} ", layerVol->GetName(), motherVolume->GetName());
159 motherVolume->AddNode(layerVol, 1,
nullptr);
165 const double staveSizeX =
mStaves.second;
168 const double deltaForTilt = 0.5 * (std::sin(TMath::DegToRad() *
mTiltAngle) * staveSizeX + std::cos(TMath::DegToRad() *
mTiltAngle) * staveSizeY);
169 const double radiusMax = std::sqrt(avgRadius * avgRadius + 0.25 * staveSizeX * staveSizeX + 0.25 * staveSizeY * staveSizeY + avgRadius * 2. * deltaForTilt);
170 const double radiusMin = std::sqrt(avgRadius * avgRadius + 0.25 * staveSizeX * staveSizeX + 0.25 * staveSizeY * staveSizeY - avgRadius * 2. * deltaForTilt);
171 TGeoTube*
layer =
new TGeoTube(radiusMin - 0.05, radiusMax + 0.05,
mZLength / 2);
172 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
176 TGeoBBox* stave =
new TGeoBBox(staveSizeX * 0.5, staveSizeY * 0.5, staveSizeZ * 0.5);
177 TGeoVolume* staveVol =
new TGeoVolume(staveName, stave, medAir);
181 const int modulesPerStaveX = 1;
182 const double moduleSizeX = staveSizeX / modulesPerStaveX;
183 const double moduleSizeY = staveSizeY;
185 TGeoBBox*
module = new TGeoBBox(moduleSizeX * 0.5, moduleSizeY * 0.5, moduleSizeZ * 0.5);
186 TGeoVolume* moduleVol =
new TGeoVolume(moduleName, module, medAir);
190 const int chipsPerModuleX = 2;
191 const int chipsPerModuleZ = 2;
192 const double chipSizeX = moduleSizeX / chipsPerModuleX;
193 const double chipSizeY = moduleSizeY;
194 const double chipSizeZ = moduleSizeZ / chipsPerModuleZ;
195 TGeoBBox* chip =
new TGeoBBox(chipSizeX * 0.5, chipSizeY * 0.5, chipSizeZ * 0.5);
196 TGeoVolume* chipVol =
new TGeoVolume(chipName, chip, medSi);
200 const int sensorsPerChipX = 1;
201 const int sensorsPerChipZ = 1;
202 const double sensorSizeX = chipSizeX / sensorsPerChipX;
204 const double sensorSizeZ = chipSizeZ / sensorsPerChipZ;
205 TGeoBBox* sensor =
new TGeoBBox(sensorSizeX * 0.5, sensorSizeY * 0.5, sensorSizeZ * 0.5);
206 TGeoVolume* sensVol =
new TGeoVolume(sensName, sensor, medSi);
211 for (
int i = 0;
i < sensorsPerChipX; ++
i) {
212 for (
int j = 0;
j < sensorsPerChipZ; ++
j) {
213 LOGP(info,
"iTOF: Creating sensor {}/{} for chip {}/{}",
i + 1, sensorsPerChipX,
j + 1, sensorsPerChipZ);
214 auto* translation =
new TGeoTranslation((
i + 0.5) * sensorSizeX - 0.5 * chipSizeX,
216 (
j + 0.5) * sensorSizeZ - 0.5 * chipSizeZ);
217 chipVol->AddNode(sensVol, 1 +
i * sensorsPerChipZ +
j, translation);
222 for (
int i = 0;
i < chipsPerModuleX; ++
i) {
223 for (
int j = 0;
j < chipsPerModuleZ; ++
j) {
224 LOGP(info,
"iTOF: Creating chip {}/{} for module {}/{}",
i + 1, chipsPerModuleX,
j + 1, chipsPerModuleZ);
225 auto* translation =
new TGeoTranslation((
i + 0.5) * chipSizeX - 0.5 * moduleSizeX, 0, (
j + 0.5) * chipSizeZ - 0.5 * moduleSizeZ);
226 moduleVol->AddNode(chipVol, 1 +
i * chipsPerModuleZ +
j, translation);
231 for (
int i = 0;
i < modulesPerStaveX; ++
i) {
233 LOGP(info,
"iTOF: Creating module {}/{} for stave {}/{}",
i + 1, modulesPerStaveX,
j + 1,
mModulesPerStave);
234 auto* translation =
new TGeoTranslation((
i + 0.5) * moduleSizeX - 0.5 * staveSizeX, 0, (
j + 0.5) * moduleSizeZ - 0.5 * staveSizeZ);
241 LOGP(info,
"iTOF: Creating stave {}/{} for layer {}",
i + 1,
mStaves.first, layerVol->GetName());
242 const double phi = TMath::TwoPi() *
i /
mStaves.first;
243 const double x = avgRadius * TMath::Cos(phi);
244 const double y = avgRadius * TMath::Sin(phi);
245 auto* rotation =
new TGeoRotation(Form(
"segmentRot%d",
i + 1), phi * TMath::RadToDeg() + 90 +
mTiltAngle, 0, 0);
248 LOGP(info,
"Inserting Barrel {} in {} ", chipVol->GetName(), layerVol->GetName());
251 LOGP(info,
"Inserting Barrel {} in {} at r={} cm", layerVol->GetName(), motherVolume->GetName(), avgRadius);
252 motherVolume->AddNode(layerVol, 1,
nullptr);
268 TGeoMedium* medSi = gGeoManager->GetMedium(
"TF3_SILICON$");
269 TGeoMedium* medAir = gGeoManager->GetMedium(
"TF3_AIR$");
270 LOGP(info,
"Media: {} {}", (
void*)medSi, (
void*)medAir);
278 TGeoVolume* sensVol =
new TGeoVolume(sensName, sensor, medSi);
279 TGeoVolume* chipVol =
new TGeoVolume(chipName, chip, medSi);
280 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
285 LOGP(info,
"Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
287 chipVol->AddNode(sensVol, 1,
nullptr);
289 LOGP(info,
"Inserting {} in {} ", chipVol->GetName(), layerVol->GetName());
290 layerVol->AddNode(chipVol, 1,
nullptr);
292 LOGP(info,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
293 motherVolume->AddNode(layerVol, 1,
nullptr);
299 const double staveSizeX =
mStaves.second;
305 const double u0 = -avgRadius * std::cos(
alpha);
306 const double v0 = avgRadius * std::sin(
alpha);
307 const double uClamped = std::max(-0.5 * staveSizeY, std::min(0.5 * staveSizeY, u0));
308 const double vClamped = std::max(-0.5 * staveSizeX, std::min(0.5 * staveSizeX,
v0));
309 const double radiusMin = std::hypot(uClamped - u0, vClamped -
v0);
311 const double uCorners[4] = {-0.5 * staveSizeY, 0.5 * staveSizeY, 0.5 * staveSizeY, -0.5 * staveSizeY};
312 const double vCorners[4] = {-0.5 * staveSizeX, -0.5 * staveSizeX, 0.5 * staveSizeX, 0.5 * staveSizeX};
313 double radiusMax = 0.0;
314 for (
int i = 0;
i < 4; ++
i) {
315 radiusMax = std::max(radiusMax, std::hypot(uCorners[
i] - u0, vCorners[
i] -
v0));
317 TGeoTube*
layer =
new TGeoTube(radiusMin, radiusMax,
mZLength / 2);
318 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
322 TGeoBBox* stave =
new TGeoBBox(staveSizeX * 0.5, staveSizeY * 0.5, staveSizeZ * 0.5);
323 TGeoVolume* staveVol =
new TGeoVolume(staveName, stave, medAir);
328 const int modulesPerStaveX = 2;
331 <<
" is not divisible by modulesPerStaveX=" << modulesPerStaveX;
334 const double moduleOverlapZ = 0.7;
335 const double moduleSizeX = staveSizeX / modulesPerStaveX;
336 const double moduleSizeY = staveSizeY;
337 const double moduleSizeZ = (staveSizeZ + (modulesPerStaveZ - 1) * moduleOverlapZ) / modulesPerStaveZ;
338 const double modulePitchZ = moduleSizeZ - moduleOverlapZ;
339 if (modulePitchZ <= 0.0) {
340 LOG(fatal) <<
"Invalid oTOF module overlap " << moduleOverlapZ <<
" cm for module size " << moduleSizeZ <<
" cm";
342 TGeoBBox*
module = new TGeoBBox(moduleSizeX * 0.5, moduleSizeY * 0.5, moduleSizeZ * 0.5);
343 TGeoVolume* moduleVol =
new TGeoVolume(moduleName, module, medAir);
347 const int chipsPerModuleX = 2;
348 const int chipsPerModuleZ = 2;
349 const double chipSizeX = moduleSizeX / chipsPerModuleX;
350 const double chipSizeY = moduleSizeY;
351 const double chipSizeZ = moduleSizeZ / chipsPerModuleZ;
352 TGeoBBox* chip =
new TGeoBBox(chipSizeX * 0.5, chipSizeY * 0.5, chipSizeZ * 0.5);
353 TGeoVolume* chipVol =
new TGeoVolume(chipName, chip, medSi);
357 const int sensorsPerChipX = 1;
358 const int sensorsPerChipZ = 1;
359 const double sensorSizeX = chipSizeX / sensorsPerChipX;
361 const double sensorSizeZ = chipSizeZ / sensorsPerChipZ;
362 TGeoBBox* sensor =
new TGeoBBox(sensorSizeX * 0.5, sensorSizeY * 0.5, sensorSizeZ * 0.5);
363 TGeoVolume* sensVol =
new TGeoVolume(sensName, sensor, medSi);
368 for (
int i = 0;
i < sensorsPerChipX; ++
i) {
369 for (
int j = 0;
j < sensorsPerChipZ; ++
j) {
370 LOGP(info,
"oTOF: Creating sensor {}/{} for chip {}/{}",
i + 1, sensorsPerChipX,
j + 1, sensorsPerChipZ);
371 auto* translation =
new TGeoTranslation((
i + 0.5) * sensorSizeX - 0.5 * chipSizeX,
373 (
j + 0.5) * sensorSizeZ - 0.5 * chipSizeZ);
374 chipVol->AddNode(sensVol, 1 +
i * sensorsPerChipZ +
j, translation);
379 for (
int i = 0;
i < chipsPerModuleX; ++
i) {
380 for (
int j = 0;
j < chipsPerModuleZ; ++
j) {
381 LOGP(info,
"oTOF: Creating chip {}/{} for module {}/{}",
i + 1, chipsPerModuleX,
j + 1, chipsPerModuleZ);
382 auto* translation =
new TGeoTranslation((
i + 0.5) * chipSizeX - 0.5 * moduleSizeX, 0, (
j + 0.5) * chipSizeZ - 0.5 * moduleSizeZ);
383 moduleVol->AddNode(chipVol, 1 +
i * chipsPerModuleZ +
j, translation);
388 for (
int i = 0;
i < modulesPerStaveX; ++
i) {
389 for (
int j = 0;
j < modulesPerStaveZ; ++
j) {
390 LOGP(info,
"oTOF: Creating module {}/{} for stave {}/{}",
i + 1, modulesPerStaveX,
j + 1, modulesPerStaveZ);
391 const double tx = (
i + 0.5) * moduleSizeX - 0.5 * staveSizeX;
392 const double tz = -0.5 * staveSizeZ + 0.5 * moduleSizeZ +
j * modulePitchZ;
393 auto* translation =
new TGeoTranslation(tx, 0, tz);
394 staveVol->AddNode(moduleVol, 1 +
i * modulesPerStaveZ +
j, translation);
400 LOGP(info,
"oTOF: Creating stave {}/{} for layer {}",
i + 1,
mStaves.first, layerVol->GetName());
401 const double phi = TMath::TwoPi() *
i /
mStaves.first;
402 const double x = avgRadius * TMath::Cos(phi);
403 const double y = avgRadius * TMath::Sin(phi);
404 auto* rotation =
new TGeoRotation(Form(
"segmentRot%d",
i + 1), phi * TMath::RadToDeg() + 90 +
mTiltAngle, 0, 0);
407 LOGP(info,
"Inserting Barrel {} in {} ", chipVol->GetName(), layerVol->GetName());
410 LOGP(info,
"Inserting Barrel {} in {} at r={} cm", layerVol->GetName(), motherVolume->GetName(), avgRadius);
411 motherVolume->AddNode(layerVol, 1,
nullptr);
428 TGeoMedium* medSi = gGeoManager->GetMedium(
"TF3_SILICON$");
429 TGeoMedium* medAir = gGeoManager->GetMedium(
"TF3_AIR$");
431 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
432 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
433 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
438 LOGP(info,
"Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
439 chipVol->AddNode(sensVol, 1,
nullptr);
441 LOGP(info,
"Inserting {} in {} ", chipVol->GetName(), layerVol->GetName());
442 layerVol->AddNode(chipVol, 1,
nullptr);
444 auto* fwdTOFRotation =
new TGeoRotation(
"fwdTOFRotation", 0, 0, 180);
445 auto* fwdTOFCombiTrans =
new TGeoCombiTrans(0, 0,
mZOffset, fwdTOFRotation);
447 LOGP(info,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
448 motherVolume->AddNode(layerVol, 1, fwdTOFCombiTrans);
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* bwdTOFRotation =
new TGeoRotation(
"bwdTOFRotation", 0, 0, 180);
477 auto* fwdTOFCombiTrans =
new TGeoCombiTrans(0, 0,
mZOffset, bwdTOFRotation);
479 LOGP(info,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
480 motherVolume->AddNode(layerVol, 1, fwdTOFCombiTrans);