← tgeo-material  ·  part 1: the 2-point functions

Where the material is: composition, endcaps, and a hunt for a service chimney

CMS Phase-2 cmsSimGeom-Run4D123.root · ROOT 6.41.01 · 9 September 2026 · follow-up to part 1

Corrected 9 September 2026, after first publication. The endcap disc positions in §5 had been read with TGeoNode::LocalToMaster, which returns the mother's frame, not the global one. The endcap mothers sit at z = ±29.10 cm, so every disc was 29.1 cm too close to the interaction point and the disc-to-disc budgets were measured between the wrong planes. §5 now carries the corrected numbers. The barrel results here and in part 1 are unaffected — those mothers are at z = 0, which is exactly why the mistake survived. See §5 for what changed.

Part 1 measured how much material sits between two tracker layers. That immediately raises the question of what it is and where it sits — is the budget in the layers themselves or in the gaps, is it silicon or cabling, and does the endcap behave like the barrel? This page answers those, plus a hunt for an azimuthally localised service shaft, which came back negative for an interesting reason and turned up a ROOT bug on the way.

Contents
  1. Where the material sits
  2. In the layers, or between them?
  3. Layer centroids: the mid-envelope radius is not the right anchor
  4. Where the services enter
  5. The endcap, away from the transition
  6. Hunting a service chimney
  7. A ROOT bug found on the way

1. Where the material sits

Before any correlator, the plain question: what does the material distribution look like? Shooting one radial ray per (z, φ) cell and splitting each step exactly across r bins gives the density field ⟨1/X0⟩ per cm, of which the φ-average is the structural overview.

Material density in the z-r plane
The tracker in one picture. Radiation-length density, φ-averaged, log scale. Horizontal lines are the barrel layers (IT at r = 3, 6.5, 11, 15 cm; OT at 25, 38, 53, 69, 86, 108; BTL at 114–119). Vertical bars are the endcap discs — TFPX and TEPX at r < 26 cm out to |z| = 265, TEDD at larger r and |z| = 185–265. The horizontal band at r ≈ 17–18 cm running from |z| = 25 to 160 is the inner-tracker service cylinder; the one at r ≈ 28 cm continues it from |z| = 160 outward. Almost everything else is air.

2. In the layers, or between them?

Tile the radius as [L1 body][gap][L2 body][gap]…[BTL body], using each layer's own envelope. Layers and gaps then add to the whole thing with nothing missing. At |z| < 15 cm:

Inside the layers: 0.626 X0 (90%). Between the layers: 0.068 X0 (10%).
Excluding the BTL, i.e. the tracker alone: 82% inside, 18% between.
Stacked composition per radial segment
Every radial segment, split by material role. Layers in capitals, gaps indented. Top panel stacked and clipped — the BTL bar runs off scale at 0.364 X0. Bottom panel, the same totals on a log axis, coloured by whether the segment is inside a layer or between two. Note that support (green) and services (red) appear almost exclusively in the gaps, and that the two inter-layer gaps that matter, IT4–OT1 and OT3–OT4, are support rather than services.

What it is made of

role classx/X0shareexcluding BTL
active sensor (Si + LYSO)0.29442%0.047
module / readout0.22833%0.214
support / mechanics0.10515%0.044
services0.0223%0.022
air0.0040.5%0.004
other0.0416%0.000
total0.6940.331

The headline split hides the more useful fact. The BTL alone is 0.364 of the 0.626 in-layer total, and it is 58% active LYSO. Take it out and the picture inverts: in the tracker proper the sensors contribute 0.047 against 0.214 for module and readout material. Inside a single inner-tracker layer the sensor is about 8.5% of that layer's budget and the hybrid/chip mixture is about 91%. So "silicon plus carbon fibre" is not the right mental model for a tracker layer — overwhelmingly it is readout electronics.

The classification uses CMS's own composite names, which carry the role (servicecomposite, supportcomposite, hybridcomposite, tkLayout_SenSi), so it is their labelling rather than ours. Two honest caveats: hybridcomposite…ModuleSupportPlate is mechanically support despite the prefix and is counted with the module mixture, where it is the single largest entry; and servicecomposite is cables and cooling blended together and cannot be separated at this level.

