Skip to content

Commit 84a7a52

Browse files
committed
ALICE3 TRK add the simplified-realistic OT barrel layout
Adds `TRKBase.layoutMLOT=kSimplifiedRealistic`: the ML is unchanged from kSegmented, but the OT barrel is built from the parts it is actually made of instead of solid silicon slabs. Geometry follows ALICE3 OT WP1 Material (26.06.2025); all tunable dimensions are in constants::OT in Specs.h. Module: cold plate, eight pure-silicon chips (2 in phi x 4 in z, read-out edges facing the module edges), FPC, one ZIF connector, SMD capacitors over the chip footprints and two mounting brackets, stacked flush about the chip mid-plane. Stave: two module rows overlapping in phi and staggered in r, with a cooling pipe between them and an end-of-stave FR4 readout card past the last module. The card is 120 x 80 mm in a fixed 1.5 mm envelope and carries four copper planes; the copper sets its material budget and is tunable through TRKBase.otEosCardCuThickness, which changes only the copper/FR4 split so the card dimensions stay put. The default of 122 um per plane puts the card at 4.0 % x/X0 perpendicular. Barrel: each layer is four quarter barrels, cut at mid-rapidity and on the vertical plane so the region of the beam-pipe supports stays free of staves. The stave count is no longer hard-coded; it is the smallest even number that still leaves rowActiveOverlap of active double coverage at the layer radius. The OT radii (440/615/793 mm) are therefore chosen at the top of a stave-count band, giving 30/42/54 staves per ring with 1.5-1.9 mm of overlap, and keeping the outermost stave envelope clear of the OT shell. Carbon fibre separation walls close the quarter barrels azimuthally and at mid-rapidity (TRKServices::createOTBarrelWalls, thickness configurable via TRKBase.otBarrelWallThickness). The layer envelopes are slotted along both cuts so the walls run continuously in r rather than being interrupted at every layer. Support half-rings carry the stave space frames, and the cooling pipes are shortened at mid-rapidity to make room for them. New passive materials: carbon fibre, FPC (Kapton+Cu), LCP+Cu, BaTiO3, PEEK, FR4 and copper. Also needed to make the layout work end to end: - ProcessHits resolves stave/half-stave/module from the TGeo path, since the realistic OT builds them as assembly volumes whose CurrentVolOffID copy numbers all read 0; - ClustererSpec passed a file name where loadGeometry expects a prefix, so the clusterer could not open the geometry for any layout; - CheckDigitsTRK split VD/ML/OT on hard-coded chip indices that no longer matched the layout; they are now read from GeometryTGeo.
1 parent 885e4ea commit 84a7a52

11 files changed

Lines changed: 835 additions & 102 deletions

File tree

Detectors/Upgrades/ALICE3/TRKFT3/TRK/README.md

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ Configurables for various sub-detectors are presented in the following Table:
1515
| Subsystem | Available options | Comments |
1616
| ------------------ | ------------------------------------------------------- | ---------------------------------------------------------------- |
1717
| `TRKBase.layoutVD` | `kIRIS4` (default), `kIRISFullCyl`, `kIRIS5`, `kIRIS4a` | [link to definitions](./base/include/TRKBase/TRKBaseParam.h) |
18-
| `TRKBase.layoutMLOT` | `kCylindrical`, `kSegmented` (default) | `kSegmented` produces a Turbo layout for ML and a Staggered layout for OT |
18+
| `TRKBase.layoutMLOT` | `kCylindrical`, `kSegmented` (default), `kSimplifiedRealistic` | `kCylindrical`: simple silicon tubes. `kSegmented`: Turbo ML + solid-module OT. `kSimplifiedRealistic`: same ML as `kSegmented`, but a detailed OT barrel (see below) |
1919
| `TRKBase.layoutSRV` | `kPeacockv1` (default), `kLOISymm` | `kLOISymm` produces radially symmetric service volumes, as used in the LoI |
20+
| `TRKBase.otBarrelWallThickness` | thickness in cm (default `0.2`) | Carbon fibre separation walls of the OT quarter barrels — side panels and mid-rapidity disks (`kPeacockv1` + `kSimplifiedRealistic`); `0` disables them. Does not cover the load-bearing outer shell (4 mm) |
2021
| `TRKBase.disableFT3` | `false` (default), `true` | toggle to disable the forward disks |
2122
| `TRKBase.layoutFT3` | `kSegmentedStave` (default), `kSegmentedFT3`, `kTrapezoidal` | disk geometry settings `kSegmentedFT3` refers to an outdated segmentation |
2223
| `TRKBase.nTrapezoidalSegments` | integer; default: 32 | number of trapezoidal segments in the disks for kTrapezoidal layout |
@@ -30,7 +31,7 @@ o2-sim-serial-run5 -n 1 -g pythia8hi -m A3IP TRK TF3 \
3031

