LCOV - code coverage report
Current view: top level - TRD/TRDbase - AliTRDgeometry.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1638 1653 99.1 %
Date: 2016-06-14 17:26:59 Functions: 28 30 93.3 %

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

Generated by: LCOV version 1.11