Skip to content

Commit b4c56ed

Browse files
[ALICE3] Magnet: add WindingPack (NbTi+Cu+Al) coil material option
1 parent f9b1f0f commit b4c56ed

6 files changed

Lines changed: 20 additions & 209 deletions

File tree

Detectors/MUON/MID/Simulation/src/Geometry.cxx

Lines changed: 0 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#include <TGeoManager.h>
2727
#include <TGeoShape.h>
2828
#include <TGeoCompositeShape.h>
29-
#include <TGeoTube.h>
3029

3130
namespace o2
3231
{
@@ -345,124 +344,10 @@ TGeoVolume* createChamber(int iChamber)
345344
return chamber;
346345
}
347346

348-
/// Magnet geometry variant selector
349-
enum class MagnetVariant {
350-
AluminiumWalls, ///< 11 cm cryostat, Al inner/outer walls
351-
SteelWalls ///< 10 cm cryostat, Fe inner/outer walls
352-
};
353-
354-
/// Creates the MID magnet/cryostat geometry
355-
/// Port of GEANT4 simulation by Ian Perez Garcia (ICN-UNAM)
356-
/// Reference: github.com/IanPG/MID-Geometry-Studies
357-
void createMagnetGeometry(TGeoVolume& topVolume,
358-
MagnetVariant variant = MagnetVariant::AluminiumWalls)
359-
{
360-
const float R_cryostat_inner = 140.0f;
361-
const float R_cryostat_outer = 200.0f;
362-
const float R_coil_inner = 160.0f;
363-
const float magnetHalfLength = 400.0f;
364-
365-
const float thick_actual_coil = 4.8f;
366-
const float thick_mli = 0.2f;
367-
const float thick_coil_support = 2.0f;
368-
369-
float thick_inner_wall;
370-
float thick_outer_wall;
371-
int wallMedium;
372-
const char* variantTag;
373-
374-
if (variant == MagnetVariant::AluminiumWalls) {
375-
thick_inner_wall = 2.5f;
376-
thick_outer_wall = 1.5f;
377-
wallMedium = Medium::Aluminium;
378-
variantTag = "Al";
379-
} else {
380-
thick_inner_wall = 1.5f;
381-
thick_outer_wall = 1.5f;
382-
wallMedium = Medium::Iron;
383-
variantTag = "Steel";
384-
}
385-
386-
const float R_inner_wall_outer = R_cryostat_inner + thick_inner_wall;
387-
const float R_coil_outer = R_coil_inner + thick_actual_coil;
388-
const float R_mli_inner = R_coil_outer;
389-
const float R_mli_outer = R_mli_inner + thick_mli;
390-
const float R_coil_support_inner = R_mli_outer;
391-
const float R_coil_support_outer = R_coil_support_inner + thick_coil_support;
392-
const float R_outer_wall_inner = R_cryostat_outer - thick_outer_wall;
393-
394-
// Mother volume (contains all cryostat layers)
395-
auto magnetMotherShape = new TGeoTube(Form("MIDMagnetMother_%s_S", variantTag),
396-
R_cryostat_inner, R_cryostat_outer, magnetHalfLength);
397-
auto magnetMotherVol = new TGeoVolume(Form("MIDMagnetMother_%s", variantTag),
398-
magnetMotherShape, assertMedium(Medium::Vacuum));
399-
magnetMotherVol->SetVisibility(kFALSE);
400-
topVolume.AddNode(magnetMotherVol, 1, new TGeoTranslation(0., 0., -1155.));
401-
402-
// Layer 1: Inner wall (Al or Fe)
403-
auto innerWallVol = new TGeoVolume(Form("MIDInnerWall_%s", variantTag),
404-
new TGeoTube(Form("MIDInnerWall_%s_S", variantTag),
405-
R_cryostat_inner, R_inner_wall_outer, magnetHalfLength),
406-
assertMedium(wallMedium));
407-
innerWallVol->SetLineColor((variant == MagnetVariant::AluminiumWalls) ? kCyan + 1 : kRed + 1);
408-
magnetMotherVol->AddNode(innerWallVol, 1, nullptr);
409-
410-
// Layer 2: Inner vacuum gap
411-
auto vacGap1Vol = new TGeoVolume(Form("MIDVacGap1_%s", variantTag),
412-
new TGeoTube(Form("MIDVacGap1_%s_S", variantTag),
413-
R_inner_wall_outer, R_coil_inner, magnetHalfLength),
414-
assertMedium(Medium::Vacuum));
415-
magnetMotherVol->AddNode(vacGap1Vol, 1, nullptr);
416-
417-
// Layer 3: Winding Pack (NbTi+Cu+Al, density=2.96 g/cm3)
418-
auto coilVol = new TGeoVolume(Form("MIDCoil_%s", variantTag),
419-
new TGeoTube(Form("MIDCoil_%s_S", variantTag),
420-
R_coil_inner, R_coil_outer, magnetHalfLength),
421-
assertMedium(Medium::WindingPack));
422-
coilVol->SetLineColor(kRed);
423-
magnetMotherVol->AddNode(coilVol, 1, nullptr);
424-
425-
// Layer 4: MLI - Multi-Layer Insulation (2mm Al)
426-
auto mliVol = new TGeoVolume(Form("MIDMLI_%s", variantTag),
427-
new TGeoTube(Form("MIDMLI_%s_S", variantTag),
428-
R_mli_inner, R_mli_outer, magnetHalfLength),
429-
assertMedium(Medium::Aluminium));
430-
mliVol->SetLineColor(kYellow);
431-
magnetMotherVol->AddNode(mliVol, 1, nullptr);
432-
433-
// Layer 5: A-5083 Support cylinder (20mm Al)
434-
auto supportVol = new TGeoVolume(Form("MIDCoilSupport_%s", variantTag),
435-
new TGeoTube(Form("MIDCoilSupport_%s_S", variantTag),
436-
R_coil_support_inner, R_coil_support_outer, magnetHalfLength),
437-
assertMedium(Medium::Aluminium));
438-
supportVol->SetLineColor(kBlue - 7);
439-
magnetMotherVol->AddNode(supportVol, 1, nullptr);
440-
441-
// Layer 6: Outer vacuum gap
442-
auto vacGap2Vol = new TGeoVolume(Form("MIDVacGap2_%s", variantTag),
443-
new TGeoTube(Form("MIDVacGap2_%s_S", variantTag),
444-
R_coil_support_outer, R_outer_wall_inner, magnetHalfLength),
445-
assertMedium(Medium::Vacuum));
446-
magnetMotherVol->AddNode(vacGap2Vol, 1, nullptr);
447-
448-
// Layer 7: Outer wall (Al or Fe)
449-
auto outerWallVol = new TGeoVolume(Form("MIDOuterWall_%s", variantTag),
450-
new TGeoTube(Form("MIDOuterWall_%s_S", variantTag),
451-
R_outer_wall_inner, R_cryostat_outer, magnetHalfLength),
452-
assertMedium(wallMedium));
453-
outerWallVol->SetLineColor((variant == MagnetVariant::AluminiumWalls) ? kCyan + 1 : kRed + 1);
454-
magnetMotherVol->AddNode(outerWallVol, 1, nullptr);
455-
}
456-
457347
void createGeometry(TGeoVolume& topVolume)
458348
{
459349
createMaterials();
460350

461-
// Add magnet/cryostat geometry (Francisco Esquivel, June 2026)
462-
printf("[MID] Calling createMagnetGeometry...\n");
463-
createMagnetGeometry(topVolume, MagnetVariant::AluminiumWalls);
464-
printf("[MID] createMagnetGeometry done. Top volume nodes: %d\n", topVolume.GetNdaughters());
465-
466351
// create and place the trigger chambers
467352
for (int iCh = 0; iCh < detparams::NChambers; iCh++) {
468353

Detectors/MUON/MID/Simulation/src/Materials.cxx

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -169,34 +169,6 @@ void createMaterials()
169169
mgr.Mixture(kModuleName, ++imat, "Nomex", aNomex, zNomex, dNomex, -nNomex, wNomex);
170170
mgr.Medium(kModuleName, Medium::Nomex, "Nomex", imat, 0, fieldType, maxField, kMaxfd, kStemax,
171171
kDeemax, kEpsil, kStmin);
172-
/// Iron (pure Fe) - absorber and steel cryostat walls
173-
/// G4 equivalent: G4_Fe, density = 7.874 g/cm3
174-
const float kZIron_pure = 26.;
175-
const float kAIron_pure = 55.845;
176-
const float kDensIron = 7.874;
177-
mgr.Material(kModuleName, ++imat, "Iron", kAIron_pure, kZIron_pure, kDensIron, 0., 0.);
178-
mgr.Medium(kModuleName, Medium::Iron, "Iron", imat, 0, fieldType, maxField,
179-
kMaxfd, kStemax, kDeemax, kEpsil, kStmin);
180-
181-
/// WindingPack - superconducting coil (NbTi + Cu + Al)
182-
/// Mass fractions: NbTi=8.10%, Cu=11.18%, Al=80.72%, density=2.96 g/cm3
183-
const float kZNiobium = 41.;
184-
const float kANiobium = 92.90638;
185-
const float kZTitanium = 22.;
186-
const float kATitanium = 47.867;
187-
const int nWP = 4;
188-
float aWP[nWP] = {kANiobium, kATitanium, kACopper, kAAluminium};
189-
float zWP[nWP] = {kZNiobium, kZTitanium, kZCopper, kZAluminium};
190-
float wWP[nWP] = {0.0405, 0.0405, 0.1118, 0.8072};
191-
float dWP = 2.96;
192-
mgr.Mixture(kModuleName, ++imat, "WindingPack", aWP, zWP, dWP, nWP, wWP);
193-
mgr.Medium(kModuleName, Medium::WindingPack, "WindingPack", imat, 0, fieldType, maxField,
194-
kMaxfd, kStemax, kDeemax, kEpsil, kStmin);
195-
196-
/// Vacuum - thermal insulation gaps inside cryostat
197-
mgr.Material(kModuleName, ++imat, "Vacuum", 1e-16, 1e-16, 1e-16, 0., 0.);
198-
mgr.Medium(kModuleName, Medium::Vacuum, "Vacuum", imat, 0, fieldType, maxField,
199-
kMaxfd, kStemax, kDeemax, kEpsil, kStmin);
200172
}
201173

202174
TGeoMedium* assertMedium(int imed)

Detectors/MUON/MID/Simulation/src/Materials.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@ enum Medium {
3333
Copper,
3434
Mylar,
3535
Styrofoam,
36-
Nomex,
37-
Iron,
38-
WindingPack,
39-
Vacuum
36+
Nomex
4037
};
4138

4239
// Return a pointer to the mid medium number imed.

Detectors/Upgrades/ALICE3/MID/simulation/src/Detector.cxx

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -86,26 +86,6 @@ void Detector::createMaterials()
8686

8787
o2::base::Detector::Mixture(1, "POLYSTYRENE", aPolys, zPolys, dPolys, 2, wPolys);
8888
o2::base::Detector::Medium(1, "POLYSTYRENE", 1, 0, ifield, fieldm, tmaxfdPolys, stemaxPolys, deemaxPolys, epsilPolys, stminPolys);
89-
90-
// Iron (pure Fe) - cryostat walls (Steel variant)
91-
float aIron = 55.845;
92-
float zIron = 26.;
93-
float dIron = 7.874;
94-
o2::base::Detector::Material(2, "IRON", aIron, zIron, dIron, 0., 0.);
95-
o2::base::Detector::Medium(2, "IRON", 2, 0, ifield, fieldm, tmaxfdPolys, stemaxPolys, deemaxPolys, epsilPolys, stminPolys);
96-
97-
// WindingPack - superconducting coil (NbTi + Cu + Al)
98-
// Mass fractions: NbTi=8.10%, Cu=11.18%, Al=80.72%, density=2.96 g/cm3 (Arnaud report v0.2)
99-
float aWP[4] = {92.90638, 47.867, 63.546, 26.982};
100-
float zWP[4] = {41., 22., 29., 13.};
101-
float wWP[4] = {0.0405, 0.0405, 0.1118, 0.8072};
102-
float dWP = 2.96;
103-
o2::base::Detector::Mixture(3, "WINDINGPACK", aWP, zWP, dWP, 4, wWP);
104-
o2::base::Detector::Medium(3, "WINDINGPACK", 3, 0, ifield, fieldm, tmaxfdPolys, stemaxPolys, deemaxPolys, epsilPolys, stminPolys);
105-
106-
// Vacuum - thermal insulation gaps
107-
o2::base::Detector::Material(4, "VACUUM", 1e-16, 1e-16, 1e-16, 0., 0.);
108-
o2::base::Detector::Medium(4, "VACUUM", 4, 0, ifield, fieldm, tmaxfdPolys, stemaxPolys, deemaxPolys, epsilPolys, stminPolys);
10989
}
11090

