Transition to NewIO
[u/mrichter/AliRoot.git] / TRD / AliTRDgeometryHole.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 //                                                                           //
20 //  TRD geometry with holes                                                  //
21 //                                                                           //
22 ///////////////////////////////////////////////////////////////////////////////
23
24 #include <TVirtualMC.h>
25 #include "AliTRDgeometryHole.h"
26
27 ClassImp(AliTRDgeometryHole)
28
29 //_____________________________________________________________________________
30 AliTRDgeometryHole::AliTRDgeometryHole():AliTRDgeometry()
31 {
32   //
33   // AliTRDgeometryHole default constructor
34   //
35
36   Init();
37
38 }
39
40 //_____________________________________________________________________________
41 AliTRDgeometryHole::~AliTRDgeometryHole()
42 {
43   //
44   // AliTRDgeometryHole destructor
45   //
46
47 }
48
49 //_____________________________________________________________________________
50 void AliTRDgeometryHole::Init()
51 {
52   //
53   // Initializes the geometry parameter
54   //
55
56   Int_t iplan;
57   Int_t icham;
58
59   // The outer lengths of the chambers for the sectors with holes for the PHOS
60   Float_t lengthPH[kNplan][kNcham] = { {   0.0,   0.0,   0.0, 117.0, 124.0 }
61                                      , {   0.0,   0.0,   0.0, 124.0, 131.0 }
62                                      , {   0.0,   0.0,   0.0, 131.0, 138.0 }
63                                      , {   0.0,   0.0,   0.0, 138.0, 145.0 }
64                                      , {   0.0,   0.0,   0.0, 140.0, 147.0 }
65                                      , {   0.0,   0.0,   0.0, 140.0, 147.0 } };
66
67   // The outer lengths of the chambers for the sectors with holes for the RICH
68   Float_t lengthRH[kNplan][kNcham] = { {   0.0,   0.0,   0.0,   0.0,  87.5 }
69                                      , {   0.0,   0.0,   0.0,   0.0, 101.5 }
70                                      , {   0.0,   0.0,   0.0,   0.0, 115.5 }
71                                      , {   0.0,   0.0,   0.0,   0.0, 129.5 }
72                                      , {   0.0,   0.0,   0.0,   0.0, 133.5 }
73                                      , {   0.0,   0.0,   0.0,   0.0, 133.5 } };
74
75   for (icham = 0; icham < kNcham; icham++) {
76     for (iplan = 0; iplan < kNplan; iplan++) {
77       fClengthPH[iplan][icham] = lengthPH[iplan][icham];
78       fClengthRH[iplan][icham] = lengthRH[iplan][icham];
79     }
80   }
81
82 }
83
84 //_____________________________________________________________________________
85 void AliTRDgeometryHole::CreateGeometry(Int_t *idtmed)
86 {
87   //
88   // Create the TRD geometry with holes
89   //
90   // Names of the TRD volumina (xx = detector number):
91   //
92   //      Lower part of the readout chambers (gas volume + radiator)
93   //
94   //        UAxx    Aluminum frames             (Al)
95   //        UBxx    G10 frames                  (C)
96   //        UCxx    Inner volumes               (Air)
97   //
98   //      Upper part of the readout chambers (readout plane + fee)
99   //
100   //        UDxx    G10 frames                  (C)
101   //        UExx    Inner volumes of the G10    (Air)
102   //        UFxx    Aluminum frames             (Al)
103   //        UGxx    Inner volumes of the Al     (Air)
104   //
105   //      Inner material layers
106   //
107   //        UHxx    Radiator                    (Rohacell)
108   //        UIxx    Entrance window             (Mylar)
109   //        UJxx    Drift volume                (Xe/CO2)
110   //        UKxx    Amplification volume        (Xe/CO2)
111   //        ULxx    Pad plane                   (Cu)
112   //        UMxx    Support structure           (Rohacell)
113   //        UNxx    FEE + signal lines          (Cu)
114   //        UOxx    Cooling device              (Al)
115   //        UPxx    Cooling device              (Water)
116   //
117
118   const Int_t kNdet    = kNplan * kNcham;
119
120   const Int_t kNparTrd = 4;
121   const Int_t kNparCha = 3;
122
123   Float_t xpos, ypos, zpos;
124
125   Float_t parTrd[kNparTrd];
126   Float_t parCha[kNparCha];
127
128   Char_t  cTagV[5];
129   Char_t  cTagM[5];
130
131   AliTRDgeometry::CreateGeometry(idtmed);
132
133   // The TRD mother volume for one sector (Air), full length in z-direction
134   parTrd[0] = fgkSwidth1/2.;
135   parTrd[1] = fgkSwidth2/2.;
136   parTrd[2] = fgkSlenTR1/2.;
137   parTrd[3] = fgkSheight/2.;
138   gMC->Gsvolu("UTR1","TRD1",idtmed[1302-1],parTrd,kNparTrd);
139
140   // The TRD mother volume for one sector (Air), leaving hole for PHOS
141   parTrd[0] = fgkSwidth1/2.;
142   parTrd[1] = fgkSwidth2/2.;
143   parTrd[2] = fgkSlenTR2/2.;
144   parTrd[3] = fgkSheight/2.;
145   gMC->Gsvolu("UTR2","TRD1",idtmed[1302-1],parTrd,kNparTrd);
146
147   // The TRD mother volume for one sector (Air), leaving hole for RICH
148   parTrd[0] = fgkSwidth1/2.;
149   parTrd[1] = fgkSwidth2/2.;
150   parTrd[2] = fgkSlenTR3/2.;
151   parTrd[3] = fgkSheight/2.;
152   gMC->Gsvolu("UTR3","TRD1",idtmed[1302-1],parTrd,kNparTrd);
153
154   for (Int_t icham = 0; icham < kNcham; icham++) {
155     for (Int_t iplan = 0; iplan < kNplan; iplan++) {  
156
157       Int_t iDet = GetDetectorSec(iplan,icham);
158
159       // The lower part of the readout chambers (gas volume + radiator) 
160       // The aluminum frames 
161       sprintf(cTagV,"UA%02d",iDet);
162       parCha[0] = fCwidth[iplan]/2.;
163       parCha[1] = fClength[iplan][icham]/2. - fgkHspace/2.;
164       parCha[2] = fgkCraH/2. + fgkCdrH/2.;
165       gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
166       // The G10 frames 
167       sprintf(cTagV,"UB%02d",iDet);
168       parCha[0] = fCwidth[iplan]/2. - fgkCalT; 
169       parCha[1] = -1.;
170       parCha[2] = -1.;
171       gMC->Gsvolu(cTagV,"BOX ",idtmed[1307-1],parCha,kNparCha);
172       // The inner part (air)
173       sprintf(cTagV,"UC%02d",iDet);
174       parCha[0] = fCwidth[iplan]/2. - fgkCalT - fgkCclsT; 
175       parCha[1] = fClength[iplan][icham]/2. - fgkHspace/2.- fgkCclfT;
176       parCha[2] = -1.;
177       gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
178       if (fClengthPH[iplan][icham] > 0.0) {
179         // The aluminum frames 
180         sprintf(cTagV,"UA%02d",iDet+kNdet);
181         parCha[0] = fCwidth[iplan]/2.;
182         parCha[1] = fClengthPH[iplan][icham]/2. - fgkHspace/2.;
183         parCha[2] = fgkCraH/2. + fgkCdrH/2.;
184         gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
185         // The G10 frames 
186         sprintf(cTagV,"UB%02d",iDet+kNdet);
187         parCha[0] = fCwidth[iplan]/2. - fgkCalT; 
188         parCha[1] = -1.;
189         parCha[2] = -1.;
190         gMC->Gsvolu(cTagV,"BOX ",idtmed[1307-1],parCha,kNparCha);
191         // The inner part (air)
192         sprintf(cTagV,"UC%02d",iDet+kNdet);
193         parCha[0] = fCwidth[iplan]/2. - fgkCalT - fgkCclsT; 
194         parCha[1] = fClengthPH[iplan][icham]/2. - fgkHspace/2.- fgkCclfT;
195         parCha[2] = -1.;
196         gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
197       }
198       if (fClengthRH[iplan][icham] > 0.0) {
199         // The aluminum frames 
200         sprintf(cTagV,"UA%02d",iDet+2*kNdet);
201         parCha[0] = fCwidth[iplan]/2.;
202         parCha[1] = fClengthRH[iplan][icham]/2. - fgkHspace/2.;
203         parCha[2] = fgkCraH/2. + fgkCdrH/2.;
204         gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
205         // The G10 frames 
206         sprintf(cTagV,"UB%02d",iDet+2*kNdet);
207         parCha[0] = fCwidth[iplan]/2. - fgkCalT; 
208         parCha[1] = -1.;
209         parCha[2] = -1.;
210         gMC->Gsvolu(cTagV,"BOX ",idtmed[1307-1],parCha,kNparCha);
211         // The inner part (air)
212         sprintf(cTagV,"UC%02d",iDet+2*kNdet);
213         parCha[0] = fCwidth[iplan]/2. - fgkCalT - fgkCclsT; 
214         parCha[1] = fClengthRH[iplan][icham]/2. - fgkHspace/2.- fgkCclfT;
215         parCha[2] = -1.;
216         gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
217       }
218
219       // The upper part of the readout chambers (readout plane + fee)
220       // The G10 frames
221       sprintf(cTagV,"UD%02d",iDet);
222       parCha[0] = fCwidth[iplan]/2. + fgkCroW;
223       parCha[1] = fClength[iplan][icham]/2. - fgkHspace/2.;
224       parCha[2] = fgkCamH/2.;
225       gMC->Gsvolu(cTagV,"BOX ",idtmed[1307-1],parCha,kNparCha);
226       // The inner part of the G10 frame (air)
227       sprintf(cTagV,"UE%02d",iDet);
228       parCha[0] = fCwidth[iplan]/2. + fgkCroW - fgkCcuT; 
229       parCha[1] = fClength[iplan][icham]/2. - fgkHspace/2.- fgkCcuT;
230       parCha[2] = -1.;
231       gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
232       // The aluminum frames
233       sprintf(cTagV,"UF%02d",iDet);
234       parCha[0] = fCwidth[iplan]/2. + fgkCroW;
235       parCha[1] = fClength[iplan][icham]/2. - fgkHspace/2.;
236       parCha[2] = fgkCroH/2.;
237       gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
238       // The inner part of the aluminum frames
239       sprintf(cTagV,"UG%02d",iDet);
240       parCha[0] = fCwidth[iplan]/2. + fgkCroW - fgkCauT; 
241       parCha[1] = fClength[iplan][icham]/2. - fgkHspace/2.- fgkCauT;
242       parCha[2] = -1.;
243       gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
244       if (fClengthPH[iplan][icham] > 0.0) {
245         sprintf(cTagV,"UD%02d",iDet+kNdet);
246         parCha[0] = fCwidth[iplan]/2. + fgkCroW;
247         parCha[1] = fClengthPH[iplan][icham]/2. - fgkHspace/2.;
248         parCha[2] = fgkCamH/2.;
249         gMC->Gsvolu(cTagV,"BOX ",idtmed[1307-1],parCha,kNparCha);
250         // The inner part of the G10 frame (air)
251         sprintf(cTagV,"UE%02d",iDet+kNdet);
252         parCha[0] = fCwidth[iplan]/2. + fgkCroW - fgkCcuT; 
253         parCha[1] = fClengthPH[iplan][icham]/2. - fgkHspace/2.- fgkCcuT;
254         parCha[2] = -1.;
255         gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
256         // The aluminum frames
257         sprintf(cTagV,"UF%02d",iDet+kNdet);
258         parCha[0] = fCwidth[iplan]/2. + fgkCroW;
259         parCha[1] = fClengthPH[iplan][icham]/2. - fgkHspace/2.;
260         parCha[2] = fgkCroH/2.;
261         gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
262         // The inner part of the aluminum frames
263         sprintf(cTagV,"UG%02d",iDet+kNdet);
264         parCha[0] = fCwidth[iplan]/2. + fgkCroW - fgkCauT; 
265         parCha[1] = fClengthPH[iplan][icham]/2. - fgkHspace/2.- fgkCauT;
266         parCha[2] = -1.;
267         gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
268       }
269       if (fClengthRH[iplan][icham] > 0.0) {
270         sprintf(cTagV,"UD%02d",iDet+2*kNdet);
271         parCha[0] = fCwidth[iplan]/2. + fgkCroW;
272         parCha[1] = fClengthRH[iplan][icham]/2. - fgkHspace/2.;
273         parCha[2] = fgkCamH/2.;
274         gMC->Gsvolu(cTagV,"BOX ",idtmed[1307-1],parCha,kNparCha);
275         // The inner part of the G10 frame (air)
276         sprintf(cTagV,"UE%02d",iDet+2*kNdet);
277         parCha[0] = fCwidth[iplan]/2. + fgkCroW - fgkCcuT; 
278         parCha[1] = fClengthRH[iplan][icham]/2. - fgkHspace/2.- fgkCcuT;
279         parCha[2] = -1.;
280         gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
281         // The aluminum frames
282         sprintf(cTagV,"UF%02d",iDet+2*kNdet);
283         parCha[0] = fCwidth[iplan]/2. + fgkCroW;
284         parCha[1] = fClengthRH[iplan][icham]/2. - fgkHspace/2.;
285         parCha[2] = fgkCroH/2.;
286         gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
287         // The inner part of the aluminum frames
288         sprintf(cTagV,"UG%02d",iDet+2*kNdet);
289         parCha[0] = fCwidth[iplan]/2. + fgkCroW - fgkCauT; 
290         parCha[1] = fClengthRH[iplan][icham]/2. - fgkHspace/2.- fgkCauT;
291         parCha[2] = -1.;
292         gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
293       }
294
295       // The material layers inside the chambers
296       parCha[0] = -1.;
297       parCha[1] = -1.;
298       // Rohacell layer (radiator)
299       parCha[2] = fgkRaThick/2;
300       sprintf(cTagV,"UH%02d",iDet);
301       gMC->Gsvolu(cTagV,"BOX ",idtmed[1315-1],parCha,kNparCha);
302       // Mylar layer (entrance window + HV cathode) 
303       parCha[2] = fgkMyThick/2;
304       sprintf(cTagV,"UI%02d",iDet);
305       gMC->Gsvolu(cTagV,"BOX ",idtmed[1308-1],parCha,kNparCha);
306       // Xe/Isobutane layer (drift volume) 
307       parCha[2] = fgkDrThick/2.;
308       sprintf(cTagV,"UJ%02d",iDet);
309       gMC->Gsvolu(cTagV,"BOX ",idtmed[1309-1],parCha,kNparCha);
310       // Xe/Isobutane layer (amplification volume)
311       parCha[2] = fgkAmThick/2.;
312       sprintf(cTagV,"UK%02d",iDet);
313       gMC->Gsvolu(cTagV,"BOX ",idtmed[1309-1],parCha,kNparCha);  
314       // Cu layer (pad plane)
315       parCha[2] = fgkCuThick/2;
316       sprintf(cTagV,"UL%02d",iDet);
317       gMC->Gsvolu(cTagV,"BOX ",idtmed[1305-1],parCha,kNparCha);
318       // G10 layer (support structure / honeycomb)
319       parCha[2] = fgkSuThick/2;
320       sprintf(cTagV,"UM%02d",iDet);
321       gMC->Gsvolu(cTagV,"BOX ",idtmed[1313-1],parCha,kNparCha);
322       // Cu layer (FEE + signal lines)
323       parCha[2] = fgkFeThick/2;
324       sprintf(cTagV,"UN%02d",iDet);
325       gMC->Gsvolu(cTagV,"BOX ",idtmed[1305-1],parCha,kNparCha);
326       // Al layer (cooling devices)
327       parCha[2] = fgkCoThick/2;
328       sprintf(cTagV,"UO%02d",iDet);
329       gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
330       // Water layer (cooling)
331       parCha[2] = fgkWaThick/2;
332       sprintf(cTagV,"UP%02d",iDet);
333       gMC->Gsvolu(cTagV,"BOX ",idtmed[1314-1],parCha,kNparCha);
334       if (fClengthPH[iplan][icham] > 0.0) {
335         // Rohacell layer (radiator)
336         parCha[2] = fgkRaThick/2;
337         sprintf(cTagV,"UH%02d",iDet+kNdet);
338         gMC->Gsvolu(cTagV,"BOX ",idtmed[1315-1],parCha,kNparCha);
339         // Mylar layer (entrance window + HV cathode) 
340         parCha[2] = fgkMyThick/2;
341         sprintf(cTagV,"UI%02d",iDet+kNdet);
342         gMC->Gsvolu(cTagV,"BOX ",idtmed[1308-1],parCha,kNparCha);
343         // Xe/Isobutane layer (drift volume) 
344         parCha[2] = fgkDrThick/2.;
345         sprintf(cTagV,"UJ%02d",iDet+kNdet);
346         gMC->Gsvolu(cTagV,"BOX ",idtmed[1309-1],parCha,kNparCha);
347         // Xe/Isobutane layer (amplification volume)
348         parCha[2] = fgkAmThick/2.;
349         sprintf(cTagV,"UK%02d",iDet+kNdet);
350         gMC->Gsvolu(cTagV,"BOX ",idtmed[1309-1],parCha,kNparCha);  
351         // Cu layer (pad plane)
352         parCha[2] = fgkCuThick/2;
353         sprintf(cTagV,"UL%02d",iDet+kNdet);
354         gMC->Gsvolu(cTagV,"BOX ",idtmed[1305-1],parCha,kNparCha);
355         // G10 layer (support structure / honeycomb)
356         parCha[2] = fgkSuThick/2;
357         sprintf(cTagV,"UM%02d",iDet+kNdet);
358         gMC->Gsvolu(cTagV,"BOX ",idtmed[1313-1],parCha,kNparCha);
359         // Cu layer (FEE + signal lines)
360         parCha[2] = fgkFeThick/2;
361         sprintf(cTagV,"UN%02d",iDet+kNdet);
362         gMC->Gsvolu(cTagV,"BOX ",idtmed[1305-1],parCha,kNparCha);
363         // Al layer (cooling devices)
364         parCha[2] = fgkCoThick/2;
365         sprintf(cTagV,"UO%02d",iDet+kNdet);
366         gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
367         // Water layer (cooling)
368         parCha[2] = fgkWaThick/2;
369         sprintf(cTagV,"UP%02d",iDet+kNdet);
370         gMC->Gsvolu(cTagV,"BOX ",idtmed[1314-1],parCha,kNparCha);
371       }
372       if (fClengthRH[iplan][icham] > 0.0) {
373         // Rohacell layer (radiator)
374         parCha[2] = fgkRaThick/2;
375         sprintf(cTagV,"UH%02d",iDet+2*kNdet);
376         gMC->Gsvolu(cTagV,"BOX ",idtmed[1315-1],parCha,kNparCha);
377         // Mylar layer (entrance window + HV cathode) 
378         parCha[2] = fgkMyThick/2;
379         sprintf(cTagV,"UI%02d",iDet+2*kNdet);
380         gMC->Gsvolu(cTagV,"BOX ",idtmed[1308-1],parCha,kNparCha);
381         // Xe/Isobutane layer (drift volume) 
382         parCha[2] = fgkDrThick/2.;
383         sprintf(cTagV,"UJ%02d",iDet+2*kNdet);
384         gMC->Gsvolu(cTagV,"BOX ",idtmed[1309-1],parCha,kNparCha);
385         // Xe/Isobutane layer (amplification volume)
386         parCha[2] = fgkAmThick/2.;
387         sprintf(cTagV,"UK%02d",iDet+2*kNdet);
388         gMC->Gsvolu(cTagV,"BOX ",idtmed[1309-1],parCha,kNparCha);  
389         // Cu layer (pad plane)
390         parCha[2] = fgkCuThick/2;
391         sprintf(cTagV,"UL%02d",iDet+2*kNdet);
392         gMC->Gsvolu(cTagV,"BOX ",idtmed[1305-1],parCha,kNparCha);
393         // G10 layer (support structure / honeycomb)
394         parCha[2] = fgkSuThick/2;
395         sprintf(cTagV,"UM%02d",iDet+2*kNdet);
396         gMC->Gsvolu(cTagV,"BOX ",idtmed[1313-1],parCha,kNparCha);
397         // Cu layer (FEE + signal lines)
398         parCha[2] = fgkFeThick/2;
399         sprintf(cTagV,"UN%02d",iDet+2*kNdet);
400         gMC->Gsvolu(cTagV,"BOX ",idtmed[1305-1],parCha,kNparCha);
401         // Al layer (cooling devices)
402         parCha[2] = fgkCoThick/2.;
403         sprintf(cTagV,"UO%02d",iDet+2*kNdet);
404         gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
405         // Water layer (cooling)
406         parCha[2] = fgkWaThick/2;
407         sprintf(cTagV,"UP%02d",iDet+2*kNdet);
408         gMC->Gsvolu(cTagV,"BOX ",idtmed[1314-1],parCha,kNparCha);
409       }
410
411       // Position the layers in the chambers
412       xpos = 0;
413       ypos = 0;
414       // Lower part
415       // Rohacell layer (radiator)
416       zpos = fgkRaZpos;
417       sprintf(cTagV,"UH%02d",iDet);
418       sprintf(cTagM,"UC%02d",iDet);
419       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
420       // Mylar layer (entrance window + HV cathode)   
421       zpos = fgkMyZpos;
422       sprintf(cTagV,"UI%02d",iDet);
423       sprintf(cTagM,"UC%02d",iDet);
424       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
425       // Xe/Isobutane layer (drift volume) 
426       zpos = fgkDrZpos;
427       sprintf(cTagV,"UJ%02d",iDet);
428       sprintf(cTagM,"UC%02d",iDet);
429       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
430       // Upper part
431       // Xe/Isobutane layer (amplification volume)
432       zpos = fgkAmZpos;
433       sprintf(cTagV,"UK%02d",iDet);
434       sprintf(cTagM,"UE%02d",iDet);
435       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
436       // Readout part
437       // Cu layer (pad plane)
438       zpos = fgkCuZpos; 
439       sprintf(cTagV,"UL%02d",iDet);
440       sprintf(cTagM,"UG%02d",iDet);
441       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
442       // G10 layer (support structure)
443       zpos = fgkSuZpos;
444       sprintf(cTagV,"UM%02d",iDet);
445       sprintf(cTagM,"UG%02d",iDet);
446       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
447       // Cu layer (FEE + signal lines)
448       zpos = fgkFeZpos; 
449       sprintf(cTagV,"UN%02d",iDet);
450       sprintf(cTagM,"UG%02d",iDet);
451       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
452       // Al layer (cooling devices)
453       zpos = fgkCoZpos;
454       sprintf(cTagV,"UO%02d",iDet);
455       sprintf(cTagM,"UG%02d",iDet);
456       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
457       // Water layer (cooling)
458       zpos = fgkWaZpos;
459       sprintf(cTagV,"UP%02d",iDet);
460       sprintf(cTagM,"UG%02d",iDet);
461       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
462       if (fClengthPH[iplan][icham] > 0.0) {
463         // Lower part
464         // Rohacell layer (radiator)
465         zpos = fgkRaZpos;
466         sprintf(cTagV,"UH%02d",iDet+kNdet);
467         sprintf(cTagM,"UC%02d",iDet+kNdet);
468         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
469         // Mylar layer (entrance window + HV cathode)   
470         zpos = fgkMyZpos;
471         sprintf(cTagV,"UI%02d",iDet+kNdet);
472         sprintf(cTagM,"UC%02d",iDet+kNdet);
473         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
474         // Xe/Isobutane layer (drift volume) 
475         zpos = fgkDrZpos;
476         sprintf(cTagV,"UJ%02d",iDet+kNdet);
477         sprintf(cTagM,"UC%02d",iDet+kNdet);
478         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
479         // Upper part
480         // Xe/Isobutane layer (amplification volume)
481         zpos = fgkAmZpos;
482         sprintf(cTagV,"UK%02d",iDet+kNdet);
483         sprintf(cTagM,"UE%02d",iDet+kNdet);
484         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
485         // Readout part
486         // Cu layer (pad plane)
487         zpos = fgkCuZpos; 
488         sprintf(cTagV,"UL%02d",iDet+kNdet);
489         sprintf(cTagM,"UG%02d",iDet+kNdet);
490         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
491         // G10 layer (support structure)
492         zpos = fgkSuZpos;
493         sprintf(cTagV,"UM%02d",iDet+kNdet);
494         sprintf(cTagM,"UG%02d",iDet+kNdet);
495         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
496         // Cu layer (FEE + signal lines)
497         zpos = fgkFeZpos; 
498         sprintf(cTagV,"UN%02d",iDet+kNdet);
499         sprintf(cTagM,"UG%02d",iDet+kNdet);
500         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
501         // Al layer (cooling devices)
502         zpos = fgkCoZpos;
503         sprintf(cTagV,"UO%02d",iDet+kNdet);
504         sprintf(cTagM,"UG%02d",iDet+kNdet);
505         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
506         // Water layer (cooling)
507         zpos = fgkWaZpos;
508         sprintf(cTagV,"UP%02d",iDet+kNdet);
509         sprintf(cTagM,"UG%02d",iDet+kNdet);
510         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
511       }
512       if (fClengthRH[iplan][icham] > 0.0) {
513         // Lower part
514         // Rohacell layer (radiator)
515         zpos = fgkRaZpos;
516         sprintf(cTagV,"UH%02d",iDet+2*kNdet);
517         sprintf(cTagM,"UC%02d",iDet+2*kNdet);
518         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
519         // Mylar layer (entrance window + HV cathode)   
520         zpos = fgkMyZpos;
521         sprintf(cTagV,"UI%02d",iDet+2*kNdet);
522         sprintf(cTagM,"UC%02d",iDet+2*kNdet);
523         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
524         // Xe/Isobutane layer (drift volume) 
525         zpos = fgkDrZpos;
526         sprintf(cTagV,"UJ%02d",iDet+2*kNdet);
527         sprintf(cTagM,"UC%02d",iDet+2*kNdet);
528         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
529         // Upper part
530         // Xe/Isobutane layer (amplification volume)
531         zpos = fgkAmZpos;
532         sprintf(cTagV,"UK%02d",iDet+2*kNdet);
533         sprintf(cTagM,"UE%02d",iDet+2*kNdet);
534         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
535         // Readout part
536         // Cu layer (pad plane)
537         zpos = fgkCuZpos; 
538         sprintf(cTagV,"UL%02d",iDet+2*kNdet);
539         sprintf(cTagM,"UG%02d",iDet+2*kNdet);
540         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
541         // G10 layer (support structure)
542         zpos = fgkSuZpos;
543         sprintf(cTagV,"UM%02d",iDet+2*kNdet);
544         sprintf(cTagM,"UG%02d",iDet+2*kNdet);
545         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
546         // Cu layer (FEE + signal lines)
547         zpos = fgkFeZpos; 
548         sprintf(cTagV,"UN%02d",iDet+2*kNdet);
549         sprintf(cTagM,"UG%02d",iDet+2*kNdet);
550         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
551         // Al layer (cooling devices)
552         zpos = fgkCoZpos;
553         sprintf(cTagV,"UO%02d",iDet+2*kNdet);
554         sprintf(cTagM,"UG%02d",iDet+2*kNdet);
555         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
556         // Water layer (cooling)
557         zpos = fgkWaZpos;
558         sprintf(cTagV,"UP%02d",iDet+2*kNdet);
559         sprintf(cTagM,"UG%02d",iDet+2*kNdet);
560         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
561       }
562
563       // Position the inner volumes of the chambers in the frames
564       xpos      = 0.0;
565       ypos      = 0.0;
566       zpos      = 0.0;
567       // The inside of the lower G10 frame
568       sprintf(cTagV,"UC%02d",iDet);
569       sprintf(cTagM,"UB%02d",iDet);
570       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
571       // The lower G10 frame inside the aluminum frame
572       sprintf(cTagV,"UB%02d",iDet);
573       sprintf(cTagM,"UA%02d",iDet);
574       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
575       // The inside of the upper G10 frame
576       sprintf(cTagV,"UE%02d",iDet);
577       sprintf(cTagM,"UD%02d",iDet);
578       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
579       // The inside of the upper aluminum frame
580       sprintf(cTagV,"UG%02d",iDet);
581       sprintf(cTagM,"UF%02d",iDet);
582       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");      
583       if (fClengthPH[iplan][icham] > 0.0) {
584         // The inside of the lower G10 frame
585         sprintf(cTagV,"UC%02d",iDet+kNdet);
586         sprintf(cTagM,"UB%02d",iDet+kNdet);
587         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
588         // The lower G10 frame inside the aluminum frame
589         sprintf(cTagV,"UB%02d",iDet+kNdet);
590         sprintf(cTagM,"UA%02d",iDet+kNdet);
591         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
592         // The inside of the upper G10 frame
593         sprintf(cTagV,"UE%02d",iDet+kNdet);
594         sprintf(cTagM,"UD%02d",iDet+kNdet);
595         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
596         // The inside of the upper aluminum frame
597         sprintf(cTagV,"UG%02d",iDet+kNdet);
598         sprintf(cTagM,"UF%02d",iDet+kNdet);
599         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");      
600       }
601       if (fClengthRH[iplan][icham] > 0.0) {
602         // The inside of the lower G10 frame
603         sprintf(cTagV,"UC%02d",iDet+2*kNdet);
604         sprintf(cTagM,"UB%02d",iDet+2*kNdet);
605         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
606         // The lower G10 frame inside the aluminum frame
607         sprintf(cTagV,"UB%02d",iDet+2*kNdet);
608         sprintf(cTagM,"UA%02d",iDet+2*kNdet);
609         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
610         // The inside of the upper G10 frame
611         sprintf(cTagV,"UE%02d",iDet+2*kNdet);
612         sprintf(cTagM,"UD%02d",iDet+2*kNdet);
613         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
614         // The inside of the upper aluminum frame
615         sprintf(cTagV,"UG%02d",iDet+2*kNdet);
616         sprintf(cTagM,"UF%02d",iDet+2*kNdet);
617         gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");      
618       }
619
620       // Position the frames of the chambers in the TRD mother volume
621       xpos  = 0.;
622       ypos  = - fClength[iplan][0] - fClength[iplan][1] - fClength[iplan][2]/2.;
623       for (Int_t ic = 0; ic < icham; ic++) {
624         ypos += fClength[iplan][ic];        
625       }
626       ypos += fClength[iplan][icham]/2.;
627       zpos  = fgkCraH/2. + fgkCdrH/2. - fgkSheight/2. + iplan * (fgkCH + fgkVspace);
628       // The lower aluminum frame, radiator + drift region
629       sprintf(cTagV,"UA%02d",iDet);
630       gMC->Gspos(cTagV,1,"UTR1",xpos,ypos,zpos,0,"ONLY");
631       // The upper G10 frame, amplification region
632       sprintf(cTagV,"UD%02d",iDet);
633       zpos += fgkCamH/2. + fgkCraH/2. + fgkCdrH/2.;
634       gMC->Gspos(cTagV,1,"UTR1",xpos,ypos,zpos,0,"ONLY");
635       // The upper aluminum frame
636       sprintf(cTagV,"UF%02d",iDet);
637       zpos += fgkCroH/2. + fgkCamH/2.;
638       gMC->Gspos(cTagV,1,"UTR1",xpos,ypos,zpos,0,"ONLY");
639       if (fClengthPH[iplan][icham] > 0.0) {
640         xpos  = 0.;
641         ypos  = - fgkSlenTR2/2.;
642         for (Int_t ic = 0; ic < icham; ic++) {
643           ypos += fClengthPH[iplan][ic];        
644         }
645         ypos += fClengthPH[iplan][icham]/2.;
646         zpos  = fgkCraH/2. + fgkCdrH/2. - fgkSheight/2. + iplan * (fgkCH + fgkVspace);
647         // The lower aluminum frame, radiator + drift region
648         sprintf(cTagV,"UA%02d",iDet+kNdet);
649         gMC->Gspos(cTagV,1,"UTR2",xpos,ypos,zpos,0,"ONLY");
650         // The upper G10 frame, amplification region
651         sprintf(cTagV,"UD%02d",iDet+kNdet);
652         zpos += fgkCamH/2. + fgkCraH/2. + fgkCdrH/2.;
653         gMC->Gspos(cTagV,1,"UTR2",xpos,ypos,zpos,0,"ONLY");
654         // The upper aluminum frame
655         sprintf(cTagV,"UF%02d",iDet+kNdet);
656         zpos += fgkCroH/2. + fgkCamH/2.;
657         gMC->Gspos(cTagV,1,"UTR2",xpos,ypos,zpos,0,"ONLY");
658       }
659       if (fClengthRH[iplan][icham] > 0.0) {
660         xpos  = 0.;
661         ypos  = - fgkSlenTR3/2.;
662         for (Int_t ic = 0; ic < icham; ic++) {
663           ypos += fClengthRH[iplan][ic];        
664         }
665         ypos += fClengthRH[iplan][icham]/2.;
666         zpos  = fgkCraH/2. + fgkCdrH/2. - fgkSheight/2. + iplan * (fgkCH + fgkVspace);
667         // The lower aluminum frame, radiator + drift region
668         sprintf(cTagV,"UA%02d",iDet+2*kNdet);
669         gMC->Gspos(cTagV,1,"UTR3",xpos,ypos,zpos,0,"ONLY");
670         // The upper G10 frame, amplification region
671         sprintf(cTagV,"UD%02d",iDet+2*kNdet);
672         zpos += fgkCamH/2. + fgkCraH/2. + fgkCdrH/2.;
673         gMC->Gspos(cTagV,1,"UTR3",xpos,ypos,zpos,0,"ONLY");
674         // The upper aluminum frame
675         sprintf(cTagV,"UF%02d",iDet+2*kNdet);
676         zpos += fgkCroH/2. + fgkCamH/2.;
677         gMC->Gspos(cTagV,1,"UTR3",xpos,ypos,zpos,0,"ONLY");
678       }
679
680     }
681   }
682
683   xpos = 0.;
684   ypos = 0.;
685   zpos = 0.;
686   gMC->Gspos("UTR1",1,"BTR1",xpos,ypos,zpos,0,"ONLY");
687   gMC->Gspos("UTR2",2,"BTR2",xpos,ypos,zpos,0,"ONLY");
688   gMC->Gspos("UTR3",3,"BTR3",xpos,ypos,zpos,0,"ONLY");
689
690 }
691
692 //_____________________________________________________________________________
693 void AliTRDgeometryHole::SetOldGeometry()
694 {
695   //
696   // Use the old chamber lengths
697   //
698
699   Int_t icham;
700   Int_t iplan;
701
702   AliTRDgeometry::SetOldGeometry();
703
704   // The outer lengths of the chambers for the sectors with holes for the PHOS
705   Float_t lengthPH[kNplan][kNcham] = { {   0.0,   0.0,   0.0, 116.5, 123.5 }
706                                      , {   0.0,   0.0,   0.0, 124.0, 131.0 }
707                                      , {   0.0,   0.0,   0.0, 131.5, 134.5 }
708                                      , {   0.0,   0.0,   0.0, 139.0, 142.0 }
709                                      , {   0.0,   0.0,   0.0, 146.0, 142.0 }
710                                      , {   0.0,   0.0,   0.0, 153.5, 134.5 } };
711
712   // The outer lengths of the chambers for the sectors with holes for the RICH
713   Float_t lengthRH[kNplan][kNcham] = { {   0.0,   0.0,   0.0,   0.0,  86.5 }
714                                      , {   0.0,   0.0,   0.0,   0.0, 101.5 }
715                                      , {   0.0,   0.0,   0.0,   0.0, 112.5 }
716                                      , {   0.0,   0.0,   0.0,   0.0, 127.5 }
717                                      , {   0.0,   0.0,   0.0,   0.0, 134.5 }
718                                      , {   0.0,   0.0,   0.0,   0.0, 134.5 } };
719
720   for (icham = 0; icham < kNcham; icham++) {
721     for (iplan = 0; iplan < kNplan; iplan++) {
722       fClengthPH[iplan][icham] = lengthPH[iplan][icham];
723       fClengthRH[iplan][icham] = lengthRH[iplan][icham];
724     }
725   }
726
727 }
728
729
730