Skip to content

Commit

Permalink
ALICE3: Beam pipe update and TRK & FT3 modifications that follow from…
Browse files Browse the repository at this point in the history
… it (AliceO2Group#13106)

* Beam pipe update
  • Loading branch information
Cas1997 authored May 3, 2024
1 parent 6e3d030 commit 7a9c104
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ class Detector : public o2::base::DetImpl<Detector>
void buildFT3V1();
void buildFT3V3b();
void buildFT3Scoping();
void buildFT3NewVacuumVessel();
void buildFT3FromFile(std::string);

GeometryTGeo* mGeometryTGeo; //! access to geometry details
Expand Down
74 changes: 73 additions & 1 deletion Detectors/Upgrades/ALICE3/FT3/simulation/src/Detector.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,78 @@ void Detector::buildFT3V3b()
}
}

void Detector::buildFT3NewVacuumVessel()
{
// Build the FT3 detector according to changes proposed during
// https://indico.cern.ch/event/1407704/
// to adhere to the changes that were presented at the ALICE 3 Upgrade days in March 2024
// Inner radius at C-side to 7 cm
// Inner radius at A-side stays at 5 cm

LOG(info) << "Building FT3 Detector: After Upgrade Days March 2024 version";

mNumberOfLayers = 12;
float sensorThickness = 30.e-4;
float layersx2X0 = 1.e-2;
std::vector<std::array<float, 5>> layersConfigCSide{
{26., .5, 2.5, 0.1f * layersx2X0}, // {z_layer, r_in, r_out, Layerx2X0}
{30., .5, 2.5, 0.1f * layersx2X0},
{34., .5, 2.5, 0.1f * layersx2X0},
{77., 7.0, 35., layersx2X0},
{100., 7.0, 35., layersx2X0},
{122., 7.0, 35., layersx2X0},
{150., 7.0, 68.f, layersx2X0},
{180., 7.0, 68.f, layersx2X0},
{220., 7.0, 68.f, layersx2X0},
{260., 7.0, 68.f, layersx2X0},
{300., 7.0, 68.f, layersx2X0},
{350., 7.0, 68.f, layersx2X0}};

std::vector<std::array<float, 5>> layersConfigASide{
{26., .5, 2.5, 0.1f * layersx2X0}, // {z_layer, r_in, r_out, Layerx2X0}
{30., .5, 2.5, 0.1f * layersx2X0},
{34., .5, 2.5, 0.1f * layersx2X0},
{77., 5.0, 35., layersx2X0},
{100., 5.0, 35., layersx2X0},
{122., 5.0, 35., layersx2X0},
{150., 5.0, 68.f, layersx2X0},
{180., 5.0, 68.f, layersx2X0},
{220., 5.0, 68.f, layersx2X0},
{260., 5.0, 68.f, layersx2X0},
{300., 5.0, 68.f, layersx2X0},
{350., 5.0, 68.f, layersx2X0}};

mLayerName.resize(2);
mLayerName[0].resize(mNumberOfLayers);
mLayerName[1].resize(mNumberOfLayers);
mLayerID.clear();
mLayers.resize(2);

for (auto direction : {0, 1}) {
for (int layerNumber = 0; layerNumber < mNumberOfLayers; layerNumber++) {
std::string directionName = std::to_string(direction);
std::string layerName = GeometryTGeo::getFT3LayerPattern() + directionName + std::string("_") + std::to_string(layerNumber);
mLayerName[direction][layerNumber] = layerName;
float z, rIn, rOut, x0;
if (direction == 0) { // C-Side
z = layersConfigCSide[layerNumber][0];
rIn = layersConfigCSide[layerNumber][1];
rOut = layersConfigCSide[layerNumber][2];
x0 = layersConfigCSide[layerNumber][3];
} else if (direction == 1) { // A-Side
z = layersConfigASide[layerNumber][0];
rIn = layersConfigASide[layerNumber][1];
rOut = layersConfigASide[layerNumber][2];
x0 = layersConfigASide[layerNumber][3];
}

LOG(info) << "Adding Layer " << layerName << " at z = " << z;
// Add layers
auto& thisLayer = mLayers[direction].emplace_back(direction, layerNumber, layerName, z, rIn, rOut, x0);
}
}
}

//_________________________________________________________________________________________________
void Detector::buildFT3Scoping()
{
Expand Down Expand Up @@ -342,7 +414,7 @@ Detector::Detector(bool active)
} else {
switch (ft3BaseParam.geoModel) {
case Default:
buildFT3Scoping(); // FT3Scoping
buildFT3NewVacuumVessel(); // FT3 after Upgrade days March 2024
break;
case Telescope:
buildBasicFT3(ft3BaseParam); // BasicFT3 = Parametrized telescopic detector (equidistant layers)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class Alice3Pipe : public Alice3PassiveBase
const float a3ipLength = 0.f,
const float vacuumVesselRIn = 0.f,
const float vacuumVesselThickness = 0.f,
const float vacuumVesselLength = 0.f);
const float vacuumVesselASideLength = 0.f);

