Removal of useless dependecies via forward declarations
[u/mrichter/AliRoot.git] / TRD / AliTRDgeometry.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 /*
17 $Log$
18 Revision 1.4  2000/06/08 18:32:58  cblume
19 Make code compliant to coding conventions
20
21 Revision 1.3  2000/06/07 16:25:37  cblume
22 Try to remove compiler warnings on Sun and HP
23
24 Revision 1.2  2000/05/08 16:17:27  cblume
25 Merge TRD-develop
26
27 Revision 1.1.4.1  2000/05/08 14:45:55  cblume
28 Bug fix in RotateBack(). Geometry update
29
30 Revision 1.1  2000/02/28 19:00:44  cblume
31 Add new TRD classes
32
33 */
34
35 ///////////////////////////////////////////////////////////////////////////////
36 //                                                                           //
37 //  TRD geometry class                                                       //
38 //                                                                           //
39 ///////////////////////////////////////////////////////////////////////////////
40
41 #include "AliTRDgeometry.h"
42 #include "AliTRDrecPoint.h"
43 #include "AliMC.h"
44
45 ClassImp(AliTRDgeometry)
46
47 //_____________________________________________________________________________
48 AliTRDgeometry::AliTRDgeometry():AliGeometry()
49 {
50   //
51   // AliTRDgeometry default constructor
52   //
53
54   Init();
55
56 }
57
58 //_____________________________________________________________________________
59 AliTRDgeometry::~AliTRDgeometry()
60 {
61   //
62   // AliTRDgeometry destructor
63   //
64
65 }
66
67 //_____________________________________________________________________________
68 void AliTRDgeometry::Init()
69 {
70   //
71   // Initializes the geometry parameter
72   //
73
74   Int_t iplan;
75
76   // The width of the chambers
77   fCwidth[0]    =  99.6;
78   fCwidth[1]    = 104.1;
79   fCwidth[2]    = 108.5;
80   fCwidth[3]    = 112.9;
81   fCwidth[4]    = 117.4;
82   fCwidth[5]    = 121.8;
83
84   // The default pad dimensions
85   fRowPadSize  = 4.5;
86   fColPadSize  = 1.0;
87   fTimeBinSize = 0.1;
88
89   // The maximum number of pads
90   // and the position of pad 0,0,0 
91   // 
92   // chambers seen from the top:
93   //     +----------------------------+
94   //     |                            |
95   //     |                            |     ^
96   //     |                            | rphi|
97   //     |                            |     |
98   //     |0                           |     | 
99   //     +----------------------------+     +------>
100   //                                             z 
101   // chambers seen from the side:           ^
102   //     +----------------------------+ time|
103   //     |                            |     |
104   //     |0                           |     |
105   //     +----------------------------+     +------>
106   //                                             z
107   //                                             
108
109   // The pad column (rphi-direction)  
110   for (iplan = 0; iplan < kNplan; iplan++) {
111     fColMax[iplan] = 1 + TMath::Nint((fCwidth[iplan] - 2. * kCcthick) 
112                                                      / fColPadSize - 0.5);
113     fCol0[iplan]   = -fCwidth[iplan]/2. + kCcthick;
114   }
115
116   // The time bucket
117   fTimeMax = 1 + TMath::Nint(kDrThick / fTimeBinSize - 0.5);
118   for (iplan = 0; iplan < kNplan; iplan++) {
119     fTime0[iplan]  = kRmin + kCcframe/2. + kDrZpos - 0.5 * kDrThick
120                            + iplan * (kCheight + kCspace);
121   } 
122
123 }
124
125 //_____________________________________________________________________________
126 void AliTRDgeometry::CreateGeometry(Int_t *idtmed)
127 {
128   //
129   // Create the TRD geometry
130   //
131   // Author: Christoph Blume (C.Blume@gsi.de) 20/07/99
132   //
133   // The volumes:
134   //    TRD1-3     (Air)   --- The TRD mother volumes for one sector. 
135   //                           To be placed into the spaceframe.
136   //
137   //    UAFI(/M/O) (Al)    --- The aluminum frame of the inner(/middle/outer) chambers (readout)
138   //    UCFI(/M/O) (C)     --- The carbon frame of the inner(/middle/outer) chambers 
139   //                           (driftchamber + radiator)
140   //    UAII(/M/O) (Air)   --- The inner part of the readout of the inner(/middle/outer) chambers
141   //    UFII(/M/O) (Air)   --- The inner part of the chamner and radiator of the 
142   //                           inner(/middle/outer) chambers
143   //
144   // The material layers in one chamber:
145   //    UL01       (G10)   --- The gas seal of the radiator
146   //    UL02       (CO2)   --- The gas in the radiator
147   //    UL03       (PE)    --- The foil stack
148   //    UL04       (Mylar) --- Entrance window to the driftvolume and HV-cathode
149   //    UL05       (Xe)    --- The driftvolume
150   //    UL06       (Xe)    --- The amplification region
151   //    
152   //    UL07       (Cu)    --- The pad plane
153   //    UL08       (G10)   --- The Nomex honeycomb support structure
154   //    UL09       (Cu)    --- FEE and signal lines
155   //    UL10       (PE)    --- The cooling devices
156   //    UL11       (Water) --- The cooling water
157
158   const Int_t kNparCha = 3;
159
160   Float_t parDum[3];
161   Float_t parCha[kNparCha];
162
163   Float_t xpos, ypos, zpos;
164
165   // The aluminum frames - readout + electronics (Al)
166   // The inner chambers
167   gMC->Gsvolu("UAFI","BOX ",idtmed[1301-1],parDum,0);
168   // The middle chambers
169   gMC->Gsvolu("UAFM","BOX ",idtmed[1301-1],parDum,0);
170   // The outer chambers
171   gMC->Gsvolu("UAFO","BOX ",idtmed[1301-1],parDum,0);
172
173   // The inner part of the aluminum frames (Air)
174   // The inner chambers
175   gMC->Gsvolu("UAII","BOX ",idtmed[1302-1],parDum,0);
176   // The middle chambers
177   gMC->Gsvolu("UAIM","BOX ",idtmed[1302-1],parDum,0);
178   // The outer chambers
179   gMC->Gsvolu("UAIO","BOX ",idtmed[1302-1],parDum,0);
180
181   // The carbon frames - radiator + driftchamber (C)
182   // The inner chambers
183   gMC->Gsvolu("UCFI","BOX ",idtmed[1307-1],parDum,0);
184   // The middle chambers
185   gMC->Gsvolu("UCFM","BOX ",idtmed[1307-1],parDum,0);
186   // The outer chambers
187   gMC->Gsvolu("UCFO","BOX ",idtmed[1307-1],parDum,0);
188
189   // The inner part of the carbon frames (Air)
190   // The inner chambers
191   gMC->Gsvolu("UCII","BOX ",idtmed[1302-1],parDum,0);
192   // The middle chambers
193   gMC->Gsvolu("UCIM","BOX ",idtmed[1302-1],parDum,0);
194   // The outer chambers
195   gMC->Gsvolu("UCIO","BOX ",idtmed[1302-1],parDum,0);
196
197   // The material layers inside the chambers
198   parCha[0] = -1.;
199   parCha[1] = -1.;
200   // G10 layer (radiator seal)
201   parCha[2] = kSeThick/2;
202   gMC->Gsvolu("UL01","BOX ",idtmed[1313-1],parCha,kNparCha);
203   // CO2 layer (radiator)
204   parCha[2] = kRaThick/2;
205   gMC->Gsvolu("UL02","BOX ",idtmed[1312-1],parCha,kNparCha);
206   // PE layer (radiator)
207   parCha[2] = kPeThick/2;
208   gMC->Gsvolu("UL03","BOX ",idtmed[1303-1],parCha,kNparCha);
209   // Mylar layer (entrance window + HV cathode) 
210   parCha[2] = kMyThick/2;
211   gMC->Gsvolu("UL04","BOX ",idtmed[1308-1],parCha,kNparCha);
212   // Xe/Isobutane layer (drift volume, sensitive) 
213   parCha[2] = kDrThick/2.;
214   gMC->Gsvolu("UL05","BOX ",idtmed[1309-1],parCha,kNparCha);
215   // Xe/Isobutane layer (amplification volume, not sensitive)
216   parCha[2] = kAmThick/2.;
217   gMC->Gsvolu("UL06","BOX ",idtmed[1309-1],parCha,kNparCha);
218   
219   // Cu layer (pad plane)
220   parCha[2] = kCuThick/2;
221   gMC->Gsvolu("UL07","BOX ",idtmed[1305-1],parCha,kNparCha);
222   // G10 layer (support structure)
223   parCha[2] = kSuThick/2;
224   gMC->Gsvolu("UL08","BOX ",idtmed[1313-1],parCha,kNparCha);
225   // Cu layer (FEE + signal lines)
226   parCha[2] = kFeThick/2;
227   gMC->Gsvolu("UL09","BOX ",idtmed[1305-1],parCha,kNparCha);
228   // PE layer (cooling devices)
229   parCha[2] = kCoThick/2;
230   gMC->Gsvolu("UL10","BOX ",idtmed[1303-1],parCha,kNparCha);
231   // Water layer (cooling)
232   parCha[2] = kWaThick/2;
233   gMC->Gsvolu("UL11","BOX ",idtmed[1314-1],parCha,kNparCha);
234
235   // Position the layers in the chambers
236   xpos = 0;
237   ypos = 0;
238
239   // G10 layer (radiator seal)
240   zpos = kSeZpos;
241   gMC->Gspos("UL01",1,"UCII",xpos,ypos,zpos,0,"ONLY");
242   gMC->Gspos("UL01",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
243   gMC->Gspos("UL01",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
244   // CO2 layer (radiator)
245   zpos = kRaZpos;
246   gMC->Gspos("UL02",1,"UCII",xpos,ypos,zpos,0,"ONLY");
247   gMC->Gspos("UL02",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
248   gMC->Gspos("UL02",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
249   // PE layer (radiator)
250   zpos = 0;
251   gMC->Gspos("UL03",1,"UL02",xpos,ypos,zpos,0,"ONLY");
252   // Mylar layer (entrance window + HV cathode)   
253   zpos = kMyZpos;
254   gMC->Gspos("UL04",1,"UCII",xpos,ypos,zpos,0,"ONLY");
255   gMC->Gspos("UL04",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
256   gMC->Gspos("UL04",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
257   // Xe/Isobutane layer (drift volume) 
258   zpos = kDrZpos;
259   gMC->Gspos("UL05",1,"UCII",xpos,ypos,zpos,0,"ONLY");
260   gMC->Gspos("UL05",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
261   gMC->Gspos("UL05",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
262   // Xe/Isobutane layer (amplification volume)
263   zpos = kAmZpos;
264   gMC->Gspos("UL06",1,"UCII",xpos,ypos,zpos,0,"ONLY");
265   gMC->Gspos("UL06",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
266   gMC->Gspos("UL06",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
267
268   // Cu layer (pad plane)
269   zpos = kCuZpos;
270   gMC->Gspos("UL07",1,"UAII",xpos,ypos,zpos,0,"ONLY");
271   gMC->Gspos("UL07",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
272   gMC->Gspos("UL07",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
273   // G10 layer (support structure)
274   zpos = kSuZpos;
275   gMC->Gspos("UL08",1,"UAII",xpos,ypos,zpos,0,"ONLY");
276   gMC->Gspos("UL08",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
277   gMC->Gspos("UL08",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
278   // Cu layer (FEE + signal lines)
279   zpos = kFeZpos; 
280   gMC->Gspos("UL09",1,"UAII",xpos,ypos,zpos,0,"ONLY");
281   gMC->Gspos("UL09",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
282   gMC->Gspos("UL09",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
283   // PE layer (cooling devices)
284   zpos = kCoZpos;
285   gMC->Gspos("UL10",1,"UAII",xpos,ypos,zpos,0,"ONLY");
286   gMC->Gspos("UL10",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
287   gMC->Gspos("UL10",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
288   // Water layer (cooling)
289   zpos = kWaZpos;
290   gMC->Gspos("UL11",1,"UAII",xpos,ypos,zpos,0,"ONLY");
291   gMC->Gspos("UL11",1,"UAIM",xpos,ypos,zpos,0,"ONLY");
292   gMC->Gspos("UL11",1,"UAIO",xpos,ypos,zpos,0,"ONLY");
293
294 }
295
296 //_____________________________________________________________________________
297 Bool_t AliTRDgeometry::Local2Global(Int_t idet, Float_t *local, Float_t *global) const
298 {
299   //
300   // Converts local pad-coordinates (row,col,time) into 
301   // global ALICE reference frame coordinates (x,y,z)
302   //
303
304   Int_t        icham     = GetChamber(idet);    // Chamber info (0-4)
305   Int_t        isect     = GetSector(idet);     // Sector info  (0-17)
306   Int_t        iplan     = GetPlane(idet);      // Plane info   (0-5)
307
308   return Local2Global(iplan,icham,isect,local,global);
309
310 }
311  
312 //_____________________________________________________________________________
313 Bool_t AliTRDgeometry::Local2Global(Int_t iplan, Int_t icham, Int_t isect
314                                   , Float_t *local, Float_t *global) const
315 {
316   //
317   // Converts local pad-coordinates (row,col,time) into 
318   // global ALICE reference frame coordinates (x,y,z)
319   //
320
321   Int_t        idet      = GetDetector(iplan,icham,isect); // Detector number
322
323   Float_t      padRow    = local[0];                       // Pad Row position
324   Float_t      padCol    = local[1];                       // Pad Column position
325   Float_t      timeSlice = local[2];                       // Time "position"
326
327   Float_t      row0      = GetRow0(iplan,icham,isect);
328   Float_t      col0      = GetCol0(iplan);
329   Float_t      time0     = GetTime0(iplan);
330
331   Float_t      rot[3];
332
333   // calculate (x,y,z) position in rotated chamber
334   rot[0] = time0 + timeSlice * fTimeBinSize;
335   rot[1] = col0  + padCol    * fColPadSize;
336   rot[2] = row0  + padRow    * fRowPadSize;
337
338   // Rotate back to original position
339   return RotateBack(idet,rot,global);
340
341 }
342
343 //_____________________________________________________________________________
344 Bool_t AliTRDgeometry::Rotate(Int_t d, Float_t *pos, Float_t *rot)
345 {
346   //
347   // Rotates all chambers in the position of sector 0 and transforms
348   // the coordinates in the ALICE restframe <pos> into the 
349   // corresponding local frame <rot>.
350   //
351
352   Int_t   sector = GetSector(d);
353
354   Float_t phi    = -2.0 * kPI /  (Float_t) kNsect * ((Float_t) sector + 0.5);
355
356   rot[0] =  pos[0] * TMath::Cos(phi) + pos[1] * TMath::Sin(phi);
357   rot[1] = -pos[0] * TMath::Sin(phi) + pos[1] * TMath::Cos(phi);
358   rot[2] =  pos[2];
359
360   return kTRUE;
361
362 }
363
364 //_____________________________________________________________________________
365 Bool_t AliTRDgeometry::RotateBack(Int_t d, Float_t *rot, Float_t *pos) const
366 {
367   //
368   // Rotates a chambers from the position of sector 0 into its
369   // original position and transforms the corresponding local frame 
370   // coordinates <rot> into the coordinates of the ALICE restframe <pos>.
371   //
372
373   Int_t   sector = GetSector(d);
374
375   Float_t phi    =  2.0 * kPI /  (Float_t) kNsect * ((Float_t) sector + 0.5);
376
377   pos[0] =  rot[0] * TMath::Cos(phi) + rot[1] * TMath::Sin(phi);
378   pos[1] = -rot[0] * TMath::Sin(phi) + rot[1] * TMath::Cos(phi);
379   pos[2] =  rot[2];
380
381   return kTRUE;
382
383 }
384
385 //_____________________________________________________________________________
386 Int_t AliTRDgeometry::GetDetector(Int_t p, Int_t c, Int_t s) const
387 {
388   //
389   // Convert plane / chamber / sector into detector number
390   //
391
392   return (p + c * kNplan + s * kNplan * kNcham);
393
394 }
395
396 //_____________________________________________________________________________
397 Int_t AliTRDgeometry::GetPlane(Int_t d) const
398 {
399   //
400   // Reconstruct the plane number from the detector number
401   //
402
403   return ((Int_t) (d % kNplan));
404
405 }
406
407 //_____________________________________________________________________________
408 Int_t AliTRDgeometry::GetChamber(Int_t d) const
409 {
410   //
411   // Reconstruct the chamber number from the detector number
412   //
413
414   return ((Int_t) (d % (kNplan * kNcham)) / kNplan);
415
416 }
417
418 //_____________________________________________________________________________
419 Int_t AliTRDgeometry::GetSector(Int_t d) const
420 {
421   //
422   // Reconstruct the sector number from the detector number
423   //
424
425   return ((Int_t) (d / (kNplan * kNcham)));
426
427 }
428
429 //_____________________________________________________________________________
430 void AliTRDgeometry::GetGlobal(const AliRecPoint *p, TVector3 &pos, TMatrix &mat) const
431 {
432   // 
433   // Returns the global coordinate and error matrix of a AliTRDrecPoint
434   //
435
436   GetGlobal(p,pos);
437   mat.Zero();
438
439 }
440
441 //_____________________________________________________________________________
442 void AliTRDgeometry::GetGlobal(const AliRecPoint *p, TVector3 &pos) const
443 {
444   // 
445   // Returns the global coordinate and error matrix of a AliTRDrecPoint
446   //
447
448   Int_t detector = ((AliTRDrecPoint *) p)->GetDetector();
449
450   Float_t global[3];
451   Float_t local[3];
452   local[0] = ((AliTRDrecPoint *) p)->GetLocalRow();
453   local[1] = ((AliTRDrecPoint *) p)->GetLocalCol();
454   local[2] = ((AliTRDrecPoint *) p)->GetLocalTime();
455
456   if (Local2Global(detector,local,global)) {
457     pos.SetX(global[0]);
458     pos.SetY(global[1]);
459     pos.SetZ(global[2]);
460   }
461   else {
462     pos.SetX(0.0);
463     pos.SetY(0.0);
464     pos.SetZ(0.0);
465   }
466
467 }