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