]>
Commit | Line | Data |
---|---|---|
7778505e | 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> | |
0bea8de9 | 23 | #include <TGeoArb8.h> |
7778505e | 24 | #include <TGeoBBox.h> |
25 | #include <TGeoTube.h> | |
26 | #include <TGeoCone.h> | |
27 | #include <TGeoPcon.h> | |
d4916cbf | 28 | #include <TGeoCompositeShape.h> |
7778505e | 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 | // | |
d4916cbf | 41 | // Last design of magnetic dipole version 3 |
7778505e | 42 | // |
43 | } | |
44 | ||
45 | //_____________________________________________________________________________ | |
46 | AliDIPOv3::AliDIPOv3(const char *name, const char *title) | |
cf0c8fa1 | 47 | : AliDIPOv2(name,title) |
7778505e | 48 | { |
49 | // | |
d4916cbf | 50 | // Standard constructor for the magnetic dipole version 3 |
7778505e | 51 | } |
52 | ||
53 | ||
54 | //_____________________________________________________________________________ | |
55 | void AliDIPOv3::CreateSpectrometerDipole() | |
56 | { | |
57 | // Detailed dipole geometry as built | |
58 | // | |
d4916cbf | 59 | // Drawing: ALIP2A__0026 |
60 | // Geometer measurements: EDMS 596079 | |
61 | // EDMS 584963 | |
62 | ||
7778505e | 63 | // |
64 | // The top volume | |
65 | // | |
66 | TGeoVolume* top = gGeoManager->GetVolume("ALIC"); | |
67 | // | |
68 | // Media | |
69 | // | |
d4916cbf | 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"); | |
7778505e | 76 | // |
d4916cbf | 77 | // Rotations |
7778505e | 78 | // |
d4916cbf | 79 | Float_t alhc = 0.794; |
80 | ||
cf0c8fa1 | 81 | TGeoRotation* rotxz = new TGeoRotation("rotxz", 270., 0., 90., 90., 180., 0.); |
82 | TGeoRotation* rotiz = new TGeoRotation("rotiz", 90., 0., 90., 90., 180., 0.); | |
d4916cbf | 83 | TGeoRotation* rotxzlhc = new TGeoRotation("rotxzlhc", 180., 180. + alhc, 0.); |
d4916cbf | 84 | |
7778505e | 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 | ||
d4916cbf | 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; | |
7778505e | 114 | |
7778505e | 115 | Float_t dx, dy, dz; |
d4916cbf | 116 | |
117 | ||
7778505e | 118 | // |
cf0c8fa1 | 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); | |
d4916cbf | 125 | Float_t rcD1 = kZDipole * TMath::Tan(9. * kDegrad); |
d4916cbf | 126 | Float_t rcD2 = rcD1 + dipoleL/2. * TMath::Tan(10.1 * kDegrad); |
cf0c8fa1 | 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; | |
0bea8de9 | 132 | Float_t riD1 = 28.9; |
cf0c8fa1 | 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); | |
0bea8de9 | 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); | |
5c8f914e | 165 | shDDIP2->SetName("shDDIP2"); |
c52bffc9 | 166 | TGeoTranslation* trDDIP2 = new TGeoTranslation("trDDIP2", 0., 0., kZDipole - 12.); |
cf0c8fa1 | 167 | trDDIP2->RegisterYourself(); |
168 | ||
c52bffc9 | 169 | TGeoTube* shDDIP3 = new TGeoTube(0., 30., 40.); |
170 | shDDIP3->SetName("shDDIP3"); | |
d4916cbf | 171 | |
c52bffc9 | 172 | |
173 | TGeoCompositeShape* shDDIP = new TGeoCompositeShape("shDDIP", "shDDIP1+(shDDIP2:trDDIP2-shDDIP3:trDDIP2)"); | |
d4916cbf | 174 | TGeoVolume* voDDIP = new TGeoVolume("DDIP", shDDIP, kMedAir); |
7778505e | 175 | // |
176 | // Yoke | |
177 | // | |
7778505e | 178 | |
179 | TGeoVolumeAssembly* asYoke = new TGeoVolumeAssembly("DYoke"); | |
180 | // Base | |
e296b8f1 | 181 | char name[16]; |
7778505e | 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++) { | |
e296b8f1 | 187 | snprintf(name, 16, "DYokeBaseBlock%1d", i); |
188 | TGeoVolume* voBaseBlock = new TGeoVolume(name, | |
7778505e | 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.)); | |
cf0c8fa1 | 211 | asYoke->AddNode(asYokeSide, 2, new TGeoCombiTrans( -lx0/2. - 3. * dGap + blockHeight/2., 0., 0., rotiz)); |
7778505e | 212 | |
213 | // | |
214 | // Coils | |
215 | // | |
d4916cbf | 216 | Float_t coilRi = 206.; |
7778505e | 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.; | |
d4916cbf | 222 | Float_t lengthSt = 240. + 33.9; |
7778505e | 223 | Float_t phiKnee = phiMax * kDegrad; |
d4916cbf | 224 | Float_t rKnee = 31.5; |
7778505e | 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", | |
d4916cbf | 323 | new TGeoTubeSeg(coilRo + 5.1, coilRo + 73.5, 1., -20., 20.), |
7778505e | 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 | // | |
d4916cbf | 331 | Float_t sW = 83.; |
7778505e | 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", | |
d4916cbf | 342 | new TGeoTubeSeg(coilRo, coilRo + 3.125, sW/2., 21., 51.), |
7778505e | 343 | kMedAlu); |
344 | TGeoVolume* voDCS021 = new TGeoVolume("DCS021", | |
968388a6 | 345 | new TGeoConeSeg(sW/2., coilRo + 3.124, 320., coilRo + 3.125, coilRo + 5.125, 21., 21.4), |
7778505e | 346 | kMedAlu); |
347 | ||
348 | ||
349 | // Sleeves | |
350 | TGeoVolume* voDCS03 = new TGeoVolume("DCS03", | |
d4916cbf | 351 | new TGeoTubeSeg(coilRi - 3.125, coilRo + 3.125, 3.125/2., 21., 51.), |
7778505e | 352 | kMedAlu); |
353 | ||
354 | TGeoVolume* voDCS04 = new TGeoVolume("DCS04", | |
d4916cbf | 355 | new TGeoTubeSeg(coilRi - 3.125, coilRi, coilH/2., 21., 51.), |
7778505e | 356 | kMedAlu); |
357 | ||
358 | ||
359 | TGeoVolume* voDCS05 = new TGeoVolume("DCS05", | |
d4916cbf | 360 | new TGeoTubeSeg(coilRi - 3.125, coilRo, 3.125/2., 21., 51.), |
7778505e | 361 | kMedAlu); |
362 | // | |
7778505e | 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 | { | |
3b7df2c4 | 367 | char nameR[16]; |
e296b8f1 | 368 | snprintf(nameR, 16, "rotdcs%1d", i); |
7778505e | 369 | Float_t phi = Float_t(i) * 3.75; |
3b7df2c4 | 370 | TGeoRotation* rot = new TGeoRotation(nameR, 90., phi, 90., 90. + phi, 0., 0.); |
dd6154b2 | 371 | asDCoilSupport->AddNode(voDCS021, i, new TGeoCombiTrans(0., 0.004, -(sW - coilH)/2., rot)); |
7778505e | 372 | } |
373 | ||
374 | ||
375 | ||
d4916cbf | 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.)); | |
7778505e | 379 | |
d4916cbf | 380 | |
381 | // | |
382 | // SAA1 Support: Hanger 1 | |
383 | // | |
384 | TGeoTranslation* trHanger = new TGeoTranslation("trHanger", 0., 250., 0.); | |
385 | trHanger->RegisterYourself(); | |
7778505e | 386 | |
d4916cbf | 387 | Float_t rmin1, rmin2, rmax1, rmax2; |
388 | ||
389 | Float_t zHanger1 = 811.9; | |
5c8f914e | 390 | TGeoBBox* shHanger11 = new TGeoBBox(2.5/2., 250., 25./2.); |
391 | shHanger11->SetName("shHanger11"); | |
392 | ||
d4916cbf | 393 | rmin1 = (zHanger1 - 13.) * TMath::Tan(2. * kDegrad); |
394 | rmin2 = rmin1 + 26. * TMath::Tan( 2.0 * kDegrad); | |
cf0c8fa1 | 395 | |
d4916cbf | 396 | rmax1 = (zHanger1 - 13.) * TMath::Tan(9. * kDegrad); |
397 | rmax2 = rmax1 + 26. * TMath::Tan(9. * kDegrad); | |
398 | ||
5c8f914e | 399 | TGeoCone* shHanger12 = new TGeoCone(13., rmin1, rmax1, rmin2, rmax2); |
400 | shHanger12->SetName("shHanger12"); | |
d4916cbf | 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; | |
5c8f914e | 407 | TGeoBBox* shHanger21 = new TGeoBBox(3.5/2., 250., 25./2.); |
408 | shHanger21->SetName("shHanger21"); | |
d4916cbf | 409 | |
cf0c8fa1 | 410 | rmin1 = 35.8 + (zHanger2 - 13. - zst) * TMath::Tan(2. * kDegrad); |
d4916cbf | 411 | rmin2 = rmin1 + 26. * TMath::Tan( 2.0 * kDegrad); |
cf0c8fa1 | 412 | |
d4916cbf | 413 | rmax1 = rcD1 + (zHanger2 - 13. - kZDipole) * TMath::Tan(10.1 * kDegrad); |
414 | rmax2 = rmax1 + 26. * TMath::Tan(10.1 * kDegrad); | |
5c8f914e | 415 | TGeoCone* shHanger22 = new TGeoCone(13., rmin1, rmax1, rmin2, rmax2); |
416 | shHanger22->SetName("shHanger22"); | |
417 | ||
d4916cbf | 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); | |
c52bffc9 | 427 | Float_t hsH = gapHeight/2. + blockHeight - (rmax1+rmax2)/2. - 2.; |
d4916cbf | 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.)); | |
ca3e9926 | 435 | asHS->AddNode(voHS3, 1, new TGeoTranslation(0., -hsH/2. - 14. -1.5, hsLength/2. - 25./2.)); |
d4916cbf | 436 | |
437 | ||
438 | ||
cf0c8fa1 | 439 | dz = zHanger1; |
440 | voDDIP->AddNode(voHanger1, 1, new TGeoTranslation(0., 0., dz)); | |
d4916cbf | 441 | |
cf0c8fa1 | 442 | dz = zHanger2; |
443 | voDDIP->AddNode(voHanger2, 1, new TGeoTranslation(0., 0., dz)); | |
d4916cbf | 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)); | |
7778505e | 453 | asDipole->AddNode(asCoil, 1, gGeoIdentity); |
d4916cbf | 454 | // Contactor |
7778505e | 455 | dz = lengthSt / 2. + coilH / 2. + rKnee; |
d4916cbf | 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 | |
7778505e | 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)); | |
d4916cbf | 463 | |
cf0c8fa1 | 464 | asDipole->AddNode(asDCoilSupport, 5, new TGeoCombiTrans( 0., 0., -dz, rotiz)); |
7778505e | 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)); | |
d4916cbf | 468 | |
469 | // Hanger (Support) | |
470 | dy = gapHeight/2. + blockHeight + 14.; | |
471 | ||
ca3e9926 | 472 | asDipole->AddNode(asHS, 1, new TGeoTranslation(0., dy + 1.5, ((zHanger2 - kZDipole - yokeLength/2.) + 25./2.)/2.)); |
d4916cbf | 473 | |
474 | ||
475 | asDipole->SetVisContainers(1); | |
7778505e | 476 | voDDIP->SetVisibility(0); |
7778505e | 477 | |
cf0c8fa1 | 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)); | |
7778505e | 480 | } |
481 | ||
482 | ||
483 | ||
484 | ||
485 | ||
486 | ||
487 |