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 :
|