Skip to content

Commit 7a9c104

Browse files
authored
ALICE3: Beam pipe update and TRK & FT3 modifications that follow from it (#13106)
* Beam pipe update
1 parent 6e3d030 commit 7a9c104

File tree

8 files changed

+128
-30
lines changed

8 files changed

+128
-30
lines changed

Detectors/Upgrades/ALICE3/FT3/simulation/include/FT3Simulation/Detector.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ class Detector : public o2::base::DetImpl<Detector>
115115
void buildFT3V1();
116116
void buildFT3V3b();
117117
void buildFT3Scoping();
118+
void buildFT3NewVacuumVessel();
118119
void buildFT3FromFile(std::string);
119120

120121
GeometryTGeo* mGeometryTGeo; //! access to geometry details

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

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,78 @@ void Detector::buildFT3V3b()
277277
}
278278
}
279279

280+
void Detector::buildFT3NewVacuumVessel()
281+
{
282+
// Build the FT3 detector according to changes proposed during
283+
// https://indico.cern.ch/event/1407704/
284+
// to adhere to the changes that were presented at the ALICE 3 Upgrade days in March 2024
285+
// Inner radius at C-side to 7 cm
286+
// Inner radius at A-side stays at 5 cm
287+
288+
LOG(info) << "Building FT3 Detector: After Upgrade Days March 2024 version";
289+
290+
mNumberOfLayers = 12;
291+
float sensorThickness = 30.e-4;
292+
float layersx2X0 = 1.e-2;
293+
std::vector<std::array<float, 5>> layersConfigCSide{
294+
{26., .5, 2.5, 0.1f * layersx2X0}, // {z_layer, r_in, r_out, Layerx2X0}
295+
{30., .5, 2.5, 0.1f * layersx2X0},
296+
{34., .5, 2.5, 0.1f * layersx2X0},
297+
{77., 7.0, 35., layersx2X0},
298+
{100., 7.0, 35., layersx2X0},
299+
{122., 7.0, 35., layersx2X0},
300+
{150., 7.0, 68.f, layersx2X0},
301+
{180., 7.0, 68.f, layersx2X0},
302+
{220., 7.0, 68.f, layersx2X0},
303+
{260., 7.0, 68.f, layersx2X0},
304+
{300., 7.0, 68.f, layersx2X0},
305+
{350., 7.0, 68.f, layersx2X0}};
306+
307+
std::vector<std::array<float, 5>> layersConfigASide{
308+
{26., .5, 2.5, 0.1f * layersx2X0}, // {z_layer, r_in, r_out, Layerx2X0}
309+
{30., .5, 2.5, 0.1f * layersx2X0},
310+
{34., .5, 2.5, 0.1f * layersx2X0},
311+
{77., 5.0, 35., layersx2X0},
312+
{100., 5.0, 35., layersx2X0},
313+
{122., 5.0, 35., layersx2X0},
314+
{150., 5.0, 68.f, layersx2X0},
315+
{180., 5.0, 68.f, layersx2X0},
316+
{220., 5.0, 68.f, layersx2X0},
317+
{260., 5.0, 68.f, layersx2X0},
318+
{300., 5.0, 68.f, layersx2X0},
319+
{350., 5.0, 68.f, layersx2X0}};
320+
321+
mLayerName.resize(2);
322+
mLayerName[0].resize(mNumberOfLayers);
323+
mLayerName[1].resize(mNumberOfLayers);
324+
mLayerID.clear();
325+
mLayers.resize(2);
326+
327+
for (auto direction : {0, 1}) {
328+
for (int layerNumber = 0; layerNumber < mNumberOfLayers; layerNumber++) {
329+
std::string directionName = std::to_string(direction);
330+
std::string layerName = GeometryTGeo::getFT3LayerPattern() + directionName + std::string("_") + std::to_string(layerNumber);
331+
mLayerName[direction][layerNumber] = layerName;
332+
float z, rIn, rOut, x0;
333+
if (direction == 0) { // C-Side
334+
z = layersConfigCSide[layerNumber][0];
335+
rIn = layersConfigCSide[layerNumber][1];
336+
rOut = layersConfigCSide[layerNumber][2];
337+
x0 = layersConfigCSide[layerNumber][3];
338+
} else if (direction == 1) { // A-Side
339+
z = layersConfigASide[layerNumber][0];
340+
rIn = layersConfigASide[layerNumber][1];
341+
rOut = layersConfigASide[layerNumber][2];
342+
x0 = layersConfigASide[layerNumber][3];
343+
}
344+
345+
LOG(info) << "Adding Layer " << layerName << " at z = " << z;
346+
// Add layers
347+
auto& thisLayer = mLayers[direction].emplace_back(direction, layerNumber, layerName, z, rIn, rOut, x0);
348+
}
349+
}
350+
}
351+
280352
//_________________________________________________________________________________________________
281353
void Detector::buildFT3Scoping()
282354
{
@@ -342,7 +414,7 @@ Detector::Detector(bool active)
342414
} else {
343415
switch (ft3BaseParam.geoModel) {
344416
case Default:
345-
buildFT3Scoping(); // FT3Scoping
417+
buildFT3NewVacuumVessel(); // FT3 after Upgrade days March 2024
346418
break;
347419
case Telescope:
348420
buildBasicFT3(ft3BaseParam); // BasicFT3 = Parametrized telescopic detector (equidistant layers)

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class Alice3Pipe : public Alice3PassiveBase
3333
const float a3ipLength = 0.f,
3434
const float vacuumVesselRIn = 0.f,
3535
const float vacuumVesselThickness = 0.f,
36-
const float vacuumVesselLength = 0.f);
36+
const float vacuumVesselASideLength = 0.f);
3737