The 6% "other" is one object. Not a classification failure: it is 0.5 mm of elemental copper in the BTL module housing at r ≈ 116.3 cm, worth 0.035 X0 every time a track crosses it.

3. Layer centroids

Part 1 anchored the correlators at each layer's mid-envelope radius. The physically right anchor is the material centroid — the x/X0-weighted mean radius within the envelope — and the two are not the same:

layermid-envelopematerial centroidoffset
IT13.313.06−0.25
IT26.446.18−0.26
IT310.7710.52−0.25
IT414.9614.71−0.25
OT125.6723.57−2.10
OT237.6736.32−1.35
OT352.8451.45−1.39
OT468.8468.80−0.04
OT586.1186.07−0.04
OT6108.39108.36−0.03
BTL116.58115.99−0.59

The inner tracker is off by a uniform 2.5 mm, which largely cancels when you take the difference between two layers. TB2S (OT4–OT6) is exact to a fraction of a millimetre. The one that matters is TBPS, and OT1 in particular, where the centroid is 2.1 cm inside the mid-envelope radius: those envelopes are 8 cm thick and the material sits in the inner part. A layer-to-layer parametrisation intended for a track fitter should be anchored to the centroid column, not the mid-envelope one.

4. Where the services enter

A radial scan through the barrel at z ≈ 0 sees almost no service material — 3% of the budget. That is not because there is little of it, but because services run longitudinally and turn outward only at the ends of the barrels. Integrated over r < 125 cm:

z [cm]5355595145205235275
services x/X00.0210.0540.0590.0710.0830.0840.0910.082
share of total3.1%8.7%9.0%12.0%15.5%15.7%16.5%45%

Four times more service material at large |z| than in the barrel core, and beyond z ≈ 255 cm — past the last sensors — services and support are essentially all that is left.

5. The endcap, away from the transition

The direct analogue of the barrel correlator with r and z swapped. A path runs from a point on disc A to a point on disc B,

A = (r_A, phi_A, z_A)  ->  B = (r_A + dr, phi_A + dphi, z_B)

and G(rA, Δφ, Δr) is φ-averaged with rA kept as an axis, for the same reason zA is kept in the barrel: disc material varies strongly along it. Pairs are chosen clear of the barrel/endcap transition — TFPX discs 5–8 (global z = 67–140 cm), TEPX 9–12 (175–265), TEDD 3–5 (185–265).

pairzA → zBr range x/X0x/λIx/X0 as first published
TFPX5 → 667 → 843.1–16.20.03710.01070.0737
TFPX6 → 784 → 1113.1–16.20.03750.01090.0375
TFPX7 → 8111 → 1403.1–16.20.03750.01090.0472
TEPX9 → 10175 → 2016.2–25.50.04910.01430.0432
TEPX10 → 11201 → 2316.2–25.50.04920.01440.0774
TEPX11 → 12231 → 2656.2–25.50.04940.01440.0695
TEDD3 → 4185 → 22232–1100.04300.01200.0630
TEDD4 → 5222 → 26532–1100.04320.01210.0432

A disc-to-disc step costs 0.037–0.049 X0: two to three times an inner-barrel layer step (0.016–0.022), and comparable to the outer barrel pairs. Per measurement, the endcap is materially the expensive place to be.

What the frame error looked like, and how it was caught. TGeoNode::LocalToMaster applies only that node's own matrix, so it maps into the immediate mother's frame. The name suggests "master = world"; it does not. The barrel mothers here sit at z = 0, so barrel positions came out right by accident and the mistake was invisible for a whole page.

