Skip to content

Commit 895906e

Browse files
mario6829shahor02
authored andcommitted
Implementation of MFT rails inside Cage
1 parent 073cd16 commit 895906e

File tree

2 files changed

+167
-0
lines changed

2 files changed

+167
-0
lines changed

Detectors/ITSMFT/ITS/simulation/include/ITSSimulation/V3Cage.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,16 @@ class V3Cage : public V11Geometry
113113
/// \param mgr The GeoManager (used only to get the proper material)
114114
TGeoVolume* createCageClosingCross(const TGeoManager* mgr = gGeoManager);
115115

116+
/// Creates and places the MFT rails inside the Cage
117+
/// \param mother The mother volume to place the rails into
118+
/// \param mgr The GeoManager (used only to get the proper material)
119+
void createAndPlaceMFTRailsInsideCage(TGeoVolume* mother, const TGeoManager* mgr = gGeoManager);
120+
121+
/// Creates a pair of MFT rails inside the Cage
122+
/// \param motmed Medium material of the mother volume
123+
/// \param mgr The GeoManager (used only to get the proper material)
124+
TGeoVolume* createMFTRailsPair(const TGeoMedium* motmed, const TGeoManager* mgr = gGeoManager);
125+
116126
// Parameters
117127
static const Double_t sCageYInBarrel; ///< Global Y translation
118128

@@ -244,6 +254,17 @@ class V3Cage : public V11Geometry
244254
static const Double_t sCageCrossBarThick; ///< Closing cross bar thickness
245255
static const Double_t sCageCrossBarPhi; ///< Closing cross bar angle
246256

257+
// MFT Rails inside the Cage
258+
static const Double_t sCageMFTRailZLen; ///< Total length of the rail
259+
static const Double_t sCageMFTRailTotWidth; ///< Total width of the rail
260+
static const Double_t sCageMFTRailExtWidth; ///< Width of the external part
261+
static const Double_t sCageMFTRailIntWidth; ///< Width of the internal part
262+
static const Double_t sCageMFTRailBaseWidth; ///< Width of the rail base
263+
static const Double_t sCageMFTRailTotHeight; ///< Total height of the rail
264+
static const Double_t sCageMFTRailExtHeight; ///< Height of the external part
265+
static const Double_t sCageMFTRailIntHeight; ///< Height of the internal part
266+
static const Double_t sCageMFTRailsXDist; ///< X distance between rails
267+
247268
ClassDefOverride(V3Cage, 0); // ITS v3 support geometry
248269
};
249270
} // namespace its

Detectors/ITSMFT/ITS/simulation/src/V3Cage.cxx

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,16 @@ const Double_t V3Cage::sCageCrossZLength = 8 * sMm;
167167
const Double_t V3Cage::sCageCrossBarThick = 20 * sMm;
168168
const Double_t V3Cage::sCageCrossBarPhi = 25; // Deg
169169

170+
const Double_t V3Cage::sCageMFTRailZLen = 1807 * sMm;
171+
const Double_t V3Cage::sCageMFTRailTotWidth = 27 * sMm;
172+
const Double_t V3Cage::sCageMFTRailExtWidth = 24 * sMm;
173+
const Double_t V3Cage::sCageMFTRailIntWidth = 17.5 * sMm;
174+
const Double_t V3Cage::sCageMFTRailBaseWidth = 22 * sMm;
175+
const Double_t V3Cage::sCageMFTRailTotHeight = 8.9 * sMm;
176+
const Double_t V3Cage::sCageMFTRailExtHeight = 5.9 * sMm;
177+
const Double_t V3Cage::sCageMFTRailIntHeight = 3.5 * sMm;
178+
const Double_t V3Cage::sCageMFTRailsXDist = 44 * sMm;
179+
170180
ClassImp(V3Cage);
171181

