]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDgeometry.cxx
Possibility to specify event selection criteria within the raw-data input URI. The...
[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 /* $Id$ */
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //                                                                           //
20 //  TRD geometry class                                                       //
21 //                                                                           //
22 ///////////////////////////////////////////////////////////////////////////////
23
24 #include <TGeoManager.h>
25 #include <TGeoPhysicalNode.h>
26 #include <TGeoMatrix.h>
27
28 #include "AliLog.h"
29 #include "AliRunLoader.h"
30 #include "AliAlignObj.h"
31 #include "AliAlignObjParams.h"
32 #include "AliRun.h"
33
34 #include "AliTRD.h"
35 #include "AliTRDcalibDB.h"
36 #include "AliTRDgeometry.h"
37 #include "AliTRDpadPlane.h"
38 #include "AliTRDSimParam.h"
39
40 ClassImp(AliTRDgeometry)
41
42 //_____________________________________________________________________________
43
44   //
45   // The geometry constants
46   //
47   const Int_t    AliTRDgeometry::fgkNsector   = kNsector;
48   const Int_t    AliTRDgeometry::fgkNlayer    = kNlayer;
49   const Int_t    AliTRDgeometry::fgkNstack    = kNstack;
50   const Int_t    AliTRDgeometry::fgkNdet      = kNdet;
51
52   //
53   // Dimensions of the detector
54   //
55
56   // Total length of the TRD mother volume
57   const Float_t  AliTRDgeometry::fgkTlength   = 751.0;
58
59   // Parameter of the super module mother volumes 
60   const Float_t  AliTRDgeometry::fgkSheight   =  77.9; 
61   const Float_t  AliTRDgeometry::fgkSwidth1   =  94.881; 
62   const Float_t  AliTRDgeometry::fgkSwidth2   = 122.353;
63   const Float_t  AliTRDgeometry::fgkSlength   = 702.0;
64
65   // Length of the additional space in front of the supermodule
66   // used for services
67   const Float_t  AliTRDgeometry::fgkFlength   = (AliTRDgeometry::fgkTlength
68                                                - AliTRDgeometry::fgkSlength) / 2.0;
69
70   // The super module side plates
71   const Float_t  AliTRDgeometry::fgkSMpltT    =   0.2;
72
73   // Height of different chamber parts
74   // Radiator
75   const Float_t  AliTRDgeometry::fgkCraH      =   4.8; 
76   // Drift region
77   const Float_t  AliTRDgeometry::fgkCdrH      =   3.0;
78   // Amplification region
79   const Float_t  AliTRDgeometry::fgkCamH      =   0.7;
80   // Readout
81   const Float_t  AliTRDgeometry::fgkCroH      =   2.316;
82   // Total height
83   const Float_t  AliTRDgeometry::fgkCH        = AliTRDgeometry::fgkCraH
84                                               + AliTRDgeometry::fgkCdrH
85                                               + AliTRDgeometry::fgkCamH
86                                               + AliTRDgeometry::fgkCroH;  
87
88   // Vertical spacing of the chambers
89   const Float_t  AliTRDgeometry::fgkVspace    =   1.784;
90   // Horizontal spacing of the chambers
91   const Float_t  AliTRDgeometry::fgkHspace    =   2.0;
92   // Radial distance of the first ROC to the outer plates of the SM
93   const Float_t  AliTRDgeometry::fgkVrocsm    =   1.2;
94
95   // Thicknesses of different parts of the chamber frame
96   // Lower aluminum frame
97   const Float_t  AliTRDgeometry::fgkCalT      =   0.4;
98   // Lower Wacosit frame sides
99   const Float_t  AliTRDgeometry::fgkCclsT     =   0.21;
100   // Lower Wacosit frame front
101   const Float_t  AliTRDgeometry::fgkCclfT     =   1.0;
102   // Thickness of glue around radiator
103   const Float_t  AliTRDgeometry::fgkCglT      =   0.25;
104   // Upper Wacosit frame
105   const Float_t  AliTRDgeometry::fgkCcuT      =   0.9;
106   // Al frame of back panel
107   const Float_t  AliTRDgeometry::fgkCauT      =   1.5;
108   // Additional Al of the lower chamber frame
109   const Float_t  AliTRDgeometry::fgkCalW      =   1.11;
110
111   // Additional width of the readout chamber frames
112   const Float_t  AliTRDgeometry::fgkCroW      =   0.9;
113
114   // Difference of outer chamber width and pad plane width
115   const Float_t  AliTRDgeometry::fgkCpadW     =   0.0;
116   const Float_t  AliTRDgeometry::fgkRpadW     =   1.0;
117
118   //
119   // Thickness of the the material layers
120   //
121   const Float_t  AliTRDgeometry::fgkMyThick   = 0.005;
122   const Float_t  AliTRDgeometry::fgkRaThick   = 0.3233;  
123   const Float_t  AliTRDgeometry::fgkDrThick   = AliTRDgeometry::fgkCdrH;    
124   const Float_t  AliTRDgeometry::fgkAmThick   = AliTRDgeometry::fgkCamH;
125   const Float_t  AliTRDgeometry::fgkXeThick   = AliTRDgeometry::fgkDrThick
126                                               + AliTRDgeometry::fgkAmThick;
127   const Float_t  AliTRDgeometry::fgkWrThick   = 0.0002;
128   const Float_t  AliTRDgeometry::fgkCuThick   = 0.0072; 
129   const Float_t  AliTRDgeometry::fgkGlThick   = 0.05;
130   const Float_t  AliTRDgeometry::fgkSuThick   = 0.0919; 
131   const Float_t  AliTRDgeometry::fgkRcThick   = 0.0058;
132   const Float_t  AliTRDgeometry::fgkRpThick   = 0.0632;
133   const Float_t  AliTRDgeometry::fgkRoThick   = 0.0028;
134
135   //
136   // Position of the material layers
137   //
138   const Float_t  AliTRDgeometry::fgkRaZpos    =  0.0;
139   const Float_t  AliTRDgeometry::fgkDrZpos    =  2.4;
140   const Float_t  AliTRDgeometry::fgkAmZpos    =  0.0;
141   const Float_t  AliTRDgeometry::fgkWrZpos    =  0.0;
142   const Float_t  AliTRDgeometry::fgkCuZpos    = -0.9995;
143   const Float_t  AliTRDgeometry::fgkGlZpos    = -0.5; 
144   const Float_t  AliTRDgeometry::fgkSuZpos    =  0.0;
145   const Float_t  AliTRDgeometry::fgkRcZpos    =  1.04;
146   const Float_t  AliTRDgeometry::fgkRpZpos    =  1.0;
147   const Float_t  AliTRDgeometry::fgkRoZpos    =  1.05;
148
149   const Int_t    AliTRDgeometry::fgkMCMmax    = 16;   
150   const Int_t    AliTRDgeometry::fgkMCMrow    = 4;   
151   const Int_t    AliTRDgeometry::fgkROBmaxC0  = 6; 
152   const Int_t    AliTRDgeometry::fgkROBmaxC1  = 8; 
153   const Int_t    AliTRDgeometry::fgkADCmax    = 21;   
154   const Int_t    AliTRDgeometry::fgkTBmax     = 60;   
155   const Int_t    AliTRDgeometry::fgkPadmax    = 18;   
156   const Int_t    AliTRDgeometry::fgkColmax    = 144;
157   const Int_t    AliTRDgeometry::fgkRowmaxC0  = 12;
158   const Int_t    AliTRDgeometry::fgkRowmaxC1  = 16;
159
160   const Double_t AliTRDgeometry::fgkTime0Base = 300.65;
161   const Float_t  AliTRDgeometry::fgkTime0[6]  = { fgkTime0Base + 0 * (Cheight() + Cspace()) 
162                                                 , fgkTime0Base + 1 * (Cheight() + Cspace()) 
163                                                 , fgkTime0Base + 2 * (Cheight() + Cspace()) 
164                                                 , fgkTime0Base + 3 * (Cheight() + Cspace()) 
165                                                 , fgkTime0Base + 4 * (Cheight() + Cspace()) 
166                                                 , fgkTime0Base + 5 * (Cheight() + Cspace())};
167
168 //_____________________________________________________________________________
169 AliTRDgeometry::AliTRDgeometry()
170   :AliGeometry()
171   ,fClusterMatrixArray(0)
172   ,fPadPlaneArray(0)
173 {
174   //
175   // AliTRDgeometry default constructor
176   //
177
178   Init();
179
180 }
181
182 //_____________________________________________________________________________
183 AliTRDgeometry::AliTRDgeometry(const AliTRDgeometry &g)
184   :AliGeometry(g)
185   ,fClusterMatrixArray(0)
186   ,fPadPlaneArray(0)
187 {
188   //
189   // AliTRDgeometry copy constructor
190   //
191
192   Init();
193
194 }
195
196 //_____________________________________________________________________________
197 AliTRDgeometry::~AliTRDgeometry()
198 {
199   //
200   // AliTRDgeometry destructor
201   //
202
203   if (fClusterMatrixArray) {
204     fClusterMatrixArray->Delete();
205     delete fClusterMatrixArray;
206     fClusterMatrixArray = 0;
207   }
208
209   if (fPadPlaneArray) {
210     fPadPlaneArray->Delete();
211     delete fPadPlaneArray;
212     fPadPlaneArray = 0;
213   }
214
215 }
216
217 //_____________________________________________________________________________
218 AliTRDgeometry &AliTRDgeometry::operator=(const AliTRDgeometry &g)
219 {
220   //
221   // Assignment operator
222   //
223
224   if (this != &g) {
225     Init();
226   }
227
228   return *this;
229
230 }
231
232 //_____________________________________________________________________________
233 void AliTRDgeometry::Init()
234 {
235   //
236   // Initializes the geometry parameter
237   //
238
239   Int_t istack;
240   Int_t ilayer;
241   Int_t isector;
242
243   // The outer width of the chambers
244   fCwidth[0] =  90.4;
245   fCwidth[1] =  94.8;
246   fCwidth[2] =  99.3;
247   fCwidth[3] = 103.7;
248   fCwidth[4] = 108.1;
249   fCwidth[5] = 112.6;
250
251   // The outer lengths of the chambers
252   // Includes the spacings between the chambers!
253   Float_t length[kNlayer][kNstack]   = { { 124.0, 124.0, 110.0, 124.0, 124.0 }
254                                        , { 124.0, 124.0, 110.0, 124.0, 124.0 }
255                                        , { 131.0, 131.0, 110.0, 131.0, 131.0 }
256                                        , { 138.0, 138.0, 110.0, 138.0, 138.0 }
257                                        , { 145.0, 145.0, 110.0, 145.0, 145.0 }
258                                        , { 147.0, 147.0, 110.0, 147.0, 147.0 } };
259
260   for (istack = 0; istack < kNstack; istack++) {
261     for (ilayer = 0; ilayer < kNlayer; ilayer++) {
262       fClength[ilayer][istack] = length[ilayer][istack];
263     }
264   }
265
266   // The rotation matrix elements
267   Float_t phi = 0.0;
268   for (isector = 0; isector < fgkNsector; isector++) {
269     phi = 2.0 * TMath::Pi() /  (Float_t) fgkNsector * ((Float_t) isector + 0.5);
270     fRotB11[isector] = TMath::Cos(phi);
271     fRotB12[isector] = TMath::Sin(phi);
272     fRotB21[isector] = TMath::Sin(phi);
273     fRotB22[isector] = TMath::Cos(phi);
274   }
275
276   // Initialize the SM status
277   for (isector = 0; isector < fgkNsector; isector++) {
278     SetSMstatus(isector,1);
279   }
280  
281 }
282
283 //_____________________________________________________________________________
284 void AliTRDgeometry::CreatePadPlaneArray()
285 {
286   //
287   // Creates the array of AliTRDpadPlane objects
288   //
289
290   if (fPadPlaneArray) {
291     fPadPlaneArray->Delete();
292     delete fPadPlaneArray;
293   }
294
295   fPadPlaneArray = new TObjArray(fgkNlayer * fgkNstack);  
296   for (Int_t ilayer = 0; ilayer < fgkNlayer; ilayer++) {
297     for (Int_t istack = 0; istack < fgkNstack; istack++) {
298       Int_t ipp = GetDetectorSec(ilayer,istack);
299       fPadPlaneArray->AddAt(CreatePadPlane(ilayer,istack),ipp);
300     }
301   }
302
303 }
304
305 //_____________________________________________________________________________
306 AliTRDpadPlane *AliTRDgeometry::CreatePadPlane(Int_t ilayer, Int_t istack)
307 {
308   //
309   // Creates an AliTRDpadPlane object
310   //
311
312   AliTRDpadPlane *padPlane = new AliTRDpadPlane();
313
314   padPlane->SetLayer(ilayer);
315   padPlane->SetStack(istack);
316
317   padPlane->SetRowSpacing(0.0);
318   padPlane->SetColSpacing(0.0);
319
320   padPlane->SetLengthRim(1.0);
321   padPlane->SetWidthRim(0.5);
322
323   padPlane->SetNcols(144);
324
325   //
326   // The pad plane parameter
327   //
328   switch (ilayer) {
329   case 0:
330     if (istack == 2) {
331       // L0C0 type
332       padPlane->SetNrows(12);
333       padPlane->SetLength(108.0);
334       padPlane->SetWidth(92.2);
335       padPlane->SetLengthOPad(8.0);
336       padPlane->SetWidthOPad(0.515);
337       padPlane->SetLengthIPad(9.0);
338       padPlane->SetWidthIPad(0.635);
339       padPlane->SetTiltingAngle(2.0);
340     }
341     else {
342       // L0C1 type
343       padPlane->SetNrows(16);
344       padPlane->SetLength(122.0);
345       padPlane->SetWidth(92.2);
346       padPlane->SetLengthOPad(7.5);
347       padPlane->SetWidthOPad(0.515);
348       padPlane->SetLengthIPad(7.5);
349       padPlane->SetWidthIPad(0.635);
350       padPlane->SetTiltingAngle(2.0);
351     }
352     break;
353   case 1:
354     if (istack == 2) {
355       // L1C0 type
356       padPlane->SetNrows(12);
357       padPlane->SetLength(108.0);
358       padPlane->SetWidth(96.6);
359       padPlane->SetLengthOPad(8.0);
360       padPlane->SetWidthOPad(0.585);
361       padPlane->SetLengthIPad(9.0);
362       padPlane->SetWidthIPad(0.665);
363       padPlane->SetTiltingAngle(-2.0);
364     }
365     else {
366       // L1C1 type
367       padPlane->SetNrows(16);
368       padPlane->SetLength(122.0);
369       padPlane->SetWidth(96.6);
370       padPlane->SetLengthOPad(7.5);
371       padPlane->SetWidthOPad(0.585);
372       padPlane->SetLengthIPad(7.5);
373       padPlane->SetWidthIPad(0.665);
374       padPlane->SetTiltingAngle(-2.0);
375     }
376     break;
377   case 2:
378     if (istack == 2) {
379       // L2C0 type
380       padPlane->SetNrows(12);
381       padPlane->SetLength(108.0);
382       padPlane->SetWidth(101.1);
383       padPlane->SetLengthOPad(8.0);
384       padPlane->SetWidthOPad(0.705);
385       padPlane->SetLengthIPad(9.0);
386       padPlane->SetWidthIPad(0.695);
387       padPlane->SetTiltingAngle(2.0);
388     }
389     else {
390       // L2C1 type
391       padPlane->SetNrows(16);
392       padPlane->SetLength(129.0);
393       padPlane->SetWidth(101.1);
394       padPlane->SetLengthOPad(7.5);
395       padPlane->SetWidthOPad(0.705);
396       padPlane->SetLengthIPad(8.0);
397       padPlane->SetWidthIPad(0.695);
398       padPlane->SetTiltingAngle(2.0);
399     }
400     break;
401   case 3:
402     if (istack == 2) {
403       // L3C0 type
404       padPlane->SetNrows(12);
405       padPlane->SetLength(108.0);
406       padPlane->SetWidth(105.5);
407       padPlane->SetLengthOPad(8.0);
408       padPlane->SetWidthOPad(0.775);
409       padPlane->SetLengthIPad(9.0);
410       padPlane->SetWidthIPad(0.725);
411       padPlane->SetTiltingAngle(-2.0);
412     }
413     else {
414       // L3C1 type
415       padPlane->SetNrows(16);
416       padPlane->SetLength(136.0);
417       padPlane->SetWidth(105.5);
418       padPlane->SetLengthOPad(7.5);
419       padPlane->SetWidthOPad(0.775);
420       padPlane->SetLengthIPad(8.5);
421       padPlane->SetWidthIPad(0.725);
422       padPlane->SetTiltingAngle(-2.0);
423     }
424     break;
425   case 4:
426     if (istack == 2) {
427       // L4C0 type
428       padPlane->SetNrows(12);
429       padPlane->SetLength(108.0);
430       padPlane->SetWidth(109.9);
431       padPlane->SetLengthOPad(8.0);
432       padPlane->SetWidthOPad(0.845);
433       padPlane->SetLengthIPad(9.0);
434       padPlane->SetWidthIPad(0.755);
435       padPlane->SetTiltingAngle(2.0);
436     }
437     else {
438       // L4C1 type
439       padPlane->SetNrows(16);
440       padPlane->SetLength(143.0);
441       padPlane->SetWidth(109.9);
442       padPlane->SetLengthOPad(7.5);
443       padPlane->SetWidthOPad(0.845);
444       padPlane->SetLengthIPad(9.0);
445       padPlane->SetWidthIPad(0.755);
446       padPlane->SetTiltingAngle(2.0);
447     }
448     break;
449   case 5:
450     if (istack == 2) {
451       // L5C0 type
452       padPlane->SetNrows(12);
453       padPlane->SetLength(108.0);
454       padPlane->SetWidth(114.4);
455       padPlane->SetLengthOPad(8.0);
456       padPlane->SetWidthOPad(0.965);
457       padPlane->SetLengthIPad(9.0);
458       padPlane->SetWidthIPad(0.785);
459       padPlane->SetTiltingAngle(-2.0);
460     }
461     else {
462       // L5C1 type
463       padPlane->SetNrows(16);
464       padPlane->SetLength(145.0);
465       padPlane->SetWidth(114.4);
466       padPlane->SetLengthOPad(8.5);
467       padPlane->SetWidthOPad(0.965);
468       padPlane->SetLengthIPad(9.0);
469       padPlane->SetWidthIPad(0.785);
470       padPlane->SetTiltingAngle(-2.0);
471     }
472     break;
473   };
474
475   //
476   // The positions of the borders of the pads
477   //
478   // Row direction
479   //
480   Double_t row = fClength[ilayer][istack] / 2.0
481                - fgkRpadW
482                - padPlane->GetLengthRim();
483   for (Int_t ir = 0; ir < padPlane->GetNrows(); ir++) {
484     padPlane->SetPadRow(ir,row);
485     row -= padPlane->GetRowSpacing();
486     if (ir == 0) {
487       row -= padPlane->GetLengthOPad();
488     }
489     else {
490       row -= padPlane->GetLengthIPad();
491     }
492   }
493   //
494   // Column direction
495   //
496   Double_t col = - fCwidth[ilayer] / 2.0
497                  - fgkCroW
498                  + padPlane->GetWidthRim();
499   for (Int_t ic = 0; ic < padPlane->GetNcols(); ic++) {
500     padPlane->SetPadCol(ic,col);
501     col += padPlane->GetColSpacing();
502     if (ic == 0) {
503       col += padPlane->GetWidthOPad();
504     }
505     else {
506       col += padPlane->GetWidthIPad();
507     }
508   }
509   // Calculate the offset to translate from the local ROC system into
510   // the local supermodule system, which is used for clusters
511   Double_t rowTmp = fClength[ilayer][0]
512                   + fClength[ilayer][1]
513                   + fClength[ilayer][2] / 2.0;
514   for (Int_t jstack = 0; jstack < istack; jstack++) {
515     rowTmp -= fClength[ilayer][jstack];
516   }
517   padPlane->SetPadRowSMOffset(rowTmp - fClength[ilayer][istack]/2.0);
518
519   return padPlane;
520
521 }
522
523 //_____________________________________________________________________________
524 void AliTRDgeometry::CreateGeometry(Int_t *idtmed)
525 {
526   //
527   // Create the TRD geometry without hole
528   //
529   //
530   // Names of the TRD volumina (xx = detector number):
531   //
532   //      Volume (Air) wrapping the readout chamber components
533   //        UTxx    includes: UAxx, UDxx, UFxx, UUxx
534   //
535   //      Volume (Air) wrapping the services (fee + cooling)
536   //        UUxx    the services volume has been reduced by 7.42 mm
537   //                in order to allow shifts in radial direction
538   //
539   //      Lower part of the readout chambers (drift volume + radiator)
540   //
541   //        UAxx    Aluminum frames                 (Al)
542   //        UBxx    Wacosit frames                  (C)
543   //        UXxx    Glue around radiator            (Epoxy)
544   //        UCxx    Inner volumes                   (Air)
545   //        UZxx    Additional aluminum ledges      (Al)
546   //
547   //      Upper part of the readout chambers (readout plane + fee)
548   //
549   //        UDxx    Wacosit frames of amp. region   (C)
550   //        UExx    Inner volumes of the frame      (Air)
551   //        UFxx    Aluminum frame of back panel    (Al)
552   //        UGxx    Inner volumes of the back panel (Air)
553   //
554   //      Inner material layers
555   //
556   //        UHxx    Radiator                        (Rohacell)
557   //        UJxx    Drift volume                    (Xe/CO2)
558   //        UKxx    Amplification volume            (Xe/CO2)
559   //        UWxx    Wire plane                      (Cu)
560   //        ULxx    Pad plane                       (Cu)
561   //        UYxx    Glue layer                      (Epoxy)
562   //        UMxx    Support structure               (Rohacell)
563   //        UNxx    ROB base material               (C)
564   //        UOxx    ROB copper                      (Cu)
565   //        UVxx    ROB other materials             (Cu)
566   //
567
568   const Int_t kNparTrd = 4;
569   const Int_t kNparCha = 3;
570
571   Float_t xpos;
572   Float_t ypos;
573   Float_t zpos;
574
575   Float_t parTrd[kNparTrd];
576   Float_t parCha[kNparCha];
577
578   Char_t  cTagV[6];
579   Char_t  cTagM[5];
580
581   AliTRDSimParam *simParam = AliTRDSimParam::Instance();
582
583   // There are three TRD volumes for the supermodules in order to accomodate
584   // the different arrangements in front of PHOS
585   // UTR1: Default supermodule
586   // UTR2: Supermodule in front of PHOS with double carbon cover
587   // UTR3: As UTR2, but w/o middle stack
588   //
589   // The mother volume for one sector (Air), full length in z-direction
590   // Provides material for side plates of super module
591   parTrd[0] = fgkSwidth1/2.0;
592   parTrd[1] = fgkSwidth2/2.0;
593   parTrd[2] = fgkSlength/2.0;
594   parTrd[3] = fgkSheight/2.0;
595   gMC->Gsvolu("UTR1","TRD1",idtmed[1302-1],parTrd,kNparTrd);
596   gMC->Gsvolu("UTR2","TRD1",idtmed[1302-1],parTrd,kNparTrd);
597   gMC->Gsvolu("UTR3","TRD1",idtmed[1302-1],parTrd,kNparTrd);
598   // The outer aluminum plates of the super module (Al)
599   parTrd[0] = fgkSwidth1/2.0;
600   parTrd[1] = fgkSwidth2/2.0;
601   parTrd[2] = fgkSlength/2.0;
602   parTrd[3] = fgkSheight/2.0;
603   gMC->Gsvolu("UTS1","TRD1",idtmed[1301-1],parTrd,kNparTrd);
604   gMC->Gsvolu("UTS2","TRD1",idtmed[1301-1],parTrd,kNparTrd);
605   gMC->Gsvolu("UTS3","TRD1",idtmed[1301-1],parTrd,kNparTrd);
606   // The inner part of the TRD mother volume for one sector (Air), 
607   // full length in z-direction
608   parTrd[0] = fgkSwidth1/2.0 - fgkSMpltT;
609   parTrd[1] = fgkSwidth2/2.0 - fgkSMpltT;
610   parTrd[2] = fgkSlength/2.0;
611   parTrd[3] = fgkSheight/2.0 - fgkSMpltT;
612   gMC->Gsvolu("UTI1","TRD1",idtmed[1302-1],parTrd,kNparTrd);
613   gMC->Gsvolu("UTI2","TRD1",idtmed[1302-1],parTrd,kNparTrd);
614   gMC->Gsvolu("UTI3","TRD1",idtmed[1302-1],parTrd,kNparTrd);
615
616   // The inner part of the TRD mother volume for services in front
617   // of the supermodules  (Air), 
618   parTrd[0] = fgkSwidth1/2.0;
619   parTrd[1] = fgkSwidth2/2.0;
620   parTrd[2] = fgkFlength/2.0;
621   parTrd[3] = fgkSheight/2.0;
622   gMC->Gsvolu("UTF1","TRD1",idtmed[1302-1],parTrd,kNparTrd);
623   gMC->Gsvolu("UTF2","TRD1",idtmed[1302-1],parTrd,kNparTrd);
624
625   for (Int_t istack = 0; istack < kNstack; istack++) {
626     for (Int_t ilayer = 0; ilayer < kNlayer; ilayer++) {  
627
628       Int_t iDet = GetDetectorSec(ilayer,istack);
629
630       // The lower part of the readout chambers (drift volume + radiator) 
631       // The aluminum frames 
632       sprintf(cTagV,"UA%02d",iDet);
633       parCha[0] = fCwidth[ilayer]/2.0;
634       parCha[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0;
635       parCha[2] = fgkCraH/2.0 + fgkCdrH/2.0;
636       fChamberUAboxd[iDet][0] = parCha[0];
637       fChamberUAboxd[iDet][1] = parCha[1];
638       fChamberUAboxd[iDet][2] = parCha[2];
639       gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
640       // The additional aluminum on the frames
641       // This part has not the correct postion but is just supposed to
642       // represent the missing material. The correct form of the L-shaped
643       // profile would not fit into the alignable volume. 
644       sprintf(cTagV,"UZ%02d",iDet);
645       parCha[0] = fgkCroW/2.0;
646       parCha[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0;
647       parCha[2] = fgkCalW/2.0;
648       fChamberUAboxd[iDet][0] = fChamberUAboxd[iDet][0] + fgkCroW;
649       gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
650       // The Wacosit frames 
651       sprintf(cTagV,"UB%02d",iDet);
652       parCha[0] = fCwidth[ilayer]/2.0 - fgkCalT; 
653       parCha[1] = -1.0;
654       parCha[2] = -1.0;
655       gMC->Gsvolu(cTagV,"BOX ",idtmed[1307-1],parCha,kNparCha);
656       // The glue around the radiator
657       sprintf(cTagV,"UX%02d",iDet);
658       parCha[0] = fCwidth[ilayer]/2.0 - fgkCalT - fgkCclsT; 
659       parCha[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0 - fgkCclfT;
660       parCha[2] = fgkCraH/2.0;
661       gMC->Gsvolu(cTagV,"BOX ",idtmed[1311-1],parCha,kNparCha);
662       // The inner part of radiator (air)
663       sprintf(cTagV,"UC%02d",iDet);
664       parCha[0] = fCwidth[ilayer]/2.0 - fgkCalT - fgkCclsT - fgkCglT; 
665       parCha[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0 - fgkCclfT - fgkCglT;
666       parCha[2] = -1.0;
667       gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
668
669       // The upper part of the readout chambers (amplification volume)
670       // The Wacosit frames
671       sprintf(cTagV,"UD%02d",iDet);
672       parCha[0] = fCwidth[ilayer]/2.0 + fgkCroW;
673       parCha[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0;
674       parCha[2] = fgkCamH/2.0;
675       fChamberUDboxd[iDet][0] = parCha[0];
676       fChamberUDboxd[iDet][1] = parCha[1];
677       fChamberUDboxd[iDet][2] = parCha[2];
678       gMC->Gsvolu(cTagV,"BOX ",idtmed[1307-1],parCha,kNparCha);
679       // The inner part of the Wacosit frame (air)
680       sprintf(cTagV,"UE%02d",iDet);
681       parCha[0] = fCwidth[ilayer]/2.0 + fgkCroW - fgkCcuT; 
682       parCha[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0 - fgkCcuT;
683       parCha[2] = -1.;
684       gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
685
686       // The support structure (pad plane, back panel, readout boards)
687       // The aluminum frames
688       sprintf(cTagV,"UF%02d",iDet);
689       parCha[0] = fCwidth[ilayer]/2.0 + fgkCroW;
690       parCha[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0;
691       parCha[2] = fgkCroH/2.0;
692       fChamberUFboxd[iDet][0] = parCha[0];
693       fChamberUFboxd[iDet][1] = parCha[1];
694       fChamberUFboxd[iDet][2] = parCha[2];
695       gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parCha,kNparCha);
696       // The inner part of the aluminum frames
697       sprintf(cTagV,"UG%02d",iDet);
698       parCha[0] = fCwidth[ilayer]/2.0 + fgkCroW - fgkCauT; 
699       parCha[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0 - fgkCauT;
700       parCha[2] = -1.0;
701       gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parCha,kNparCha);
702
703       // The material layers inside the chambers
704       // Rohacell layer (radiator)
705       parCha[0] = -1.0;
706       parCha[1] = -1.0;
707       parCha[2] = fgkRaThick/2.0;
708       sprintf(cTagV,"UH%02d",iDet);
709       gMC->Gsvolu(cTagV,"BOX ",idtmed[1315-1],parCha,kNparCha);
710       // Xe/Isobutane layer (drift volume) 
711       parCha[0] = fCwidth[ilayer]/2.0 - fgkCalT - fgkCclsT;
712       parCha[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0 - fgkCclfT;
713       parCha[2] = fgkDrThick/2.0;
714       sprintf(cTagV,"UJ%02d",iDet);
715       gMC->Gsvolu(cTagV,"BOX ",idtmed[1309-1],parCha,kNparCha);
716       // Xe/Isobutane layer (amplification volume)
717       parCha[0] = -1.0;
718       parCha[1] = -1.0;
719       parCha[2] = fgkAmThick/2.0;
720       sprintf(cTagV,"UK%02d",iDet);
721       gMC->Gsvolu(cTagV,"BOX ",idtmed[1309-1],parCha,kNparCha);  
722       // Cu layer (wire plane)
723       parCha[0] = -1.0;
724       parCha[1] = -1.0;
725       parCha[2] = fgkWrThick/2.0;
726       sprintf(cTagV,"UW%02d",iDet);
727       gMC->Gsvolu(cTagV,"BOX ",idtmed[1303-1],parCha,kNparCha);
728       // Cu layer (pad plane)
729       parCha[0] = -1.0;
730       parCha[1] = -1.0;
731       parCha[2] = fgkCuThick/2.0;
732       sprintf(cTagV,"UL%02d",iDet);
733       gMC->Gsvolu(cTagV,"BOX ",idtmed[1305-1],parCha,kNparCha);
734       // Epoxy layer (glue)
735       parCha[0] = -1.0;
736       parCha[1] = -1.0;
737       parCha[2] = fgkGlThick/2.0;
738       sprintf(cTagV,"UY%02d",iDet);
739       gMC->Gsvolu(cTagV,"BOX ",idtmed[1311-1],parCha,kNparCha);
740       // G10 layer (support structure / honeycomb)
741       parCha[0] = -1.0;
742       parCha[1] = -1.0;
743       parCha[2] = fgkSuThick/2.0;
744       sprintf(cTagV,"UM%02d",iDet);
745       gMC->Gsvolu(cTagV,"BOX ",idtmed[1310-1],parCha,kNparCha);
746       // G10 layer (PCB readout board)
747       parCha[0] = -1.0;
748       parCha[1] = -1.0;
749       parCha[2] = fgkRpThick/2;
750       sprintf(cTagV,"UN%02d",iDet);
751       gMC->Gsvolu(cTagV,"BOX ",idtmed[1313-1],parCha,kNparCha);
752       // Cu layer (traces in readout board)
753       parCha[0] = -1.0;
754       parCha[1] = -1.0;
755       parCha[2] = fgkRcThick/2.0;
756       sprintf(cTagV,"UO%02d",iDet);
757       gMC->Gsvolu(cTagV,"BOX ",idtmed[1306-1],parCha,kNparCha);
758       // Cu layer (other material on in readout board)
759       parCha[0] = -1.0;
760       parCha[1] = -1.0;
761       parCha[2] = fgkRoThick/2.0;
762       sprintf(cTagV,"UV%02d",iDet);
763       gMC->Gsvolu(cTagV,"BOX ",idtmed[1304-1],parCha,kNparCha);
764
765       // Position the layers in the chambers
766       xpos = 0.0;
767       ypos = 0.0;
768       // Lower part
769       // Rohacell layer (radiator)
770       zpos = fgkRaZpos;
771       sprintf(cTagV,"UH%02d",iDet);
772       sprintf(cTagM,"UC%02d",iDet);
773       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
774       // Xe/Isobutane layer (drift volume) 
775       zpos = fgkDrZpos;
776       sprintf(cTagV,"UJ%02d",iDet);
777       sprintf(cTagM,"UB%02d",iDet);
778       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
779       // Upper part
780       // Xe/Isobutane layer (amplification volume)
781       zpos = fgkAmZpos;
782       sprintf(cTagV,"UK%02d",iDet);
783       sprintf(cTagM,"UE%02d",iDet);
784       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
785       // Cu layer (wire plane inside amplification volume)
786       zpos = fgkWrZpos; 
787       sprintf(cTagV,"UW%02d",iDet);
788       sprintf(cTagM,"UK%02d",iDet);
789       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
790       // Readout part + support plane
791       // Cu layer (pad plane)
792       zpos = fgkCuZpos; 
793       sprintf(cTagV,"UL%02d",iDet);
794       sprintf(cTagM,"UG%02d",iDet);
795       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
796       // Epoxy layer (glue)
797       zpos = fgkGlZpos; 
798       sprintf(cTagV,"UY%02d",iDet);
799       sprintf(cTagM,"UG%02d",iDet);
800       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
801       // G10 layer (support structure)
802       zpos = fgkSuZpos;
803       sprintf(cTagV,"UM%02d",iDet);
804       sprintf(cTagM,"UG%02d",iDet);
805       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
806       // G10 layer (PCB readout board)
807       zpos = fgkRpZpos;
808       sprintf(cTagV,"UN%02d",iDet);
809       sprintf(cTagM,"UG%02d",iDet);
810       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
811       // Cu layer (traces in readout board)
812       zpos = fgkRcZpos;
813       sprintf(cTagV,"UO%02d",iDet);
814       sprintf(cTagM,"UG%02d",iDet);
815       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
816       // Cu layer (other materials on readout board)
817       zpos = fgkRoZpos;
818       sprintf(cTagV,"UV%02d",iDet);
819       sprintf(cTagM,"UG%02d",iDet);
820       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
821
822       // Position the inner volumes of the chambers in the frames
823       xpos = 0.0;
824       ypos = 0.0;
825       // The inner part of the radiator
826       zpos = 0.0;
827       sprintf(cTagV,"UC%02d",iDet);
828       sprintf(cTagM,"UX%02d",iDet);
829       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
830       // The glue around the radiator
831       zpos = fgkCraH/2.0 - fgkCdrH/2.0 - fgkCraH/2.0;
832       sprintf(cTagV,"UX%02d",iDet);
833       sprintf(cTagM,"UB%02d",iDet);
834       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
835       // The lower Wacosit frame inside the aluminum frame
836       zpos = 0.0;
837       sprintf(cTagV,"UB%02d",iDet);
838       sprintf(cTagM,"UA%02d",iDet);
839       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
840       // The inside of the upper Wacosit frame
841       zpos = 0.0;
842       sprintf(cTagV,"UE%02d",iDet);
843       sprintf(cTagM,"UD%02d",iDet);
844       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
845       // The inside of the upper aluminum frame
846       zpos = 0.0;
847       sprintf(cTagV,"UG%02d",iDet);
848       sprintf(cTagM,"UF%02d",iDet);
849       gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");      
850
851       // Position the frames of the chambers in the TRD mother volume
852       xpos  = 0.0;
853       ypos  = fClength[ilayer][0] + fClength[ilayer][1] + fClength[ilayer][2]/2.0;
854       for (Int_t ic = 0; ic < istack; ic++) {
855         ypos -= fClength[ilayer][ic];
856       }
857       ypos -= fClength[ilayer][istack]/2.0;
858       zpos  = fgkVrocsm + fgkSMpltT + fgkCraH/2.0 + fgkCdrH/2.0 - fgkSheight/2.0
859             + ilayer * (fgkCH + fgkVspace);
860       // The lower aluminum frame, radiator + drift region
861       sprintf(cTagV,"UA%02d",iDet);      
862       fChamberUAorig[iDet][0] = xpos;
863       fChamberUAorig[iDet][1] = ypos;
864       fChamberUAorig[iDet][2] = zpos;
865       // The upper G10 frame, amplification region
866       sprintf(cTagV,"UD%02d",iDet);
867       zpos += fgkCamH/2.0 + fgkCraH/2.0 + fgkCdrH/2.0;      
868       fChamberUDorig[iDet][0] = xpos;
869       fChamberUDorig[iDet][1] = ypos;
870       fChamberUDorig[iDet][2] = zpos;
871       // The upper aluminum frame
872       sprintf(cTagV,"UF%02d",iDet);
873       zpos += fgkCroH/2.0 + fgkCamH/2.0;      
874       fChamberUForig[iDet][0] = xpos;
875       fChamberUForig[iDet][1] = ypos;
876       fChamberUForig[iDet][2] = zpos;
877
878     }
879   }
880
881   // Create the volumes of the super module frame
882   CreateFrame(idtmed);
883
884   // Create the volumes of the services
885   CreateServices(idtmed);
886   
887   for (Int_t istack = 0; istack < kNstack; istack++) {
888     for (Int_t ilayer = 0; ilayer < kNlayer; ilayer++) {  
889       GroupChamber(ilayer,istack,idtmed);
890     }
891   }
892   
893   xpos = 0.0;
894   ypos = 0.0;
895   zpos = 0.0;
896   gMC->Gspos("UTI1",1,"UTS1",xpos,ypos,zpos,0,"ONLY");
897   gMC->Gspos("UTI2",1,"UTS2",xpos,ypos,zpos,0,"ONLY");
898   gMC->Gspos("UTI3",1,"UTS3",xpos,ypos,zpos,0,"ONLY");
899
900   xpos = 0.0;
901   ypos = 0.0;
902   zpos = 0.0;
903   gMC->Gspos("UTS1",1,"UTR1",xpos,ypos,zpos,0,"ONLY");
904   gMC->Gspos("UTS2",1,"UTR2",xpos,ypos,zpos,0,"ONLY");
905   gMC->Gspos("UTS3",1,"UTR3",xpos,ypos,zpos,0,"ONLY");
906
907   // Put the TRD volumes into the space frame mother volumes
908   // if enabled via status flag
909   xpos = 0.0;
910   ypos = 0.0;
911   zpos = 0.0;
912   for (Int_t isector = 0; isector < kNsector; isector++) {
913     if (fSMstatus[isector]) {
914       sprintf(cTagV,"BTRD%d",isector);
915       switch (isector) {
916       case 13:
917       case 14:
918       case 15:
919         // Double carbon, w/o middle stack
920         gMC->Gspos("UTR3",1,cTagV,xpos,ypos,zpos,0,"ONLY");
921         break;
922       case 11:
923       case 12:
924         // Double carbon, all stacks
925         gMC->Gspos("UTR2",1,cTagV,xpos,ypos,zpos,0,"ONLY");
926         break;
927       default:
928         // Standard supermodule
929         gMC->Gspos("UTR1",1,cTagV,xpos,ypos,zpos,0,"ONLY");
930       };
931     }
932   }
933
934   // Put the TRD volumes into the space frame mother volumes
935   // if enabled via status flag
936   xpos = 0.0;
937   ypos = 0.5*fgkSlength + 0.5*fgkFlength;
938   zpos = 0.0;
939   for (Int_t isector = 0; isector < kNsector; isector++) {
940     if (fSMstatus[isector]) {
941       sprintf(cTagV,"BTRD%d",isector);
942       gMC->Gspos("UTF1",1,cTagV,xpos, ypos,zpos,0,"ONLY");
943       gMC->Gspos("UTF2",1,cTagV,xpos,-ypos,zpos,0,"ONLY");
944     }
945   }
946
947 }
948
949 //_____________________________________________________________________________
950 void AliTRDgeometry::CreateFrame(Int_t *idtmed)
951 {
952   //
953   // Create the geometry of the frame of the supermodule
954   //
955   // Names of the TRD services volumina
956   //
957   //        USRL    Support rails for the chambers (Al)
958   //        USxx    Support cross bars between the chambers (Al)
959   //        USHx    Horizontal connection between the cross bars (Al)
960   //        USLx    Long corner ledges (Al)
961   //
962
963   Int_t   ilayer = 0;
964
965   Float_t xpos  = 0.0;
966   Float_t ypos  = 0.0;
967   Float_t zpos  = 0.0;
968
969   Char_t  cTagV[5];
970   Char_t  cTagM[5];
971
972   const Int_t kNparTRD = 4;
973   Float_t parTRD[kNparTRD];
974   const Int_t kNparBOX = 3;
975   Float_t parBOX[kNparBOX];
976   const Int_t kNparTRP = 11;
977   Float_t parTRP[kNparTRP];
978
979   // The rotation matrices
980   const Int_t kNmatrix = 6;
981   Int_t   matrix[kNmatrix];
982   gMC->Matrix(matrix[0], 100.0,   0.0,  90.0,  90.0,  10.0,   0.0);
983   gMC->Matrix(matrix[1],  80.0,   0.0,  90.0,  90.0,  10.0, 180.0);
984   gMC->Matrix(matrix[2],  90.0,   0.0,   0.0,   0.0,  90.0,  90.0);
985   gMC->Matrix(matrix[3],  90.0, 180.0,   0.0, 180.0,  90.0,  90.0);
986   gMC->Matrix(matrix[4], 170.0,   0.0,  80.0,   0.0,  90.0,  90.0);
987   gMC->Matrix(matrix[5], 170.0, 180.0,  80.0, 180.0,  90.0,  90.0);
988   gMC->Matrix(matrix[6], 180.0, 180.0,  90.0, 180.0,  90.0,  90.0);
989
990   //
991   // The carbon inserts in the top/bottom aluminum plates
992   //
993
994   const Int_t kNparCrb = 3;
995   Float_t parCrb[kNparCrb];
996   parCrb[0] = 0.0;
997   parCrb[1] = 0.0;
998   parCrb[2] = 0.0;
999   gMC->Gsvolu("USCR","BOX ",idtmed[1307-1],parCrb,0);
1000   // Bottom 1 (all sectors)
1001   parCrb[0] =  77.49/2.0;
1002   parCrb[1] = 104.60/2.0;
1003   parCrb[2] = fgkSMpltT/2.0;
1004   xpos      =   0.0;
1005   ypos      =   0.0;
1006   zpos      = fgkSMpltT/2.0 - fgkSheight/2.0;
1007   gMC->Gsposp("USCR", 1,"UTS1", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1008   gMC->Gsposp("USCR", 2,"UTS2", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1009   gMC->Gsposp("USCR", 3,"UTS3", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1010   // Bottom 2 (all sectors)
1011   parCrb[0] =  77.49/2.0;
1012   parCrb[1] =  55.80/2.0;
1013   parCrb[2] = fgkSMpltT/2.0;
1014   xpos      =   0.0;
1015   ypos      =  85.6;
1016   zpos      = fgkSMpltT/2.0 - fgkSheight/2.0;
1017   gMC->Gsposp("USCR", 4,"UTS1", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1018   gMC->Gsposp("USCR", 5,"UTS2", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1019   gMC->Gsposp("USCR", 6,"UTS3", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1020   gMC->Gsposp("USCR", 7,"UTS1", xpos,-ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1021   gMC->Gsposp("USCR", 8,"UTS2", xpos,-ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1022   gMC->Gsposp("USCR", 9,"UTS3", xpos,-ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1023   // Bottom 3 (all sectors)
1024   parCrb[0] =  77.49/2.0;
1025   parCrb[1] =  56.00/2.0;
1026   parCrb[2] = fgkSMpltT/2.0;
1027   xpos      =   0.0;
1028   ypos      = 148.5;
1029   zpos      = fgkSMpltT/2.0 - fgkSheight/2.0;
1030   gMC->Gsposp("USCR",10,"UTS1", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1031   gMC->Gsposp("USCR",11,"UTS2", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1032   gMC->Gsposp("USCR",12,"UTS3", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1033   gMC->Gsposp("USCR",13,"UTS1", xpos,-ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1034   gMC->Gsposp("USCR",14,"UTS2", xpos,-ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1035   gMC->Gsposp("USCR",15,"UTS3", xpos,-ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1036   // Bottom 4 (all sectors)
1037   parCrb[0] =  77.49/2.0;
1038   parCrb[1] = 118.00/2.0;
1039   parCrb[2] = fgkSMpltT/2.0;
1040   xpos      =   0.0;
1041   ypos      = 240.5;
1042   zpos      = fgkSMpltT/2.0 - fgkSheight/2.0;
1043   gMC->Gsposp("USCR",16,"UTS1", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1044   gMC->Gsposp("USCR",17,"UTS2", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1045   gMC->Gsposp("USCR",18,"UTS3", xpos, ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1046   gMC->Gsposp("USCR",19,"UTS1", xpos,-ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1047   gMC->Gsposp("USCR",20,"UTS2", xpos,-ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1048   gMC->Gsposp("USCR",21,"UTS3", xpos,-ypos, zpos,0,"ONLY",parCrb,kNparCrb);
1049   // Top 1 (only in front of PHOS)
1050   parCrb[0] = 111.48/2.0;
1051   parCrb[1] = 105.00/2.0;
1052   parCrb[2] = fgkSMpltT/2.0;
1053   xpos      =   0.0;
1054   ypos      =   0.0;
1055   zpos      = fgkSMpltT/2.0 - fgkSheight/2.0;
1056   gMC->Gsposp("USCR",22,"UTS2", xpos, ypos,-zpos,0,"ONLY",parCrb,kNparCrb);
1057   gMC->Gsposp("USCR",23,"UTS3", xpos, ypos,-zpos,0,"ONLY",parCrb,kNparCrb);
1058   // Top 2 (only in front of PHOS)
1059   parCrb[0] = 111.48/2.0;
1060   parCrb[1] =  56.00/2.0;
1061   parCrb[2] = fgkSMpltT/2.0;
1062   xpos      =   0.0;
1063   ypos      =  85.5;
1064   zpos      = fgkSMpltT/2.0 - fgkSheight/2.0;
1065   gMC->Gsposp("USCR",24,"UTS2", xpos, ypos,-zpos,0,"ONLY",parCrb,kNparCrb);
1066   gMC->Gsposp("USCR",25,"UTS3", xpos, ypos,-zpos,0,"ONLY",parCrb,kNparCrb);
1067   gMC->Gsposp("USCR",26,"UTS2", xpos,-ypos,-zpos,0,"ONLY",parCrb,kNparCrb);
1068   gMC->Gsposp("USCR",27,"UTS3", xpos,-ypos,-zpos,0,"ONLY",parCrb,kNparCrb);
1069
1070   //
1071   // The chamber support rails
1072   //
1073
1074   const Float_t kSRLwid  = 2.00;
1075   const Float_t kSRLhgt  = 2.3;
1076   const Float_t kSRLdst  = 1.0;
1077   const Int_t   kNparSRL = 3;
1078   Float_t parSRL[kNparSRL];
1079   parSRL[0] = kSRLwid   /2.0;
1080   parSRL[1] = fgkSlength/2.0;
1081   parSRL[2] = kSRLhgt   /2.0;
1082   gMC->Gsvolu("USRL","BOX ",idtmed[1301-1],parSRL,kNparSRL);
1083
1084   xpos  = 0.0;
1085   ypos  = 0.0;
1086   zpos  = 0.0;
1087   for (ilayer = 0; ilayer < kNlayer; ilayer++) {
1088     xpos  = fCwidth[ilayer]/2.0 + kSRLwid/2.0 + kSRLdst;
1089     ypos  = 0.0;
1090     zpos  = fgkVrocsm + fgkSMpltT + fgkCraH + fgkCdrH + fgkCamH 
1091           - fgkSheight/2.0  
1092           + ilayer * (fgkCH + fgkVspace);
1093     gMC->Gspos("USRL",ilayer+1          ,"UTI1", xpos,ypos,zpos,0,"ONLY");
1094     gMC->Gspos("USRL",ilayer+1+  kNlayer,"UTI1",-xpos,ypos,zpos,0,"ONLY");
1095     gMC->Gspos("USRL",ilayer+1+2*kNlayer,"UTI2", xpos,ypos,zpos,0,"ONLY");
1096     gMC->Gspos("USRL",ilayer+1+3*kNlayer,"UTI2",-xpos,ypos,zpos,0,"ONLY");
1097     gMC->Gspos("USRL",ilayer+1+4*kNlayer,"UTI3", xpos,ypos,zpos,0,"ONLY");
1098     gMC->Gspos("USRL",ilayer+1+5*kNlayer,"UTI3",-xpos,ypos,zpos,0,"ONLY");
1099   }
1100
1101   //
1102   // The cross bars between the chambers
1103   //
1104
1105   const Float_t kSCBwid  = 1.0;
1106   const Float_t kSCBthk  = 2.0;
1107   const Float_t kSCHhgt  = 0.3;
1108
1109   const Int_t   kNparSCB = 3;
1110   Float_t parSCB[kNparSCB];
1111   parSCB[1] = kSCBwid/2.0;
1112   parSCB[2] = fgkCH  /2.0 + fgkVspace/2.0 - kSCHhgt;
1113
1114   const Int_t   kNparSCI = 3;
1115   Float_t parSCI[kNparSCI];
1116   parSCI[1] = -1;
1117
1118   xpos  = 0.0;
1119   ypos  = 0.0;
1120   zpos  = 0.0;
1121   for (ilayer = 0; ilayer < kNlayer; ilayer++) {
1122
1123     // The aluminum of the cross bars
1124     parSCB[0] = fCwidth[ilayer]/2.0 + kSRLdst/2.0;
1125     sprintf(cTagV,"USF%01d",ilayer);
1126     gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parSCB,kNparSCB);
1127
1128     // The empty regions in the cross bars
1129     Float_t thkSCB = kSCBthk;
1130     if (ilayer < 2) {
1131       thkSCB *= 1.5;
1132     }
1133     parSCI[2] = parSCB[2] - thkSCB;
1134     parSCI[0] = parSCB[0]/4.0 - kSCBthk;
1135     sprintf(cTagV,"USI%01d",ilayer);
1136     gMC->Gsvolu(cTagV,"BOX ",idtmed[1302-1],parSCI,kNparSCI);
1137
1138     sprintf(cTagV,"USI%01d",ilayer);
1139     sprintf(cTagM,"USF%01d",ilayer);
1140     ypos  = 0.0;
1141     zpos  = 0.0;
1142     xpos  =   parSCI[0] + thkSCB/2.0;
1143     gMC->Gspos(cTagV,1,cTagM,xpos,ypos,zpos,0,"ONLY");
1144     xpos  = - parSCI[0] - thkSCB/2.0;
1145     gMC->Gspos(cTagV,2,cTagM,xpos,ypos,zpos,0,"ONLY");
1146     xpos  =   3.0 * parSCI[0] + 1.5 * thkSCB;
1147     gMC->Gspos(cTagV,3,cTagM,xpos,ypos,zpos,0,"ONLY");
1148     xpos  = - 3.0 * parSCI[0] - 1.5 * thkSCB;
1149     gMC->Gspos(cTagV,4,cTagM,xpos,ypos,zpos,0,"ONLY");
1150
1151     sprintf(cTagV,"USF%01d",ilayer);
1152     xpos  = 0.0;
1153     zpos  = fgkVrocsm + fgkSMpltT + parSCB[2] - fgkSheight/2.0 
1154           + ilayer * (fgkCH + fgkVspace);
1155
1156     ypos  =   fClength[ilayer][2]/2.0 + fClength[ilayer][1];
1157     gMC->Gspos(cTagV, 1,"UTI1", xpos,ypos,zpos,0,"ONLY");
1158     gMC->Gspos(cTagV, 3,"UTI2", xpos,ypos,zpos,0,"ONLY");
1159     gMC->Gspos(cTagV, 5,"UTI3", xpos,ypos,zpos,0,"ONLY");
1160
1161     ypos  = - fClength[ilayer][2]/2.0 - fClength[ilayer][1];
1162     gMC->Gspos(cTagV, 2,"UTI1", xpos,ypos,zpos,0,"ONLY");
1163     gMC->Gspos(cTagV, 4,"UTI2", xpos,ypos,zpos,0,"ONLY");
1164     gMC->Gspos(cTagV, 6,"UTI3", xpos,ypos,zpos,0,"ONLY");
1165
1166   }
1167
1168   //
1169   // The horizontal connections between the cross bars
1170   //
1171
1172   const Int_t   kNparSCH = 3;
1173   Float_t parSCH[kNparSCH];
1174
1175   for (ilayer = 1; ilayer < kNlayer-1; ilayer++) {
1176
1177     parSCH[0] = fCwidth[ilayer]/2.0;
1178     parSCH[1] = (fClength[ilayer+1][2]/2.0 + fClength[ilayer+1][1]
1179                - fClength[ilayer  ][2]/2.0 - fClength[ilayer  ][1])/2.0;
1180     parSCH[2] = kSCHhgt/2.0;
1181
1182     sprintf(cTagV,"USH%01d",ilayer);
1183     gMC->Gsvolu(cTagV,"BOX ",idtmed[1301-1],parSCH,kNparSCH);
1184     xpos  = 0.0;
1185     ypos  = fClength[ilayer][2]/2.0 + fClength[ilayer][1] + parSCH[1];
1186     zpos  = fgkVrocsm + fgkSMpltT - kSCHhgt/2.0 - fgkSheight/2.0 
1187           + (ilayer+1) * (fgkCH + fgkVspace);
1188     gMC->Gspos(cTagV,1,"UTI1", xpos,ypos,zpos,0,"ONLY");
1189     gMC->Gspos(cTagV,3,"UTI2", xpos,ypos,zpos,0,"ONLY");
1190     gMC->Gspos(cTagV,5,"UTI3", xpos,ypos,zpos,0,"ONLY");
1191     ypos  = -ypos;
1192     gMC->Gspos(cTagV,2,"UTI1", xpos,ypos,zpos,0,"ONLY");
1193     gMC->Gspos(cTagV,4,"UTI2", xpos,ypos,zpos,0,"ONLY");
1194     gMC->Gspos(cTagV,6,"UTI3", xpos,ypos,zpos,0,"ONLY");
1195
1196   }
1197
1198   //
1199   // The aymmetric flat frame in the middle
1200   //
1201
1202   // The envelope volume (aluminum)
1203   parTRD[0]  =  87.60/2.0;
1204   parTRD[1]  = 114.00/2.0;
1205   parTRD[2]  =   1.20/2.0;
1206   parTRD[3]  =  71.30/2.0;
1207   gMC->Gsvolu("USDB","TRD1",idtmed[1301-1],parTRD,kNparTRD);
1208   // Empty spaces (air)
1209   parTRP[ 0] =   1.20/2.0;
1210   parTRP[ 1] =   0.0;
1211   parTRP[ 2] =   0.0;
1212   parTRP[ 3] =  27.00/2.0;
1213   parTRP[ 4] =  50.60/2.0;
1214   parTRP[ 5] =   5.00/2.0;
1215   parTRP[ 6] =   3.5;
1216   parTRP[ 7] =  27.00/2.0;
1217   parTRP[ 8] =  50.60/2.0;
1218   parTRP[ 9] =   5.00/2.0;
1219   parTRP[10] =   3.5;
1220   gMC->Gsvolu("USD1","TRAP",idtmed[1302-1],parTRP,kNparTRP);
1221   xpos       =  18.0;
1222   ypos       =   0.0;
1223   zpos       =   27.00/2.0 - 71.3/2.0;
1224   gMC->Gspos("USD1",1,"USDB", xpos, ypos, zpos,matrix[2],"ONLY");
1225   // Empty spaces (air)
1226   parTRP[ 0] =   1.20/2.0;
1227   parTRP[ 1] =   0.0;
1228   parTRP[ 2] =   0.0;
1229   parTRP[ 3] =  33.00/2.0;
1230   parTRP[ 4] =   5.00/2.0;
1231   parTRP[ 5] =  62.10/2.0;
1232   parTRP[ 6] =   3.5;
1233   parTRP[ 7] =  33.00/2.0;
1234   parTRP[ 8] =   5.00/2.0;
1235   parTRP[ 9] =  62.10/2.0;
1236   parTRP[10] =   3.5;
1237   gMC->Gsvolu("USD2","TRAP",idtmed[1302-1],parTRP,kNparTRP);
1238   xpos       =  21.0;
1239   ypos       =   0.0;
1240   zpos       =  71.3/2.0 - 33.0/2.0;
1241   gMC->Gspos("USD2",1,"USDB", xpos, ypos, zpos,matrix[2],"ONLY");
1242   // Empty spaces (air)
1243   parBOX[ 0] =  22.50/2.0;
1244   parBOX[ 1] =   1.20/2.0;
1245   parBOX[ 2] =  70.50/2.0;
1246   gMC->Gsvolu("USD3","BOX ",idtmed[1302-1],parBOX,kNparBOX);
1247   xpos       = -25.75;
1248   ypos       =   0.0;
1249   zpos       =   0.4;
1250   gMC->Gspos("USD3",1,"USDB", xpos, ypos, zpos,        0,"ONLY");
1251   // Empty spaces (air)
1252   parTRP[ 0] =   1.20/2.0;
1253   parTRP[ 1] =   0.0;
1254   parTRP[ 2] =   0.0;
1255   parTRP[ 3] =  25.50/2.0;
1256   parTRP[ 4] =   5.00/2.0;
1257   parTRP[ 5] =  65.00/2.0;
1258   parTRP[ 6] =  -1.0;
1259   parTRP[ 7] =  25.50/2.0;
1260   parTRP[ 8] =   5.00/2.0;
1261   parTRP[ 9] =  65.00/2.0;
1262   parTRP[10] =  -1.0;
1263   gMC->Gsvolu("USD4","TRAP",idtmed[1302-1],parTRP,kNparTRP);
1264   xpos       =   2.0;
1265   ypos       =   0.0;
1266   zpos       =  -1.6;
1267   gMC->Gspos("USD4",1,"USDB", xpos, ypos, zpos,matrix[6],"ONLY");
1268   // Empty spaces (air)
1269   parTRP[ 0] =   1.20/2.0;
1270   parTRP[ 1] =   0.0;
1271   parTRP[ 2] =   0.0;
1272   parTRP[ 3] =  23.50/2.0;
1273   parTRP[ 4] =  63.50/2.0;
1274   parTRP[ 5] =   5.00/2.0;
1275   parTRP[ 6] =  16.0;
1276   parTRP[ 7] =  23.50/2.0;
1277   parTRP[ 8] =  63.50/2.0;
1278   parTRP[ 9] =   5.00/2.0;
1279   parTRP[10] =  16.0;
1280   gMC->Gsvolu("USD5","TRAP",idtmed[1302-1],parTRP,kNparTRP);
1281   xpos       =  36.5;
1282   ypos       =   0.0;
1283   zpos       =  -1.5;
1284   gMC->Gspos("USD5",1,"USDB", xpos, ypos, zpos,matrix[5],"ONLY");
1285   // Empty spaces (air)
1286   parTRP[ 0] =   1.20/2.0;
1287   parTRP[ 1] =   0.0;
1288   parTRP[ 2] =   0.0;
1289   parTRP[ 3] =  70.50/2.0;
1290   parTRP[ 4] =   4.50/2.0;
1291   parTRP[ 5] =  16.50/2.0;
1292   parTRP[ 6] =  -5.0;
1293   parTRP[ 7] =  70.50/2.0;
1294   parTRP[ 8] =   4.50/2.0;
1295   parTRP[ 9] =  16.50/2.0;
1296   parTRP[10] =  -5.0;
1297   gMC->Gsvolu("USD6","TRAP",idtmed[1302-1],parTRP,kNparTRP);
1298   xpos       = -43.7;
1299   ypos       =   0.0;
1300   zpos       =   0.4;
1301   gMC->Gspos("USD6",1,"USDB", xpos, ypos, zpos,matrix[2],"ONLY");
1302   xpos       =   0.0;
1303   ypos       =   fClength[5][2]/2.0;
1304   zpos       =   0.04;
1305   gMC->Gspos("USDB",1,"UTI1", xpos, ypos, zpos,        0,"ONLY");
1306   gMC->Gspos("USDB",2,"UTI1", xpos,-ypos, zpos,        0,"ONLY");
1307   gMC->Gspos("USDB",3,"UTI2", xpos, ypos, zpos,        0,"ONLY");
1308   gMC->Gspos("USDB",4,"UTI2", xpos,-ypos, zpos,        0,"ONLY");
1309   gMC->Gspos("USDB",5,"UTI3", xpos, ypos, zpos,        0,"ONLY");
1310   gMC->Gspos("USDB",6,"UTI3", xpos,-ypos, zpos,        0,"ONLY");
1311   // Upper bar (aluminum)
1312   parBOX[0] = 95.00/2.0;
1313   parBOX[1] =  1.20/2.0;
1314   parBOX[2] =  3.00/2.0;
1315   gMC->Gsvolu("USD7","BOX ",idtmed[1301-1],parBOX,kNparBOX);
1316   xpos       =   0.0;
1317   ypos       =   fClength[5][2]/2.0;
1318   zpos       =   fgkSheight/2.0 - fgkSMpltT  - 3.00/2.0;
1319   gMC->Gspos("USD7",1,"UTI1", xpos, ypos, zpos,        0,"ONLY");
1320   gMC->Gspos("USD7",2,"UTI1", xpos,-ypos, zpos,        0,"ONLY");
1321   gMC->Gspos("USD7",3,"UTI2", xpos, ypos, zpos,        0,"ONLY");
1322   gMC->Gspos("USD7",4,"UTI2", xpos,-ypos, zpos,        0,"ONLY");
1323   gMC->Gspos("USD7",5,"UTI3", xpos, ypos, zpos,        0,"ONLY");
1324   gMC->Gspos("USD7",6,"UTI3", xpos,-ypos, zpos,        0,"ONLY");
1325   // Lower bar (aluminum)
1326   parBOX[0] = 90.22/2.0;
1327   parBOX[1] =  1.20/2.0;
1328   parBOX[2] =  1.74/2.0;
1329   gMC->Gsvolu("USD8","BOX ",idtmed[1301-1],parBOX,kNparBOX);
1330   xpos       =   0.0;
1331   ypos       =   fClength[5][2]/2.0 - 0.1;
1332   zpos       =  -fgkSheight/2.0 + fgkSMpltT + 2.27;
1333   gMC->Gspos("USD8",1,"UTI1", xpos, ypos, zpos,        0,"ONLY");
1334   gMC->Gspos("USD8",2,"UTI1", xpos,-ypos, zpos,        0,"ONLY");
1335   gMC->Gspos("USD8",3,"UTI2", xpos, ypos, zpos,        0,"ONLY");
1336   gMC->Gspos("USD8",4,"UTI2", xpos,-ypos, zpos,        0,"ONLY");
1337   gMC->Gspos("USD8",5,"UTI3", xpos, ypos, zpos,        0,"ONLY");
1338   gMC->Gspos("USD8",6,"UTI3", xpos,-ypos, zpos,        0,"ONLY");
1339   // Lower bar (aluminum)
1340   parBOX[0] = 82.60/2.0;
1341   parBOX[1] =  1.20/2.0;
1342   parBOX[2] =  1.40/2.0;
1343   gMC->Gsvolu("USD9","BOX ",idtmed[1301-1],parBOX,kNparBOX);
1344   xpos       =   0.0;
1345   ypos       =   fClength[5][2]/2.0;
1346   zpos       =  -fgkSheight/2.0 + fgkSMpltT + 1.40/2.0;
1347   gMC->Gspos("USD9",1,"UTI1", xpos, ypos, zpos,        0,"ONLY");
1348   gMC->Gspos("USD9",2,"UTI1", xpos,-ypos, zpos,        0,"ONLY");
1349   gMC->Gspos("USD9",3,"UTI2", xpos, ypos, zpos,        0,"ONLY");
1350   gMC->Gspos("USD9",4,"UTI2", xpos,-ypos, zpos,        0,"ONLY");
1351   gMC->Gspos("USD9",5,"UTI3", xpos, ypos, zpos,        0,"ONLY");
1352   gMC->Gspos("USD9",6,"UTI3", xpos,-ypos, zpos,        0,"ONLY");
1353   // Front sheet (aluminum)
1354   parTRP[ 0] =   0.10/2.0;
1355   parTRP[ 1] =   0.0;
1356   parTRP[ 2] =   0.0;
1357   parTRP[ 3] =  74.50/2.0;
1358   parTRP[ 4] =  31.70/2.0;
1359   parTRP[ 5] =  44.00/2.0;
1360   parTRP[ 6] =  -5.0;
1361   parTRP[ 7] =  74.50/2.0;
1362   parTRP[ 8] =  31.70/2.0;
1363   parTRP[ 9] =  44.00/2.0;
1364   parTRP[10] =  -5.0;
1365   gMC->Gsvolu("USDF","TRAP",idtmed[1302-1],parTRP,kNparTRP);
1366   xpos       = -32.0;
1367   ypos       =   fClength[5][2]/2.0 + 1.20/2.0 + 0.10/2.0;
1368   zpos       =   0.0;
1369   gMC->Gspos("USDF",1,"UTI1", xpos, ypos, zpos,matrix[2],"ONLY");
1370   gMC->Gspos("USDF",2,"UTI1", xpos,-ypos, zpos,matrix[2],"ONLY");
1371   gMC->Gspos("USDF",3,"UTI2", xpos, ypos, zpos,matrix[2],"ONLY");
1372   gMC->Gspos("USDF",4,"UTI2", xpos,-ypos, zpos,matrix[2],"ONLY");
1373   gMC->Gspos("USDF",5,"UTI3", xpos, ypos, zpos,matrix[2],"ONLY");
1374   gMC->Gspos("USDF",6,"UTI3", xpos,-ypos, zpos,matrix[2],"ONLY");
1375
1376   //
1377   // The flat frame in front of the chambers
1378   //
1379
1380   // The envelope volume (aluminum)
1381   parTRD[0]  =  90.00/2.0;
1382   parTRD[1]  = 114.00/2.0;
1383   parTRD[2]  =   1.50/2.0;
1384   parTRD[3]  =  70.30/2.0;
1385   gMC->Gsvolu("USCB","TRD1",idtmed[1301-1],parTRD,kNparTRD);
1386   // Empty spaces (air)
1387   parTRD[0]  =  87.00/2.0;
1388   parTRD[1]  =  10.00/2.0;
1389   parTRD[2]  =   1.50/2.0;
1390   parTRD[3]  =  26.35/2.0;
1391   gMC->Gsvolu("USC1","TRD1",idtmed[1302-1],parTRD,kNparTRD);
1392   xpos       =  0.0;
1393   ypos       =  0.0;
1394   zpos       = 26.35/2.0 - 70.3/2.0;
1395   gMC->Gspos("USC1",1,"USCB",xpos,ypos,zpos,0,"ONLY");
1396   // Empty spaces (air)
1397   parTRD[0]  =  10.00/2.0;
1398   parTRD[1]  = 111.00/2.0;
1399   parTRD[2]  =   1.50/2.0;
1400   parTRD[3]  =  35.05/2.0;
1401   gMC->Gsvolu("USC2","TRD1",idtmed[1302-1],parTRD,kNparTRD);
1402   xpos       =  0.0;
1403   ypos       =  0.0;
1404   zpos       = 70.3/2.0 - 35.05/2.0;
1405   gMC->Gspos("USC2",1,"USCB",xpos,ypos,zpos,0,"ONLY");
1406   // Empty spaces (air)
1407   parTRP[ 0] =   1.50/2.0;
1408   parTRP[ 1] =   0.0;
1409   parTRP[ 2] =   0.0;
1410   parTRP[ 3] =  37.60/2.0;
1411   parTRP[ 4] =  63.90/2.0;
1412   parTRP[ 5] =   8.86/2.0;
1413   parTRP[ 6] =  16.0;
1414   parTRP[ 7] =  37.60/2.0;
1415   parTRP[ 8] =  63.90/2.0;
1416   parTRP[ 9] =   8.86/2.0;
1417   parTRP[10] =  16.0;
1418   gMC->Gsvolu("USC3","TRAP",idtmed[1302-1],parTRP,kNparTRP);
1419   xpos       = -30.5;
1420   ypos       =   0.0;
1421   zpos       =  -2.0;
1422   gMC->Gspos("USC3",1,"USCB", xpos, ypos, zpos,matrix[4],"ONLY");
1423   gMC->Gspos("USC3",2,"USCB",-xpos, ypos, zpos,matrix[5],"ONLY");
1424   xpos       =   0.0;
1425   ypos       =   fClength[5][2]/2.0 + fClength[5][1] + fClength[5][0];
1426   zpos       =   0.0;
1427   gMC->Gspos("USCB",1,"UTI1", xpos, ypos, zpos,        0,"ONLY");
1428   gMC->Gspos("USCB",2,"UTI1", xpos,-ypos, zpos,        0,"ONLY");
1429   gMC->Gspos("USCB",3,"UTI2", xpos, ypos, zpos,        0,"ONLY");
1430   gMC->Gspos("USCB",4,"UTI2", xpos,-ypos, zpos,        0,"ONLY");
1431   gMC->Gspos("USCB",5,"UTI3", xpos, ypos, zpos,        0,"ONLY");
1432   gMC->Gspos("USCB",6,"UTI3", xpos,-ypos, zpos,        0,"ONLY");
1433   // Upper bar (aluminum)
1434   parBOX[0] = 95.00/2.0;
1435   parBOX[1] =  1.50/2.0;
1436   parBOX[2] =  3.00/2.0;
1437   gMC->Gsvolu("USC4","BOX ",idtmed[1301-1],parBOX,kNparBOX);
1438   xpos       =   0.0;
1439   ypos       =   fClength[5][2]/2.0 + fClength[5][1] + fClength[5][0];
1440   zpos       =   fgkSheight/2.0 - fgkSMpltT - 3.00/2.0;
1441   gMC->Gspos("USC4",1,"UTI1", xpos, ypos, zpos,        0,"ONLY");
1442   gMC->Gspos("USC4",2,"UTI1", xpos,-ypos, zpos,        0,"ONLY");
1443   gMC->Gspos("USC4",3,"UTI2", xpos, ypos, zpos,        0,"ONLY");
1444   gMC->Gspos("USC4",4,"UTI2", xpos,-ypos, zpos,        0,"ONLY");
1445   gMC->Gspos("USC4",5,"UTI3", xpos, ypos, zpos,        0,"ONLY");
1446   gMC->Gspos("USC4",6,"UTI3", xpos,-ypos, zpos,        0,"ONLY");
1447   // Lower bar (aluminum)
1448   parBOX[0] = 90.22/2.0;
1449   parBOX[1] =  1.50/2.0;
1450   parBOX[2] =  2.00/2.0;
1451   gMC->Gsvolu("USC5","BOX ",idtmed[1301-1],parBOX,kNparBOX);
1452   xpos       =   0.0;
1453   ypos       =   fClength[5][2]/2.0 + fClength[5][1] + fClength[5][0];
1454   zpos       =  -fgkSheight/2.0 + fgkSMpltT + 2.60;
1455   gMC->Gspos("USC5",1,"UTI1", xpos, ypos, zpos,        0,"ONLY");
1456   gMC->Gspos("USC5",2,"UTI1", xpos,-ypos, zpos,        0,"ONLY");
1457   gMC->Gspos("USC5",3,"UTI2", xpos, ypos, zpos,        0,"ONLY");
1458   gMC->Gspos("USC5",4,"UTI2", xpos,-ypos, zpos,        0,"ONLY");
1459   gMC->Gspos("USC5",5,"UTI3", xpos, ypos, zpos,        0,"ONLY");
1460   gMC->Gspos("USC5",6,"UTI3", xpos,-ypos, zpos,        0,"ONLY");
1461   // Lower bar (aluminum)
1462   parBOX[0] = 82.60/2.0;
1463   parBOX[1] =  1.50/2.0;
1464   parBOX[2] =  1.60/2.0;
1465   gMC->Gsvolu("USC6","BOX ",idtmed[1301-1],parBOX,kNparBOX);
1466   xpos       =   0.0;
1467   ypos       =   fClength[5][2]/2.0 + fClength[5][1] + fClength[5][0];
1468   zpos       =  -fgkSheight/2.0 + fgkSMpltT + 1.60/2.0;
1469   gMC->Gspos("USC6",1,"UTI1", xpos, ypos, zpos,        0,"ONLY");
1470   gMC->Gspos("USC6",2,"UTI1", xpos,-ypos, zpos,        0,"ONLY");
1471   gMC->Gspos("USC6",3,"UTI2", xpos, ypos, zpos,        0,"ONLY");
1472   gMC->Gspos("USC6",4,"UTI2", xpos,-ypos, zpos,        0,"ONLY");
1473   gMC->Gspos("USC6",5,"UTI3", xpos, ypos, zpos,        0,"ONLY");
1474   gMC->Gspos("USC6",6,"UTI3", xpos,-ypos, zpos,        0,"ONLY");
1475
1476   //
1477   // The long corner ledges
1478   //
1479
1480   const Int_t   kNparSCL  =  3;
1481   Float_t parSCL[kNparSCL];
1482   const Int_t   kNparSCLb = 11;
1483   Float_t parSCLb[kNparSCLb];
1484
1485   // Upper ledges 
1486   // Thickness of the corner ledges
1487   const Float_t kSCLthkUa  =  0.6; 
1488   const Float_t kSCLthkUb  =  0.6; 
1489   // Width of the corner ledges
1490   const Float_t kSCLwidUa  =  3.2;
1491   const Float_t kSCLwidUb  =  4.8;
1492   // Position of the corner ledges
1493   const Float_t kSCLposxUa = 0.7;
1494   const Float_t kSCLposxUb = 3.3;
1495   const Float_t kSCLposzUa = 1.65;
1496   const Float_t kSCLposzUb = 0.3;
1497   // Vertical
1498   parSCL[0]  = kSCLthkUa /2.0;
1499   parSCL[1]  = fgkSlength/2.0;
1500   parSCL[2]  = kSCLwidUa /2.0;
1501   gMC->Gsvolu("USL1","BOX ",idtmed[1301-1],parSCL,kNparSCL);
1502   xpos  =   fgkSwidth2/2.0 - fgkSMpltT - kSCLposxUa;
1503   ypos  =   0.0;
1504   zpos  =   fgkSheight/2.0 - fgkSMpltT - kSCLposzUa;
1505   gMC->Gspos("USL1",1,"UTI1", xpos,ypos,zpos,matrix[0],"ONLY");
1506   xpos  = -xpos;
1507   gMC->Gspos("USL1",2,"UTI1", xpos,ypos,zpos,matrix[1],"ONLY");
1508   // Horizontal
1509   parSCL[0]  = kSCLwidUb /2.0;
1510   parSCL[1]  = fgkSlength/2.0;
1511   parSCL[2]  = kSCLthkUb /2.0;
1512   gMC->Gsvolu("USL2","BOX ",idtmed[1301-1],parSCL,kNparSCL);
1513   xpos  =   fgkSwidth2/2.0 - fgkSMpltT - kSCLposxUb;
1514   ypos  =   0.0;
1515   zpos  =   fgkSheight/2.0 - fgkSMpltT - kSCLposzUb; 
1516   gMC->Gspos("USL2",1,"UTI1", xpos,ypos,zpos,        0,"ONLY");
1517   gMC->Gspos("USL2",3,"UTI2", xpos,ypos,zpos,        0,"ONLY");
1518   gMC->Gspos("USL2",5,"UTI3", xpos,ypos,zpos,        0,"ONLY");
1519   xpos  = -xpos;
1520   gMC->Gspos("USL2",2,"UTI1", xpos,ypos,zpos,        0,"ONLY");
1521   gMC->Gspos("USL2",4,"UTI2", xpos,ypos,zpos,        0,"ONLY");
1522   gMC->Gspos("USL2",6,"UTI3", xpos,ypos,zpos,        0,"ONLY");
1523
1524   // Lower ledges 
1525   // Thickness of the corner ledges
1526   const Float_t kSCLthkLa  =  2.464; 
1527   const Float_t kSCLthkLb  =  1.0; 
1528   // Width of the corner ledges
1529   const Float_t kSCLwidLa  =  8.5;
1530   const Float_t kSCLwidLb  =  3.3;
1531   // Position of the corner ledges
1532   const Float_t kSCLposxLa =  0.15;
1533   const Float_t kSCLposxLb =  2.7;
1534   const Float_t kSCLposzLa = -4.25;
1535   const Float_t kSCLposzLb = -0.5;
1536   // Vertical
1537   // Trapezoidal shape
1538   parSCLb[ 0] = fgkSlength/2.0;
1539   parSCLb[ 1] = 0.0;
1540   parSCLb[ 2] = 0.0;
1541   parSCLb[ 3] = kSCLwidLa /2.0;
1542   parSCLb[ 4] = kSCLthkLb /2.0;
1543   parSCLb[ 5] = kSCLthkLa /2.0;
1544   parSCLb[ 6] = 5.0;
1545   parSCLb[ 7] = kSCLwidLa /2.0;
1546   parSCLb[ 8] = kSCLthkLb /2.0;
1547   parSCLb[ 9] = kSCLthkLa /2.0;
1548   parSCLb[10] = 5.0;
1549   gMC->Gsvolu("USL3","TRAP",idtmed[1301-1],parSCLb,kNparSCLb);
1550   xpos  =   fgkSwidth1/2.0 - fgkSMpltT - kSCLposxLa;
1551   ypos  =   0.0;
1552   zpos  = - fgkSheight/2.0 + fgkSMpltT - kSCLposzLa;
1553   gMC->Gspos("USL3",1,"UTI1", xpos,ypos,zpos,matrix[2],"ONLY");
1554   gMC->Gspos("USL3",3,"UTI2", xpos,ypos,zpos,matrix[2],"ONLY");
1555   gMC->Gspos("USL3",5,"UTI3", xpos,ypos,zpos,matrix[2],"ONLY");
1556   xpos  = -xpos;
1557   gMC->Gspos("USL3",2,"UTI1", xpos,ypos,zpos,matrix[3],"ONLY");
1558   gMC->Gspos("USL3",4,"UTI2", xpos,ypos,zpos,matrix[3],"ONLY");
1559   gMC->Gspos("USL3",6,"UTI3", xpos,ypos,zpos,matrix[3],"ONLY");
1560   // Horizontal
1561   parSCL[0]  = kSCLwidLb /2.0;
1562   parSCL[1]  = fgkSlength/2.0;
1563   parSCL[2]  = kSCLthkLb /2.0;
1564   gMC->Gsvolu("USL4","BOX ",idtmed[1301-1],parSCL,kNparSCL);
1565   xpos  =   fgkSwidth1/2.0 - fgkSMpltT - kSCLposxLb;
1566   ypos  =   0.0;
1567   zpos  = - fgkSheight/2.0 + fgkSMpltT - kSCLposzLb;
1568   gMC->Gspos("USL4",1,"UTI1", xpos,ypos,zpos,        0,"ONLY");
1569   gMC->Gspos("USL4",3,"UTI2", xpos,ypos,zpos,        0,"ONLY");
1570   gMC->Gspos("USL4",5,"UTI3", xpos,ypos,zpos,        0,"ONLY");
1571   xpos  = -xpos;
1572   gMC->Gspos("USL4",2,"UTI1", xpos,ypos,zpos,        0,"ONLY");
1573   gMC->Gspos("USL4",4,"UTI2", xpos,ypos,zpos,        0,"ONLY");
1574   gMC->Gspos("USL4",6,"UTI3", xpos,ypos,zpos,        0,"ONLY");
1575
1576   //
1577   // Aluminum plates in the front part of the super modules
1578   //
1579
1580   const Int_t kNparTrd = 4;
1581   Float_t parTrd[kNparTrd];
1582   parTrd[0] = fgkSwidth1/2.0 - 2.5;
1583   parTrd[1] = fgkSwidth2/2.0 - 2.5;
1584   parTrd[2] = fgkSMpltT /2.0;
1585   parTrd[3] = fgkSheight/2.0 - 1.0;
1586   gMC->Gsvolu("UTA1","TRD1",idtmed[1301-1],parTrd,kNparTrd);
1587   xpos      =  0.0;
1588   ypos      =  fgkSMpltT/2.0 - fgkFlength/2.0;
1589   zpos      = -0.5;
1590   gMC->Gspos("UTA1",1,"UTF1",xpos, ypos,zpos,        0,"ONLY");
1591   gMC->Gspos("UTA1",2,"UTF2",xpos,-ypos,zpos,        0,"ONLY");
1592
1593   const Int_t kNparPlt = 3;
1594   Float_t parPlt[kNparPlt];
1595   parPlt[0] =  0.0;
1596   parPlt[1] =  0.0;
1597   parPlt[2] =  0.0;
1598   gMC->Gsvolu("UTA2","BOX ",idtmed[1301-1],parPlt,0);
1599   xpos      =  0.0;
1600   ypos      =  0.0;
1601   zpos      =  fgkSheight/2.0 - fgkSMpltT/2.0;
1602   parPlt[0] = fgkSwidth2/2.0 - 0.2;
1603   parPlt[1] = fgkFlength/2.0;
1604   parPlt[2] = fgkSMpltT /2.0;
1605   gMC->Gsposp("UTA2",1,"UTF2",xpos,ypos,zpos
1606                     ,        0,"ONLY",parPlt,kNparPlt);
1607   xpos      = (fgkSwidth1 + fgkSwidth2)/4.0 - fgkSMpltT/2.0 - 0.0016;
1608   ypos      =  0.0;
1609   zpos      =  0.0;
1610   parPlt[0] = fgkSMpltT /2.0;
1611   parPlt[1] = fgkFlength/2.0;
1612   parPlt[2] = fgkSheight/2.0;
1613   gMC->Gsposp("UTA2",2,"UTF2", xpos,ypos,zpos
1614                     ,matrix[0],"ONLY",parPlt,kNparPlt);
1615   gMC->Gsposp("UTA2",3,"UTF2",-xpos,ypos,zpos
1616                     ,matrix[1],"ONLY",parPlt,kNparPlt);
1617
1618   // Additional aluminum bar
1619   parBOX[0] = 80.0/2.0;
1620   parBOX[1] =  1.0/2.0;
1621   parBOX[2] = 10.0/2.0;
1622   gMC->Gsvolu("UTA3","BOX ",idtmed[1301-1],parBOX,kNparBOX);
1623   xpos      =  0.0;
1624   ypos      =  1.0/2.0 + fgkSMpltT - fgkFlength/2.0;
1625   zpos      =  fgkSheight/2.0 - 1.5 - 10.0/2.0;
1626   gMC->Gspos("UTA3",1,"UTF1", xpos, ypos, zpos,        0,"ONLY");
1627   gMC->Gspos("UTA3",2,"UTF2", xpos,-ypos, zpos,        0,"ONLY");
1628
1629 }
1630
1631 //_____________________________________________________________________________
1632 void AliTRDgeometry::CreateServices(Int_t *idtmed)
1633 {
1634   //
1635   // Create the geometry of the services
1636   //
1637   // Names of the TRD services volumina
1638   //
1639   //        UTC1    Cooling arterias (Al)
1640   //        UTC2    Cooling arterias (Water)
1641   //        UUxx    Volumes for the services at the chambers (Air)
1642   //        UTP1    Power bars       (Cu)
1643   //        UTCP    Cooling pipes    (Fe)
1644   //        UTCH    Cooling pipes    (Water)
1645   //        UTPL    Power lines      (Cu)
1646   //        UMCM    Readout MCMs     (G10/Cu/Si)
1647   //        UTGD    Gas distribution box (V2A)
1648   //
1649
1650   Int_t   ilayer = 0;
1651   Int_t   istack = 0;
1652
1653   Float_t xpos  = 0.0;
1654   Float_t ypos  = 0.0;
1655   Float_t zpos  = 0.0;
1656
1657   Char_t  cTagV[5];
1658
1659   const Int_t kNparBox  = 3;
1660   Float_t parBox[kNparBox];
1661
1662   const Int_t kNparTube = 3;
1663   Float_t parTube[kNparTube];
1664
1665   // Services inside the baby frame
1666   const Float_t kBBMdz = 223.0;
1667   const Float_t kBBSdz =   8.5;
1668
1669   // Services inside the back frame
1670   const Float_t kBFMdz = 118.0;
1671   const Float_t kBFSdz =   8.5;
1672
1673   // The rotation matrices
1674   const Int_t kNmatrix = 10;
1675   Int_t   matrix[kNmatrix];
1676   gMC->Matrix(matrix[0], 100.0,   0.0,  90.0,  90.0,  10.0,   0.0); // rotation around y-axis
1677   gMC->Matrix(matrix[1],  80.0,   0.0,  90.0,  90.0,  10.0, 180.0); // rotation around y-axis
1678   gMC->Matrix(matrix[2],   0.0,   0.0,  90.0,  90.0,  90.0,   0.0);
1679   gMC->Matrix(matrix[3], 180.0,   0.0,  90.0,  90.0,  90.0, 180.0);
1680   gMC->Matrix(matrix[4],  90.0,   0.0,   0.0,   0.0,  90.0,  90.0);
1681   gMC->Matrix(matrix[5], 100.0,   0.0,  90.0, 270.0,  10.0,   0.0);
1682   gMC->Matrix(matrix[6],  80.0,   0.0,  90.0, 270.0,  10.0, 180.0);
1683   gMC->Matrix(matrix[7],  90.0,  10.0,  90.0, 100.0,   0.0,   0.0); // rotation around z-axis
1684   gMC->Matrix(matrix[8],  90.0, 350.0,  90.0,  80.0,   0.0,   0.0); // rotation around z-axis
1685   gMC->Matrix(matrix[9],  90.0,  90.0,  90.0, 180.0,   0.0,   0.0); // rotation around z-axis
1686     
1687   //
1688   // The cooling arterias
1689   //
1690
1691   // Width of the cooling arterias
1692   const Float_t kCOLwid  =  0.8; 
1693   // Height of the cooling arterias
1694   const Float_t kCOLhgt  =  6.5;
1695   // Positioning of the cooling 
1696   const Float_t kCOLposx =  1.8;
1697   const Float_t kCOLposz = -0.1;
1698   // Thickness of the walls of the cooling arterias
1699   const Float_t kCOLthk  =  0.1;
1700   const Int_t   kNparCOL =  3;
1701   Float_t parCOL[kNparCOL];
1702   parCOL[0] = 0.0;
1703   parCOL[1] = 0.0;
1704   parCOL[2] = 0.0;
1705   gMC->Gsvolu("UTC1","BOX ",idtmed[1308-1],parCOL,0);
1706   gMC->Gsvolu("UTC3","BOX ",idtmed[1308-1],parCOL,0);
1707   parCOL[0] =  kCOLwid/2.0 - kCOLthk;
1708   parCOL[1] = -1.0;
1709   parCOL[2] =  kCOLhgt/2.0 - kCOLthk;
1710   gMC->Gsvolu("UTC2","BOX ",idtmed[1314-1],parCOL,kNparCOL);
1711   gMC->Gsvolu("UTC4","BOX ",idtmed[1314-1],parCOL,kNparCOL);
1712
1713   xpos  = 0.0;
1714   ypos  = 0.0;
1715   zpos  = 0.0;
1716   gMC->Gspos("UTC2",1,"UTC1", xpos,ypos,zpos,0,"ONLY");
1717   gMC->Gspos("UTC4",1,"UTC3", xpos,ypos,zpos,0,"ONLY");
1718
1719   for (ilayer = 1; ilayer < kNlayer; ilayer++) { 
1720
1721     // Along the chambers
1722     xpos      = fCwidth[ilayer]/2.0 + kCOLwid/2.0 + kCOLposx;
1723     ypos      = 0.0;
1724     zpos      = fgkVrocsm + fgkSMpltT + kCOLhgt/2.0 - fgkSheight/2.0 + kCOLposz 
1725               + ilayer * (fgkCH + fgkVspace);
1726     parCOL[0] = kCOLwid   /2.0;
1727     parCOL[1] = fgkSlength/2.0;
1728     parCOL[2] = kCOLhgt   /2.0;
1729     gMC->Gsposp("UTC1",ilayer          ,"UTI1", xpos,ypos,zpos
1730                       ,matrix[0],"ONLY",parCOL,kNparCOL);
1731     gMC->Gsposp("UTC1",ilayer+  kNlayer,"UTI1",-xpos,ypos,zpos
1732                       ,matrix[1],"ONLY",parCOL,kNparCOL);
1733     gMC->Gsposp("UTC1",ilayer+6*kNlayer,"UTI2", xpos,ypos,zpos
1734                       ,matrix[0],"ONLY",parCOL,kNparCOL);
1735     gMC->Gsposp("UTC1",ilayer+7*kNlayer,"UTI2",-xpos,ypos,zpos
1736                       ,matrix[1],"ONLY",parCOL,kNparCOL);
1737     gMC->Gsposp("UTC1",ilayer+8*kNlayer ,"UTI3", xpos,ypos,zpos
1738                       ,matrix[0],"ONLY",parCOL,kNparCOL);
1739     gMC->Gsposp("UTC1",ilayer+9*kNlayer,"UTI3",-xpos,ypos,zpos
1740                       ,matrix[1],"ONLY",parCOL,kNparCOL);
1741
1742     // Front of supermodules
1743     xpos      = fCwidth[ilayer]/2.0 + kCOLwid/2.0 + kCOLposx;
1744     ypos      = 0.0;
1745     zpos      = fgkVrocsm + fgkSMpltT + kCOLhgt/2.0 - fgkSheight/2.0 + kCOLposz 
1746               + ilayer * (fgkCH + fgkVspace);
1747     parCOL[0] = kCOLwid   /2.0;
1748     parCOL[1] = fgkFlength/2.0;
1749     parCOL[2] = kCOLhgt   /2.0;
1750     gMC->Gsposp("UTC3",ilayer+2*kNlayer,"UTF1", xpos,ypos,zpos
1751                       ,matrix[0],"ONLY",parCOL,kNparCOL);
1752     gMC->Gsposp("UTC3",ilayer+3*kNlayer,"UTF1",-xpos,ypos,zpos
1753                       ,matrix[1],"ONLY",parCOL,kNparCOL);
1754     gMC->Gsposp("UTC3",ilayer+4*kNlayer,"UTF2", xpos,ypos,zpos
1755                       ,matrix[0],"ONLY",parCOL,kNparCOL);
1756     gMC->Gsposp("UTC3",ilayer+5*kNlayer,"UTF2",-xpos,ypos,zpos
1757                       ,matrix[1],"ONLY",parCOL,kNparCOL);
1758
1759   }
1760
1761   for (ilayer = 1; ilayer < kNlayer; ilayer++) { 
1762
1763     // In baby frame
1764     xpos      = fCwidth[ilayer]/2.0 + kCOLwid/2.0 - 1.04;
1765     ypos      = kBBSdz/2.0 - kBBMdz/2.0;
1766     zpos      = fgkVrocsm + fgkSMpltT + kCOLhgt/2.0 - fgkSheight/2.0 + kCOLposz 
1767               + ilayer * (fgkCH + fgkVspace);
1768     parCOL[0] = kCOLwid/2.0;
1769     parCOL[1] = kBBSdz /2.0;
1770     parCOL[2] = kCOLhgt/2.0;
1771     gMC->Gsposp("UTC3",ilayer+6*kNlayer,"BBTRD", xpos, ypos, zpos
1772                       ,matrix[0],"ONLY",parCOL,kNparCOL);
1773     gMC->Gsposp("UTC3",ilayer+7*kNlayer,"BBTRD",-xpos, ypos, zpos
1774                       ,matrix[1],"ONLY",parCOL,kNparCOL);
1775
1776   }
1777
1778   for (ilayer = 1; ilayer < kNlayer; ilayer++) { 
1779
1780     // In back frame
1781     xpos      = fCwidth[ilayer]/2.0 + kCOLwid/2.0 + kCOLposx;
1782     ypos      = -kBFSdz/2.0 + kBFMdz/2.0;
1783     zpos      = fgkVrocsm + fgkSMpltT + kCOLhgt/2.0 - fgkSheight/2.0 + kCOLposz 
1784               + ilayer * (fgkCH + fgkVspace);
1785     parCOL[0] = kCOLwid/2.0;
1786     parCOL[1] = kBFSdz /2.0;
1787     parCOL[2] = kCOLhgt/2.0;
1788     gMC->Gsposp("UTC3",ilayer+6*kNlayer,"BFTRD", xpos,ypos,zpos
1789                       ,matrix[0],"ONLY",parCOL,kNparCOL);
1790     gMC->Gsposp("UTC3",ilayer+7*kNlayer,"BFTRD",-xpos,ypos,zpos
1791                       ,matrix[1],"ONLY",parCOL,kNparCOL);
1792
1793   }
1794
1795   // The upper most layer (reaching into TOF acceptance)
1796   // Along the chambers
1797   xpos      = fCwidth[5]/2.0 - kCOLhgt/2.0 - 1.3;
1798   ypos      = 0.0;
1799   zpos      = fgkSheight/2.0 - fgkSMpltT - 0.4 - kCOLwid/2.0; 
1800   parCOL[0] = kCOLwid   /2.0;
1801   parCOL[1] = fgkSlength/2.0;
1802   parCOL[2] = kCOLhgt   /2.0;
1803   gMC->Gsposp("UTC1",6          ,"UTI1", xpos,ypos,zpos
1804                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1805   gMC->Gsposp("UTC1",6+  kNlayer,"UTI1",-xpos,ypos,zpos
1806                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1807   gMC->Gsposp("UTC1",6+6*kNlayer,"UTI2", xpos,ypos,zpos
1808                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1809   gMC->Gsposp("UTC1",6+7*kNlayer,"UTI2",-xpos,ypos,zpos
1810                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1811   gMC->Gsposp("UTC1",6+8*kNlayer,"UTI3", xpos,ypos,zpos
1812                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1813   gMC->Gsposp("UTC1",6+9*kNlayer,"UTI3",-xpos,ypos,zpos
1814                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1815   // Front of supermodules
1816   xpos      = fCwidth[5]/2.0 - kCOLhgt/2.0 - 1.3;
1817   ypos      = 0.0;
1818   zpos      = fgkSheight/2.0 - fgkSMpltT - 0.4 - kCOLwid/2.0; 
1819   parCOL[0] = kCOLwid   /2.0;
1820   parCOL[1] = fgkFlength/2.0;
1821   parCOL[2] = kCOLhgt   /2.0;
1822   gMC->Gsposp("UTC3",6+2*kNlayer,"UTF1", xpos,ypos,zpos
1823                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1824   gMC->Gsposp("UTC3",6+3*kNlayer,"UTF1",-xpos,ypos,zpos
1825                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1826   gMC->Gsposp("UTC3",6+4*kNlayer,"UTF2", xpos,ypos,zpos
1827                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1828   gMC->Gsposp("UTC3",6+5*kNlayer,"UTF2",-xpos,ypos,zpos
1829                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1830   // In baby frame
1831   xpos      = fCwidth[5]/2.0 - kCOLhgt/2.0 - 3.1;
1832   ypos      = kBBSdz/2.0 - kBBMdz/2.0;
1833   zpos      = fgkSheight/2.0 - fgkSMpltT - 0.4 - kCOLwid/2.0; 
1834   parCOL[0] = kCOLwid/2.0;
1835   parCOL[1] = kBBSdz /2.0;
1836   parCOL[2] = kCOLhgt/2.0;
1837   gMC->Gsposp("UTC3",6+6*kNlayer,"BBTRD", xpos, ypos, zpos
1838                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1839   gMC->Gsposp("UTC3",6+7*kNlayer,"BBTRD",-xpos, ypos, zpos
1840                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1841   // In back frame
1842   xpos      = fCwidth[5]/2.0 - kCOLhgt/2.0 - 1.3;
1843   ypos      = -kBFSdz/2.0 + kBFMdz/2.0;
1844   zpos      = fgkSheight/2.0 - fgkSMpltT - 0.4 - kCOLwid/2.0; 
1845   parCOL[0] = kCOLwid/2.0;
1846   parCOL[1] = kBFSdz /2.0;
1847   parCOL[2] = kCOLhgt/2.0;
1848   gMC->Gsposp("UTC3",6+6*kNlayer,"BFTRD", xpos,ypos,zpos
1849                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1850   gMC->Gsposp("UTC3",6+7*kNlayer,"BFTRD",-xpos,ypos,zpos
1851                     ,matrix[3],"ONLY",parCOL,kNparCOL);
1852
1853   //
1854   // The power bars
1855   //
1856
1857   const Float_t kPWRwid  =  0.6;
1858   const Float_t kPWRhgt  =  5.0;
1859   const Float_t kPWRposx =  1.4;
1860   const Float_t kPWRposz =  1.9;
1861   const Int_t   kNparPWR =  3;
1862   Float_t parPWR[kNparPWR];
1863   parPWR[0] = 0.0;
1864   parPWR[1] = 0.0;
1865   parPWR[2] = 0.0;
1866   gMC->Gsvolu("UTP1","BOX ",idtmed[1325-1],parPWR,0);
1867   gMC->Gsvolu("UTP3","BOX ",idtmed[1325-1],parPWR,0);
1868   
1869   for (ilayer = 1; ilayer < kNlayer; ilayer++) { 
1870
1871     // Along the chambers
1872     xpos      = fCwidth[ilayer]/2.0 + kPWRwid/2.0 + kPWRposx;
1873     ypos      = 0.0;
1874     zpos      = fgkVrocsm + fgkSMpltT + kPWRhgt/2.0 - fgkSheight/2.0 + kPWRposz 
1875               + ilayer * (fgkCH + fgkVspace);
1876     parPWR[0] = kPWRwid   /2.0;
1877     parPWR[1] = fgkSlength/2.0;
1878     parPWR[2] = kPWRhgt   /2.0;
1879     gMC->Gsposp("UTP1",ilayer          ,"UTI1", xpos,ypos,zpos
1880                       ,matrix[0],"ONLY",parPWR,kNparPWR);
1881     gMC->Gsposp("UTP1",ilayer+  kNlayer,"UTI1",-xpos,ypos,zpos
1882                       ,matrix[1],"ONLY",parPWR,kNparPWR);
1883     gMC->Gsposp("UTP1",ilayer+6*kNlayer,"UTI2", xpos,ypos,zpos
1884                       ,matrix[0],"ONLY",parPWR,kNparPWR);
1885     gMC->Gsposp("UTP1",ilayer+7*kNlayer,"UTI2",-xpos,ypos,zpos
1886                       ,matrix[1],"ONLY",parPWR,kNparPWR);
1887     gMC->Gsposp("UTP1",ilayer+8*kNlayer,"UTI3", xpos,ypos,zpos
1888                       ,matrix[0],"ONLY",parPWR,kNparPWR);
1889     gMC->Gsposp("UTP1",ilayer+9*kNlayer,"UTI3",-xpos,ypos,zpos
1890                       ,matrix[1],"ONLY",parPWR,kNparPWR);
1891
1892     // Front of supermodule
1893     xpos      = fCwidth[ilayer]/2.0 + kPWRwid/2.0 + kPWRposx;
1894     ypos      = 0.0;
1895     zpos      = fgkVrocsm + fgkSMpltT + kPWRhgt/2.0 - fgkSheight/2.0 + kPWRposz 
1896               + ilayer * (fgkCH + fgkVspace);
1897     parPWR[0] = kPWRwid   /2.0;
1898     parPWR[1] = fgkFlength/2.0;
1899     parPWR[2] = kPWRhgt   /2.0;
1900     gMC->Gsposp("UTP3",ilayer+2*kNlayer,"UTF1", xpos,ypos,zpos
1901                       ,matrix[0],"ONLY",parPWR,kNparPWR);
1902     gMC->Gsposp("UTP3",ilayer+3*kNlayer,"UTF1",-xpos,ypos,zpos
1903                       ,matrix[1],"ONLY",parPWR,kNparPWR);
1904     gMC->Gsposp("UTP3",ilayer+4*kNlayer,"UTF2", xpos,ypos,zpos
1905                       ,matrix[0],"ONLY",parPWR,kNparPWR);
1906     gMC->Gsposp("UTP3",ilayer+5*kNlayer,"UTF2",-xpos,ypos,zpos
1907                       ,matrix[1],"ONLY",parPWR,kNparPWR);
1908
1909   }
1910
1911   for (ilayer = 1; ilayer < kNlayer; ilayer++) { 
1912
1913     // In baby frame
1914     xpos      = fCwidth[ilayer]/2.0 + kPWRwid/2.0;
1915     ypos      = kBBSdz/2.0 - kBBMdz/2.0;
1916     zpos      = fgkVrocsm + fgkSMpltT + kPWRhgt/2.0 - fgkSheight/2.0 + kPWRposz 
1917               + ilayer * (fgkCH + fgkVspace);
1918     parPWR[0] = kPWRwid/2.0;
1919     parPWR[1] = kBBSdz /2.0;
1920     parPWR[2] = kPWRhgt/2.0;
1921     gMC->Gsposp("UTP3",ilayer+6*kNlayer,"BBTRD", xpos, ypos, zpos
1922                       ,matrix[0],"ONLY",parPWR,kNparPWR);
1923     gMC->Gsposp("UTP3",ilayer+7*kNlayer,"BBTRD",-xpos, ypos, zpos
1924                       ,matrix[1],"ONLY",parPWR,kNparPWR);
1925
1926   }
1927
1928   for (ilayer = 1; ilayer < kNlayer; ilayer++) { 
1929
1930     // In back frame
1931     xpos      = fCwidth[ilayer]/2.0 + kPWRwid/2.0 + kPWRposx;
1932     ypos      = -kBFSdz/2.0 + kBFMdz/2.0;
1933     zpos      = fgkVrocsm + fgkSMpltT + kPWRhgt/2.0 - fgkSheight/2.0 + kPWRposz 
1934               + ilayer * (fgkCH + fgkVspace);
1935     parPWR[0] = kPWRwid/2.0;
1936     parPWR[1] = kBFSdz /2.0;
1937     parPWR[2] = kPWRhgt/2.0;
1938     gMC->Gsposp("UTP3",ilayer+8*kNlayer,"BFTRD", xpos,ypos,zpos
1939                       ,matrix[0],"ONLY",parPWR,kNparPWR);
1940     gMC->Gsposp("UTP3",ilayer+9*kNlayer,"BFTRD",-xpos,ypos,zpos
1941                       ,matrix[1],"ONLY",parPWR,kNparPWR);
1942
1943   }
1944
1945   // The upper most layer
1946   // Along the chambers
1947   xpos      = fCwidth[5]/2.0 + kPWRhgt/2.0 - 1.3;
1948   ypos      = 0.0;
1949   zpos      = fgkSheight/2.0 - fgkSMpltT - 0.6 - kPWRwid/2.0; 
1950   parPWR[0] = kPWRwid   /2.0;
1951   parPWR[1] = fgkSlength/2.0;
1952   parPWR[2] = kPWRhgt   /2.0;
1953   gMC->Gsposp("UTP1",6          ,"UTI1", xpos,ypos,zpos
1954                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1955   gMC->Gsposp("UTP1",6+  kNlayer,"UTI1",-xpos,ypos,zpos
1956                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1957   gMC->Gsposp("UTP1",6+6*kNlayer,"UTI2", xpos,ypos,zpos
1958                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1959   gMC->Gsposp("UTP1",6+7*kNlayer,"UTI2",-xpos,ypos,zpos
1960                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1961   gMC->Gsposp("UTP1",6+8*kNlayer,"UTI3", xpos,ypos,zpos
1962                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1963   gMC->Gsposp("UTP1",6+9*kNlayer,"UTI3",-xpos,ypos,zpos
1964                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1965   // Front of supermodules
1966   xpos      = fCwidth[5]/2.0 + kPWRhgt/2.0 - 1.3;
1967   ypos      = 0.0;
1968   zpos      = fgkSheight/2.0 - fgkSMpltT - 0.6 - kPWRwid/2.0; 
1969   parPWR[0] = kPWRwid   /2.0;
1970   parPWR[1] = fgkFlength/2.0;
1971   parPWR[2] = kPWRhgt   /2.0;
1972   gMC->Gsposp("UTP3",6+2*kNlayer,"UTF1", xpos,ypos,zpos
1973                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1974   gMC->Gsposp("UTP3",6+3*kNlayer,"UTF1",-xpos,ypos,zpos
1975                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1976   gMC->Gsposp("UTP3",6+4*kNlayer,"UTF2", xpos,ypos,zpos
1977                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1978   gMC->Gsposp("UTP3",6+5*kNlayer,"UTF2",-xpos,ypos,zpos
1979                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1980   // In baby frame
1981   xpos      = fCwidth[5]/2.0 + kPWRhgt/2.0 - 3.0;
1982   ypos      = kBBSdz/2.0 - kBBMdz/2.0;
1983   zpos      = fgkSheight/2.0 - fgkSMpltT - 0.6 - kPWRwid/2.0; 
1984   parPWR[0] = kPWRwid/2.0;
1985   parPWR[1] = kBBSdz /2.0;
1986   parPWR[2] = kPWRhgt/2.0;
1987   gMC->Gsposp("UTP3",6+6*kNlayer,"BBTRD", xpos, ypos, zpos
1988                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1989   gMC->Gsposp("UTP3",6+7*kNlayer,"BBTRD",-xpos, ypos, zpos
1990                     ,matrix[3],"ONLY",parPWR,kNparPWR);
1991   // In back frame
1992   xpos      = fCwidth[5]/2.0 + kPWRhgt/2.0 - 1.3;
1993   ypos      = -kBFSdz/2.0 + kBFMdz/2.0;
1994   zpos      = fgkSheight/2.0 - fgkSMpltT - 0.6 - kPWRwid/2.0; 
1995   parPWR[0] = kPWRwid/2.0;
1996   parPWR[1] = kBFSdz /2.0;
1997   parPWR[2] = kPWRhgt/2.0;
1998   gMC->Gsposp("UTP3",6+8*kNlayer,"BFTRD", xpos,ypos,zpos
1999                     ,matrix[3],"ONLY",parPWR,kNparPWR);
2000   gMC->Gsposp("UTP3",6+9*kNlayer,"BFTRD",-xpos,ypos,zpos
2001                     ,matrix[3],"ONLY",parPWR,kNparPWR);
2002
2003   //
2004   // The gas tubes connecting the chambers in the super modules with holes
2005   // Material: Stainless steel
2006   //
2007
2008   parTube[0] = 0.0;
2009   parTube[1] = 2.2/2.0;
2010   parTube[2] = fClength[5][2]/2.0 - fgkHspace/2.0;
2011   gMC->Gsvolu("UTG1","TUBE",idtmed[1308-1],parTube,kNparTube);
2012   parTube[0] = 0.0;
2013   parTube[1] = 2.1/2.0;
2014   parTube[2] = fClength[5][2]/2.0 - fgkHspace/2.0;
2015   gMC->Gsvolu("UTG2","TUBE",idtmed[1309-1],parTube,kNparTube);
2016   xpos  = 0.0;
2017   ypos  = 0.0;
2018   zpos  = 0.0;
2019   gMC->Gspos("UTG2",1,"UTG1",xpos,ypos,zpos,0,"ONLY");
2020   for (ilayer = 0; ilayer < kNlayer; ilayer++) { 
2021     xpos      = fCwidth[ilayer]/2.0 + kCOLwid/2.0 - 1.5;
2022     ypos      = 0.0;
2023     zpos      = fgkVrocsm + fgkSMpltT + kCOLhgt/2.0 - fgkSheight/2.0 + 5.0 
2024               + ilayer * (fgkCH + fgkVspace);
2025     gMC->Gspos("UTG1",1+ilayer,"UTI3", xpos, ypos, zpos,matrix[4],"ONLY");
2026     gMC->Gspos("UTG1",7+ilayer,"UTI3",-xpos, ypos, zpos,matrix[4],"ONLY");
2027   }
2028
2029   //
2030   // The volumes for the services at the chambers
2031   //
2032
2033   const Int_t kNparServ = 3;
2034   Float_t parServ[kNparServ];
2035
2036   for (istack = 0; istack < kNstack; istack++) {
2037     for (ilayer = 0; ilayer < kNlayer; ilayer++) {
2038
2039       Int_t iDet = GetDetectorSec(ilayer,istack);
2040
2041       sprintf(cTagV,"UU%02d",iDet);
2042       parServ[0] = fCwidth[ilayer]         /2.0;
2043       parServ[1] = fClength[ilayer][istack]/2.0 - fgkHspace/2.0;
2044       parServ[2] = fgkVspace               /2.0 - 0.742/2.0; 
2045       fChamberUUboxd[iDet][0] = parServ[0];
2046       fChamberUUboxd[iDet][1] = parServ[1];
2047       fChamberUUboxd[iDet][2] = parServ[2];
2048       gMC->Gsvolu(cTagV,"BOX",idtmed[1302-1],parServ,kNparServ);
2049
2050       xpos  = 0.0;
2051       ypos  = fClength[ilayer][0] + fClength[ilayer][1] + fClength[ilayer][2]/2.0;
2052       for (Int_t ic = 0; ic < istack; ic++) {
2053         ypos -= fClength[ilayer][ic];
2054       }
2055       ypos -= fClength[ilayer][istack]/2.0;
2056       zpos  = fgkVrocsm + fgkSMpltT + fgkCH + fgkVspace/2.0 - fgkSheight/2.0
2057             + ilayer * (fgkCH + fgkVspace);
2058       zpos -= 0.742/2.0;
2059       fChamberUUorig[iDet][0] = xpos;
2060       fChamberUUorig[iDet][1] = ypos;
2061       fChamberUUorig[iDet][2] = zpos;
2062
2063     }
2064   }
2065
2066   //
2067   // The cooling pipes inside the service volumes
2068   //
2069
2070   // The cooling pipes
2071   parTube[0] =  0.0;
2072   parTube[1] =  0.0;
2073   parTube[2] =  0.0;
2074   gMC->Gsvolu("UTCP","TUBE",idtmed[1324-1],parTube,0);
2075   // The cooling water
2076   parTube[0] =  0.0;
2077   parTube[1] =  0.2/2.0;
2078   parTube[2] = -1.0;
2079   gMC->Gsvolu("UTCH","TUBE",idtmed[1314-1],parTube,kNparTube);
2080   // Water inside the cooling pipe
2081   xpos = 0.0;
2082   ypos = 0.0;
2083   zpos = 0.0;
2084   gMC->Gspos("UTCH",1,"UTCP",xpos,ypos,zpos,0,"ONLY");
2085
2086   // Position the cooling pipes in the mother volume
2087   for (istack = 0; istack < kNstack; istack++) {
2088     for (ilayer = 0; ilayer < kNlayer; ilayer++) {
2089       Int_t   iDet    = GetDetectorSec(ilayer,istack);
2090       Int_t   iCopy   = GetDetector(ilayer,istack,0) * 100;
2091       Int_t   nMCMrow = GetRowMax(ilayer,istack,0);
2092       Float_t ySize   = (GetChamberLength(ilayer,istack) - 2.0*fgkRpadW) 
2093                       / ((Float_t) nMCMrow);
2094       sprintf(cTagV,"UU%02d",iDet);
2095       for (Int_t iMCMrow = 0; iMCMrow < nMCMrow; iMCMrow++) {
2096         xpos   = 0.0;
2097         ypos   = (0.5 + iMCMrow) * ySize - 1.9 
2098                - fClength[ilayer][istack]/2.0 + fgkHspace/2.0;
2099         zpos   = 0.0 + 0.742/2.0;                 
2100         // The cooling pipes
2101         parTube[0] = 0.0;
2102         parTube[1] = 0.3/2.0; // Thickness of the cooling pipes
2103         parTube[2] = fCwidth[ilayer]/2.0;
2104         gMC->Gsposp("UTCP",iCopy+iMCMrow,cTagV,xpos,ypos,zpos
2105                           ,matrix[2],"ONLY",parTube,kNparTube);
2106       }
2107     }
2108   }
2109
2110   //
2111   // The power lines
2112   //
2113
2114   // The copper power lines
2115   parTube[0] = 0.0;
2116   parTube[1] = 0.0;
2117   parTube[2] = 0.0;
2118   gMC->Gsvolu("UTPL","TUBE",idtmed[1305-1],parTube,0);
2119
2120   // Position the power lines in the mother volume
2121   for (istack = 0; istack < kNstack; istack++) {
2122     for (ilayer = 0; ilayer < kNlayer; ilayer++) {
2123       Int_t   iDet    = GetDetectorSec(ilayer,istack);
2124       Int_t   iCopy   = GetDetector(ilayer,istack,0) * 100;
2125       Int_t   nMCMrow = GetRowMax(ilayer,istack,0);
2126       Float_t ySize   = (GetChamberLength(ilayer,istack) - 2.0*fgkRpadW) 
2127                       / ((Float_t) nMCMrow);
2128       sprintf(cTagV,"UU%02d",iDet);
2129       for (Int_t iMCMrow = 0; iMCMrow < nMCMrow; iMCMrow++) {
2130         xpos       = 0.0;
2131         ypos       = (0.5 + iMCMrow) * ySize - 1.0 
2132                    - fClength[ilayer][istack]/2.0 + fgkHspace/2.0;
2133         zpos       = -0.4 + 0.742/2.0;
2134         parTube[0] = 0.0;
2135         parTube[1] = 0.2/2.0; // Thickness of the power lines
2136         parTube[2] = fCwidth[ilayer]/2.0;
2137         gMC->Gsposp("UTPL",iCopy+iMCMrow,cTagV,xpos,ypos,zpos
2138                           ,matrix[2],"ONLY",parTube,kNparTube);
2139       }
2140     }
2141   }
2142
2143   //
2144   // The MCMs
2145   //
2146
2147   const Float_t kMCMx    = 3.0;
2148   const Float_t kMCMy    = 3.0;
2149   const Float_t kMCMz    = 0.3;
2150   
2151   const Float_t kMCMpcTh = 0.1;
2152   const Float_t kMCMcuTh = 0.0025;
2153   const Float_t kMCMsiTh = 0.03;
2154   const Float_t kMCMcoTh = 0.04;
2155
2156   // The mother volume for the MCMs (air)
2157   const Int_t kNparMCM = 3;
2158   Float_t parMCM[kNparMCM];
2159   parMCM[0] = kMCMx   /2.0;
2160   parMCM[1] = kMCMy   /2.0;
2161   parMCM[2] = kMCMz   /2.0;
2162   gMC->Gsvolu("UMCM","BOX",idtmed[1302-1],parMCM,kNparMCM);
2163
2164   // The MCM carrier G10 layer
2165   parMCM[0] = kMCMx   /2.0;
2166   parMCM[1] = kMCMy   /2.0;
2167   parMCM[2] = kMCMpcTh/2.0;
2168   gMC->Gsvolu("UMC1","BOX",idtmed[1319-1],parMCM,kNparMCM);
2169   // The MCM carrier Cu layer
2170   parMCM[0] = kMCMx   /2.0;
2171   parMCM[1] = kMCMy   /2.0;
2172   parMCM[2] = kMCMcuTh/2.0;
2173   gMC->Gsvolu("UMC2","BOX",idtmed[1318-1],parMCM,kNparMCM);
2174   // The silicon of the chips
2175   parMCM[0] = kMCMx   /2.0;
2176   parMCM[1] = kMCMy   /2.0;
2177   parMCM[2] = kMCMsiTh/2.0;
2178   gMC->Gsvolu("UMC3","BOX",idtmed[1320-1],parMCM,kNparMCM);
2179   // The aluminum of the cooling plates
2180   parMCM[0] = kMCMx   /2.0;
2181   parMCM[1] = kMCMy   /2.0;
2182   parMCM[2] = kMCMcoTh/2.0;
2183   gMC->Gsvolu("UMC4","BOX",idtmed[1324-1],parMCM,kNparMCM);
2184
2185   // Put the MCM material inside the MCM mother volume
2186   xpos  =  0.0;
2187   ypos  =  0.0;
2188   zpos  = -kMCMz   /2.0 + kMCMpcTh/2.0;
2189   gMC->Gspos("UMC1",1,"UMCM",xpos,ypos,zpos,0,"ONLY");
2190   zpos +=  kMCMpcTh/2.0 + kMCMcuTh/2.0;
2191   gMC->Gspos("UMC2",1,"UMCM",xpos,ypos,zpos,0,"ONLY");
2192   zpos +=  kMCMcuTh/2.0 + kMCMsiTh/2.0;
2193   gMC->Gspos("UMC3",1,"UMCM",xpos,ypos,zpos,0,"ONLY");
2194   zpos +=  kMCMsiTh/2.0 + kMCMcoTh/2.0;
2195   gMC->Gspos("UMC4",1,"UMCM",xpos,ypos,zpos,0,"ONLY");
2196
2197   // Position the MCMs in the mother volume
2198   for (istack = 0; istack < kNstack; istack++) {
2199     for (ilayer = 0; ilayer < kNlayer; ilayer++) {
2200       Int_t   iDet    = GetDetectorSec(ilayer,istack);
2201       Int_t   iCopy   = GetDetector(ilayer,istack,0) * 1000;
2202       Int_t   nMCMrow = GetRowMax(ilayer,istack,0);
2203       Float_t ySize   = (GetChamberLength(ilayer,istack) - 2.0*fgkRpadW)
2204                       / ((Float_t) nMCMrow);
2205       Int_t   nMCMcol = 8;
2206       Float_t xSize   = (GetChamberWidth(ilayer)         - 2.0*fgkCpadW)
2207                       / ((Float_t) nMCMcol + 6);             // Introduce 6 gaps
2208       Int_t   iMCM[8] = {  1,  2,  3,  5,  8,  9, 10, 12 };  // 0..7 MCM + 6 gap structure
2209       sprintf(cTagV,"UU%02d",iDet);
2210       for (Int_t iMCMrow = 0; iMCMrow < nMCMrow; iMCMrow++) {
2211         for (Int_t iMCMcol = 0; iMCMcol < nMCMcol; iMCMcol++) {
2212           xpos      = (0.5 + iMCM[iMCMcol]) * xSize + 1.0
2213                     - fCwidth[ilayer]/2.0;
2214           ypos      = (0.5 + iMCMrow) * ySize + 1.0
2215                     - fClength[ilayer][istack]/2.0 + fgkHspace/2.0;
2216           zpos      = -0.4 + 0.742/2.0;
2217           gMC->Gspos("UMCM",iCopy+iMCMrow*10+iMCMcol,cTagV
2218                            ,xpos,ypos,zpos,0,"ONLY");
2219         }
2220       }
2221
2222     }
2223   }
2224
2225   //
2226   // Services in front of the super module
2227   //
2228
2229   // Gas in-/outlet pipes (INOX)
2230   parTube[0] = 0.0;
2231   parTube[1] = 0.0;
2232   parTube[2] = 0.0;
2233   gMC->Gsvolu("UTG3","TUBE",idtmed[1308-1],parTube,0);
2234   // The gas inside the in-/outlet pipes (Xe)
2235   parTube[0] =  0.0;
2236   parTube[1] =  1.2/2.0;
2237   parTube[2] = -1.0;
2238   gMC->Gsvolu("UTG4","TUBE",idtmed[1309-1],parTube,kNparTube);
2239   xpos = 0.0;
2240   ypos = 0.0;
2241   zpos = 0.0;
2242   gMC->Gspos("UTG4",1,"UTG3",xpos,ypos,zpos,0,"ONLY");
2243   for (ilayer = 0; ilayer < kNlayer-1; ilayer++) { 
2244     xpos       = 0.0;
2245     ypos       = fClength[ilayer][2]/2.0 
2246                + fClength[ilayer][1] 
2247                + fClength[ilayer][0];
2248     zpos       = 9.0 - fgkSheight/2.0
2249                + ilayer * (fgkCH + fgkVspace);
2250     parTube[0] = 0.0;
2251     parTube[1] = 1.5/2.0;
2252     parTube[2] = fCwidth[ilayer]/2.0 - 2.5;
2253     gMC->Gsposp("UTG3",ilayer+1          ,"UTI1", xpos, ypos, zpos
2254                       ,matrix[2],"ONLY",parTube,kNparTube);
2255     gMC->Gsposp("UTG3",ilayer+1+1*kNlayer,"UTI1", xpos,-ypos, zpos
2256                       ,matrix[2],"ONLY",parTube,kNparTube);
2257     gMC->Gsposp("UTG3",ilayer+1+2*kNlayer,"UTI2", xpos, ypos, zpos
2258                       ,matrix[2],"ONLY",parTube,kNparTube);
2259     gMC->Gsposp("UTG3",ilayer+1+3*kNlayer,"UTI2", xpos,-ypos, zpos
2260                       ,matrix[2],"ONLY",parTube,kNparTube);
2261     gMC->Gsposp("UTG3",ilayer+1+4*kNlayer,"UTI3", xpos, ypos, zpos
2262                       ,matrix[2],"ONLY",parTube,kNparTube);
2263     gMC->Gsposp("UTG3",ilayer+1+5*kNlayer,"UTI3", xpos,-ypos, zpos
2264                       ,matrix[2],"ONLY",parTube,kNparTube);
2265   }
2266
2267   // Gas distribution box
2268   parBox[0] = 14.50/2.0;
2269   parBox[1] =  4.52/2.0;
2270   parBox[2] =  5.00/2.0;
2271   gMC->Gsvolu("UTGD","BOX ",idtmed[1308-1],parBox,kNparBox);
2272   parBox[0] = 14.50/2.0;
2273   parBox[1] =  4.00/2.0;
2274   parBox[2] =  4.40/2.0;
2275   gMC->Gsvolu("UTGI","BOX ",idtmed[1309-1],parBox,kNparBox);
2276   parTube[0] = 0.0;
2277   parTube[1] = 4.0/2.0;
2278   parTube[2] = 8.0/2.0;
2279   gMC->Gsvolu("UTGT","TUBE",idtmed[1308-1],parTube,kNparTube);
2280   parTube[0] = 0.0;
2281   parTube[1] = 3.4/2.0;
2282   parTube[2] = 8.0/2.0;
2283   gMC->Gsvolu("UTGG","TUBE",idtmed[1309-1],parTube,kNparTube);
2284   xpos = 0.0;
2285   ypos = 0.0;
2286   zpos = 0.0;
2287   gMC->Gspos("UTGI",1,"UTGD",xpos,ypos,zpos,        0,"ONLY");
2288   gMC->Gspos("UTGG",1,"UTGT",xpos,ypos,zpos,        0,"ONLY");
2289   xpos = 0.0;
2290   ypos = 0.0;
2291   zpos = 0.0;
2292   gMC->Gspos("UTGD",1,"UTF1",xpos,ypos,zpos,        0,"ONLY");
2293   xpos =  -3.0;
2294   ypos =   0.0;
2295   zpos =   6.5;
2296   gMC->Gspos("UTGT",1,"UTF1",xpos,ypos,zpos,        0,"ONLY");
2297   xpos = -11.25;
2298   ypos =   0.0;
2299   zpos =   0.5;
2300   gMC->Gspos("UTGT",3,"UTF1",xpos,ypos,zpos,matrix[2],"ONLY");
2301   xpos =  11.25;
2302   ypos =   0.0;
2303   zpos =   0.5;
2304   gMC->Gspos("UTGT",5,"UTF1",xpos,ypos,zpos,matrix[2],"ONLY");
2305
2306   // Cooling manifolds
2307   parBox[0]  =  5.0/2.0;
2308   parBox[1]  = 23.0/2.0;
2309   parBox[2]  = 70.0/2.0;
2310   gMC->Gsvolu("UTCM","BOX ",idtmed[1302-1],parBox,kNparBox);
2311   parBox[0]  =  5.0/2.0;
2312   parBox[1]  =  5.0/2.0;
2313   parBox[2]  = 70.0/2.0;
2314   gMC->Gsvolu("UTCA","BOX ",idtmed[1308-1],parBox,kNparBox);
2315   parBox[0]  =  5.0/2.0 - 0.3;
2316   parBox[1]  =  5.0/2.0 - 0.3;
2317   parBox[2]  = 70.0/2.0 - 0.3;
2318   gMC->Gsvolu("UTCW","BOX ",idtmed[1314-1],parBox,kNparBox);
2319   xpos       =  0.0;
2320   ypos       =  0.0;
2321   zpos       =  0.0;
2322   gMC->Gspos("UTCW",1,"UTCA", xpos, ypos, zpos,        0,"ONLY");
2323   xpos       =  0.0;
2324   ypos       =  5.0/2.0 - 23.0/2.0;
2325   zpos       =  0.0;
2326   gMC->Gspos("UTCA",1,"UTCM", xpos, ypos, zpos,        0,"ONLY");
2327   parTube[0] =  0.0;
2328   parTube[1] =  3.0/2.0;
2329   parTube[2] = 18.0/2.0;
2330   gMC->Gsvolu("UTCO","TUBE",idtmed[1308-1],parTube,kNparTube);
2331   parTube[0] =  0.0;
2332   parTube[1] =  3.0/2.0 - 0.3;
2333   parTube[2] = 18.0/2.0;
2334   gMC->Gsvolu("UTCL","TUBE",idtmed[1314-1],parTube,kNparTube);
2335   xpos       =  0.0;
2336   ypos       =  0.0;
2337   zpos       =  0.0;
2338   gMC->Gspos("UTCL",1,"UTCO", xpos, ypos, zpos,        0,"ONLY");
2339   xpos       =  0.0;
2340   ypos       =  2.5;
2341   zpos       = -70.0/2.0 + 7.0;
2342   gMC->Gspos("UTCO",1,"UTCM", xpos, ypos, zpos,matrix[4],"ONLY");
2343   zpos      +=  7.0;
2344   gMC->Gspos("UTCO",2,"UTCM", xpos, ypos, zpos,matrix[4],"ONLY");
2345   zpos      +=  7.0;
2346   gMC->Gspos("UTCO",3,"UTCM", xpos, ypos, zpos,matrix[4],"ONLY");
2347   zpos      +=  7.0;
2348   gMC->Gspos("UTCO",4,"UTCM", xpos, ypos, zpos,matrix[4],"ONLY");
2349   zpos      +=  7.0;
2350   gMC->Gspos("UTCO",5,"UTCM", xpos, ypos, zpos,matrix[4],"ONLY");
2351   zpos      +=  7.0;
2352   gMC->Gspos("UTCO",6,"UTCM", xpos, ypos, zpos,matrix[4],"ONLY");
2353   zpos      +=  7.0;
2354   gMC->Gspos("UTCO",7,"UTCM", xpos, ypos, zpos,matrix[4],"ONLY");
2355   zpos      +=  7.0;
2356   gMC->Gspos("UTCO",8,"UTCM", xpos, ypos, zpos,matrix[4],"ONLY");
2357
2358   xpos = 40.0;
2359   ypos =  fgkFlength/2.0 - 23.0/2.0;
2360   zpos =  0.0;
2361   gMC->Gspos("UTCM",1,"UTF1", xpos, ypos, zpos,matrix[0],"ONLY");
2362   gMC->Gspos("UTCM",2,"UTF1",-xpos, ypos, zpos,matrix[1],"ONLY");
2363   gMC->Gspos("UTCM",3,"UTF2", xpos,-ypos, zpos,matrix[5],"ONLY");
2364   gMC->Gspos("UTCM",4,"UTF2",-xpos,-ypos, zpos,matrix[6],"ONLY");
2365
2366   // Power connection boards (Cu)
2367   parBox[0] =  0.5/2.0;
2368   parBox[1] = 15.0/2.0;
2369   parBox[2] =  7.0/2.0;
2370   gMC->Gsvolu("UTPC","BOX ",idtmed[1325-1],parBox,kNparBox);
2371   for (ilayer = 0; ilayer < kNlayer-1; ilayer++) { 
2372     xpos      = fCwidth[ilayer]/2.0 + kPWRwid/2.0;
2373     ypos      = 0.0;
2374     zpos      = fgkVrocsm + fgkSMpltT + kPWRhgt/2.0 - fgkSheight/2.0 + kPWRposz 
2375               + (ilayer+1) * (fgkCH + fgkVspace);
2376     gMC->Gspos("UTPC",ilayer        ,"UTF1", xpos,ypos,zpos,matrix[0],"ONLY");
2377     gMC->Gspos("UTPC",ilayer+kNlayer,"UTF1",-xpos,ypos,zpos,matrix[1],"ONLY");
2378   }
2379   xpos      = fCwidth[5]/2.0 + kPWRhgt/2.0 - 2.0;
2380   ypos      = 0.0;
2381   zpos      = fgkSheight/2.0 - fgkSMpltT - 2.0; 
2382   gMC->Gspos("UTPC",5        ,"UTF1", xpos,ypos,zpos,matrix[3],"ONLY");
2383   gMC->Gspos("UTPC",5+kNlayer,"UTF1",-xpos,ypos,zpos,matrix[3],"ONLY");
2384
2385   // Power connection panel (Al)
2386   parBox[0] = 60.0/2.0;
2387   parBox[1] = 10.0/2.0;
2388   parBox[2] =  3.0/2.0;
2389   gMC->Gsvolu("UTPP","BOX ",idtmed[1301-1],parBox,kNparBox);
2390   xpos      =  0.0;
2391   ypos      =  0.0;
2392   zpos      = 18.0;
2393   gMC->Gspos("UTPP",1,"UTF1", xpos,ypos,zpos,0,"ONLY");
2394
2395   //
2396   // Electronics boxes
2397   //
2398
2399   // Casing (INOX)
2400   parBox[0] = 60.0/2.0;
2401   parBox[1] = 10.0/2.0;
2402   parBox[2] =  6.0/2.0;
2403   gMC->Gsvolu("UTE1","BOX ",idtmed[1308-1],parBox,kNparBox);
2404   // Interior (air)
2405   parBox[0] = parBox[0] - 0.5;
2406   parBox[1] = parBox[1] - 0.5;
2407   parBox[2] = parBox[2] - 0.5;
2408   gMC->Gsvolu("UTE2","BOX ",idtmed[1302-1],parBox,kNparBox);
2409   xpos      = 0.0;
2410   ypos      = 0.0;
2411   zpos      = 0.0;
2412   gMC->Gspos("UTE2",1,"UTE1",xpos,ypos,zpos,0,"ONLY");
2413   xpos      = 0.0;
2414   ypos      =  fgkSlength/2.0 - 10.0/2.0 - 3.0;
2415   zpos      = -fgkSheight/2.0 +  6.0/2.0 + 1.0;
2416   gMC->Gspos("UTE1",1,"UTI1", xpos,ypos,zpos,0,"ONLY");
2417   gMC->Gspos("UTE1",2,"UTI2", xpos,ypos,zpos,0,"ONLY");
2418   gMC->Gspos("UTE1",3,"UTI3", xpos,ypos,zpos,0,"ONLY");
2419
2420   // Casing (INOX)
2421   parBox[0] = 50.0/2.0;
2422   parBox[1] = 15.0/2.0;
2423   parBox[2] = 20.0/2.0;
2424   gMC->Gsvolu("UTE3","BOX ",idtmed[1308-1],parBox,kNparBox);
2425   // Interior (air)
2426   parBox[0] = parBox[0] - 0.5;
2427   parBox[1] = parBox[1] - 0.5;
2428   parBox[2] = parBox[2] - 0.5;
2429   gMC->Gsvolu("UTE4","BOX ",idtmed[1302-1],parBox,kNparBox);
2430   xpos      = 0.0;
2431   ypos      = 0.0;
2432   zpos      = 0.0;
2433   gMC->Gspos("UTE4",1,"UTE3",xpos,ypos,zpos,0,"ONLY");
2434   xpos      = 0.0;
2435   ypos      = -fgkSlength/2.0 + 15.0/2.0 + 3.0;
2436   zpos      = -fgkSheight/2.0 + 20.0/2.0 + 1.0;
2437   gMC->Gspos("UTE3",1,"UTI1", xpos,ypos,zpos,0,"ONLY");
2438   gMC->Gspos("UTE3",2,"UTI2", xpos,ypos,zpos,0,"ONLY");
2439   gMC->Gspos("UTE3",3,"UTI3", xpos,ypos,zpos,0,"ONLY");
2440
2441   // Casing (INOX)
2442   parBox[0] = 20.0/2.0;
2443   parBox[1] =  7.0/2.0;
2444   parBox[2] = 20.0/2.0;
2445   gMC->Gsvolu("UTE5","BOX ",idtmed[1308-1],parBox,kNparBox);
2446   // Interior (air)
2447   parBox[0] = parBox[0] - 0.5;
2448   parBox[1] = parBox[1] - 0.5;
2449   parBox[2] = parBox[2] - 0.5;
2450   gMC->Gsvolu("UTE6","BOX ",idtmed[1302-1],parBox,kNparBox);
2451   xpos      = 0.0;
2452   ypos      = 0.0;
2453   zpos      = 0.0;
2454   gMC->Gspos("UTE6",1,"UTE5",xpos,ypos,zpos,0,"ONLY");
2455   xpos      = 20.0;
2456   ypos      = -fgkSlength/2.0 +  7.0/2.0 + 3.0;
2457   zpos      = 0.0;
2458   gMC->Gspos("UTE5",1,"UTI1", xpos,ypos,zpos,0,"ONLY");
2459   gMC->Gspos("UTE5",2,"UTI2", xpos,ypos,zpos,0,"ONLY");
2460   gMC->Gspos("UTE5",3,"UTI3", xpos,ypos,zpos,0,"ONLY");
2461   xpos      = -xpos;
2462   gMC->Gspos("UTE5",4,"UTI1", xpos,ypos,zpos,0,"ONLY");
2463   gMC->Gspos("UTE5",5,"UTI2", xpos,ypos,zpos,0,"ONLY");
2464   gMC->Gspos("UTE5",6,"UTI3", xpos,ypos,zpos,0,"ONLY");
2465
2466 }
2467
2468 //_____________________________________________________________________________
2469 void AliTRDgeometry::GroupChamber(Int_t ilayer, Int_t istack, Int_t *idtmed)
2470 {
2471   //
2472   // Group volumes UA, UD, UF, UU in a single chamber (Air)
2473   // UA, UD, UF, UU are boxes
2474   // UT will be a box
2475   //
2476
2477   const Int_t kNparCha = 3;
2478
2479   Int_t iDet = GetDetectorSec(ilayer,istack);
2480
2481   Float_t xyzMin[3];
2482   Float_t xyzMax[3];
2483   Float_t xyzOrig[3];
2484   Float_t xyzBoxd[3];
2485
2486   Char_t  cTagV[5];
2487   Char_t  cTagM[5];
2488
2489   for (Int_t i = 0; i < 3; i++) {
2490     xyzMin[i] = +9999.0; 
2491     xyzMax[i] = -9999.0;
2492   }
2493
2494   for (Int_t i = 0; i < 3; i++) {
2495
2496     xyzMin[i] = TMath::Min(xyzMin[i],fChamberUAorig[iDet][i]-fChamberUAboxd[iDet][i]);
2497     xyzMax[i] = TMath::Max(xyzMax[i],fChamberUAorig[iDet][i]+fChamberUAboxd[iDet][i]);
2498
2499     xyzMin[i] = TMath::Min(xyzMin[i],fChamberUDorig[iDet][i]-fChamberUDboxd[iDet][i]);
2500     xyzMax[i] = TMath::Max(xyzMax[i],fChamberUDorig[iDet][i]+fChamberUDboxd[iDet][i]);
2501
2502     xyzMin[i] = TMath::Min(xyzMin[i],fChamberUForig[iDet][i]-fChamberUFboxd[iDet][i]);
2503     xyzMax[i] = TMath::Max(xyzMax[i],fChamberUForig[iDet][i]+fChamberUFboxd[iDet][i]);
2504
2505     xyzMin[i] = TMath::Min(xyzMin[i],fChamberUUorig[iDet][i]-fChamberUUboxd[iDet][i]);
2506     xyzMax[i] = TMath::Max(xyzMax[i],fChamberUUorig[iDet][i]+fChamberUUboxd[iDet][i]);
2507
2508     xyzOrig[i] = 0.5*(xyzMax[i]+xyzMin[i]);
2509     xyzBoxd[i] = 0.5*(xyzMax[i]-xyzMin[i]);
2510
2511   }
2512   
2513   sprintf(cTagM,"UT%02d",iDet);
2514   gMC->Gsvolu(cTagM,"BOX ",idtmed[1302-1],xyzBoxd,kNparCha);
2515
2516   sprintf(cTagV,"UA%02d",iDet);
2517   gMC->Gspos(cTagV,1,cTagM
2518             ,fChamberUAorig[iDet][0]-xyzOrig[0]
2519             ,fChamberUAorig[iDet][1]-xyzOrig[1]
2520             ,fChamberUAorig[iDet][2]-xyzOrig[2]
2521             ,0,"ONLY");
2522
2523   sprintf(cTagV,"UZ%02d",iDet);
2524   gMC->Gspos(cTagV,1,cTagM
2525             ,fChamberUAorig[iDet][0]-xyzOrig[0] + fChamberUAboxd[iDet][0] - fgkCroW/2.0
2526             ,fChamberUAorig[iDet][1]-xyzOrig[1]
2527             ,fChamberUAorig[iDet][2]-xyzOrig[2] + fgkCraH/2.0 + fgkCdrH/2.0 - fgkCalW/2.0
2528             ,0,"ONLY");
2529   gMC->Gspos(cTagV,2,cTagM
2530             ,fChamberUAorig[iDet][0]-xyzOrig[0] - fChamberUAboxd[iDet][0] + fgkCroW/2.0
2531             ,fChamberUAorig[iDet][1]-xyzOrig[1]
2532             ,fChamberUAorig[iDet][2]-xyzOrig[2] + fgkCraH/2.0 + fgkCdrH/2.0 - fgkCalW/2.0
2533             ,0,"ONLY");
2534
2535   sprintf(cTagV,"UD%02d",iDet);
2536   gMC->Gspos(cTagV,1,cTagM
2537             ,fChamberUDorig[iDet][0]-xyzOrig[0]
2538             ,fChamberUDorig[iDet][1]-xyzOrig[1]
2539             ,fChamberUDorig[iDet][2]-xyzOrig[2]
2540             ,0,"ONLY");
2541
2542   sprintf(cTagV,"UF%02d",iDet);
2543   gMC->Gspos(cTagV,1,cTagM
2544             ,fChamberUForig[iDet][0]-xyzOrig[0]
2545             ,fChamberUForig[iDet][1]-xyzOrig[1]
2546             ,fChamberUForig[iDet][2]-xyzOrig[2]
2547             ,0,"ONLY");
2548   
2549   sprintf(cTagV,"UU%02d",iDet);
2550   gMC->Gspos(cTagV,1,cTagM
2551             ,fChamberUUorig[iDet][0]-xyzOrig[0]
2552             ,fChamberUUorig[iDet][1]-xyzOrig[1]
2553             ,fChamberUUorig[iDet][2]-xyzOrig[2]
2554             ,0,"ONLY");
2555
2556   sprintf(cTagV,"UT%02d",iDet);
2557   gMC->Gspos(cTagV,1,"UTI1"
2558             ,xyzOrig[0]
2559             ,xyzOrig[1]
2560             ,xyzOrig[2]
2561             ,0,"ONLY");
2562   gMC->Gspos(cTagV,1,"UTI2"
2563             ,xyzOrig[0]
2564             ,xyzOrig[1]
2565             ,xyzOrig[2]
2566             ,0,"ONLY");
2567   if (istack != 2) {
2568     // W/o middle stack
2569     gMC->Gspos(cTagV,1,"UTI3"
2570               ,xyzOrig[0]
2571               ,xyzOrig[1]
2572               ,xyzOrig[2]
2573               ,0,"ONLY");
2574   }
2575
2576 }
2577
2578 //_____________________________________________________________________________
2579 Bool_t AliTRDgeometry::RotateBack(Int_t det, Double_t *loc, Double_t *glb) const
2580 {
2581   //
2582   // Rotates a chambers to transform the corresponding local frame
2583   // coordinates <loc> into the coordinates of the ALICE restframe <glb>.
2584   //
2585
2586   Int_t sector = GetSector(det);
2587
2588   glb[0] = loc[0] * fRotB11[sector] - loc[1] * fRotB12[sector];
2589   glb[1] = loc[0] * fRotB21[sector] + loc[1] * fRotB22[sector];
2590   glb[2] = loc[2];
2591
2592   return kTRUE;
2593
2594 }
2595
2596 //_____________________________________________________________________________
2597 Int_t AliTRDgeometry::GetDetectorSec(Int_t layer, Int_t stack)
2598 {
2599   //
2600   // Convert plane / stack into detector number for one single sector
2601   //
2602
2603   return (layer + stack * fgkNlayer);
2604
2605 }
2606
2607 //_____________________________________________________________________________
2608 Int_t AliTRDgeometry::GetDetector(Int_t layer, Int_t stack, Int_t sector)
2609 {
2610   //
2611   // Convert layer / stack / sector into detector number
2612   //
2613
2614   return (layer + stack * fgkNlayer + sector * fgkNlayer * fgkNstack);
2615
2616 }
2617
2618 //_____________________________________________________________________________
2619 Int_t AliTRDgeometry::GetLayer(Int_t det)
2620 {
2621   //
2622   // Reconstruct the layer number from the detector number
2623   //
2624
2625   return ((Int_t) (det % fgkNlayer));
2626
2627 }
2628
2629 //_____________________________________________________________________________
2630 Int_t AliTRDgeometry::GetStack(Int_t det) const
2631 {
2632   //
2633   // Reconstruct the stack number from the detector number
2634   //
2635
2636   return ((Int_t) (det % (fgkNlayer * fgkNstack)) / fgkNlayer);
2637
2638 }
2639
2640 //_____________________________________________________________________________
2641 Int_t AliTRDgeometry::GetStack(Double_t z, Int_t layer)
2642 {
2643   //
2644   // Reconstruct the chamber number from the z position and layer number
2645   //
2646   // The return function has to be protected for positiveness !!
2647   //
2648
2649   if ((layer <          0) || 
2650       (layer >= fgkNlayer)) return -1;
2651         
2652   Int_t    istck = fgkNstack;
2653   Double_t zmin;
2654   Double_t zmax;
2655
2656   do {
2657     istck--;
2658     if (istck < 0) break;
2659     AliTRDpadPlane *pp = GetPadPlane(layer,istck);
2660     zmax  = pp->GetRow0();
2661     Int_t nrows = pp->GetNrows();
2662     zmin = zmax -         2 * pp->GetLengthOPad() 
2663                 - (nrows-2) * pp->GetLengthIPad() 
2664                 - (nrows-1) * pp->GetRowSpacing();
2665   } while((z < zmin) || (z > zmax));
2666   
2667   return istck;
2668
2669 }
2670
2671 //_____________________________________________________________________________
2672 Int_t AliTRDgeometry::GetSector(Int_t det) const
2673 {
2674   //
2675   // Reconstruct the sector number from the detector number
2676   //
2677
2678   return ((Int_t) (det / (fgkNlayer * fgkNstack)));
2679
2680 }
2681
2682 //_____________________________________________________________________________
2683 AliTRDpadPlane *AliTRDgeometry::GetPadPlane(Int_t layer, Int_t stack)
2684 {
2685   //
2686   // Returns the pad plane for a given plane <pl> and stack <st> number
2687   //
2688
2689   if (!fPadPlaneArray) {
2690     CreatePadPlaneArray();
2691   }
2692
2693   Int_t ipp = GetDetectorSec(layer,stack);
2694   return ((AliTRDpadPlane *) fPadPlaneArray->At(ipp));
2695
2696 }
2697
2698 //_____________________________________________________________________________
2699 Int_t AliTRDgeometry::GetRowMax(Int_t layer, Int_t stack, Int_t /*sector*/)
2700 {
2701   //
2702   // Returns the number of rows on the pad plane
2703   //
2704
2705   return GetPadPlane(layer,stack)->GetNrows();
2706
2707 }
2708
2709 //_____________________________________________________________________________
2710 Int_t AliTRDgeometry::GetColMax(Int_t layer)
2711 {
2712   //
2713   // Returns the number of rows on the pad plane
2714   //
2715
2716   return GetPadPlane(layer,0)->GetNcols();
2717
2718 }
2719
2720 //_____________________________________________________________________________
2721 Double_t AliTRDgeometry::GetRow0(Int_t layer, Int_t stack, Int_t /*sector*/)
2722 {
2723   //
2724   // Returns the position of the border of the first pad in a row
2725   //
2726
2727   return GetPadPlane(layer,stack)->GetRow0();
2728
2729 }
2730
2731 //_____________________________________________________________________________
2732 Double_t AliTRDgeometry::GetCol0(Int_t layer)
2733 {
2734   //
2735   // Returns the position of the border of the first pad in a column
2736   //
2737
2738   return GetPadPlane(layer,0)->GetCol0();
2739
2740 }
2741
2742 //_____________________________________________________________________________
2743 Bool_t AliTRDgeometry::CreateClusterMatrixArray()
2744 {
2745   //
2746   // Create the matrices to transform cluster coordinates from the 
2747   // local chamber system to the tracking coordinate system
2748   //
2749
2750   if (!gGeoManager) {
2751     return kFALSE;
2752   }
2753
2754   fClusterMatrixArray = new TObjArray(kNdet);
2755   AliAlignObjParams o;
2756
2757   for (Int_t iLayer = AliGeomManager::kTRD1; iLayer <= AliGeomManager::kTRD6; iLayer++) {
2758     for (Int_t iModule = 0; iModule < AliGeomManager::LayerSize(iLayer); iModule++) {
2759       
2760       Int_t        isector   = iModule/Nstack();
2761       Int_t        istack    = iModule%Nstack();
2762       Int_t        iLayerTRD = iLayer - AliGeomManager::kTRD1;
2763       Int_t        lid       = GetDetector(iLayerTRD,istack,isector);    
2764
2765       // Taking holes into account
2766       if (((isector == 13) || (isector == 14) || (isector == 15)) && 
2767           (istack == 2)) continue; 
2768
2769       UShort_t     volid   = AliGeomManager::LayerToVolUID(iLayer,iModule);
2770       const char  *symname = AliGeomManager::SymName(volid);
2771       TGeoPNEntry *pne     = gGeoManager->GetAlignableEntry(symname);
2772       const char  *path    = symname;
2773       if (pne) {
2774         path = pne->GetTitle();
2775       }
2776       else {
2777         continue;
2778       }
2779       if (!strstr(path,"ALIC")) {
2780         AliDebug(1,Form("Not a valid path: %s\n",path));
2781         continue;
2782       }
2783       if (!gGeoManager->cd(path)) {
2784         AliError(Form("Cannot go to path: %s\n",path));
2785         continue;
2786       }
2787       TGeoHMatrix *m         = gGeoManager->GetCurrentMatrix();
2788       
2789       TGeoRotation mchange; 
2790       mchange.RotateY(90); 
2791       mchange.RotateX(90);
2792
2793       //
2794       // Cluster transformation matrix
2795       //
2796       TGeoHMatrix  rotMatrix(mchange.Inverse());
2797       rotMatrix.MultiplyLeft(m);
2798       Double_t sectorAngle = 20.0 * (isector % 18) + 10.0;
2799       TGeoHMatrix  rotSector;
2800       rotSector.RotateZ(sectorAngle);
2801       rotMatrix.MultiplyLeft(&rotSector.Inverse());
2802
2803       fClusterMatrixArray->AddAt(new TGeoHMatrix(rotMatrix),lid);       
2804
2805     }    
2806   }
2807
2808   return kTRUE;
2809
2810 }
2811
2812 //_____________________________________________________________________________
2813 Bool_t AliTRDgeometry::ChamberInGeometry(Int_t det)
2814 {
2815   //
2816   // Checks whether the given detector is part of the current geometry
2817   //
2818
2819   if (!fClusterMatrixArray) {
2820     CreateClusterMatrixArray();
2821   }  
2822
2823   if (!GetClusterMatrix(det)) {
2824     return kFALSE;
2825   }
2826   else {
2827     return kTRUE;
2828   }
2829
2830 }