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
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