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, radiusMax,
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 = 2;
201 const int sensorsPerChipZ = 2;
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;
302 const double deltaForTilt = 0.5 * (std::sin(TMath::DegToRad() *
mTiltAngle) * staveSizeX + std::cos(TMath::DegToRad() *
mTiltAngle) * staveSizeY);
303 const double radiusMax = std::sqrt(avgRadius * avgRadius + 0.25 * staveSizeX * staveSizeX + 0.25 * staveSizeY * staveSizeY + avgRadius * 2. * deltaForTilt);
304 const double radiusMin = std::sqrt(avgRadius * avgRadius + 0.25 * staveSizeX * staveSizeX + 0.25 * staveSizeY * staveSizeY - avgRadius * 2. * deltaForTilt);
305 TGeoTube*
layer =
new TGeoTube(radiusMin, radiusMax,
mZLength / 2);
306 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
310 TGeoBBox* stave =
new TGeoBBox(staveSizeX * 0.5, staveSizeY * 0.5, staveSizeZ * 0.5);
311 TGeoVolume* staveVol =
new TGeoVolume(staveName, stave, medAir);
315 const int modulesPerStaveX = 1;
316 const double moduleSizeX = staveSizeX / modulesPerStaveX;
317 const double moduleSizeY = staveSizeY;
319 TGeoBBox*
module = new TGeoBBox(moduleSizeX * 0.5, moduleSizeY * 0.5, moduleSizeZ * 0.5);
320 TGeoVolume* moduleVol =
new TGeoVolume(moduleName, module, medAir);
324 const int chipsPerModuleX = 2;
325 const int chipsPerModuleZ = 2;
326 const double chipSizeX = moduleSizeX / chipsPerModuleX;
327 const double chipSizeY = moduleSizeY;
328 const double chipSizeZ = moduleSizeZ / chipsPerModuleZ;
329 TGeoBBox* chip =
new TGeoBBox(chipSizeX * 0.5, chipSizeY * 0.5, chipSizeZ * 0.5);
330 TGeoVolume* chipVol =
new TGeoVolume(chipName, chip, medSi);
334 const int sensorsPerChipX = 2;
335 const int sensorsPerChipZ = 2;
336 const double sensorSizeX = chipSizeX / sensorsPerChipX;
338 const double sensorSizeZ = chipSizeZ / sensorsPerChipZ;
339 TGeoBBox* sensor =
new TGeoBBox(sensorSizeX * 0.5, sensorSizeY * 0.5, sensorSizeZ * 0.5);
340 TGeoVolume* sensVol =
new TGeoVolume(sensName, sensor, medSi);
345 for (
int i = 0;
i < sensorsPerChipX; ++
i) {
346 for (
int j = 0;
j < sensorsPerChipZ; ++
j) {
347 LOGP(info,
"oTOF: Creating sensor {}/{} for chip {}/{}",
i + 1, sensorsPerChipX,
j + 1, sensorsPerChipZ);
348 auto* translation =
new TGeoTranslation((
i + 0.5) * sensorSizeX - 0.5 * chipSizeX,
350 (
j + 0.5) * sensorSizeZ - 0.5 * chipSizeZ);
351 chipVol->AddNode(sensVol, 1 +
i * sensorsPerChipZ +
j, translation);
356 for (
int i = 0;
i < chipsPerModuleX; ++
i) {
357 for (
int j = 0;
j < chipsPerModuleZ; ++
j) {
358 LOGP(info,
"oTOF: Creating chip {}/{} for module {}/{}",
i + 1, chipsPerModuleX,
j + 1, chipsPerModuleZ);
359 auto* translation =
new TGeoTranslation((
i + 0.5) * chipSizeX - 0.5 * moduleSizeX, 0, (
j + 0.5) * chipSizeZ - 0.5 * moduleSizeZ);
360 moduleVol->AddNode(chipVol, 1 +
i * chipsPerModuleZ +
j, translation);
365 for (
int i = 0;
i < modulesPerStaveX; ++
i) {
367 LOGP(info,
"oTOF: Creating module {}/{} for stave {}/{}",
i + 1, modulesPerStaveX,
j + 1,
mModulesPerStave);
368 auto* translation =
new TGeoTranslation((
i + 0.5) * moduleSizeX - 0.5 * staveSizeX, 0, (
j + 0.5) * moduleSizeZ - 0.5 * staveSizeZ);
375 LOGP(info,
"oTOF: Creating stave {}/{} for layer {}",
i + 1,
mStaves.first, layerVol->GetName());
376 const double phi = TMath::TwoPi() *
i /
mStaves.first;
377 const double x = avgRadius * TMath::Cos(phi);
378 const double y = avgRadius * TMath::Sin(phi);
379 auto* rotation =
new TGeoRotation(Form(
"segmentRot%d",
i + 1), phi * TMath::RadToDeg() + 90 +
mTiltAngle, 0, 0);
382 LOGP(info,
"Inserting Barrel {} in {} ", chipVol->GetName(), layerVol->GetName());
385 LOGP(info,
"Inserting Barrel {} in {} at r={} cm", layerVol->GetName(), motherVolume->GetName(), avgRadius);
386 motherVolume->AddNode(layerVol, 1,
nullptr);
403 TGeoMedium* medSi = gGeoManager->GetMedium(
"TF3_SILICON$");
404 TGeoMedium* medAir = gGeoManager->GetMedium(
"TF3_AIR$");
406 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
407 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
408 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
413 LOGP(info,
"Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
414 chipVol->AddNode(sensVol, 1,
nullptr);
416 LOGP(info,
"Inserting {} in {} ", chipVol->GetName(), layerVol->GetName());
417 layerVol->AddNode(chipVol, 1,
nullptr);
419 auto* fwdTOFRotation =
new TGeoRotation(
"fwdTOFRotation", 0, 0, 180);
420 auto* fwdTOFCombiTrans =
new TGeoCombiTrans(0, 0,
mZOffset, fwdTOFRotation);
422 LOGP(info,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
423 motherVolume->AddNode(layerVol, 1, fwdTOFCombiTrans);
435 TGeoMedium* medSi = gGeoManager->GetMedium(
"TF3_SILICON$");
436 TGeoMedium* medAir = gGeoManager->GetMedium(
"TF3_AIR$");
438 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
439 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
440 TGeoVolume* layerVol =
new TGeoVolume(
mLayerName.c_str(),
layer, medAir);
445 LOGP(info,
"Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
446 chipVol->AddNode(sensVol, 1,
nullptr);
448 LOGP(info,
"Inserting {} in {} ", chipVol->GetName(), layerVol->GetName());
449 layerVol->AddNode(chipVol, 1,
nullptr);
451 auto* bwdTOFRotation =
new TGeoRotation(
"bwdTOFRotation", 0, 0, 180);
452 auto* fwdTOFCombiTrans =
new TGeoCombiTrans(0, 0,
mZOffset, bwdTOFRotation);
454 LOGP(info,
"Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
455 motherVolume->AddNode(layerVol, 1, fwdTOFCombiTrans);