11191
void Detector::InitializeO2Detector()
@@ -160,46 +140,6 @@ void Detector::createGeometry()
160140
for (auto& layer : mLayers) {
161141
layer.createLayer(vMID);
162142
}
163-
164-
// Superconducting magnet/cryostat geometry
165-
// Port of GEANT4 simulation by Ian Perez Garcia (ICN-UNAM)
166-
// Reference: github.com/IanPG/MID-Geometry-Studies
167-
// Aluminium walls variant: 11 cm total, Rmin=140 cm, Rmax=200 cm, half-length=400 cm
168-
const float kRmin = 140.0f;
169-
const float kRmax = 200.0f;
170-
const float kHalfLen = 400.0f;
171-
const float kWallInner = 2.5f;
172-
const float kWallOuter = 1.5f;
173-
const float kCoilInner = 160.0f;
174-
const float kCoilThick = 4.8f;
175-
const float kMLI = 0.2f;
176-
const float kSupport = 2.0f;
177-
178-
const float kR1 = kRmin + kWallInner;
179-
const float kR2 = kCoilInner;
180-
const float kR3 = kCoilInner + kCoilThick;
181-
const float kR4 = kR3 + kMLI;
182-
const float kR5 = kR4 + kSupport;
183-
const float kR6 = kRmax - kWallOuter;
184-
185-
auto* magnetMother = new TGeoVolume("MI3MagnetMother",
186-
new TGeoTube("MI3MagnetMother_S", kRmin, kRmax, kHalfLen),
187-
gGeoManager->GetMedium("MI3_POLYSTYRENE"));
188-
gGeoManager->GetTopVolume()->AddNode(magnetMother, 1, new TGeoTranslation(0., 0., -1155.));
189-
190-
magnetMother->AddNode(new TGeoVolumeAssembly("MI3InnerWall"), 1, nullptr);
191-
192-
magnetMother->AddNode(new TGeoVolumeAssembly("MI3VacGap1"), 1, nullptr);
193-
194-
magnetMother->AddNode(new TGeoVolumeAssembly("MI3Coil"), 1, nullptr);
195-
196-
magnetMother->AddNode(new TGeoVolumeAssembly("MI3MLI"), 1, nullptr);
197-
198-
magnetMother->AddNode(new TGeoVolumeAssembly("MI3CoilSupport"), 1, nullptr);
199-
200-
magnetMother->AddNode(new TGeoVolumeAssembly("MI3VacGap2"), 1, nullptr);
201-
202-
magnetMother->AddNode(new TGeoVolumeAssembly("MI3OuterWall"), 1, nullptr);
203143
}
204144

