Project
Loading...
Searching...
No Matches
FrameStructure.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#include "Field/MagneticField.h"
16#include <TGeoArb8.h>
17#include <TGeoBBox.h>
18#include <TGeoBoolNode.h>
19#include <TGeoCompositeShape.h>
20#include <TGeoManager.h>
21#include <TGeoMatrix.h>
22#include <TGeoPgon.h>
23#include <TGeoTrd1.h>
24#include <TGeoTube.h>
25#include <TGeoXtru.h>
26#include <TMath.h>
27#include <TString.h>
28#include <TVirtualMC.h>
29
30#include <cassert>
31
33
34namespace o2
35{
36namespace passive
37{
38const char* TOPNAME = "barrel";
39#define AliMatrix TVirtualMC::GetMC()->Matrix
40#define kRaddeg TMath::RadToDeg()
41#define kDegrad TMath::DegToRad()
42
46FrameStructure::FrameStructure(const char* name, const char* Title) : PassiveBase(name, Title)
47{
48}
49
51{
52}
53
55{
56 std::cout << "cloning FrameStructure - now the right one !" << std::endl;
57 return new FrameStructure(*this);
58}
59
60void FrameStructure::makeHeatScreen(const char* name, float dyP, int rot1, int rot2)
61{
62 // Heat screen panel
63 //
64 auto vmc = TVirtualMC::GetMC();
65 const int kAir = mAirMedID;
66 const int kAlu = mAluMedID;
67
68 float dx, dy;
69 char mname[16];
70 char cname[16];
71 char t1name[16];
72 char t2name[16];
73 char t3name[16];
74 char t4name[16];
75 char t5name[16];
76
77 //
78 float dxP = 2. * (287. * TMath::Sin(10. * TMath::Pi() / 180.) - 2.);
79 float dzP = 1.05;
80 //
81 // Mother volume
82 float thshM[3];
83 thshM[0] = dxP / 2.;
84 thshM[1] = dyP / 2.;
85 thshM[2] = dzP / 2.;
86 snprintf(mname, 16, "BTSH_%s", name);
87 vmc->Gsvolu(mname, "BOX ", kAir, thshM, 3);
88 //
89 // Aluminum sheet
90 thshM[2] = 0.025;
91 snprintf(cname, 16, "BTSHA_%s", name);
92 vmc->Gsvolu(cname, "BOX ", kAlu, thshM, 3);
93 vmc->Gspos(cname, 1, mname, 0., 0., -0.5, 0);
94 //
95 // Tubes
96 float thshT[3];
97 thshT[0] = 0.4;
98 thshT[1] = 0.5;
99 thshT[2] = (dyP / 2. - 8.);
100 //
101 snprintf(t1name, 16, "BTSHT1_%s", name);
102 vmc->Gsvolu(t1name, "TUBE", kAlu, thshT, 3);
103 dx = -dxP / 2. + 8. - 0.5;
104 vmc->Gspos(t1name, 1, mname, dx, 0., 0.025, rot1);
105 //
106 snprintf(t2name, 16, "BTSHT2_%s", name);
107 snprintf(t3name, 16, "BTSHT3_%s", name);
108 snprintf(t4name, 16, "BTSHT4_%s", name);
109 snprintf(t5name, 16, "BTSHT5_%s", name);
110 thshT[2] = (thshM[1] - 12.);
111 vmc->Gsvolu(t2name, "TUBE", kAlu, thshT, 3);
112 thshT[2] = 7.9 / 2.;
113 vmc->Gsvolu(t3name, "TUBE", kAlu, thshT, 3);
114 thshT[2] = 23.9 / 2.;
115 vmc->Gsvolu(t4name, "TUBE", kAlu, thshT, 3);
116
117 int sig = 1;
118 int ipo = 1;
119 for (int i = 0; i < 5; i++) {
120 sig *= -1;
121 dx += 8.00;
122 dy = 4. * sig;
123 float dy1 = -(thshM[1] - 15.5) * sig;
124 float dy2 = -(thshM[1] - 7.5) * sig;
125
126 vmc->Gspos(t2name, ipo++, mname, dx, dy, 0.025, rot1);
127 dx += 6.9;
128 vmc->Gspos(t2name, ipo++, mname, dx, dy, 0.025, rot1);
129
130 vmc->Gspos(t3name, i + 1, mname, dx - 3.45, dy1, 0.025, rot2);
131 vmc->Gspos(t4name, i + 1, mname, dx - 3.45, dy2, 0.025, rot2);
132 }
133 dx += 8.;
134 vmc->Gspos(t1name, 2, mname, dx, 0., 0.025, rot1);
135 vmc->Gspos(t3name, 6, mname, dx - 3.45, -(thshM[1] - 7.5), 0.025, rot2);
136}
137
138void FrameStructure::createWebFrame(const char* name, float dHz, float theta0, float phi0)
139{
140 //
141 // Create a web frame element
142 //
143 auto vmc = TVirtualMC::GetMC();
144
145 phi0 = 0.;
146 const float krad2deg = 180. / TMath::Pi();
147 const float kdeg2rad = 1. / krad2deg;
148 const int kAir = mAirMedID;
149 const int kSteel = mSteelMedID;
150
151 float ptrap[11];
152 char nameA[16];
153 snprintf(nameA, 16, "%sA", name);
154
155 char nameI[16];
156 snprintf(nameI, 16, "%sI", name);
157
158 theta0 *= kdeg2rad;
159 phi0 *= kdeg2rad;
160 float theta = TMath::Pi() / 2.;
161 float phi = TMath::ACos(TMath::Cos(theta0) * TMath::Cos(phi0));
162
163 if (phi0 < 0) {
164 phi = -phi;
165 }
166
167 phi *= krad2deg;
168 theta *= krad2deg;
169
170 ptrap[0] = dHz / 2;
171 ptrap[2] = theta;
172 ptrap[1] = phi;
173 ptrap[3] = 6. / cos(theta0 * kdeg2rad) / 2.;
174 ptrap[4] = 1.;
175 ptrap[5] = ptrap[4];
176 ptrap[6] = 0;
177 ptrap[7] = ptrap[3];
178 ptrap[8] = ptrap[4];
179 ptrap[9] = ptrap[4];
180 ptrap[10] = 0;
181 vmc->Gsvolu(name, "TRAP", kSteel, ptrap, 11);
182 vmc->Gsvolu(nameI, "TRAP", kSteel, ptrap, 11);
183 ptrap[3] = (6. - 1.) / cos(theta0 * kdeg2rad) / 2.;
184 ptrap[4] = 0.75;
185 ptrap[5] = ptrap[4];
186 ptrap[7] = ptrap[3];
187 ptrap[8] = ptrap[4];
188 ptrap[9] = ptrap[4];
189
190 vmc->Gsvolu(nameA, "TRAP", kAir, ptrap, 11);
191 vmc->Gspos(nameA, 1, name, -0.25, 0.0, 0., 0, "ONLY");
192 vmc->Gspos(nameA, 2, nameI, +0.25, 0.0, 0., 0, "ONLY");
193 gGeoManager->GetVolume(name)->SetVisContainers();
194 gGeoManager->GetVolume(nameI)->SetVisContainers();
195}
196
197TGeoCompositeShape* FrameStructure::createTOFRail(float y)
198{
199 char nameSostA1[16];
200 snprintf(nameSostA1, 16, "SostA1");
201 TGeoBBox* boxSostA1 = new TGeoBBox(nameSostA1, 0.5, y, 2.0);
202 char nameCV[16];
203 snprintf(nameCV, 16, "CV");
204 TGeoArb8* CV = new TGeoArb8(nameCV, 2.35);
205 CV->SetVertex(0, 0.09, -y);
206 CV->SetVertex(1, 0.09, y);
207 CV->SetVertex(2, 0.89, y);
208 CV->SetVertex(3, 0.89, -y);
209 CV->SetVertex(4, -0.89, -y);
210 CV->SetVertex(5, -0.89, y);
211 CV->SetVertex(6, -0.09, y);
212 CV->SetVertex(7, -0.09, -y);
213
214 char nameCOB[16];
215 snprintf(nameCOB, 16, "COB");
216 TGeoBBox* boxCOB = new TGeoBBox(nameCOB, 2.0, y, 0.4);
217 char nameCOT[16];
218 snprintf(nameCOT, 16, "COT");
219 TGeoBBox* boxCOT = new TGeoBBox(nameCOT, 1.7, y, 0.4);
220
221 TGeoTranslation* trCOB = new TGeoTranslation("trCOB", 2.09, 0., -2.75);
222 trCOB->RegisterYourself();
223 TGeoTranslation* trCOT = new TGeoTranslation("trCOT", 0.81, 0., +2.75);
224 trCOT->RegisterYourself();
225 TGeoTranslation* trSostA1 = new TGeoTranslation("trSostA1", 2.39, 0., -0.35);
226 trSostA1->RegisterYourself();
227
228 TGeoCompositeShape* btofS1 = new TGeoCompositeShape("BtofS1", "CV+(COB:trCOB)+(COT:trCOT)+(SostA1:trSostA1)");
229 return btofS1;
230}
231
232void FrameStructure::createMaterials()
233{
235 // Creates the materials
236 float epsil, stemax, tmaxfd, deemax, stmin;
237
238 epsil = 1.e-4; // Tracking precision,
239 stemax = -0.01; // Maximum displacement for multiple scat
240 tmaxfd = -20.; // Maximum angle due to field deflection
241 deemax = -.3; // Maximum fractional energy loss, DLS
242 stmin = -.8;
243 int isxfld = 2; // field uniformity value as defined by Geant3
244 float sxmgmx = 10.; // max field
246
247 float asteel[4] = {55.847, 51.9961, 58.6934, 28.0855};
248 float zsteel[4] = {26., 24., 28., 14.};
249 float wsteel[4] = {.715, .18, .1, .005};
250
251 // Air
252
253 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
254 float zAir[4] = {6., 7., 8., 18.};
255 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
256 float dAir = 1.20479E-3;
257
258 // G10
259 // G10 60% SiO2 40% epoxy
260 float ag10[4] = {12.01, 1., 15.994, 28.086};
261 float zg10[4] = {6., 1., 8., 14.};
262 float wg10[4] = {0.194, 0.023, 0.443, 0.340};
263
264 matmgr.Mixture("FRAME", 22, "G10", ag10, zg10, 1.7, 4, wg10);
265 matmgr.Mixture("FRAME", 65, "STEEL$", asteel, zsteel, 7.88, 4, wsteel);
266 matmgr.Mixture("FRAME", 5, "AIR$ ", aAir, zAir, dAir, 4, wAir);
267 matmgr.Material("FRAME", 9, "ALU ", 26.98, 13., 2.7, 8.9, 37.2);
268
269 matmgr.Medium("FRAME", 65, "Steel", 65, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
270 matmgr.Medium("FRAME", 5, "Air", 5, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
271 matmgr.Medium("FRAME", 9, "Aluminum", 9, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
272 matmgr.Medium("FRAME", 22, "G10", 22, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
273
274 mAirMedID = matmgr.getMediumID("FRAME", 5);
275 mSteelMedID = matmgr.getMediumID("FRAME", 65);
276 mAluMedID = matmgr.getMediumID("FRAME", 9);
277 mG10MedID = matmgr.getMediumID("FRAME", 22);
278 // do a cross check
279 assert(gGeoManager->GetMedium("FRAME_Air")->GetId() == mAirMedID);
280 assert(gGeoManager->GetMedium("FRAME_Aluminum")->GetId() == mAluMedID);
281 assert(gGeoManager->GetMedium("FRAME_Steel")->GetId() == mSteelMedID);
282 assert(gGeoManager->GetMedium("FRAME_G10")->GetId() == mG10MedID);
283}
284
286{
287 auto vmc = TVirtualMC::GetMC();
288
289 // TODO: we should be allowed to call this function only once
290 if (vmc == nullptr) {
291 throw std::runtime_error("VMC instance not initialized");
292 }
293
294 // verify that we have the world volume already setup
295 if (gGeoManager != nullptr && gGeoManager->GetVolume(TOPNAME)) {
296 mCaveIsAvailable = true;
297 }
298
299 // create materials
300 createMaterials();
301
302 int idrotm[2299];
303
304 AliMatrix(idrotm[2070], 90.0, 0.0, 90.0, 270.0, 0.0, 0.0);
305 //
306 AliMatrix(idrotm[2083], 170.0, 0.0, 90.0, 90.0, 80.0, 0.0);
307 AliMatrix(idrotm[2084], 170.0, 180.0, 90.0, 90.0, 80.0, 180.0);
308 AliMatrix(idrotm[2085], 90.0, 180.0, 90.0, 90.0, 0.0, 0.0);
309 //
310 AliMatrix(idrotm[2086], 80.0, 0.0, 90.0, 90., -10.0, 0.0);
311 AliMatrix(idrotm[2096], 100.0, 0.0, 90.0, 90., 10.0, 0.0);
312 //
313 AliMatrix(idrotm[2087], -100.0, 0.0, 90.0, 270., -10.0, 0.0);
314 AliMatrix(idrotm[2097], -80.0, 0.0, 90.0, 270., 10.0, 0.0);
315
316 //
317 AliMatrix(idrotm[2088], 90.0, 180.0, 90.0, 270., 0.0, 0.0);
318 AliMatrix(idrotm[2089], 90.0, -90.0, 90.0, 0., 0.0, 0.0);
319 //
320 AliMatrix(idrotm[2090], 90.0, 0.0, 0.0, 0., 90.0, 90.0);
321 AliMatrix(idrotm[2091], 0.0, 0.0, 90.0, 90., 90.0, 0.0);
322 //
323 // Matrices have been imported from Euclid. Some simplification
324 // seems possible
325 //
326
327 AliMatrix(idrotm[2003], 0.0, 0.0, 90.0, 130.0, 90.0, 40.0);
328 AliMatrix(idrotm[2004], 180.0, 0.0, 90.0, 130.0, 90.0, 40.0);
329 AliMatrix(idrotm[2005], 180.0, 0.0, 90.0, 150.0, 90.0, 240.0);
330 AliMatrix(idrotm[2006], 0.0, 0.0, 90.0, 150.0, 90.0, 240.0);
331 AliMatrix(idrotm[2007], 0.0, 0.0, 90.0, 170.0, 90.0, 80.0);
332 AliMatrix(idrotm[2008], 180.0, 0.0, 90.0, 190.0, 90.0, 280.0);
333 AliMatrix(idrotm[2009], 180.0, 0.0, 90.0, 170.0, 90.0, 80.0);
334 AliMatrix(idrotm[2010], 0.0, 0.0, 90.0, 190.0, 90.0, 280.0);
335 AliMatrix(idrotm[2011], 0.0, 0.0, 90.0, 350.0, 90.0, 260.0);
336 AliMatrix(idrotm[2012], 180.0, 0.0, 90.0, 350.0, 90.0, 260.0);
337 AliMatrix(idrotm[2013], 180.0, 0.0, 90.0, 10.0, 90.0, 100.0);
338 AliMatrix(idrotm[2014], 0.0, 0.0, 90.0, 10.0, 90.0, 100.0);
339 AliMatrix(idrotm[2015], 0.0, 0.0, 90.0, 30.0, 90.0, 300.0);
340 AliMatrix(idrotm[2016], 180.0, 0.0, 90.0, 30.0, 90.0, 300.0);
341 AliMatrix(idrotm[2017], 180.0, 0.0, 90.0, 50.0, 90.0, 140.0);
342 AliMatrix(idrotm[2018], 0.0, 0.0, 90.0, 50.0, 90.0, 140.0);
343
344 AliMatrix(idrotm[2019], 180.0, 0.0, 90.0, 130.0, 90.0, 220.0);
345 AliMatrix(idrotm[2020], 180.0, 0.0, 90.0, 50.0, 90.0, 320.0);
346 AliMatrix(idrotm[2021], 180.0, 0.0, 90.0, 150.0, 90.0, 60.0);
347 AliMatrix(idrotm[2022], 180.0, 0.0, 90.0, 30.0, 90.0, 120.0);
348 AliMatrix(idrotm[2023], 180.0, 0.0, 90.0, 170.0, 90.0, 260.0);
349 AliMatrix(idrotm[2024], 180.0, 0.0, 90.0, 190.0, 90.0, 100.0);
350 AliMatrix(idrotm[2025], 180.0, 0.0, 90.0, 350.0, 90.0, 80.0);
351 AliMatrix(idrotm[2026], 180.0, 0.0, 90.0, 10.0, 90.0, 280.0);
352
353 AliMatrix(idrotm[2100], 180.0, 0.0, 90.0, 210.0, 90.0, 120.0);
354 AliMatrix(idrotm[2101], 180.0, 0.0, 90.0, 330.0, 90.0, 60.0);
355
356 AliMatrix(idrotm[2027], 0.0, 0.0, 90.0, 50.0, 90.0, 320.0);
357 AliMatrix(idrotm[2028], 0.0, 0.0, 90.0, 150.0, 90.0, 60.0);
358 AliMatrix(idrotm[2029], 0.0, 0.0, 90.0, 30.0, 90.0, 120.0);
359 AliMatrix(idrotm[2030], 0.0, 0.0, 90.0, 10.0, 90.0, 280.0);
360 AliMatrix(idrotm[2031], 0.0, 0.0, 90.0, 170.0, 90.0, 260.0);
361 AliMatrix(idrotm[2032], 0.0, 0.0, 90.0, 190.0, 90.0, 100.0);
362 AliMatrix(idrotm[2033], 0.0, 0.0, 90.0, 350.0, 90.0, 80.0);
363
364 //
365 // The Main Space Frame
366 // ALIP2A__0007
367 // ALIP2A__0008
368 //
369 float pbox[3], ptrap[11], ptrd1[4], ppgon[10];
370 float dx, dy, dz;
371 int i, j;
372 int jmod = 0;
373 //
374 // Constants
375 //
376 // Materials
377 const TGeoMedium* kMedAir = gGeoManager->GetMedium("FRAME_Air");
378 const TGeoMedium* kMedSteel = gGeoManager->GetMedium("FRAME_Steel");
379 const TGeoMedium* kMedAlu = gGeoManager->GetMedium("FRAME_Aluminum");
380 const int kAir = mAirMedID;
381 const int kSteel = mSteelMedID;
382 const int kAlu = mAluMedID;
383 const int kG10 = mG10MedID;
384 // Angles
385 const float kEps = 0.01;
386 const float krad2deg = 180. / TMath::Pi();
387 const float kdeg2rad = 1. / krad2deg;
388 const float sin10 = TMath::Sin(10. * kdeg2rad);
389 const float tan10 = TMath::Tan(10. * kdeg2rad);
390 const float cos10 = TMath::Cos(10. * kdeg2rad);
391 // Dimensions
392 // vertical distance of frame wrt to origin (center of inner rings)
393 const float hR = 286.00;
394 // Height of inner frame from lower edge to outer ring (sectors for detectors)
395 const float iFrH = 119.00;
396 //
397 // radial length of web frame elements
398 const float dHz = 113. / cos10 - 0.3; // 114.74 (114.5 on drawing)
399 // Positions of ring bars (ALIP2A_0008)
400 // outer
401 const float dymodU[3] = {71.5, 228.5, 339.5};
402 // inner
403 const float dymodL[3] = {50.0, 175.0, 297.5};
404 //
405 // orientation of web frame elements
406 const float dymodO[5] = {10., -40., 20., -27.1, 18.4};
407 // Position of web frame elements
408 float dymodW[5] = {70., 73.6, 224.5, 231.4, 340.2};
409 for (int ii = 0; ii < 5; ii++) {
410 dymodW[ii] = dymodW[ii] - 3. * TMath::Tan(dymodO[ii] * kdeg2rad);
411 }
412 // Inner ring bars (Pos 6)
413 const float ringH = 6.00; // Hight
414 const float ringW = 10.00; // Width of the ring bars in z
415 const float ringT = 1.00; // Thickness of bars
416 // inner longitudinal bars 4 x 6
417 const float longH = 6.00; // Height
418 const float longW = 4.00; // Width
419 // outer longitudianl bars 8 x 8
420 // const float longOD = 8.0;
421 // some extra space for mother volume
422 const float dext = sin10 * longW / 2. + 0.01;
423 // sector hight with extra space
424 const float iFrH0 = iFrH + dext;
425 // length of inner longitudinal bars
426 // inner
427 const float longLI = 615.;
428 const float zE = 376.5;
429 //
430 // Frame mother volume
431 //
432 TGeoPgon* shB77A = new TGeoPgon(0., 360., 18, 2);
433 shB77A->SetName("shB77A");
434 shB77A->DefineSection(0, -zE, 280., 422.15);
435 shB77A->DefineSection(1, zE, 280., 422.15);
436 TGeoBBox* shB77B = new TGeoBBox(3.42, 2., 375.5);
437 shB77B->SetName("shB77B");
438 TGeoTranslation* trB77A = new TGeoTranslation("trB77A", +283.32, 0., 0.);
439 TGeoTranslation* trB77B = new TGeoTranslation("trB77B", -283.32, 0., 0.);
440 trB77A->RegisterYourself();
441 trB77B->RegisterYourself();
442 TGeoPgon* shB77C = new TGeoPgon(60., 360., 18, 2);
443 shB77C->SetName("shB77C");
444 shB77C->DefineSection(0, -zE, 422.15, 423.70);
445 shB77C->DefineSection(1, zE, 422.15, 423.70);
446 TGeoCompositeShape* shB77 = new TGeoCompositeShape("shB77", "shB77A+shB77B:trB77A+shB77B:trB77B+shB77C");
447 TGeoVolume* voB77 = new TGeoVolume("B077", shB77, gGeoManager->GetMedium("FRAME_Air"));
448 voB77->SetName("B077"); // just to avoid a warning
449 vmc->Gspos("B077", 1, TOPNAME, 0., 30., 0., 0, "ONLY");
450 //
451 // Reference plane #1 for TRD
452 TGeoPgon* shBREFA = new TGeoPgon(0.0, 360., 18, 2);
453 shBREFA->DefineSection(0, -376., 280., 280.1);
454 shBREFA->DefineSection(1, 376., 280., 280.1);
455 shBREFA->SetName("shBREFA");
456 TGeoCompositeShape* shBREF1 = new TGeoCompositeShape("shBREF1", "shBREFA-(shB77B:trB77A+shB77B:trB77B)");
457 TGeoVolume* voBREF = new TGeoVolume("BREF1", shBREF1, gGeoManager->GetMedium("FRAME_Air"));
458 voBREF->SetVisibility(0);
459 vmc->Gspos("BREF1", 1, "B077", 0., 0., 0., 0, "ONLY");
460 //
461 // The outer Frame
462 //
463
464 float dol = 4.;
465 float doh = 4.;
466 float ds = 0.63;
467 //
468 // Rings
469 //
470 dz = 2. * 410.2 * sin10 - 2. * dol * cos10 - 2. * doh * tan10;
471 float l1 = dz / 2.;
472 float l2 = dz / 2. + 2. * doh * tan10;
473
474 TGeoVolumeAssembly* asBI42 = new TGeoVolumeAssembly("BI42");
475 // Horizontal
476 ptrd1[0] = l2 - 0.6 * tan10;
477 ptrd1[1] = l2;
478 ptrd1[2] = 8.0 / 2.;
479 ptrd1[3] = 0.6 / 2.;
480 vmc->Gsvolu("BIH142", "TRD1", kSteel, ptrd1, 4);
481 ptrd1[0] = l1;
482 ptrd1[1] = l1 + 0.6 * tan10;
483 ptrd1[2] = 8.0 / 2.;
484 ptrd1[3] = 0.6 / 2.;
485 vmc->Gsvolu("BIH242", "TRD1", kSteel, ptrd1, 4);
486
487 // Vertical
488 ptrd1[0] = l1 + 0.6 * tan10;
489 ptrd1[1] = l2 - 0.6 * tan10;
490 ptrd1[2] = 0.8 / 2.;
491 ptrd1[3] = 6.8 / 2.;
492 vmc->Gsvolu("BIV42", "TRD1", kSteel, ptrd1, 4);
493 // Place
494 asBI42->AddNode(gGeoManager->GetVolume("BIV42"), 1, new TGeoTranslation(0., 0., 0.0));
495 asBI42->AddNode(gGeoManager->GetVolume("BIH142"), 1, new TGeoTranslation(0., 0., 3.7));
496 asBI42->AddNode(gGeoManager->GetVolume("BIH242"), 1, new TGeoTranslation(0., 0., -3.7));
497 //
498 // longitudinal bars
499 //
500 // 80 x 80 x 6.3
501 //
502 pbox[0] = dol;
503 pbox[1] = doh;
504 pbox[2] = 345.;
505 vmc->Gsvolu("B033", "BOX", kSteel, pbox, 3);
506 pbox[0] = dol - ds;
507 pbox[1] = doh - ds;
508 vmc->Gsvolu("B034", "BOX", kAir, pbox, 3);
509 vmc->Gspos("B034", 1, "B033", 0., 0., 0., 0, "ONLY");
510
511 //
512 // TPC support
513 //
514 pbox[0] = 3.37;
515 pbox[1] = 2.0;
516 pbox[2] = longLI / 2.;
517 vmc->Gsvolu("B080", "BOX", kSteel, pbox, 3);
518 pbox[0] = 2.78;
519 pbox[1] = 1.40;
520 pbox[2] = longLI / 2.;
521 vmc->Gsvolu("B081", "BOX", kAir, pbox, 3);
522 vmc->Gspos("B081", 1, "B080", 0., 0., 0., 0, "ONLY");
523
524 // Small 2nd reference plane elemenet
525 pbox[0] = 0.05;
526 pbox[1] = 2.0;
527 pbox[2] = longLI / 2.;
528 vmc->Gsvolu("BREF2", "BOX", kAir, pbox, 3);
529 vmc->Gspos("BREF2", 1, "B080", 3.37 - 0.05, 0., 0., 0, "ONLY");
530
531 vmc->Gspos("B080", 1, "B077", 283.25, 0., 0., 0, "ONLY");
532 vmc->Gspos("B080", 2, "B077", -283.25, 0., 0., idrotm[2088], "ONLY");
533
534 //
535 // Diagonal bars (1)
536 //
537 float h, d, dq, x, theta;
538
539 h = (dymodU[1] - dymodU[0] - 2. * dol) * .999;
540 d = 2. * dol;
541 dq = h * h + dz * dz;
542
543 x = TMath::Sqrt((dz * dz - d * d) / dq + d * d * h * h / dq / dq) + d * h / dq;
544
545 theta = krad2deg * TMath::ACos(x);
546
547 ptrap[0] = dz / 2.;
548 ptrap[1] = theta;
549 ptrap[2] = 0.;
550 ptrap[3] = doh;
551 ptrap[4] = dol / x;
552 ptrap[5] = ptrap[4];
553 ptrap[6] = 0;
554 ptrap[7] = ptrap[3];
555 ptrap[8] = ptrap[4];
556 ptrap[9] = ptrap[4];
557 ptrap[10] = 0;
558
559 vmc->Gsvolu("B047", "TRAP", kSteel, ptrap, 11);
560 ptrap[3] = doh - ds;
561 ptrap[4] = (dol - ds) / x;
562 ptrap[5] = ptrap[4];
563 ptrap[7] = ptrap[3];
564 ptrap[8] = ptrap[4];
565 ptrap[9] = ptrap[4];
566 vmc->Gsvolu("B048", "TRAP", kAir, ptrap, 11);
567 vmc->Gspos("B048", 1, "B047", 0.0, 0.0, 0., 0, "ONLY");
568
569 /*
570 Crosses (inner most)
571 \\ //
572 \\//
573 //\\
574 // \\
575 */
576 h = (2. * dymodU[0] - 2. * dol) * .999;
577 //
578 // Mother volume
579 //
580 pbox[0] = h / 2;
581 pbox[1] = doh;
582 pbox[2] = dz / 2.;
583 vmc->Gsvolu("BM49", "BOX ", kAir, pbox, 3);
584
585 dq = h * h + dz * dz;
586 x = TMath::Sqrt((dz * dz - d * d) / dq + d * d * h * h / dq / dq) + d * h / dq;
587 theta = krad2deg * TMath::ACos(x);
588
589 ptrap[0] = dz / 2. - kEps;
590 ptrap[1] = theta;
591 ptrap[2] = 0.;
592 ptrap[3] = doh - kEps;
593 ptrap[4] = dol / x;
594 ptrap[5] = ptrap[4];
595 ptrap[7] = ptrap[3];
596 ptrap[8] = ptrap[4];
597 ptrap[9] = ptrap[4];
598
599 vmc->Gsvolu("B049", "TRAP", kSteel, ptrap, 11);
600 ptrap[0] = ptrap[0] - kEps;
601 ptrap[3] = (doh - ds);
602 ptrap[4] = (dol - ds) / x;
603 ptrap[5] = ptrap[4];
604 ptrap[7] = ptrap[3];
605 ptrap[8] = ptrap[4];
606 ptrap[9] = ptrap[4];
607 vmc->Gsvolu("B050", "TRAP", kAir, ptrap, 11);
608 vmc->Gspos("B050", 1, "B049", 0.0, 0.0, 0., 0, "ONLY");
609 vmc->Gspos("B049", 1, "BM49", 0.0, 0.0, 0., 0, "ONLY");
610
611 float dd1 = d * TMath::Tan(theta * kdeg2rad);
612 float dd2 = d / TMath::Tan(2. * theta * kdeg2rad);
613 float theta2 = TMath::ATan(TMath::Abs(dd2 - dd1) / d / 2.);
614
615 ptrap[0] = dol;
616 ptrap[1] = theta2 * krad2deg;
617 ptrap[2] = 0.;
618 ptrap[3] = doh;
619 ptrap[4] = (dz / 2. / x - dd1 - dd2) / 2.;
620 ptrap[5] = ptrap[4];
621 ptrap[6] = 0.;
622 ptrap[7] = ptrap[3];
623 ptrap[8] = dz / 4. / x;
624 ptrap[9] = ptrap[8];
625
626 vmc->Gsvolu("B051", "TRAP", kSteel, ptrap, 11);
627 float ddx0 = ptrap[8];
628
629 float dd1s = dd1 * (1. - 2. * ds / d);
630 float dd2s = dd2 * (1. - 2. * ds / d);
631 float theta2s = TMath::ATan(TMath::Abs(dd2s - dd1s) / (d - 2. * ds) / 2.);
632
633 ptrap[0] = dol - ds;
634 ptrap[1] = theta2s * krad2deg;
635 ptrap[2] = 0.;
636 ptrap[3] = doh - ds;
637 ptrap[4] = ptrap[4] + ds / d / 2. * (dd1 + dd2);
638 ptrap[5] = ptrap[4];
639 ptrap[6] = 0.;
640 ptrap[7] = ptrap[3];
641 ptrap[8] = ptrap[8] - ds / 2. / d * (dd1 + dd2);
642 ptrap[9] = ptrap[8];
643
644 vmc->Gsvolu("B052", "TRAP", kAir, ptrap, 11);
645 vmc->Gspos("B052", 1, "B051", 0.0, 0.0, 0., 0, "ONLY");
646
647 float ddx, ddz, drx, drz, rtheta;
648
649 AliMatrix(idrotm[2001], -theta + 180, 0.0, 90.0, 90.0, 90. - theta, 0.0);
650 rtheta = (90. - theta) * kdeg2rad;
651 ddx = -ddx0 - dol * TMath::Tan(theta2);
652 ddz = -dol;
653
654 drx = TMath::Cos(rtheta) * ddx + TMath::Sin(rtheta) * ddz + pbox[0];
655 drz = -TMath::Sin(rtheta) * ddx + TMath::Cos(rtheta) * ddz - pbox[2];
656 vmc->Gspos("B051", 1, "BM49", drx, 0.0, drz, idrotm[2001], "ONLY");
657
658 AliMatrix(idrotm[2002], -theta, 0.0, 90.0, 90.0, 270. - theta, 0.0);
659 rtheta = (270. - theta) * kdeg2rad;
660
661 drx = TMath::Cos(rtheta) * ddx + TMath::Sin(rtheta) * ddz - pbox[0];
662 drz = -TMath::Sin(rtheta) * ddx + TMath::Cos(rtheta) * ddz + pbox[2];
663 vmc->Gspos("B051", 2, "BM49", drx, 0.0, drz, idrotm[2002], "ONLY");
664
665 //
666 // Diagonal bars (3)
667 //
668 h = ((dymodU[2] - dymodU[1]) - 2. * dol) * .999;
669 dq = h * h + dz * dz;
670 x = TMath::Sqrt((dz * dz - d * d) / dq + d * d * h * h / dq / dq) + d * h / dq;
671 theta = krad2deg * TMath::ACos(x);
672
673 ptrap[0] = dz / 2.;
674 ptrap[1] = theta;
675 ptrap[3] = doh;
676 ptrap[4] = dol / x;
677 ptrap[5] = ptrap[4];
678 ptrap[7] = ptrap[3];
679 ptrap[8] = ptrap[4];
680 ptrap[9] = ptrap[4];
681
682 vmc->Gsvolu("B045", "TRAP", kSteel, ptrap, 11);
683
684 TGeoTrap* b045shape = new TGeoTrap("B045shape", ptrap[0], ptrap[1], ptrap[2], ptrap[3], ptrap[4], ptrap[5], ptrap[6], ptrap[7], ptrap[8], ptrap[9], ptrap[10]);
685 double cutAngle = 43 * TMath::DegToRad();
686 double trd1par[4] = {0., 15 + 0.1, 15, 15 * TMath::Tan(cutAngle) * 0.5 + 0.45};
687 TGeoTranslation* trnsB045cut = new TGeoTranslation("trnsB045cut", ptrap[0] * TMath::Tan(ptrap[1] * TMath::DegToRad()) - trd1par[2] + ptrap[4], -ptrap[3] + 0.5, ptrap[0] + 0.6);
688 TGeoRotation* rotB045cut = new TGeoRotation("rotB045cut");
689 rotB045cut->RotateZ(90);
690 TGeoCombiTrans* moveB045cut = new TGeoCombiTrans(*trnsB045cut, *rotB045cut);
691 moveB045cut->SetName("moveB045cut");
692 moveB045cut->RegisterYourself();
693
694 ptrap[3] = doh - ds;
695 ptrap[4] = (dol - ds) / x;
696 ptrap[5] = ptrap[4];
697 ptrap[7] = ptrap[3];
698 ptrap[8] = ptrap[4];
699 ptrap[9] = ptrap[4];
700
701 vmc->Gsvolu("B046", "TRAP", kAir, ptrap, 11);
702 vmc->Gspos("B046", 1, "B045", 0.0, 0.0, 0., 0, "ONLY");
703
704 TGeoTrd1* cutOnB045 = new TGeoTrd1("cutOnB045", trd1par[0], trd1par[1], trd1par[2], trd1par[3]);
705
706 TGeoCompositeShape* b045shapeCut = new TGeoCompositeShape("B045shapeCut", "(B045shape)-(cutOnB045:moveB045cut)");
707 TGeoVolume* B045cutVol = new TGeoVolume("B045cut", b045shapeCut, kMedSteel);
708
709 //
710 // Positioning of diagonal bars
711
712 float rd = 405.5 + 0.51;
713 dz = (dymodU[1] + dymodU[0]) / 2.;
714 float dz2 = (dymodU[1] + dymodU[2]) / 2.;
715
716 //
717 // phi = 60
718 //
719
720 float phi = 60;
721 dx = rd * TMath::Sin(phi * kdeg2rad);
722 dy = rd * TMath::Cos(phi * kdeg2rad);
723
724 vmc->Gspos("B045", 1, "B077", -dx, dy, dz2, idrotm[2021], "ONLY");
725 vmc->Gspos("B045", 2, "B077", -dx, dy, -dz2, idrotm[2028], "ONLY");
726 vmc->Gspos("B045", 3, "B077", dx, dy, dz2, idrotm[2022], "ONLY");
727 vmc->Gspos("B045", 4, "B077", dx, dy, -dz2, idrotm[2029], "ONLY");
728
729 vmc->Gspos("B045", 5, "B077", dx, -dy, -dz2, idrotm[2021], "ONLY");
730 vmc->Gspos("B045cut", 6, "B077", dx, -dy, +dz2, idrotm[2028], "ONLY");
731 vmc->Gspos("B045", 7, "B077", -dx, -dy, -dz2, idrotm[2022], "ONLY");
732 vmc->Gspos("B045", 8, "B077", -dx, -dy, +dz2, idrotm[2029], "ONLY");
733
734 vmc->Gspos("B047", 1, "B077", -dx, -dy, dz, idrotm[2022], "ONLY");
735 vmc->Gspos("B047", 2, "B077", -dx, -dy, -dz, idrotm[2029], "ONLY");
736
737 vmc->Gspos("B047", 3, "B077", dx, -dy, dz, idrotm[2021], "ONLY");
738 vmc->Gspos("B047", 4, "B077", dx, -dy, -dz, idrotm[2028], "ONLY");
739
740 vmc->Gspos("BM49", 1, "B077", dx, -dy, 0., idrotm[2101], "ONLY");
741 vmc->Gspos("BM49", 2, "B077", -dx, -dy, 0., idrotm[2100], "ONLY");
742
743 //
744 // phi = 80
745 //
746
747 phi = 80;
748 dx = rd * TMath::Sin(phi * kdeg2rad);
749 dy = rd * TMath::Cos(phi * kdeg2rad);
750
751 vmc->Gspos("B047", 13, "B077", -dx, -dy, dz, idrotm[2008], "ONLY");
752 vmc->Gspos("B047", 14, "B077", -dx, -dy, -dz, idrotm[2010], "ONLY");
753 vmc->Gspos("B047", 15, "B077", dx, -dy, dz, idrotm[2012], "ONLY");
754 vmc->Gspos("B047", 16, "B077", dx, -dy, -dz, idrotm[2011], "ONLY");
755
756 vmc->Gspos("B045", 11, "B077", -dx, dy, dz2, idrotm[2023], "ONLY");
757 vmc->Gspos("B045", 12, "B077", -dx, dy, -dz2, idrotm[2031], "ONLY");
758 vmc->Gspos("B045", 13, "B077", dx, dy, dz2, idrotm[2026], "ONLY");
759 vmc->Gspos("B045", 14, "B077", dx, dy, -dz2, idrotm[2030], "ONLY");
760
761 vmc->Gspos("B045", 15, "B077", -dx, -dy, dz2, idrotm[2024], "ONLY");
762 vmc->Gspos("B045", 16, "B077", -dx, -dy, -dz2, idrotm[2032], "ONLY");
763 vmc->Gspos("B045", 17, "B077", dx, -dy, dz2, idrotm[2025], "ONLY");
764 vmc->Gspos("B045", 18, "B077", dx, -dy, -dz2, idrotm[2033], "ONLY");
765
766 vmc->Gspos("BM49", 3, "B077", dx, -dy, 0., idrotm[2025], "ONLY");
767 vmc->Gspos("BM49", 4, "B077", -dx, -dy, 0., idrotm[2024], "ONLY");
768
769 //
770 // The inner frame
771 //
772 //
773 // Mother Volumes
774 //
775 ptrd1[0] = (hR - longH / 2. - dext) * tan10;
776 ptrd1[1] = (hR - longH / 2. + iFrH0) * tan10;
777 ptrd1[2] = zE;
778 ptrd1[3] = iFrH0 / 2.;
779 float dd = longW / 2. * cos10 + 0.1;
780 TGeoTrd1* shTRD1 = new TGeoTrd1("shTRD1", ptrd1[0], ptrd1[1], ptrd1[2], ptrd1[3]);
781 TGeoBBox* shBox = new TGeoBBox("shBox", 50., zE + 10., 1.);
782 TGeoRotation* rot1 = new TGeoRotation("urot1", 100., 0., 90., 90., 10., 0.);
783 TGeoRotation* rot2 = new TGeoRotation("urot2", 80., 0., 90., 90., -10., 0.);
784 float trotDz = iFrH0 / 2. + 1.;
785 float trotDx = 402. * tan10;
786 TGeoCombiTrans* trot1 = new TGeoCombiTrans(-trotDx, 0., trotDz, rot2);
787 TGeoCombiTrans* trot2 = new TGeoCombiTrans(+trotDx, 0., trotDz, rot1);
788 TGeoUnion* uni = new TGeoUnion(shBox, shBox, trot1, trot2);
789 TGeoCompositeShape* shU = new TGeoCompositeShape("shU", uni);
790 TGeoSubtraction* sub = new TGeoSubtraction(shTRD1, shU, nullptr, nullptr);
791 TGeoCompositeShape* shCS = new TGeoCompositeShape("shCS", sub);
792 // center of segments
793 float r = (hR - longH / 2. + iFrH0 / 2.) - dext;
794 // center of outer frame
795 // vertical
796 float rout1 = 406.0;
797 // radial
798 float rout2 = 412.3 - 2. * sin10 + 0.25;
799 //
800 TString module[18];
801 for (i = 0; i < 18; i++) {
802 // Create volume i
803 char name[16];
804 // official module numbering
805 int mod = i + 13;
806 if (mod > 17) {
807 mod -= 18;
808 }
809 snprintf(name, 16, "BSEGMO%d", mod);
810 //
811 TGeoVolume* voTRD1 = new TGeoVolume(name, shCS, kMedAir);
812 module[i] = name;
813 // Place volume i
814 float phi1 = i * 20.;
815 float phi2 = 270. + phi1;
816 if (phi2 >= 360.) {
817 phi2 -= 360.;
818 }
819 dx = TMath::Sin(phi1 * kdeg2rad) * r;
820 dy = -TMath::Cos(phi1 * kdeg2rad) * r;
821
822 char nameR[16];
823 snprintf(nameR, 16, "B43_Rot_%d", i);
824 TGeoRotation* rot = new TGeoRotation(nameR, 90.0, phi1, 0., 0., 90., phi2);
825 AliMatrix(idrotm[2034 + i], 90.0, phi1, 0., 0., 90., phi2);
826 TGeoVolume* vol77 = gGeoManager->GetVolume("B077");
827 vol77->AddNode(voTRD1, 1, new TGeoCombiTrans(dx, dy, 0., rot));
828
829 //
830 // Position elements of outer Frame
831 //
832 dx = TMath::Sin(phi1 * kdeg2rad) * rout1;
833 dy = -TMath::Cos(phi1 * kdeg2rad) * rout1;
834 for (j = 0; j < 3; j++) {
835 dz = dymodU[j];
836 TGeoVolume* vol = gGeoManager->GetVolume("B077");
837 vol->AddNode(asBI42, 6 * i + 2 * j + 1, new TGeoCombiTrans(dx, dy, dz, rot));
838 vol->AddNode(asBI42, 6 * i + 2 * j + 2, new TGeoCombiTrans(dx, dy, -dz, rot));
839 }
840
841 phi1 = i * 20. + 10;
842 phi2 = 270 + phi1;
843 AliMatrix(idrotm[2052 + i], 90.0, phi1, 90., phi2, 0., 0.);
844
845 dx = TMath::Sin(phi1 * kdeg2rad) * rout2;
846 dy = -TMath::Cos(phi1 * kdeg2rad) * rout2;
847 vmc->Gspos("B033", i + 1, "B077", dx, dy, 0., idrotm[2052 + i], "ONLY");
848 //
849 }
850 // Internal Frame rings
851 //
852 //
853 // Pos 7 60x60x5x6 for inner rings (I-beam)
854 // Pos 6 100x60x5 for front and rear rings
855 //
856 // Front and rear
857 //
858
859 ptrd1[0] = (hR - longH / 2.) * tan10 - dd;
860 ptrd1[1] = (hR + longH / 2.) * tan10 - dd;
861 ptrd1[2] = ringW / 2.;
862 ptrd1[3] = ringH / 2.;
863
864 vmc->Gsvolu("B072", "TRD1", kSteel, ptrd1, 4);
865
866 ptrd1[0] = (hR - longH / 2. + 0.5) * tan10 - dd;
867 ptrd1[1] = (hR + longH / 2. - 0.5) * tan10 - dd;
868 ptrd1[2] = ringW / 2. - 0.5;
869 ptrd1[3] = ringH / 2. - 0.5;
870
871 vmc->Gsvolu("B073", "TRD1", kAir, ptrd1, 4);
872 vmc->Gspos("B073", 1, "B072", 0., 0., 0., 0, "ONLY");
873 //
874 // I-Beam
875 // Mother volume
876 TGeoVolumeAssembly* asBI72 = new TGeoVolumeAssembly("BI72");
877 // Horizontal
878 float rIB1 = hR + ringH / 2.;
879 float rIB2 = hR - ringH / 2.;
880 ptrd1[0] = (rIB1 - ringT / 2.) * tan10 - dd;
881 ptrd1[1] = (rIB1)*tan10 - dd;
882 ptrd1[2] = ringH / 2.;
883 ptrd1[3] = ringT / 4.;
884 vmc->Gsvolu("BIH172", "TRD1", kSteel, ptrd1, 4);
885 ptrd1[0] = (rIB2)*tan10 - dd;
886 ptrd1[1] = (rIB2 + ringT / 2.) * tan10 - dd;
887 ptrd1[2] = ringH / 2.;
888 ptrd1[3] = ringT / 4.;
889 vmc->Gsvolu("BIH272", "TRD1", kSteel, ptrd1, 4);
890
891 // Vertical
892 ptrd1[0] = (rIB2 + ringT / 2.) * tan10 - dd;
893 ptrd1[1] = (rIB1 - ringT / 2.) * tan10 - dd;
894 ptrd1[2] = 0.6 / 2.;
895 ptrd1[3] = (ringH - ringT) / 2.;
896 vmc->Gsvolu("BIV72", "TRD1", kSteel, ptrd1, 4);
897 // Place
898 asBI72->AddNode(gGeoManager->GetVolume("BIV72"), 1, new TGeoTranslation(0., 0., 0.));
899 asBI72->AddNode(gGeoManager->GetVolume("BIH172"), 1, new TGeoTranslation(0., 0., (ringH / 2. - ringT / 4.)));
900 asBI72->AddNode(gGeoManager->GetVolume("BIH272"), 1, new TGeoTranslation(0., 0., -(ringH / 2. - ringT / 4.)));
901
902 // Web frame
903 //
904 // h x w x s = 60 x 40 x 5
905 // (attention: elements are half bars, "U" shaped)
906 //
907
908 createWebFrame("B063", dHz, dymodO[0], 10.);
909 createWebFrame("B163", dHz, dymodO[1], 10.);
910 createWebFrame("B263", dHz, dymodO[2], 10.);
911 createWebFrame("B363", dHz, dymodO[3], 10.);
912 createWebFrame("B463", dHz, dymodO[4], 10.);
913
914 dz = -iFrH0 / 2. + ringH / 2. + dext;
915
916 float dz0 = -iFrH0 / 2. + longH + 113. / 2. + dext - 0.1;
917 float dx0 = (hR + iFrH / 2.) * tan10 - longW / 4. * cos10 - 0.065;
918 for (jmod = 0; jmod < 18; jmod++) {
919 //
920 // ring bars
921 for (i = 0; i < 3; i++) {
922 if (i == 2) {
923 vmc->Gspos("B072", 6 * jmod + i + 1, module[jmod], 0, dymodL[i], dz, 0, "ONLY");
924 vmc->Gspos("B072", 6 * jmod + i + 4, module[jmod], 0, -dymodL[i], dz, idrotm[2070], "ONLY");
925 } else {
926 TGeoVolume* vol = gGeoManager->GetVolume(module[jmod]);
927 vol->AddNode(asBI72, 6 * jmod + i + 1, new TGeoTranslation(0, dymodL[i], dz));
928 vol->AddNode(asBI72, 6 * jmod + i + 4, new TGeoTranslation(0, -dymodL[i], dz));
929 }
930 }
931 }
932 //
933 // outer diagonal web
934
935 dy = dymodW[0] - (dHz / 2.) * TMath::Tan(dymodO[0] * kdeg2rad);
936
937 for (jmod = 0; jmod < 18; jmod++) {
938 vmc->Gspos("B063I", 4 * jmod + 1, module[jmod], dx0, dy, dz0, idrotm[2096], "ONLY");
939 vmc->Gspos("B063", 4 * jmod + 2, module[jmod], dx0, -dy, dz0, idrotm[2097], "ONLY");
940 vmc->Gspos("B063I", 4 * jmod + 3, module[jmod], -dx0, -dy, dz0, idrotm[2087], "ONLY");
941 vmc->Gspos("B063", 4 * jmod + 4, module[jmod], -dx0, dy, dz0, idrotm[2086], "ONLY");
942 }
943
944 dy = dymodW[1] - (dHz / 2.) * TMath::Tan(dymodO[1] * kdeg2rad);
945
946 for (jmod = 0; jmod < 18; jmod++) {
947 vmc->Gspos("B163I", 4 * jmod + 1, module[jmod], dx0, -dy, dz0, idrotm[2096], "ONLY");
948 vmc->Gspos("B163", 4 * jmod + 2, module[jmod], dx0, dy, dz0, idrotm[2097], "ONLY");
949 vmc->Gspos("B163I", 4 * jmod + 3, module[jmod], -dx0, dy, dz0, idrotm[2087], "ONLY");
950 vmc->Gspos("B163", 4 * jmod + 4, module[jmod], -dx0, -dy, dz0, idrotm[2086], "ONLY");
951 }
952
953 dy = dymodW[2] - (dHz / 2) * TMath::Tan(dymodO[2] * kdeg2rad);
954
955 for (jmod = 0; jmod < 18; jmod++) {
956 vmc->Gspos("B263I", 4 * jmod + 1, module[jmod], dx0, dy, dz0, idrotm[2096], "ONLY");
957 vmc->Gspos("B263", 4 * jmod + 2, module[jmod], dx0, -dy, dz0, idrotm[2097], "ONLY");
958 vmc->Gspos("B263I", 4 * jmod + 3, module[jmod], -dx0, -dy, dz0, idrotm[2087], "ONLY");
959 vmc->Gspos("B263", 4 * jmod + 4, module[jmod], -dx0, dy, dz0, idrotm[2086], "ONLY");
960 }
961
962 dy = dymodW[3] - (dHz / 2.) * TMath::Tan(dymodO[3] * kdeg2rad);
963
964 for (jmod = 0; jmod < 18; jmod++) {
965 vmc->Gspos("B363I", 4 * jmod + 1, module[jmod], dx0, -dy, dz0, idrotm[2096], "ONLY");
966 vmc->Gspos("B363", 4 * jmod + 2, module[jmod], dx0, dy, dz0, idrotm[2097], "ONLY");
967 vmc->Gspos("B363I", 4 * jmod + 3, module[jmod], -dx0, dy, dz0, idrotm[2087], "ONLY");
968 vmc->Gspos("B363", 4 * jmod + 4, module[jmod], -dx0, -dy, dz0, idrotm[2086], "ONLY");
969 }
970
971 dy = dymodW[4] - (dHz / 2.) * TMath::Tan(dymodO[4] * kdeg2rad);
972
973 for (jmod = 0; jmod < 18; jmod++) {
974 vmc->Gspos("B463I", 4 * jmod + 1, module[jmod], dx0, dy, dz0, idrotm[2096], "ONLY");
975 vmc->Gspos("B463", 4 * jmod + 2, module[jmod], dx0, -dy, dz0, idrotm[2097], "ONLY");
976 vmc->Gspos("B463I", 4 * jmod + 3, module[jmod], -dx0, -dy, dz0, idrotm[2087], "ONLY");
977 vmc->Gspos("B463", 4 * jmod + 4, module[jmod], -dx0, dy, dz0, idrotm[2086], "ONLY");
978 }
979
980 // longitudinal bars (TPC rails attached)
981 // new specs:
982 // h x w x s = 100 x 75 x 6
983 // Attention: 2 "U" shaped half rods per cell
984 // longitudinal bars (no TPC rails attached)
985 // new specs: h x w x s = 40 x 60 x 5
986 //
987 //
988 //
989 double lbox[3];
990 lbox[0] = longW / 4.;
991 lbox[2] = longH / 2.;
992 lbox[1] = longLI / 2.;
993 vmc->Gsvolu("BA59", "BOX", kSteel, lbox, 3);
994 gGeoManager->GetVolume("BA59")->SetVisContainers();
995 lbox[0] = longW / 4. - 0.25;
996 lbox[2] = longH / 2. - 0.50;
997 vmc->Gsvolu("BA62", "BOX", kAir, lbox, 3);
998 vmc->Gspos("BA62", 1, "BA59", 0.25, 0.0, 0.0, 0, "ONLY");
999
1000 dz = -iFrH0 / 2. + longH / 2. - 1. * sin10 + dext;
1001 dx = hR * tan10 - longW / 4. * cos10 - 0.065;
1002 for (jmod = 0; jmod < 18; jmod++) {
1003 vmc->Gspos("BA59", 2 * jmod + 1, module[jmod], dx, 0.0, dz, idrotm[2096], "ONLY");
1004 vmc->Gspos("BA59", 2 * jmod + 2, module[jmod], -dx, 0.0, dz, idrotm[2087], "ONLY");
1005 }
1006
1007 //
1008 // Rails for TRD
1009 //
1010 // Pos 1
1011 //
1012 // angular 80 deg profile
1013 lbox[2] = 4.0;
1014 lbox[0] = 0.2;
1015 lbox[1] = longLI / 2.;
1016 vmc->Gsvolu("BTRDR_10", "BOX", kSteel, lbox, 3);
1017
1018 ptrd1[0] = 3.;
1019 ptrd1[1] = 3. + 0.4 * tan10;
1020 ptrd1[2] = longLI / 2.;
1021 ptrd1[3] = 0.2;
1022 vmc->Gsvolu("BTRDR_11", "TRD1", kSteel, ptrd1, 4);
1023
1024 lbox[2] = 2.0;
1025 lbox[0] = 0.3;
1026 lbox[1] = longLI / 2.;
1027 vmc->Gsvolu("BTRDR_12", "BOX", kAlu, lbox, 3);
1028 gGeoManager->GetVolume("BTRDR_12")->SetVisContainers();
1029
1030 lbox[2] = 2.0;
1031 lbox[0] = 0.1;
1032 lbox[1] = longLI / 2.;
1033 vmc->Gsvolu("BTRDR_13", "BOX", kG10, lbox, 3);
1034 vmc->Gspos("BTRDR_13", 1, "BTRDR_12", -0.2, 0.0, 0.0, 0, "ONLY");
1035
1036 lbox[2] = 0.1;
1037 lbox[0] = 2.0;
1038 lbox[1] = longLI / 2.;
1039 vmc->Gsvolu("BTRDR_14", "BOX", kG10, lbox, 3);
1040 dz = -iFrH0 / 2. + longH / 2. + dext;
1041 float zpos = 80.;
1042 int isec_1[11] = {0, 1, 2, 3, 4, 5, 13, 14, 15, 16, 17};
1043
1044 for (int index = 0; index < 11; index++) {
1045 jmod = isec_1[index];
1046 float dz1 = dz + 3. + (zpos - 4.);
1047 dx0 = (hR + dz0 + zpos - 4.) * tan10 - (longW / 2. + 0.2) / cos10 - 0.05;
1048 if (jmod != 5) {
1049 vmc->Gspos("BTRDR_10", 2 * jmod + 1, module[jmod], dx0, 0.0, dz1, idrotm[2096], "ONLY");
1050 }
1051 if (jmod != 13) {
1052 vmc->Gspos("BTRDR_10", 2 * jmod + 2, module[jmod], -dx0, 0.0, dz1, idrotm[2086], "ONLY");
1053 }
1054 dx0 -= 0.5;
1055 if (jmod != 5) {
1056 vmc->Gspos("BTRDR_12", 2 * jmod + 1, module[jmod], dx0, 0.0, dz1, idrotm[2096], "ONLY");
1057 }
1058 if (jmod != 13) {
1059 vmc->Gspos("BTRDR_12", 2 * jmod + 2, module[jmod], -dx0, 0.0, dz1, idrotm[2087], "ONLY");
1060 }
1061 dz1 += (4 - 0.2);
1062 dz1 += dext;
1063 dx0 = (hR + dz0 + zpos - 0.2) * tan10 - (longW / 2. + 3. + 0.4) / cos10;
1064 if (jmod != 5) {
1065 vmc->Gspos("BTRDR_11", 2 * jmod + 1, module[jmod], dx0, 0.0, dz1, 0, "ONLY");
1066 }
1067 if (jmod != 13) {
1068 vmc->Gspos("BTRDR_11", 2 * jmod + 2, module[jmod], -dx0, 0.0, dz1, 0, "ONLY");
1069 }
1070 dz1 -= 0.3;
1071 dx0 -= 0.5;
1072 if (jmod != 5) {
1073 vmc->Gspos("BTRDR_14", 2 * jmod + 1, module[jmod], dx0, 0.0, dz1, 0, "ONLY");
1074 }
1075 if (jmod != 13) {
1076 vmc->Gspos("BTRDR_14", 2 * jmod + 2, module[jmod], -dx0, 0.0, dz1, 0, "ONLY");
1077 }
1078 }
1079
1080 // Pos 2
1081 // 40 x 10
1082 lbox[2] = 2.0;
1083 lbox[0] = 0.5;
1084 lbox[1] = longLI / 2.;
1085 vmc->Gsvolu("BTRDR_2", "BOX", kAlu, lbox, 3);
1086 lbox[2] = 2.0;
1087 lbox[0] = 0.1;
1088 lbox[1] = longLI / 2.;
1089 vmc->Gsvolu("BTRDR_21", "BOX", kG10, lbox, 3);
1090 vmc->Gspos("BTRDR_21", 1, "BTRDR_2", -0.4, 0.0, 0.0, 0, "ONLY");
1091
1092 int isec_2a[16] = {1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17};
1093 for (int index = 0; index < 16; index++) {
1094 jmod = isec_2a[index];
1095 dx0 = (hR + dz0) * tan10 + 10. * sin10 - (longW / 4. + 0.5) / cos10;
1096 if (jmod > 8) {
1097 vmc->Gspos("BTRDR_2", 2 * jmod + 1, module[jmod], dx0 - 1.5, 0.0, dz + 3. + 8. * cos10, idrotm[2096], "ONLY");
1098 } else {
1099 vmc->Gspos("BTRDR_2", 2 * jmod + 2, module[jmod], -dx0 + 1.5, 0.0, dz + 3. + 8. * cos10, idrotm[2087], "ONLY");
1100 }
1101 }
1102
1103 int isec_2b[6] = {6, 7, 8, 10, 11, 12};
1104 for (int index = 0; index < 6; index++) {
1105 jmod = isec_2b[index];
1106 dx0 = (hR + dz0 + zpos - 3.) * tan10 - (longW / 4. + 0.5) / cos10;
1107 if (index < 3) {
1108 vmc->Gspos("BTRDR_2", 2 * jmod + 2, module[jmod], -dx0 + 1.5, 0.0, dz + 3. + zpos - 3., idrotm[2087], "ONLY");
1109 } else {
1110 vmc->Gspos("BTRDR_2", 2 * jmod + 1, module[jmod], dx0 - 1.5, 0.0, dz + 3. + zpos - 3., idrotm[2096], "ONLY");
1111 }
1112 }
1113
1114 // Pos 3
1115 // 40 x 14
1116 lbox[0] = 2.0;
1117 lbox[2] = 0.7;
1118 lbox[1] = longLI / 2.;
1119 vmc->Gsvolu("BTRDR_3", "BOX", kAlu, lbox, 3);
1120
1121 lbox[0] = 2.0;
1122 lbox[2] = 0.1;
1123 lbox[1] = longLI / 2.;
1124 vmc->Gsvolu("BTRDR_31", "BOX", kG10, lbox, 3);
1125 vmc->Gspos("BTRDR_31", 1, "BTRDR_3", 0, 0.0, 0.6, 0, "ONLY");
1126
1127 int isec_3[9] = {5, 6, 7, 8, 9, 10, 11, 12, 13};
1128
1129 for (int index = 0; index < 9; index++) {
1130 jmod = isec_3[index];
1131 if (index > 1) {
1132 vmc->Gspos("BTRDR_3", 2 * jmod + 1, module[jmod], 50.96 - 5 - 2., 0.0, dz + 3.7, 0, "ONLY");
1133 }
1134 if (index < 7) {
1135 vmc->Gspos("BTRDR_3", 2 * jmod + 2, module[jmod], -50.96 + 5 + 2., 0.0, dz + 3.7, 0, "ONLY");
1136 }
1137 }
1138 //
1139 // Fixation Blocks with tie anchors
1140 //
1141 // inner
1142 float thetFB1 = 10. / 180. * TMath::Pi();
1143 float thetFB2 = 40. / 180. * TMath::Pi();
1144 // half height of the block
1145 double dzFB = 6.;
1146 // half width of the block
1147 float dyFB = 3.9 / 2.;
1148 // lenth upper face
1149 float dxFB = 46.;
1150 // lower face
1151 float dx1FB = dxFB / 2. - 2. * dzFB * TMath::Tan(thetFB1);
1152 float dx2FB = dxFB / 2. - 2. * dzFB * TMath::Tan(thetFB2);
1153
1154 TGeoArb8* shFB1 = new TGeoArb8(dzFB);
1155 shFB1->SetVertex(0, -dyFB / 2., -dxFB / 2.);
1156 shFB1->SetVertex(1, -dyFB / 2., dxFB / 2.);
1157 shFB1->SetVertex(2, dyFB / 2., dxFB / 2.);
1158 shFB1->SetVertex(3, dyFB / 2., -dxFB / 2.);
1159
1160 shFB1->SetVertex(4, -dyFB / 2., -dx1FB);
1161 shFB1->SetVertex(5, -dyFB / 2., dx2FB);
1162 shFB1->SetVertex(6, dyFB / 2., dx2FB);
1163 shFB1->SetVertex(7, dyFB / 2., -dx1FB);
1164
1165 TGeoVolume* volFB1 = new TGeoVolume("BTRD_FB1", shFB1, kMedAlu);
1166 //
1167 // tie anchors rectangular profile 4 x 8
1168 TGeoVolume* volTAR11 = new TGeoVolume("BTRD_TAR11", new TGeoBBox(dyFB / 2., dxFB / 2., 3.), kMedAlu);
1169 TGeoVolume* volTAR12 = new TGeoVolume("BTRD_TAR12", new TGeoBBox(dyFB / 2. - 0.25, dxFB / 2. - 0.7, 2.5), kMedAir);
1170 volTAR11->AddNode(volTAR12, 1, new TGeoTranslation(0.25, 0., 0.0));
1171 // clamp (about twice the length of the block), 6 mm thick (read off from a foto)
1172 TGeoVolume* volTAR13 = new TGeoVolume("BTRD_TAR13", new TGeoBBox(0.3, 45., 3.), kMedAlu);
1173 // square block with screw r = 0.9 cm
1174 TGeoVolume* volTAR141 = new TGeoVolume("BTRD_TAR141", new TGeoBBox(1., 2., 6.), kMedAir);
1175 TGeoVolume* volTAR142 = new TGeoVolume("BTRD_TAR142", new TGeoBBox(1., 2., 6.), kMedAir);
1176
1177 TGeoVolume* volTAR15 = new TGeoVolume("BTRD_TAR15", new TGeoBBox(1., 2., 3.), kMedAlu);
1178 TGeoVolume* volTAR16 = new TGeoVolume("BTRD_TAR16", new TGeoTubeSeg(0., 0.78, 1.5, 90., 270.), kMedSteel);
1179 TGeoVolume* volTAR17 = new TGeoVolume("BTRD_TAR17", new TGeoTubeSeg(0., 0.78, 1.5, -90, 90.), kMedSteel);
1180 volTAR141->AddNode(volTAR15, 1, new TGeoTranslation(0, 0, 0));
1181 volTAR141->AddNode(volTAR16, 1, new TGeoTranslation(1., 0, +4.5));
1182 volTAR141->AddNode(volTAR16, 2, new TGeoTranslation(1., 0, -4.5));
1183
1184 volTAR142->AddNode(volTAR15, 1, new TGeoTranslation(0, 0, 0));
1185 volTAR142->AddNode(volTAR17, 1, new TGeoTranslation(-1., 0, +4.5));
1186 volTAR142->AddNode(volTAR17, 2, new TGeoTranslation(-1., 0, -4.5));
1187
1188 TGeoVolumeAssembly* asFB1 = new TGeoVolumeAssembly("BTRD_FBAS1");
1189 TGeoVolumeAssembly* asFB2 = new TGeoVolumeAssembly("BTRD_FBAS2");
1190 asFB1->AddNode(volFB1, 1, gGeoIdentity);
1191 asFB1->AddNode(volTAR11, 1, new TGeoTranslation(0., 0., -dzFB - 3.55));
1192 asFB1->AddNode(volTAR13, 1, new TGeoTranslation(-1.36, 4.5, -dzFB - 3.));
1193 asFB1->AddNode(volTAR141, 1, new TGeoTranslation(0., dxFB - 2. + 4.5, -dzFB - 3.));
1194 asFB1->AddNode(volTAR141, 2, new TGeoTranslation(0., -dxFB + 2. + 4.5, -dzFB - 3.));
1195
1196 asFB2->AddNode(volFB1, 2, gGeoIdentity);
1197 asFB2->AddNode(volTAR11, 2, new TGeoTranslation(0., 0., -dzFB - 3.));
1198 asFB2->AddNode(volTAR13, 2, new TGeoTranslation(1.36, 4.5, -dzFB - 3.));
1199 asFB2->AddNode(volTAR142, 3, new TGeoTranslation(0., dxFB - 2. + 4.5, -dzFB - 3.));
1200 asFB2->AddNode(volTAR142, 4, new TGeoTranslation(0., -dxFB + 2. + 4.5, -dzFB - 3.));
1201 //
1202 // Fixation block outer
1203 //
1204 thetFB1 = 20. / 180. * TMath::Pi();
1205 thetFB2 = 27. / 180. * TMath::Pi();
1206
1207 dxFB = 42.0;
1208
1209 dx1FB = dxFB / 2. - 2. * dzFB * TMath::Tan(thetFB1);
1210 dx2FB = dxFB / 2. - 2. * dzFB * TMath::Tan(thetFB2);
1211
1212 TGeoArb8* shFB2 = new TGeoArb8(dzFB);
1213 shFB2->SetVertex(0, -dyFB / 2., -dxFB / 2.);
1214 shFB2->SetVertex(1, -dyFB / 2., dxFB / 2.);
1215 shFB2->SetVertex(2, dyFB / 2., dxFB / 2.);
1216 shFB2->SetVertex(3, dyFB / 2., -dxFB / 2.);
1217
1218 shFB2->SetVertex(4, -dyFB / 2., -dx1FB);
1219 shFB2->SetVertex(5, -dyFB / 2., dx2FB);
1220 shFB2->SetVertex(6, dyFB / 2., dx2FB);
1221 shFB2->SetVertex(7, dyFB / 2., -dx1FB);
1222
1223 TGeoVolume* volFB2 = new TGeoVolume("BTRD_FB2", shFB2, kMedAlu);
1224 TGeoVolume* volTAR21 = new TGeoVolume("BTRD_TAR21", new TGeoBBox(dyFB / 2., dxFB / 2., 3.), kMedAlu);
1225 TGeoVolume* volTAR22 = new TGeoVolume("BTRD_TAR22", new TGeoBBox(dyFB / 2. - 0.25, dxFB / 2., 3. - 0.5), kMedAir);
1226 volTAR21->AddNode(volTAR22, 1, new TGeoTranslation(-0.25, 0., 0.0));
1227 // tie anchor
1228 TGeoVolume* volTAR23 = new TGeoVolume("BTRD_TAR23", new TGeoBBox(0.3, 40., 3.), kMedAlu);
1229
1230 TGeoVolumeAssembly* asFB3 = new TGeoVolumeAssembly("BTRD_FBAS3");
1231 TGeoVolumeAssembly* asFB4 = new TGeoVolumeAssembly("BTRD_FBAS4");
1232 asFB3->AddNode(volFB2, 1, gGeoIdentity);
1233 asFB3->AddNode(volTAR21, 1, new TGeoTranslation(0., 0., -dzFB - 3.));
1234 asFB3->AddNode(volTAR23, 1, new TGeoTranslation(-1.36, 0., -dzFB - 3.));
1235 asFB3->AddNode(volTAR141, 1, new TGeoTranslation(0., dxFB - 2., -dzFB - 3.));
1236 asFB3->AddNode(volTAR141, 2, new TGeoTranslation(0., -dxFB + 2., -dzFB - 3.));
1237
1238 asFB4->AddNode(volFB2, 2, gGeoIdentity);
1239 asFB4->AddNode(volTAR21, 2, new TGeoTranslation(0., 0., -dzFB - 3.));
1240 asFB4->AddNode(volTAR23, 2, new TGeoTranslation(1.36, 0.5, -dzFB - 3.));
1241 asFB4->AddNode(volTAR142, 3, new TGeoTranslation(0., dxFB - 2. + 0.5, -dzFB - 3.));
1242 asFB4->AddNode(volTAR142, 4, new TGeoTranslation(0., -dxFB + 2. + 0.5, -dzFB - 3.));
1243
1244 float zTA1 = 21.1;
1245 float yFB1 = 87.6;
1246 float yFB2 = 231.4;
1247 dx = ((hR - longH / 2. + iFrH0 / 2.) - dext + zTA1) * tan10 - 3.9 / 4.;
1248
1249 for (int index = 0; index < 11; index++) {
1250 int imod = isec_1[index];
1251 if (imod != 5) {
1252 vmc->Gspos("BTRD_FBAS2", index, module[imod], dx, -yFB1, zTA1, idrotm[2097], "ONLY");
1253 }
1254
1255 if (imod != 13) {
1256 vmc->Gspos("BTRD_FBAS1", 11 + index, module[imod], -dx, -yFB1, zTA1, idrotm[2087], "ONLY");
1257 }
1258
1259 if (imod != 5) {
1260 vmc->Gspos("BTRD_FBAS1", 22 + index, module[imod], dx, yFB1, zTA1, idrotm[2096], "ONLY");
1261 }
1262
1263 if (imod != 13) {
1264 vmc->Gspos("BTRD_FBAS2", 33 + index, module[imod], -dx, yFB1, zTA1, idrotm[2086], "ONLY");
1265 }
1266
1267 if (imod != 5) {
1268 vmc->Gspos("BTRD_FBAS4", index, module[imod], dx, -yFB2, zTA1, idrotm[2097], "ONLY");
1269 }
1270
1271 if (imod != 13) {
1272 vmc->Gspos("BTRD_FBAS3", 11 + index, module[imod], -dx, -yFB2, zTA1, idrotm[2087], "ONLY");
1273 }
1274
1275 if (imod != 5) {
1276 vmc->Gspos("BTRD_FBAS3", 22 + index, module[imod], dx, yFB2, zTA1, idrotm[2096], "ONLY");
1277 }
1278
1279 if (imod != 13) {
1280 vmc->Gspos("BTRD_FBAS4", 33 + index, module[imod], -dx, yFB2, zTA1, idrotm[2086], "ONLY");
1281 }
1282 }
1283
1284 //
1285 // TOF Support Structures
1286
1287 //
1288 // Frame extension rectangular beams
1289 lbox[0] = 6;
1290 lbox[1] = 3.;
1291 lbox[2] = 36.0;
1292 TGeoVolume* voBTOFS1 = new TGeoVolume("BTOFS1", new TGeoBBox(lbox), gGeoManager->GetMedium("FRAME_Steel"));
1293 lbox[0] = 5.5;
1294 lbox[1] = 2.5;
1295 lbox[2] = 36.0;
1296 TGeoVolume* voBTOFS11 = new TGeoVolume("BTOFS11", new TGeoBBox(lbox), gGeoManager->GetMedium("FRAME_Air"));
1297 voBTOFS1->AddNode(voBTOFS11, 1, gGeoIdentity);
1298
1299 //
1300 // Frame extension rectangular beams
1301 // upper clamps
1302 TGeoXtru* shBTOFS2 = new TGeoXtru(2);
1303 TGeoXtru* shBTOFS3 = new TGeoXtru(2);
1304 TGeoXtru* shBTOFS4 = new TGeoXtru(2);
1305 TGeoXtru* shBTOFS5 = new TGeoXtru(2);
1306
1307 double xxtru1[7];
1308 double yxtru1[7];
1309 // 1
1310 xxtru1[0] = 8.5;
1311 yxtru1[0] = 4.5;
1312 // 2
1313 xxtru1[1] = -6.0;
1314 yxtru1[1] = 4.5;
1315 // 3
1316 xxtru1[2] = -8.5;
1317 yxtru1[2] = 4.5 - 2.5 * sin10;
1318 // 4
1319 xxtru1[3] = 8.5 - 14.5 / cos10;
1320 yxtru1[3] = -6. - 14.5 * sin10;
1321 // 5
1322 xxtru1[4] = 8.5 - 10.5 / cos10;
1323 yxtru1[4] = -6. - 10.5 * sin10;
1324 // 6
1325 xxtru1[5] = xxtru1[4] + 8. * sin10;
1326 yxtru1[5] = yxtru1[4] - 8. / cos10;
1327 // 7
1328 xxtru1[6] = 8.5;
1329 yxtru1[6] = -6.0;
1330
1331 double xxtru2[7];
1332 for (i = 0; i < 7; i++) {
1333 xxtru2[i] = -xxtru1[i];
1334 }
1335
1336 double xxtru3[5];
1337 double yxtru3[5];
1338 double xxtru4[5];
1339 for (i = 0; i < 4; i++) {
1340 xxtru3[i] = xxtru1[i];
1341 yxtru3[i] = yxtru1[i];
1342 }
1343 xxtru3[4] = xxtru1[6];
1344 yxtru3[4] = yxtru1[6];
1345 for (i = 0; i < 5; i++) {
1346 xxtru4[i] = -xxtru3[i];
1347 }
1348
1349 shBTOFS2->DefinePolygon(7, xxtru1, yxtru1);
1350 shBTOFS2->DefineSection(0, -4.);
1351 shBTOFS2->DefineSection(1, +4.);
1352
1353 shBTOFS3->DefinePolygon(7, xxtru2, yxtru1);
1354 shBTOFS3->DefineSection(0, -4.);
1355 shBTOFS3->DefineSection(1, +4.);
1356 TGeoVolume* voBTOFS2 = new TGeoVolume("BTOFS2", shBTOFS2, gGeoManager->GetMedium("FRAME_Steel"));
1357 TGeoVolume* voBTOFS3 = new TGeoVolume("BTOFS3", shBTOFS3, gGeoManager->GetMedium("FRAME_Steel"));
1358
1359 // different fixation for clamps close to web frame
1360 shBTOFS4->DefinePolygon(5, xxtru3, yxtru3);
1361 shBTOFS4->DefineSection(0, -4.);
1362 shBTOFS4->DefineSection(1, +4.);
1363
1364 shBTOFS5->DefinePolygon(5, xxtru4, yxtru3);
1365 shBTOFS5->DefineSection(0, -4.);
1366 shBTOFS5->DefineSection(1, +4.);
1367 TGeoVolume* voBTOFS4 = new TGeoVolume("BTOFS4", shBTOFS4, gGeoManager->GetMedium("FRAME_Steel"));
1368 TGeoVolume* voBTOFS5 = new TGeoVolume("BTOFS5", shBTOFS5, gGeoManager->GetMedium("FRAME_Steel"));
1369
1370 lbox[0] = 5.5;
1371 lbox[1] = 2.5;
1372 lbox[2] = 4.0;
1373 TGeoVolume* voBTOFS21 = new TGeoVolume("BTOFS21", new TGeoBBox(lbox), gGeoManager->GetMedium("FRAME_Air"));
1374 voBTOFS2->AddNode(voBTOFS21, 1, gGeoIdentity);
1375 voBTOFS3->AddNode(voBTOFS21, 2, gGeoIdentity);
1376 voBTOFS4->AddNode(voBTOFS21, 3, gGeoIdentity);
1377 voBTOFS5->AddNode(voBTOFS21, 4, gGeoIdentity);
1378
1379 TGeoVolumeAssembly* asTOFS00 = new TGeoVolumeAssembly("BTOFS00");
1380 asTOFS00->AddNode(voBTOFS1, 1, gGeoIdentity);
1381 asTOFS00->AddNode(voBTOFS2, 1, new TGeoTranslation(0., 0., 40.));
1382 asTOFS00->AddNode(voBTOFS2, 2, new TGeoTranslation(0., 0., -40.));
1383
1384 TGeoVolumeAssembly* asTOFS01 = new TGeoVolumeAssembly("BTOFS01");
1385 asTOFS01->AddNode(voBTOFS1, 2, gGeoIdentity);
1386 asTOFS01->AddNode(voBTOFS3, 1, new TGeoTranslation(0., 0., 40.));
1387 asTOFS01->AddNode(voBTOFS3, 2, new TGeoTranslation(0., 0., -40.));
1388
1389 TGeoVolumeAssembly* asTOFS02 = new TGeoVolumeAssembly("BTOFS02");
1390 asTOFS02->AddNode(voBTOFS1, 3, gGeoIdentity);
1391 asTOFS02->AddNode(voBTOFS2, 3, new TGeoTranslation(0., 0., -40.));
1392 asTOFS02->AddNode(voBTOFS4, 2, new TGeoTranslation(0., 0., 40.));
1393
1394 TGeoVolumeAssembly* asTOFS03 = new TGeoVolumeAssembly("BTOFS03");
1395 asTOFS03->AddNode(voBTOFS1, 4, gGeoIdentity);
1396 asTOFS03->AddNode(voBTOFS3, 3, new TGeoTranslation(0., 0., -40.));
1397 asTOFS03->AddNode(voBTOFS5, 2, new TGeoTranslation(0., 0., 40.));
1398
1399 asTOFS00->SetVisibility(1);
1400 asTOFS01->SetVisibility(1);
1401
1402 for (i = 0; i < 18; i++) {
1403 if (i >= 4 && i <= 8) {
1404 continue;
1405 }
1406 float phi1 = i * 20.;
1407 float phi2 = 270. + phi1;
1408 rot1 = new TGeoRotation(Form("TOFS_R1_%d", i), 90.0, phi1, 90., phi2, 0., 0.);
1409 dx = TMath::Sin((phi1 + 8.95) * kdeg2rad) * (rout2 + 12.);
1410 dy = -TMath::Cos((phi1 + 8.95) * kdeg2rad) * (rout2 + 12.);
1411 if ((i > 3 && i < 8) || (i > 10 && i < 15)) {
1412 (gGeoManager->GetVolume("B077"))->AddNode(asTOFS03, i, new TGeoCombiTrans(dx, dy, 345. - 53. - 0.5, rot1));
1413 } else {
1414 (gGeoManager->GetVolume("B077"))->AddNode(asTOFS01, i, new TGeoCombiTrans(dx, dy, 345. - 53. - 0.5, rot1));
1415 }
1416 dx = TMath::Sin((phi1 - 8.95) * kdeg2rad) * (rout2 + 12.);
1417 dy = -TMath::Cos((phi1 - 8.95) * kdeg2rad) * (rout2 + 12.);
1418 if ((i > 3 && i < 8) || (i > 10 && i <= 15)) {
1419 (gGeoManager->GetVolume("B077"))->AddNode(asTOFS02, i, new TGeoCombiTrans(dx, dy, 345. - 53 - 0.5, rot1));
1420 } else {
1421 (gGeoManager->GetVolume("B077"))->AddNode(asTOFS00, i, new TGeoCombiTrans(dx, dy, 345. - 53 - 0.5, rot1));
1422 }
1423 }
1424
1425 //
1426 // Thermal shield
1427 //
1428
1429 float dyM = 99.0;
1430 makeHeatScreen("M", dyM, idrotm[2090], idrotm[2091]);
1431 float dyAM = 119.5;
1432 makeHeatScreen("AM", dyAM, idrotm[2090], idrotm[2091]);
1433 float dyA = 122.5 - 5.5;
1434 makeHeatScreen("A", dyA, idrotm[2090], idrotm[2091]);
1435
1436 //
1437 //
1438 //
1439 dz = -57.2 + 0.6;
1440 for (i = 0; i < 18; i++) {
1441 char nameMo[16];
1442 snprintf(nameMo, 16, "BSEGMO%d", i);
1443 // M
1444 vmc->Gspos("BTSH_M", i + 1, nameMo, 0., 0., dz, 0, "ONLY");
1445 // AM, CM
1446 dy = dymodL[0] + dyAM / 2. + 3.;
1447 vmc->Gspos("BTSH_AM", i + 1, nameMo, 0., dy, dz, 0, "ONLY");
1448 vmc->Gspos("BTSH_AM", i + 19, nameMo, 0., -dy, dz, 0, "ONLY");
1449 // A, C
1450 dy = dymodL[1] + dyA / 2 + 0.4;
1451 vmc->Gspos("BTSH_A", i + 1, nameMo, 0., dy, dz, 0, "ONLY");
1452 vmc->Gspos("BTSH_A", i + 19, nameMo, 0., -dy, dz, 0, "ONLY");
1453 }
1454
1455 //
1456 // TRD mother volumes
1457 //
1458 // absolute position of center 290.43 + 38.95 = 329.38
1459 // frame center 283.00 + 59.50 = 342.50
1460 // relative position of TRD 329.38 - 342.50
1461 //
1462 // shift wrt v2
1463 //
1464 const float zsh = -0.326;
1465 //
1466 ptrd1[0] = 47.4405; // CBL 28/6/2006
1467 ptrd1[1] = 61.1765; // CBL
1468 ptrd1[2] = 375.5; // CBL
1469 ptrd1[3] = 38.95; // CBL
1470
1471 for (i = 0; i < 18; i++) {
1472 char nameCh[16];
1473 snprintf(nameCh, 16, "BTRD%d", i);
1474 char nameMo[16];
1475 snprintf(nameMo, 16, "BSEGMO%d", i);
1476 vmc->Gsvolu(nameCh, "TRD1", kAir, ptrd1, 4);
1477 gGeoManager->GetVolume(nameCh)->SetVisibility(false);
1478 vmc->Gspos(nameCh, 1, nameMo, 0., 0., -12.62 + zsh, 0, "ONLY"); // CBL 28/6/2006
1479 }
1480
1481 //
1482 // TOF mother volumes as modified by B.Guerzoni
1483 // to remove overlaps/extrusions in case of aligned TOF SMs
1484 //
1485 ptrd1[0] = 62.2500;
1486 ptrd1[1] = 64.25;
1487 ptrd1[2] = 372.6;
1488 ptrd1[3] = 14.525 / 2;
1489
1490 char nameChA[16];
1491 snprintf(nameChA, 16, "BTOFA");
1492 TGeoTrd1* trd1 = new TGeoTrd1(nameChA, ptrd1[0], ptrd1[1], ptrd1[2], ptrd1[3]);
1493 trd1->SetName("BTOFA"); // just to avoid a warning
1494
1495 char nameChB[16];
1496 snprintf(nameChB, 16, "BTOFB");
1497 TGeoBBox* box1 = new TGeoBBox(nameChB, 64.25, 372.6, 1.0);
1498 box1->SetName("BTOFB"); // just to avoid a warning
1499
1500 char nameChC[16];
1501 snprintf(nameChC, 16, "BTOFC");
1502 TGeoBBox* box2 = new TGeoBBox(nameChC, 62.25, 372.6, 6.2625);
1503 box2->SetName("BTOFC"); // just to avoid a warning
1504
1505 TGeoTranslation* tr1 = new TGeoTranslation("trnsl1", 0, 0, -14.525 / 2);
1506 tr1->RegisterYourself();
1507 TGeoTranslation* tr2 = new TGeoTranslation("trnsl2", 0, 0, +1.0);
1508 tr2->RegisterYourself();
1509 TGeoTranslation* tr3 = new TGeoTranslation("trnsl3", 0, 0, 8.2625);
1510 tr3->RegisterYourself();
1511 TGeoCompositeShape* btofcs = new TGeoCompositeShape("Btofcs", "(BTOFA:trnsl1)+(BTOFB:trnsl2)+(BTOFC:trnsl3)");
1512 for (i = 0; i < 18; i++) {
1513 char nameCh[16];
1514 snprintf(nameCh, 16, "BTOF%d", i);
1515 char nameMo[16];
1516 snprintf(nameMo, 16, "BSEGMO%d", i);
1517 TGeoVolume* btf = new TGeoVolume(nameCh, btofcs, gGeoManager->GetMedium("FRAME_Air"));
1518 btf->SetName(nameCh);
1519 gGeoManager->GetVolume(nameCh)->SetVisibility(false);
1520 vmc->Gspos(nameCh, 1, nameMo, 0., 0., 43.525 + zsh, 0, "ONLY");
1521 }
1522
1523 // Create TOF Rail
1524 char nameRaV1[16];
1525 snprintf(nameRaV1, 16, "RaV1");
1526 TGeoBBox* boxRaV1 = new TGeoBBox(nameRaV1, 0.5, 350.0, 1.5);
1527 char nameRaO1[16];
1528 snprintf(nameRaO1, 16, "RaO1");
1529 TGeoBBox* boxRaO1 = new TGeoBBox(nameRaO1, 1.5, 350.0, 0.5);
1530 TGeoCompositeShape* C1 = (TGeoCompositeShape*)createTOFRail(45.61);
1531 C1->SetName("C1");
1532 TGeoCompositeShape* C2 = (TGeoCompositeShape*)createTOFRail(61.61);
1533 C2->SetName("C2");
1534 TGeoCompositeShape* C3 = (TGeoCompositeShape*)createTOFRail(63.11);
1535 C3->SetName("C3");
1536 TGeoCompositeShape* C4 = (TGeoCompositeShape*)createTOFRail(61.61);
1537 C4->SetName("C4");
1538 TGeoCompositeShape* C5 = (TGeoCompositeShape*)createTOFRail(45.61);
1539 C5->SetName("C5");
1540 TGeoTranslation* trRaO1 = new TGeoTranslation("trRaO1", 1., 0., -2.);
1541 trRaO1->RegisterYourself();
1542 TGeoTranslation* trC1 = new TGeoTranslation("trC1", -3.39, -286.6, -0.15);
1543 trC1->RegisterYourself();
1544 TGeoTranslation* trC2 = new TGeoTranslation("trC2", -3.39, -152., -0.15);
1545 trC2->RegisterYourself();
1546 TGeoTranslation* trC3 = new TGeoTranslation("trC3", -3.39, +8.5, -0.15);
1547 trC3->RegisterYourself();
1548 TGeoTranslation* trC4 = new TGeoTranslation("trC4", -3.39, +151.8, -0.15);
1549 trC4->RegisterYourself();
1550 TGeoTranslation* trC5 = new TGeoTranslation("trC5", -3.39, 286.6, -0.15);
1551 trC5->RegisterYourself();
1552
1553 TGeoCompositeShape* TOFrail =
1554 new TGeoCompositeShape("TOFrail", "(RaV1+RaO1:trRaO1)+C1:trC1+C2:trC2+C3:trC3+C4:trC4+C5:trC5");
1555
1556 char nameTR[16];
1557 snprintf(nameTR, 16, "VolTOFrail");
1558 TGeoVolume* VolTOFrail = new TGeoVolume(nameTR, TOFrail, gGeoManager->GetMedium("FRAME_Aluminum"));
1559 VolTOFrail->SetName(nameTR);
1560 gGeoManager->GetVolume(nameTR)->SetVisibility(true);
1561 AliMatrix(idrotm[2102], 90.0, 180.0, 90.0, 270.0, 0.0, 180.0);
1562
1563 for (i = 0; i < 18; i++) {
1564 char nameMo[16];
1565 snprintf(nameMo, 16, "BSEGMO%d", i);
1566 vmc->Gspos("VolTOFrail", 2 * i, nameMo, -66.27, 0., +56.33 + zsh, 0, "ONLY");
1567 vmc->Gspos("VolTOFrail", 2 * i + 1, nameMo, 66.27, 0., +56.33 + zsh, idrotm[2102], "ONLY");
1568 }
1569
1570 //
1571 // Geometry of Rails starts here
1572 //
1573 //
1574 //
1575 // Rails for space-frame
1576 //
1577 float rbox[3];
1578
1579 rbox[0] = 25.00;
1580 rbox[1] = 27.50;
1581 rbox[2] = 600.00;
1582 vmc->Gsvolu("BRS1", "BOX", kAir, rbox, 3);
1583
1584 rbox[0] = 25.00;
1585 rbox[1] = 3.75;
1586 vmc->Gsvolu("BRS2", "BOX", kSteel, rbox, 3);
1587
1588 rbox[0] = 3.00;
1589 rbox[1] = 20.00;
1590 vmc->Gsvolu("BRS3", "BOX", kSteel, rbox, 3);
1591
1592 vmc->Gspos("BRS2", 1, "BRS1", 0., -27.5 + 3.75, 0., 0, "ONLY");
1593 vmc->Gspos("BRS2", 2, "BRS1", 0., 27.5 - 3.75, 0., 0, "ONLY");
1594 vmc->Gspos("BRS3", 1, "BRS1", 0., 0., 0., 0, "ONLY");
1595 vmc->Gspos("BRS1", 1, TOPNAME, -430. - 3.1 + 30., -190., 0., 0, "ONLY");
1596 vmc->Gspos("BRS1", 2, TOPNAME, 430. + 3.1 + 30., -190., 0., 0, "ONLY");
1597
1598 rbox[0] = 3.0;
1599 rbox[1] = 145. / 4.;
1600 rbox[2] = 25.0;
1601 vmc->Gsvolu("BRS4", "BOX", kSteel, rbox, 3);
1602
1603 vmc->Gspos("BRS4", 1, TOPNAME, 430. + 3., -190. + 55. / 2. + rbox[1] + 30., 224., 0, "ONLY");
1604 vmc->Gspos("BRS4", 2, TOPNAME, 430. + 3., -190. + 55. / 2. + rbox[1] + 30., -224., 0, "ONLY");
1605
1606 //
1607 // The Backframe
1608 //
1609 // Inner radius
1610 float kBFMRin = 270.0;
1611 // Outer Radius
1612 float kBFMRou = 417.5;
1613 // Width
1614 float kBFMdz = 118.0;
1615 //
1616 //
1617 // Rings
1618 float kBFRdr = 7.5;
1619 float kBFRdz = 8.0;
1620 //
1621 //
1622 // Bars and Spokes
1623 //
1624 float kBFBd = 8.0;
1625 float kBFBdd = 0.6;
1626
1627 // The Mother volume
1628 float tpar[3];
1629 tpar[0] = kBFMRin;
1630 tpar[1] = kBFMRou;
1631 tpar[2] = kBFMdz / 2.;
1632 vmc->Gsvolu("BFMO", "TUBE", kAir, tpar, 3);
1633
1634 // CBL ////////////////////////////////////////////////////////
1635 //
1636 // TRD mother volume
1637 //
1638
1639 ptrd1[0] = 47.4405 - 0.3;
1640 ptrd1[1] = 61.1765 - 0.3;
1641 ptrd1[2] = kBFMdz / 2.;
1642 ptrd1[3] = 38.95;
1643 vmc->Gsvolu("BFTRD", "TRD1", kAir, ptrd1, 4);
1644 gGeoManager->GetVolume("BFTRD")->SetVisibility(false);
1645
1646 for (i = 0; i < 18; i++) {
1647 float phiBF = i * 20.0;
1648 dx = TMath::Sin(phiBF * kdeg2rad) * (342.0 - 12.62);
1649 dy = -TMath::Cos(phiBF * kdeg2rad) * (342.0 - 12.62);
1650 vmc->Gspos("BFTRD", i, "BFMO", dx, dy, 0.0, idrotm[2034 + i], "ONLY");
1651 }
1652
1653 // CBL ////////////////////////////////////////////////////////
1654
1655 // Rings
1656 //
1657 // Inner Ring
1658 tpar[0] = kBFMRin;
1659 tpar[1] = tpar[0] + kBFRdr;
1660 tpar[2] = kBFRdz / 2.;
1661
1662 vmc->Gsvolu("BFIR", "TUBE", kSteel, tpar, 3);
1663
1664 tpar[0] = tpar[0] + kBFBdd;
1665 tpar[1] = tpar[1] - kBFBdd;
1666 tpar[2] = (kBFRdz - 2. * kBFBdd) / 2.;
1667
1668 vmc->Gsvolu("BFII", "TUBE", kAir, tpar, 3);
1669 vmc->Gspos("BFII", 1, "BFIR", 0., 0., 0., 0, "ONLY");
1670
1671 //
1672 // Outer RING
1673 tpar[0] = kBFMRou - kBFRdr + 0.1;
1674 tpar[1] = kBFMRou;
1675 tpar[2] = kBFRdz / 2.;
1676
1677 vmc->Gsvolu("BFOR", "TUBE", kSteel, tpar, 3);
1678
1679 tpar[0] = tpar[0] + kBFBdd;
1680 tpar[1] = tpar[1] - kBFBdd;
1681 tpar[2] = (kBFRdz - 2. * kBFBdd) / 2.;
1682
1683 vmc->Gsvolu("BFOO", "TUBE", kAir, tpar, 3);
1684 vmc->Gspos("BFOO", 1, "BFOR", 0., 0., 0., 0, "ONLY");
1685
1686 dz = kBFMdz / 2. - kBFRdz / 2.;
1687 vmc->Gspos("BFIR", 1, "BFMO", 0., 0., dz, 0, "ONLY");
1688 vmc->Gspos("BFIR", 2, "BFMO", 0., 0., -dz, 0, "ONLY");
1689 vmc->Gspos("BFOR", 1, "BFMO", 0., 0., dz, 0, "ONLY");
1690 vmc->Gspos("BFOR", 2, "BFMO", 0., 0., -dz, 0, "ONLY");
1691
1692 //
1693 // Longitudinal Bars
1694 //
1695 float bpar[3];
1696
1697 bpar[0] = kBFBd / 2;
1698 bpar[1] = bpar[0];
1699 bpar[2] = kBFMdz / 2. - kBFBd;
1700 vmc->Gsvolu("BFLB", "BOX ", kSteel, bpar, 3);
1701
1702 bpar[0] = bpar[0] - kBFBdd;
1703 bpar[1] = bpar[1] - kBFBdd;
1704 bpar[2] = bpar[2] - kBFBdd;
1705 vmc->Gsvolu("BFLL", "BOX ", kAir, bpar, 3);
1706 vmc->Gspos("BFLL", 1, "BFLB", 0., 0., 0., 0, "ONLY");
1707
1708 for (i = 0; i < 18; i++) {
1709 float ro = kBFMRou - kBFBd / 2. - 0.02;
1710 float ri = kBFMRin + kBFBd / 2.;
1711
1712 float phi0 = float(i) * 20.;
1713
1714 float xb = ri * TMath::Cos(phi0 * kDegrad);
1715 float yb = ri * TMath::Sin(phi0 * kDegrad);
1716 AliMatrix(idrotm[2090 + i], 90.0, phi0, 90.0, phi0 + 270., 0., 0.);
1717
1718 vmc->Gspos("BFLB", i + 1, "BFMO", xb, yb, 0., idrotm[2090 + i], "ONLY");
1719
1720 xb = ro * TMath::Cos(phi0 * kDegrad);
1721 yb = ro * TMath::Sin(phi0 * kDegrad);
1722
1723 vmc->Gspos("BFLB", i + 19, "BFMO", xb, yb, 0., idrotm[2090 + i], "ONLY");
1724 }
1725
1726 //
1727 // Radial Bars
1728 //
1729 bpar[0] = (kBFMRou - kBFMRin - 2. * kBFRdr) / 2.;
1730 bpar[1] = kBFBd / 2;
1731 bpar[2] = bpar[1];
1732 //
1733 // Avoid overlap with circle
1734 float rr = kBFMRou - kBFRdr;
1735 float delta = rr - TMath::Sqrt(rr * rr - kBFBd * kBFBd / 4.) + 0.01;
1736 bpar[0] -= delta / 2.;
1737
1738 vmc->Gsvolu("BFRB", "BOX ", kSteel, bpar, 3);
1739
1740 bpar[0] = bpar[0] - kBFBdd;
1741 bpar[1] = bpar[1] - kBFBdd;
1742 bpar[2] = bpar[2] - kBFBdd;
1743 vmc->Gsvolu("BFRR", "BOX ", kAir, bpar, 3);
1744 vmc->Gspos("BFRR", 1, "BFRB", 0., 0., 0., 0, "ONLY");
1745
1746 int iphi[10] = {0, 1, 3, 6, 8, 9, 10, 12, 15, 17};
1747
1748 for (i = 0; i < 10; i++) {
1749 float rb = (kBFMRin + kBFMRou) / 2.;
1750 float phib = float(iphi[i]) * 20.;
1751
1752 float xb = rb * TMath::Cos(phib * kDegrad);
1753 float yb = rb * TMath::Sin(phib * kDegrad);
1754
1755 vmc->Gspos("BFRB", i + 1, "BFMO", xb, yb, dz, idrotm[2034 + iphi[i]], "ONLY");
1756 vmc->Gspos("BFRB", i + 11, "BFMO", xb, yb, -dz, idrotm[2034 + iphi[i]], "ONLY");
1757 }
1758
1759 vmc->Gspos("BFMO", i + 19, TOPNAME, 0, 30., -376. - kBFMdz / 2. - 0.5, 0, "ONLY");
1760
1761 //
1762 //
1763 // The Baby Frame
1764 //
1765 //
1766 //
1767 // Inner radius
1768 float kBBMRin = 278.0;
1769 // Outer Radius
1770 float kBBMRou = 410.5;
1771 // Width
1772 float kBBMdz = 223.0;
1773 float kBBBdz = 6.0;
1774 float kBBBdd = 0.6;
1775
1776 // The Mother volume
1777
1778 ppgon[0] = 0.;
1779 ppgon[1] = 360.;
1780 ppgon[2] = 18.;
1781
1782 ppgon[3] = 2.;
1783 ppgon[4] = -kBBMdz / 2.;
1784 ppgon[5] = kBBMRin;
1785 ppgon[6] = kBBMRou;
1786
1787 ppgon[7] = -ppgon[4];
1788 ppgon[8] = ppgon[5];
1789 ppgon[9] = ppgon[6];
1790
1791 vmc->Gsvolu("BBMO", "PGON", kAir, ppgon, 10);
1792 vmc->Gsdvn("BBCE", "BBMO", 18, 2);
1793
1794 // CBL ////////////////////////////////////////////////////////
1795 //
1796 // TRD mother volume
1797 //
1798
1799 AliMatrix(idrotm[2092], 90.0, 90.0, 0.0, 0.0, 90.0, 0.0);
1800
1801 ptrd1[0] = 47.4405 - 2.5;
1802 ptrd1[1] = 61.1765 - 2.5;
1803 ptrd1[2] = kBBMdz / 2.;
1804 ptrd1[3] = 38.95;
1805 vmc->Gsvolu("BBTRD", "TRD1", kAir, ptrd1, 4);
1806 gGeoManager->GetVolume("BBTRD")->SetVisibility(false);
1807 vmc->Gspos("BBTRD", 1, "BBCE", 342.0 - 12.62, 0.0, 0.0, idrotm[2092], "ONLY");
1808
1809 // CBL ////////////////////////////////////////////////////////
1810
1811 // Longitudinal bars
1812 bpar[0] = kBBBdz / 2.;
1813 bpar[1] = bpar[0];
1814 bpar[2] = kBBMdz / 2. - kBBBdz;
1815 vmc->Gsvolu("BBLB", "BOX ", kSteel, bpar, 3);
1816 bpar[0] -= kBBBdd;
1817 bpar[1] -= kBBBdd;
1818 bpar[2] -= kBBBdd;
1819 vmc->Gsvolu("BBLL", "BOX ", kAir, bpar, 3);
1820 vmc->Gspos("BBLL", 1, "BBLB", 0., 0., 0., 0, "ONLY");
1821
1822 dx = kBBMRin + kBBBdz / 2. + (bpar[1] + kBBBdd) * TMath::Sin(10. * kDegrad);
1823 dy = dx * TMath::Tan(10. * kDegrad) - kBBBdz / 2. / TMath::Cos(10. * kDegrad);
1824 vmc->Gspos("BBLB", 1, "BBCE", dx, dy, 0., idrotm[2052], "ONLY");
1825
1826 dx = kBBMRou - kBBBdz / 2. - (bpar[1] + kBBBdd) * TMath::Sin(10. * kDegrad);
1827 dy = dx * TMath::Tan(10. * kDegrad) - kBBBdz / 2. / TMath::Cos(10. * kDegrad);
1828
1829 vmc->Gspos("BBLB", 2, "BBCE", dx, dy, 0., idrotm[2052], "ONLY");
1830
1831 //
1832 // Radial Bars
1833 //
1834 bpar[0] = (kBBMRou - kBBMRin) / 2. - kBBBdz;
1835 bpar[1] = kBBBdz / 2;
1836 bpar[2] = bpar[1];
1837
1838 vmc->Gsvolu("BBRB", "BOX ", kSteel, bpar, 3);
1839 bpar[0] -= kBBBdd;
1840 bpar[1] -= kBBBdd;
1841 bpar[2] -= kBBBdd;
1842 vmc->Gsvolu("BBRR", "BOX ", kAir, bpar, 3);
1843 vmc->Gspos("BBRR", 1, "BBRB", 0., 0., 0., 0, "ONLY");
1844
1845 dx = (kBBMRou + kBBMRin) / 2.;
1846 dy = ((kBBMRou + kBBMRin) / 2) * TMath::Tan(10 * kDegrad) - kBBBdz / 2. / TMath::Cos(10 * kDegrad);
1847 dz = kBBMdz / 2. - kBBBdz / 2.;
1848
1849 vmc->Gspos("BBRB", 1, "BBCE", dx, dy, dz, idrotm[2052], "ONLY");
1850 vmc->Gspos("BBRB", 2, "BBCE", dx, dy, -dz, idrotm[2052], "ONLY");
1851 vmc->Gspos("BBRB", 3, "BBCE", dx, dy, 0., idrotm[2052], "ONLY");
1852
1853 //
1854 // Circular bars
1855 //
1856 // Inner
1857
1858 bpar[1] = kBBMRin * TMath::Sin(10. * kDegrad);
1859 bpar[0] = kBBBdz / 2;
1860 bpar[2] = bpar[0];
1861 vmc->Gsvolu("BBC1", "BOX ", kSteel, bpar, 3);
1862 bpar[0] -= kBBBdd;
1863 bpar[1] -= kBBBdd;
1864 bpar[2] -= kBBBdd;
1865 vmc->Gsvolu("BBC2", "BOX ", kAir, bpar, 3);
1866 vmc->Gspos("BBC2", 1, "BBC1", 0., 0., 0., 0, "ONLY");
1867 dx = kBBMRin + kBBBdz / 2;
1868 dy = 0.;
1869 vmc->Gspos("BBC1", 1, "BBCE", dx, dy, dz, 0, "ONLY");
1870 vmc->Gspos("BBC1", 2, "BBCE", dx, dy, -dz, 0, "ONLY");
1871 //
1872 // Outer
1873 bpar[1] = (kBBMRou - kBBBdz) * TMath::Sin(10. * kDegrad);
1874 bpar[0] = kBBBdz / 2;
1875 bpar[2] = bpar[0];
1876 vmc->Gsvolu("BBC3", "BOX ", kSteel, bpar, 3);
1877 bpar[0] -= kBBBdd;
1878 bpar[1] -= kBBBdd;
1879 bpar[2] -= kBBBdd;
1880 vmc->Gsvolu("BBC4", "BOX ", kAir, bpar, 3);
1881 vmc->Gspos("BBC4", 1, "BBC3", 0., 0., 0., 0, "ONLY");
1882 dx = kBBMRou - kBBBdz / 2;
1883 dy = 0.;
1884 vmc->Gspos("BBC3", 1, "BBCE", dx, dy, dz, 0, "ONLY");
1885 vmc->Gspos("BBC3", 2, "BBCE", dx, dy, -dz, 0, "ONLY");
1886 //
1887 // Diagonal Bars
1888 //
1889 h = (kBBMRou - kBBMRin - 2. * kBBBdz);
1890 ;
1891 d = kBBBdz;
1892 dz = kBBMdz / 2. - 1.6 * kBBBdz;
1893 dq = h * h + dz * dz;
1894
1895 x = TMath::Sqrt((dz * dz - d * d) / dq + d * d * h * h / dq / dq) + d * h / dq;
1896
1897 theta = kRaddeg * TMath::ACos(x);
1898
1899 ptrap[0] = dz / 2.;
1900 ptrap[1] = theta;
1901 ptrap[2] = 0.;
1902 ptrap[3] = d / 2;
1903 ptrap[4] = d / x / 2;
1904 ptrap[5] = ptrap[4];
1905 ptrap[6] = 0;
1906 ptrap[7] = ptrap[3];
1907 ptrap[8] = ptrap[4];
1908 ptrap[9] = ptrap[4];
1909 ptrap[10] = 0;
1910 vmc->Gsvolu("BBD1", "TRAP", kSteel, ptrap, 11);
1911 ptrap[3] = d / 2 - kBBBdd;
1912 ptrap[4] = (d / 2 - kBBBdd) / x;
1913 ptrap[5] = ptrap[4];
1914 ptrap[7] = ptrap[3];
1915 ptrap[8] = ptrap[4];
1916 ptrap[9] = ptrap[4];
1917 vmc->Gsvolu("BBD3", "TRAP", kAir, ptrap, 11);
1918 vmc->Gspos("BBD3", 1, "BBD1", 0.0, 0.0, 0., 0, "ONLY");
1919 dx = (kBBMRou + kBBMRin) / 2.;
1920 dy = ((kBBMRou + kBBMRin) / 2) * TMath::Tan(10 * kDegrad) - kBBBdz / 2. / TMath::Cos(10 * kDegrad);
1921 vmc->Gspos("BBD1", 1, "BBCE", dx, dy, dz / 2. + kBBBdz / 2., idrotm[2052], "ONLY");
1922
1923 ptrap[0] = dz / 2.;
1924 ptrap[1] = -theta;
1925 ptrap[2] = 0.;
1926 ptrap[3] = d / 2;
1927 ptrap[4] = d / 2 / x;
1928 ptrap[5] = ptrap[4];
1929 ptrap[6] = 0;
1930 ptrap[7] = ptrap[3];
1931 ptrap[8] = ptrap[4];
1932 ptrap[9] = ptrap[4];
1933 ptrap[10] = 0;
1934 vmc->Gsvolu("BBD2", "TRAP", kSteel, ptrap, 11);
1935 ptrap[3] = d / 2 - kBBBdd;
1936 ptrap[4] = (d / 2 - kBBBdd) / x;
1937 ptrap[5] = ptrap[4];
1938 ptrap[7] = ptrap[3];
1939 ptrap[8] = ptrap[4];
1940 ptrap[9] = ptrap[4];
1941 vmc->Gsvolu("BBD4", "TRAP", kAir, ptrap, 11);
1942 vmc->Gspos("BBD4", 1, "BBD2", 0.0, 0.0, 0., 0, "ONLY");
1943 dx = (kBBMRou + kBBMRin) / 2.;
1944 dy = ((kBBMRou + kBBMRin) / 2) * TMath::Tan(10 * kDegrad) - kBBBdz / 2. / TMath::Cos(10 * kDegrad);
1945 vmc->Gspos("BBD2", 1, "BBCE", dx, dy, -dz / 2. - kBBBdz / 2., idrotm[2052], "ONLY");
1946
1947 vmc->Gspos("BBMO", 1, TOPNAME, 0., 30., +376. + kBBMdz / 2. + 0.5, 0, "ONLY");
1948}
1949} // namespace passive
1950} // namespace o2
Definition of the Detector class.
#define kDegrad
#define AliMatrix
#define kRaddeg
ClassImp(o2::passive::FrameStructure)
int32_t i
Definition of the MagF class.
uint32_t j
Definition RawData.h:0
Class for time synchronization of RawReader instances.
static void initFieldTrackingParams(int &mode, float &maxfield)
Definition Detector.cxx:143
static MaterialManager & Instance()
FairModule * CloneModule() const override
a common base class for passive modules - implementing generic functions
Definition PassiveBase.h:24
GLint GLenum GLint x
Definition glcorearb.h:403
GLuint index
Definition glcorearb.h:781
GLuint const GLchar * name
Definition glcorearb.h:781
GLboolean r
Definition glcorearb.h:1233
const char * TOPNAME
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
o2::mch::DsIndex ds
std::random_device rd