Avoid few more warnings on SunOS
[u/mrichter/AliRoot.git] / TRD / AliTRD.cxx
1 ///////////////////////////////////////////////////////////////////////////////
2 //                                                                           //
3 //  Transition Radiation Detector                                            //
4 //  This class contains the basic functions for the Transition Radiation     //
5 //  detector. Functions specific to one particular geometry are              //
6 //  contained in the derived classes                                         //
7 //                                                                           //
8 //Begin_Html
9 /*
10 <img src="picts/AliTRDClass.gif">
11 */
12 //End_Html
13 //                                                                           //
14 //                                                                           //
15 ///////////////////////////////////////////////////////////////////////////////
16
17 #include <stdlib.h>
18
19 #include <TMath.h>
20 #include <TNode.h>
21 #include <TPGON.h> 
22
23 #include "AliTRD.h"
24 #include "AliRun.h"
25
26 #include "AliConst.h"
27  
28 ClassImp(AliTRD)
29  
30 //_____________________________________________________________________________
31 AliTRD::AliTRD()
32 {
33   //
34   // Default constructor
35   //
36
37   fIshunt      = 0;
38   fGasMix      = 0;
39
40   // The chamber dimensions
41   for (Int_t iplan = 0; iplan < kNplan; iplan++) {
42     fClengthI[iplan] = 0.;
43     fClengthM[iplan] = 0.;
44     fClengthO[iplan] = 0.;
45   }
46
47 }
48  
49 //_____________________________________________________________________________
50 AliTRD::AliTRD(const char *name, const char *title)
51        : AliDetector(name,title)
52 {
53   //
54   // Standard constructor for the TRD
55   //
56
57
58   // Check that FRAME is there otherwise we have no place where to put the TRD
59   AliModule* FRAME = gAlice->GetModule("FRAME");
60   if (!FRAME) {
61     Error("AliTRD","TRD needs FRAME to be present\n");
62     exit(1);
63   }
64
65   // Allocate the hit array
66   fHits   = new TClonesArray("AliTRDhit",  405);
67   
68   fIshunt = 0;
69   fGasMix = 0;
70
71   // The chamber dimensions
72   for (Int_t iplan = 0; iplan < kNplan; iplan++) {
73     fClengthI[iplan] = 0.;
74     fClengthM[iplan] = 0.;
75     fClengthO[iplan] = 0.;
76     fCwidth[iplan]   = 0.;
77   }
78   
79   SetMarkerColor(kWhite);   
80
81 }
82  
83 //_____________________________________________________________________________
84 void AliTRD::AddHit(Int_t track, Int_t *vol, Float_t *hits)
85 {
86   //
87   // Add a hit for the TRD
88   //
89
90   TClonesArray &lhits = *fHits;
91   new(lhits[fNhits++]) AliTRDhit(fIshunt,track,vol,hits);
92
93 }
94
95 //_____________________________________________________________________________
96 void AliTRD::BuildGeometry()
97 {
98   //
99   // Create the ROOT TNode geometry for the TRD
100   //
101
102   TNode *Node, *Top;
103   TPGON *pgon;
104   const Int_t kColorTRD = 46;
105   
106   // Find the top node alice
107   Top = gAlice->GetGeometry()->GetNode("alice");
108   
109   pgon = new TPGON("S_TRD","TRD","void",0,360,kNsect,4);
110   Float_t ff    = TMath::Cos(kDegrad * 180 / kNsect);
111   Float_t rrmin = kRmin / ff;
112   Float_t rrmax = kRmax / ff;
113   pgon->DefineSection(0,-kZmax1,rrmax,rrmax);
114   pgon->DefineSection(1,-kZmax2,rrmin,rrmax);
115   pgon->DefineSection(2, kZmax2,rrmin,rrmax);
116   pgon->DefineSection(3, kZmax1,rrmax,rrmax);
117   Top->cd();
118   Node = new TNode("TRD","TRD","S_TRD",0,0,0,"");
119   Node->SetLineColor(kColorTRD);
120   fNodes->Add(Node);
121
122 }
123  
124 //_____________________________________________________________________________
125 void AliTRD::CreateGeometry()
126 {
127   //
128   // Creates the volumes for the TRD chambers
129   //
130   // Author: Christoph Blume (C.Blume@gsi.de) 20/07/99
131   //
132   // The volumes:
133   //    TRD        (Air)   --- The TRD mother volume for one sector. 
134   //                           To be placed into the spaceframe.
135   //
136   //    UAFI(/M/O) (Al)    --- The aluminum frame of the inner(/middle/outer) chambers (readout)
137   //    UCFI(/M/O) (C)     --- The carbon frame of the inner(/middle/outer) chambers 
138   //                           (driftchamber + radiator)
139   //    UAII(/M/O) (Air)   --- The inner part of the readout of the inner(/middle/outer) chambers
140   //    UFII(/M/O) (Air)   --- The inner part of the chamner and radiator of the 
141   //                           inner(/middle/outer) chambers
142   //
143   // The material layers in one chamber:
144   //    UL01       (G10)   --- The gas seal of the radiator
145   //    UL02       (CO2)   --- The gas in the radiator
146   //    UL03       (PE)    --- The foil stack
147   //    UL04       (Mylar) --- Entrance window to the driftvolume and HV-cathode
148   //    UL05       (Xe)    --- The driftvolume
149   //    UL06       (Xe)    --- The amplification region
150   //    
151   //    UL07       (Cu)    --- The pad plane
152   //    UL08       (G10)   --- The Nomex honeycomb support structure
153   //    UL09       (Cu)    --- FEE and signal lines
154   //    UL10       (PE)    --- The cooling devices
155   //    UL11       (Water) --- The cooling water
156
157   // Check that FRAME is there otherwise we have no place where to put the TRD
158   AliModule* FRAME = gAlice->GetModule("FRAME");
159   if (!FRAME) return;
160
161   const Int_t npar_trd = 4;
162   const Int_t npar_cha = 3;
163
164   Float_t par_dum[3];
165   Float_t par_trd[npar_trd];
166   Float_t par_cha[npar_cha];
167   Int_t iplan;
168
169   Float_t xpos, ypos, zpos;
170
171   Int_t *idtmed = fIdtmed->GetArray()-1299;
172
173   // The length of the inner chambers
174   for (iplan = 0; iplan < kNplan; iplan++) fClengthI[iplan] = 110.0;
175   // The length of the middle chambers
176   fClengthM[0] = 123.5;
177   fClengthM[1] = 131.0;
178   fClengthM[2] = 138.5;
179   fClengthM[3] = 146.0;
180   fClengthM[4] = 153.0;
181   fClengthM[5] = 160.5;
182   // The length of the outer chambers
183   fClengthO[0] = 123.5;
184   fClengthO[1] = 131.0;
185   fClengthO[2] = 134.5;
186   fClengthO[3] = 142.0;
187   fClengthO[4] = 142.0;
188   fClengthO[5] = 134.5;
189
190   // The width of the chambers
191   fCwidth[0] =  99.6;
192   fCwidth[1] = 104.1;
193   fCwidth[2] = 108.5;
194   fCwidth[3] = 112.9;
195   fCwidth[4] = 117.4;
196   fCwidth[5] = 121.8;
197
198   // The TRD mother volume for one sector (Air) (dimensions identical to BTR1-3)
199   par_trd[0] = kSwidth1/2.;
200   par_trd[1] = kSwidth2/2.;
201   par_trd[2] = kSlength/2.;
202   par_trd[3] = kSheight/2.;
203   gMC->Gsvolu("TRD ","TRD1",idtmed[1302-1],par_trd,npar_trd);
204
205   // The aluminum frames - readout + electronics (Al)
206   // The inner chambers
207   gMC->Gsvolu("UAFI","BOX ",idtmed[1301-1],par_dum,0);
208   // The middle chambers
209   gMC->Gsvolu("UAFM","BOX ",idtmed[1301-1],par_dum,0);
210   // The outer chambers
211   gMC->Gsvolu("UAFO","BOX ",idtmed[1301-1],par_dum,0);
212
213   // The inner part of the aluminum frames (Air)
214   // The inner chambers
215   gMC->Gsvolu("UAII","BOX ",idtmed[1302-1],par_dum,0);
216   // The middle chambers
217   gMC->Gsvolu("UAIM","BOX ",idtmed[1302-1],par_dum,0);
218   // The outer chambers
219   gMC->Gsvolu("UAIO","BOX ",idtmed[1302-1],par_dum,0);
220
221   // The carbon frames - radiator + driftchamber (C)
222   // The inner chambers
223   gMC->Gsvolu("UCFI","BOX ",idtmed[1307-1],par_dum,0);
224   // The middle chambers
225   gMC->Gsvolu("UCFM","BOX ",idtmed[1307-1],par_dum,0);
226   // The outer chambers
227   gMC->Gsvolu("UCFO","BOX ",idtmed[1307-1],par_dum,0);
228
229   // The inner part of the carbon frames (Air)
230   // The inner chambers
231   gMC->Gsvolu("UCII","BOX ",idtmed[1302-1],par_dum,0);
232   // The middle chambers
233   gMC->Gsvolu("UCIM","BOX ",idtmed[1302-1],par_dum,0);
234   // The outer chambers
235   gMC->Gsvolu("UCIO","BOX ",idtmed[1302-1],par_dum,0);
236
237   // The material layers inside the chambers
238   par_cha[0] = -1.;
239   par_cha[1] = -1.;
240   // G10 layer (radiator seal)
241   par_cha[2] = kSeThick/2;
242   gMC->Gsvolu("UL01","BOX ",idtmed[1313-1],par_cha,npar_cha);
243   // CO2 layer (radiator)
244   par_cha[2] = kRaThick/2;
245   gMC->Gsvolu("UL02","BOX ",idtmed[1312-1],par_cha,npar_cha);
246   // PE layer (radiator)
247   par_cha[2] = kPeThick/2;
248   gMC->Gsvolu("UL03","BOX ",idtmed[1303-1],par_cha,npar_cha);
249   // Mylar layer (entrance window + HV cathode) 
250   par_cha[2] = kMyThick/2;
251   gMC->Gsvolu("UL04","BOX ",idtmed[1308-1],par_cha,npar_cha);
252   // Xe/Isobutane layer (drift volume, sensitive) 
253   par_cha[2] = kDrThick/2.;
254   gMC->Gsvolu("UL05","BOX ",idtmed[1309-1],par_cha,npar_cha);
255   // Xe/Isobutane layer (amplification volume, not sensitive)
256   par_cha[2] = kAmThick/2.;
257   gMC->Gsvolu("UL06","BOX ",idtmed[1309-1],par_cha,npar_cha);
258   
259   // Cu layer (pad plane)
260   par_cha[2] = kCuThick/2;
261   gMC->Gsvolu("UL07","BOX ",idtmed[1305-1],par_cha,npar_cha);
262   // G10 layer (support structure)
263   par_cha[2] = kSuThick/2;
264   gMC->Gsvolu("UL08","BOX ",idtmed[1313-1],par_cha,npar_cha);
265   // Cu layer (FEE + signal lines)
266   par_cha[2] = kFeThick/2;
267   gMC->Gsvolu("UL09","BOX ",idtmed[1305-1],par_cha,npar_cha);
268   // PE layer (cooling devices)
269   par_cha[2] = kCoThick/2;
270   gMC->Gsvolu("UL10","BOX ",idtmed[1303-1],par_cha,npar_cha);
271   // Water layer (cooling)
272   par_cha[2] = kWaThick/2;
273   gMC->Gsvolu("UL11","BOX ",idtmed[1314-1],par_cha,npar_cha);
274
275   // Position the layers in the chambers
276   xpos = 0;
277   ypos = 0;
278
279   // G10 layer (radiator seal)
280   zpos = kSeZpos;
281   gMC->Gspos("UL01",1,"UCII",xpos,ypos,zpos,0,"ONLY");
282   gMC->Gspos("UL01",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
283   gMC->Gspos("UL01",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
284   // CO2 layer (radiator)
285   zpos = kRaZpos;
286   gMC->Gspos("UL02",1,"UCII",xpos,ypos,zpos,0,"ONLY");
287   gMC->Gspos("UL02",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
288   gMC->Gspos("UL02",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
289   // PE layer (radiator)
290   zpos = 0;
291   gMC->Gspos("UL03",1,"UL02",xpos,ypos,zpos,0,"ONLY");
292   // Mylar layer (entrance window + HV cathode)   
293   zpos = kMyZpos;
294   gMC->Gspos("UL04",1,"UCII",xpos,ypos,zpos,0,"ONLY");
295   gMC->Gspos("UL04",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
296   gMC->Gspos("UL04",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
297   // Xe/Isobutane layer (drift volume) 
298   zpos = kDrZpos;
299   gMC->Gspos("UL05",1,"UCII",xpos,ypos,zpos,0,"ONLY");
300   gMC->Gspos("UL05",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
301   gMC->Gspos("UL05",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
302   // Xe/Isobutane layer (amplification volume)
303   zpos = kAmZpos;
304   gMC->Gspos("UL06",1,"UCII",xpos,ypos,zpos,0,"ONLY");
305   gMC->Gspos("UL06",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
306   gMC->Gspos("UL06",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
307
308   // Cu layer (pad plane)
309   zpos = kCuZpos;
310   gMC->Gspos("UL07",1,"UAII",xpos,ypos,zpos,0,"ONLY");
311   gMC->Gspos("UL07",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
312   gMC->Gspos("UL07",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
313   // G10 layer (support structure)
314   zpos = kSuZpos;
315   gMC->Gspos("UL08",1,"UAII",xpos,ypos,zpos,0,"ONLY");
316   gMC->Gspos("UL08",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
317   gMC->Gspos("UL08",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
318   // Cu layer (FEE + signal lines)
319   zpos = kFeZpos; 
320   gMC->Gspos("UL09",1,"UAII",xpos,ypos,zpos,0,"ONLY");
321   gMC->Gspos("UL09",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
322   gMC->Gspos("UL09",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
323   // PE layer (cooling devices)
324   zpos = kCoZpos;
325   gMC->Gspos("UL10",1,"UAII",xpos,ypos,zpos,0,"ONLY");
326   gMC->Gspos("UL10",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
327   gMC->Gspos("UL10",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
328   // Water layer (cooling)
329   zpos = kWaZpos;
330   gMC->Gspos("UL11",1,"UAII",xpos,ypos,zpos,0,"ONLY");
331   gMC->Gspos("UL11",1,"UAIM",xpos,ypos,zpos,0,"ONLY");
332   gMC->Gspos("UL11",1,"UAIO",xpos,ypos,zpos,0,"ONLY");
333
334   // Position the chambers in the TRD mother volume
335   for (iplan = 1; iplan <= kNplan; iplan++) {
336
337     // The inner chambers ---------------------------------------------------------------
338
339     // the aluminum frame
340     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2.;
341     par_cha[0] = fCwidth[iplan-1]/2.;
342     par_cha[1] = fClengthI[iplan-1]/2.;
343     par_cha[2] = kCaframe/2.;
344     xpos       = 0.;
345     ypos       = 0.;
346     zpos       = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
347     gMC->Gsposp("UAFI",iplan       ,"TRD ",xpos,ypos,zpos,0,"MANY",par_cha,npar_cha);
348
349     // the inner part of the aluminum frame
350     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2. - kCathick;
351     par_cha[0] = fCwidth[iplan-1]/2.   - kCathick;
352     par_cha[1] = fClengthI[iplan-1]/2. - kCathick;
353     par_cha[2] = kCaframe/2.;
354     xpos       = 0.;
355     ypos       = 0.;
356     zpos       = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
357     gMC->Gsposp("UAII",iplan       ,"TRD ",xpos,ypos,zpos,0,"ONLY",par_cha,npar_cha);
358
359     // the carbon frame
360     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2.;
361     par_cha[0] = fCwidth[iplan-1]/2.;
362     par_cha[1] = fClengthI[iplan-1]/2.;
363     par_cha[2] = kCcframe/2.;
364     xpos       = 0.;
365     ypos       = 0.;
366     zpos       = kCcframe/2.            - kSheight/2. + (iplan-1) * (kCheight + kCspace);
367     gMC->Gsposp("UCFI",iplan       ,"TRD ",xpos,ypos,zpos,0,"MANY",par_cha,npar_cha);
368
369     // the inner part of the carbon frame
370     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2. - kCcthick;
371     par_cha[0] = fCwidth[iplan-1]/2.   - kCcthick;
372     par_cha[1] = fClengthI[iplan-1]/2. - kCcthick;
373     par_cha[2] = kCcframe/2.;
374     xpos       = 0.;
375     ypos       = 0.;
376     zpos       = kCcframe/2.            - kSheight/2. + (iplan-1) * (kCheight + kCspace);
377     gMC->Gsposp("UCII",iplan       ,"TRD ",xpos,ypos,zpos,0,"ONLY",par_cha,npar_cha);
378
379     // The middle chambers --------------------------------------------------------------
380
381     // the aluminum frame
382     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2.;
383     par_cha[0] = fCwidth[iplan-1]/2.;
384     par_cha[1] = fClengthM[iplan-1]/2.;
385     par_cha[2] = kCaframe/2.;
386     xpos       = 0.;
387     ypos       = fClengthI[iplan-1]/2. + fClengthM[iplan-1]/2.;
388     zpos       = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
389     gMC->Gsposp("UAFM",iplan       ,"TRD ",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
390     gMC->Gsposp("UAFM",iplan+kNplan,"TRD ",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha);
391
392     // the inner part of the aluminum frame
393     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2. - kCathick;
394     par_cha[0] = fCwidth[iplan-1]/2.   - kCathick;
395     par_cha[1] = fClengthM[iplan-1]/2. - kCathick;
396     par_cha[2] = kCaframe/2.;
397     xpos       = 0.;
398     ypos       = fClengthI[iplan-1]/2. + fClengthM[iplan-1]/2.;
399     zpos       = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
400     gMC->Gsposp("UAIM",iplan       ,"TRD ",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
401     gMC->Gsposp("UAIM",iplan+kNplan,"TRD ",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha);
402
403     // the carbon frame
404     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2.;
405     par_cha[0] = fCwidth[iplan-1]/2.;
406     par_cha[1] = fClengthM[iplan-1]/2.;
407     par_cha[2] = kCcframe/2.;
408     xpos       = 0.;
409     ypos       = fClengthI[iplan-1]/2. + fClengthM[iplan-1]/2.;
410     zpos       = kCcframe/2.            - kSheight/2. + (iplan-1) * (kCheight + kCspace);
411     gMC->Gsposp("UCFM",iplan,       "TRD ",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
412     gMC->Gsposp("UCFM",iplan+kNplan,"TRD ",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha);
413
414     // the inner part of the carbon frame
415     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2. - kCcthick;
416     par_cha[0] = fCwidth[iplan-1]/2.   - kCcthick;
417     par_cha[1] = fClengthM[iplan-1]/2. - kCcthick;
418     par_cha[2] = kCcframe/2.;
419     xpos       = 0.;
420     ypos       = fClengthI[iplan-1]/2. + fClengthM[iplan-1]/2.;
421     zpos       = kCcframe/2.            - kSheight/2. + (iplan-1) * (kCheight + kCspace);
422     gMC->Gsposp("UCIM",iplan       ,"TRD ",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
423     gMC->Gsposp("UCIM",iplan+kNplan,"TRD ",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha);
424
425     // The outer chambers ---------------------------------------------------------------
426
427     // the aluminum frame
428     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2.;
429     par_cha[0] = fCwidth[iplan-1]/2.;
430     par_cha[1] = fClengthO[iplan-1]/2.;
431     par_cha[2] = kCaframe/2.;
432     xpos       = 0.;
433     ypos       = fClengthI[iplan-1]/2. + fClengthM[iplan-1]    + fClengthO[iplan-1]/2.;
434     zpos       = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
435     gMC->Gsposp("UAFO",iplan       ,"TRD ",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
436     gMC->Gsposp("UAFO",iplan+kNplan,"TRD ",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha);
437
438     // the inner part of the aluminum frame
439     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2. - kCathick;
440     par_cha[0] = fCwidth[iplan-1]/2.   - kCathick;
441     par_cha[1] = fClengthO[iplan-1]/2.  - kCathick;
442     par_cha[2] = kCaframe/2.;
443     xpos       = 0.;
444     ypos       = fClengthI[iplan-1]/2. + fClengthM[iplan-1]    + fClengthO[iplan-1]/2.;
445     zpos       = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
446     gMC->Gsposp("UAIO",iplan       ,"TRD ",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
447     gMC->Gsposp("UAIO",iplan+kNplan,"TRD ",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha);
448
449     // the carbon frame
450     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2.;
451     par_cha[0] = fCwidth[iplan-1]/2.;
452     par_cha[1] = fClengthO[iplan-1]/2.;
453     par_cha[2] = kCcframe/2.;
454     xpos       = 0.;
455     ypos       = fClengthI[iplan-1]/2. + fClengthM[iplan-1]    + fClengthO[iplan-1]/2.;
456     zpos       = kCcframe/2.            - kSheight/2. + (iplan-1) * (kCheight + kCspace);
457     gMC->Gsposp("UCFO",iplan,       "TRD ",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
458     gMC->Gsposp("UCFO",iplan+kNplan,"TRD ",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha);
459
460     // the inner part of the carbon frame
461     //par_cha[0] = kSwidth1/2. + (iplan-1) * kCwidcha/2. - kCcthick;
462     par_cha[0] = fCwidth[iplan-1]/2.   - kCcthick;
463     par_cha[1] = fClengthO[iplan-1]/2. - kCcthick;
464     par_cha[2] = kCcframe/2.;
465     xpos       = 0.;
466     ypos       = fClengthI[iplan-1]/2. + fClengthM[iplan-1]    + fClengthO[iplan-1]/2.;
467     zpos       = kCcframe/2.            - kSheight/2. + (iplan-1) * (kCheight + kCspace);
468     gMC->Gsposp("UCIO",iplan       ,"TRD ",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
469     gMC->Gsposp("UCIO",iplan+kNplan,"TRD ",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha);
470
471   }
472
473 }
474  
475 //_____________________________________________________________________________
476 void AliTRD::CreateMaterials()
477 {
478   //
479   // Create the materials for the TRD
480   // Origin Y.Foka
481   //
482
483   Int_t   ISXFLD = gAlice->Field()->Integ();
484   Float_t SXMGMX = gAlice->Field()->Max();
485   
486   // For polyethilene (CH2) 
487   Float_t ape[2] = { 12., 1. };
488   Float_t zpe[2] = {  6., 1. };
489   Float_t wpe[2] = {  1., 2. };
490   Float_t dpe    = 0.95;
491
492   // For mylar (C5H4O2) 
493   Float_t amy[3] = { 12., 1., 16. };
494   Float_t zmy[3] = {  6., 1.,  8. };
495   Float_t wmy[3] = {  5., 4.,  2. };
496   Float_t dmy    = 1.39;
497
498   // For CO2 
499   Float_t aco[2] = { 12., 16. };
500   Float_t zco[2] = {  6.,  8. };
501   Float_t wco[2] = {  1.,  2. };
502   Float_t dco    = 0.001977;
503
504   // For water
505   Float_t awa[2] = {  1., 16. };
506   Float_t zwa[2] = {  1.,  8. };
507   Float_t wwa[2] = {  2.,  1. };
508   Float_t dwa    = 1.0;
509
510   // For isobutane (C4H10)
511   Float_t ais[2] = { 12.,  1. };
512   Float_t zis[2] = {  6.,  1. };
513   Float_t wis[2] = {  4., 10. };
514   Float_t dis    = 0.00267;
515
516   // For Xe/CO2-gas-mixture 
517   // Xe-content of the Xe/CO2-mixture (90% / 10%) 
518   Float_t fxc    = .90;
519   // Xe-content of the Xe/Isobutane-mixture (97% / 3%) 
520   Float_t fxi    = .97;
521   Float_t dxe    = .005858;
522   
523   // General tracking parameter
524   Float_t tmaxfd = -10.;
525   Float_t stemax = -1e10;
526   Float_t deemax = -0.1;
527   Float_t epsil  =  1e-4;
528   Float_t stmin  = -0.001;
529   
530   Float_t absl, radl, d, buf[1];
531   Float_t agm[2], dgm, zgm[2], wgm[2];
532   Int_t   nbuf;
533   
534   //////////////////////////////////////////////////////////////////////////
535   //     Define Materials 
536   //////////////////////////////////////////////////////////////////////////
537
538   AliMaterial( 1, "Al $",  26.98, 13.0, 2.7     ,     8.9 ,    37.2);
539   AliMaterial( 2, "Air$",  14.61,  7.3, 0.001205, 30420.0 , 67500.0);
540   AliMaterial( 4, "Xe $", 131.29, 54.0, dxe     ,  1447.59,     0.0);
541   AliMaterial( 5, "Cu $",  63.54, 29.0, 8.96    ,     1.43,    14.8);
542   AliMaterial( 6, "C  $",  12.01,  6.0, 2.265   ,    18.8 ,    74.4);
543   AliMaterial(12, "G10$",  20.00, 10.0, 1.7     ,    19.4 ,   999.0);
544
545   // Mixtures 
546   AliMixture(3, "Polyethilene$",   ape, zpe, dpe, -2, wpe);
547   AliMixture(7, "Mylar$",          amy, zmy, dmy, -3, wmy);
548   AliMixture(8, "CO2$",            aco, zco, dco, -2, wco);
549   AliMixture(9, "Isobutane$",      ais, zis, dis, -2, wis);
550   AliMixture(13,"Water$",          awa, zwa, dwa, -2, wwa);
551
552   // Gas mixtures
553   Char_t namate[21];
554   // Xe/CO2-mixture
555   // Get properties of Xe 
556   gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf);
557   // Get properties of CO2 
558   gMC->Gfmate((*fIdmate)[8], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf);
559   // Create gas mixture 
560   wgm[0] = fxc;
561   wgm[1] = 1. - fxc;
562   dgm    = wgm[0] * dxe + wgm[1] * dco;
563   AliMixture(10, "Gas mixture 1$", agm, zgm, dgm,  2, wgm);
564   // Xe/Isobutane-mixture
565   // Get properties of Xe 
566   gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf);
567   // Get properties of Isobutane
568   gMC->Gfmate((*fIdmate)[9], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf);
569   // Create gas mixture 
570   wgm[0] = fxi;
571   wgm[1] = 1. - fxi;
572   dgm    = wgm[0] * dxe + wgm[1] * dis;
573   AliMixture(11, "Gas mixture 2$", agm, zgm, dgm,  2, wgm);
574  
575   //////////////////////////////////////////////////////////////////////////
576   //     Tracking Media Parameters 
577   //////////////////////////////////////////////////////////////////////////
578
579   // Al Frame 
580   AliMedium(1, "Al Frame$",   1, 0, ISXFLD, SXMGMX
581                 , tmaxfd, stemax, deemax, epsil, stmin);
582   // Air 
583   AliMedium(2, "Air$",        2, 0, ISXFLD, SXMGMX
584                 , tmaxfd, stemax, deemax, epsil, stmin);
585   // Polyethilene 
586   AliMedium(3, "Radiator$",   3, 0, ISXFLD, SXMGMX
587                 , tmaxfd, stemax, deemax, epsil, stmin);
588   // Xe 
589   AliMedium(4, "Xe$",         4, 1, ISXFLD, SXMGMX
590                 , tmaxfd, stemax, deemax, epsil, stmin);
591   // Cu pads 
592   AliMedium(5, "Padplane$",   5, 1, ISXFLD, SXMGMX
593                 , tmaxfd, stemax, deemax, epsil, stmin);
594   // Fee + cables 
595   AliMedium(6, "Readout$",    1, 0, ISXFLD, SXMGMX
596                 , tmaxfd, stemax, deemax, epsil, stmin);
597   // C frame 
598   AliMedium(7, "C Frame$",    6, 0, ISXFLD, SXMGMX
599                 , tmaxfd, stemax, deemax, epsil, stmin);
600   // Mylar foils 
601   AliMedium(8, "Mylar$",      7, 0, ISXFLD, SXMGMX
602                 , tmaxfd, stemax, deemax, epsil, stmin);
603   if (fGasMix == 1) {
604     // Gas-mixture (Xe/CO2) 
605     AliMedium(9, "Gas-mix$",   10, 1, ISXFLD, SXMGMX
606                   , tmaxfd, stemax, deemax, epsil, stmin);
607   }
608   else {
609     // Gas-mixture (Xe/Isobutane) 
610     AliMedium(9, "Gas-mix$",   11, 1, ISXFLD, SXMGMX
611                   , tmaxfd, stemax, deemax, epsil, stmin);
612   }
613   // Nomex-honeycomb (use carbon for the time being) 
614   AliMedium(10, "Nomex$",      6, 0, ISXFLD, SXMGMX
615                 , tmaxfd, stemax, deemax, epsil, stmin);
616   // Kapton foils (use Mylar for the time being) 
617   AliMedium(11, "Kapton$",     7, 0, ISXFLD, SXMGMX
618                 , tmaxfd, stemax, deemax, epsil, stmin);
619   // Gas-filling of the radiator 
620   AliMedium(12, "CO2$",        8, 0, ISXFLD, SXMGMX
621                 , tmaxfd, stemax, deemax, epsil, stmin);
622   // G10-plates
623   AliMedium(13, "G10-plates$",12, 0, ISXFLD, SXMGMX
624                 , tmaxfd, stemax, deemax, epsil, stmin);
625   // Cooling water
626   AliMedium(14, "Water$",     13, 0, ISXFLD, SXMGMX
627                 , tmaxfd, stemax, deemax, epsil, stmin);
628
629 }
630
631 //_____________________________________________________________________________
632 void AliTRD::DrawModule()
633 {
634   //
635   // Draw a shaded view of the Transition Radiation Detector version 0
636   //
637
638   // Set everything unseen
639   gMC->Gsatt("*"   ,"SEEN",-1);
640   
641   // Set ALIC mother transparent
642   gMC->Gsatt("ALIC","SEEN", 0);
643   
644   // Set the volumes visible
645   gMC->Gsatt("B032","SEEN", 0);
646   gMC->Gsatt("B028","SEEN", 0);
647   gMC->Gsatt("B029","SEEN", 0);
648   gMC->Gsatt("B030","SEEN", 0);
649   gMC->Gsatt("BTR1","SEEN", 0);
650   gMC->Gsatt("BTR2","SEEN", 0);
651   gMC->Gsatt("BTR3","SEEN", 0);
652   gMC->Gsatt("TRD" ,"SEEN", 0);
653   gMC->Gsatt("UCII","SEEN", 0);
654   gMC->Gsatt("UCIM","SEEN", 0);
655   gMC->Gsatt("UCIO","SEEN", 0);
656   gMC->Gsatt("UL02","SEEN", 1);
657   gMC->Gsatt("UL05","SEEN", 1);
658   gMC->Gsatt("UL06","SEEN", 1);
659   
660   gMC->Gdopt("hide", "on");
661   gMC->Gdopt("shad", "on");
662   gMC->Gsatt("*", "fill", 7);
663   gMC->SetClipBox(".");
664   gMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000);
665   gMC->DefaultRange();
666   gMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021);
667   gMC->Gdhead(1111, "Transition Radiation Detector");
668   gMC->Gdman(18, 4, "MAN");
669
670 }
671
672 //_____________________________________________________________________________
673 Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t )
674 {
675   //
676   // Distance between the mouse and the TRD detector on the screen
677   // Dummy routine
678   
679   return 9999;
680
681 }
682  
683 //_____________________________________________________________________________
684 void AliTRD::Init()
685 {
686   //
687   // Initialise the TRD detector after the geometry has been created
688   //
689
690   Int_t i;
691   
692   printf("\n");
693   for(i=0;i<35;i++) printf("*");
694   printf(" TRD_INIT ");
695   for(i=0;i<35;i++) printf("*");
696   printf("\n");
697   
698   // Here the TRD initialisation code (if any!)
699   if (fGasMix == 1) 
700     printf("          Gas Mixture: 90%% Xe + 10%% CO2\n");
701   else
702     printf("          Gas Mixture: 97%% Xe + 3%% Isobutane\n");
703
704 }
705
706 //_____________________________________________________________________________
707 void AliTRD::SetGasMix(Int_t imix)
708 {
709   //
710   // Defines the gas mixture (imix=0:  Xe/Isobutane imix=1: Xe/CO2)
711   //
712   
713   if ((imix < 0) || (imix > 1)) {
714     printf("Wrong input value: %d\n",imix);
715     printf("Use standard setting\n");
716     fGasMix = 0;
717     return;
718   }
719
720   fGasMix = imix;
721
722 }
723
724 ClassImp(AliTRDhit)
725  
726 //_____________________________________________________________________________
727 AliTRDhit::AliTRDhit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits):
728   AliHit(shunt, track)
729 {
730   //
731   // Create a TRD hit
732   //
733
734   // Store volume hierarchy
735   fSector  = vol[0]; 
736   fChamber = vol[1];
737   fPlane   = vol[2];
738   
739   // Store position and charge
740   fX       = hits[0];
741   fY       = hits[1];
742   fZ       = hits[2];
743   fQ       = hits[3];
744
745 }