@@ -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