3838
void ConstructGeometry() override;
3939

@@ -48,7 +48,7 @@ class Alice3Pipe : public Alice3PassiveBase
4848
float getVacuumVesselRIn() const { return mVacuumVesselRIn; }
4949
float getVacuumVesselRMax() const { return mVacuumVesselRIn + mVacuumVesselThick; }
5050
float getVacuumVesselWidth() const { return mVacuumVesselThick; }
51-
float getVacuumVesselLength() const { return mVacuumVesselLength; }
51+
float getVacuumVesselLength() const { return mVacuumVesselASideLength; }
5252

5353
bool IsTRKActivated() const { return mIsTRKActivated; }
5454
bool IsFT3Activated() const { return mIsFT3Activated; }
@@ -64,7 +64,7 @@ class Alice3Pipe : public Alice3PassiveBase
6464

6565
float mVacuumVesselRIn = 0.; // inner diameter of the vacuum vessel
6666
float mVacuumVesselThick = 0.; // outer beam pipe section thickness
67-
float mVacuumVesselLength = 0.; // half length of the outer beampipe around the IP
67+
float mVacuumVesselASideLength = 0.; // Length of the A Side of the vacuum vessel around the IP
6868

6969
bool mIsTRKActivated = true; // If TRK is not active don't create TRK layers allocations in the vacuum volume
7070
bool mIsFT3Activated = true;

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

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ Alice3Pipe::Alice3Pipe(const char* name,
3838
float a3ipLength,
3939
float vacuumVesselRIn,
4040
float vacuumVesselThickness,
41-
float vacuumVesselLength)
41+
float vacuumVesselASideLength)
4242
: Alice3PassiveBase{name, title},
4343
mIsTRKActivated{isTRKActivated},
4444
mIsFT3Activated{isFT3Activated},
@@ -47,7 +47,7 @@ Alice3Pipe::Alice3Pipe(const char* name,
4747
mA3IPLength{a3ipLength},
4848
mVacuumVesselRIn{vacuumVesselRIn},
4949
mVacuumVesselThick{vacuumVesselThickness},
50-
mVacuumVesselLength{vacuumVesselLength}
50+
mVacuumVesselASideLength{vacuumVesselASideLength}
5151
{
5252
}
5353

@@ -95,19 +95,24 @@ void Alice3Pipe::ConstructGeometry()
9595
}
9696

9797
// We split the naming of the parts if the beam pipe for ALICE 3 into parts
98-
// - pipe
99-
// - vacuum vessel (which hosts the primary vacuum)
98+
// - pipe A Side
99+
// - vacuum vessel (which hosts the primary vacuum and covers all C Side as well)
100100
// - iris vacuum vessel (which hosts the secondary vacuum)
101101

102102
// A3IP update
103103
// Vacuum
104+
Double_t pipeASideLength = mA3IPLength / 2. - mVacuumVesselThick - mVacuumVesselASideLength;
105+
Double_t pipeCSideLength = mA3IPLength / 2. + mVacuumVesselASideLength;
104106
TGeoTube* vacuumBasePipe = new TGeoTube("PIPEVACUUM_BASEsh", 0., mPipeRIn, mA3IPLength / 2.);
105-
TGeoTube* vacuumBaseVacuumVessel = new TGeoTube("VACUUM_VESSELVACUUM_BASEsh", mPipeRIn, mVacuumVesselRIn, mVacuumVesselLength / 2.);
107+
TGeoTube* vacuumBaseVacuumVessel = new TGeoTube("VACUUM_VESSELVACUUM_BASEsh", mPipeRIn, mVacuumVesselRIn, pipeCSideLength / 2.);
108+
109+
TGeoTranslation* posPipeCSide = new TGeoTranslation("PIPE_CSIDE_POSITION", 0, 0, mVacuumVesselASideLength - pipeCSideLength / 2.);
110+
posPipeCSide->RegisterYourself();
106111
// Excavate volumes from the vacuum such that there is place for the TRK barrel layers and FT3 disc layers of the IRIS tracker
107112
// And the other passive shapes: coldplate, iris tracker vacuum vessel
108113
TGeoCompositeShape* vacuumComposite;
109114
TGeoVolume* vacuumVolume;
110-
TString compositeFormula{"PIPEVACUUM_BASEsh+VACUUM_VESSELVACUUM_BASEsh"};
115+
TString compositeFormula{"PIPEVACUUM_BASEsh+VACUUM_VESSELVACUUM_BASEsh:PIPE_CSIDE_POSITION"};
111116
TString subtractorsFormula;
112117

