@@ -167,7 +167,9 @@ 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 ;
170+ // MFT rails inside Cage
171+ const Double_t V3Cage::sCageMFTRailZLen = 1874 * sMm ;
172+ const Double_t V3Cage::sCageMFTRailZPos = 6.3 * sMm ;
171173const Double_t V3Cage::sCageMFTRailTotWidth = 27 * sMm ;
172174const Double_t V3Cage::sCageMFTRailExtWidth = 24 * sMm ;
173175const Double_t V3Cage::sCageMFTRailIntWidth = 17.5 * sMm ;
@@ -177,6 +179,16 @@ const Double_t V3Cage::sCageMFTRailExtHeight = 5.9 * sMm;
177179const Double_t V3Cage::sCageMFTRailIntHeight = 3.5 * sMm ;
178180const 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+
180192ClassImp (V3Cage);
181193
182194V3Cage::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