Skip to content

Commit 44e82ed

Browse files
altsybeealibuild
andauthored
[ALICE3] TRK: simple end-of-stave cards for ML barrel (#15902)
* TOF layer enable flags and segmentation settings * Update default values for TOF options in README * Add specifications for eosCard in Specs.h * ML EoS card Cu thickness parameter to TRKBaseParam * Add createEndOfStaveCard method to TRKLayer Added a method to create the end-of-stave card for the A-side. * add ML end-of-stave cards to TRKLayer, adjust geometry Updated TRKLayer to include end-of-stave card and adjust layer dimensions. * Update z of barrel ML service disks, to give space for EoS cards * Please consider the following formatting changes --------- Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent b6586b6 commit 44e82ed

7 files changed

Lines changed: 67 additions & 14 deletions

File tree

‎Detectors/Upgrades/ALICE3/IOTOF/README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ Configurables for various sub-detectors are presented in the following Table:
1818
| ----------------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------- |
1919
| `IOTOFBase.enableInnerTOF` | `true` (default), `false` | Enable inner TOF barrel layer |
2020
| `IOTOFBase.enableOuterTOF` | `true` (default), `false` | Enable outer TOF barrel layer |
21-
| `IOTOFBase.enableForwardTOF` | `true` (default), `false` | Enable forward TOF endcap |
22-
| `IOTOFBase.enableBackwardTOF` | `true` (default), `false` | Enable backward TOF endcap |
23-
| `IOTOFBase.segmentedInnerTOF` | `false` (default), `true` | Use segmented geometry for inner TOF |
24-
| `IOTOFBase.segmentedOuterTOF` | `false` (default), `true` | Use segmented geometry for outer TOF |
21+
| `IOTOFBase.enableForwardTOF` | `false` (default), `true` | Enable forward TOF endcap |
22+
| `IOTOFBase.enableBackwardTOF` | `false` (default), `true` | Enable backward TOF endcap |
23+
| `IOTOFBase.segmentedInnerTOF` | `true` (default), `false` | Use segmented geometry for inner TOF |
24+
| `IOTOFBase.segmentedOuterTOF` | `true` (default), `false` | Use segmented geometry for outer TOF |
2525
| `IOTOFBase.detectorPattern` | ` ` (default), `v3b`, `v3b1a`, `v3b1b`, `v3b2a`, `v3b2b`, `v3b3` | Optional layout pattern |
2626
| `IOTOFBase.x2x0` | `0.02` (default) | Chip thickness in fractions of the rad. lenght |
2727
| `IOTOFBase.sensorThickness` | `0.0050` (default) | Sensor thickness in cm, can be at maximum equivalent to the chip thickness |

‎Detectors/Upgrades/ALICE3/IOTOF/base/include/IOTOFBase/IOTOFBaseParam.h‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ struct ChipSpecificsParam : public o2::conf::ConfigurableParamPromoter<ChipSpeci
4747
struct IOTOFBaseParam : public o2::conf::ConfigurableParamHelper<IOTOFBaseParam> {
4848
bool enableInnerTOF = true; // Enable Inner TOF layer
4949
bool enableOuterTOF = true; // Enable Outer TOF layer
50-
bool enableForwardTOF = true; // Enable Forward TOF layer
51-
bool enableBackwardTOF = true; // Enable Backward TOF layer
50+
bool enableForwardTOF = false; // Enable Forward TOF layer
51+
bool enableBackwardTOF = false; // Enable Backward TOF layer
5252
std::string detectorPattern = ""; // Layouts of the detector
53-
bool segmentedInnerTOF = false; // If the inner TOF layer is segmented
54-
bool segmentedOuterTOF = false; // If the outer TOF layer is segmented
53+
bool segmentedInnerTOF = true; // If the inner TOF layer is segmented
54+
bool segmentedOuterTOF = true; // If the outer TOF layer is segmented
5555
float x2x0 = 0.02f; // thickness expressed in radiation length, for all layers for the moment
5656
float sensorThickness = 0.0050f; // thickness of the sensor in cm, for all layers for the moment, the default is set to 50 microns
5757

‎Detectors/Upgrades/ALICE3/TRKFT3/TRK/base/include/TRKBase/Specs.h‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,16 @@ constexpr double width{constants::moduleMLOT::width * 1}; // width of the stave
108108
constexpr double length{124 * cm}; // length of the stave, hardcoded to fit the implemented geometry
109109
constexpr int nRows{static_cast<int>(width / constants::moduleMLOT::chip::pitchX)}; // number of rows in the stave
110110
constexpr int nCols{static_cast<int>(length / constants::moduleMLOT::chip::pitchZ)}; // number of columns in the stave
111+
112+
namespace eosCard // end-of-stave readout card, one per ML stave, A-side (+z) only,
113+
{ // placed in front of the TRK_MIDBARCONN_DISK (fibre, power, ...)
114+
constexpr double length{90 * mm}; // z-extent (fits the gap to the conn disk)
115+
constexpr double width{50 * mm}; // phi-extent
116+
constexpr double thickness{1.5 * mm}; // r-extent, FR4 + copper planes
117+
constexpr int nCopperLayers{4}; // copper planes, spread over the thickness
118+
constexpr double copperThickness{122 * mu}; // per copper plane; default of TRKBase.mlEosCardCuThickness
119+
constexpr double zGap{0.1 * mm}; // z-clearance from the last module / stave end
120+
} // namespace eosCard
111121
} // namespace ML
112122

113123
namespace OT

‎Detectors/Upgrades/ALICE3/TRKFT3/TRK/base/include/TRKBase/TRKBaseParam.h‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ struct TRKBaseParam : public o2::conf::ConfigurableParamHelper<TRKBaseParam> {
4545
float serviceTubeX0 = 0.02f; // X0 Al2O3
4646
float otBarrelWallThickness = 0.2f; // cm, carbon fibre separation walls of the OT quarter barrels, 0 disables them
4747
float otEosCardCuThickness = constants::OT::eosCard::copperThickness; // cm, copper per plane in the OT end-of-stave card; drives the card x/X0
48+
float mlEosCardCuThickness = constants::ML::eosCard::copperThickness; // cm, copper per plane in the ML end-of-stave card; drives the card x/X0
4849
bool irisOpen = false;
4950
bool includeLowServices = false;
5051

@@ -76,4 +77,4 @@ struct TRKBaseParam : public o2::conf::ConfigurableParamHelper<TRKBaseParam> {
7677
} // end namespace trk
7778
} // end namespace o2
7879

79-
#endif
80+
#endif

‎Detectors/Upgrades/ALICE3/TRKFT3/TRK/simulation/include/TRKSimulation/TRKLayer.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ class TRKMLLayer : public TRKSegmentedLayer
118118
void createLayer(TGeoVolume* motherVolume) override;
119119

120120
private:
121+
TGeoVolume* createEndOfStaveCard(); // A-side (+z) end-of-stave card, in front of the conn disk
122+
121123
float mStaggerOffset;
122124

123125
static constexpr double sStaveWidth = constants::ML::width;

‎Detectors/Upgrades/ALICE3/TRKFT3/TRK/simulation/src/TRKLayer.cxx‎

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -247,10 +247,9 @@ TRKMLLayer::TRKMLLayer(int layerNumber, std::string layerName, float rInn, float
247247

248248
TGeoVolume* TRKMLLayer::createStave()
249249
{
250-
TGeoMedium* medAir = gGeoManager->GetMedium("TRK_AIR$");
250+
// Assembly (not a solid box) so the end-of-stave card can extend past the module envelope.
251251
std::string staveName = GeometryTGeo::getTRKStavePattern() + std::to_string(mLayerNumber);
252-
TGeoShape* stave = new TGeoBBox(sStaveWidth / 2, mChipThickness / 2, mLength / 2);
253-
TGeoVolume* staveVol = new TGeoVolume(staveName.c_str(), stave, medAir);
252+
TGeoVolume* staveVol = new TGeoVolumeAssembly(staveName.c_str());
254253
staveVol->SetLineColor(kYellow);
255254

256255
for (int iModule = 0; iModule < mNumberOfModules; iModule++) {
@@ -262,17 +261,58 @@ TGeoVolume* TRKMLLayer::createStave()
262261
staveVol->AddNode(moduleVol, iModule, trans);
263262
}
264263

264+
// End-of-stave card on the A-side (+z) only, just past the stave end and in front of the
265+
// TRK_MIDBARCONN_DISK. Local frame: x = phi (width), y = radial (thickness), z = length.
266+
TGeoCombiTrans* tCard = new TGeoCombiTrans();
267+
tCard->SetTranslation(0, 0, mLength / 2 + constants::ML::eosCard::zGap + constants::ML::eosCard::length / 2);
268+
staveVol->AddNode(createEndOfStaveCard(), 0, tCard);
269+
265270
return staveVol;
266271
}
267272

273+
TGeoVolume* TRKMLLayer::createEndOfStaveCard()
274+
{
275+
// FR4 board carrying evenly spaced copper planes; same construction as the OT card, with its
276+
// own constants::ML::eosCard dimensions and a configurable copper thickness (TRKBase.mlEosCardCuThickness),
277+
// which displaces FR4 inside the fixed envelope and sets the card x/X0.
278+
TGeoMedium* medFR4 = gGeoManager->GetMedium("TRK_FR4$");
279+
TGeoMedium* medCu = gGeoManager->GetMedium("TRK_COPPER$");
280+
const std::string name = GeometryTGeo::getTRKStavePattern() + std::to_string(mLayerNumber) + "_EOSCard";
281+
282+
TGeoShape* board = new TGeoBBox(constants::ML::eosCard::width / 2, constants::ML::eosCard::thickness / 2, constants::ML::eosCard::length / 2);
283+
TGeoVolume* cardVol = new TGeoVolume(name.c_str(), board, medFR4);
284+
cardVol->SetLineColor(kGreen + 3);
285+
286+
const double cuThickness = TRKBaseParam::Instance().mlEosCardCuThickness;
287+
const int nPlanes = constants::ML::eosCard::nCopperLayers;
288+
if (cuThickness * nPlanes >= constants::ML::eosCard::thickness) {
289+
LOGP(fatal, "TRKBase.mlEosCardCuThickness = {} cm x {} planes does not fit in the {} cm ML end-of-stave card",
290+
cuThickness, nPlanes, constants::ML::eosCard::thickness);
291+
}
292+
TGeoShape* plane = new TGeoBBox(constants::ML::eosCard::width / 2, cuThickness / 2, constants::ML::eosCard::length / 2);
293+
TGeoVolume* planeVol = new TGeoVolume((name + "_Cu").c_str(), plane, medCu);
294+
planeVol->SetLineColor(kOrange + 7);
295+
296+
// Evenly spaced, the outermost two flush with the board surfaces.
297+
const double span = constants::ML::eosCard::thickness - cuThickness;
298+
for (int iPlane = 0; iPlane < nPlanes; iPlane++) {
299+
const double y = (nPlanes > 1) ? -span / 2 + iPlane * span / (nPlanes - 1) : 0.;
300+
cardVol->AddNode(planeVol, iPlane, new TGeoTranslation(0, y, 0));
301+
}
302+
303+
return cardVol;
304+
}
305+
268306
void TRKMLLayer::createLayer(TGeoVolume* motherVolume)
269307
{
270308
// Retrieve exact bounding boundaries and create the logical container volume
271309
auto [rMin, rMax] = getBoundingRadii(sStaveWidth);
272310

273311
TGeoMedium* medAir = gGeoManager->GetMedium("TRK_AIR$");
274312
// TGeoTube* layer = new TGeoTube(mInnerRadius - 0.333 * sLogicalVolumeThickness, mInnerRadius + 0.667 * sLogicalVolumeThickness, mLength / 2);
275-
TGeoTube* layer = new TGeoTube(rMin, rMax, mLength / 2);
313+
// Extend the z half-length so the A-side end-of-stave card (past mLength/2) stays inside the layer.
314+
const double halfLengthZ = mLength / 2 + constants::ML::eosCard::zGap + constants::ML::eosCard::length;
315+
TGeoTube* layer = new TGeoTube(rMin, rMax, halfLengthZ);
276316
TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
277317
layerVol->SetLineColor(kYellow);
278318

‎Detectors/Upgrades/ALICE3/TRKFT3/TRK/simulation/src/TRKServices.cxx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ void TRKServices::createMLServicesPeacock(TGeoVolume* motherVolume)
630630

631631
// Get geometry information from TRK which is already present
632632
float rMinMiddleServices = 38.0f; // cm, start radius of the ML services = maximum radius allowed for sensors (35 cm), plus some margin for disk paving with modules
633-
const float zMiddleServicesBarrel = 64.5f; // cm, z position of the first barrel ML service disk
633+
const float zMiddleServicesBarrel = 74.0f; // cm, z position of the first barrel ML service disk
634634
const float zMiddleServicesBarrelFwdConnection = 143.f; // cm, z position of barrel to forward connection services
635635
const float zLengthCylinderMiddleServicesBarrel = zMiddleServicesBarrelFwdConnection - zMiddleServicesBarrel;
636636

0 commit comments

Comments
 (0)