Skip to content

Commit 8ca4c0c

Browse files
committed
Barrel geometry: Implementation of MFT rail hinges
1 parent 2673d51 commit 8ca4c0c

File tree

2 files changed

+142
-10
lines changed

2 files changed

+142
-10
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ class V3Cage : public V11Geometry
123123
/// \param mgr The GeoManager (used only to get the proper material)
124124
TGeoVolume* createMFTRailsPair(const TGeoMedium* motmed, const TGeoManager* mgr = gGeoManager);
125125

126+
/// Creates a hinge holding a pair of MFT rails inside the Cage
127+
/// \param mgr The GeoManager (used only to get the proper material)
128+
TGeoVolume* createMFTRailsHinge(const TGeoManager* mgr = gGeoManager);
129+
126130
// Parameters
127131
static const Double_t sCageYInBarrel; ///< Global Y translation
128132

@@ -256,6 +260,7 @@ class V3Cage : public V11Geometry
256260

257261
// MFT Rails inside the Cage
258262
static const Double_t sCageMFTRailZLen; ///< Total length of the rail
263+
static const Double_t sCageMFTRailZPos; ///< Rail global Z position
259264
static const Double_t sCageMFTRailTotWidth; ///< Total width of the rail
260265
static const Double_t sCageMFTRailExtWidth; ///< Width of the external part
261266
static const Double_t sCageMFTRailIntWidth; ///< Width of the internal part
@@ -265,6 +270,17 @@ class V3Cage : public V11Geometry
265270
static const Double_t sCageMFTRailIntHeight; ///< Height of the internal part
266271
static const Double_t sCageMFTRailsXDist; ///< X distance between rails
267272

273+
// MFT Rail hinges
274+
static const Double_t sCageMFTHingeTotWid; ///< Total width of a hinge
275+
static const Double_t sCageMFTHingeIntWid; ///< Width of hinge inner part
276+
static const Double_t sCageMFTHingeHeight; ///< Total height of the rail
277+
static const Double_t sCageMFTHingeIntHei; ///< Height of hinge inner part
278+
static const Double_t sCageMFTHingeTotLen; ///< Total length of a hinge
279+
static const Double_t sCageMFTHingeIntLen; ///< Length of hinge inner part
280+
static const Double_t sCageMFTHingeBulgeWid; ///< Width of a hinge bulge
281+
static const Double_t sCageMFTHingeBulgeHei; ///< Height of a hinge bulge
282+
static const Double_t sCageMFTHingeBulgePos; ///< X position of a hinge bulge
283+
268284
ClassDefOverride(V3Cage, 0); // ITS v3 support geometry
269285
};
270286
} // namespace its

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

Lines changed: 126 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,9 @@ 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;
170+
// MFT rails inside Cage
171+
const Double_t V3Cage::sCageMFTRailZLen = 1874 * sMm;
172+
const Double_t V3Cage::sCageMFTRailZPos = 6.3 * sMm;
171173
const Double_t V3Cage::sCageMFTRailTotWidth = 27 * sMm;
172174
const Double_t V3Cage::sCageMFTRailExtWidth = 24 * sMm;
173175
const Double_t V3Cage::sCageMFTRailIntWidth = 17.5 * sMm;
@@ -177,6 +179,16 @@ const Double_t V3Cage::sCageMFTRailExtHeight = 5.9 * sMm;
177179
const Double_t V3Cage::sCageMFTRailIntHeight = 3.5 * sMm;
178180
const Double_t V3Cage::sCageMFTRailsXDist = 44 * sMm;
179181

182+
const Double_t V3Cage::sCageMFTHingeTotWid = 164 * sMm;
183+
const Double_t V3Cage::sCageMFTHingeIntWid = 141.3 * sMm;
184+
const Double_t V3Cage::sCageMFTHingeHeight = 8 * sMm;
185+
const Double_t V3Cage::sCageMFTHingeIntHei = 6 * sMm;
186+
const Double_t V3Cage::sCageMFTHingeTotLen = 41 * sMm;
187+
const Double_t V3Cage::sCageMFTHingeIntLen = 28 * sMm;
188+
const Double_t V3Cage::sCageMFTHingeBulgeWid = 10 * sMm;
189+
const Double_t V3Cage::sCageMFTHingeBulgeHei = 10 * sMm;
190+
const Double_t V3Cage::sCageMFTHingeBulgePos = 7 * sMm;
191+
180192
ClassImp(V3Cage);
181193