113118
if (!mIsTRKActivated) {
@@ -183,28 +188,21 @@ void Alice3Pipe::ConstructGeometry()
183188
}
184189

185190
// Pipe tubes
186-
Double_t pipeLengthHalf = mA3IPLength / 2. - mVacuumVesselThick - mVacuumVesselLength / 2.;
187-
TGeoTube* pipe = new TGeoTube("PIPEsh", mPipeRIn, mPipeRIn + mPipeThick, pipeLengthHalf / 2.);
188-
TGeoTube* vacuumVesselTube = new TGeoTube("VACUUM_VESSEL_TUBEsh", mVacuumVesselRIn, mVacuumVesselRIn + mVacuumVesselThick, mVacuumVesselLength / 2.);
191+
TGeoTube* pipeASide = new TGeoTube("PIPE_Ash", mPipeRIn, mPipeRIn + mPipeThick, pipeASideLength / 2.);
192+
TGeoTube* pipeCSide = new TGeoTube("PIPE_Csh", mVacuumVesselRIn, mVacuumVesselRIn + mVacuumVesselThick, pipeCSideLength / 2.);
189193
TGeoTube* vacuumVesselWall = new TGeoTube("VACUUM_VESSEL_WALLsh", mPipeRIn, mVacuumVesselRIn + mVacuumVesselThick, mVacuumVesselThick / 2.);
190194

191195
// Pipe and vacuum vessel positions
192-
TGeoTranslation* posVacuumVesselWallNegZSide = new TGeoTranslation("WALLNEGZ", 0, 0, -mVacuumVesselLength / 2. - mVacuumVesselThick / 2.);
193-
posVacuumVesselWallNegZSide->RegisterYourself();
194-
TGeoTranslation* posVacuumVesselWallPosZSide = new TGeoTranslation("WALLPOSZ", 0, 0, mVacuumVesselLength / 2. + mVacuumVesselThick / 2.);
195-
posVacuumVesselWallPosZSide->RegisterYourself();
196-
TGeoTranslation* posPipeNegZSide = new TGeoTranslation("PIPENEGZ", 0, 0, -mVacuumVesselLength / 2. - mVacuumVesselThick - pipeLengthHalf / 2.);
197-
posPipeNegZSide->RegisterYourself();
198-
TGeoTranslation* posPipePosZSide = new TGeoTranslation("PIPEPOSZ", 0, 0, mVacuumVesselLength / 2. + mVacuumVesselThick + pipeLengthHalf / 2.);
199-
posPipePosZSide->RegisterYourself();
196+
TGeoTranslation* posVacuumVesselWall = new TGeoTranslation("WALL_POSITION", 0, 0, mVacuumVesselASideLength + mVacuumVesselThick / 2.);
197+
posVacuumVesselWall->RegisterYourself();
198+
TGeoTranslation* posPipeASide = new TGeoTranslation("PIPE_ASIDE_POSITION", 0, 0, mVacuumVesselASideLength + mVacuumVesselThick + pipeASideLength / 2.);
199+
posPipeASide->RegisterYourself();
200200

201201
// Pipe composite shape and volume
202202
TString pipeCompositeFormula =
203-
"VACUUM_VESSEL_WALLsh:WALLNEGZ"
204-
"+VACUUM_VESSEL_WALLsh:WALLPOSZ"
205-
"+VACUUM_VESSEL_TUBEsh"
206-
"+PIPEsh:PIPEPOSZ"
207-
"+PIPEsh:PIPENEGZ";
203+
"VACUUM_VESSEL_WALLsh:WALL_POSITION"
204+
"+PIPE_Ash:PIPE_ASIDE_POSITION"
205+
"+PIPE_Csh:PIPE_CSIDE_POSITION";
208206