172182
V3Cage::V3Cage()
@@ -251,6 +261,9 @@ void V3Cage::createAndPlaceCage(TGeoVolume* mother, const TGeoManager* mgr)
251261
zpos = sBPSuppZPos + sBPSuppCollarBeamWid / 2;
252262
mother->AddNode(cageBPSupport, 1, new TGeoTranslation(0, ypos, zpos));
253263

264+
// The MFT Rails inside the Cage
265+
createAndPlaceMFTRailsInsideCage(mother, mgr);
266+
254267
return;
255268
}
256269

@@ -1648,3 +1661,136 @@ TGeoVolume* V3Cage::createCageClosingCross(const TGeoManager* mgr)
16481661
// Finally return the closing cross volume
16491662
return closCrossVol;
16501663
}
1664+
1665+
void V3Cage::createAndPlaceMFTRailsInsideCage(TGeoVolume* mother, const TGeoManager* mgr)
1666+
{
1667+
//
1668+
// Creates the MFT Rails located inside the Cage and place them
1669+
//
1670+
// Input:
1671+
// motmat : the material of the mother volume (for the container box)
1672+
// mgr : the GeoManager (used only to get the proper material)
1673+
//
1674+
// Output:
1675+
//
1676+
// Return:
1677+
//
1678+
// Created: 10 May 2025 Mario Sitta
1679+
//
1680+
1681+
// Local variables
1682+
Double_t rdist, rpos, xpos, ypos, alpha;
1683+
Double_t xbox, ybox;
1684+
1685+
// Create a pair of rails (a BBox container is returned)
1686+
TGeoVolume* cageMFTRails = createMFTRailsPair(mother->GetMedium(), mgr);
1687+
1688+
// Now compute the radial distance and the XY position of the box
1689+
xbox = (static_cast<TGeoBBox*>(cageMFTRails->GetShape()))->GetDX();
1690+
ybox = (static_cast<TGeoBBox*>(cageMFTRails->GetShape()))->GetDY();
1691+
1692+
rdist = TMath::Sqrt(sCageCoverRint * sCageCoverRint - xbox * xbox);
1693+
rpos = rdist - ybox;
1694+
1695+
// Finally place the four pairs of rails inside the mother volume
1696+
xpos = rpos * TMath::Sin(sCageEndCapCableCutPhi * TMath::DegToRad());
1697+
ypos = rpos * TMath::Cos(sCageEndCapCableCutPhi * TMath::DegToRad()) + sCageYInBarrel;
1698+
1699+
alpha = -sCageEndCapCableCutPhi + 180;
1700+
mother->AddNode(cageMFTRails, 1, new TGeoCombiTrans(xpos, ypos, 0, new TGeoRotation("", alpha, 0, 0)));
1701+
alpha = sCageEndCapCableCutPhi + 180;
1702+
mother->AddNode(cageMFTRails, 2, new TGeoCombiTrans(-xpos, ypos, 0, new TGeoRotation("", alpha, 0, 0)));
1703+
1704+
ypos = rpos * TMath::Cos(sCageEndCapCableCutPhi * TMath::DegToRad()) - sCageYInBarrel;
1705+
1706+
alpha = sCageEndCapCableCutPhi;
1707+
mother->AddNode(cageMFTRails, 3, new TGeoCombiTrans(xpos, -ypos, 0, new TGeoRotation("", alpha, 0, 0)));
1708+
alpha = -sCageEndCapCableCutPhi;
1709+
mother->AddNode(cageMFTRails, 4, new TGeoCombiTrans(-xpos, -ypos, 0, new TGeoRotation("", alpha, 0, 0)));
1710+
1711+
return;
1712+
}
1713+
1714+
TGeoVolume* V3Cage::createMFTRailsPair(const TGeoMedium* motmed, const TGeoManager* mgr)
1715+
{
1716+
//
1717+
// Creates a pair of MFT Rails located inside the Cage (from drawings
1718+
// ALI-MFT-DF-0057 and elements therein)
1719+
// A box containing a pair of rails is returned (a physical box
1720+
// is preferred over an Assembly for better performance)
1721+
//
1722+
// Input:
1723+
// motmat : the material of the mother volume (for the container box)
1724+
// mgr : the GeoManager (used only to get the proper material)
1725+
//
1726+
// Output:
1727+
//
1728+
// Return:
1729+
// A rail pair as a TGeoVolume
1730+
//
1731+
// Created: 10 May 2025 Mario Sitta
1732+
//
1733+
1734+
// Local variables
1735+
const Int_t nv = 16;
1736+
Double_t xv[nv], yv[nv];
1737+
Double_t deltah, xlen, ylen, zlen;
1738+
Double_t xpos, ypos;
1739+
1740+
// The shape of a single rail: a Xtru
1741+
xv[0] = sCageMFTRailBaseWidth / 2;
1742+
yv[0] = 0.;
1743+
xv[1] = xv[0];
1744+
yv[1] = sCageMFTRailTotHeight - sCageMFTRailExtHeight;
1745+
xv[2] = sCageMFTRailTotWidth / 2;
1746+
yv[2] = yv[1];
1747+
xv[3] = xv[2];
1748+
yv[3] = sCageMFTRailTotHeight;
1749+
xv[4] = sCageMFTRailIntWidth / 2;
1750+
yv[4] = yv[3];
1751+
deltah = (sCageMFTRailExtHeight - sCageMFTRailIntHeight) / 2;
1752+
xv[5] = xv[4];
1753+
yv[5] = yv[4] - deltah;
1754+
xv[6] = sCageMFTRailExtWidth / 2;
1755+
yv[6] = yv[5];
1756+
xv[7] = xv[6];
1757+
yv[7] = yv[6] - sCageMFTRailIntHeight;
1758+
1759+
for (Int_t i = 8; i < nv; i++) {
1760+
xv[i] = -xv[15 - i];
1761+
yv[i] = yv[15 - i];
1762+
}
1763+
1764+
zlen = sCageMFTRailZLen / 2;
1765+
1766+
TGeoXtru* mftRailSh = new TGeoXtru(2);
1767+
mftRailSh->SetName("mftrailshape");
1768+
mftRailSh->DefinePolygon(nv, xv, yv);
1769+
mftRailSh->DefineSection(0, -zlen);
1770+
mftRailSh->DefineSection(1, zlen);
1771+
1772+
// The air container: a BBox
1773+
xlen = 2 * sCageMFTRailTotWidth + sCageMFTRailsXDist;
1774+
ylen = sCageMFTRailTotHeight / 2;
1775+
zlen = sCageMFTRailZLen / 2;
1776+
TGeoBBox* mftRailBoxSh = new TGeoBBox(xlen / 2, ylen, zlen);
1777+
1778+
// We have the shape: now create the real volume
1779+
TGeoMedium* medAl = mgr->GetMedium(Form("%s_ALUMINUM$", GetDetName()));
1780+
1781+
TGeoVolume* mftRailVol = new TGeoVolume("MFTRailInsideCage", mftRailSh, medAl);
1782+
mftRailVol->SetFillColor(kGray);
1783+
mftRailVol->SetLineColor(kGray);
1784+
1785+
TGeoVolume* mftRailBoxVol = new TGeoVolume("MFTRailPairInsideCage", mftRailBoxSh, motmed);
1786+
1787+
// Put the two rails inside the holding box
1788+
// (rail Y origin is on its lower face)
1789+
xpos = mftRailBoxSh->GetDX() - 0.5 * sCageMFTRailTotWidth;
1790+
ypos = mftRailBoxSh->GetDY();
1791+
mftRailBoxVol->AddNode(mftRailVol, 1, new TGeoTranslation(xpos, -ypos, 0));
1792+
mftRailBoxVol->AddNode(mftRailVol, 2, new TGeoTranslation(-xpos, -ypos, 0));
1793+
1794+
// Finally return the rails volume
1795+
return mftRailBoxVol;
1796+
}

0 commit comments

Comments
 (0)