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