Skip to content

Commit 62d14b9

Browse files
committed
update stave assembly + add smeared service MB
1 parent fc55be0 commit 62d14b9

1 file changed

Lines changed: 54 additions & 33 deletions

File tree

  • Detectors/Upgrades/ALICE3/IOTOF/simulation/src

‎Detectors/Upgrades/ALICE3/IOTOF/simulation/src/Layer.cxx‎

Lines changed: 54 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,14 @@ void setLayerStyle(TGeoVolume* obj)
116116
obj->SetLineWidth(1);
117117
obj->SetTransparency(70);
118118
}
119-
void setStaveStyle(TGeoVolume* obj)
119+
void setStaveServiceStyle(TGeoVolume* obj)
120120
{
121121
obj->SetLineColor(kRed - 5);
122122
obj->SetFillColor(kRed - 9);
123123
obj->SetLineWidth(2);
124124
obj->SetTransparency(5);
125125
}
126-
void setOTOFStaveStyle(TGeoVolume* obj)
126+
void setStaveAssemblyStyle(TGeoVolume* obj)
127127
{
128128
obj->SetLineColor(kRed - 5);
129129
obj->SetFillColor(kRed - 9);
@@ -197,9 +197,9 @@ void ITOFLayer::createLayer(TGeoVolume* motherVolume)
197197

198198
// First we create the volume for the whole layer, which will be used as mother volume for the segments
199199
const double avgRadius = 0.5 * (mInnerRadius + mOuterRadius);
200-
const double staveSizeX = mStaves.second; // cm
201-
const double staveSizeY = mOuterRadius - mInnerRadius; // cm
202-
const double staveSizeZ = mZLength; // cm
200+
const double staveSizeX = mStaves.second; // cm
201+
const double staveSizeY = mOuterRadius - mInnerRadius + sChipThickness; // cm
202+
const double staveSizeZ = mZLength; // cm
203203

204204
// Build the mother layer tube from the exact inscribed/circumscribed radii of the tilted stave rectangle.
205205
// For the staggered layout both the inner and the outer stave radii are taken into account.
@@ -211,15 +211,16 @@ void ITOFLayer::createLayer(TGeoVolume* motherVolume)
211211
for (const int s : {-1, 1}) {
212212
const double rStave = avgRadius + s * halfShift;
213213
const double u0 = -rStave * std::cos(alpha);
214-
const double v0 = rStave * std::sin(alpha);
215-
const double uClamped = std::max(-0.5 * staveSizeY, std::min(0.5 * staveSizeY, u0));
214+
const double v0 = -rStave * std::sin(alpha);
215+
const double uClamped = -0.5 * staveSizeY;
216216
const double vClamped = std::max(-0.5 * staveSizeX, std::min(0.5 * staveSizeX, v0));
217217
radiusMin = std::min(radiusMin, std::hypot(uClamped - u0, vClamped - v0));
218218
for (int i = 0; i < 4; ++i) {
219219
radiusMax = std::max(radiusMax, std::hypot(uCorners[i] - u0, vCorners[i] - v0));
220220
}
221221
}
222222
TGeoTube* layer = new TGeoTube(radiusMin, radiusMax, mZLength / 2); // cm, encapsulates all staves
223+
LOGP(info, "iTOF: min. layer radius = {}, max. ayer radius = {}", radiusMin, radiusMax);
223224
TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
224225
setLayerStyle(layerVol);
225226

@@ -236,9 +237,12 @@ void ITOFLayer::createLayer(TGeoVolume* motherVolume)
236237
setModuleStyle(moduleVol);
237238

238239
// Now we create the volume for a single stave
239-
TGeoBBox* stave = new TGeoBBox(staveSizeX * 0.5, staveSizeY * 0.5, staveSizeZ * 0.5);
240-
TGeoVolume* staveVol = new TGeoVolume(staveName, stave, medSi);
241-
setStaveStyle(staveVol);
240+
TGeoVolume* staveVol = new TGeoVolumeAssembly(staveName);
241+
setStaveAssemblyStyle(staveVol);
242+
243+
TGeoBBox* staveService = new TGeoBBox(staveSizeX * 0.5, (staveSizeY - moduleSizeY) * 0.5, staveSizeZ * 0.5);
244+
TGeoVolume* staveServiceVol = new TGeoVolume("service", staveService, medSi);
245+
setStaveServiceStyle(staveServiceVol);
242246

243247
// Now we build a module from chips
244248
for (int i = 0; i < sChipsPerRow; ++i) {
@@ -259,9 +263,11 @@ void ITOFLayer::createLayer(TGeoVolume* motherVolume)
259263
// Now we build a stave from modules
260264
for (int j = 0; j < mModulesPerStave; ++j) {
261265
LOGP(info, "iTOF: Creating module for stave {}/{}", j + 1, mModulesPerStave);
262-
auto* translation = new TGeoTranslation(0., staveSizeY * 0.5, (j + 0.5) * moduleSizeZ + j * 0.02 - 0.5 * staveSizeZ);
266+
auto* translation = new TGeoTranslation(0., (staveSizeY - moduleSizeY) * 0.5, (j + 0.5) * moduleSizeZ + j * sModuleGap - 0.5 * staveSizeZ);
263267
staveVol->AddNode(moduleVol, 1 + j, translation);
264268
}
269+
auto* translation = new TGeoTranslation(0., -0.5 * moduleSizeY, 0.);
270+
staveVol->AddNode(staveServiceVol, 1, translation);
265271

266272
// We finally put all the staves in the layer
267273
for (int i = 0; i < mStaves.first; ++i) {
@@ -327,28 +333,38 @@ void OTOFLayer::createLayer(TGeoVolume* motherVolume)
327333

328334
// First we create the volume for the whole layer, which will be used as mother volume for the segments
329335
const double avgRadius = 0.5 * (mInnerRadius + mOuterRadius);
330-
const double staveSizeX = mStaves.second; // cm, tangential stave size
331-
const double staveSizeY = mOuterRadius - mInnerRadius + sSubStavesDistanceY; // cm, radial stave size
332-
const double staveSizeZ = mZLength; // cm
333-
const double subStaveSizeX = 0.5 * mStaves.second + 0.5 * sSubStavesOverlapX; // cm, tangential substave size
334-
const double subStaveSizeY = mOuterRadius - mInnerRadius; // cm, radial substave size
335-
const double subStaveSizeZ = mZLength; // cm
336+
const double staveSizeX = mStaves.second; // cm, tangential stave size
337+
const double staveSizeY = mOuterRadius - mInnerRadius + sSubStavesDistanceY + sChipThickness; // cm, radial stave size
338+
const double staveSizeZ = mZLength; // cm
339+
const double subStaveSizeX = 0.5 * mStaves.second + 0.5 * sSubStavesOverlapX; // cm, tangential substave size
340+
const double subStaveSizeY = mOuterRadius - mInnerRadius + sChipThickness; // cm, radial substave size
341+
const double subStaveSizeZ = mZLength; // cm
336342

337343
// Build the mother layer tube from the exact inscribed/outscribed radii of a tilted stave rectangle.
338344
const double alpha = mTiltAngle * TMath::DegToRad();
345+
double radiusMin = 1.e10;
346+
double radiusMax = 0;
339347
const double u0 = -avgRadius * std::cos(alpha);
340-
const double v0 = avgRadius * std::sin(alpha);
341-
const double uClamped = std::max(-0.5 * staveSizeY, std::min(0.5 * staveSizeY, u0));
342-
const double vClamped = std::max(-0.5 * staveSizeX, std::min(0.5 * staveSizeX, v0));
343-
const double radiusMin = std::hypot(uClamped - u0, vClamped - v0);
348+
const double v0 = -avgRadius * std::sin(alpha);
349+
for (const int s : {-1, 1}) {
350+
const double uMin = 0.5 * (-subStaveSizeY - s * sSubStavesDistanceY);
351+
const double uMax = 0.5 * (subStaveSizeY - s * sSubStavesDistanceY);
352+
const double vMin = 0.5 * (-subStaveSizeX + s * (subStaveSizeX - sSubStavesOverlapX));
353+
const double vMax = 0.5 * (subStaveSizeX + s * (subStaveSizeX - sSubStavesOverlapX));
344354

345-
const double uCorners[4] = {-0.5 * staveSizeY, 0.5 * staveSizeY, 0.5 * staveSizeY, -0.5 * staveSizeY};
346-
const double vCorners[4] = {-0.5 * staveSizeX, -0.5 * staveSizeX, 0.5 * staveSizeX, 0.5 * staveSizeX};
347-
double radiusMax = 0.0;
348-
for (int i = 0; i < 4; ++i) {
349-
radiusMax = std::max(radiusMax, std::hypot(uCorners[i] - u0, vCorners[i] - v0));
355+
const double uClosest = std::clamp(u0, uMin, uMax);
356+
const double vClosest = std::clamp(v0, vMin, vMax);
357+
358+
radiusMin = std::min(radiusMin, std::hypot(uClosest - u0, vClosest - v0));
359+
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));
364+
}
350365
}
351366
TGeoTube* layer = new TGeoTube(radiusMin, radiusMax, mZLength / 2);
367+
LOGP(info, "oTOF: min. layer radius = {}, max. ayer radius = {}", radiusMin, radiusMax);
352368
TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
353369
setLayerStyle(layerVol);
354370

@@ -365,15 +381,18 @@ void OTOFLayer::createLayer(TGeoVolume* motherVolume)
365381
setModuleStyle(moduleVol);
366382

367383
// Now we create the volume for a single stave
368-
TGeoBBox* stave = new TGeoBBox(staveSizeX * 0.5, staveSizeY * 0.5, staveSizeZ * 0.5);
369-
TGeoVolume* staveVol = new TGeoVolume(staveName, stave, medAir);
370-
setOTOFStaveStyle(staveVol);
384+
TGeoVolume* staveVol = new TGeoVolumeAssembly(staveName);
385+
setStaveAssemblyStyle(staveVol);
371386

372387
// Now we create the volume for a single substave
373388
const int modulesPerSubStave = mModulesPerStave;
374389
TGeoBBox* subStave = new TGeoBBox(subStaveSizeX * 0.5, subStaveSizeY * 0.5, subStaveSizeZ * 0.5);
375-
TGeoVolume* subStaveVol = new TGeoVolume(subStaveName, subStave, medSi);
376-
setStaveStyle(subStaveVol);
390+
TGeoVolume* subStaveVol = new TGeoVolume(subStaveName, subStave, medAir);
391+
setStaveAssemblyStyle(subStaveVol);
392+
393+
TGeoBBox* staveService = new TGeoBBox(subStaveSizeX * 0.5, (subStaveSizeY - moduleSizeY) * 0.5, subStaveSizeZ * 0.5);
394+
TGeoVolume* staveServiceVol = new TGeoVolume("service", staveService, medSi);
395+
setStaveServiceStyle(staveServiceVol);
377396

378397
// Now we build a module from chips
379398
for (int i = 0; i < sChipsPerRow; ++i) {
@@ -394,15 +413,17 @@ void OTOFLayer::createLayer(TGeoVolume* motherVolume)
394413
// Now we build a substave from modules
395414
for (int j = 0; j < modulesPerSubStave; ++j) {
396415
LOGP(info, "oTOF: Creating module for substave {}/{}", j + 1, modulesPerSubStave);
397-
auto* translation = new TGeoTranslation(0., subStaveSizeY * 0.5, (j + 0.5) * moduleSizeZ + j * 0.02 - 0.5 * subStaveSizeZ);
416+
auto* translation = new TGeoTranslation(0., (subStaveSizeY - moduleSizeY) * 0.5, (j + 0.5) * moduleSizeZ + j * sModuleGap - 0.5 * subStaveSizeZ);
398417
subStaveVol->AddNode(moduleVol, 1 + j, translation);
399418
}
419+
auto* translation = new TGeoTranslation(0., -0.5 * moduleSizeY, 0.);
420+
subStaveVol->AddNode(staveServiceVol, 1, translation);
400421

401422
// Now we build a stave from two substave
402423
for (int i = 0; i < 2; ++i) {
403424
LOGP(info, "oTOF: Creating substave {}/{} for stave {}/{}", i + 1, 2, 1, 1);
404425
int sign = i > 0 ? 1 : -1;
405-
auto* translation2 = new TGeoTranslation(sign * 0.5 * subStaveSizeX - sign * 0.5 * sSubStavesOverlapX, -sign * 0.5 * sSubStavesDistanceY - 0.5 * moduleSizeY, 0);
426+
auto* translation2 = new TGeoTranslation(sign * 0.5 * subStaveSizeX - sign * 0.5 * sSubStavesOverlapX, -sign * 0.5 * sSubStavesDistanceY, 0);
406427
staveVol->AddNode(subStaveVol, i + 1, translation2);
407428
}
408429

0 commit comments

Comments
 (0)