Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ quantity explicit at the point where it is written.
| Subsystem | Status | Description |
|-----------|--------|-------------|
| [Cavern](subsystems/Cavern/README.md) | Complete | World volume with subtracted rock cavities |
| [Target](subsystems/Target/README.md) | Complete | 19 W slabs with Ta cladding in Inconel vessel |
| [Target](subsystems/Target/README.md) | Complete | 2026 BDF target: 33 W disks in grooved steel core with jacket and endcap |
| [MuonShield](subsystems/MuonShield/README.md) | Approximate | 6 stations, box approximations of arb8 shapes |
| [NeutrinoDetector](subsystems/NeutrinoDetector/README.md) | Approximate | Veto + Si/W target + HCAL with individual scintillating fibres |
| [Magnet](subsystems/Magnet/README.md) | Approximate | Iron yoke with box-shaped coils (should be tubes) |
Expand Down
106 changes: 64 additions & 42 deletions subsystems/Target/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@ The Target subsystem contains the SHiP proton target and its associated shieldin
## Overview

The proton target is where the 400 GeV/c proton beam from the SPS interacts to produce
hidden sector particles. The target consists of tungsten slabs with tantalum cladding,
housed in a helium-filled vessel, surrounded by copper and iron shielding.
hidden sector particles. This implements the 2026 BDF target design, extracted from
CATIA model `ST1A07710_01_AB.02`: solid tungsten disks held in a steel core with
serpentine helium cooling grooves, surrounded by a steel jacket with flanges and a
domed rear endcap, all inside a pressurised-helium container. Copper and iron
shielding surround the target.

## Geometry Structure