The symptom was in the numbers all along, in the last column above: three nominally similar TFPX gaps read 0.074 / 0.037 / 0.047, and three TEPX gaps 0.043 / 0.077 / 0.070. Consecutive gaps within one sub-detector have no business scattering by a factor of two. The corrected values are uniform to better than 1% within each sub-detector, which is what a regular disc stack should give. It was found by printing the node paths of the steps along a scan and noticing that material attributed to OTDisc3 appeared at z = 184 while the code believed that disc was at z = 156.
Endcap correlator at twelve source radii
TEPX10 → TEPX11 at twelve source radii, common log colour scale. The white wedge is Δr < −rA, where the path would cross the beam axis, and is excluded. Two things differ from the barrel: the bands are horizontal, meaning the correlator is nearly independent of Δφ — endcap material is essentially a function of Δr alone, with Δφ entering only through path length; and the sharp rise beyond Δr ≈ 25–35 cm is the path leaving the TEPX acceptance and reaching the service cylinder at r ≈ 28 cm.
TEDD budget versus source radius
TEDD is remarkably uniform in radius, 0.04–0.09 X0 across 32 < r < 105 cm, rising only in the last few centimetres where the disc outer support ring sits.
A bug in our own first pass, for the record. The pointing reference — the direction a track from the interaction point actually takes, Δr = rA(zB−zA)/zA — was initially computed without clipping the endpoint to the disc. Beyond rA = rmax zA/zB it lands off the outer disc and, further out, outside the tracker entirely, so the "pointing" path was scored through the calorimeter. That inflated the TEDD pointing budget to 0.52 X0, a factor of eight. Clipped, pointing and normal incidence agree within 5% for every pair.

6. Hunting a service chimney

The tracker services have to leave the volume somewhere, and a plausible picture is a localised shaft at one azimuth. We looked for it and did not find one. The evidence:

The only genuinely narrow azimuthal features in that region are two 10-degree aluminium wedges, ectkcable:ETSU at φ = 355°–5° and its 180-degree mirror, which are structural spurs inside the cone and carry no budget excess relative to the cable sectors around them.

So: a dense service cone, yes, and one that any forward track pays for heavily. A localised service chimney, no — not in this geometry. What this does not exclude is r > 350 cm, outside the tracker, where the scan is blocked by the crash described next.

7. A ROOT bug found on the way

TGeoPcon::DistFromInside can blow the stack. It crosses to the next Pcon z-segment by recursion rather than iteration (TGeoPcon.cxx:570). When the returned step is at or near zero — a point pinned on a boundary — the point advances only by the 1E-6 nudge per level, and roughly 40 000 frames later the stack is gone. A loop would grind slowly and return.

The trigger here is ectkcable:ETSU, the PP1 wedge, which packs three degeneracies into one shape: a plane where rmin == rmax, and two pairs of z-planes at identical z — combined with a 10-degree φ wedge and a strongly flaring cone (rmin2 = 140.5 > rmax1 = 128.3).

The φ dependence is sharp and reproducible: a radial ray at z = 290 cm survives at φ = 0 and dies at φ = 5°, exactly the wedge's phi1 + dphi. Offsetting the sampling off the 5-degree boundaries lets a full 180-point azimuthal scan run clean, which is the workaround used for the numbers above. A single ray at the failing (z, φ) does not always die, which initially made it look like accumulated state corruption; it is not, it is purely whether that ray lands on the boundary.

Suggested fix: convert both recursions in TGeoPcon::DistFromInside to a loop with an iteration cap and return the accumulated distance when the cap is hit. That turns an unrecoverable stack overflow into a bounded, slightly-wrong answer — the usual TGeo failure mode for degenerate input, and much preferable in a scanning application. It may also be worth warning at construction about Pcon planes with rmin == rmax or repeated z. Full writeup with a reproducer is in BUG-TGeoPcon-DistFromInside-recursion.md alongside the code.

Reproducing

source ./renv.sh
root -l -b -q run_matfield.C     # the density field and its projections
root -l -b -q run_endcap.C       # the disc-to-disc correlators

root -l
.L mat_budget.C+
mb_init();
mb_census(15.0, 256);            # the layer/gap table and centroids
mb_draw_census(15.0, 256);       # the composition figure
mb_class_vs_z(0, 125, 30, 0, 300);   # services vs z
mb_hunt_phi(350, 25, 40, -300, 300, 180);   # the azimuthal hunt
Matevž Tadel · mtadel@ucsd.edu · tgeo-material · part 1 · desire
Geometry cmsSimGeom-Run4D123.root, CMS Phase-2 Run4D123. Analysis with ROOT 6.41.01.