182194
V3Cage::V3Cage()
@@ -1676,15 +1688,19 @@ void V3Cage::createAndPlaceMFTRailsInsideCage(TGeoVolume* mother, const TGeoMana
16761688
// Return:
16771689
//
16781690
// Created: 10 May 2025 Mario Sitta
1691+
// Updated: 20 May 2025 Mario Sitta Hinges added
16791692
//
16801693

16811694
// Local variables
1682-
Double_t rdist, rpos, xpos, ypos, alpha;
1695+
Double_t rdist, rpos, xpos, yposup, yposdw, zpos, alpha;
16831696
Double_t xbox, ybox;
16841697

16851698
// Create a pair of rails (a BBox container is returned)
16861699
TGeoVolume* cageMFTRails = createMFTRailsPair(mother->GetMedium(), mgr);
16871700

1701+
// Create hinge holding a pair of rails
1702+
TGeoVolume* cageMFTRailsHinge = createMFTRailsHinge(mgr);
1703+
16881704
// Now compute the radial distance and the XY position of the box
16891705
xbox = (static_cast<TGeoBBox*>(cageMFTRails->GetShape()))->GetDX();
16901706
ybox = (static_cast<TGeoBBox*>(cageMFTRails->GetShape()))->GetDY();
@@ -1694,19 +1710,39 @@ void V3Cage::createAndPlaceMFTRailsInsideCage(TGeoVolume* mother, const TGeoMana
16941710

16951711
// Finally place the four pairs of rails inside the mother volume
16961712
xpos = rpos * TMath::Sin(sCageEndCapCableCutPhi * TMath::DegToRad());
1697-
ypos = rpos * TMath::Cos(sCageEndCapCableCutPhi * TMath::DegToRad()) + sCageYInBarrel;
1713+
yposup = rpos * TMath::Cos(sCageEndCapCableCutPhi * TMath::DegToRad()) + sCageYInBarrel;
1714+
yposdw = rpos * TMath::Cos(sCageEndCapCableCutPhi * TMath::DegToRad()) - sCageYInBarrel;
1715+
zpos = sCageMFTRailZPos;
16981716

16991717
alpha = -sCageEndCapCableCutPhi + 180;
1700-
mother->AddNode(cageMFTRails, 1, new TGeoCombiTrans(xpos, ypos, 0, new TGeoRotation("", alpha, 0, 0)));
1718+
mother->AddNode(cageMFTRails, 1, new TGeoCombiTrans(xpos, yposup, zpos, new TGeoRotation("", alpha, 0, 0)));
17011719
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;
1720+
mother->AddNode(cageMFTRails, 2, new TGeoCombiTrans(-xpos, yposup, zpos, new TGeoRotation("", alpha, 0, 0)));
17051721

17061722
alpha = sCageEndCapCableCutPhi;
1707-
mother->AddNode(cageMFTRails, 3, new TGeoCombiTrans(xpos, -ypos, 0, new TGeoRotation("", alpha, 0, 0)));
1723+
mother->AddNode(cageMFTRails, 3, new TGeoCombiTrans(xpos, -yposdw, zpos, new TGeoRotation("", alpha, 0, 0)));
17081724
alpha = -sCageEndCapCableCutPhi;
1709-
mother->AddNode(cageMFTRails, 4, new TGeoCombiTrans(-xpos, -ypos, 0, new TGeoRotation("", alpha, 0, 0)));
1725+
mother->AddNode(cageMFTRails, 4, new TGeoCombiTrans(-xpos, -yposdw, zpos, new TGeoRotation("", alpha, 0, 0)));
1726+
1727+
// And the hinges too
1728+
xpos = rdist * TMath::Sin(sCageEndCapCableCutPhi * TMath::DegToRad());
1729+
yposup = rdist * TMath::Cos(sCageEndCapCableCutPhi * TMath::DegToRad()) + sCageYInBarrel;
1730+
yposdw = rdist * TMath::Cos(sCageEndCapCableCutPhi * TMath::DegToRad()) - sCageYInBarrel;
1731+
zpos = (static_cast<TGeoBBox*>(cageMFTRails->GetShape()))->GetDZ() + sCageMFTRailZPos;
1732+
1733+
alpha = sCageEndCapCableCutPhi;
1734+
mother->AddNode(cageMFTRailsHinge, 1, new TGeoCombiTrans(xpos, yposup, zpos, new TGeoRotation("", -alpha, 0, 0)));
1735+
mother->AddNode(cageMFTRailsHinge, 2, new TGeoCombiTrans(-xpos, yposup, zpos, new TGeoRotation("", alpha, 0, 0)));
1736+
1737+
mother->AddNode(cageMFTRailsHinge, 3, new TGeoCombiTrans(xpos, -yposdw, zpos, new TGeoRotation("", 180 + alpha, 0, 0)));
1738+
mother->AddNode(cageMFTRailsHinge, 4, new TGeoCombiTrans(-xpos, -yposdw, zpos, new TGeoRotation("", 180 - alpha, 0, 0)));
1739+
1740+
zpos = (static_cast<TGeoBBox*>(cageMFTRails->GetShape()))->GetDZ() - sCageMFTRailZPos;
1741+
mother->AddNode(cageMFTRailsHinge, 5, new TGeoCombiTrans(xpos, yposup, -zpos, new TGeoRotation("", 90, 180, -90 + alpha))); // On Z<0 apply 180deg rotation on Y axis
1742+
mother->AddNode(cageMFTRailsHinge, 6, new TGeoCombiTrans(-xpos, yposup, -zpos, new TGeoRotation("", 90, 180, -90 - alpha)));
1743+
1744+
mother->AddNode(cageMFTRailsHinge, 7, new TGeoCombiTrans(xpos, -yposdw, -zpos, new TGeoRotation("", 90, 180, 90 - alpha)));
1745+
mother->AddNode(cageMFTRailsHinge, 8, new TGeoCombiTrans(-xpos, -yposdw, -zpos, new TGeoRotation("", 90, 180, 90 + alpha)));
17101746

17111747
return;
17121748
}
@@ -1720,7 +1756,7 @@ TGeoVolume* V3Cage::createMFTRailsPair(const TGeoMedium* motmed, const TGeoManag
17201756
// is preferred over an Assembly for better performance)
17211757
//
17221758
// Input:
1723-
// motmat : the material of the mother volume (for the container box)
1759+
// motmed : the medium of the mother volume (for the container box)
17241760
// mgr : the GeoManager (used only to get the proper material)
17251761
//
17261762
// Output:
@@ -1794,3 +1830,83 @@ TGeoVolume* V3Cage::createMFTRailsPair(const TGeoMedium* motmed, const TGeoManag
17941830
// Finally return the rails volume
17951831
return mftRailBoxVol;
17961832
}
1833+
1834+
TGeoVolume* V3Cage::createMFTRailsHinge(const TGeoManager* mgr)
1835+
{
1836+
//
1837+
// Creates a hinge holding a pair of MFT Rails to the Cage (from drawing
1838+
// ALIMFT-0042 and elements inside CAD files)
1839+
//
1840+
// Input:
1841+
// mgr : the GeoManager (used only to get the proper material)
1842+
//
1843+
// Output:
1844+
//
1845+
// Return:
1846+
// A rail hinge as a TGeoVolume
1847+
//
1848+
// Created: 19 May 2025 Mario Sitta
1849+
//
1850+
1851+
// Local variables
1852+
const Int_t nv = 6;
1853+
Double_t xv[nv], yv[nv];
1854+
Double_t xlen, ylen, zlen;
1855+
Double_t xpos, ypos, zpos;
1856+
1857+
TString compoShape;
1858+
1859+
// The main body: a Xtru
1860+
xv[0] = sCageMFTHingeTotWid / 2;
1861+
yv[0] = 0;
1862+
xv[1] = xv[0];
1863+
yv[1] = sCageMFTHingeIntHei;
1864+
xv[2] = sCageMFTHingeIntWid / 2;
1865+
yv[2] = sCageMFTHingeHeight;
1866+
1867+
for (Int_t i = 3; i < nv; i++) {
1868+
xv[i] = -xv[5 - i];
1869+
yv[i] = yv[5 - i];
1870+
}
1871+
1872+
zlen = sCageMFTHingeIntLen / 2;
1873+
1874+
TGeoXtru* mftHingeBodySh = new TGeoXtru(2);
1875+
mftHingeBodySh->SetName("mfthingebodyshape");
1876+
mftHingeBodySh->DefinePolygon(nv, xv, yv);
1877+
mftHingeBodySh->DefineSection(0, -zlen);
1878+
mftHingeBodySh->DefineSection(1, zlen);
1879+
1880+
// The bulge: a BBox
1881+
xlen = sCageMFTHingeBulgeWid / 2;
1882+
ylen = sCageMFTHingeBulgeHei / 2;
1883+
zlen = (sCageMFTHingeTotLen - sCageMFTHingeIntLen) / 2;
1884+
TGeoBBox* mftHingeBulgeSh = new TGeoBBox("mfthingebulgeshape", xlen, ylen, zlen);
1885+
1886+
// The actual hinge: a CompositeShape
1887+
xpos = mftHingeBodySh->GetX(0) - (sCageMFTHingeBulgePos + mftHingeBulgeSh->GetDX());
1888+
ypos = mftHingeBodySh->GetY(2) - mftHingeBulgeSh->GetDY();
1889+
zpos = mftHingeBodySh->GetZ(1) + mftHingeBulgeSh->GetDZ();
1890+
1891+
TGeoTranslation* bulgpos1 = new TGeoTranslation(xpos, ypos, zpos);
1892+
bulgpos1->SetName("bulge1pos");
1893+
bulgpos1->RegisterYourself();
1894+
1895+
TGeoTranslation* bulgpos2 = new TGeoTranslation(-xpos, ypos, zpos);
1896+
bulgpos2->SetName("bulge2pos");
1897+
bulgpos2->RegisterYourself();
1898+
1899+
compoShape = Form("mfthingebodyshape+mfthingebulgeshape:bulge1pos+mfthingebulgeshape:bulge2pos");
1900+
1901+
TGeoCompositeShape* mftRailHingeSh = new TGeoCompositeShape(compoShape);
1902+
1903+
// We have the shape: now create the real volume
1904+
TGeoMedium* medAl = mgr->GetMedium(Form("%s_ALUMINUM$", GetDetName()));
1905+
1906+
TGeoVolume* mftRailHingeVol = new TGeoVolume("MFTRailHingeInsideCage", mftRailHingeSh, medAl);
1907+
mftRailHingeVol->SetFillColor(kGreen);
1908+
mftRailHingeVol->SetLineColor(kGreen);
1909+
1910+
// Finally return the hinge volume
1911+
return mftRailHingeVol;
1912+
}

0 commit comments

Comments
 (0)