3132
## Custom Geometry Configuration
3233

33-
The geometry of the ML and OT layers can be overridden by providing a custom plain-text configuration file via `TRKBase.configFile=filename.txt`. The parser interprets the file differently depending on the active `TRKBase.layoutMLOT` setting (`kCylindrical` or `kSegmented`).
34+
The geometry of the ML and OT layers can be overridden by providing a custom plain-text configuration file via `TRKBase.configFile=filename.txt`. The parser interprets the file differently depending on the active `TRKBase.layoutMLOT` setting (`kCylindrical`, or `kSegmented`/`kSimplifiedRealistic` which share the same syntax).
3435

3536
### General Syntax Rules
3637
* **Separators:** All columns **must** be separated by a single TAB (`\t`). Using spaces will result in a parsing error.
@@ -59,9 +60,9 @@ When `TRKBase.layoutMLOT=kCylindrical` is used, each layer requires a minimum of
5960
80.0 255.9 0.1
6061
```
6162

62-
### 2. Segmented Layout (`kSegmented`)
63+
### 2. Segmented / Simplified-Realistic Layout (`kSegmented`, `kSimplifiedRealistic`)
6364

64-
When `TRKBase.layoutMLOT=kSegmented` is used, each layer requires a minimum of 5 base parameters to define the geometry. The parser distinguishes between Middle Layers (ML) and Outer Layers (OT) based on the sequential layer index.
65+
Both layouts use the same configuration-file syntax (only the OT geometry implementation differs). Each layer requires a minimum of 5 base parameters to define the geometry. The parser distinguishes between Middle Layers (ML) and Outer Layers (OT) based on the sequential layer index.
6566

6667
* *(Note: The 5 base parameters map directly to: Inner Radius (`rInn`), Thickness (`thick`), Tilt Angle (`tiltAngle`), Number of Staves (`nStaves`), and Number of Modules per stave (`nMods`)).*
6768

@@ -70,8 +71,9 @@ The first 5 valid lines are parsed as `TRKMLLayer` objects. These layers **requi
7071
* **Format:** `rInn` \t `thick` \t `tiltAngle` \t `nStaves` \t `nMods` \t `stagOffset` \t `[optional_mode]`
7172

7273
**Outer Layers (OT) - Indices 5 and above**
73-
From the 6th valid line onwards, lines are parsed as `TRKOTLayer` objects. These layers do **not** have a staggering offset. The optional mode parameter shifts to the 6th column.
74+
From the 6th valid line onwards, lines are parsed as OT layer objects (`TRKOTLayer` for `kSegmented`, `TRKOTLayerRealistic` for `kSimplifiedRealistic`). These layers do **not** have a staggering offset. The optional mode parameter shifts to the 6th column.
7475
* **Format:** `rInn` \t `thick` \t `tiltAngle` \t `nStaves` \t `nMods` \t `[optional_mode]`
76+
* *(Note: for `kSimplifiedRealistic`, `nStaves` is recomputed internally from the average radius and stave width to guarantee the neighbour overlap; the value in the file is ignored for the OT.)*
7577

7678
**Example for `kSegmented`:**
7779

@@ -97,5 +99,27 @@ From the 6th valid line onwards, lines are parsed as `TRKOTLayer` objects. These
9799

98100
Furthermore, there are more options in the case of stave segmentation -- for only OT or both. The user can set to cut the staves exactly on the nominal inner radii (true by default), and outer radii (false by default) of the disks. This exists since (planned) placements of sensors & staves often protrude out of the nominal radii to be more able to cover the nominal disk area. In addition, it is possible to draw reference circles (`TRKBase.drawReferenceCircles`) in root for the stave segmented layouts for both the inner (red) and outer (blue) radii. This is off by default, yet can be toggled if the user wants to see how tight the tiling is to the nominal radii -- for visualisation purposes only.
99101

102+
## Simplified-Realistic OT geometry (`kSimplifiedRealistic`)
103+
104+
`kSimplifiedRealistic` keeps the ML layers identical to `kSegmented` but replaces the solid-silicon OT modules with a more detailed, but still simplified, description (`TRKOTLayerRealistic`). It affects the **OT barrel only** — the forward disks are independent of `layoutMLOT` and are configured as described above. All tunable dimensions live in [`Specs.h`](./base/include/TRKBase/Specs.h) (`constants::OT`); values that depend on others are computed in the source.
105+
106+
The geometry specification is based on [ALICE3 OT WP1 Material (26.06.2025)](https://indico.cern.ch/event/1562183/contributions/6580808/attachments/3093672/5480049/ALICE3_OT_WP1_Material_260625.pdf).
107+
108+
**Module** — a flush stack about the chip mid-plane: cold plate (carbon fibre), 8 pure-silicon chips (2 in φ × 4 in z, dead zones facing the outer module edges), FPC (Kapton+Cu), one ZIF connector centred on a short edge, SMD capacitors over the chip footprints (skipping any under the connector), and two mounting brackets on the cold plate.
109+
110+
**Stave** — two module rows overlapping in φ (so each row's dead zone is covered by the other row's sensor) and offset in r by `rowRadialStagger`, plus a cooling pipe between them. The rows straddle the stave frame origin, so a stave placed on the barrel circle is tangent at its own centre: every row-to-row radial step in the barrel — inside a stave and between neighbours — is then the same `rowRadialStagger`, in every layer.
111+
112+
**End-of-stave card** — one readout PCB per stave (`constants::OT::eosCard`), mounted past the last module at the outer z end, coplanar with the two rows: a 120 × 80 mm, 1.5 mm board carrying four copper planes spread symmetrically through the thickness, the remainder FR4. The copper is what sets the card material budget: at the default 122 µm per plane the card is **4.0 % x/X₀** for a track crossing it perpendicularly (copper 3.40 %, FR4 0.60 %). It is tunable through `TRKBase.otEosCardCuThickness`, which changes only the copper/FR4 split inside the fixed 1.5 mm envelope, so the card dimensions and the layer envelopes stay put and only the radiation length moves. The cards reach |z| ≈ 141 cm, just short of the OT barrel service disk, which places them at |η| ≈ 1.84–1.88 on the innermost OT layer and |η| ≈ 1.27–1.32 on the outermost — inside the tracking acceptance, so they matter for forward-disk performance.
113+
114+
**Barrel** — each layer is built in **four parts**: two z-half-barrels (±η), each split azimuthally into two 180° halves. Both η half-barrels are cut on the **same vertical plane** (x = 0), so the region where the vertical beam-pipe supports run is free of staves over the whole barrel (the supports themselves are not in the geometry). Neighbouring staves overlap (≥ 1 mm active double-coverage); at the cut plane the two azimuthal halves instead leave a gap wide enough for the separation wall plus `barrelWallClearance` on each side. The stave count is the smallest even number that still meets the required overlap at the layer radius, so the OT radii (440, 615, 793 mm) are chosen at the top of a stave-count band, giving 30/42/54 staves per ring with 1.5-1.9 mm of overlap. The cooling pipe faces the larger radius on the inner two OT layers and the smaller radius on the flipped outer layer.
115+
116+
**Separation walls** — the quarter barrels are closed on every side but the one carrying the end-of-stave cards (`TRKServices::createOTBarrelWalls`, `kPeacockv1` + `kSimplifiedRealistic`): radially by the ML/OT and outer carbon shells, azimuthally by a rectangular carbon fibre wall in the cut plane, and at mid-rapidity by a half disk at z = 0, one per quarter barrel.
117+
118+
Both walls run **continuously** from one shell to the other: each OT layer envelope is a tube with a slot cut along the vertical cut plane *and* one at z = 0 (`TGeoCompositeShape`), so the walls pass through the layers instead of being interrupted by them, and what is left of each envelope is the four quarter barrels. The slots clear the walls by `barrelWallSlotMargin`; the staves stay `barrelWallClearance` away from them.
119+
120+
Only the outer shell is load bearing, so it is the only 4 mm wall; the ML/OT shell is 2 mm and the side panels and mid-rapidity disks default to 2 mm via `TRKBase.otBarrelWallThickness`.
121+
122+
The OT services (cables/cooling bundles, cold plates) are built by `TRKServices` for all layouts via `TRKBase.layoutSRV`.
123+
100124
<!-- doxy
101125
/doxy -->

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

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,75 @@ constexpr double width{halfstave::width * 2}; // wid
125125
constexpr double length{halfstave::length}; // length of the stave
126126
constexpr int nRows{static_cast<int>(width / moduleMLOT::chip::pitchX)}; // number of rows in the stave
127127
constexpr int nCols{static_cast<int>(length / moduleMLOT::chip::pitchZ)}; // number of columns in the stave
128+
constexpr int nModulesPerRow{11}; // modules along z per row
129+
constexpr double interModuleGap{0.2 * mm}; // z-gap between module FPCs
130+
131+
// Component dimensions of the simplified-realistic OT stave
132+
namespace fpc
133+
{
134+
constexpr double length{116.8 * mm}; // z-extent
135+
constexpr double width{52.2 * mm}; // phi-extent
136+
constexpr double thickness{0.200 * mm}; // r-extent, Kapton+Cu stack
137+
} // namespace fpc
138+
namespace coldPlate
139+
{
140+
constexpr double length{116.8 * mm}; // z-extent
141+
constexpr double width{47.2 * mm}; // phi-extent
142+
constexpr double thickness{0.4 * mm}; // r-extent
143+
} // namespace coldPlate
144+
namespace connector
145+
{
146+
constexpr double width{25.0 * mm}; // phi-extent
147+
constexpr double length{10.0 * mm}; // z-extent
148+
constexpr double thickness{2.0 * mm}; // r-extent
149+
} // namespace connector
150+
namespace capacitor
151+
{
152+
constexpr double width{1.0 * mm}; // phi-extent
153+
constexpr double length{0.5 * mm}; // z-extent
154+
constexpr double thickness{0.3 * mm}; // r-extent
155+
constexpr int perChip{5};
156+
} // namespace capacitor
157+
namespace bracket
158+
{
159+
constexpr double length{10.0 * mm}; // z-extent
160+
constexpr double width{5.0 * mm}; // phi-extent
161+
constexpr double thickness{8.0 * mm}; // r-extent
162+
} // namespace bracket
163+
namespace coolingPipe
164+
{
165+
constexpr double rInner{0.4 * cm};
166+
constexpr double rOuter{0.5 * cm};
167+
constexpr double rLocalOffset{3.5 * cm}; // chip mid-plane to pipe axis, local r
168+
} // namespace coolingPipe
169+
namespace eosCard // end-of-stave readout card, one per stave
170+
{
171+
constexpr double length{120 * mm}; // z-extent
172+
constexpr double width{80 * mm}; // phi-extent
173+
constexpr double thickness{1.5 * mm}; // r-extent, FR4 + copper planes
174+
constexpr int nCopperLayers{4}; // copper planes, spread over the thickness
175+
constexpr double copperThickness{122 * mu}; // per copper plane; sets the card to 4.0 % x/X0, default of TRKBase.otEosCardCuThickness
176+
constexpr double zGap{2.0 * mm}; // z-clearance from the last module
177+
} // namespace eosCard
178+
179+
namespace supportRing // carbon fibre half-rings the stave space frames mount on
180+
{
181+
constexpr double radialHeight{30 * mm}; // r-extent of the ring cross-section
182+
constexpr double zWidth{12 * mm}; // z-extent of the ring cross-section
183+
constexpr double wallThickness{2 * mm}; // the ring is hollow
184+
constexpr double zClearance{1.0 * mm}; // z-clearance to the nearest wall and to the cooling pipe
185+
} // namespace supportRing
186+
187+
constexpr double sensorThickness{moduleMLOT::silicon::thickness}; // pure-silicon chip (no metal stack)
188+
constexpr double interChipGap{0.2 * mm}; // gap between chips within a module
189+
constexpr double rowActiveOverlap{1.0 * mm}; // active overlap between the two rows of a stave
190+
constexpr double rowRadialStagger{2.0 * mm}; // radial step between any two overlapping rows
191+
constexpr double halfBarrelChipGap{1.0 * mm}; // gap between the two azimuthal half-barrels
192+
constexpr double barrelWallClearance{1.0 * mm}; // clearance between a separation wall and the nearest stave
193+
constexpr double barrelWallSlotMargin{0.1 * mm}; // clearance between a separation wall and its envelope slot
194+
constexpr double connectorZDepth{3.0 * cm}; // connector inset from module short edge in z
195+
constexpr double bracketZDepth{3.0 * cm}; // bracket inset from cold-plate short edge in z
196+
constexpr double barrelHalvesZGap{0.8 * cm}; // z-gap between the two eta half-barrels
128197
} // namespace OT
129198

130199
namespace apts /// parameters for the APTS response

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#ifndef O2_TRK_BASEPARAM_H
1313
#define O2_TRK_BASEPARAM_H
1414

15+
#include "TRKBase/Specs.h"
16+
1517
#include "CommonUtils/ConfigurableParam.h"
1618
#include "CommonUtils/ConfigurableParamHelper.h"
1719

@@ -30,6 +32,7 @@ enum eVDLayout {
3032
enum eMLOTLayout {
3133
kCylindrical = 0,
3234
kSegmented,
35+
kSimplifiedRealistic,
3336
};
3437

3538
enum eSrvLayout {
@@ -39,7 +42,9 @@ enum eSrvLayout {
3942

4043
struct TRKBaseParam : public o2::conf::ConfigurableParamHelper<TRKBaseParam> {
4144
std::string configFile = "";
42-
float serviceTubeX0 = 0.02f; // X0 Al2O3
45+
float serviceTubeX0 = 0.02f; // X0 Al2O3
46+
float otBarrelWallThickness = 0.2f; // cm, carbon fibre separation walls of the OT quarter barrels, 0 disables them
47+
float otEosCardCuThickness = constants::OT::eosCard::copperThickness; // cm, copper per plane in the OT end-of-stave card; drives the card x/X0
4348
bool irisOpen = false;
4449
bool includeLowServices = false;
4550

0 commit comments

Comments
 (0)