Line data Source code
1 : /**************************************************************************
2 : * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 : * *
4 : * Author: The ALICE Off-line Project. *
5 : * Contributors are mentioned in the code where appropriate. *
6 : * *
7 : * Permission to use, copy, modify and distribute this software and its *
8 : * documentation strictly for non-commercial purposes is hereby granted *
9 : * without fee, provided that the above copyright notice appears in all *
10 : * copies and that both the copyright notice and this permission notice *
11 : * appear in the supporting documentation. The authors make no claims *
12 : * about the suitability of this software for any purpose. It is *
13 : * provided "as is" without express or implied warranty. *
14 : **************************************************************************/
15 :
16 : /* $Id$ */
17 :
18 : //------------------------------------------------------------------------
19 : // AliFRAMEv2.cxx
20 : // symmetric space frame with possibility for holes
21 : // Author: A.Morsch
22 : //------------------------------------------------------------------------
23 :
24 : #include <TGeoBBox.h>
25 : #include <TGeoCompositeShape.h>
26 : #include <TGeoGlobalMagField.h>
27 : #include <TGeoManager.h>
28 : #include <TGeoMatrix.h>
29 : #include <TGeoPgon.h>
30 : #include <TString.h>
31 : #include <TSystem.h>
32 : #include <TVirtualMC.h>
33 :
34 : #include "AliFRAMEv2.h"
35 : #include "AliMagF.h"
36 : #include "AliRun.h"
37 : #include "AliConst.h"
38 : #include "AliMC.h"
39 : #include "AliLog.h"
40 : #include "AliTrackReference.h"
41 :
42 :
43 : #include <TGeoTrd1.h>
44 :
45 12 : ClassImp(AliFRAMEv2)
46 :
47 :
48 : //_____________________________________________________________________________
49 12 : AliFRAMEv2::AliFRAMEv2():
50 12 : fHoles(0)
51 60 : {
52 : // Constructor
53 24 : }
54 :
55 : //_____________________________________________________________________________
56 : AliFRAMEv2::AliFRAMEv2(const char *name, const char *title)
57 1 : : AliFRAME(name,title),
58 1 : fHoles(0)
59 5 : {
60 : // Constructor
61 2 : }
62 :
63 : //___________________________________________
64 : void AliFRAMEv2::CreateGeometry()
65 : {
66 : //Begin_Html
67 : /*
68 : <img src="picts/frame.gif">
69 : */
70 : //End_Html
71 :
72 :
73 : //Begin_Html
74 : /*
75 : <img src="picts/tree_frame.gif">
76 : */
77 : //End_Html
78 :
79 2 : Int_t idrotm[2299];
80 :
81 :
82 :
83 1 : AliMatrix(idrotm[2070], 90.0, 0.0, 90.0, 270.0, 0.0, 0.0);
84 : //
85 1 : AliMatrix(idrotm[2083], 170.0, 0.0, 90.0, 90.0, 80.0, 0.0);
86 1 : AliMatrix(idrotm[2084], 170.0, 180.0, 90.0, 90.0, 80.0, 180.0);
87 1 : AliMatrix(idrotm[2085], 90.0, 180.0, 90.0, 90.0, 0.0, 0.0);
88 : //
89 1 : AliMatrix(idrotm[2086], 90.0, 0.0, 90.0, 90., 0.0, 0.0);
90 1 : AliMatrix(idrotm[2087], 90.0, 180.0, 90.0, 270., 0.0, 0.0);
91 1 : AliMatrix(idrotm[2088], 90.0, 90.0, 90.0, 180., 0.0, 0.0);
92 1 : AliMatrix(idrotm[2089], 90.0, 90.0, 90.0, 0., 0.0, 0.0);
93 : //
94 1 : AliMatrix(idrotm[2090], 90.0, 0.0, 0.0, 0., 90.0, 90.0);
95 1 : AliMatrix(idrotm[2091], 0.0, 0.0, 90.0, 90., 90.0, 0.0);
96 : //
97 : // Matrices have been imported from Euclid. Some simplification
98 : // seems possible
99 : //
100 :
101 1 : AliMatrix(idrotm[2003], 0.0, 0.0, 90.0, 130.0, 90.0, 40.0);
102 1 : AliMatrix(idrotm[2004], 180.0, 0.0, 90.0, 130.0, 90.0, 40.0);
103 1 : AliMatrix(idrotm[2005], 180.0, 0.0, 90.0, 150.0, 90.0, 240.0);
104 1 : AliMatrix(idrotm[2006], 0.0, 0.0, 90.0, 150.0, 90.0, 240.0);
105 1 : AliMatrix(idrotm[2007], 0.0, 0.0, 90.0, 170.0, 90.0, 80.0);
106 1 : AliMatrix(idrotm[2008], 180.0, 0.0, 90.0, 190.0, 90.0, 280.0);
107 1 : AliMatrix(idrotm[2009], 180.0, 0.0, 90.0, 170.0, 90.0, 80.0);
108 1 : AliMatrix(idrotm[2010], 0.0, 0.0, 90.0, 190.0, 90.0, 280.0);
109 1 : AliMatrix(idrotm[2011], 0.0, 0.0, 90.0, 350.0, 90.0, 260.0);
110 1 : AliMatrix(idrotm[2012], 180.0, 0.0, 90.0, 350.0, 90.0, 260.0);
111 1 : AliMatrix(idrotm[2013], 180.0, 0.0, 90.0, 10.0, 90.0, 100.0);
112 1 : AliMatrix(idrotm[2014], 0.0, 0.0, 90.0, 10.0, 90.0, 100.0);
113 1 : AliMatrix(idrotm[2015], 0.0, 0.0, 90.0, 30.0, 90.0, 300.0);
114 1 : AliMatrix(idrotm[2016], 180.0, 0.0, 90.0, 30.0, 90.0, 300.0);
115 1 : AliMatrix(idrotm[2017], 180.0, 0.0, 90.0, 50.0, 90.0, 140.0);
116 1 : AliMatrix(idrotm[2018], 0.0, 0.0, 90.0, 50.0, 90.0, 140.0);
117 :
118 1 : AliMatrix(idrotm[2019], 180.0, 0.0, 90.0, 130.0, 90.0, 220.0);
119 1 : AliMatrix(idrotm[2020], 180.0, 0.0, 90.0, 50.0, 90.0, 320.0);
120 1 : AliMatrix(idrotm[2021], 180.0, 0.0, 90.0, 150.0, 90.0, 60.0);
121 1 : AliMatrix(idrotm[2022], 180.0, 0.0, 90.0, 30.0, 90.0, 120.0);
122 1 : AliMatrix(idrotm[2023], 180.0, 0.0, 90.0, 170.0, 90.0, 260.0);
123 1 : AliMatrix(idrotm[2024], 180.0, 0.0, 90.0, 190.0, 90.0, 100.0);
124 1 : AliMatrix(idrotm[2025], 180.0, 0.0, 90.0, 350.0, 90.0, 80.0);
125 1 : AliMatrix(idrotm[2026], 180.0, 0.0, 90.0, 10.0, 90.0, 280.0);
126 :
127 1 : AliMatrix(idrotm[2027], 0.0, 0.0, 90.0, 50.0, 90.0, 320.0);
128 1 : AliMatrix(idrotm[2028], 0.0, 0.0, 90.0, 150.0, 90.0, 60.0);
129 1 : AliMatrix(idrotm[2029], 0.0, 0.0, 90.0, 30.0, 90.0, 120.0);
130 1 : AliMatrix(idrotm[2030], 0.0, 0.0, 90.0, 10.0, 90.0, 280.0);
131 1 : AliMatrix(idrotm[2031], 0.0, 0.0, 90.0, 170.0, 90.0, 260.0);
132 1 : AliMatrix(idrotm[2032], 0.0, 0.0, 90.0, 190.0, 90.0, 100.0);
133 1 : AliMatrix(idrotm[2033], 0.0, 0.0, 90.0, 350.0, 90.0, 80.0);
134 :
135 :
136 1 : Int_t *idtmed = fIdtmed->GetArray()-1999;
137 : //
138 : // The Space frame
139 : //
140 : //
141 1 : Float_t pbox[3], ptrap[11], ptrd1[4], ppgon[10];
142 :
143 : Float_t dx, dy, dz;
144 : Int_t i, j, jmod;
145 : jmod = 0;
146 : //
147 : // Constants
148 : const Float_t kEps = 0.01;
149 1 : const Int_t kAir = idtmed[2004];
150 1 : const Int_t kSteel = idtmed[2064];
151 :
152 1 : const Float_t krad2deg = 180. / TMath::Pi();
153 1 : const Float_t kdeg2rad = 1. / krad2deg;
154 :
155 : Float_t iFrH = 118.66; // Height of inner frame
156 : Float_t ringH = 6.00; // Height of the ring bars
157 : Float_t ringW = 10.00; // Width of the ring bars in z
158 : Float_t longH = 6.00;
159 : Float_t longW = 4.00;
160 : //
161 1 : Float_t dymodU[3] = {70.0, 224.0, 340.2};
162 1 : Float_t dymodL[3] = {50.0, 175.0, 297.5};
163 : //
164 :
165 : //
166 : // Frame mother volume
167 : //
168 1 : TGeoPgon* shB77A = new TGeoPgon(0., 360., 18, 2);
169 1 : shB77A->SetName("shB77A");
170 1 : shB77A->DefineSection( 0, -376.5, 280., 415.7);
171 1 : shB77A->DefineSection( 1, 376.5, 280., 415.7);
172 1 : TGeoBBox* shB77B = new TGeoBBox(3.42, 2., 375.5);
173 1 : shB77B->SetName("shB77B");
174 1 : TGeoTranslation* trB77A = new TGeoTranslation("trB77A", +283.32, 0., 0.);
175 1 : TGeoTranslation* trB77B = new TGeoTranslation("trB77B", -283.32, 0., 0.);
176 1 : trB77A->RegisterYourself();
177 1 : trB77B->RegisterYourself();
178 1 : TGeoCompositeShape* shB77 = new TGeoCompositeShape("shB77", "shB77A+shB77B:trB77A+shB77B:trB77B");
179 2 : TGeoVolume* voB77 = new TGeoVolume("B077", shB77, gGeoManager->GetMedium("FRAME_Air"));
180 1 : voB77->SetName("B077"); // just to avoid a warning
181 1 : TVirtualMC::GetMC()->Gspos("B077", 1, "ALIC", 0., 0., 0., 0, "ONLY");
182 : //
183 : // Reference plane #1 for TRD
184 1 : TGeoPgon* shBREFA = new TGeoPgon(0.0, 360., 18, 2);
185 1 : shBREFA->DefineSection( 0, -376., 280., 280.1);
186 1 : shBREFA->DefineSection( 1, 376., 280., 280.1);
187 1 : shBREFA->SetName("shBREFA");
188 1 : TGeoCompositeShape* shBREF1 = new TGeoCompositeShape("shBREF1", "shBREFA-(shB77B:trB77A+shB77B:trB77B)");
189 2 : TGeoVolume* voBREF = new TGeoVolume("BREF1", shBREF1, gGeoManager->GetMedium("FRAME_Air"));
190 1 : voBREF->SetVisibility(0);
191 1 : TVirtualMC::GetMC()->Gspos("BREF1", 1, "B077", 0., 0., 0., 0, "ONLY");
192 : //
193 : // The outer Frame
194 : //
195 :
196 : Float_t dol = 4.;
197 : Float_t doh = 4.;
198 : Float_t ds = 0.63;
199 : //
200 : // Mother volume
201 : //
202 1 : ppgon[0] = 0.;
203 1 : ppgon[1] = 360.;
204 1 : ppgon[2] = 18.;
205 :
206 1 : ppgon[3] = 2.;
207 :
208 1 : ppgon[4] = -350.;
209 1 : ppgon[5] = 401.35;
210 1 : ppgon[6] = 415.6;
211 :
212 1 : ppgon[7] = -ppgon[4];
213 1 : ppgon[8] = ppgon[5];
214 1 : ppgon[9] = ppgon[6];
215 1 : TVirtualMC::GetMC()->Gsvolu("B076", "PGON", kAir, ppgon, 10);
216 1 : TVirtualMC::GetMC()->Gspos("B076", 1, "B077", 0., 0., 0., 0, "ONLY");
217 : //
218 : // Rings
219 : //
220 1 : dz = 2. * 410.2 * TMath::Sin(10.*kdeg2rad) - 2. *dol * TMath::Cos(10.*kdeg2rad)- 2. * doh * TMath::Tan(10.*kdeg2rad);
221 1 : Float_t l1 = dz/2.;
222 1 : Float_t l2 = dz/2.+2.*doh*TMath::Tan(10.*kdeg2rad);
223 :
224 :
225 1 : TGeoVolumeAssembly* asBI42 = new TGeoVolumeAssembly("BI42");
226 : // Horizontal
227 1 : ptrd1[0] = l2 - 0.6 * TMath::Tan(10.*kdeg2rad);
228 1 : ptrd1[1] = l2;
229 1 : ptrd1[2] = 8.0 / 2.;
230 1 : ptrd1[3] = 0.6 / 2.;
231 1 : TVirtualMC::GetMC()->Gsvolu("BIH142", "TRD1", kSteel, ptrd1, 4);
232 1 : ptrd1[0] = l1;
233 1 : ptrd1[1] = l1 + 0.6 * TMath::Tan(10.*kdeg2rad);
234 1 : ptrd1[2] = 8.0 / 2.;
235 1 : ptrd1[3] = 0.6 / 2.;
236 1 : TVirtualMC::GetMC()->Gsvolu("BIH242", "TRD1", kSteel, ptrd1, 4);
237 :
238 : // Vertical
239 1 : ptrd1[0] = l1 + 0.6 * TMath::Tan(10.*kdeg2rad);
240 1 : ptrd1[1] = l2 - 0.6 * TMath::Tan(10.*kdeg2rad);
241 1 : ptrd1[2] = 0.8 / 2.;
242 1 : ptrd1[3] = 6.8 / 2.;
243 1 : TVirtualMC::GetMC()->Gsvolu("BIV42", "TRD1", kSteel, ptrd1, 4);
244 : // Place
245 2 : asBI42->AddNode(gGeoManager->GetVolume("BIV42"), 1, new TGeoTranslation(0., 0., 0.));
246 2 : asBI42->AddNode(gGeoManager->GetVolume("BIH142"), 1, new TGeoTranslation(0., 0., 3.7));
247 2 : asBI42->AddNode(gGeoManager->GetVolume("BIH242"), 1, new TGeoTranslation(0., 0., -3.7));
248 : //
249 : // longitudinal bars
250 : //
251 : // 80 x 80 x 6.3
252 : //
253 1 : pbox[0] = dol;
254 1 : pbox[1] = doh;
255 1 : pbox[2] = 345.;
256 1 : TVirtualMC::GetMC()->Gsvolu("B033", "BOX", kSteel, pbox, 3);
257 1 : pbox[0] = dol-ds;
258 1 : pbox[1] = doh-ds;
259 1 : TVirtualMC::GetMC()->Gsvolu("B034", "BOX", kAir, pbox, 3);
260 1 : TVirtualMC::GetMC()->Gspos("B034", 1, "B033", 0., 0., 0., 0, "ONLY");
261 :
262 :
263 : //
264 : // TPC support
265 : //
266 1 : pbox[0] = 3.37;
267 1 : pbox[1] = 2.0;
268 1 : pbox[2] = 375.5;
269 1 : TVirtualMC::GetMC()->Gsvolu("B080", "BOX", kSteel, pbox, 3);
270 1 : pbox[0] = 2.78;
271 1 : pbox[1] = 1.4;
272 1 : pbox[2] = 375.5;
273 1 : TVirtualMC::GetMC()->Gsvolu("B081", "BOX", kAir, pbox, 3);
274 1 : TVirtualMC::GetMC()->Gspos("B081", 1, "B080", 0., 0., 0., 0, "ONLY");
275 :
276 : // Small 2nd reference plane elemenet
277 1 : pbox[0] = 0.05;
278 1 : pbox[1] = 2.0;
279 1 : pbox[2] = 375.5;
280 1 : TVirtualMC::GetMC()->Gsvolu("BREF2", "BOX", kAir, pbox, 3);
281 1 : TVirtualMC::GetMC()->Gspos("BREF2", 1, "B080", 3.37 - 0.05, 0., 0., 0, "ONLY");
282 :
283 1 : TVirtualMC::GetMC()->Gspos("B080", 1, "B077", 283.3, 0., 0., 0, "ONLY");
284 1 : TVirtualMC::GetMC()->Gspos("B080", 2, "B077", -283.3, 0., 0., idrotm[2087], "ONLY");
285 :
286 :
287 : //
288 : // Diagonal bars (1)
289 : //
290 : Float_t h, d, dq, x, theta;
291 :
292 1 : h = (dymodU[1]-dymodU[0]-2.*dol)*.999;
293 : d = 2.*dol;
294 1 : dq = h*h+dz*dz;
295 :
296 1 : x = TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
297 :
298 :
299 1 : theta = krad2deg * TMath::ACos(x);
300 :
301 1 : ptrap[0] = dz/2.;
302 1 : ptrap[1] = theta;
303 1 : ptrap[2] = 0.;
304 1 : ptrap[3] = doh;
305 1 : ptrap[4] = dol/x;
306 1 : ptrap[5] = ptrap[4];
307 1 : ptrap[6] = 0;
308 1 : ptrap[7] = ptrap[3];
309 1 : ptrap[8] = ptrap[4];
310 1 : ptrap[9] = ptrap[4];
311 1 : ptrap[10] = 0;
312 :
313 1 : TVirtualMC::GetMC()->Gsvolu("B047", "TRAP", kSteel, ptrap, 11);
314 1 : ptrap[3] = doh-ds;
315 1 : ptrap[4] = (dol-ds)/x;
316 1 : ptrap[5] = ptrap[4];
317 1 : ptrap[7] = ptrap[3];
318 1 : ptrap[8] = ptrap[4];
319 1 : ptrap[9] = ptrap[4];
320 1 : TVirtualMC::GetMC()->Gsvolu("B048", "TRAP", kAir, ptrap, 11);
321 1 : TVirtualMC::GetMC()->Gspos("B048", 1, "B047", 0.0, 0.0, 0., 0, "ONLY");
322 :
323 : /*
324 : Crosses (inner most)
325 : \\ //
326 : \\//
327 : //\\
328 : // \\
329 : */
330 1 : h = (2.*dymodU[0]-2.*dol)*.999;
331 : //
332 : // Mother volume
333 : //
334 1 : pbox[0] = h/2;
335 1 : pbox[1] = doh;
336 1 : pbox[2] = dz/2.;
337 1 : TVirtualMC::GetMC()->Gsvolu("BM49", "BOX ", kAir, pbox, 3);
338 :
339 :
340 1 : dq = h*h+dz*dz;
341 1 : x = TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
342 1 : theta = krad2deg * TMath::ACos(x);
343 :
344 1 : ptrap[0] = dz/2.-kEps;
345 1 : ptrap[1] = theta;
346 1 : ptrap[2] = 0.;
347 1 : ptrap[3] = doh-kEps;
348 1 : ptrap[4] = dol/x;
349 1 : ptrap[5] = ptrap[4];
350 1 : ptrap[7] = ptrap[3];
351 1 : ptrap[8] = ptrap[4];
352 1 : ptrap[9] = ptrap[4];
353 :
354 1 : TVirtualMC::GetMC()->Gsvolu("B049", "TRAP", kSteel, ptrap, 11);
355 1 : ptrap[0] = ptrap[0]-kEps;
356 1 : ptrap[3] = (doh-ds);
357 1 : ptrap[4] = (dol-ds)/x;
358 1 : ptrap[5] = ptrap[4];
359 1 : ptrap[7] = ptrap[3];
360 1 : ptrap[8] = ptrap[4];
361 1 : ptrap[9] = ptrap[4];
362 1 : TVirtualMC::GetMC()->Gsvolu("B050", "TRAP", kAir, ptrap, 11);
363 1 : TVirtualMC::GetMC()->Gspos("B050", 1, "B049", 0.0, 0.0, 0., 0, "ONLY");
364 1 : TVirtualMC::GetMC()->Gspos("B049", 1, "BM49", 0.0, 0.0, 0., 0, "ONLY");
365 :
366 :
367 1 : Float_t dd1 = d*TMath::Tan(theta*kdeg2rad);
368 1 : Float_t dd2 = d/TMath::Tan(2.*theta*kdeg2rad);
369 1 : Float_t theta2 = TMath::ATan(TMath::Abs(dd2-dd1)/d/2.);
370 :
371 :
372 1 : ptrap[0] = dol;
373 1 : ptrap[1] = theta2*krad2deg;
374 1 : ptrap[2] = 0.;
375 1 : ptrap[3] = doh;
376 1 : ptrap[4] = (dz/2./x-dd1-dd2)/2.;
377 1 : ptrap[5] = ptrap[4];
378 1 : ptrap[6] = 0.;
379 1 : ptrap[7] = ptrap[3];
380 1 : ptrap[8] = dz/4./x;
381 1 : ptrap[9] = ptrap[8];
382 :
383 :
384 1 : TVirtualMC::GetMC()->Gsvolu("B051", "TRAP", kSteel, ptrap, 11);
385 1 : Float_t ddx0 = ptrap[8];
386 :
387 1 : Float_t dd1s = dd1*(1.-2.*ds/d);
388 1 : Float_t dd2s = dd2*(1.-2.*ds/d);
389 1 : Float_t theta2s = TMath::ATan(TMath::Abs(dd2s-dd1s)/(d-2.*ds)/2.);
390 :
391 :
392 1 : ptrap[0] = dol-ds;
393 1 : ptrap[1] = theta2s*krad2deg;
394 1 : ptrap[2] = 0.;
395 1 : ptrap[3] = doh-ds;
396 1 : ptrap[4] = ptrap[4]+ds/d/2.*(dd1+dd2);
397 1 : ptrap[5] = ptrap[4];
398 1 : ptrap[6] = 0.;
399 1 : ptrap[7] = ptrap[3];
400 1 : ptrap[8] = ptrap[8]-ds/2./d*(dd1+dd2);
401 1 : ptrap[9] = ptrap[8];
402 :
403 1 : TVirtualMC::GetMC()->Gsvolu("B052", "TRAP", kAir, ptrap, 11);
404 1 : TVirtualMC::GetMC()->Gspos("B052", 1, "B051", 0.0, 0.0, 0., 0, "ONLY");
405 :
406 : Float_t ddx, ddz, drx, drz, rtheta;
407 :
408 1 : AliMatrix(idrotm[2001], -theta+180, 0.0, 90.0, 90.0, 90.-theta, 0.0);
409 1 : rtheta = (90.-theta)*kdeg2rad;
410 1 : ddx = -ddx0-dol*TMath::Tan(theta2);
411 : ddz = -dol;
412 :
413 1 : drx = TMath::Cos(rtheta) * ddx +TMath::Sin(rtheta) *ddz+pbox[0];
414 1 : drz = -TMath::Sin(rtheta) * ddx +TMath::Cos(rtheta) *ddz-pbox[2];
415 2 : TVirtualMC::GetMC()->Gspos("B051", 1, "BM49",
416 1 : drx, 0.0, drz,
417 1 : idrotm[2001], "ONLY");
418 :
419 1 : AliMatrix(idrotm[2002], -theta, 0.0, 90.0, 90.0, 270.-theta, 0.0);
420 1 : rtheta = (270.-theta)*kdeg2rad;
421 :
422 1 : drx = TMath::Cos(rtheta) * ddx + TMath::Sin(rtheta) * ddz-pbox[0];
423 1 : drz = -TMath::Sin(rtheta) * ddx + TMath::Cos(rtheta) * ddz+pbox[2];
424 2 : TVirtualMC::GetMC()->Gspos("B051", 2, "BM49",
425 1 : drx, 0.0, drz,
426 1 : idrotm[2002], "ONLY");
427 :
428 : //
429 : // Diagonal bars (3)
430 : //
431 1 : h = ((dymodU[2]-dymodU[1])-2.*dol)*.999;
432 1 : dq = h*h+dz*dz;
433 1 : x = TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
434 1 : theta = krad2deg * TMath::ACos(x);
435 :
436 1 : ptrap[0] = dz/2.;
437 1 : ptrap[1] = theta;
438 1 : ptrap[3] = doh;
439 1 : ptrap[4] = dol/x;
440 1 : ptrap[5] = ptrap[4];
441 1 : ptrap[7] = ptrap[3];
442 1 : ptrap[8] = ptrap[4];
443 1 : ptrap[9] = ptrap[4];
444 :
445 1 : TVirtualMC::GetMC()->Gsvolu("B045", "TRAP", kSteel, ptrap, 11);
446 1 : ptrap[3] = doh-ds;
447 1 : ptrap[4] = (dol-ds)/x;
448 1 : ptrap[5] = ptrap[4];
449 1 : ptrap[7] = ptrap[3];
450 1 : ptrap[8] = ptrap[4];
451 1 : ptrap[9] = ptrap[4];
452 1 : TVirtualMC::GetMC()->Gsvolu("B046", "TRAP", kAir, ptrap, 11);
453 1 : TVirtualMC::GetMC()->Gspos("B046", 1, "B045", 0.0, 0.0, 0., 0, "ONLY");
454 :
455 : //
456 : // Positioning of diagonal bars
457 :
458 : Float_t rd = 405.5;
459 1 : dz = (dymodU[1]+dymodU[0])/2.;
460 1 : Float_t dz2 = (dymodU[1]+dymodU[2])/2.;
461 :
462 : //
463 : // phi = 40
464 : //
465 : Float_t phi = 40;
466 1 : dx = rd * TMath::Sin(phi*kdeg2rad);
467 1 : dy = rd * TMath::Cos(phi*kdeg2rad);
468 :
469 :
470 1 : TVirtualMC::GetMC()->Gspos("B045", 1, "B076", -dx, dy, dz2, idrotm[2019], "ONLY");
471 1 : TVirtualMC::GetMC()->Gspos("B045", 2, "B076", -dx, dy, -dz2, idrotm[2003], "ONLY"); // ?
472 1 : TVirtualMC::GetMC()->Gspos("B045", 3, "B076", dx, dy, dz2, idrotm[2020], "ONLY");
473 1 : TVirtualMC::GetMC()->Gspos("B045", 4, "B076", dx, dy, -dz2, idrotm[2027], "ONLY");
474 :
475 :
476 : //
477 : // phi = 60
478 : //
479 :
480 : phi = 60;
481 1 : dx = rd * TMath::Sin(phi*kdeg2rad);
482 1 : dy = rd * TMath::Cos(phi*kdeg2rad);
483 :
484 1 : TVirtualMC::GetMC()->Gspos("B045", 5, "B076", -dx, dy, dz2, idrotm[2021], "ONLY");
485 1 : TVirtualMC::GetMC()->Gspos("B045", 6, "B076", -dx, dy, -dz2, idrotm[2028], "ONLY");
486 1 : TVirtualMC::GetMC()->Gspos("B045", 7, "B076", dx, dy, dz2, idrotm[2022], "ONLY");
487 1 : TVirtualMC::GetMC()->Gspos("B045", 8, "B076", dx, dy, -dz2, idrotm[2029], "ONLY");
488 :
489 : //
490 : // phi = 80
491 : //
492 :
493 : phi = 80;
494 1 : dx = rd * TMath::Sin(phi*kdeg2rad);
495 1 : dy = rd * TMath::Cos(phi*kdeg2rad);
496 :
497 1 : TVirtualMC::GetMC()->Gspos("B047", 13, "B076", -dx, -dy, dz, idrotm[2008], "ONLY");
498 1 : TVirtualMC::GetMC()->Gspos("B047", 14, "B076", -dx, -dy, -dz, idrotm[2010], "ONLY");
499 1 : TVirtualMC::GetMC()->Gspos("B047", 15, "B076", dx, -dy, dz, idrotm[2012], "ONLY");
500 1 : TVirtualMC::GetMC()->Gspos("B047", 16, "B076", dx, -dy, -dz, idrotm[2011], "ONLY");
501 :
502 1 : TVirtualMC::GetMC()->Gspos("B045", 9, "B076", -dx, dy, dz2, idrotm[2023], "ONLY");
503 1 : TVirtualMC::GetMC()->Gspos("B045", 10, "B076", -dx, dy, -dz2, idrotm[2031], "ONLY");
504 1 : TVirtualMC::GetMC()->Gspos("B045", 11, "B076", dx, dy, dz2, idrotm[2026], "ONLY");
505 1 : TVirtualMC::GetMC()->Gspos("B045", 12, "B076", dx, dy, -dz2, idrotm[2030], "ONLY");
506 :
507 1 : TVirtualMC::GetMC()->Gspos("B045", 13, "B076", -dx, -dy, dz2, idrotm[2024], "ONLY");
508 1 : TVirtualMC::GetMC()->Gspos("B045", 14, "B076", -dx, -dy, -dz2, idrotm[2032], "ONLY");
509 1 : TVirtualMC::GetMC()->Gspos("B045", 15, "B076", dx, -dy, dz2, idrotm[2025], "ONLY");
510 1 : TVirtualMC::GetMC()->Gspos("B045", 16, "B076", dx, -dy, -dz2, idrotm[2033], "ONLY");
511 :
512 1 : TVirtualMC::GetMC()->Gspos("BM49", 7, "B076", dx, -dy, 0., idrotm[2025], "ONLY");
513 1 : TVirtualMC::GetMC()->Gspos("BM49", 8, "B076", -dx, -dy, 0., idrotm[2024], "ONLY");
514 :
515 : //
516 : // The internal frame
517 : //
518 : //
519 : //
520 : // Mother Volumes
521 : //
522 :
523 1 : ptrd1[0] = 49.8;
524 1 : ptrd1[1] = 70.7;
525 1 : ptrd1[2] = 376.5;
526 1 : ptrd1[3] = iFrH / 2.;
527 :
528 : Float_t r = 342.0;
529 : Float_t rout1 = 405.5;
530 : Float_t rout2 = 411.55;
531 37 : TString module[18];
532 :
533 38 : for (i = 0; i < 18; i++) {
534 :
535 : // Create volume i
536 18 : char name[16];
537 18 : Int_t mod = i + 13;
538 31 : if (mod > 17) mod -= 18;
539 18 : snprintf(name, 16, "BSEGMO%d", mod);
540 36 : TVirtualMC::GetMC()->Gsvolu(name, "TRD1", kAir, ptrd1, 4);
541 36 : gGeoManager->GetVolume(name)->SetVisibility(kFALSE);
542 :
543 18 : module[i] = name;
544 : // Place volume i
545 18 : Float_t phi1 = i * 20.;
546 18 : Float_t phi2 = 270 + phi1;
547 31 : if (phi2 >= 360.) phi2 -= 360.;
548 :
549 18 : dx = TMath::Sin(phi1*kdeg2rad)*r;
550 18 : dy = -TMath::Cos(phi1*kdeg2rad)*r;
551 :
552 18 : char nameR[16];
553 18 : snprintf(nameR, 16, "B43_Rot_%d", i);
554 36 : TGeoRotation* rot = new TGeoRotation(nameR, 90.0, phi1, 0., 0., 90., phi2);
555 18 : AliMatrix(idrotm[2034+i], 90.0, phi1, 0., 0., 90., phi2);
556 18 : TGeoVolume* vol77 = gGeoManager->GetVolume("B077");
557 18 : TGeoVolume* volS = gGeoManager->GetVolume(name);
558 54 : vol77->AddNode(volS, 1, new TGeoCombiTrans(dx, dy, 0., rot));
559 :
560 : //
561 : // Position elements of outer Frame
562 : //
563 18 : dx = TMath::Sin(phi1*kdeg2rad)*rout1;
564 18 : dy = -TMath::Cos(phi1*kdeg2rad)*rout1;
565 144 : for (j = 0; j < 3; j++)
566 : {
567 54 : dz = dymodU[j];
568 54 : TGeoVolume* vol = gGeoManager->GetVolume("B076");
569 162 : vol->AddNode(asBI42, 6*i+2*j+1, new TGeoCombiTrans(dx, dy, dz, rot));
570 162 : vol->AddNode(asBI42, 6*i+2*j+2, new TGeoCombiTrans(dx, dy, -dz, rot));
571 : }
572 :
573 18 : phi1 = i*20.+10;
574 18 : phi2 = 270+phi1;
575 18 : AliMatrix(idrotm[2052+i], 90.0, phi1, 90., phi2, 0., 0.);
576 :
577 18 : dx = TMath::Sin(phi1*kdeg2rad)*rout2;
578 18 : dy = -TMath::Cos(phi1*kdeg2rad)*rout2;
579 36 : TVirtualMC::GetMC()->Gspos("B033", i+1, "B076", dx, dy, 0., idrotm[2052+i], "ONLY");
580 : //
581 18 : }
582 : // Internal Frame rings
583 : //
584 : //
585 : // 60x60x5x6 for inner rings (I-beam)
586 : // 100x60x5 for front and rear rings
587 : //
588 : // Front and rear
589 1 : ptrd1[0] = 287. * TMath::Sin(10.* kdeg2rad) - 2.1;
590 1 : ptrd1[1] = 293. * TMath::Sin(10.* kdeg2rad) - 2.1;
591 1 : ptrd1[2] = ringW/2.;
592 1 : ptrd1[3] = ringH/2.;
593 :
594 2 : TVirtualMC::GetMC()->Gsvolu("B072", "TRD1", kSteel, ptrd1, 4);
595 :
596 1 : ptrd1[0] = 287.5 * TMath::Sin(10. * kdeg2rad) - 2.1;
597 1 : ptrd1[1] = 292.5 * TMath::Sin(10. * kdeg2rad) - 2.1;
598 1 : ptrd1[2] = ringW / 2. - 0.5;
599 1 : ptrd1[3] = ringH / 2. - 0.5;
600 :
601 2 : TVirtualMC::GetMC()->Gsvolu("B073", "TRD1", kAir, ptrd1, 4);
602 2 : TVirtualMC::GetMC()->Gspos("B073", 1, "B072", 0., 0., 0., 0, "ONLY");
603 : //
604 : // I-Beam
605 : // Mother volume
606 2 : TGeoVolumeAssembly* asBI72 = new TGeoVolumeAssembly("BI72");
607 : // Horizontal
608 1 : ptrd1[0] = 292.5 * TMath::Sin(10.* kdeg2rad) - 2.1;
609 1 : ptrd1[1] = 293.0 * TMath::Sin(10.* kdeg2rad) - 2.1;
610 1 : ptrd1[2] = 6./2.;
611 1 : ptrd1[3] = 0.5/2.;
612 2 : TVirtualMC::GetMC()->Gsvolu("BIH172", "TRD1", kSteel, ptrd1, 4);
613 1 : ptrd1[0] = 287.0 * TMath::Sin(10.* kdeg2rad) - 2.1;
614 1 : ptrd1[1] = 287.5 * TMath::Sin(10.* kdeg2rad) - 2.1;
615 1 : ptrd1[2] = 6./2.;
616 1 : ptrd1[3] = 0.5/2.;
617 2 : TVirtualMC::GetMC()->Gsvolu("BIH272", "TRD1", kSteel, ptrd1, 4);
618 :
619 : // Vertical
620 1 : ptrd1[0] = 287.5 * TMath::Sin(10.* kdeg2rad) - 2.1;
621 1 : ptrd1[1] = 292.5 * TMath::Sin(10.* kdeg2rad) - 2.1;
622 1 : ptrd1[2] = 0.6/2.;
623 1 : ptrd1[3] = 5./2.;
624 2 : TVirtualMC::GetMC()->Gsvolu("BIV72", "TRD1", kSteel, ptrd1, 4);
625 : // Place
626 4 : asBI72->AddNode(gGeoManager->GetVolume("BIV72"), 1, new TGeoTranslation(0., 0., 0.));
627 4 : asBI72->AddNode(gGeoManager->GetVolume("BIH172"), 1, new TGeoTranslation(0., 0., 2.75));
628 4 : asBI72->AddNode(gGeoManager->GetVolume("BIH272"), 1, new TGeoTranslation(0., 0., -2.75));
629 :
630 : // Web frame 0-degree
631 : //
632 : // h x w x s = 60x40x5
633 : // (attention: element is are half bars, "U" shaped)
634 : //
635 : Float_t dHz = 112.66;
636 :
637 1 : WebFrame("B063", dHz, 10.0, 10.);
638 1 : WebFrame("B063I", dHz, 10.0, -10.);
639 :
640 1 : WebFrame("B163", dHz, -40.0, 10.);
641 1 : WebFrame("B163I", dHz, -40.0, -10.);
642 :
643 1 : WebFrame("B263", dHz, 20.0, 10.);
644 1 : WebFrame("B263I", dHz, 20.0, -10.);
645 :
646 1 : WebFrame("B363", dHz, -27.1, 10.);
647 1 : WebFrame("B363I", dHz, -27.1, -10.);
648 :
649 1 : WebFrame("B463", dHz, 18.4, 10.);
650 1 : WebFrame("B463I", dHz, 18.4, -10.);
651 :
652 :
653 1 : dz = -iFrH/2.+ringH/2.+kEps;
654 : Float_t dz0 = 3.;
655 1 : Float_t dx0 = 49.8 + dHz/2. * TMath::Tan(10. * kdeg2rad) + 0.035;
656 :
657 38 : for (jmod = 0; jmod< 18; jmod++)
658 : {
659 : // ring bars
660 144 : for (i = 0; i < 3; i++) {
661 : // if ((i == 2) || (jmod ==0) || (jmod == 8)) {
662 54 : if (i == 2) {
663 54 : TVirtualMC::GetMC()->Gspos("B072", 6*jmod+i+1, module[jmod], 0, dymodL[i], dz, 0, "ONLY");
664 54 : TVirtualMC::GetMC()->Gspos("B072", 6*jmod+i+4, module[jmod], 0, -dymodL[i], dz, idrotm[2070], "ONLY");
665 : } else {
666 72 : TGeoVolume* vol = gGeoManager->GetVolume(module[jmod]);
667 108 : vol->AddNode(asBI72, 6*jmod+i+1, new TGeoTranslation(0, dymodL[i], dz));
668 108 : vol->AddNode(asBI72, 6*jmod+i+4, new TGeoTranslation(0, -dymodL[i], dz));
669 : }
670 : }
671 : }
672 :
673 : // outer diagonal web
674 :
675 1 : dy = dymodL[0] + (dHz/2. - 4.) * TMath::Tan(10. * kdeg2rad);
676 :
677 38 : for (jmod = 0; jmod < 18; jmod++) {
678 54 : TVirtualMC::GetMC()->Gspos("B063", 4*jmod+1, module[jmod], dx0, dy, dz0, idrotm[2086], "ONLY");
679 54 : TVirtualMC::GetMC()->Gspos("B063I", 4*jmod+2, module[jmod], dx0, -dy, dz0, idrotm[2087], "ONLY");
680 54 : TVirtualMC::GetMC()->Gspos("B063", 4*jmod+3, module[jmod], -dx0, -dy, dz0, idrotm[2087], "ONLY");
681 54 : TVirtualMC::GetMC()->Gspos("B063I", 4*jmod+4, module[jmod], -dx0, dy, dz0, idrotm[2086], "ONLY");
682 : }
683 :
684 1 : dy = 73.6 + (dHz/2. + 4.) * TMath::Tan(40. * kdeg2rad);
685 :
686 38 : for (jmod = 0; jmod < 18; jmod++) {
687 54 : TVirtualMC::GetMC()->Gspos("B163", 4*jmod+1, module[jmod], dx0, dy, dz0, idrotm[2086], "ONLY");
688 54 : TVirtualMC::GetMC()->Gspos("B163I", 4*jmod+2, module[jmod], dx0, -dy, dz0, idrotm[2087], "ONLY");
689 54 : TVirtualMC::GetMC()->Gspos("B163", 4*jmod+3, module[jmod], -dx0, -dy, dz0, idrotm[2087], "ONLY");
690 54 : TVirtualMC::GetMC()->Gspos("B163I", 4*jmod+4, module[jmod], -dx0, dy, dz0, idrotm[2086], "ONLY");
691 : }
692 :
693 1 : dy = 224.5 - (dHz/2 + 4.) * TMath::Tan(20. * kdeg2rad);
694 :
695 38 : for (jmod = 0; jmod < 18; jmod++) {
696 54 : TVirtualMC::GetMC()->Gspos("B263", 4*jmod+1, module[jmod], dx0, dy, dz0, idrotm[2086], "ONLY");
697 54 : TVirtualMC::GetMC()->Gspos("B263I", 4*jmod+2, module[jmod], dx0, -dy, dz0, idrotm[2087], "ONLY");
698 54 : TVirtualMC::GetMC()->Gspos("B263", 4*jmod+3, module[jmod], -dx0, -dy, dz0, idrotm[2087], "ONLY");
699 54 : TVirtualMC::GetMC()->Gspos("B263I", 4*jmod+4, module[jmod], -dx0, dy, dz0, idrotm[2086], "ONLY");
700 : }
701 :
702 1 : dy = 231.4 + (dHz/2.+ 4.) * TMath::Tan(27.1 * kdeg2rad);
703 :
704 38 : for (jmod = 0; jmod < 18; jmod++) {
705 54 : TVirtualMC::GetMC()->Gspos("B363", 4*jmod+1, module[jmod], dx0, dy, dz0, idrotm[2086], "ONLY");
706 54 : TVirtualMC::GetMC()->Gspos("B363I", 4*jmod+2, module[jmod], dx0, -dy, dz0, idrotm[2087], "ONLY");
707 54 : TVirtualMC::GetMC()->Gspos("B363", 4*jmod+3, module[jmod], -dx0, -dy, dz0, idrotm[2087], "ONLY");
708 54 : TVirtualMC::GetMC()->Gspos("B363I", 4*jmod+4, module[jmod], -dx0, dy, dz0, idrotm[2086], "ONLY");
709 : }
710 :
711 1 : dy = 340.2 - (dHz/2.+ 4.) * TMath::Tan(18.4 * kdeg2rad);
712 :
713 38 : for (jmod = 0; jmod < 18; jmod++) {
714 54 : TVirtualMC::GetMC()->Gspos("B463", 4*jmod+1, module[jmod], dx0, dy, dz0, idrotm[2086], "ONLY");
715 54 : TVirtualMC::GetMC()->Gspos("B463I", 4*jmod+2, module[jmod], dx0, -dy, dz0, idrotm[2087], "ONLY");
716 54 : TVirtualMC::GetMC()->Gspos("B463", 4*jmod+3, module[jmod], -dx0, -dy, dz0, idrotm[2087], "ONLY");
717 54 : TVirtualMC::GetMC()->Gspos("B463I", 4*jmod+4, module[jmod], -dx0, dy, dz0, idrotm[2086], "ONLY");
718 : }
719 :
720 : // longitudinal bars (TPC rails attached)
721 : // new specs:
722 : // h x w x s = 100 x 75 x 6
723 : // current:
724 : // Attention: 2 "U" shaped half rods per cell
725 : //
726 : // not yet used
727 : //
728 1 : ptrap[0] = 2.50;
729 1 : ptrap[1] = 10.00;
730 1 : ptrap[2] = 0.00;
731 1 : ptrap[3] = 350.00;
732 1 : ptrap[4] = 3.75;
733 1 : ptrap[5] = ptrap[4];
734 1 : ptrap[6] = 0;
735 1 : ptrap[7] = ptrap[3];
736 1 : ptrap[8] = ptrap[4];
737 1 : ptrap[9] = ptrap[4];
738 1 : ptrap[10] = 0;
739 : // TVirtualMC::GetMC()->Gsvolu("B059", "TRAP", kSteel, ptrap, 11);
740 1 : ptrap[0] = 2.2;
741 1 : ptrap[4] = 2.15;
742 1 : ptrap[5] = ptrap[4];
743 1 : ptrap[7] = ptrap[3];
744 1 : ptrap[8] = ptrap[4];
745 1 : ptrap[9] = ptrap[4];
746 : //TVirtualMC::GetMC()->Gsvolu("B062", "TRAP", kAir, ptrap, 11);
747 : //TVirtualMC::GetMC()->Gspos("B062", 1, "B059", 0.0, 0., 0., 0, "ONLY");
748 :
749 : //
750 : // longitudinal bars (no TPC rails attached)
751 : // new specs: h x w x s = 40 x 60 x 5
752 : //
753 : //
754 : //
755 1 : ptrap[0] = longW/4.;
756 1 : ptrap[4] = longH/2.;
757 1 : ptrap[5] = ptrap[4];
758 1 : ptrap[7] = ptrap[3];
759 1 : ptrap[8] = ptrap[4];
760 1 : ptrap[9] = ptrap[4];
761 :
762 2 : TVirtualMC::GetMC()->Gsvolu("BA59", "TRAP", kSteel, ptrap, 11);
763 1 : ptrap[0] = longW/4.-0.25;
764 1 : ptrap[4] = longH/2.-0.50;
765 1 : ptrap[5] = ptrap[4];
766 1 : ptrap[7] = ptrap[3];
767 1 : ptrap[8] = ptrap[4];
768 1 : ptrap[9] = ptrap[4];
769 2 : TVirtualMC::GetMC()->Gsvolu("BA62", "TRAP", kAir, ptrap, 11);
770 2 : TVirtualMC::GetMC()->Gspos("BA62", 1, "BA59", 0.0, 0.0, -0.15, 0, "ONLY");
771 :
772 1 : dz = -iFrH/2. + longH/2.;
773 :
774 38 : for (jmod = 0; jmod < 18; jmod++) {
775 54 : TVirtualMC::GetMC()->Gspos("BA59", 2*jmod+1, module[jmod], 49.31, 0.0, dz, idrotm[2084], "ONLY");
776 54 : TVirtualMC::GetMC()->Gspos("BA59", 2*jmod+2, module[jmod], -49.31, 0.0, dz, idrotm[2083], "ONLY");
777 : }
778 :
779 :
780 : //
781 : // Thermal shield
782 : //
783 :
784 : Float_t dyM = 99.0;
785 1 : MakeHeatScreen("M", dyM, idrotm[2090], idrotm[2091]);
786 : Float_t dyAM = 119.5;
787 1 : MakeHeatScreen("AM", dyAM, idrotm[2090], idrotm[2091]);
788 : Float_t dyA = 122.5 - 5.5;
789 1 : MakeHeatScreen("A" , dyA, idrotm[2090], idrotm[2091]);
790 :
791 : //
792 : //
793 : //
794 : dz = -57.2 + 0.6;
795 38 : for (i = 0; i < 18; i++) {
796 :
797 18 : char nameMo[16];
798 18 : snprintf(nameMo, 16, "BSEGMO%d",i);
799 : // M
800 36 : TVirtualMC::GetMC()->Gspos("BTSH_M" , i+1 , nameMo, 0., 0., dz, 0, "ONLY");
801 : // AM, CM
802 18 : dy = dymodL[0] + dyAM / 2. + 3.;
803 36 : TVirtualMC::GetMC()->Gspos("BTSH_AM", i+ 1, nameMo, 0., dy, dz, 0, "ONLY");
804 36 : TVirtualMC::GetMC()->Gspos("BTSH_AM", i+19, nameMo, 0., -dy, dz, 0, "ONLY");
805 : // A, C
806 18 : dy = dymodL[1] + dyA / 2 + 0.4;
807 36 : TVirtualMC::GetMC()->Gspos("BTSH_A" , i+ 1, nameMo, 0., dy, dz, 0, "ONLY");
808 36 : TVirtualMC::GetMC()->Gspos("BTSH_A" , i+19, nameMo, 0., -dy, dz, 0, "ONLY");
809 18 : }
810 :
811 :
812 : //
813 : // TRD mother volumes
814 : //
815 :
816 1 : ptrd1[0] = 47.4405; // CBL 28/6/2006
817 1 : ptrd1[1] = 61.1765; // CBL
818 1 : ptrd1[2] = 375.5; // CBL
819 1 : ptrd1[3] = 38.95; // CBL
820 :
821 38 : for (i = 0; i < 18; i++) {
822 18 : char nameCh[16];
823 18 : snprintf(nameCh, 16, "BTRD%d",i);
824 18 : char nameMo[16];
825 18 : snprintf(nameMo, 16, "BSEGMO%d",i);
826 36 : TVirtualMC::GetMC()->Gsvolu(nameCh, "TRD1", kAir, ptrd1, 4);
827 36 : gGeoManager->GetVolume(nameCh)->SetVisibility(kFALSE);
828 36 : TVirtualMC::GetMC()->Gspos(nameCh, 1, nameMo, 0., 0., -12.62, 0, "ONLY"); // CBL 28/6/2006
829 18 : }
830 :
831 : //
832 : // TOF mother volumes as modified by B.Guerzoni
833 : // to remove overlaps/extrusions in case of aligned TOF SMs
834 : //
835 1 : ptrd1[0] = 62.2500;
836 1 : ptrd1[1] = 64.25;
837 1 : ptrd1[2] = 372.6;
838 1 : ptrd1[3] = 14.525/2;
839 1 : char nameChA[16];
840 1 : snprintf(nameChA, 16, "BTOFA");
841 2 : TGeoTrd1 *trd1=new TGeoTrd1(nameChA,ptrd1[0],ptrd1[1],ptrd1[2],ptrd1[3]);
842 1 : trd1->SetName("BTOFA"); // just to avoid a warning
843 1 : char nameChB[16];
844 1 : snprintf(nameChB, 16, "BTOFB");
845 2 : TGeoBBox *box1 = new TGeoBBox(nameChB,64.25 ,372.6, 14.525/2);
846 1 : box1->SetName("BTOFB"); // just to avoid a warning
847 2 : TGeoTranslation *tr1 = new TGeoTranslation("trnsl1",0, 0, -14.525/2 );
848 1 : tr1->RegisterYourself();
849 2 : TGeoTranslation *tr2 = new TGeoTranslation("trnsl2",0, 0, +14.525/2 );
850 1 : tr2->RegisterYourself();
851 2 : TGeoCompositeShape *btofcs =new TGeoCompositeShape("Btofcs","(BTOFA:trnsl1)+(BTOFB:trnsl2)");
852 :
853 :
854 38 : for (i = 0; i < 18; i++) {
855 18 : char nameCh[16];
856 18 : snprintf(nameCh, 16, "BTOF%d",i);
857 18 : char nameMo[16];
858 18 : snprintf(nameMo, 16, "BSEGMO%d",i);
859 54 : TGeoVolume* btf = new TGeoVolume(nameCh, btofcs, gGeoManager->GetMedium("FRAME_Air"));
860 18 : btf->SetName(nameCh);
861 36 : gGeoManager->GetVolume(nameCh)->SetVisibility(kFALSE);
862 36 : TVirtualMC::GetMC()->Gspos(nameCh, 1, nameMo, 0., 0., 43.525, 0, "ONLY");
863 18 : }
864 : //
865 : // Geometry of Rails starts here
866 : //
867 : //
868 : //
869 : // Rails for space-frame
870 : //
871 1 : Float_t rbox[3];
872 :
873 1 : rbox[0] = 25.00;
874 1 : rbox[1] = 27.50;
875 1 : rbox[2] = 600.00;
876 2 : TVirtualMC::GetMC()->Gsvolu("BRS1", "BOX", kAir, rbox, 3);
877 :
878 1 : rbox[0] = 25.00;
879 1 : rbox[1] = 3.75;
880 2 : TVirtualMC::GetMC()->Gsvolu("BRS2", "BOX", kSteel, rbox, 3);
881 :
882 1 : rbox[0] = 3.00;
883 1 : rbox[1] = 20.00;
884 2 : TVirtualMC::GetMC()->Gsvolu("BRS3", "BOX", kSteel, rbox, 3);
885 :
886 2 : TVirtualMC::GetMC()->Gspos("BRS2", 1, "BRS1", 0., -27.5+3.75, 0., 0, "ONLY");
887 2 : TVirtualMC::GetMC()->Gspos("BRS2", 2, "BRS1", 0., 27.5-3.75, 0., 0, "ONLY");
888 2 : TVirtualMC::GetMC()->Gspos("BRS3", 1, "BRS1", 0., 0., 0., 0, "ONLY");
889 2 : TVirtualMC::GetMC()->Gspos("BRS1", 1, "ALIC", -430.-3., -190., 0., 0, "ONLY");
890 2 : TVirtualMC::GetMC()->Gspos("BRS1", 2, "ALIC", 430.+3., -190., 0., 0, "ONLY");
891 :
892 1 : rbox[0] = 3.0;
893 1 : rbox[1] = 145./4.;
894 1 : rbox[2] = 25.0;
895 2 : TVirtualMC::GetMC()->Gsvolu("BRS4", "BOX", kSteel, rbox, 3);
896 :
897 2 : TVirtualMC::GetMC()->Gspos("BRS4", 1, "ALIC", 430.+3., -190.+55./2.+rbox[1], 224., 0, "ONLY");
898 2 : TVirtualMC::GetMC()->Gspos("BRS4", 2, "ALIC", 430.+3., -190.+55./2.+rbox[1], -224., 0, "ONLY");
899 : // TVirtualMC::GetMC()->Gspos("BRS4", 3, "ALIC", -430.+3, -180.+55./2.+rbox[1], 224., 0, "ONLY");
900 : // TVirtualMC::GetMC()->Gspos("BRS4", 4, "ALIC", -430.+3, -180.+55./2.+rbox[1], -224., 0, "ONLY");
901 :
902 :
903 :
904 : //
905 : // The Backframe
906 : //
907 : // Inner radius
908 : Float_t kBFMRin = 270.0;
909 : // Outer Radius
910 : Float_t kBFMRou = 417.5;
911 : // Width
912 : Float_t kBFMdz = 118.0;
913 : //
914 : //
915 : // Rings
916 : Float_t kBFRdr = 7.5;
917 : Float_t kBFRdz = 8.0;
918 : //
919 : //
920 : // Bars and Spokes
921 : //
922 : Float_t kBFBd = 8.0;
923 : Float_t kBFBdd = 0.6;
924 :
925 :
926 : // The Mother volume
927 1 : Float_t tpar[3];
928 1 : tpar[0] = kBFMRin;
929 1 : tpar[1] = kBFMRou;
930 1 : tpar[2] = kBFMdz / 2.;
931 2 : TVirtualMC::GetMC()->Gsvolu("BFMO", "TUBE", kAir, tpar, 3);
932 :
933 : // CBL ////////////////////////////////////////////////////////
934 : //
935 : // TRD mother volume
936 : //
937 :
938 1 : ptrd1[0] = 47.4405 - 0.3;
939 1 : ptrd1[1] = 61.1765 - 0.3;
940 1 : ptrd1[2] = kBFMdz / 2.;
941 1 : ptrd1[3] = 38.95;
942 2 : TVirtualMC::GetMC()->Gsvolu("BFTRD", "TRD1", kAir, ptrd1, 4);
943 2 : gGeoManager->GetVolume("BFTRD")->SetVisibility(kFALSE);
944 :
945 38 : for (i = 0; i < 18; i++) {
946 :
947 18 : Float_t phiBF = i * 20.0;
948 18 : dx = TMath::Sin(phiBF*kdeg2rad)*(342.0-12.62);
949 18 : dy = -TMath::Cos(phiBF*kdeg2rad)*(342.0-12.62);
950 36 : TVirtualMC::GetMC()->Gspos("BFTRD",i,"BFMO",dx,dy,0.0,idrotm[2034+i],"ONLY");
951 :
952 : }
953 :
954 : // CBL ////////////////////////////////////////////////////////
955 :
956 : // Rings
957 : //
958 : // Inner Ring
959 1 : tpar[0] = kBFMRin;
960 1 : tpar[1] = tpar[0] + kBFRdr;
961 1 : tpar[2] = kBFRdz / 2.;
962 :
963 2 : TVirtualMC::GetMC()->Gsvolu("BFIR", "TUBE", kSteel, tpar, 3);
964 :
965 1 : tpar[0] = tpar[0] + kBFBdd;
966 1 : tpar[1] = tpar[1] - kBFBdd;
967 1 : tpar[2] = (kBFRdz - 2. * kBFBdd) / 2.;
968 :
969 2 : TVirtualMC::GetMC()->Gsvolu("BFII", "TUBE", kAir, tpar, 3);
970 2 : TVirtualMC::GetMC()->Gspos("BFII", 1, "BFIR", 0., 0., 0., 0, "ONLY");
971 :
972 : //
973 : // Outer RING
974 1 : tpar[0] = kBFMRou - kBFRdr + 0.1;
975 1 : tpar[1] = kBFMRou;
976 1 : tpar[2] = kBFRdz / 2.;
977 :
978 2 : TVirtualMC::GetMC()->Gsvolu("BFOR", "TUBE", kSteel, tpar, 3);
979 :
980 1 : tpar[0] = tpar[0] + kBFBdd;
981 1 : tpar[1] = tpar[1] - kBFBdd;
982 1 : tpar[2] = (kBFRdz - 2. * kBFBdd) / 2.;
983 :
984 2 : TVirtualMC::GetMC()->Gsvolu("BFOO", "TUBE", kAir, tpar, 3);
985 2 : TVirtualMC::GetMC()->Gspos("BFOO", 1, "BFOR", 0., 0., 0., 0, "ONLY");
986 :
987 :
988 1 : dz = kBFMdz/2. - kBFRdz / 2.;
989 2 : TVirtualMC::GetMC()->Gspos("BFIR", 1, "BFMO", 0., 0., dz, 0, "ONLY");
990 2 : TVirtualMC::GetMC()->Gspos("BFIR", 2, "BFMO", 0., 0., -dz, 0, "ONLY");
991 2 : TVirtualMC::GetMC()->Gspos("BFOR", 1, "BFMO", 0., 0., dz, 0, "ONLY");
992 2 : TVirtualMC::GetMC()->Gspos("BFOR", 2, "BFMO", 0., 0., -dz, 0, "ONLY");
993 :
994 : //
995 : // Longitudinal Bars
996 : //
997 1 : Float_t bpar[3];
998 :
999 1 : bpar[0] = kBFBd/2;
1000 1 : bpar[1] = bpar[0];
1001 1 : bpar[2] = kBFMdz/2. - kBFBd;
1002 2 : TVirtualMC::GetMC()->Gsvolu("BFLB", "BOX ", kSteel, bpar, 3);
1003 :
1004 1 : bpar[0] = bpar[0] - kBFBdd;
1005 1 : bpar[1] = bpar[1] - kBFBdd;
1006 1 : bpar[2] = bpar[2] - kBFBdd;
1007 2 : TVirtualMC::GetMC()->Gsvolu("BFLL", "BOX ", kAir, bpar, 3);
1008 2 : TVirtualMC::GetMC()->Gspos("BFLL", 1, "BFLB", 0., 0., 0., 0, "ONLY");
1009 :
1010 38 : for (i = 0; i < 18; i++)
1011 : {
1012 18 : Float_t ro = kBFMRou - kBFBd / 2. - 0.02;
1013 18 : Float_t ri = kBFMRin + kBFBd / 2.;
1014 :
1015 18 : Float_t phi0 = Float_t(i) * 20.;
1016 :
1017 18 : Float_t xb = ri * TMath::Cos(phi0 * kDegrad);
1018 18 : Float_t yb = ri * TMath::Sin(phi0 * kDegrad);
1019 18 : AliMatrix(idrotm[2090+i], 90.0, phi0, 90.0, phi0 + 270., 0., 0.);
1020 :
1021 36 : TVirtualMC::GetMC()->Gspos("BFLB", i + 1, "BFMO", xb, yb, 0., idrotm[2090 + i], "ONLY");
1022 :
1023 18 : xb = ro * TMath::Cos(phi0 * kDegrad);
1024 18 : yb = ro * TMath::Sin(phi0 * kDegrad);
1025 :
1026 36 : TVirtualMC::GetMC()->Gspos("BFLB", i + 19, "BFMO", xb, yb, 0., idrotm[2090 +i], "ONLY");
1027 : }
1028 :
1029 : //
1030 : // Radial Bars
1031 : //
1032 1 : bpar[0] = (kBFMRou - kBFMRin - 2. * kBFRdr) / 2.;
1033 1 : bpar[1] = kBFBd/2;
1034 1 : bpar[2] = bpar[1];
1035 : //
1036 : // Avoid overlap with circle
1037 : Float_t rr = kBFMRou - kBFRdr;
1038 1 : Float_t delta = rr - TMath::Sqrt(rr * rr - kBFBd * kBFBd / 4.) + 0.01;
1039 1 : bpar[0] -= delta /2.;
1040 :
1041 :
1042 2 : TVirtualMC::GetMC()->Gsvolu("BFRB", "BOX ", kSteel, bpar, 3);
1043 :
1044 1 : bpar[0] = bpar[0] - kBFBdd;
1045 1 : bpar[1] = bpar[1] - kBFBdd;
1046 1 : bpar[2] = bpar[2] - kBFBdd;
1047 2 : TVirtualMC::GetMC()->Gsvolu("BFRR", "BOX ", kAir, bpar, 3);
1048 2 : TVirtualMC::GetMC()->Gspos("BFRR", 1, "BFRB", 0., 0., 0., 0, "ONLY");
1049 :
1050 1 : Int_t iphi[10] = {0, 1, 3, 6, 8, 9, 10, 12, 15, 17};
1051 :
1052 22 : for (i = 0; i < 10; i++)
1053 : {
1054 :
1055 10 : Float_t rb = (kBFMRin + kBFMRou)/2.;
1056 10 : Float_t phib = Float_t(iphi[i]) * 20.;
1057 :
1058 10 : Float_t xb = rb * TMath::Cos(phib * kDegrad);
1059 10 : Float_t yb = rb * TMath::Sin(phib * kDegrad);
1060 :
1061 20 : TVirtualMC::GetMC()->Gspos("BFRB", i + 1, "BFMO", xb, yb, dz, idrotm[2034 + iphi[i]], "ONLY");
1062 20 : TVirtualMC::GetMC()->Gspos("BFRB", i + 11, "BFMO", xb, yb, -dz, idrotm[2034 + iphi[i]], "ONLY");
1063 :
1064 : }
1065 :
1066 2 : TVirtualMC::GetMC()->Gspos("BFMO", i + 19, "ALIC", 0, 0, - 376. - kBFMdz/2. - 0.5 , 0, "ONLY");
1067 :
1068 :
1069 :
1070 : //
1071 : //
1072 : // The Baby Frame
1073 : //
1074 : //
1075 : //
1076 : // Inner radius
1077 : Float_t kBBMRin = 278.0;
1078 : // Outer Radius
1079 : Float_t kBBMRou = 410.5;
1080 : // Width
1081 : Float_t kBBMdz = 223.0;
1082 : Float_t kBBBdz = 6.0;
1083 : Float_t kBBBdd = 0.6;
1084 :
1085 :
1086 : // The Mother volume
1087 :
1088 1 : ppgon[0] = 0.;
1089 1 : ppgon[1] = 360.;
1090 1 : ppgon[2] = 18.;
1091 :
1092 1 : ppgon[3] = 2.;
1093 1 : ppgon[4] = -kBBMdz / 2. ;
1094 1 : ppgon[5] = kBBMRin;
1095 1 : ppgon[6] = kBBMRou;
1096 :
1097 1 : ppgon[7] = -ppgon[4];
1098 1 : ppgon[8] = ppgon[5];
1099 1 : ppgon[9] = ppgon[6];
1100 :
1101 2 : TVirtualMC::GetMC()->Gsvolu("BBMO", "PGON", kAir, ppgon, 10);
1102 2 : TVirtualMC::GetMC()->Gsdvn("BBCE", "BBMO", 18, 2);
1103 :
1104 : // CBL ////////////////////////////////////////////////////////
1105 : //
1106 : // TRD mother volume
1107 : //
1108 :
1109 1 : AliMatrix(idrotm[2092], 90.0, 90.0, 0.0, 0.0, 90.0, 0.0);
1110 :
1111 1 : ptrd1[0] = 47.4405 - 2.5;
1112 1 : ptrd1[1] = 61.1765 - 2.5;
1113 1 : ptrd1[2] = kBBMdz / 2.;
1114 1 : ptrd1[3] = 38.95;
1115 2 : TVirtualMC::GetMC()->Gsvolu("BBTRD", "TRD1", kAir, ptrd1, 4);
1116 2 : gGeoManager->GetVolume("BBTRD")->SetVisibility(kFALSE);
1117 2 : TVirtualMC::GetMC()->Gspos("BBTRD", 1, "BBCE", 342.0-12.62, 0.0, 0.0, idrotm[2092], "ONLY");
1118 :
1119 : // CBL ////////////////////////////////////////////////////////
1120 :
1121 : // Longitudinal bars
1122 1 : bpar[0] = kBBBdz/2.;
1123 1 : bpar[1] = bpar[0];
1124 1 : bpar[2] = kBBMdz/2. - kBBBdz;
1125 2 : TVirtualMC::GetMC()->Gsvolu("BBLB", "BOX ", kSteel, bpar, 3);
1126 1 : bpar[0] -= kBBBdd;
1127 1 : bpar[1] -= kBBBdd;
1128 1 : bpar[2] -= kBBBdd;
1129 2 : TVirtualMC::GetMC()->Gsvolu("BBLL", "BOX ", kAir, bpar, 3);
1130 2 : TVirtualMC::GetMC()->Gspos("BBLL", 1, "BBLB", 0., 0., 0., 0, "ONLY");
1131 :
1132 1 : dx = kBBMRin + kBBBdz/2. + (bpar[1] + kBBBdd) * TMath::Sin(10. * kDegrad);
1133 1 : dy = dx * TMath::Tan(10. * kDegrad) - kBBBdz/2./TMath::Cos(10. * kDegrad);
1134 2 : TVirtualMC::GetMC()->Gspos("BBLB", 1, "BBCE", dx, dy, 0., idrotm[2052], "ONLY");
1135 :
1136 1 : dx = kBBMRou - kBBBdz/2. - (bpar[1] + kBBBdd) * TMath::Sin(10. * kDegrad);
1137 1 : dy = dx * TMath::Tan(10. * kDegrad) - kBBBdz/2./TMath::Cos(10. * kDegrad);
1138 :
1139 2 : TVirtualMC::GetMC()->Gspos("BBLB", 2, "BBCE", dx, dy, 0., idrotm[2052], "ONLY");
1140 :
1141 : //
1142 : // Radial Bars
1143 : //
1144 1 : bpar[0] = (kBBMRou - kBBMRin) / 2. - kBBBdz;
1145 1 : bpar[1] = kBBBdz/2;
1146 1 : bpar[2] = bpar[1];
1147 :
1148 2 : TVirtualMC::GetMC()->Gsvolu("BBRB", "BOX ", kSteel, bpar, 3);
1149 1 : bpar[0] -= kBBBdd;
1150 1 : bpar[1] -= kBBBdd;
1151 1 : bpar[2] -= kBBBdd;
1152 2 : TVirtualMC::GetMC()->Gsvolu("BBRR", "BOX ", kAir, bpar, 3);
1153 2 : TVirtualMC::GetMC()->Gspos("BBRR", 1, "BBRB", 0., 0., 0., 0, "ONLY");
1154 :
1155 :
1156 1 : dx = (kBBMRou + kBBMRin) / 2.;
1157 1 : dy = ((kBBMRou + kBBMRin)/ 2) * TMath::Tan(10 * kDegrad) - kBBBdz / 2./ TMath::Cos(10 * kDegrad);
1158 1 : dz = kBBMdz/2. - kBBBdz / 2.;
1159 :
1160 2 : TVirtualMC::GetMC()->Gspos("BBRB", 1, "BBCE", dx, dy, dz, idrotm[2052], "ONLY");
1161 2 : TVirtualMC::GetMC()->Gspos("BBRB", 2, "BBCE", dx, dy, - dz, idrotm[2052], "ONLY");
1162 2 : TVirtualMC::GetMC()->Gspos("BBRB", 3, "BBCE", dx, dy, 0., idrotm[2052], "ONLY");
1163 :
1164 : //
1165 : // Circular bars
1166 : //
1167 : // Inner
1168 :
1169 1 : bpar[1] = kBBMRin * TMath::Sin(10. * kDegrad);
1170 1 : bpar[0] = kBBBdz/2;
1171 1 : bpar[2] = bpar[0];
1172 2 : TVirtualMC::GetMC()->Gsvolu("BBC1", "BOX ", kSteel, bpar, 3);
1173 1 : bpar[0] -= kBBBdd;
1174 1 : bpar[1] -= kBBBdd;
1175 1 : bpar[2] -= kBBBdd;
1176 2 : TVirtualMC::GetMC()->Gsvolu("BBC2", "BOX ", kAir, bpar, 3);
1177 2 : TVirtualMC::GetMC()->Gspos("BBC2", 1, "BBC1", 0., 0., 0., 0, "ONLY");
1178 1 : dx = kBBMRin + kBBBdz/2;
1179 : dy = 0.;
1180 2 : TVirtualMC::GetMC()->Gspos("BBC1", 1, "BBCE", dx, dy, dz, 0, "ONLY");
1181 2 : TVirtualMC::GetMC()->Gspos("BBC1", 2, "BBCE", dx, dy, -dz, 0, "ONLY");
1182 : //
1183 : // Outer
1184 1 : bpar[1] = (kBBMRou - kBBBdz) * TMath::Sin(10. * kDegrad);
1185 1 : bpar[0] = kBBBdz/2;
1186 1 : bpar[2] = bpar[0];
1187 2 : TVirtualMC::GetMC()->Gsvolu("BBC3", "BOX ", kSteel, bpar, 3);
1188 1 : bpar[0] -= kBBBdd;
1189 1 : bpar[1] -= kBBBdd;
1190 1 : bpar[2] -= kBBBdd;
1191 2 : TVirtualMC::GetMC()->Gsvolu("BBC4", "BOX ", kAir, bpar, 3);
1192 2 : TVirtualMC::GetMC()->Gspos("BBC4", 1, "BBC3", 0., 0., 0., 0, "ONLY");
1193 1 : dx = kBBMRou - kBBBdz/2;
1194 : dy = 0.;
1195 2 : TVirtualMC::GetMC()->Gspos("BBC3", 1, "BBCE", dx, dy, dz, 0, "ONLY");
1196 2 : TVirtualMC::GetMC()->Gspos("BBC3", 2, "BBCE", dx, dy, - dz, 0, "ONLY");
1197 : //
1198 : // Diagonal Bars
1199 : //
1200 : h = (kBBMRou - kBBMRin - 2. * kBBBdz);;
1201 : d = kBBBdz;
1202 1 : dz = kBBMdz/2. - 1.6 * kBBBdz;
1203 1 : dq = h*h+dz*dz;
1204 :
1205 1 : x = TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
1206 :
1207 :
1208 1 : theta = kRaddeg * TMath::ACos(x);
1209 :
1210 1 : ptrap[0] = dz/2.;
1211 1 : ptrap[1] = theta;
1212 1 : ptrap[2] = 0.;
1213 1 : ptrap[3] = d/2;
1214 1 : ptrap[4] = d/x/2;
1215 1 : ptrap[5] = ptrap[4];
1216 1 : ptrap[6] = 0;
1217 1 : ptrap[7] = ptrap[3];
1218 1 : ptrap[8] = ptrap[4];
1219 1 : ptrap[9] = ptrap[4];
1220 1 : ptrap[10] = 0;
1221 2 : TVirtualMC::GetMC()->Gsvolu("BBD1", "TRAP", kSteel, ptrap, 11);
1222 1 : ptrap[3] = d/2-kBBBdd;
1223 1 : ptrap[4] = (d/2-kBBBdd)/x;
1224 1 : ptrap[5] = ptrap[4];
1225 1 : ptrap[7] = ptrap[3];
1226 1 : ptrap[8] = ptrap[4];
1227 1 : ptrap[9] = ptrap[4];
1228 2 : TVirtualMC::GetMC()->Gsvolu("BBD3", "TRAP", kAir, ptrap, 11);
1229 2 : TVirtualMC::GetMC()->Gspos("BBD3", 1, "BBD1", 0.0, 0.0, 0., 0, "ONLY");
1230 : dx = (kBBMRou + kBBMRin) / 2.;
1231 1 : dy = ((kBBMRou + kBBMRin)/ 2) * TMath::Tan(10 * kDegrad) - kBBBdz / 2./ TMath::Cos(10 * kDegrad);
1232 2 : TVirtualMC::GetMC()->Gspos("BBD1", 1, "BBCE", dx, dy, dz/2. + kBBBdz/2., idrotm[2052], "ONLY");
1233 :
1234 :
1235 1 : ptrap[0] = dz/2.;
1236 1 : ptrap[1] = -theta;
1237 1 : ptrap[2] = 0.;
1238 1 : ptrap[3] = d/2;
1239 1 : ptrap[4] = d/2/x;
1240 1 : ptrap[5] = ptrap[4];
1241 1 : ptrap[6] = 0;
1242 1 : ptrap[7] = ptrap[3];
1243 1 : ptrap[8] = ptrap[4];
1244 1 : ptrap[9] = ptrap[4];
1245 1 : ptrap[10] = 0;
1246 2 : TVirtualMC::GetMC()->Gsvolu("BBD2", "TRAP", kSteel, ptrap, 11);
1247 1 : ptrap[3] = d/2-kBBBdd;
1248 1 : ptrap[4] = (d/2-kBBBdd)/x;
1249 1 : ptrap[5] = ptrap[4];
1250 1 : ptrap[7] = ptrap[3];
1251 1 : ptrap[8] = ptrap[4];
1252 1 : ptrap[9] = ptrap[4];
1253 2 : TVirtualMC::GetMC()->Gsvolu("BBD4", "TRAP", kAir, ptrap, 11);
1254 2 : TVirtualMC::GetMC()->Gspos("BBD4", 1, "BBD2", 0.0, 0.0, 0., 0, "ONLY");
1255 : dx = (kBBMRou + kBBMRin) / 2.;
1256 1 : dy = ((kBBMRou + kBBMRin)/ 2) * TMath::Tan(10 * kDegrad) - kBBBdz / 2./ TMath::Cos(10 * kDegrad);
1257 2 : TVirtualMC::GetMC()->Gspos("BBD2", 1, "BBCE", dx, dy, -dz/2. - kBBBdz/2., idrotm[2052], "ONLY");
1258 :
1259 :
1260 2 : TVirtualMC::GetMC()->Gspos("BBMO", 1, "ALIC", 0., 0., + 376. + kBBMdz / 2. + 0.5, 0, "ONLY");
1261 :
1262 :
1263 20 : }
1264 :
1265 : //___________________________________________
1266 : void AliFRAMEv2::AddAlignableVolumes() const
1267 : {
1268 : // Add the 18 spaceframe sectors as alignable volumes
1269 2 : TString basesymname("FRAME/Sector");
1270 1 : TString basevolpath("ALIC_1/B077_1/BSEGMO");
1271 1 : TString symname;
1272 1 : TString volpath;
1273 :
1274 38 : for(Int_t sec=0; sec<18; sec++)
1275 : {
1276 18 : symname = basesymname;
1277 18 : symname += sec;
1278 18 : volpath = basevolpath;
1279 18 : volpath += sec;
1280 18 : volpath += "_1";
1281 72 : if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data()))
1282 0 : AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",
1283 : symname.Data(),volpath.Data()));
1284 : }
1285 1 : }
1286 :
1287 : //___________________________________________
1288 : void AliFRAMEv2::CreateMaterials()
1289 : {
1290 : // Creates the materials
1291 : Float_t epsil, stemax, tmaxfd, deemax, stmin;
1292 :
1293 : epsil = 1.e-4; // Tracking precision,
1294 : stemax = -0.01; // Maximum displacement for multiple scat
1295 : tmaxfd = -20.; // Maximum angle due to field deflection
1296 : deemax = -.3; // Maximum fractional energy loss, DLS
1297 : stmin = -.8;
1298 2 : Int_t isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();
1299 1 : Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();
1300 :
1301 :
1302 1 : Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
1303 1 : Float_t zsteel[4] = { 26.,24.,28.,14. };
1304 1 : Float_t wsteel[4] = { .715,.18,.1,.005 };
1305 :
1306 : //Air
1307 :
1308 1 : Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1309 1 : Float_t zAir[4]={6.,7.,8.,18.};
1310 1 : Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1311 : Float_t dAir = 1.20479E-3;
1312 :
1313 1 : AliMixture(65, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
1314 1 : AliMixture(5, "AIR$ ", aAir, zAir, dAir,4, wAir);
1315 1 : AliMaterial(9, "ALU ", 26.98, 13., 2.7, 8.9, 37.2);
1316 :
1317 1 : AliMedium(65, "Stainless Steel", 65, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1318 1 : AliMedium( 5, "Air", 5, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1319 1 : AliMedium( 9, "Aluminum", 9, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1320 :
1321 1 : }
1322 :
1323 : //_____________________________________________________________________________
1324 : void AliFRAMEv2::Init()
1325 : {
1326 : //
1327 : // Initialise the module after the geometry has been defined
1328 : //
1329 2 : if(AliLog::GetGlobalDebugLevel()>0) {
1330 0 : printf("%s: **************************************"
1331 : " FRAME "
1332 0 : "**************************************\n",ClassName());
1333 0 : printf("\n%s: Version 2 of FRAME initialised, symmetric FRAME\n\n",ClassName());
1334 0 : printf("%s: **************************************"
1335 : " FRAME "
1336 0 : "**************************************\n",ClassName());
1337 0 : }
1338 : //
1339 : // The reference volume id
1340 1 : fRefVolumeId1 = TVirtualMC::GetMC()->VolId("BREF1");
1341 1 : fRefVolumeId2 = TVirtualMC::GetMC()->VolId("BREF2");
1342 1 : }
1343 :
1344 : Int_t AliFRAMEv2::IsVersion() const
1345 : {
1346 : // Returns the version of the FRAME (1 if no holes, 0 otherwise)
1347 : Int_t version = 0;
1348 2 : if (fHoles == 0) version = 1;
1349 1 : return version;
1350 : }
1351 :
1352 : void AliFRAMEv2::StepManager()
1353 : {
1354 : //
1355 : // Stepmanager of AliFRAMEv2.cxx
1356 : // Used for recording of reference tracks entering the spaceframe mother volume
1357 : //
1358 205888 : Int_t copy, id;
1359 :
1360 : //
1361 : // Only charged tracks
1362 139539 : if( !(TVirtualMC::GetMC()->TrackCharge()) ) return;
1363 : //
1364 : // Only tracks entering mother volume
1365 : //
1366 :
1367 66349 : id=TVirtualMC::GetMC()->CurrentVolID(copy);
1368 :
1369 196997 : if ((id != fRefVolumeId1) && (id != fRefVolumeId2)) return;
1370 2018 : if(!TVirtualMC::GetMC()->IsTrackEntering()) return;
1371 : //
1372 : // Add the reference track
1373 : //
1374 112 : AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kFRAME);
1375 103056 : }
1376 :
1377 :
1378 :
1379 : void AliFRAMEv2::MakeHeatScreen(const char* name, Float_t dyP, Int_t rot1, Int_t rot2)
1380 : {
1381 : // Heat screen panel
1382 : //
1383 6 : Int_t *idtmed = fIdtmed->GetArray()-1999;
1384 3 : const Int_t kAir = idtmed[2004];
1385 3 : const Int_t kAlu = idtmed[2008];
1386 :
1387 : Float_t dx, dy;
1388 3 : char mname[16];
1389 3 : char cname [16];
1390 3 : char t1name[16];
1391 3 : char t2name[16];
1392 3 : char t3name[16];
1393 3 : char t4name[16];
1394 3 : char t5name[16];
1395 :
1396 : //
1397 3 : Float_t dxP = 2. * (287. * TMath::Sin(10.* TMath::Pi()/180.) - 2.);
1398 : Float_t dzP = 1.05;
1399 : //
1400 : // Mother volume
1401 3 : Float_t thshM[3];
1402 3 : thshM[0] = dxP / 2.;
1403 3 : thshM[1] = dyP / 2.;
1404 3 : thshM[2] = dzP / 2.;
1405 3 : snprintf(mname, 16, "BTSH_%s", name);
1406 3 : TVirtualMC::GetMC()->Gsvolu(mname, "BOX ", kAir, thshM, 3);
1407 : //
1408 : // Aluminum sheet
1409 3 : thshM[2] = 0.025;
1410 3 : snprintf(cname, 16, "BTSHA_%s", name);
1411 3 : TVirtualMC::GetMC()->Gsvolu(cname, "BOX ", kAlu, thshM, 3);
1412 3 : TVirtualMC::GetMC()->Gspos(cname, 1, mname, 0., 0., -0.5, 0);
1413 : //
1414 : // Tubes
1415 3 : Float_t thshT[3];
1416 3 : thshT[0] = 0.4;
1417 3 : thshT[1] = 0.5;
1418 3 : thshT[2] = (dyP / 2. - 8.);
1419 : //
1420 3 : snprintf(t1name, 16, "BTSHT1_%s", name);
1421 3 : TVirtualMC::GetMC()->Gsvolu(t1name, "TUBE", kAlu, thshT, 3);
1422 3 : dx = - dxP / 2. + 8. - 0.5;
1423 3 : TVirtualMC::GetMC()->Gspos(t1name, 1, mname, dx, 0., 0.025, rot1);
1424 : //
1425 3 : snprintf(t2name, 16, "BTSHT2_%s", name);
1426 3 : snprintf(t3name, 16, "BTSHT3_%s", name);
1427 3 : snprintf(t4name, 16, "BTSHT4_%s", name);
1428 3 : snprintf(t5name, 16, "BTSHT5_%s", name);
1429 3 : thshT[2] = (thshM[1] - 12.);
1430 3 : TVirtualMC::GetMC()->Gsvolu(t2name, "TUBE", kAlu, thshT, 3);
1431 3 : thshT[2] = 7.9/2.;
1432 3 : TVirtualMC::GetMC()->Gsvolu(t3name, "TUBE", kAlu, thshT, 3);
1433 3 : thshT[2] = 23.9/2.;
1434 3 : TVirtualMC::GetMC()->Gsvolu(t4name, "TUBE", kAlu, thshT, 3);
1435 :
1436 : Int_t sig = 1;
1437 : Int_t ipo = 1;
1438 36 : for (Int_t i = 0; i < 5; i++) {
1439 15 : sig *= -1;
1440 15 : dx += 8.00;
1441 15 : dy = 4. * sig;
1442 15 : Float_t dy1 = - (thshM[1] - 15.5) * sig;
1443 15 : Float_t dy2 = - (thshM[1] - 7.5) * sig;
1444 :
1445 15 : TVirtualMC::GetMC()->Gspos(t2name, ipo++, mname, dx, dy, 0.025, rot1);
1446 15 : dx += 6.9;
1447 15 : TVirtualMC::GetMC()->Gspos(t2name, ipo++, mname, dx, dy, 0.025, rot1);
1448 :
1449 15 : TVirtualMC::GetMC()->Gspos(t3name, i+1, mname, dx - 3.45, dy1, 0.025, rot2);
1450 15 : TVirtualMC::GetMC()->Gspos(t4name, i+1, mname, dx - 3.45, dy2, 0.025, rot2);
1451 : }
1452 3 : dx += 8.;
1453 3 : TVirtualMC::GetMC()->Gspos(t1name, 2, mname, dx, 0., 0.025, rot1);
1454 3 : TVirtualMC::GetMC()->Gspos(t3name, 6, mname, dx - 3.45, -(thshM[1] - 7.5), 0.025, rot2);
1455 3 : }
1456 :
1457 :
1458 :
1459 : void AliFRAMEv2::WebFrame(const char* name, Float_t dHz, Float_t theta0, Float_t phi0)
1460 : {
1461 : //
1462 : // Create a web frame element
1463 : //
1464 20 : Int_t *idtmed = fIdtmed->GetArray()-1999;
1465 10 : const Float_t krad2deg = 180. / TMath::Pi();
1466 10 : const Float_t kdeg2rad = 1. / krad2deg;
1467 10 : const Int_t kAir = idtmed[2004];
1468 10 : const Int_t kSteel = idtmed[2064];
1469 :
1470 10 : Float_t ptrap[11];
1471 10 : char nameA[16];
1472 10 : snprintf(nameA, 16, "%sA", name );
1473 10 : theta0 *= kdeg2rad;
1474 10 : phi0 *= kdeg2rad;
1475 10 : Float_t theta = TMath::ATan(TMath::Tan(theta0)/TMath::Sin(phi0));
1476 10 : Float_t phi = TMath::ACos(TMath::Cos(theta0) * TMath::Cos(phi0));
1477 15 : if (phi0 < 0) phi = -phi;
1478 :
1479 10 : phi *= krad2deg;
1480 10 : theta *= krad2deg;
1481 :
1482 10 : ptrap[0] = dHz/2;
1483 10 : ptrap[2] = theta;
1484 10 : ptrap[1] = phi;
1485 10 : ptrap[3] = 6./cos(theta0 * kdeg2rad)/2.;
1486 10 : ptrap[4] = 1.;
1487 10 : ptrap[5] = ptrap[4];
1488 10 : ptrap[6] = 0;
1489 10 : ptrap[7] = ptrap[3];
1490 10 : ptrap[8] = ptrap[4];
1491 10 : ptrap[9] = ptrap[4];
1492 10 : ptrap[10] = 0;
1493 10 : TVirtualMC::GetMC()->Gsvolu(name, "TRAP", kSteel, ptrap, 11);
1494 10 : ptrap[3] = (6. - 1.)/cos(theta0 * kdeg2rad)/2.;
1495 10 : ptrap[4] = 0.75;
1496 10 : ptrap[5] = ptrap[4];
1497 10 : ptrap[7] = ptrap[3];
1498 10 : ptrap[8] = ptrap[4];
1499 10 : ptrap[9] = ptrap[4];
1500 :
1501 10 : TVirtualMC::GetMC()->Gsvolu(nameA, "TRAP", kAir, ptrap, 11);
1502 10 : TVirtualMC::GetMC()->Gspos(nameA, 1, name, 0.0, -0.25, 0., 0, "ONLY");
1503 10 : gGeoManager->GetVolume(name)->SetVisibility(1);
1504 10 : }
1505 :
|