diff --git a/Detectors/Upgrades/ALICE3/FT3/simulation/include/FT3Simulation/Detector.h b/Detectors/Upgrades/ALICE3/FT3/simulation/include/FT3Simulation/Detector.h index ec735a66f4390..a88ea5a351ad2 100644 --- a/Detectors/Upgrades/ALICE3/FT3/simulation/include/FT3Simulation/Detector.h +++ b/Detectors/Upgrades/ALICE3/FT3/simulation/include/FT3Simulation/Detector.h @@ -115,6 +115,7 @@ class Detector : public o2::base::DetImpl void buildFT3V1(); void buildFT3V3b(); void buildFT3Scoping(); + void buildFT3NewVacuumVessel(); void buildFT3FromFile(std::string); GeometryTGeo* mGeometryTGeo; //! access to geometry details diff --git a/Detectors/Upgrades/ALICE3/FT3/simulation/src/Detector.cxx b/Detectors/Upgrades/ALICE3/FT3/simulation/src/Detector.cxx index 625f2b28182c5..296bec8aa8922 100644 --- a/Detectors/Upgrades/ALICE3/FT3/simulation/src/Detector.cxx +++ b/Detectors/Upgrades/ALICE3/FT3/simulation/src/Detector.cxx @@ -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> 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> 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() { @@ -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) diff --git a/Detectors/Upgrades/ALICE3/Passive/include/Alice3DetectorsPassive/Pipe.h b/Detectors/Upgrades/ALICE3/Passive/include/Alice3DetectorsPassive/Pipe.h index 47b803c1bcbd1..1d9858e2dfec3 100644 --- a/Detectors/Upgrades/ALICE3/Passive/include/Alice3DetectorsPassive/Pipe.h +++ b/Detectors/Upgrades/ALICE3/Passive/include/Alice3DetectorsPassive/Pipe.h @@ -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; @@ -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; } @@ -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; diff --git a/Detectors/Upgrades/ALICE3/Passive/src/Pipe.cxx b/Detectors/Upgrades/ALICE3/Passive/src/Pipe.cxx index f7f4c1844f7df..57f30241bd4ff 100644 --- a/Detectors/Upgrades/ALICE3/Passive/src/Pipe.cxx +++ b/Detectors/Upgrades/ALICE3/Passive/src/Pipe.cxx @@ -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}, @@ -47,7 +47,7 @@ Alice3Pipe::Alice3Pipe(const char* name, mA3IPLength{a3ipLength}, mVacuumVesselRIn{vacuumVesselRIn}, mVacuumVesselThick{vacuumVesselThickness}, - mVacuumVesselLength{vacuumVesselLength} + mVacuumVesselASideLength{vacuumVesselASideLength} { } @@ -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) { @@ -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; diff --git a/Detectors/Upgrades/ALICE3/TRK/simulation/include/TRKSimulation/Detector.h b/Detectors/Upgrades/ALICE3/TRK/simulation/include/TRKSimulation/Detector.h index ec516ecc8aa2a..47a48167e0562 100644 --- a/Detectors/Upgrades/ALICE3/TRK/simulation/include/TRKSimulation/Detector.h +++ b/Detectors/Upgrades/ALICE3/TRK/simulation/include/TRKSimulation/Detector.h @@ -61,6 +61,7 @@ class Detector : public o2::base::DetImpl } void configDefault(); + void buildTRKNewVacuumVessel(); void configFromFile(std::string fileName = "alice3_TRK_layout.txt"); void configToFile(std::string fileName = "alice3_TRK_layout.txt"); diff --git a/Detectors/Upgrades/ALICE3/TRK/simulation/src/Detector.cxx b/Detectors/Upgrades/ALICE3/TRK/simulation/src/Detector.cxx index db326eba84091..d6c4613b6b589 100644 --- a/Detectors/Upgrades/ALICE3/TRK/simulation/src/Detector.cxx +++ b/Detectors/Upgrades/ALICE3/TRK/simulation/src/Detector.cxx @@ -48,7 +48,7 @@ Detector::Detector(bool active) if (trkPars.configFile != "") { configFromFile(trkPars.configFile); } else { - configDefault(); + buildTRKNewVacuumVessel(); configToFile(); configServices(); } @@ -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); @@ -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 diff --git a/Detectors/Upgrades/ALICE3/TRK/simulation/src/TRKServices.cxx b/Detectors/Upgrades/ALICE3/TRK/simulation/src/TRKServices.cxx index a9ea634777037..7937e3b4de09a 100644 --- a/Detectors/Upgrades/ALICE3/TRK/simulation/src/TRKServices.cxx +++ b/Detectors/Upgrades/ALICE3/TRK/simulation/src/TRKServices.cxx @@ -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}) { diff --git a/macro/build_geometry.C b/macro/build_geometry.C index 3b33f3c3ddfee..3712f6bf85a93 100644 --- a/macro/build_geometry.C +++ b/macro/build_geometry.C @@ -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