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