@@ -167,6 +167,16 @@ const Double_t V3Cage::sCageCrossZLength = 8 * sMm;
167167const Double_t V3Cage::sCageCrossBarThick = 20 * sMm ;
168168const 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+
170180ClassImp (V3Cage);
171181
172182V3Cage::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