Medium array is now private for each module
[u/mrichter/AliRoot.git] / STRUCT / AliFRAMEv1.cxx
1 ///////////////////////////////////////////////////////////////////////////////
2 //                                                                           //
3 //  Space frame class                                                          //
4 //                                                                           //
5 //Begin_Html
6 /*
7 <img src="picts/AliFRAMEClass.gif">
8 */
9 //End_Html
10 //                                                                           //
11 ///////////////////////////////////////////////////////////////////////////////
12
13 #include "AliFRAMEv1.h"
14 #include "AliRun.h"
15  
16 ClassImp(AliFRAMEv1)
17  
18 //_____________________________________________________________________________
19 AliFRAMEv1::AliFRAMEv1()
20 {
21   //
22   // Default constructor for space frame
23   //
24 }
25  
26 //_____________________________________________________________________________
27 AliFRAMEv1::AliFRAMEv1(const char *name, const char *title)
28        : AliFRAME(name,title)
29 {
30   //
31   // Standard constructor for space frame
32   //
33 }
34  
35 //_____________________________________________________________________________
36 void AliFRAMEv1::CreateGeometry()
37 {
38   //
39   // Create space frame geometry
40   //
41   //Begin_Html
42   /*
43     <img src="picts/AliFRAME.gif">
44   */
45   //End_Html
46   //Begin_Html
47   /*
48     <img src="picts/AliFRAMETree.gif">
49   */
50   //End_Html
51   AliMC* pMC = AliMC::GetMC();
52   
53   Int_t *idtmed = fIdtmed->GetArray()-1199;
54
55   Float_t dphi, dz_small, zpos, ddphi;
56   Float_t tspar[5];
57   Float_t tsparl[5];
58   Float_t par[50], dz_long;
59   
60   //     R_IN : INNER RADIUS 
61   //     R_OU : OUTER RADIUS 
62   //     DR   : WALL THICKNESS 
63   //   2*Z_IN : FREE SPACE IN Z FOR PHOS 
64   //   2*Z_RI : FREE SPACE IN Z FOR RICH 
65   //   2*Z_OU : LENGTH 
66   //   2*DZ   : WIDTH OF FRAME ELEMENTS 
67   Float_t r_in = 395;
68   Float_t r_ou = 420;
69   Float_t dr   = 0.3;
70   Float_t z_in = 130;
71   Float_t z_ou = 350;
72   Float_t z_ri = 236.25;
73   Float_t dz   = 8.75;
74   
75   
76   //     Space Frame 
77   
78   par[0] = r_in;
79   par[1] = r_ou;
80   par[2] = z_ou;
81   pMC->Gsvolu("BFMO", "TUBE", idtmed[1214], par, 3);
82   
83   //     Rings perpendicular to the beam 
84   
85   //     full rings at the ends 
86   
87   par[0] = r_in;
88   par[1] = r_ou;
89   par[2] = dz;
90   pMC->Gsvolu("BRO1", "TUBE", idtmed[1218], par, 3);
91   par[0] = r_in +dr;
92   par[1] = r_ou -dr;
93   par[2] = dz - dr;
94   pMC->Gsvolu("BRI1", "TUBE", idtmed[1214], par, 3);
95   pMC->Gspos("BRI1", 1, "BRO1", 0., 0., 0., 0, "ONLY");
96   zpos = z_ou - dz;
97   pMC->Gspos("BRO1", 1, "BFMO", 0., 0.,-zpos, 0, "ONLY");
98   pMC->Gspos("BRO1", 2, "BFMO", 0., 0., zpos, 0, "ONLY");
99   
100   //     space for the HMPID 
101   
102   tspar[0] = r_in;
103   tspar[1] = r_ou;
104   tspar[2] = dz;
105   tspar[3] = -240.;
106   tspar[4] = 60.;
107   pMC->Gsvolu("BRO2", "TUBS", idtmed[1218], tspar, 5);
108   tspar[0] = r_in + dr;
109   tspar[1] = r_ou - dr;
110   tspar[2] = dz - dr;
111   pMC->Gsvolu("BRI2", "TUBS", idtmed[1214], tspar, 5);
112   pMC->Gspos("BRI2", 1, "BRO2", 0., 0., 0., 0, "ONLY");
113   zpos = z_in + dz;
114   pMC->Gspos("BRO2", 1, "BFMO", 0., 0.,-zpos, 0, "ONLY");
115   pMC->Gspos("BRO2", 2, "BFMO", 0., 0., zpos, 0, "ONLY");
116   
117   
118   
119   tspar[0] = r_in;
120   tspar[1] = r_ou;
121   tspar[2] = dz;
122   tspar[3] = 60.;
123   tspar[4] = 120.;
124   pMC->Gsvolu("BRO3", "TUBS", idtmed[1218], tspar, 5);
125   tspar[0] = r_in + dr;
126   tspar[1] = r_ou - dr;
127   tspar[2] = dz - dr;
128   pMC->Gsvolu("BRI3", "TUBS", idtmed[1214], tspar, 5);
129   pMC->Gspos("BRI3", 1, "BRO3", 0., 0., 0., 0, "ONLY");
130   zpos = 245.;
131   pMC->Gspos("BRO3", 1, "BFMO", 0., 0.,-zpos, 0, "ONLY");
132   pMC->Gspos("BRO3", 2, "BFMO", 0., 0., zpos, 0, "ONLY");
133   
134   //     longitudinal beams 
135   
136   //     outside phi=60-120 
137   
138   //     virtual elements 
139   
140   dz_small  = (z_ou - z_in -4*dz)/2;
141   dz_long   = z_in;
142   tsparl[0] = r_in;
143   tsparl[1] = r_ou;
144   tsparl[2] = dz_small;
145   
146   //     left and right 
147   
148   tsparl[3] = -240.;
149   tsparl[4] = 60.;
150   pMC->Gsvolu("BLO1", "TUBS", idtmed[1214], tsparl, 5);
151   pMC->Gsdvt("BLD1", "BLO1", 20., 2, idtmed[1214], 15);
152   
153   //     central, leaving space for rich and phos 
154   
155   tsparl[2] = dz_long;
156   tsparl[3] = -20.;
157   tsparl[4] = 60.;
158   pMC->Gsvolu("BLO2", "TUBS", idtmed[1214], tsparl, 5);
159   pMC->Gsdvt("BLD2", "BLO2", 20., 2, idtmed[1214], 5);
160   tsparl[3] = 120.;
161   tsparl[4] = 200.;
162   pMC->Gsvolu("BLO3", "TUBS", idtmed[1214], tsparl, 5);
163   pMC->Gsdvt("BLD3", "BLO3", 20., 2, idtmed[1214], 5);
164   
165   //     real elements 
166   
167   dphi  = dz/(TMath::Pi()*(r_in + r_ou))*360;
168   ddphi = dphi * dr/dz;
169   tspar[0] = tsparl[0];
170   tspar[1] = tsparl[1];
171   tspar[2] = dz_small;
172   tspar[3] = 10. - dphi;
173   tspar[4] = 10.;
174   pMC->Gsvolu("BL01", "TUBS", idtmed[1218], tspar, 5);
175   
176   tspar[0] = tsparl[0] + dr;
177   tspar[1] = tsparl[1] - dr;
178   tspar[3] = 10. - dphi + ddphi;
179   tspar[4] = 10. - ddphi;
180   pMC->Gsvolu("BL02", "TUBS", idtmed[1214], tspar, 5);
181   pMC->Gspos("BL02", 1, "BL01", 0., 0., 0., 0, "ONLY");
182   
183
184   tspar[0] = tsparl[0];
185   tspar[1] = tsparl[1];
186   tspar[2] = dz_long;
187   tspar[3] = 10. - dphi;
188   tspar[4] = 10.;
189   pMC->Gsvolu("BL11", "TUBS", idtmed[1218], tspar, 5);
190   
191   tspar[0] = tsparl[0] + dr;
192   tspar[1] = tsparl[1] - dr;
193   tspar[3] = 10. - dphi + ddphi;
194   tspar[4] = 10. - ddphi;
195   pMC->Gsvolu("BL12", "TUBS", idtmed[1214], tspar, 5);
196   pMC->Gspos("BL12", 1, "BL11", 0., 0., 0., 0, "ONLY");
197   
198   pMC->Gspos("BL01", 1, "BLD1", 0., 0., 0., 0, "ONLY");
199   pMC->Gspos("BL11", 1, "BLD2", 0., 0., 0., 0, "ONLY");
200   pMC->Gspos("BL11", 2, "BLD3", 0., 0., 0., 0, "ONLY");
201   
202   zpos = z_in +2*dz + dz_small;
203   pMC->Gspos("BLO1", 1, "BFMO", 0., 0.,-zpos, 0, "ONLY");
204   pMC->Gspos("BLO1", 2, "BFMO", 0., 0., zpos, 0, "ONLY");
205   pMC->Gspos("BLO2", 1, "BFMO", 0., 0.,   0., 0, "ONLY");
206   pMC->Gspos("BLO3", 1, "BFMO", 0., 0.,   0., 0, "ONLY");
207   
208   //     PHI=60-120 (RICH) 
209   
210   tsparl[0] = r_in;
211   tsparl[1] = r_ou;
212   tsparl[2] = (z_ou - z_ri -4*dz)/2;
213   tsparl[3] = 60.;
214   tsparl[4] = 120.;
215   pMC->Gsvolu("BLO4", "TUBS", idtmed[1214], tsparl, 5);
216   pMC->Gsdvt("BLD4", "BLO4", 20., 2, idtmed[1214], 3);
217   tspar[0] = tsparl[0];
218   tspar[1] = tsparl[1];
219   tspar[2] = tsparl[2];
220   tspar[3] = 10. - dphi;
221   tspar[4] = 10.;
222   pMC->Gsvolu("BL03", "TUBS", idtmed[1218], tspar, 5);
223   
224   tspar[0] = tsparl[0] + dr;
225   tspar[1] = tsparl[1] - dr;
226   tspar[2] = tsparl[2];
227   tspar[3] = 10. - dphi + ddphi;
228   tspar[4] = 10. - ddphi;
229   pMC->Gsvolu("BL04", "TUBS", idtmed[1214], tspar, 5);
230   pMC->Gspos("BL04", 1, "BL03", 0., 0., 0., 0, "ONLY");
231   
232   pMC->Gspos("BL03", 1, "BLD4", 0., 0., 0., 0, "ONLY");
233   
234   pMC->Gspos("BLO4", 1, "BFMO", 0., 0., 293.125, 0, "ONLY");
235   pMC->Gspos("BLO4", 2, "BFMO", 0., 0.,-293.125, 0, "ONLY");
236   
237   pMC->Gspos("BFMO", 1, "ALIC", 0., 0., 0., 0, "ONLY");
238   pMC->Gsatt("BFMO", "SEEN", 0);
239 }
240
241 //_____________________________________________________________________________
242 void AliFRAMEv1::DrawModule()
243 {
244   //
245   // Draw a shaded view of the space frame
246   //
247
248   AliMC* pMC = AliMC::GetMC();
249   
250   // Set everything unseen
251   pMC->Gsatt("*", "seen", -1);
252   // 
253   // Set ALIC mother transparent
254   pMC->Gsatt("ALIC","SEEN",0);
255   //
256   // Set the volumes visible
257   pMC->Gsatt("BFMO","seen",0);
258   pMC->Gsatt("BRO1","seen",1);
259   pMC->Gsatt("BRI1","seen",0);
260   pMC->Gsatt("BRO2","seen",1);
261   pMC->Gsatt("BRI2","seen",0);
262   pMC->Gsatt("BRO3","seen",1);
263   pMC->Gsatt("BRI3","seen",0);
264   pMC->Gsatt("BLO1","seen",0);
265   pMC->Gsatt("BLD1","seen",0);
266   pMC->Gsatt("BLO2","seen",0);
267   pMC->Gsatt("BLD2","seen",0);
268   pMC->Gsatt("BLO3","seen",0);
269   pMC->Gsatt("BLD3","seen",0);
270   pMC->Gsatt("BL01","seen",1);
271   pMC->Gsatt("BL02","seen",1);
272   pMC->Gsatt("BL11","seen",1);
273   pMC->Gsatt("BL12","seen",1);
274   pMC->Gsatt("BLO4","seen",0);
275   pMC->Gsatt("BLD4","seen",0);
276   pMC->Gsatt("BL03","seen",1);
277   pMC->Gsatt("BL04","seen",1);
278   //
279   pMC->Gdopt("hide", "on");
280   pMC->Gdopt("shad", "on");
281   pMC->Gsatt("*", "fill", 7);
282   pMC->SetClipBox(".");
283   pMC->DefaultRange();
284   pMC->Gdraw("alic", 40, 30, 0, 10, 10, .015, .015);
285   pMC->Gdhead(1111, "Space Frame");
286   pMC->Gdman(18, 4, "MAN");
287 }
288
289 //_____________________________________________________________________________
290 void AliFRAMEv1::CreateMaterials()
291 {
292
293   //
294   // Create materials for the space frame
295   //
296   
297   Int_t   ISXFLD = gAlice->Field()->Integ();
298   Float_t SXMGMX = gAlice->Field()->Max();
299   
300   Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
301   Float_t zsteel[4] = { 26.,24.,28.,14. };
302   Float_t wsteel[4] = { .715,.18,.1,.005 };
303   
304   Float_t epsil, stmin, deemax, tmaxfd, stemax;
305   
306   //     STEEL 
307
308
309   // --- Define the various materials for GEANT --- 
310   AliMaterial(15, "AIR$      ", 14.61, 7.3, .001205, 30423.24, 67500);
311   AliMixture(19, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
312   
313   // **************** 
314   //     Defines tracking media parameters. 
315   //     Les valeurs sont commentees pour laisser le defaut 
316   //     a GEANT (version 3-21, page CONS200), f.m. 
317   epsil  = .001; // Tracking precision, 
318   stemax = -1.;  // Maximum displacement for multiple scat 
319   tmaxfd = -20.; // Maximum angle due to field deflection 
320   deemax = -.3;  // Maximum fractional energy loss, DLS 
321   stmin  = -.8;
322   // *************** 
323   //ifield0 = 0;  // Field off 
324   //ifield1 = 2;  // 1.0 T. FIELD (DIPOLE) 
325   //ifield3 = 3;
326   
327   //    Air 
328   
329   // 0.2 T. FIELD (L3) 
330   AliMedium(15, "AIR_L3_US        ", 15, 0, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin);
331   
332   //    Steel 
333   
334   AliMedium(19, "ST_L3_US          ", 19, 0, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin);
335 }
336
337
338
339
340
341
342
343
344
345
346