LCOV - code coverage report
Current view: top level - STRUCT - AliDIPOv3.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 215 215 100.0 %
Date: 2016-06-14 17:26:59 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             :  *                                                                        *
       4             :  * Author: The ALICE Off-line Project.                                    *
       5             :  * Contributors are mentioned in the code where appropriate.              *
       6             :  *                                                                        *
       7             :  * Permission to use, copy, modify and distribute this software and its   *
       8             :  * documentation strictly for non-commercial purposes is hereby granted   *
       9             :  * without fee, provided that the above copyright notice appears in all   *
      10             :  * copies and that both the copyright notice and this permission notice   *
      11             :  * appear in the supporting documentation. The authors make no claims     *
      12             :  * about the suitability of this software for any purpose. It is          *
      13             :  * provided "as is" without express or implied warranty.                  *
      14             :  **************************************************************************/
      15             : 
      16             : /* $Id$ */
      17             : 
      18             : #include <TVirtualMC.h>
      19             : #include <TGeoManager.h>
      20             : #include <TGeoVolume.h>
      21             : #include <TGeoMedium.h>
      22             : #include <TGeoMatrix.h>
      23             : #include <TGeoArb8.h>
      24             : #include <TGeoBBox.h>
      25             : #include <TGeoTube.h>
      26             : #include <TGeoCone.h>
      27             : #include <TGeoPcon.h>
      28             : #include <TGeoCompositeShape.h>
      29             : 
      30             : #include "AliConst.h"
      31             : #include "AliDIPOv3.h"
      32             : #include "AliMagF.h"
      33             : #include "AliRun.h"
      34             :  
      35          12 : ClassImp(AliDIPOv3)
      36             :  
      37             : //_____________________________________________________________________________
      38          12 : AliDIPOv3::AliDIPOv3() 
      39          60 : {
      40             :   //
      41             :   // Last design of magnetic dipole version 3
      42             :   //
      43          24 : }
      44             :  
      45             : //_____________________________________________________________________________
      46             : AliDIPOv3::AliDIPOv3(const char *name, const char *title)
      47           1 :   : AliDIPOv2(name,title)
      48           5 : {
      49             :   //
      50             :   // Standard constructor for the magnetic dipole version 3    
      51           2 : }
      52             : 
      53             : 
      54             : //_____________________________________________________________________________
      55             : void AliDIPOv3::CreateSpectrometerDipole()
      56             : {
      57             : // Detailed dipole geometry as built
      58             : //
      59             : // Drawing: ALIP2A__0026
      60             : // Geometer measurements: EDMS 596079
      61             : //                        EDMS 584963
      62             :     
      63             : //
      64             : // The top volume
      65             : //
      66           2 :     TGeoVolume* top = gGeoManager->GetVolume("ALIC");
      67             : //
      68             : // Media
      69             : //
      70           1 :     TGeoMedium* kMedSteel    = gGeoManager->GetMedium("DIPO_ST_C3");
      71           1 :     TGeoMedium* kMedCoil     = gGeoManager->GetMedium("DIPO_Coil_C1");
      72           1 :     TGeoMedium* kMedCoilSh   = gGeoManager->GetMedium("DIPO_Coil_C3");
      73           1 :     TGeoMedium* kMedCable    = gGeoManager->GetMedium("DIPO_ALU_C2");
      74           1 :     TGeoMedium* kMedAlu      = gGeoManager->GetMedium("DIPO_ALU_C2");
      75           1 :     TGeoMedium* kMedAir      = gGeoManager->GetMedium("DIPO_AIR_MUON");
      76             : //
      77             : // Rotations 
      78             : // 
      79             :     Float_t alhc = 0.794;
      80             :     
      81           1 :     TGeoRotation* rotxz      = new TGeoRotation("rotxz",    270.,   0., 90.,  90.,  180., 0.);
      82           1 :     TGeoRotation* rotiz      = new TGeoRotation("rotiz",     90.,   0., 90.,  90.,  180., 0.);
      83           1 :     TGeoRotation* rotxzlhc   = new TGeoRotation("rotxzlhc", 180.,  180. + alhc, 0.);
      84             : 
      85           1 :     TGeoRotation* rotxz108   = new TGeoRotation("rotxz108", 90., 108., 90., 198.,  180.,   0.);
      86           1 :     TGeoRotation* rotxz180   = new TGeoRotation("rotxz180", 90., 180., 90., 270.,  180.,   0.);
      87           1 :     TGeoRotation* rotxz288   = new TGeoRotation("rotxz288", 90., 288., 90.,  18.,  180.,   0.);
      88             : 
      89           1 :     TGeoRotation* rotxy180   = new TGeoRotation("rotxy180", 90., 180., 90., 270.,    0.,   0.);
      90           1 :     TGeoRotation* rotxy108   = new TGeoRotation("rotxy108", 90., 108., 90., 198.,    0.,   0.);
      91           1 :     TGeoRotation* rotxy288   = new TGeoRotation("rotxy288", 90., 288., 90.,  18.,    0.,   0.);
      92             : 
      93           1 :     TGeoRotation* rot00      = new TGeoRotation("rot00",   180.,   0., 90., 151.,   90.,  61.);
      94           1 :     TGeoRotation* rot01      = new TGeoRotation("rot01",   180.,   0., 90.,  29.,-  90., -61.);
      95           1 :     TGeoRotation* rot02      = new TGeoRotation("rot02",     0.,   0., 90., 151.,   90.,  61.);
      96           1 :     TGeoRotation* rot03      = new TGeoRotation("rot03",     0.,   0., 90.,  29.,-  90., -61.);
      97           1 :     TGeoRotation* rot04      = new TGeoRotation("rot04",    90.,  61., 90., 151.,    0.,   0.);
      98           1 :     TGeoRotation* rot05      = new TGeoRotation("rot05",    90., -61., 90.,-151.,    0.,   0.);
      99           1 :     TGeoRotation* rot06      = new TGeoRotation("rot06",    90., 119., 90., 209.,    0.,   0.);
     100           1 :     TGeoRotation* rot07      = new TGeoRotation("rot07",    90.,-119., 90.,-209.,    0.,   0.);
     101             : 
     102             :     const Float_t dipoleL       = 498.;
     103             :     const Float_t kZDipoleR     = 1244.;
     104             :     const Float_t kZDipole      = kZDipoleR - dipoleL/2.; 
     105             :     const Float_t kZDipoleF     = kZDipoleR - dipoleL; 
     106             :     const Float_t yokeLength    = 309.4;
     107             :     const Float_t blockLength   = yokeLength / 7.;
     108             :     const Float_t gapWidthFront = 297.6;
     109             :     const Float_t gapWidthRear  = 395.4;
     110             :     const Float_t dGap          = (gapWidthRear - gapWidthFront) / 12.;
     111             :     const Float_t gapHeight     = 609.1;
     112             :     const Float_t blockHeight   = 145.45;
     113             :     const Float_t dzCoil        = 4.45;
     114             : 
     115             :     Float_t dx, dy, dz;
     116             :     
     117             : 
     118             :     //
     119             :     // Mother volume for muon spectrometer tracking station 3
     120             : 
     121             :     Float_t z30 =  825.;
     122             :     Float_t zst = 1052.;
     123             : 
     124           1 :     Float_t rcD0 = (kZDipoleF - 5.)  * TMath::Tan(9. * kDegrad);
     125           1 :     Float_t rcD1 = kZDipole * TMath::Tan(9. * kDegrad);
     126           1 :     Float_t rcD2 = rcD1 + dipoleL/2. * TMath::Tan(10.1 * kDegrad);
     127           1 :     Float_t rc30 = z30 * TMath::Tan(9. * kDegrad);
     128           1 :     Float_t rcst = rcD1  + (zst - kZDipole) * TMath::Tan(10.1 * kDegrad);
     129             :     
     130             :  
     131           1 :     Float_t riD0 = (kZDipoleF - 5.)  * TMath::Tan(2. * kDegrad) + 0.2;
     132             :     Float_t riD1 = 28.9;
     133             :     Float_t riD2 = 35.8;
     134           1 :     Float_t riD3 = riD2 + (kZDipoleR - zst)      * TMath::Tan(2. * kDegrad);
     135           1 :     Float_t riD4 = riD2 + (kZDipoleR - zst + 5.) * TMath::Tan(2. * kDegrad);
     136             :     
     137             : 
     138           1 :     TGeoPcon* shDDIP1 =  new TGeoPcon("shDDIP1", 0., 360., 7);
     139             : 
     140           1 :     shDDIP1->DefineSection(0,  (kZDipoleF - 5.), riD0, rcD0);
     141           1 :     shDDIP1->DefineSection(1,  z30            , riD1, rc30);
     142           1 :     shDDIP1->DefineSection(2,  kZDipole       , riD1, rcD1);
     143           1 :     shDDIP1->DefineSection(3,  zst            , riD1, rcst);
     144           1 :     shDDIP1->DefineSection(4,  zst            , riD2, rcst);
     145           1 :     shDDIP1->DefineSection(5,  kZDipoleR      , riD3, rcD2);
     146           1 :     shDDIP1->DefineSection(6, (kZDipoleR + 5.), riD4, rcD2);
     147             : 
     148             :           // JC Ch6 is 2x5cm longer than Ch5
     149             :     //    TGeoBBox* shDDIP2 =  new TGeoBBox(164., 182., 36.);     
     150             :           Double_t xD0 = 162.;
     151             :           Double_t xD1 = 171.;
     152             :           Double_t yD0 = 182.;
     153             :           Double_t zD0 = 36.;
     154             :         
     155           1 :         Double_t xy[16] = {0};
     156           1 :           xy[0]  = -xD0; xy[1]  = -yD0; 
     157           1 :           xy[2]  = -xD0; xy[3]  =  yD0; 
     158           1 :           xy[4]  =  xD0; xy[5]  =  yD0;
     159           1 :           xy[6]  =  xD0; xy[7]  = -yD0;
     160           1 :           xy[8]  = -xD1; xy[9]  = -yD0; 
     161           1 :           xy[10] = -xD1; xy[11] =  yD0; 
     162           1 :           xy[12] =  xD1; xy[13] =  yD0;
     163           1 :           xy[14] =  xD1; xy[15] = -yD0; 
     164           1 :           TGeoArb8* shDDIP2 =  new TGeoArb8(zD0, xy); 
     165           1 :     shDDIP2->SetName("shDDIP2");
     166           1 :     TGeoTranslation* trDDIP2 = new TGeoTranslation("trDDIP2", 0., 0., kZDipole - 12.);
     167           1 :     trDDIP2->RegisterYourself();
     168             : 
     169           1 :     TGeoTube* shDDIP3 =  new TGeoTube(0., 30., 40.);
     170           1 :     shDDIP3->SetName("shDDIP3");
     171             : 
     172             : 
     173           1 :     TGeoCompositeShape*  shDDIP = new TGeoCompositeShape("shDDIP", "shDDIP1+(shDDIP2:trDDIP2-shDDIP3:trDDIP2)");
     174           1 :     TGeoVolume*  voDDIP = new TGeoVolume("DDIP", shDDIP, kMedAir);
     175             : //
     176             : // Yoke
     177             : // 
     178             : 
     179           1 :     TGeoVolumeAssembly* asYoke = new TGeoVolumeAssembly("DYoke");     
     180             : // Base
     181           1 :     char name[16];
     182             :     Float_t lx0 = gapWidthFront + 2. * blockHeight;
     183             :     Float_t lx  = lx0;
     184             :     
     185           1 :     TGeoVolumeAssembly* asYokeBase = new TGeoVolumeAssembly("DYokeBase");     
     186          16 :     for (Int_t i = 0; i < 7; i++) {
     187           7 :       snprintf(name, 16, "DYokeBaseBlock%1d", i);
     188          14 :       TGeoVolume*  voBaseBlock = new TGeoVolume(name,
     189          21 :                                                   new TGeoBBox(lx/2., blockHeight/2., blockLength/2.),
     190             :                                                   kMedSteel);
     191          14 :         asYokeBase->AddNode(voBaseBlock, 1, new TGeoTranslation(0., 0., Float_t(i - 3) * blockLength));
     192           7 :         lx += 2. * dGap;
     193             :     }
     194             : 
     195           2 :     asYoke->AddNode(asYokeBase, 1, new TGeoTranslation(0., -(gapHeight + blockHeight)/2. , 0.));
     196           2 :     asYoke->AddNode(asYokeBase, 2, new TGeoTranslation(0., +(gapHeight + blockHeight)/2. , 0.));
     197             : 
     198             :  
     199             : // Side Wall
     200           1 :     TGeoVolumeAssembly* asYokeSide = new TGeoVolumeAssembly("DYokeSide");     
     201           2 :     TGeoVolume*  voSideBlock = new TGeoVolume("DSideBlock",
     202           3 :                                               new TGeoBBox(blockHeight/2., gapHeight/2., blockLength/2.),
     203             :                                               kMedSteel);
     204             :     
     205          16 :     for (Int_t i = 0; i < 7; i++) {
     206          14 :         asYokeSide->AddNode(voSideBlock, i, new TGeoTranslation(Float_t(i - 3) * dGap, 0., Float_t(i - 3) * blockLength));
     207             :     }
     208             : 
     209             : 
     210           2 :     asYoke->AddNode(asYokeSide, 1, new TGeoTranslation(+lx0/2. + 3. * dGap - blockHeight/2., 0., 0.));
     211           2 :     asYoke->AddNode(asYokeSide, 2, new TGeoCombiTrans( -lx0/2. - 3. * dGap + blockHeight/2., 0., 0., rotiz));
     212             : 
     213             : //    
     214             : // Coils
     215             : //
     216             :     Float_t coilRi   = 206.;
     217             :     Float_t coilD    =  70.;
     218             :     Float_t coilRo   = coilRi + coilD;
     219             :     Float_t coilH    =  77.;
     220             :     Float_t phiMin   = -61.;
     221             :     Float_t phiMax   =  61.;
     222             :     Float_t lengthSt = 240. + 33.9;    
     223           1 :     Float_t phiKnee  = phiMax * kDegrad;
     224             :     Float_t  rKnee   = 31.5;
     225             :     
     226             : //  Circular sections
     227           1 :     TGeoVolumeAssembly* asCoil = new TGeoVolumeAssembly("DCoil");     
     228             : 
     229           2 :     TGeoVolume*  voDC1 = new TGeoVolume("DC1",
     230           3 :                                               new TGeoTubeSeg(coilRi, coilRo, coilH / 2., phiMin, phiMax),
     231             :                                               kMedCoil);
     232           2 :     TGeoVolume*  voDC2 = new TGeoVolume("DC2",
     233           3 :                                               new TGeoTubeSeg(coilRi + 5., coilRo - 5., coilH / 2., phiMin, phiMax),
     234             :                                               kMedCoilSh);
     235             : 
     236           1 :     voDC1->AddNode(voDC2, 1, gGeoIdentity);
     237           1 :     voDC2->SetVisibility(0);
     238             : 
     239           1 :     dz = lengthSt / 2. + coilH / 2. + rKnee;
     240             :     dx = 0.;
     241             :     
     242           2 :     asCoil->AddNode(voDC1, 1, new TGeoTranslation(-dx, 0., -dz));
     243           2 :     asCoil->AddNode(voDC1, 2, new TGeoCombiTrans(  dx, 0., -dz, rotxy180));
     244           2 :     asCoil->AddNode(voDC1, 3, new TGeoTranslation(-dx, 0.,  dz));
     245           2 :     asCoil->AddNode(voDC1, 4, new TGeoCombiTrans(  dx, 0.,  dz, rotxz180));
     246             : 
     247             :     
     248             : // 90deg Knees
     249             : 
     250             :     
     251           2 :     TGeoVolume* voDC11 = new TGeoVolume("DC11", 
     252           3 :                                        new TGeoTubeSeg(rKnee, rKnee + coilH, coilD/2., 270., 360.),
     253             :                                        kMedCoil);
     254             :     
     255             :     
     256           1 :     dx = - TMath::Cos(phiKnee) * (coilRi + coilD/2.); 
     257           1 :     dy = - TMath::Sin(phiKnee) * (coilRi + coilD/2.);  
     258           1 :     dz = lengthSt / 2.;
     259             : 
     260           2 :     asCoil->AddNode(voDC11, 1, new TGeoCombiTrans( dx, dy,  -dz, rot00));
     261           2 :     asCoil->AddNode(voDC11, 2, new TGeoCombiTrans( dx, dy,   dz, rot02));
     262           2 :     asCoil->AddNode(voDC11, 3, new TGeoCombiTrans(-dx, dy,  -dz, rot01));
     263           2 :     asCoil->AddNode(voDC11, 4, new TGeoCombiTrans(-dx, dy,   dz, rot03));
     264             : 
     265           2 :     TGeoVolume* voDC12 = new TGeoVolume("DC12", 
     266           3 :                                        new TGeoTubeSeg(rKnee, rKnee + coilH, coilD/2., 0., 90.),
     267             :                                        kMedCoil);
     268             :     
     269             : 
     270           2 :     asCoil->AddNode(voDC12, 1, new TGeoCombiTrans( dx, -dy,  -dz, rot01));
     271           2 :     asCoil->AddNode(voDC12, 2, new TGeoCombiTrans( dx, -dy,   dz, rot03));
     272           2 :     asCoil->AddNode(voDC12, 3, new TGeoCombiTrans(-dx, -dy,  -dz, rot00));
     273           2 :     asCoil->AddNode(voDC12, 4, new TGeoCombiTrans(-dx, -dy,   dz, rot02));
     274             : 
     275             : // Straight sections
     276             : 
     277             :     
     278           2 :     TGeoVolume* voDL0 = new TGeoVolume("DL0", 
     279           3 :                                        new TGeoBBox(coilD / 2. + 2., coilH / 2. + 2., lengthSt / 2.),
     280             :                                        kMedCoil);
     281             : 
     282           2 :     TGeoVolume* voDL1 = new TGeoVolume("DL1", 
     283           3 :                                        new TGeoBBox(coilD / 2., coilH / 2., lengthSt / 2.),
     284             :                                        kMedCoil);
     285             :     
     286             : 
     287           2 :     TGeoVolume* voDL2 = new TGeoVolume("DL2", 
     288           3 :                                        new TGeoBBox(coilD / 2. - 5., coilH / 2. - 5., lengthSt / 2. - 5.),
     289             :                                        kMedCoilSh);
     290             :     // Sleeves
     291           2 :     TGeoVolume* voDL3 = new TGeoVolume("DL3", 
     292           3 :                                        new TGeoBBox(1., coilH / 2., 120.),
     293             :                                        kMedAlu);
     294             : 
     295           2 :     TGeoVolume* voDL4 = new TGeoVolume("DL4", 
     296           3 :                                        new TGeoBBox(coilD/2., 1., 120.),
     297             :                                        kMedAlu);
     298             :     
     299           1 :     voDL0->SetVisibility(0);
     300           1 :     voDL1->AddNode(voDL2, 1, gGeoIdentity);
     301           1 :     voDL0->AddNode(voDL1, 1, gGeoIdentity);
     302           2 :     voDL0->AddNode(voDL3, 1, new TGeoTranslation(-coilD/2. - 1., 0., 0.));
     303           2 :     voDL0->AddNode(voDL3, 2, new TGeoTranslation(+coilD/2. + 1., 0., 0.));
     304           2 :     voDL0->AddNode(voDL4, 1, new TGeoTranslation(0., -coilH/2. - 1., 0.));
     305           2 :     voDL0->AddNode(voDL4, 2, new TGeoTranslation(0., +coilH/2. + 1., 0.));
     306             :     
     307             :     
     308           1 :     dx += (rKnee + coilH/2.)  * TMath::Sin(phiKnee);
     309           1 :     dy -= (rKnee + coilH/2.)  * TMath::Cos(phiKnee);
     310             :     dz = 0.; 
     311             :     
     312           2 :     asCoil->AddNode(voDL0, 1, new TGeoCombiTrans( dx,  dy, dz, rot04));
     313           2 :     asCoil->AddNode(voDL0, 2, new TGeoCombiTrans( dx, -dy, dz, rot05));
     314           2 :     asCoil->AddNode(voDL0, 3, new TGeoCombiTrans(-dx,  dy, dz, rot06));
     315           2 :     asCoil->AddNode(voDL0, 4, new TGeoCombiTrans(-dx, -dy, dz, rot07));
     316             : 
     317             : // Contactor
     318             : // Outer face planes
     319             :     
     320           1 :     TGeoVolumeAssembly* asContactor = new TGeoVolumeAssembly("DContactor");
     321             :     dx = -5.;
     322           2 :     TGeoVolume* voDC10 = new TGeoVolume("DC10", 
     323           3 :                                         new TGeoTubeSeg(coilRo + 5.1, coilRo + 73.5, 1., -20., 20.),
     324             :                                         kMedCable);
     325           2 :     asContactor->AddNode(voDC10, 1, new TGeoTranslation(dx, 0, -32.325));
     326           2 :     asContactor->AddNode(voDC10, 2, new TGeoTranslation(dx, 0, +32.325));
     327             :  
     328             : 
     329             : // Coil Support
     330             : // 
     331             :     Float_t sW = 83.;
     332             :     
     333           1 :     TGeoVolumeAssembly* asDCoilSupport = new TGeoVolumeAssembly("DCoilSupport");
     334             : 
     335             :     // Steel fixed to the yoke
     336           2 :     TGeoVolume* voDCS01 = new TGeoVolume("DCS01", 
     337           3 :                                          new TGeoTubeSeg(coilRo, 325.,  1., 21., 51.),
     338             :                                          kMedAlu);
     339             :     
     340             :     // Steel on the coil
     341           2 :     TGeoVolume* voDCS02 = new TGeoVolume("DCS02", 
     342           3 :                                          new TGeoTubeSeg(coilRo, coilRo + 3.125, sW/2., 21., 51.),
     343             :                                          kMedAlu);
     344           2 :     TGeoVolume* voDCS021 = new TGeoVolume("DCS021", 
     345           3 :                                          new TGeoConeSeg(sW/2., coilRo + 3.124, 320., coilRo + 3.125, coilRo + 5.125, 21., 21.4),
     346             :                                          kMedAlu);
     347             :     
     348             : 
     349             :     // Sleeves
     350           2 :     TGeoVolume* voDCS03 = new TGeoVolume("DCS03", 
     351           3 :                                          new TGeoTubeSeg(coilRi - 3.125, coilRo + 3.125,  3.125/2., 21., 51.),
     352             :                                          kMedAlu);
     353             : 
     354           2 :     TGeoVolume* voDCS04 = new TGeoVolume("DCS04", 
     355           3 :                                          new TGeoTubeSeg(coilRi - 3.125, coilRi,  coilH/2., 21., 51.),
     356             :                                          kMedAlu);
     357             :     
     358             : 
     359           2 :     TGeoVolume* voDCS05 = new TGeoVolume("DCS05", 
     360           3 :                                          new TGeoTubeSeg(coilRi - 3.125, coilRo,  3.125/2., 21., 51.),
     361             :                                          kMedAlu);
     362             :     // 
     363           2 :     asDCoilSupport->AddNode(voDCS02, 1, new TGeoTranslation(0., 0., -(sW - coilH)/2.));
     364           1 :     asDCoilSupport->AddNode(voDCS04, 1, gGeoIdentity);    
     365          20 :     for (Int_t i = 0; i < 9; i++) 
     366             :     {
     367           9 :         char nameR[16];
     368           9 :         snprintf(nameR, 16, "rotdcs%1d", i);
     369           9 :         Float_t phi = Float_t(i) * 3.75;
     370           9 :         TGeoRotation* rot   = new TGeoRotation(nameR, 90., phi, 90., 90. + phi,    0.,   0.);   
     371          18 :         asDCoilSupport->AddNode(voDCS021, i, new TGeoCombiTrans(0., 0.004, -(sW - coilH)/2., rot));    
     372           9 :     }
     373             :     
     374             : 
     375             : 
     376           2 :     asDCoilSupport->AddNode(voDCS01, 1, new TGeoTranslation(0., 0., -sW/2. - (sW - coilH)/2. - 3.125/2.));    
     377           2 :     asDCoilSupport->AddNode(voDCS03, 1, new TGeoTranslation(0., 0., +coilH/2. + 3.125/2.));    
     378           2 :     asDCoilSupport->AddNode(voDCS05, 1, new TGeoTranslation(0., 0., -coilH/2. - 3.125/2.));    
     379             : 
     380             : 
     381             :     //
     382             :     // SAA1 Support: Hanger 1
     383             :     //
     384           1 :     TGeoTranslation* trHanger = new TGeoTranslation("trHanger", 0., 250., 0.);
     385           1 :     trHanger->RegisterYourself();
     386             :     
     387             :     Float_t rmin1, rmin2, rmax1, rmax2;
     388             : 
     389             :     Float_t zHanger1 = 811.9;
     390           1 :     TGeoBBox* shHanger11  = new TGeoBBox(2.5/2., 250., 25./2.);
     391           1 :     shHanger11->SetName("shHanger11");
     392             :     
     393           1 :     rmin1 = (zHanger1 - 13.) * TMath::Tan(2. * kDegrad);
     394           1 :     rmin2 = rmin1 + 26. * TMath::Tan( 2.0 * kDegrad);
     395             : 
     396           1 :     rmax1 = (zHanger1 - 13.) * TMath::Tan(9. * kDegrad);
     397           1 :     rmax2 = rmax1 + 26. * TMath::Tan(9. * kDegrad);
     398             : 
     399           1 :     TGeoCone* shHanger12  = new TGeoCone(13., rmin1, rmax1, rmin2, rmax2);
     400           1 :     shHanger12->SetName("shHanger12");
     401           1 :     TGeoCompositeShape*  shHanger1 = new TGeoCompositeShape("shHanger1", "shHanger12*shHanger11:trHanger");
     402           1 :     TGeoVolume* voHanger1 = new TGeoVolume("DHanger1", shHanger1, kMedSteel);
     403             :     //
     404             :     // SAA1 Support: Hanger 2
     405             :     //
     406             :     Float_t zHanger2 = 1171.9;
     407           1 :     TGeoBBox* shHanger21  = new TGeoBBox(3.5/2., 250., 25./2.);
     408           1 :     shHanger21->SetName("shHanger21");
     409             : 
     410           1 :     rmin1 = 35.8 + (zHanger2 - 13. - zst) * TMath::Tan(2. * kDegrad);
     411           1 :     rmin2 = rmin1 + 26. * TMath::Tan( 2.0 * kDegrad);
     412             : 
     413           1 :     rmax1 = rcD1 + (zHanger2 - 13. - kZDipole) * TMath::Tan(10.1 * kDegrad);
     414           1 :     rmax2 = rmax1 + 26. * TMath::Tan(10.1 * kDegrad);
     415           1 :     TGeoCone* shHanger22  = new TGeoCone(13., rmin1, rmax1, rmin2, rmax2);
     416           1 :     shHanger22->SetName("shHanger22");
     417             : 
     418           1 :     TGeoCompositeShape*  shHanger2 = new TGeoCompositeShape("shHanger2", "shHanger22*shHanger21:trHanger");
     419             :     
     420           1 :     TGeoVolume* voHanger2 = new TGeoVolume("DHanger2", shHanger2, kMedSteel);
     421             :     //
     422             :     // Hanger support
     423             :     Float_t hsLength = yokeLength + (zHanger2 - kZDipole - yokeLength/2.) + 25./2.;
     424             :     
     425           3 :     TGeoVolume* voHS1 = new TGeoVolume("DHS1", new TGeoBBox( 1.5, 12.5, hsLength/2.), kMedSteel);
     426           3 :     TGeoVolume* voHS2 = new TGeoVolume("DHS2", new TGeoBBox(12.5,  1.5, hsLength/2.), kMedSteel);
     427           1 :     Float_t hsH = gapHeight/2. + blockHeight - (rmax1+rmax2)/2. - 2.;
     428             :     
     429           3 :     TGeoVolume* voHS3 = new TGeoVolume("DHS3", new TGeoBBox(3.5/2., hsH/2., 25./2.),    kMedSteel);
     430             : 
     431           1 :     TGeoVolumeAssembly* asHS = new TGeoVolumeAssembly("asHS");
     432           1 :     asHS->AddNode(voHS1, 1, gGeoIdentity);
     433           2 :     asHS->AddNode(voHS2, 1, new TGeoTranslation(0., +14., 0.));
     434           2 :     asHS->AddNode(voHS2, 2, new TGeoTranslation(0., -14., 0.));
     435           2 :     asHS->AddNode(voHS3, 1, new TGeoTranslation(0., -hsH/2. - 14. -1.5, hsLength/2. - 25./2.));
     436             :     
     437             :     
     438             : 
     439             :     dz = zHanger1;
     440           2 :     voDDIP->AddNode(voHanger1, 1, new TGeoTranslation(0., 0., dz));
     441             : 
     442             :     dz = zHanger2;
     443           2 :     voDDIP->AddNode(voHanger2, 1, new TGeoTranslation(0., 0., dz));
     444             :     
     445             :     
     446             :     
     447             :     
     448             :     // Assembly everything
     449             : 
     450           1 :     TGeoVolumeAssembly* asDipole = new TGeoVolumeAssembly("Dipole");
     451             :     // Yoke
     452           2 :     asDipole->AddNode(asYoke, 1, new TGeoTranslation(0., 0., -dzCoil));
     453           1 :     asDipole->AddNode(asCoil, 1, gGeoIdentity);
     454             :     // Contactor
     455             :     dz = lengthSt / 2. + coilH / 2. + rKnee;
     456           2 :     asDipole->AddNode(asContactor, 1, new TGeoTranslation(0., 0., dz + dzCoil));
     457           2 :     asDipole->AddNode(asContactor, 2, new TGeoCombiTrans( 0., 0., dz - dzCoil, rotxy180));
     458             :     // Coil support
     459           2 :     asDipole->AddNode(asDCoilSupport, 1, new TGeoTranslation(0., 0., dz));
     460           2 :     asDipole->AddNode(asDCoilSupport, 2, new TGeoCombiTrans( 0., 0., dz, rotxy180));
     461           2 :     asDipole->AddNode(asDCoilSupport, 3, new TGeoCombiTrans( 0., 0., dz, rotxy108));
     462           2 :     asDipole->AddNode(asDCoilSupport, 4, new TGeoCombiTrans( 0., 0., dz, rotxy288));
     463             :     
     464           2 :     asDipole->AddNode(asDCoilSupport, 5, new TGeoCombiTrans( 0., 0., -dz, rotiz));
     465           2 :     asDipole->AddNode(asDCoilSupport, 6, new TGeoCombiTrans( 0., 0., -dz, rotxz108));
     466           2 :     asDipole->AddNode(asDCoilSupport, 7, new TGeoCombiTrans( 0., 0., -dz, rotxz180));
     467           2 :     asDipole->AddNode(asDCoilSupport, 8, new TGeoCombiTrans( 0., 0., -dz, rotxz288));
     468             :     
     469             :     // Hanger (Support)
     470             :     dy = gapHeight/2. + blockHeight + 14.;
     471             :     
     472           2 :     asDipole->AddNode(asHS, 1, new TGeoTranslation(0., dy + 1.5, ((zHanger2 - kZDipole - yokeLength/2.) + 25./2.)/2.));
     473             :     
     474             :     
     475           1 :     asDipole->SetVisContainers(1);
     476           1 :     voDDIP->SetVisibility(0);
     477             : 
     478           3 :     top->AddNode(asDipole, 1, new TGeoCombiTrans(0.,  dipoleL / 2. * TMath::Tan(alhc * kDegrad), -kZDipole, rotxzlhc));
     479           2 :     top->AddNode(voDDIP,   1, new TGeoCombiTrans(0., 0., 0., rotxz));
     480           1 : }
     481             : 
     482             : 
     483             : 
     484             : 
     485             : 
     486             : 
     487             : 

Generated by: LCOV version 1.11