void ConstructGeometry() override;

Expand All @@ -48,7 +48,7 @@ class Alice3Pipe : public Alice3PassiveBase
float getVacuumVesselRIn() const { return mVacuumVesselRIn; }
float getVacuumVesselRMax() const { return mVacuumVesselRIn + mVacuumVesselThick; }
float getVacuumVesselWidth() const { return mVacuumVesselThick; }
float getVacuumVesselLength() const { return mVacuumVesselLength; }
float getVacuumVesselLength() const { return mVacuumVesselASideLength; }

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

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

bool mIsTRKActivated = true; // If TRK is not active don't create TRK layers allocations in the vacuum volume
bool mIsFT3Activated = true;
Expand Down
42 changes: 20 additions & 22 deletions Detectors/Upgrades/ALICE3/Passive/src/Pipe.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Alice3Pipe::Alice3Pipe(const char* name,
float a3ipLength,
float vacuumVesselRIn,
float vacuumVesselThickness,
float vacuumVesselLength)
float vacuumVesselASideLength)
: Alice3PassiveBase{name, title},
mIsTRKActivated{isTRKActivated},
mIsFT3Activated{isFT3Activated},
Expand All @@ -47,7 +47,7 @@ Alice3Pipe::Alice3Pipe(const char* name,
mA3IPLength{a3ipLength},
mVacuumVesselRIn{vacuumVesselRIn},
mVacuumVesselThick{vacuumVesselThickness},
mVacuumVesselLength{vacuumVesselLength}
mVacuumVesselASideLength{vacuumVesselASideLength}
{
}

Expand Down Expand Up @@ -95,19 +95,24 @@ void Alice3Pipe::ConstructGeometry()
}

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

// A3IP update
// Vacuum
Double_t pipeASideLength = mA3IPLength / 2. - mVacuumVesselThick - mVacuumVesselASideLength;
Double_t pipeCSideLength = mA3IPLength / 2. + mVacuumVesselASideLength;
TGeoTube* vacuumBasePipe = new TGeoTube("PIPEVACUUM_BASEsh", 0., mPipeRIn, mA3IPLength / 2.);
TGeoTube* vacuumBaseVacuumVessel = new TGeoTube("VACUUM_VESSELVACUUM_BASEsh", mPipeRIn, mVacuumVesselRIn, mVacuumVesselLength / 2.);
TGeoTube* vacuumBaseVacuumVessel = new TGeoTube("VACUUM_VESSELVACUUM_BASEsh", mPipeRIn, mVacuumVesselRIn, pipeCSideLength / 2.);

TGeoTranslation* posPipeCSide = new TGeoTranslation("PIPE_CSIDE_POSITION", 0, 0, mVacuumVesselASideLength - pipeCSideLength / 2.);
posPipeCSide->RegisterYourself();
// Excavate volumes from the vacuum such that there is place for the TRK barrel layers and FT3 disc layers of the IRIS tracker
// And the other passive shapes: coldplate, iris tracker vacuum vessel
TGeoCompositeShape* vacuumComposite;
TGeoVolume* vacuumVolume;
TString compositeFormula{"PIPEVACUUM_BASEsh+VACUUM_VESSELVACUUM_BASEsh"};
TString compositeFormula{"PIPEVACUUM_BASEsh+VACUUM_VESSELVACUUM_BASEsh:PIPE_CSIDE_POSITION"};
TString subtractorsFormula;

if (!mIsTRKActivated) {
Expand Down Expand Up @@ -183,28 +188,21 @@ void Alice3Pipe::ConstructGeometry()
}

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

// Pipe and vacuum vessel positions
TGeoTranslation* posVacuumVesselWallNegZSide = new TGeoTranslation("WALLNEGZ", 0, 0, -mVacuumVesselLength / 2. - mVacuumVesselThick / 2.);
posVacuumVesselWallNegZSide->RegisterYourself();
TGeoTranslation* posVacuumVesselWallPosZSide = new TGeoTranslation("WALLPOSZ", 0, 0, mVacuumVesselLength / 2. + mVacuumVesselThick / 2.);
posVacuumVesselWallPosZSide->RegisterYourself();
TGeoTranslation* posPipeNegZSide = new TGeoTranslation("PIPENEGZ", 0, 0, -mVacuumVesselLength / 2. - mVacuumVesselThick - pipeLengthHalf / 2.);
posPipeNegZSide->RegisterYourself();
TGeoTranslation* posPipePosZSide = new TGeoTranslation("PIPEPOSZ", 0, 0, mVacuumVesselLength / 2. + mVacuumVesselThick + pipeLengthHalf / 2.);
posPipePosZSide->RegisterYourself();
TGeoTranslation* posVacuumVesselWall = new TGeoTranslation("WALL_POSITION", 0, 0, mVacuumVesselASideLength + mVacuumVesselThick / 2.);
posVacuumVesselWall->RegisterYourself();
TGeoTranslation* posPipeASide = new TGeoTranslation("PIPE_ASIDE_POSITION", 0, 0, mVacuumVesselASideLength + mVacuumVesselThick + pipeASideLength / 2.);
posPipeASide->RegisterYourself();