209207
if (subtractorsFormula.Length()) {
210208
LOG(info) << "Subtractors formula before : " << subtractorsFormula;

Detectors/Upgrades/ALICE3/TRK/simulation/include/TRKSimulation/Detector.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class Detector : public o2::base::DetImpl<Detector>
6161
}
6262

6363
void configDefault();
64+
void buildTRKNewVacuumVessel();
6465
void configFromFile(std::string fileName = "alice3_TRK_layout.txt");
6566
void configToFile(std::string fileName = "alice3_TRK_layout.txt");
6667

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

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ Detector::Detector(bool active)
4848
if (trkPars.configFile != "") {
4949
configFromFile(trkPars.configFile);
5050
} else {
51-
configDefault();
51+
buildTRKNewVacuumVessel();
5252
configToFile();
5353
configServices();
5454
}
@@ -74,9 +74,12 @@ void Detector::ConstructGeometry()
7474

7575
void Detector::configDefault()
7676
{
77+
78+
// Build TRK detector according to the scoping document
79+
7780
mLayers.clear();
7881

79-
LOGP(warning, "Loading default configuration for ALICE3 TRK");
82+
LOGP(warning, "Loading Scoping Document configuration for ALICE3 TRK");
8083
mLayers.emplace_back(0, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(0)}, 0.5f, 50.f, 100.e-4);
8184
mLayers.emplace_back(1, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(1)}, 1.2f, 50.f, 100.e-4);
8285
mLayers.emplace_back(2, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(2)}, 2.5f, 50.f, 100.e-4);
@@ -90,6 +93,29 @@ void Detector::configDefault()
9093
mLayers.emplace_back(10, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(10)}, 80.f, 258.f, 100.e-3);
9194
}
9295

96+
void Detector::buildTRKNewVacuumVessel()
97+
{
98+
// Build the TRK detector according to changes proposed during
99+
// https://indico.cern.ch/event/1407704/
100+
// to adhere to the changes that were presented at the ALICE 3 Upgrade days in March 2024
101+
// L3 -> 7 cm, L4 -> 9 cm
102+
103+
mLayers.clear();
104+
105+
LOGP(warning, "Loading \"After Upgrade Days March 2024\" configuration for ALICE3 TRK");
106+
mLayers.emplace_back(0, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(0)}, 0.5f, 50.f, 100.e-4);
107+
mLayers.emplace_back(1, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(1)}, 1.2f, 50.f, 100.e-4);
108+
mLayers.emplace_back(2, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(2)}, 2.5f, 50.f, 100.e-4);
109+
mLayers.emplace_back(3, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(3)}, 7.f, 124.f, 100.e-3);
110+
mLayers.emplace_back(4, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(4)}, 9.f, 124.f, 100.e-3);
111+
mLayers.emplace_back(5, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(5)}, 12.f, 124.f, 100.e-3);
112+
mLayers.emplace_back(6, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(6)}, 20.f, 124.f, 100.e-3);
113+
mLayers.emplace_back(7, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(7)}, 30.f, 124.f, 100.e-3);
114+
mLayers.emplace_back(8, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(8)}, 45.f, 258.f, 100.e-3);
115+
mLayers.emplace_back(9, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(9)}, 60.f, 258.f, 100.e-3);
116+
mLayers.emplace_back(10, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(10)}, 80.f, 258.f, 100.e-3);
117+
}
118+
93119
void Detector::configFromFile(std::string fileName)
94120
{
95121
// Override the default geometry if config file provided

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ void TRKServices::createMiddleServices(TGeoVolume* motherVolume)
316316
motherVolume->AddNode(middleBarrelCoolingH2OVolume, 1, combiTrans);
317317
}
318318
// Middle barrel connection disks
319-
const float rMinMiddleBarrelDisk = 3.78f;
319+
const float rMinMiddleBarrelDisk = 5.68f;
320320
const float rMaxMiddleBarrelDisk = 35.f;
321321
const float zLengthMiddleBarrel = 62.f;
322322
for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {

macro/build_geometry.C

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ void build_geometry(FairRunSim* run = nullptr)
165165
#ifdef ENABLE_UPGRADES
166166
// upgraded beampipe at the interaction point (IP)
167167
if (isActivated("A3IP")) {
168-
run->AddModule(new o2::passive::Alice3Pipe("A3IP", "Alice 3 beam pipe", !isActivated("TRK"), !isActivated("FT3"), 1.8f, 0.08f, 1000.f, 3.7f, 0.08f, 76.f));
168+
run->AddModule(new o2::passive::Alice3Pipe("A3IP", "Alice 3 beam pipe", !isActivated("TRK"), !isActivated("FT3"), 1.8f, 0.08f, 1000.f, 5.6f, 0.08f, 76.f));
169169
}
170170

171171
// the absorber

0 commit comments

Comments
 (0)