205145
void Detector::Reset()

Detectors/Upgrades/ALICE3/Passive/include/Alice3DetectorsPassive/PassiveBaseParam.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace passive
2626

2727
enum MagnetLayout : int {
2828
AluminiumStabilizer = 0,
29-
CopperStabilizer = 1
29+
CopperStabilizer = 1,
30+
WindingPack = 2
3031
};
3132

3233
enum DetLayout : int {

Detectors/Upgrades/ALICE3/Passive/src/Magnet.cxx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ void Alice3Magnet::createMaterials()
9898
matmgr.Medium("ALICE3_MAGNET", 1, "VACUUM", 1, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
9999
matmgr.Medium("ALICE3_MAGNET", 9, "ALUMINIUM", 9, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
100100
matmgr.Medium("ALICE3_MAGNET", 19, "COPPER", 19, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
101+
102+
// WindingPack: NbTi+Cu+Al composite (Arnaud report v0.2)
103+
// Mass fractions: NbTi=8.10% (Nb=4.05%, Ti=4.05%), Cu=11.18%, Al=80.72%
104+
// Density: 2.96 g/cm3
105+
float aWP[4] = {92.90638f, 47.867f, 63.546f, 26.982f};
106+
float zWP[4] = {41.f, 22.f, 29.f, 13.f};
107+
float wWP[4] = {0.0405f, 0.0405f, 0.1118f, 0.8072f};
108+
float dWP = 2.96f;
109+
matmgr.Mixture("ALICE3_MAGNET", 29, "WINDINGPACK", aWP, zWP, dWP, 4, wWP);
110+
matmgr.Medium("ALICE3_MAGNET", 29, "WINDINGPACK", 29, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
101111
}
102112

103113
void Alice3Magnet::ConstructGeometry()
@@ -128,6 +138,7 @@ void Alice3Magnet::ConstructGeometry()
128138
}
129139

130140
bool doCopperStabilizer = false;
141+
bool doWindingPack = false;
131142
switch (passiveBaseParam.mLayout) {
132143
case o2::passive::MagnetLayout::AluminiumStabilizer:
133144
// Handled in the header file
@@ -138,6 +149,10 @@ void Alice3Magnet::ConstructGeometry()
138149
mRestMaterialThickness += 2.2; // cm Add the Copper stabiliser
139150
LOG(debug) << "Alice 3 magnet: using Copper Stabilizer with thickness " << mRestMaterialThickness << " cm";
140151
break;
152+
case o2::passive::MagnetLayout::WindingPack:
153+
doWindingPack = true;
154+
LOG(debug) << "Alice 3 magnet: using WindingPack (NbTi+Cu+Al) coil";
155+
break;
141156
default:
142157
LOG(fatal) << "Unknown magnet layout " << passiveBaseParam.mLayout;
143158
break;
@@ -152,6 +167,7 @@ void Alice3Magnet::ConstructGeometry()
152167
auto& matmgr = o2::base::MaterialManager::Instance();
153168
auto kMedAl = matmgr.getTGeoMedium("ALICE3_MAGNET_ALUMINIUM");
154169
auto kMedCu = matmgr.getTGeoMedium("ALICE3_MAGNET_COPPER");
170+
auto kMedWP = matmgr.getTGeoMedium("ALICE3_MAGNET_WINDINGPACK");
155171
auto kMedVac = matmgr.getTGeoMedium("ALICE3_MAGNET_VACUUM");
156172

157173
// inner wrap
@@ -169,7 +185,7 @@ void Alice3Magnet::ConstructGeometry()
169185

170186
TGeoVolume* innerWrapVol = new TGeoVolume("innerWrap", innerLayer, kMedAl);
171187
TGeoVolume* innerVacuumVol = new TGeoVolume("innerVacuum", innerVacuum, kMedVac);
172-
TGeoVolume* coilsVol = new TGeoVolume("coils", coilsLayer, kMedCu);
188+
TGeoVolume* coilsVol = new TGeoVolume("coils", coilsLayer, doWindingPack ? kMedWP : kMedCu);
173189
TGeoVolume* restMaterialVol = new TGeoVolume("restMaterial", restMaterial, doCopperStabilizer ? kMedCu : kMedAl);
174190
TGeoVolume* outerVacuumVol = new TGeoVolume("outerVacuum", outerVacuum, kMedVac);
175191
TGeoVolume* outerWrapVol = new TGeoVolume("outerWrap", outerLayer, kMedAl);

0 commit comments

Comments
 (0)