Expand All @@ -16,55 +19,73 @@ target_vacuum_box (Vacuum, 160×227.1×300 cm)
├── top_shielding (Copper, 160×60×300 cm)
├── bottom_shielding (Copper, 160×54.5×300 cm)
├── shielding_pedestal (Iron, 107×15×217 cm)
└── TargetArea
├── TargetVessel (Inconel718, tube r=20-20.8 cm, z=171.04 cm)
├── TargetVesselFront (Inconel718, disk r=20.8 cm, z=0.8 cm)
├── TargetVesselBack (Inconel718, disk r=20.8 cm, z=0.8 cm)
└── HeVolume (PressurisedHe90, tube r=20 cm, z=171.04 cm)
├── target_enclosure (Steel316L)
└── 19× CladdedTarget_N (Tantalum, r=12.5 cm)
└── TargetCore_N (Tungsten, r=12.35 cm)
├── he_volume (PressurisedHe90, tube r=23.7 cm, z=-3.78..150.97 cm)
│ ├── 33× core_N (Tungsten disks, r=12.5 cm; core_33 r=15.7 cm)
│ ├── core_steel (Steel316L, polycone with He grooves subtracted)
│ ├── jacket (Steel316L, tube r=21.7-22.5 cm)
│ ├── flange_front (Steel316L, r=19.5-22.5 cm)
│ ├── front_window (Steel316L, disc r=14.1 cm, 8 mm)
│ ├── front_nose (Steel316L, r=14.1-19.5 cm)
│ ├── cover_ring1, cover_ring2 (Steel316L, cover-plate bore rings)
│ ├── flange_back (Steel316L, r=22.5-23.7 cm)
│ └── endcap (Steel316L, 8 mm domed shell as polycone)
└── cover_plate (Steel316L, 60×65×2 cm plate minus the He container bore)
```

All target z coordinates are measured from the front face of the first disk, which is
the SHiP global origin.

## Tungsten disks

33 solid tungsten disks (no cladding), radius 125 mm except the 455 mm rear block
(radius 157 mm), separated by 4 mm helium slits (5 mm after disks 25 and 26). Total
length 1460 mm, of which 1330 mm tungsten.

Thickness sequence (mm): 30, 10, 15×8, 9, 11, 12, 13, 13, 16, 20, 20, 21, 30, 40,
55, 73, 106, 276, 455.

## Steel core, cooling grooves, jacket and endcap

- **Core** (z 7.2–1443.7 mm): the two clamp halves of the CAD model merged into one
axisymmetric polycone; bore r=125 mm (stepping to 157 mm at z=1005 mm around the
rear block), outer r=207 mm with a front step to r=195 mm (inside the front flange)
and a rear step to r=190 mm.
- **He cooling grooves**: 61°-wide arcs (r 125→153 mm) in the bore, centred on the
vertical axis and staggered in z between the upper half (12.2–57, 95–153, 191–257,
300–464, 559–933.2 mm) and the lower half (45–104.7, 142.7–200.7, 238.7–334.7,
385.7–1005 mm), plus a 49°-wide top groove (r 157→182 mm, z 1005–1441.7 mm) around
the rear block. Together with the inter-disk slits they form the serpentine helium
flow path. Implemented as tube-segment subtractions; the removed volume fills with
the parent helium.
- **Jacket**: 8 mm steel tube (r 217–225 mm, z 55.2–1198.7 mm) with front flange
(r 195–225 mm, z −23.8–55.2 mm) and rear flange (r 225–237 mm, z 1198.7–1263.7 mm);
the r 207–217 mm gap between core and jacket is a helium annulus.
- **Upstream closure**: the vessel bore is closed by a dished beam window integral to
the front flange part, simplified to a flat disc (r 141 mm, z −33.5–−25.5 mm) that
preserves the 8 mm of steel on the beam axis; a nose ring (r 141–195 mm,
z −35.8–−23.8 mm) connects the window rim to the flange. An external cover plate
(600×650×20 mm, z −37.8–−17.8 mm, stepped bore r 196/226 mm, asymmetric about the
beam axis: +250 mm above, −400 mm below) is modelled as two bore rings inside the
helium container plus a rectangular box-minus-tube outside it.
- **Rear endcap**: 8 mm shell (cylinder r 229–237 mm, z 1263.7–1413.7 mm) closed by a
domed head approximated as a polycone (three cone segments and an apex disc,
ending at z=1509.7 mm).

Simplifications relative to the CAD model: bolt lugs, key-ways, pipe stubs, fasteners
and survey hardware are omitted; the flange/jacket boundary is placed at the end of
the core front step (55.2 mm instead of the CAD's stepped flange bore at 64.2 mm); the
beam window dishing is dropped and the window spacer pads are omitted.

## Materials

| Component | Material | Density (g/cm³) |
|-----------|----------|-----------------|
| Vacuum box | Vacuum | 1.205e-6 |
| Shielding | Copper | 8.96 |
| Pedestal | Iron | 7.87 |
| Vessel | Inconel718 | 8.19 |
| Enclosure | Steel316L | 7.99 |
| Disks | Tungsten | 19.3 |
| Core, jacket, flanges, window, cover plate, endcap | Steel316L | 7.99 |
| He volume | PressurisedHe90 | 0.00212 |
| Cladding | Tantalum | 16.65 |
| Core | Tungsten | 19.3 |

## Target Slabs

The target consists of 19 tungsten slabs with tantalum cladding. The slab thicknesses
increase along the beam direction to account for the hadronic shower development.

| Slab | Cladding Z (cm) | Core Z (cm) | Position Z (cm) |
|------|-----------------|-------------|-----------------|
| 1 | 4.5 | 4.2 | -77.07 |
| 2 | 1.8 | 1.5 | -73.47 |
| 3 | 1.7 | 1.4 | -71.27 |
| 4 | 1.7 | 1.4 | -69.12 |
| 5 | 1.8 | 1.5 | -66.92 |
| 6 | 1.9 | 1.6 | -64.62 |
| 7 | 2.1 | 1.8 | -62.17 |
| 8 | 1.9 | 1.6 | -59.72 |
| 9 | 2.1 | 1.8 | -57.27 |
| 10 | 2.4 | 2.1 | -54.57 |
| 11 | 2.8 | 2.5 | -51.52 |
| 12 | 3.3 | 3.0 | -48.02 |
| 13 | 4.1 | 3.8 | -43.87 |
| 14 | 5.6 | 5.3 | -38.57 |
| 15 | 8.8 | 8.5 | -30.92 |
| 16 | 17.2 | 16.9 | -17.44 |
| 17 | 28.7 | 28.4 | +6.01 |
| 18 | 28.8 | 28.5 | +35.44 |
| 19 | 28.8 | 28.5 | +64.92 |

## Position in World

Expand All @@ -86,5 +107,6 @@ GeoPhysVol* target = factory.build();

## References

- GDML source: `gdml/ship_geometry.gdml`
- CATIA model: `ST1A07710_01_AB.02` (July 2026)
- FairShip implementation of the same design: ShipSoft/FairShip#1361
- SHiP Technical Proposal: CERN-SPSC-2015-016
188 changes: 137 additions & 51 deletions subsystems/Target/include/Target/TargetFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

class GeoPhysVol;
class GeoLogVol;
class GeoShape;

namespace SHiPGeometry {

Expand All @@ -17,12 +18,27 @@ class SHiPMaterials;
/**
* @brief Factory for the Target (proton target and shielding) geometry
*
* The target consists of:
* Implements the 2026 BDF target design, extracted from CATIA model
* ST1A07710_01_AB.02 and simplified to axisymmetric shapes:
* - Vacuum box containing shielding and target assembly
* - Copper proximity, top, and bottom shielding
* - Iron shielding pedestal
* - Inconel718 target vessel with helium-filled interior
* - 19 tungsten target slabs with tantalum cladding
* - Helium container (HeVolume) holding:
* - 33 solid tungsten disks (no cladding); the last disk (rear block)
* has a larger radius
* - steel core (the two clamp halves modelled as one axisymmetric
* polycone) with serpentine He cooling grooves subtracted
* - steel jacket tube with front and rear flanges; the gap between
* core and jacket is a He annulus
* - upstream beam window (dished membrane simplified to a flat disc
* preserving the 8 mm of steel on the beam axis) with its nose ring,
* and the bore rings of the upstream cover plate
* - domed rear endcap (8 mm shell, dome approximated as a polycone)
* - Upstream cover plate (rectangular, asymmetric about the beam axis),
* the part outside the He container
*
* All target z coordinates are measured from the front face of the first
* disk, which is the SHiP global origin.
*/
class TargetFactory {
public:
Expand All @@ -43,14 +59,13 @@ class TargetFactory {
GeoPhysVol* createTopShielding();
GeoPhysVol* createBottomShielding();
GeoPhysVol* createShieldingPedestal();
GeoPhysVol* createTargetVessel();
GeoPhysVol* createTargetVesselFront();
GeoPhysVol* createTargetVesselBack();
GeoPhysVol* createTargetEnclosure();
GeoPhysVol* createHeVolume();
const GeoShape* createSteelCoreShape();

// Unit conversion helper (GDML uses cm, GeoModel uses mm)
// Unit conversion helpers
static constexpr double cm = GeoModelKernelUnits::cm;
static constexpr double mm = GeoModelKernelUnits::mm;
static constexpr double deg = GeoModelKernelUnits::degree;

// Target vacuum box dimensions (half-sizes)
static constexpr double s_vacuumBoxHalfX = 80.0 * cm;
Expand Down Expand Up @@ -90,52 +105,123 @@ class TargetFactory {
static constexpr double s_pedestalPosY = -51.55 * cm;
static constexpr double s_pedestalPosZ = 15.0 * cm;

// TargetArea position within vacuum box
// TargetArea position within vacuum box: the target frame (z = 0 at the
// front face of the first disk) sits at this offset in the vacuum box
static constexpr double s_targetAreaPosY = 14.45 * cm;
static constexpr double s_targetAreaPosZ = -43.25 * cm;

// Target vessel
static constexpr double s_vesselRmin = 20.0 * cm;
static constexpr double s_vesselRmax = 20.8 * cm;
static constexpr double s_vesselHalfZ = 85.52 * cm;
static constexpr double s_vesselPosZ = 79.32 * cm;

// Target vessel end caps
static constexpr double s_vesselCapRadius = 20.8 * cm;
static constexpr double s_vesselCapHalfZ = 0.4 * cm;
static constexpr double s_vesselFrontPosZ = -6.6 * cm;
static constexpr double s_vesselBackPosZ = 165.24 * cm;

// HeVolume
static constexpr double s_heVolumeRadius = 20.0 * cm;
static constexpr double s_heVolumeHalfZ = 85.52 * cm;
static constexpr double s_heVolumePosZ = 79.32 * cm;

// Target enclosure
static constexpr double s_enclosureRmin = 12.51 * cm;
static constexpr double s_enclosureRmax = 19.2 * cm;
static constexpr double s_enclosureHalfZ = 79.32 * cm;
static constexpr double s_enclosureCutoutHalfX = 8.0 * cm;
static constexpr double s_enclosureCutoutHalfY = 14.0 * cm;

// Target slabs (common parameters)
static constexpr double s_claddingRadius = 12.5 * cm;
static constexpr double s_coreRadius = 12.35 * cm;
static constexpr int s_numSlabs = 19;

// Target slab data arrays (half-lengths in Z, positions in Z)
static constexpr std::array<double, 19> s_claddingHalfZ = {
2.25 * cm, 0.9 * cm, 0.85 * cm, 0.85 * cm, 0.9 * cm, 0.95 * cm, 1.05 * cm,
0.95 * cm, 1.05 * cm, 1.2 * cm, 1.4 * cm, 1.65 * cm, 2.05 * cm, 2.8 * cm,
4.4 * cm, 8.6 * cm, 14.35 * cm, 14.4 * cm, 14.4 * cm};
static constexpr std::array<double, 19> s_coreHalfZ = {
2.1 * cm, 0.75 * cm, 0.7 * cm, 0.7 * cm, 0.75 * cm, 0.8 * cm, 0.9 * cm,
0.8 * cm, 0.9 * cm, 1.05 * cm, 1.25 * cm, 1.5 * cm, 1.9 * cm, 2.65 * cm,
4.25 * cm, 8.45 * cm, 14.2 * cm, 14.25 * cm, 14.25 * cm};
static constexpr std::array<double, 19> s_slabPosZ = {
-77.07 * cm, -73.47 * cm, -71.27 * cm, -69.12 * cm, -66.92 * cm, -64.62 * cm, -62.17 * cm,
-59.72 * cm, -57.27 * cm, -54.57 * cm, -51.52 * cm, -48.02 * cm, -43.87 * cm, -38.57 * cm,
-30.92 * cm, -17.44 * cm, 6.01 * cm, 35.44 * cm, 64.92 * cm};
// ---- 2026 BDF target (CATIA ST1A07710_01_AB.02) ----
// All z values below are in the target frame (z = 0 at disk-1 front face).

// HeVolume: container for disks, steel core, jacket, flanges, beam
// window, cover-plate bore rings and endcap
static constexpr double s_heRadius = 237.0 * mm;
static constexpr double s_heZMin = -37.8 * mm; // upstream face of the cover plate
static constexpr double s_heZMax = 1509.7 * mm; // downstream end of rear endcap
static constexpr double s_heCentreZ = 0.5 * (s_heZMin + s_heZMax);

// Tungsten disks: [z start, z end] per disk; 4-5 mm He slits in between
static constexpr int s_numDisks = 33;
static constexpr double s_diskRadius = 125.0 * mm;
static constexpr double s_lastDiskRadius = 157.0 * mm; // rear block
static constexpr std::array<std::array<double, 2>, s_numDisks> s_diskZ = {{
{0.0 * mm, 30.0 * mm}, {34.0 * mm, 44.0 * mm}, {48.0 * mm, 56.0 * mm},
{60.0 * mm, 68.0 * mm}, {72.0 * mm, 80.0 * mm}, {84.0 * mm, 92.0 * mm},
{96.0 * mm, 104.0 * mm}, {108.0 * mm, 116.0 * mm}, {120.0 * mm, 128.0 * mm},
{132.0 * mm, 140.0 * mm}, {144.0 * mm, 152.0 * mm}, {156.0 * mm, 164.0 * mm},
{168.0 * mm, 176.0 * mm}, {180.0 * mm, 188.0 * mm}, {192.0 * mm, 200.0 * mm},
{204.0 * mm, 212.0 * mm}, {216.0 * mm, 224.0 * mm}, {228.0 * mm, 237.0 * mm},
{241.0 * mm, 252.0 * mm}, {256.0 * mm, 268.0 * mm}, {272.0 * mm, 285.0 * mm},
{289.0 * mm, 302.0 * mm}, {306.0 * mm, 322.0 * mm}, {326.0 * mm, 346.0 * mm},
{350.0 * mm, 370.0 * mm}, {375.0 * mm, 396.0 * mm}, {401.0 * mm, 431.0 * mm},
{435.0 * mm, 475.0 * mm}, {479.0 * mm, 534.0 * mm}, {538.0 * mm, 611.0 * mm},
{615.0 * mm, 721.0 * mm}, {725.0 * mm, 1001.0 * mm}, {1005.0 * mm, 1460.0 * mm},
}};

// Steel core (two clamp halves modelled as one axisymmetric piece)
static constexpr double s_coreZMin = 7.2 * mm;
static constexpr double s_coreZMax = 1443.7 * mm;
static constexpr double s_coreBoreR1 = 125.0 * mm; // matches disks 1..32
static constexpr double s_coreBoreR2 = 157.0 * mm; // matches the rear block
static constexpr double s_coreBoreStepZ = 1005.0 * mm; // bore radius change
static constexpr double s_coreOuterR = 207.0 * mm;
static constexpr double s_coreFrontOuterR = 195.0 * mm; // front, inside the flange
static constexpr double s_coreFrontZMax = 55.2 * mm; // end of front step
static constexpr double s_coreRearOuterR = 190.0 * mm; // rear, inside rear flange
static constexpr double s_coreRearZMin = 1233.7 * mm; // start of rear step

// Serpentine He cooling grooves: arcs in the bore, centred on the vertical
// axis, staggered between the upper and lower half; He flows between them
// through the inter-disk slits
static constexpr double s_grooveRmin = 120.0 * mm; // below bore: clean subtraction
static constexpr double s_grooveRmax = 153.0 * mm;
static constexpr double s_groovePhiWidth = 61.0 * deg;
static constexpr std::array<std::array<double, 2>, 5> s_groovesTop = {{
{12.2 * mm, 57.0 * mm},
{95.0 * mm, 153.0 * mm},
{191.0 * mm, 257.0 * mm},
{300.0 * mm, 464.0 * mm},
{559.0 * mm, 933.2 * mm},
}};
static constexpr std::array<std::array<double, 2>, 4> s_groovesBottom = {{
{45.0 * mm, 104.7 * mm},
{142.7 * mm, 200.7 * mm},
{238.7 * mm, 334.7 * mm},
{385.7 * mm, 1005.0 * mm},
}};
// Groove around the rear block (upper half only), ends 2 mm before the
// core rear face
static constexpr double s_rearGrooveRmin = 152.0 * mm; // below bore R2
static constexpr double s_rearGrooveRmax = 182.0 * mm;
static constexpr double s_rearGroovePhiWidth = 49.0 * deg;
static constexpr double s_rearGrooveZMin = 1005.0 * mm;
static constexpr double s_rearGrooveZMax = 1441.7 * mm;

// Jacket tube and flanges; He annulus between core (207) and jacket (217).
// The flange bore matches the core front step, so the flange/jacket
// boundary is placed at the end of the step. The flange proper starts at
// the cover-plate step; upstream of it the outer radius is the r 195
// nose that slides into the cover-plate bore.
static constexpr double s_jacketRmin = 217.0 * mm;
static constexpr double s_jacketRmax = 225.0 * mm;
static constexpr double s_jacketZMin = s_coreFrontZMax;
static constexpr double s_jacketZMax = 1198.7 * mm;
static constexpr double s_flangeFrontRmin = 195.0 * mm;
static constexpr double s_flangeFrontZMin = -23.8 * mm; // cover-plate step
static constexpr double s_noseZMin = -35.8 * mm; // upstream face of the vessel
static constexpr double s_flangeRearRmax = 237.0 * mm;
static constexpr double s_flangeRearZMax = 1263.7 * mm;

// Beam window: dished membrane closing the bore, simplified to a flat
// disc preserving the 8 mm of steel on the beam axis; the r 141-195 nose
// ring connects the window rim to the flange
static constexpr double s_windowRmax = 141.0 * mm;
static constexpr double s_windowZMin = -33.5 * mm;
static constexpr double s_windowZMax = -25.5 * mm;

// Upstream cover plate (600 x 650 x 20 mm, stepped bore r 196/226 mm,
// asymmetric about the beam axis: +250 mm above, -400 mm below): the
// part within the He container is modelled as two bore rings, the
// rectangular remainder as a box-minus-tube outside it
static constexpr double s_coverRing1Rmin = 196.0 * mm;
static constexpr double s_coverRing2Rmin = 226.0 * mm;
static constexpr double s_coverZMax = -17.8 * mm;
static constexpr double s_coverPlateHalfX = 300.0 * mm;
static constexpr double s_coverPlateHalfY = 325.0 * mm;
static constexpr double s_coverPlateHalfZ = 10.0 * mm;
static constexpr double s_coverPlateOffsetY = -75.0 * mm; // plate centre below the axis

// Rear endcap: 8 mm shell, cylindrical section closed by a domed head;
// polycone planes (z, rmin, rmax) approximating the dome with three cone
// segments and an apex disc
static constexpr std::array<std::array<double, 3>, 6> s_endcapPlanes = {{
{1263.7 * mm, 229.0 * mm, 237.0 * mm},
{1413.7 * mm, 229.0 * mm, 237.0 * mm},
{1450.0 * mm, 212.0 * mm, 223.0 * mm},
{1480.0 * mm, 142.0 * mm, 166.5 * mm},
{1505.0 * mm, 0.0 * mm, 67.0 * mm},
{1509.7 * mm, 0.0 * mm, 67.0 * mm},
}};
};

} // namespace SHiPGeometry
Loading
Loading