]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STRUCT/AliDIPOv3.cxx
Updated macros for PHOS alignment calculation
[u/mrichter/AliRoot.git] / STRUCT / AliDIPOv3.cxx
CommitLineData
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
35ClassImp(AliDIPOv3)
36
37//_____________________________________________________________________________
38AliDIPOv3::AliDIPOv3()
39{
40 //
d4916cbf 41 // Last design of magnetic dipole version 3
7778505e 42 //
43}
44
45//_____________________________________________________________________________
46AliDIPOv3::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//_____________________________________________________________________________
55void 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