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