Adding Domenico Colella as responsible for SPD part in TRI pp
[u/mrichter/AliRoot.git] / STRUCT / AliDIPOv3.cxx
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 ClassImp(AliDIPOv3)
36  
37 //_____________________________________________________________________________
38 AliDIPOv3::AliDIPOv3() 
39 {
40   //
41   // Last design of magnetic dipole version 3
42   //
43 }
44  
45 //_____________________________________________________________________________
46 AliDIPOv3::AliDIPOv3(const char *name, const char *title)
47   : AliDIPOv2(name,title)
48 {
49   //
50   // Standard constructor for the magnetic dipole version 3    
51 }
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     TGeoVolume* top = gGeoManager->GetVolume("ALIC");
67 //
68 // Media
69 //
70     TGeoMedium* kMedSteel    = gGeoManager->GetMedium("DIPO_ST_C3");
71     TGeoMedium* kMedCoil     = gGeoManager->GetMedium("DIPO_Coil_C1");
72     TGeoMedium* kMedCoilSh   = gGeoManager->GetMedium("DIPO_Coil_C3");
73     TGeoMedium* kMedCable    = gGeoManager->GetMedium("DIPO_ALU_C2");
74     TGeoMedium* kMedAlu      = gGeoManager->GetMedium("DIPO_ALU_C2");
75     TGeoMedium* kMedAir      = gGeoManager->GetMedium("DIPO_AIR_MUON");
76 //
77 // Rotations 
78 // 
79     Float_t alhc = 0.794;
80     
81     TGeoRotation* rotxz      = new TGeoRotation("rotxz",    270.,   0., 90.,  90.,  180., 0.);
82     TGeoRotation* rotiz      = new TGeoRotation("rotiz",     90.,   0., 90.,  90.,  180., 0.);
83     TGeoRotation* rotxzlhc   = new TGeoRotation("rotxzlhc", 180.,  180. + alhc, 0.);
84
85     TGeoRotation* rotxz108   = new TGeoRotation("rotxz108", 90., 108., 90., 198.,  180.,   0.);
86     TGeoRotation* rotxz180   = new TGeoRotation("rotxz180", 90., 180., 90., 270.,  180.,   0.);
87     TGeoRotation* rotxz288   = new TGeoRotation("rotxz288", 90., 288., 90.,  18.,  180.,   0.);
88
89     TGeoRotation* rotxy180   = new TGeoRotation("rotxy180", 90., 180., 90., 270.,    0.,   0.);
90     TGeoRotation* rotxy108   = new TGeoRotation("rotxy108", 90., 108., 90., 198.,    0.,   0.);
91     TGeoRotation* rotxy288   = new TGeoRotation("rotxy288", 90., 288., 90.,  18.,    0.,   0.);
92
93     TGeoRotation* rot00      = new TGeoRotation("rot00",   180.,   0., 90., 151.,   90.,  61.);
94     TGeoRotation* rot01      = new TGeoRotation("rot01",   180.,   0., 90.,  29.,-  90., -61.);
95     TGeoRotation* rot02      = new TGeoRotation("rot02",     0.,   0., 90., 151.,   90.,  61.);
96     TGeoRotation* rot03      = new TGeoRotation("rot03",     0.,   0., 90.,  29.,-  90., -61.);
97     TGeoRotation* rot04      = new TGeoRotation("rot04",    90.,  61., 90., 151.,    0.,   0.);
98     TGeoRotation* rot05      = new TGeoRotation("rot05",    90., -61., 90.,-151.,    0.,   0.);
99     TGeoRotation* rot06      = new TGeoRotation("rot06",    90., 119., 90., 209.,    0.,   0.);
100     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     Float_t rcD0 = (kZDipoleF - 5.)  * TMath::Tan(9. * kDegrad);
125     Float_t rcD1 = kZDipole * TMath::Tan(9. * kDegrad);
126     Float_t rcD2 = rcD1 + dipoleL/2. * TMath::Tan(10.1 * kDegrad);
127     Float_t rc30 = z30 * TMath::Tan(9. * kDegrad);
128     Float_t rcst = rcD1  + (zst - kZDipole) * TMath::Tan(10.1 * kDegrad);
129     
130  
131     Float_t riD0 = (kZDipoleF - 5.)  * TMath::Tan(2. * kDegrad) + 0.2;
132     Float_t riD1 = 28.9;
133     Float_t riD2 = 35.8;
134     Float_t riD3 = riD2 + (kZDipoleR - zst)      * TMath::Tan(2. * kDegrad);
135     Float_t riD4 = riD2 + (kZDipoleR - zst + 5.) * TMath::Tan(2. * kDegrad);
136     
137
138     TGeoPcon* shDDIP1 =  new TGeoPcon("shDDIP1", 0., 360., 7);
139
140     shDDIP1->DefineSection(0,  (kZDipoleF - 5.), riD0, rcD0);
141     shDDIP1->DefineSection(1,  z30            , riD1, rc30);
142     shDDIP1->DefineSection(2,  kZDipole       , riD1, rcD1);
143     shDDIP1->DefineSection(3,  zst            , riD1, rcst);
144     shDDIP1->DefineSection(4,  zst            , riD2, rcst);
145     shDDIP1->DefineSection(5,  kZDipoleR      , riD3, rcD2);
146     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         Double_t xy[16] = {0};
156           xy[0]  = -xD0; xy[1]  = -yD0; 
157           xy[2]  = -xD0; xy[3]  =  yD0; 
158           xy[4]  =  xD0; xy[5]  =  yD0;
159           xy[6]  =  xD0; xy[7]  = -yD0;
160           xy[8]  = -xD1; xy[9]  = -yD0; 
161           xy[10] = -xD1; xy[11] =  yD0; 
162           xy[12] =  xD1; xy[13] =  yD0;
163           xy[14] =  xD1; xy[15] = -yD0; 
164           TGeoArb8* shDDIP2 =  new TGeoArb8(zD0, xy); 
165     shDDIP2->SetName("shDDIP2");
166     TGeoTranslation* trDDIP2 = new TGeoTranslation("trDDIP2", 0., 0., kZDipole - 12.);
167     trDDIP2->RegisterYourself();
168
169     TGeoTube* shDDIP3 =  new TGeoTube(0., 30., 40.);
170     shDDIP3->SetName("shDDIP3");
171
172
173     TGeoCompositeShape*  shDDIP = new TGeoCompositeShape("shDDIP", "shDDIP1+(shDDIP2:trDDIP2-shDDIP3:trDDIP2)");
174     TGeoVolume*  voDDIP = new TGeoVolume("DDIP", shDDIP, kMedAir);
175 //
176 // Yoke
177 // 
178
179     TGeoVolumeAssembly* asYoke = new TGeoVolumeAssembly("DYoke");       
180 // Base
181     char name[16];
182     Float_t lx0 = gapWidthFront + 2. * blockHeight;
183     Float_t lx  = lx0;
184     
185     TGeoVolumeAssembly* asYokeBase = new TGeoVolumeAssembly("DYokeBase");       
186     for (Int_t i = 0; i < 7; i++) {
187       snprintf(name, 16, "DYokeBaseBlock%1d", i);
188       TGeoVolume*  voBaseBlock = new TGeoVolume(name,
189                                                   new TGeoBBox(lx/2., blockHeight/2., blockLength/2.),
190                                                   kMedSteel);
191         asYokeBase->AddNode(voBaseBlock, 1, new TGeoTranslation(0., 0., Float_t(i - 3) * blockLength));
192         lx += 2. * dGap;
193     }
194
195     asYoke->AddNode(asYokeBase, 1, new TGeoTranslation(0., -(gapHeight + blockHeight)/2. , 0.));
196     asYoke->AddNode(asYokeBase, 2, new TGeoTranslation(0., +(gapHeight + blockHeight)/2. , 0.));
197
198  
199 // Side Wall
200     TGeoVolumeAssembly* asYokeSide = new TGeoVolumeAssembly("DYokeSide");       
201     TGeoVolume*  voSideBlock = new TGeoVolume("DSideBlock",
202                                               new TGeoBBox(blockHeight/2., gapHeight/2., blockLength/2.),
203                                               kMedSteel);
204     
205     for (Int_t i = 0; i < 7; i++) {
206         asYokeSide->AddNode(voSideBlock, i, new TGeoTranslation(Float_t(i - 3) * dGap, 0., Float_t(i - 3) * blockLength));
207     }
208
209
210     asYoke->AddNode(asYokeSide, 1, new TGeoTranslation(+lx0/2. + 3. * dGap - blockHeight/2., 0., 0.));
211     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     Float_t phiKnee  = phiMax * kDegrad;
224     Float_t  rKnee   = 31.5;
225     
226 //  Circular sections
227     TGeoVolumeAssembly* asCoil = new TGeoVolumeAssembly("DCoil");       
228
229     TGeoVolume*  voDC1 = new TGeoVolume("DC1",
230                                               new TGeoTubeSeg(coilRi, coilRo, coilH / 2., phiMin, phiMax),
231                                               kMedCoil);
232     TGeoVolume*  voDC2 = new TGeoVolume("DC2",
233                                               new TGeoTubeSeg(coilRi + 5., coilRo - 5., coilH / 2., phiMin, phiMax),
234                                               kMedCoilSh);
235
236     voDC1->AddNode(voDC2, 1, gGeoIdentity);
237     voDC2->SetVisibility(0);
238
239     dz = lengthSt / 2. + coilH / 2. + rKnee;
240     dx = 0.;
241     
242     asCoil->AddNode(voDC1, 1, new TGeoTranslation(-dx, 0., -dz));
243     asCoil->AddNode(voDC1, 2, new TGeoCombiTrans(  dx, 0., -dz, rotxy180));
244     asCoil->AddNode(voDC1, 3, new TGeoTranslation(-dx, 0.,  dz));
245     asCoil->AddNode(voDC1, 4, new TGeoCombiTrans(  dx, 0.,  dz, rotxz180));
246
247     
248 // 90deg Knees
249
250     
251     TGeoVolume* voDC11 = new TGeoVolume("DC11", 
252                                        new TGeoTubeSeg(rKnee, rKnee + coilH, coilD/2., 270., 360.),
253                                        kMedCoil);
254     
255     
256     dx = - TMath::Cos(phiKnee) * (coilRi + coilD/2.); 
257     dy = - TMath::Sin(phiKnee) * (coilRi + coilD/2.);  
258     dz = lengthSt / 2.;
259
260     asCoil->AddNode(voDC11, 1, new TGeoCombiTrans( dx, dy,  -dz, rot00));
261     asCoil->AddNode(voDC11, 2, new TGeoCombiTrans( dx, dy,   dz, rot02));
262     asCoil->AddNode(voDC11, 3, new TGeoCombiTrans(-dx, dy,  -dz, rot01));
263     asCoil->AddNode(voDC11, 4, new TGeoCombiTrans(-dx, dy,   dz, rot03));
264
265     TGeoVolume* voDC12 = new TGeoVolume("DC12", 
266                                        new TGeoTubeSeg(rKnee, rKnee + coilH, coilD/2., 0., 90.),
267                                        kMedCoil);
268     
269
270     asCoil->AddNode(voDC12, 1, new TGeoCombiTrans( dx, -dy,  -dz, rot01));
271     asCoil->AddNode(voDC12, 2, new TGeoCombiTrans( dx, -dy,   dz, rot03));
272     asCoil->AddNode(voDC12, 3, new TGeoCombiTrans(-dx, -dy,  -dz, rot00));
273     asCoil->AddNode(voDC12, 4, new TGeoCombiTrans(-dx, -dy,   dz, rot02));
274
275 // Straight sections
276
277     
278     TGeoVolume* voDL0 = new TGeoVolume("DL0", 
279                                        new TGeoBBox(coilD / 2. + 2., coilH / 2. + 2., lengthSt / 2.),
280                                        kMedCoil);
281
282     TGeoVolume* voDL1 = new TGeoVolume("DL1", 
283                                        new TGeoBBox(coilD / 2., coilH / 2., lengthSt / 2.),
284                                        kMedCoil);
285     
286
287     TGeoVolume* voDL2 = new TGeoVolume("DL2", 
288                                        new TGeoBBox(coilD / 2. - 5., coilH / 2. - 5., lengthSt / 2. - 5.),
289                                        kMedCoilSh);
290     // Sleeves
291     TGeoVolume* voDL3 = new TGeoVolume("DL3", 
292                                        new TGeoBBox(1., coilH / 2., 120.),
293                                        kMedAlu);
294
295     TGeoVolume* voDL4 = new TGeoVolume("DL4", 
296                                        new TGeoBBox(coilD/2., 1., 120.),
297                                        kMedAlu);
298     
299     voDL0->SetVisibility(0);
300     voDL1->AddNode(voDL2, 1, gGeoIdentity);
301     voDL0->AddNode(voDL1, 1, gGeoIdentity);
302     voDL0->AddNode(voDL3, 1, new TGeoTranslation(-coilD/2. - 1., 0., 0.));
303     voDL0->AddNode(voDL3, 2, new TGeoTranslation(+coilD/2. + 1., 0., 0.));
304     voDL0->AddNode(voDL4, 1, new TGeoTranslation(0., -coilH/2. - 1., 0.));
305     voDL0->AddNode(voDL4, 2, new TGeoTranslation(0., +coilH/2. + 1., 0.));
306     
307     
308     dx += (rKnee + coilH/2.)  * TMath::Sin(phiKnee);
309     dy -= (rKnee + coilH/2.)  * TMath::Cos(phiKnee);
310     dz = 0.; 
311     
312     asCoil->AddNode(voDL0, 1, new TGeoCombiTrans( dx,  dy, dz, rot04));
313     asCoil->AddNode(voDL0, 2, new TGeoCombiTrans( dx, -dy, dz, rot05));
314     asCoil->AddNode(voDL0, 3, new TGeoCombiTrans(-dx,  dy, dz, rot06));
315     asCoil->AddNode(voDL0, 4, new TGeoCombiTrans(-dx, -dy, dz, rot07));
316
317 // Contactor
318 // Outer face planes
319     
320     TGeoVolumeAssembly* asContactor = new TGeoVolumeAssembly("DContactor");
321     dx = -5.;
322     TGeoVolume* voDC10 = new TGeoVolume("DC10", 
323                                         new TGeoTubeSeg(coilRo + 5.1, coilRo + 73.5, 1., -20., 20.),
324                                         kMedCable);
325     asContactor->AddNode(voDC10, 1, new TGeoTranslation(dx, 0, -32.325));
326     asContactor->AddNode(voDC10, 2, new TGeoTranslation(dx, 0, +32.325));
327  
328
329 // Coil Support
330 // 
331     Float_t sW = 83.;
332     
333     TGeoVolumeAssembly* asDCoilSupport = new TGeoVolumeAssembly("DCoilSupport");
334
335     // Steel fixed to the yoke
336     TGeoVolume* voDCS01 = new TGeoVolume("DCS01", 
337                                          new TGeoTubeSeg(coilRo, 325.,  1., 21., 51.),
338                                          kMedAlu);
339     
340     // Steel on the coil
341     TGeoVolume* voDCS02 = new TGeoVolume("DCS02", 
342                                          new TGeoTubeSeg(coilRo, coilRo + 3.125, sW/2., 21., 51.),
343                                          kMedAlu);
344     TGeoVolume* voDCS021 = new TGeoVolume("DCS021", 
345                                          new TGeoConeSeg(sW/2., coilRo + 3.124, 320., coilRo + 3.125, coilRo + 5.125, 21., 21.4),
346                                          kMedAlu);
347     
348
349     // Sleeves
350     TGeoVolume* voDCS03 = new TGeoVolume("DCS03", 
351                                          new TGeoTubeSeg(coilRi - 3.125, coilRo + 3.125,  3.125/2., 21., 51.),
352                                          kMedAlu);
353
354     TGeoVolume* voDCS04 = new TGeoVolume("DCS04", 
355                                          new TGeoTubeSeg(coilRi - 3.125, coilRi,  coilH/2., 21., 51.),
356                                          kMedAlu);
357     
358
359     TGeoVolume* voDCS05 = new TGeoVolume("DCS05", 
360                                          new TGeoTubeSeg(coilRi - 3.125, coilRo,  3.125/2., 21., 51.),
361                                          kMedAlu);
362     // 
363     asDCoilSupport->AddNode(voDCS02, 1, new TGeoTranslation(0., 0., -(sW - coilH)/2.));
364     asDCoilSupport->AddNode(voDCS04, 1, gGeoIdentity);    
365     for (Int_t i = 0; i < 9; i++) 
366     {
367         char nameR[16];
368         snprintf(nameR, 16, "rotdcs%1d", i);
369         Float_t phi = Float_t(i) * 3.75;
370         TGeoRotation* rot   = new TGeoRotation(nameR, 90., phi, 90., 90. + phi,    0.,   0.);   
371         asDCoilSupport->AddNode(voDCS021, i, new TGeoCombiTrans(0., 0.004, -(sW - coilH)/2., rot));    
372     }
373     
374
375
376     asDCoilSupport->AddNode(voDCS01, 1, new TGeoTranslation(0., 0., -sW/2. - (sW - coilH)/2. - 3.125/2.));    
377     asDCoilSupport->AddNode(voDCS03, 1, new TGeoTranslation(0., 0., +coilH/2. + 3.125/2.));    
378     asDCoilSupport->AddNode(voDCS05, 1, new TGeoTranslation(0., 0., -coilH/2. - 3.125/2.));    
379
380
381     //
382     // SAA1 Support: Hanger 1
383     //
384     TGeoTranslation* trHanger = new TGeoTranslation("trHanger", 0., 250., 0.);
385     trHanger->RegisterYourself();
386     
387     Float_t rmin1, rmin2, rmax1, rmax2;
388
389     Float_t zHanger1 = 811.9;
390     TGeoBBox* shHanger11  = new TGeoBBox(2.5/2., 250., 25./2.);
391     shHanger11->SetName("shHanger11");
392     
393     rmin1 = (zHanger1 - 13.) * TMath::Tan(2. * kDegrad);
394     rmin2 = rmin1 + 26. * TMath::Tan( 2.0 * kDegrad);
395
396     rmax1 = (zHanger1 - 13.) * TMath::Tan(9. * kDegrad);
397     rmax2 = rmax1 + 26. * TMath::Tan(9. * kDegrad);
398
399     TGeoCone* shHanger12  = new TGeoCone(13., rmin1, rmax1, rmin2, rmax2);
400     shHanger12->SetName("shHanger12");
401     TGeoCompositeShape*  shHanger1 = new TGeoCompositeShape("shHanger1", "shHanger12*shHanger11:trHanger");
402     TGeoVolume* voHanger1 = new TGeoVolume("DHanger1", shHanger1, kMedSteel);
403     //
404     // SAA1 Support: Hanger 2
405     //
406     Float_t zHanger2 = 1171.9;
407     TGeoBBox* shHanger21  = new TGeoBBox(3.5/2., 250., 25./2.);
408     shHanger21->SetName("shHanger21");
409
410     rmin1 = 35.8 + (zHanger2 - 13. - zst) * TMath::Tan(2. * kDegrad);
411     rmin2 = rmin1 + 26. * TMath::Tan( 2.0 * kDegrad);
412
413     rmax1 = rcD1 + (zHanger2 - 13. - kZDipole) * TMath::Tan(10.1 * kDegrad);
414     rmax2 = rmax1 + 26. * TMath::Tan(10.1 * kDegrad);
415     TGeoCone* shHanger22  = new TGeoCone(13., rmin1, rmax1, rmin2, rmax2);
416     shHanger22->SetName("shHanger22");
417
418     TGeoCompositeShape*  shHanger2 = new TGeoCompositeShape("shHanger2", "shHanger22*shHanger21:trHanger");
419     
420     TGeoVolume* voHanger2 = new TGeoVolume("DHanger2", shHanger2, kMedSteel);
421     //
422     // Hanger support
423     Float_t hsLength = yokeLength + (zHanger2 - kZDipole - yokeLength/2.) + 25./2.;
424     
425     TGeoVolume* voHS1 = new TGeoVolume("DHS1", new TGeoBBox( 1.5, 12.5, hsLength/2.), kMedSteel);
426     TGeoVolume* voHS2 = new TGeoVolume("DHS2", new TGeoBBox(12.5,  1.5, hsLength/2.), kMedSteel);
427     Float_t hsH = gapHeight/2. + blockHeight - (rmax1+rmax2)/2. - 2.;
428     
429     TGeoVolume* voHS3 = new TGeoVolume("DHS3", new TGeoBBox(3.5/2., hsH/2., 25./2.),    kMedSteel);
430
431     TGeoVolumeAssembly* asHS = new TGeoVolumeAssembly("asHS");
432     asHS->AddNode(voHS1, 1, gGeoIdentity);
433     asHS->AddNode(voHS2, 1, new TGeoTranslation(0., +14., 0.));
434     asHS->AddNode(voHS2, 2, new TGeoTranslation(0., -14., 0.));
435     asHS->AddNode(voHS3, 1, new TGeoTranslation(0., -hsH/2. - 14. -1.5, hsLength/2. - 25./2.));
436     
437     
438
439     dz = zHanger1;
440     voDDIP->AddNode(voHanger1, 1, new TGeoTranslation(0., 0., dz));
441
442     dz = zHanger2;
443     voDDIP->AddNode(voHanger2, 1, new TGeoTranslation(0., 0., dz));
444     
445     
446     
447     
448     // Assembly everything
449
450     TGeoVolumeAssembly* asDipole = new TGeoVolumeAssembly("Dipole");
451     // Yoke
452     asDipole->AddNode(asYoke, 1, new TGeoTranslation(0., 0., -dzCoil));
453     asDipole->AddNode(asCoil, 1, gGeoIdentity);
454     // Contactor
455     dz = lengthSt / 2. + coilH / 2. + rKnee;
456     asDipole->AddNode(asContactor, 1, new TGeoTranslation(0., 0., dz + dzCoil));
457     asDipole->AddNode(asContactor, 2, new TGeoCombiTrans( 0., 0., dz - dzCoil, rotxy180));
458     // Coil support
459     asDipole->AddNode(asDCoilSupport, 1, new TGeoTranslation(0., 0., dz));
460     asDipole->AddNode(asDCoilSupport, 2, new TGeoCombiTrans( 0., 0., dz, rotxy180));
461     asDipole->AddNode(asDCoilSupport, 3, new TGeoCombiTrans( 0., 0., dz, rotxy108));
462     asDipole->AddNode(asDCoilSupport, 4, new TGeoCombiTrans( 0., 0., dz, rotxy288));
463     
464     asDipole->AddNode(asDCoilSupport, 5, new TGeoCombiTrans( 0., 0., -dz, rotiz));
465     asDipole->AddNode(asDCoilSupport, 6, new TGeoCombiTrans( 0., 0., -dz, rotxz108));
466     asDipole->AddNode(asDCoilSupport, 7, new TGeoCombiTrans( 0., 0., -dz, rotxz180));
467     asDipole->AddNode(asDCoilSupport, 8, new TGeoCombiTrans( 0., 0., -dz, rotxz288));
468     
469     // Hanger (Support)
470     dy = gapHeight/2. + blockHeight + 14.;
471     
472     asDipole->AddNode(asHS, 1, new TGeoTranslation(0., dy + 1.5, ((zHanger2 - kZDipole - yokeLength/2.) + 25./2.)/2.));
473     
474     
475     asDipole->SetVisContainers(1);
476     voDDIP->SetVisibility(0);
477
478     top->AddNode(asDipole, 1, new TGeoCombiTrans(0.,  dipoleL / 2. * TMath::Tan(alhc * kDegrad), -kZDipole, rotxzlhc));
479     top->AddNode(voDDIP,   1, new TGeoCombiTrans(0., 0., 0., rotxz));
480 }
481
482
483
484
485
486
487