// Pipe composite shape and volume
TString pipeCompositeFormula =
"VACUUM_VESSEL_WALLsh:WALLNEGZ"
"+VACUUM_VESSEL_WALLsh:WALLPOSZ"
"+VACUUM_VESSEL_TUBEsh"
"+PIPEsh:PIPEPOSZ"
"+PIPEsh:PIPENEGZ";
"VACUUM_VESSEL_WALLsh:WALL_POSITION"
"+PIPE_Ash:PIPE_ASIDE_POSITION"
"+PIPE_Csh:PIPE_CSIDE_POSITION";

if (subtractorsFormula.Length()) {
LOG(info) << "Subtractors formula before : " << subtractorsFormula;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class Detector : public o2::base::DetImpl<Detector>
}

void configDefault();
void buildTRKNewVacuumVessel();
void configFromFile(std::string fileName = "alice3_TRK_layout.txt");
void configToFile(std::string fileName = "alice3_TRK_layout.txt");

Expand Down
30 changes: 28 additions & 2 deletions Detectors/Upgrades/ALICE3/TRK/simulation/src/Detector.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ Detector::Detector(bool active)
if (trkPars.configFile != "") {
configFromFile(trkPars.configFile);
} else {
configDefault();
buildTRKNewVacuumVessel();
configToFile();
configServices();
}
Expand All @@ -74,9 +74,12 @@ void Detector::ConstructGeometry()

void Detector::configDefault()
{

// Build TRK detector according to the scoping document

mLayers.clear();

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

void Detector::buildTRKNewVacuumVessel()
{
// Build the TRK detector according to changes proposed during
// https://indico.cern.ch/event/1407704/
// to adhere to the changes that were presented at the ALICE 3 Upgrade days in March 2024
// L3 -> 7 cm, L4 -> 9 cm

mLayers.clear();

LOGP(warning, "Loading \"After Upgrade Days March 2024\" configuration for ALICE3 TRK");
mLayers.emplace_back(0, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(0)}, 0.5f, 50.f, 100.e-4);
mLayers.emplace_back(1, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(1)}, 1.2f, 50.f, 100.e-4);
mLayers.emplace_back(2, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(2)}, 2.5f, 50.f, 100.e-4);
mLayers.emplace_back(3, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(3)}, 7.f, 124.f, 100.e-3);
mLayers.emplace_back(4, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(4)}, 9.f, 124.f, 100.e-3);
mLayers.emplace_back(5, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(5)}, 12.f, 124.f, 100.e-3);
mLayers.emplace_back(6, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(6)}, 20.f, 124.f, 100.e-3);
mLayers.emplace_back(7, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(7)}, 30.f, 124.f, 100.e-3);
mLayers.emplace_back(8, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(8)}, 45.f, 258.f, 100.e-3);
mLayers.emplace_back(9, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(9)}, 60.f, 258.f, 100.e-3);
mLayers.emplace_back(10, std::string{GeometryTGeo::getTRKLayerPattern() + std::to_string(10)}, 80.f, 258.f, 100.e-3);
}

void Detector::configFromFile(std::string fileName)
{
// Override the default geometry if config file provided
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ void TRKServices::createMiddleServices(TGeoVolume* motherVolume)
motherVolume->AddNode(middleBarrelCoolingH2OVolume, 1, combiTrans);
}
// Middle barrel connection disks
const float rMinMiddleBarrelDisk = 3.78f;
const float rMinMiddleBarrelDisk = 5.68f;
const float rMaxMiddleBarrelDisk = 35.f;
const float zLengthMiddleBarrel = 62.f;
for (auto& orientation : {Orientation::kASide, Orientation::kCSide}) {
Expand Down
2 changes: 1 addition & 1 deletion macro/build_geometry.C
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ void build_geometry(FairRunSim* run = nullptr)
#ifdef ENABLE_UPGRADES
// upgraded beampipe at the interaction point (IP)
if (isActivated("A3IP")) {
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));
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));
}

// the absorber
Expand Down

0 comments on commit 7a9c104

Please sign in to comment.