LCOV - code coverage report
Current view: top level - STRUCT - AliFRAMEv3.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 1211 0.1 %
Date: 2016-06-14 17:26:59 Functions: 1 14 7.1 %

          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             : //  AliFRAMEv3.cxx
      20             : //  symmetric space frame with possibility for holes
      21             : //  Author: A.Morsch
      22             : //------------------------------------------------------------------------
      23             : 
      24             : #include <TGeoBBox.h>
      25             : #include <TGeoXtru.h>
      26             : #include <TGeoArb8.h>
      27             : #include <TGeoCompositeShape.h>
      28             : #include <TGeoGlobalMagField.h>
      29             : #include <TGeoManager.h>
      30             : #include <TGeoMatrix.h>
      31             : #include <TGeoPgon.h>
      32             : #include <TGeoTrd1.h>
      33             : #include <TGeoArb8.h>
      34             : #include <TGeoBBox.h>
      35             : #include <TGeoTube.h>
      36             : #include <TGeoMedium.h>
      37             : #include <TGeoBoolNode.h>
      38             : #include <TGeoCompositeShape.h>
      39             : #include <TString.h>
      40             : #include <TSystem.h>
      41             : #include <TVirtualMC.h>
      42             : 
      43             : #include "AliFRAMEv3.h"
      44             : #include "AliMagF.h"
      45             : #include "AliRun.h"
      46             : #include "AliConst.h"
      47             : #include "AliMC.h"
      48             : #include "AliLog.h"
      49             : #include "AliTrackReference.h"
      50             :  
      51             : 
      52             : 
      53             : 
      54          12 : ClassImp(AliFRAMEv3)
      55             : 
      56             :  
      57             : //_____________________________________________________________________________
      58           0 :   AliFRAMEv3::AliFRAMEv3():
      59           0 :     fHoles(0)
      60           0 : {
      61             : // Constructor
      62           0 : }
      63             : 
      64             : //_____________________________________________________________________________
      65             : AliFRAMEv3::AliFRAMEv3(const char *name, const char *title)
      66           0 :     : AliFRAME(name,title), 
      67           0 :       fHoles(0)
      68           0 : {
      69             : // Constructor
      70           0 : }
      71             : 
      72             : //___________________________________________
      73             : void AliFRAMEv3::CreateGeometry()
      74             : {
      75             : //Begin_Html
      76             : /*
      77             : <img src="picts/frame.gif">
      78             : */
      79             : //End_Html
      80             : 
      81             : 
      82             : //Begin_Html
      83             : /*
      84             : <img src="picts/tree_frame.gif">
      85             : */
      86             : //End_Html
      87             : 
      88           0 :   Int_t idrotm[2299];
      89             : 
      90             : 
      91             :  
      92           0 :   AliMatrix(idrotm[2070],  90.0,   0.0,  90.0, 270.0,   0.0,   0.0);  
      93             : //
      94           0 :   AliMatrix(idrotm[2083], 170.0,   0.0,  90.0,  90.0,  80.0,   0.0);
      95           0 :   AliMatrix(idrotm[2084], 170.0, 180.0,  90.0,  90.0,  80.0, 180.0);
      96           0 :   AliMatrix(idrotm[2085],  90.0, 180.0,  90.0,  90.0,   0.0,   0.0);
      97             : //  
      98           0 :   AliMatrix(idrotm[2086],  80.0,   0.0,  90.0,  90.,  -10.0,   0.0);
      99           0 :   AliMatrix(idrotm[2096], 100.0,   0.0,  90.0,  90.,   10.0,   0.0);
     100             : //
     101           0 :   AliMatrix(idrotm[2087], -100.0,   0.0,  90.0,  270.,  -10.0,   0.0);
     102           0 :   AliMatrix(idrotm[2097],  -80.0,   0.0,  90.0,  270.,   10.0,   0.0);
     103             : 
     104             : //
     105           0 :   AliMatrix(idrotm[2088],  90.0,  180.0, 90.0,  270.,   0.0,   0.0);
     106           0 :   AliMatrix(idrotm[2089],  90.0,  -90.0, 90.0,    0.,   0.0,   0.0);
     107             : //
     108           0 :   AliMatrix(idrotm[2090],  90.0,   0.0,   0.0,    0.,   90.0, 90.0);
     109           0 :   AliMatrix(idrotm[2091],   0.0,   0.0,  90.0,   90.,   90.0,  0.0);
     110             : //
     111             : // Matrices have been imported from Euclid. Some simplification
     112             : // seems possible
     113             : //
     114             : 
     115           0 :   AliMatrix(idrotm[2003],   0.0, 0.0, 90.0, 130.0, 90.0,  40.0);
     116           0 :   AliMatrix(idrotm[2004], 180.0, 0.0, 90.0, 130.0, 90.0,  40.0);
     117           0 :   AliMatrix(idrotm[2005], 180.0, 0.0, 90.0, 150.0, 90.0, 240.0);
     118           0 :   AliMatrix(idrotm[2006],   0.0, 0.0, 90.0, 150.0, 90.0, 240.0);
     119           0 :   AliMatrix(idrotm[2007],   0.0, 0.0, 90.0, 170.0, 90.0,  80.0);
     120           0 :   AliMatrix(idrotm[2008], 180.0, 0.0, 90.0, 190.0, 90.0, 280.0);
     121           0 :   AliMatrix(idrotm[2009], 180.0, 0.0, 90.0, 170.0, 90.0,  80.0);
     122           0 :   AliMatrix(idrotm[2010],   0.0, 0.0, 90.0, 190.0, 90.0, 280.0);
     123           0 :   AliMatrix(idrotm[2011],   0.0, 0.0, 90.0, 350.0, 90.0, 260.0);
     124           0 :   AliMatrix(idrotm[2012], 180.0, 0.0, 90.0, 350.0, 90.0, 260.0);
     125           0 :   AliMatrix(idrotm[2013], 180.0, 0.0, 90.0,  10.0, 90.0, 100.0);
     126           0 :   AliMatrix(idrotm[2014],   0.0, 0.0, 90.0,  10.0, 90.0, 100.0);
     127           0 :   AliMatrix(idrotm[2015],   0.0, 0.0, 90.0,  30.0, 90.0, 300.0);
     128           0 :   AliMatrix(idrotm[2016], 180.0, 0.0, 90.0,  30.0, 90.0, 300.0);
     129           0 :   AliMatrix(idrotm[2017], 180.0, 0.0, 90.0,  50.0, 90.0, 140.0);
     130           0 :   AliMatrix(idrotm[2018],   0.0, 0.0, 90.0,  50.0, 90.0, 140.0);
     131             : 
     132           0 :   AliMatrix(idrotm[2019], 180.0, 0.0, 90.0, 130.0, 90.0, 220.0);
     133           0 :   AliMatrix(idrotm[2020], 180.0, 0.0, 90.0,  50.0, 90.0, 320.0);
     134           0 :   AliMatrix(idrotm[2021], 180.0, 0.0, 90.0, 150.0, 90.0,  60.0);
     135           0 :   AliMatrix(idrotm[2022], 180.0, 0.0, 90.0,  30.0, 90.0, 120.0);
     136           0 :   AliMatrix(idrotm[2023], 180.0, 0.0, 90.0, 170.0, 90.0, 260.0);
     137           0 :   AliMatrix(idrotm[2024], 180.0, 0.0, 90.0, 190.0, 90.0, 100.0);
     138           0 :   AliMatrix(idrotm[2025], 180.0, 0.0, 90.0, 350.0, 90.0,  80.0);
     139           0 :   AliMatrix(idrotm[2026], 180.0, 0.0, 90.0,  10.0, 90.0, 280.0);
     140             : 
     141           0 :   AliMatrix(idrotm[2100], 180.0, 0.0, 90.0, 210.0, 90.0, 120.0);
     142           0 :   AliMatrix(idrotm[2101], 180.0, 0.0, 90.0, 330.0, 90.0,  60.0);
     143             :   
     144             : 
     145           0 :   AliMatrix(idrotm[2027],   0.0, 0.0, 90.0,  50.0, 90.0, 320.0);
     146           0 :   AliMatrix(idrotm[2028],   0.0, 0.0, 90.0, 150.0, 90.0,  60.0); 
     147           0 :   AliMatrix(idrotm[2029],   0.0, 0.0, 90.0,  30.0, 90.0, 120.0);
     148           0 :   AliMatrix(idrotm[2030],   0.0, 0.0, 90.0,  10.0, 90.0, 280.0);
     149           0 :   AliMatrix(idrotm[2031],   0.0, 0.0, 90.0, 170.0, 90.0, 260.0);
     150           0 :   AliMatrix(idrotm[2032],   0.0, 0.0, 90.0, 190.0, 90.0, 100.0);
     151           0 :   AliMatrix(idrotm[2033],   0.0, 0.0, 90.0, 350.0, 90.0,  80.0);
     152             : 
     153             : 
     154           0 :   Int_t *idtmed = fIdtmed->GetArray()-1999;
     155             : //
     156             : // The Main Space Frame
     157             : // ALIP2A__0007
     158             : // ALIP2A__0008
     159             : //
     160           0 :   Float_t pbox[3], ptrap[11], ptrd1[4], ppgon[10];
     161             :   Float_t dx, dy, dz;
     162             :   Int_t i, j;
     163             :   Int_t jmod = 0;
     164             : //
     165             : // Constants 
     166             : //
     167             :   // Materials
     168           0 :   const TGeoMedium* kMedAir   =  gGeoManager->GetMedium("FRAME_Air");
     169           0 :   const TGeoMedium* kMedSteel =  gGeoManager->GetMedium("FRAME_Steel");
     170           0 :   const TGeoMedium* kMedAlu   =  gGeoManager->GetMedium("FRAME_Aluminum");
     171           0 :   const Int_t   kAir   = idtmed[2004];
     172           0 :   const Int_t   kSteel = idtmed[2064];
     173           0 :   const Int_t   kAlu   = idtmed[2008];
     174           0 :   const Int_t   kG10   = idtmed[2021];
     175             :   // Angles 
     176             :   const Float_t kEps     = 0.01;  
     177           0 :   const Float_t krad2deg = 180. / TMath::Pi();
     178           0 :   const Float_t kdeg2rad = 1. / krad2deg;
     179           0 :   const Float_t sin10    = TMath::Sin(10. * kdeg2rad);
     180           0 :   const Float_t tan10    = TMath::Tan(10. * kdeg2rad);
     181           0 :   const Float_t cos10    = TMath::Cos(10. * kdeg2rad);
     182             :   // Dimensions
     183             :   // vertical distance of frame wrt to origin (center of inner rings)
     184             :   const Float_t hR     =  286.00;  
     185             :   // Height of inner frame from lower edge to outer ring (sectors for detectors)
     186             :   const Float_t iFrH   =  119.00;  
     187             :   //
     188             :   // radial length of web frame elements
     189           0 :   const Float_t dHz    = 113./cos10 - 0.3; // 114.74 (114.5 on drawing)
     190             :   // Positions of ring bars (ALIP2A_0008)
     191             :   // outer
     192             :   const Float_t dymodU[3] = {71.5, 228.5, 339.5};
     193             :   // inner
     194             :   const Float_t dymodL[3] = {50.0, 175.0, 297.5};
     195             :   //
     196             :   // orientation of web frame elements
     197             :   const Float_t dymodO[5] = {10., -40., 20., -27.1, 18.4};
     198             :   // Position of web frame elements
     199           0 :   Float_t dymodW[5] = {70., 73.6, 224.5, 231.4, 340.2};
     200           0 :   for (Int_t ii = 0; ii < 5; ii++) {
     201           0 :     dymodW[ii] =  dymodW[ii]-3.*TMath::Tan(dymodO[ii]*kdeg2rad);
     202             :   }
     203             :   // Inner ring bars (Pos 6)
     204             :   const Float_t ringH  =    6.00;  // Hight
     205             :   const Float_t ringW  =   10.00;  // Width  of the ring bars in z
     206             :   const Float_t ringT  =    1.00;  // Thickness of bars   
     207             :   // inner longitudinal bars 4 x 6 
     208             :   const Float_t longH  =   6.00;  // Height
     209             :   const Float_t longW  =   4.00;  // Width
     210             :   // outer longitudianl bars 8 x 8
     211             :   // const Float_t longOD =   8.0; 
     212             :   // some extra space for mother volume
     213           0 :   const Float_t dext   =   sin10 * longW/2.+0.01;
     214             :   // sector hight with extra space
     215           0 :   const Float_t iFrH0  = iFrH + dext;
     216             :   // length of inner longitudinal bars
     217             :   // inner 
     218             :   const Float_t longLI  = 615.;
     219             :   const Float_t zE      = 376.5;
     220             : //
     221             : // Frame mother volume
     222             : //
     223           0 :   TGeoPgon* shB77A = new TGeoPgon(0., 360., 18, 2);
     224           0 :   shB77A->SetName("shB77A");
     225           0 :   shB77A->DefineSection( 0, -zE, 280., 423.7);
     226           0 :   shB77A->DefineSection( 1,  zE, 280., 423.7);
     227           0 :   TGeoBBox* shB77B = new TGeoBBox(3.42, 2., 375.5);
     228           0 :   shB77B->SetName("shB77B");
     229           0 :   TGeoTranslation* trB77A = new TGeoTranslation("trB77A", +283.32, 0., 0.);
     230           0 :   TGeoTranslation* trB77B = new TGeoTranslation("trB77B", -283.32, 0., 0.);
     231           0 :   trB77A->RegisterYourself();
     232           0 :   trB77B->RegisterYourself();
     233           0 :   TGeoCompositeShape* shB77 = new TGeoCompositeShape("shB77", "shB77A+shB77B:trB77A+shB77B:trB77B");
     234           0 :   TGeoVolume* voB77 = new TGeoVolume("B077", shB77, gGeoManager->GetMedium("FRAME_Air"));
     235           0 :   voB77->SetName("B077"); // just to avoid a warning
     236           0 :   TVirtualMC::GetMC()->Gspos("B077", 1, "ALIC", 0., 0., 0., 0, "ONLY");
     237             : //
     238             : // Reference plane #1 for TRD
     239           0 :   TGeoPgon* shBREFA = new TGeoPgon(0.0, 360., 18, 2);
     240           0 :   shBREFA->DefineSection( 0, -376., 280., 280.1);
     241           0 :   shBREFA->DefineSection( 1,  376., 280., 280.1);
     242           0 :   shBREFA->SetName("shBREFA");
     243           0 :   TGeoCompositeShape* shBREF1 = new TGeoCompositeShape("shBREF1", "shBREFA-(shB77B:trB77A+shB77B:trB77B)");
     244           0 :   TGeoVolume* voBREF = new TGeoVolume("BREF1", shBREF1, gGeoManager->GetMedium("FRAME_Air"));
     245           0 :   voBREF->SetVisibility(0);
     246           0 :   TVirtualMC::GetMC()->Gspos("BREF1", 1, "B077", 0., 0., 0., 0, "ONLY");
     247             : //
     248             : //  The outer Frame
     249             : //
     250             : 
     251             :   Float_t dol = 4.;
     252             :   Float_t doh = 4.;
     253             :   Float_t ds  = 0.63;
     254             : //  
     255             : // Rings    
     256             : //
     257           0 :   dz = 2. * 410.2 * sin10 - 2. * dol * cos10 - 2. * doh * tan10;
     258           0 :   Float_t l1 = dz / 2.;
     259           0 :   Float_t l2 = dz / 2. + 2. * doh * tan10;
     260             : 
     261             : 
     262           0 :   TGeoVolumeAssembly* asBI42 = new TGeoVolumeAssembly("BI42");
     263             :  // Horizontal
     264           0 :   ptrd1[0] =  l2 - 0.6 * tan10;
     265           0 :   ptrd1[1] =  l2;
     266           0 :   ptrd1[2] =  8.0 / 2.;
     267           0 :   ptrd1[3] =  0.6 / 2.;
     268           0 :   TVirtualMC::GetMC()->Gsvolu("BIH142", "TRD1", kSteel, ptrd1, 4);
     269           0 :   ptrd1[0] =  l1;
     270           0 :   ptrd1[1] =  l1 + 0.6 * tan10;
     271           0 :   ptrd1[2] =  8.0 / 2.;
     272           0 :   ptrd1[3] =  0.6 / 2.;
     273           0 :   TVirtualMC::GetMC()->Gsvolu("BIH242", "TRD1", kSteel, ptrd1, 4);
     274             : 
     275             :   // Vertical 
     276           0 :   ptrd1[0] =  l1 + 0.6 * tan10;
     277           0 :   ptrd1[1] =  l2 - 0.6 * tan10;
     278           0 :   ptrd1[2] =  0.8 / 2.;
     279           0 :   ptrd1[3] =  6.8 / 2.;
     280           0 :   TVirtualMC::GetMC()->Gsvolu("BIV42", "TRD1", kSteel, ptrd1, 4);
     281             :   // Place 
     282           0 :   asBI42->AddNode(gGeoManager->GetVolume("BIV42"),  1, new TGeoTranslation(0., 0.,  0.0));
     283           0 :   asBI42->AddNode(gGeoManager->GetVolume("BIH142"), 1, new TGeoTranslation(0., 0.,  3.7));
     284           0 :   asBI42->AddNode(gGeoManager->GetVolume("BIH242"), 1, new TGeoTranslation(0., 0., -3.7));
     285             : //
     286             : // longitudinal bars
     287             : //
     288             : // 80 x 80 x 6.3
     289             : //
     290           0 :   pbox[0] = dol;
     291           0 :   pbox[1] = doh;
     292           0 :   pbox[2] = 345.;
     293           0 :   TVirtualMC::GetMC()->Gsvolu("B033", "BOX", kSteel, pbox, 3);
     294           0 :   pbox[0] = dol-ds;
     295           0 :   pbox[1] = doh-ds;
     296           0 :   TVirtualMC::GetMC()->Gsvolu("B034", "BOX", kAir, pbox, 3);
     297           0 :   TVirtualMC::GetMC()->Gspos("B034", 1, "B033", 0., 0., 0., 0, "ONLY");
     298             : 
     299             : 
     300             :   //
     301             :   // TPC support
     302             :   //
     303           0 :   pbox[0] =   3.37;
     304           0 :   pbox[1] =   2.0;
     305           0 :   pbox[2] = longLI / 2.;
     306           0 :   TVirtualMC::GetMC()->Gsvolu("B080", "BOX", kSteel, pbox, 3);
     307           0 :   pbox[0] =   2.78;
     308           0 :   pbox[1] =   1.40;
     309           0 :   pbox[2] =  longLI / 2.;
     310           0 :   TVirtualMC::GetMC()->Gsvolu("B081", "BOX", kAir, pbox, 3);
     311           0 :   TVirtualMC::GetMC()->Gspos("B081", 1, "B080",  0., 0., 0., 0, "ONLY");
     312             : 
     313             :   // Small 2nd reference plane elemenet 
     314           0 :    pbox[0] =   0.05;
     315           0 :    pbox[1] =   2.0;
     316           0 :    pbox[2] =  longLI / 2.;
     317           0 :    TVirtualMC::GetMC()->Gsvolu("BREF2", "BOX", kAir, pbox, 3);
     318           0 :    TVirtualMC::GetMC()->Gspos("BREF2", 1, "B080",  3.37 - 0.05, 0., 0., 0, "ONLY");
     319             : 
     320           0 :   TVirtualMC::GetMC()->Gspos("B080", 1, "B077",  283.25, 0., 0., 0, "ONLY");
     321           0 :   TVirtualMC::GetMC()->Gspos("B080", 2, "B077", -283.25, 0., 0., idrotm[2088], "ONLY");
     322             : 
     323             :    
     324             : //
     325             : // Diagonal bars (1) 
     326             : //
     327             :   Float_t h, d, dq, x, theta;
     328             :   
     329             :   h  = (dymodU[1]-dymodU[0]-2.*dol)*.999;
     330             :   d  = 2.*dol;
     331           0 :   dq = h*h+dz*dz;
     332             : 
     333           0 :   x  =  TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
     334             :   
     335             : 
     336           0 :   theta = krad2deg * TMath::ACos(x);
     337             :   
     338           0 :   ptrap[0]  = dz/2.;
     339           0 :   ptrap[1]  = theta;
     340           0 :   ptrap[2]  = 0.;
     341           0 :   ptrap[3]  = doh;
     342           0 :   ptrap[4]  = dol/x;
     343           0 :   ptrap[5]  = ptrap[4];
     344           0 :   ptrap[6]  = 0;
     345           0 :   ptrap[7]  = ptrap[3];
     346           0 :   ptrap[8]  = ptrap[4];
     347           0 :   ptrap[9]  = ptrap[4];
     348           0 :   ptrap[10] = 0;
     349             : 
     350           0 :   TVirtualMC::GetMC()->Gsvolu("B047", "TRAP", kSteel, ptrap, 11);
     351           0 :   ptrap[3]  = doh-ds;
     352           0 :   ptrap[4]  = (dol-ds)/x;
     353           0 :   ptrap[5]  = ptrap[4];
     354           0 :   ptrap[7]  = ptrap[3];
     355           0 :   ptrap[8]  = ptrap[4];
     356           0 :   ptrap[9]  = ptrap[4];
     357           0 :   TVirtualMC::GetMC()->Gsvolu("B048", "TRAP", kAir, ptrap, 11);
     358           0 :   TVirtualMC::GetMC()->Gspos("B048", 1, "B047", 0.0, 0.0, 0., 0, "ONLY");
     359             : 
     360             : /*
     361             :  Crosses (inner most) 
     362             :        \\  //
     363             :         \\//
     364             :         //\\
     365             :        //  \\
     366             : */
     367             :   h  = (2.*dymodU[0]-2.*dol)*.999;
     368             : // 
     369             : // Mother volume
     370             : //
     371           0 :   pbox[0] = h/2;
     372           0 :   pbox[1] = doh;
     373           0 :   pbox[2] = dz/2.;
     374           0 :   TVirtualMC::GetMC()->Gsvolu("BM49", "BOX ", kAir, pbox, 3);
     375             :   
     376             :   
     377           0 :   dq = h*h+dz*dz;
     378           0 :   x  =  TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
     379           0 :   theta = krad2deg * TMath::ACos(x);
     380             : 
     381           0 :   ptrap[0]  = dz/2.-kEps;
     382           0 :   ptrap[1]  = theta;
     383           0 :   ptrap[2]  = 0.;
     384           0 :   ptrap[3]  = doh-kEps;
     385           0 :   ptrap[4]  = dol/x;
     386           0 :   ptrap[5]  = ptrap[4];
     387           0 :   ptrap[7]  = ptrap[3];
     388           0 :   ptrap[8]  = ptrap[4];
     389           0 :   ptrap[9]  = ptrap[4];
     390             : 
     391           0 :   TVirtualMC::GetMC()->Gsvolu("B049", "TRAP", kSteel, ptrap, 11);
     392           0 :   ptrap[0]  = ptrap[0]-kEps;
     393           0 :   ptrap[3]  = (doh-ds);
     394           0 :   ptrap[4]  = (dol-ds)/x;
     395           0 :   ptrap[5]  = ptrap[4];
     396           0 :   ptrap[7]  = ptrap[3];
     397           0 :   ptrap[8]  = ptrap[4];
     398           0 :   ptrap[9]  = ptrap[4];
     399           0 :   TVirtualMC::GetMC()->Gsvolu("B050", "TRAP", kAir, ptrap, 11);
     400           0 :   TVirtualMC::GetMC()->Gspos("B050", 1, "B049", 0.0, 0.0, 0., 0, "ONLY");
     401           0 :   TVirtualMC::GetMC()->Gspos("B049", 1, "BM49", 0.0, 0.0, 0., 0, "ONLY");
     402             : 
     403             : 
     404           0 :   Float_t dd1    = d*TMath::Tan(theta*kdeg2rad);
     405           0 :   Float_t dd2    = d/TMath::Tan(2.*theta*kdeg2rad);
     406           0 :   Float_t theta2 = TMath::ATan(TMath::Abs(dd2-dd1)/d/2.);
     407             :   
     408             : 
     409           0 :   ptrap[0] = dol;
     410           0 :   ptrap[1] = theta2*krad2deg;
     411           0 :   ptrap[2] = 0.;
     412           0 :   ptrap[3] = doh;
     413           0 :   ptrap[4] = (dz/2./x-dd1-dd2)/2.;
     414           0 :   ptrap[5] = ptrap[4];
     415           0 :   ptrap[6] = 0.;
     416           0 :   ptrap[7] = ptrap[3];
     417           0 :   ptrap[8] = dz/4./x;
     418           0 :   ptrap[9] = ptrap[8];
     419             : 
     420             : 
     421           0 :   TVirtualMC::GetMC()->Gsvolu("B051", "TRAP", kSteel, ptrap, 11);
     422           0 :   Float_t ddx0 = ptrap[8];
     423             :   
     424           0 :   Float_t dd1s    = dd1*(1.-2.*ds/d);
     425           0 :   Float_t dd2s    = dd2*(1.-2.*ds/d); 
     426           0 :   Float_t theta2s = TMath::ATan(TMath::Abs(dd2s-dd1s)/(d-2.*ds)/2.);
     427             : 
     428             : 
     429           0 :   ptrap[0] = dol-ds;
     430           0 :   ptrap[1] = theta2s*krad2deg;
     431           0 :   ptrap[2] = 0.;
     432           0 :   ptrap[3] = doh-ds;
     433           0 :   ptrap[4] = ptrap[4]+ds/d/2.*(dd1+dd2);
     434           0 :   ptrap[5] = ptrap[4];
     435           0 :   ptrap[6] = 0.;
     436           0 :   ptrap[7] = ptrap[3];
     437           0 :   ptrap[8] = ptrap[8]-ds/2./d*(dd1+dd2);
     438           0 :   ptrap[9] = ptrap[8];
     439             :   
     440           0 :   TVirtualMC::GetMC()->Gsvolu("B052", "TRAP", kAir, ptrap, 11);
     441           0 :   TVirtualMC::GetMC()->Gspos("B052", 1, "B051", 0.0, 0.0, 0., 0, "ONLY");
     442             : 
     443             :   Float_t ddx, ddz, drx, drz, rtheta;
     444             : 
     445           0 :   AliMatrix(idrotm[2001], -theta+180, 0.0, 90.0, 90.0, 90.-theta, 0.0); 
     446           0 :   rtheta = (90.-theta)*kdeg2rad;
     447           0 :   ddx = -ddx0-dol*TMath::Tan(theta2);
     448             :   ddz = -dol;
     449             :   
     450           0 :   drx = TMath::Cos(rtheta) * ddx +TMath::Sin(rtheta) *ddz+pbox[0];
     451           0 :   drz = -TMath::Sin(rtheta) * ddx +TMath::Cos(rtheta) *ddz-pbox[2];
     452           0 :   TVirtualMC::GetMC()->Gspos("B051", 1, "BM49", 
     453           0 :              drx, 0.0, drz,
     454           0 :              idrotm[2001], "ONLY");
     455             : 
     456           0 :   AliMatrix(idrotm[2002], -theta, 0.0, 90.0, 90.0, 270.-theta, 0.0);
     457           0 :   rtheta = (270.-theta)*kdeg2rad;
     458             :   
     459           0 :   drx =  TMath::Cos(rtheta) * ddx +  TMath::Sin(rtheta) * ddz-pbox[0];
     460           0 :   drz = -TMath::Sin(rtheta) * ddx +  TMath::Cos(rtheta) * ddz+pbox[2];
     461           0 :   TVirtualMC::GetMC()->Gspos("B051", 2, "BM49", 
     462           0 :              drx, 0.0, drz,
     463           0 :              idrotm[2002], "ONLY");
     464             : 
     465             : //
     466             : // Diagonal bars (3) 
     467             : //
     468             :   h  = ((dymodU[2]-dymodU[1])-2.*dol)*.999;
     469           0 :   dq = h*h+dz*dz;
     470           0 :   x  =  TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
     471           0 :   theta = krad2deg * TMath::ACos(x);
     472             :   
     473           0 :   ptrap[0]  = dz/2.;
     474           0 :   ptrap[1]  = theta;
     475           0 :   ptrap[3]  =  doh;
     476           0 :   ptrap[4]  =  dol/x;
     477           0 :   ptrap[5]  = ptrap[4];
     478           0 :   ptrap[7]  = ptrap[3];
     479           0 :   ptrap[8]  = ptrap[4];
     480           0 :   ptrap[9]  = ptrap[4];
     481             : 
     482           0 :   TVirtualMC::GetMC()->Gsvolu("B045", "TRAP", kSteel, ptrap, 11);
     483           0 :   ptrap[3]  =  doh-ds;
     484           0 :   ptrap[4]  =  (dol-ds)/x;
     485           0 :   ptrap[5]  = ptrap[4];
     486           0 :   ptrap[7]  = ptrap[3];
     487           0 :   ptrap[8]  = ptrap[4];
     488           0 :   ptrap[9]  = ptrap[4];
     489           0 :   TVirtualMC::GetMC()->Gsvolu("B046", "TRAP", kAir, ptrap, 11);
     490           0 :   TVirtualMC::GetMC()->Gspos("B046", 1, "B045", 0.0, 0.0, 0., 0, "ONLY");
     491             : 
     492             : //
     493             : // Positioning of diagonal bars
     494             :   
     495             :   Float_t rd =  405.5 + 0.51;
     496           0 :   dz = (dymodU[1]+dymodU[0])/2.;
     497           0 :   Float_t dz2 =  (dymodU[1]+dymodU[2])/2.;
     498             : 
     499             : 
     500             : 
     501             : //
     502             : //  phi = 60
     503             : //
     504             : 
     505             :   Float_t phi = 60;
     506           0 :   dx = rd * TMath::Sin(phi*kdeg2rad);
     507           0 :   dy = rd * TMath::Cos(phi*kdeg2rad);
     508             : 
     509           0 :   TVirtualMC::GetMC()->Gspos("B045", 1, "B077", -dx,  dy,  dz2, idrotm[2021], "ONLY");
     510           0 :   TVirtualMC::GetMC()->Gspos("B045", 2, "B077", -dx,  dy, -dz2, idrotm[2028], "ONLY");
     511           0 :   TVirtualMC::GetMC()->Gspos("B045", 3, "B077",  dx,  dy,  dz2, idrotm[2022], "ONLY");
     512           0 :   TVirtualMC::GetMC()->Gspos("B045", 4, "B077",  dx,  dy, -dz2, idrotm[2029], "ONLY");
     513             : 
     514           0 :   TVirtualMC::GetMC()->Gspos("B045", 5, "B077",  dx,  -dy, -dz2, idrotm[2021], "ONLY");
     515           0 :   TVirtualMC::GetMC()->Gspos("B045", 6, "B077",  dx,  -dy, +dz2, idrotm[2028], "ONLY");
     516           0 :   TVirtualMC::GetMC()->Gspos("B045", 7, "B077", -dx,  -dy, -dz2, idrotm[2022], "ONLY");
     517           0 :   TVirtualMC::GetMC()->Gspos("B045", 8, "B077", -dx,  -dy, +dz2, idrotm[2029], "ONLY");
     518             : 
     519             : 
     520             : 
     521           0 :   TVirtualMC::GetMC()->Gspos("B047", 1, "B077",  -dx,  -dy,  dz, idrotm[2022], "ONLY");
     522           0 :   TVirtualMC::GetMC()->Gspos("B047", 2, "B077",  -dx,  -dy, -dz, idrotm[2029], "ONLY");
     523             : 
     524           0 :   TVirtualMC::GetMC()->Gspos("B047", 3, "B077",   dx,  -dy,  dz, idrotm[2021], "ONLY");
     525           0 :   TVirtualMC::GetMC()->Gspos("B047", 4, "B077",   dx,  -dy, -dz, idrotm[2028], "ONLY");
     526             : 
     527             : 
     528           0 :   TVirtualMC::GetMC()->Gspos("BM49", 1, "B077",  dx, -dy,  0., idrotm[2101], "ONLY");
     529           0 :   TVirtualMC::GetMC()->Gspos("BM49", 2, "B077", -dx, -dy,  0., idrotm[2100], "ONLY");
     530             : 
     531             : //
     532             : //  phi = 80
     533             : //
     534             : 
     535             :   phi = 80;
     536           0 :   dx = rd * TMath::Sin(phi*kdeg2rad);
     537           0 :   dy = rd * TMath::Cos(phi*kdeg2rad);
     538             : 
     539           0 :   TVirtualMC::GetMC()->Gspos("B047", 13, "B077", -dx, -dy,  dz, idrotm[2008], "ONLY");
     540           0 :   TVirtualMC::GetMC()->Gspos("B047", 14, "B077", -dx, -dy, -dz, idrotm[2010], "ONLY");
     541           0 :   TVirtualMC::GetMC()->Gspos("B047", 15, "B077",  dx, -dy,  dz, idrotm[2012], "ONLY");
     542           0 :   TVirtualMC::GetMC()->Gspos("B047", 16, "B077",  dx, -dy, -dz, idrotm[2011], "ONLY");
     543             : 
     544           0 :   TVirtualMC::GetMC()->Gspos("B045", 11, "B077", -dx,  dy,  dz2, idrotm[2023], "ONLY");
     545           0 :   TVirtualMC::GetMC()->Gspos("B045", 12, "B077", -dx,  dy, -dz2, idrotm[2031], "ONLY");
     546           0 :   TVirtualMC::GetMC()->Gspos("B045", 13, "B077",  dx,  dy,  dz2, idrotm[2026], "ONLY");
     547           0 :   TVirtualMC::GetMC()->Gspos("B045", 14, "B077",  dx,  dy, -dz2, idrotm[2030], "ONLY");
     548             : 
     549           0 :   TVirtualMC::GetMC()->Gspos("B045", 15, "B077", -dx, -dy,  dz2, idrotm[2024], "ONLY");
     550           0 :   TVirtualMC::GetMC()->Gspos("B045", 16, "B077", -dx, -dy, -dz2, idrotm[2032], "ONLY");
     551           0 :   TVirtualMC::GetMC()->Gspos("B045", 17, "B077",  dx, -dy,  dz2, idrotm[2025], "ONLY");
     552           0 :   TVirtualMC::GetMC()->Gspos("B045", 18, "B077",  dx, -dy, -dz2, idrotm[2033], "ONLY");
     553             : 
     554           0 :   TVirtualMC::GetMC()->Gspos("BM49", 3, "B077",  dx, -dy,  0., idrotm[2025], "ONLY");
     555           0 :   TVirtualMC::GetMC()->Gspos("BM49", 4, "B077", -dx, -dy,  0., idrotm[2024], "ONLY");
     556             : 
     557             : 
     558             : //
     559             : // The inner frame
     560             : //
     561             : //
     562             : //  Mother Volumes
     563             : //
     564           0 :   ptrd1[0] =  (hR - longH/2. - dext)   * tan10;
     565           0 :   ptrd1[1] =  (hR - longH/2. + iFrH0)  * tan10;
     566           0 :   ptrd1[2] =  zE;  
     567           0 :   ptrd1[3] =  iFrH0 / 2.;  
     568           0 :   Float_t dd   = longW / 2. * cos10 + 0.1;
     569           0 :   TGeoTrd1*   shTRD1  = new TGeoTrd1("shTRD1", ptrd1[0], ptrd1[1], ptrd1[2], ptrd1[3]);
     570           0 :   TGeoBBox*   shBox   = new TGeoBBox("shBox", 50., zE+10., 1.);
     571           0 :   TGeoRotation* rot1  = new TGeoRotation("urot1", 100., 0., 90., 90.,  10., 0.);    
     572           0 :   TGeoRotation* rot2  = new TGeoRotation("urot2",  80., 0., 90., 90., -10., 0.);    
     573           0 :   Float_t trotDz = iFrH0 / 2. + 1.;
     574           0 :   Float_t trotDx = 402. * tan10;
     575           0 :   TGeoCombiTrans* trot1    = new TGeoCombiTrans(-trotDx, 0., trotDz, rot2);
     576           0 :   TGeoCombiTrans* trot2    = new TGeoCombiTrans(+trotDx, 0., trotDz, rot1);
     577           0 :   TGeoUnion*  uni          = new TGeoUnion(shBox, shBox,trot1, trot2); 
     578           0 :   TGeoCompositeShape* shU  =  new TGeoCompositeShape("shU", uni);
     579           0 :   TGeoSubtraction* sub     = new TGeoSubtraction(shTRD1, shU, 0, 0);
     580           0 :   TGeoCompositeShape* shCS = new TGeoCompositeShape("shCS", sub);
     581             :   // center of segments
     582           0 :   Float_t r      =  (hR - longH/2. + iFrH0 / 2. ) - dext; 
     583             :   // center of outer frame
     584             :   //vertical
     585             :   Float_t rout1  = 406.0;
     586             :   // radial
     587           0 :   Float_t rout2  = 412.3 - 2. * sin10 + 0.25;
     588             :   //
     589           0 :   TString module[18];
     590           0 :   for (i = 0; i < 18; i++) {
     591             : 
     592             :       // Create volume i 
     593           0 :       char name[16];
     594             :       // official module numbering
     595           0 :       Int_t mod = i + 13;
     596           0 :       if (mod > 17) mod -= 18;
     597           0 :       snprintf(name, 16, "BSEGMO%d", mod);
     598             :       //
     599           0 :       TGeoVolume* voTRD1 = new TGeoVolume(name, shCS, kMedAir);
     600           0 :       module[i] = name;
     601             :       // Place volume i
     602           0 :       Float_t phi1  =  i * 20.;
     603           0 :       Float_t phi2  = 270. + phi1;
     604           0 :       if (phi2 >= 360.) phi2 -= 360.;
     605           0 :       dx =  TMath::Sin(phi1 * kdeg2rad) * r;
     606           0 :       dy = -TMath::Cos(phi1 * kdeg2rad) * r;
     607             :       
     608           0 :       char nameR[16];
     609           0 :       snprintf(nameR, 16, "B43_Rot_%d", i);
     610           0 :       TGeoRotation* rot = new TGeoRotation(nameR,  90.0, phi1, 0., 0., 90., phi2);  
     611           0 :       AliMatrix(idrotm[2034+i],  90.0, phi1, 0., 0., 90., phi2);  
     612           0 :       TGeoVolume* vol77 = gGeoManager->GetVolume("B077");
     613           0 :       vol77->AddNode(voTRD1, 1,  new TGeoCombiTrans(dx, dy, 0., rot));
     614             : 
     615             : //
     616             : //    Position elements of outer Frame
     617             : //
     618           0 :       dx =  TMath::Sin(phi1*kdeg2rad)*rout1;
     619           0 :       dy = -TMath::Cos(phi1*kdeg2rad)*rout1;
     620           0 :       for (j = 0; j < 3; j++)
     621             :       {
     622           0 :           dz = dymodU[j];
     623           0 :           TGeoVolume* vol = gGeoManager->GetVolume("B077");
     624           0 :           vol->AddNode(asBI42, 6*i+2*j+1, new TGeoCombiTrans(dx, dy,  dz, rot));
     625           0 :           vol->AddNode(asBI42, 6*i+2*j+2, new TGeoCombiTrans(dx, dy, -dz, rot));
     626             :       }
     627             : 
     628           0 :       phi1 = i*20.+10;
     629           0 :       phi2 = 270+phi1;
     630           0 :       AliMatrix(idrotm[2052+i],  90.0, phi1, 90., phi2, 0., 0.);  
     631             : 
     632           0 :       dx =  TMath::Sin(phi1*kdeg2rad)*rout2;
     633           0 :       dy = -TMath::Cos(phi1*kdeg2rad)*rout2;
     634           0 :       TVirtualMC::GetMC()->Gspos("B033", i+1, "B077", dx, dy,  0., idrotm[2052+i], "ONLY");      
     635             : //
     636           0 :   }
     637             : // Internal Frame rings
     638             : //
     639             : //
     640             : // Pos 7   60x60x5x6  for inner rings (I-beam)
     641             : // Pos 6    100x60x5  for front and rear rings
     642             : //
     643             : // Front and rear 
     644             : //
     645             : 
     646           0 :   ptrd1[0] =  (hR - longH / 2.) * tan10 - dd;
     647           0 :   ptrd1[1] =  (hR + longH / 2.) * tan10 - dd;
     648           0 :   ptrd1[2] =  ringW / 2.;
     649           0 :   ptrd1[3] =  ringH / 2.;  
     650             :   
     651           0 :   TVirtualMC::GetMC()->Gsvolu("B072", "TRD1", kSteel, ptrd1, 4);
     652             : 
     653           0 :   ptrd1[0] =  (hR - longH / 2. + 0.5) * tan10 - dd;
     654           0 :   ptrd1[1] =  (hR + longH / 2. - 0.5) * tan10 - dd;
     655           0 :   ptrd1[2] =  ringW / 2. - 0.5;
     656           0 :   ptrd1[3] =  ringH / 2. - 0.5;  
     657             : 
     658           0 :   TVirtualMC::GetMC()->Gsvolu("B073", "TRD1", kAir, ptrd1, 4);
     659           0 :   TVirtualMC::GetMC()->Gspos("B073", 1, "B072", 0., 0., 0., 0, "ONLY");
     660             : //
     661             : // I-Beam
     662             : // Mother volume
     663           0 :   TGeoVolumeAssembly* asBI72 = new TGeoVolumeAssembly("BI72");
     664             :  // Horizontal
     665             :   Float_t rIB1 = hR + ringH/2.;
     666             :   Float_t rIB2 = hR - ringH/2.;
     667           0 :   ptrd1[0] =  (rIB1 - ringT/2.) * tan10  - dd;
     668           0 :   ptrd1[1] =  (rIB1           ) * tan10  - dd;
     669           0 :   ptrd1[2] =  ringH / 2.;
     670           0 :   ptrd1[3] =  ringT / 4.;
     671           0 :   TVirtualMC::GetMC()->Gsvolu("BIH172", "TRD1", kSteel, ptrd1, 4);
     672           0 :   ptrd1[0] =  (rIB2           ) * tan10 - dd;
     673           0 :   ptrd1[1] =  (rIB2 + ringT/2.) * tan10 - dd;
     674           0 :   ptrd1[2] =  ringH/2.;
     675           0 :   ptrd1[3] =  ringT/4.;
     676           0 :   TVirtualMC::GetMC()->Gsvolu("BIH272", "TRD1", kSteel, ptrd1, 4);
     677             : 
     678             :   // Vertical 
     679           0 :   ptrd1[0] =  (rIB2 + ringT/2.) * tan10 - dd;
     680           0 :   ptrd1[1] =  (rIB1 - ringT/2.) * tan10 - dd;
     681           0 :   ptrd1[2] =  0.6 / 2.;
     682           0 :   ptrd1[3] =  (ringH - ringT) / 2.;
     683           0 :   TVirtualMC::GetMC()->Gsvolu("BIV72", "TRD1", kSteel, ptrd1, 4);
     684             :   // Place 
     685           0 :   asBI72->AddNode(gGeoManager->GetVolume("BIV72"), 1,  new TGeoTranslation(0., 0., 0.));
     686           0 :   asBI72->AddNode(gGeoManager->GetVolume("BIH172"), 1, new TGeoTranslation(0., 0.,  (ringH/2. - ringT/4.)));
     687           0 :   asBI72->AddNode(gGeoManager->GetVolume("BIH272"), 1, new TGeoTranslation(0., 0., -(ringH/2. - ringT/4.)));
     688             : 
     689             : // Web frame
     690             : //
     691             : // h x w x s = 60 x 40 x 5 
     692             : // (attention: elements are half bars, "U" shaped)  
     693             : //
     694             :   
     695           0 :   WebFrame("B063",  dHz, dymodO[0],  10.);
     696           0 :   WebFrame("B163",  dHz, dymodO[1],  10.);
     697           0 :   WebFrame("B263",  dHz, dymodO[2],  10.);
     698           0 :   WebFrame("B363",  dHz, dymodO[3],  10.);
     699           0 :   WebFrame("B463",  dHz, dymodO[4],  10.);
     700             : 
     701           0 :   dz = -iFrH0 / 2. + ringH / 2. + dext;
     702             : 
     703           0 :   Float_t dz0 = -iFrH0 / 2. + longH + 113. / 2. + dext - 0.1;  
     704           0 :   Float_t dx0 = (hR + iFrH/2.) * tan10 - longW / 4. * cos10 - 0.065;
     705           0 :   for (jmod = 0; jmod < 18; jmod++)
     706             :   {
     707             : //
     708             : // ring bars
     709           0 :       for (i = 0; i < 3; i++) {
     710           0 :         if (i == 2) { 
     711           0 :           TVirtualMC::GetMC()->Gspos("B072", 6*jmod+i+1, module[jmod], 0,  dymodL[i], dz, 0, "ONLY");
     712           0 :           TVirtualMC::GetMC()->Gspos("B072", 6*jmod+i+4, module[jmod], 0, -dymodL[i], dz, idrotm[2070], "ONLY");      
     713             :         } else {
     714           0 :           TGeoVolume* vol = gGeoManager->GetVolume(module[jmod]);
     715           0 :           vol->AddNode(asBI72, 6*jmod+i+1, new TGeoTranslation(0,   dymodL[i], dz));
     716           0 :           vol->AddNode(asBI72, 6*jmod+i+4, new TGeoTranslation(0,  -dymodL[i], dz));
     717             :         }
     718             :       }
     719             :   }
     720             : //  
     721             : // outer diagonal web
     722             : 
     723           0 :   dy = dymodW[0] - (dHz/2.) * TMath::Tan(dymodO[0] * kdeg2rad);
     724             :   
     725           0 :   for (jmod = 0; jmod < 18; jmod++) {
     726           0 :     TVirtualMC::GetMC()->Gspos("B063I", 4*jmod+1, module[jmod],  dx0,   dy,  dz0, idrotm[2096], "ONLY");
     727           0 :     TVirtualMC::GetMC()->Gspos("B063",  4*jmod+2, module[jmod],  dx0,  -dy,  dz0, idrotm[2097], "ONLY");
     728           0 :     TVirtualMC::GetMC()->Gspos("B063I", 4*jmod+3, module[jmod], -dx0,  -dy,  dz0, idrotm[2087], "ONLY");
     729           0 :     TVirtualMC::GetMC()->Gspos("B063",  4*jmod+4, module[jmod], -dx0,   dy,  dz0, idrotm[2086], "ONLY");
     730             :   }
     731             : 
     732           0 :   dy = dymodW[1] - (dHz/2.)  * TMath::Tan(dymodO[1] * kdeg2rad);
     733             : 
     734           0 :   for (jmod = 0; jmod < 18; jmod++) {
     735           0 :     TVirtualMC::GetMC()->Gspos("B163I", 4*jmod+1, module[jmod],  dx0, -dy,  dz0, idrotm[2096], "ONLY");
     736           0 :     TVirtualMC::GetMC()->Gspos("B163",  4*jmod+2, module[jmod],  dx0,  dy,  dz0, idrotm[2097], "ONLY");
     737           0 :     TVirtualMC::GetMC()->Gspos("B163I", 4*jmod+3, module[jmod], -dx0,  dy,  dz0, idrotm[2087], "ONLY");
     738           0 :     TVirtualMC::GetMC()->Gspos("B163",  4*jmod+4, module[jmod], -dx0, -dy,  dz0, idrotm[2086], "ONLY");
     739             :   }
     740             : 
     741           0 :   dy = dymodW[2] - (dHz/2) * TMath::Tan(dymodO[2] * kdeg2rad);
     742             :   
     743           0 :   for (jmod = 0; jmod < 18; jmod++) {
     744           0 :     TVirtualMC::GetMC()->Gspos("B263I", 4*jmod+1, module[jmod],  dx0,  dy,  dz0, idrotm[2096], "ONLY");
     745           0 :     TVirtualMC::GetMC()->Gspos("B263",  4*jmod+2, module[jmod],  dx0, -dy,  dz0, idrotm[2097], "ONLY");
     746           0 :     TVirtualMC::GetMC()->Gspos("B263I", 4*jmod+3, module[jmod], -dx0, -dy,  dz0, idrotm[2087], "ONLY");
     747           0 :     TVirtualMC::GetMC()->Gspos("B263",  4*jmod+4, module[jmod], -dx0,  dy,  dz0, idrotm[2086], "ONLY");
     748             :   }
     749             : 
     750           0 :   dy = dymodW[3] -  (dHz/2.) * TMath::Tan(dymodO[3] * kdeg2rad);
     751             : 
     752           0 :     for (jmod = 0; jmod < 18; jmod++) {
     753           0 :       TVirtualMC::GetMC()->Gspos("B363I", 4*jmod+1, module[jmod],  dx0, -dy,  dz0, idrotm[2096], "ONLY");
     754           0 :       TVirtualMC::GetMC()->Gspos("B363",  4*jmod+2, module[jmod],  dx0,  dy,  dz0, idrotm[2097], "ONLY");
     755           0 :       TVirtualMC::GetMC()->Gspos("B363I", 4*jmod+3, module[jmod], -dx0,  dy,  dz0, idrotm[2087], "ONLY");
     756           0 :       TVirtualMC::GetMC()->Gspos("B363",  4*jmod+4, module[jmod], -dx0, -dy,  dz0, idrotm[2086], "ONLY");
     757             :   }
     758             : 
     759           0 :   dy = dymodW[4] -  (dHz/2.) * TMath::Tan(dymodO[4] * kdeg2rad);
     760             :     
     761           0 :   for (jmod = 0; jmod < 18; jmod++) {
     762           0 :       TVirtualMC::GetMC()->Gspos("B463I", 4*jmod+1, module[jmod],  dx0,  dy, dz0, idrotm[2096], "ONLY");
     763           0 :       TVirtualMC::GetMC()->Gspos("B463",  4*jmod+2, module[jmod],  dx0, -dy, dz0, idrotm[2097], "ONLY");
     764           0 :       TVirtualMC::GetMC()->Gspos("B463I", 4*jmod+3, module[jmod], -dx0, -dy, dz0, idrotm[2087], "ONLY");
     765           0 :       TVirtualMC::GetMC()->Gspos("B463",  4*jmod+4, module[jmod], -dx0,  dy, dz0, idrotm[2086], "ONLY");
     766             :   }
     767             :  
     768             : // longitudinal bars (TPC rails attached)
     769             : //  new specs:
     770             : //  h x w x s = 100 x 75 x 6 
     771             : //  Attention: 2 "U" shaped half rods per cell 
     772             : //  longitudinal bars (no TPC rails attached)
     773             : //  new specs: h x w x s = 40 x 60 x 5
     774             : //
     775             : //
     776             : // 
     777           0 :     Double_t lbox[3];
     778           0 :     lbox[0] = longW  / 4.;
     779           0 :     lbox[2] = longH  / 2.;
     780           0 :     lbox[1] = longLI / 2.;
     781           0 :     TVirtualMC::GetMC()->Gsvolu("BA59", "BOX", kSteel, lbox, 3);
     782           0 :     gGeoManager->GetVolume("BA59")->SetVisContainers();
     783           0 :     lbox[0] = longW / 4. - 0.25;
     784           0 :     lbox[2] = longH / 2. - 0.50;
     785           0 :     TVirtualMC::GetMC()->Gsvolu("BA62", "BOX", kAir, lbox, 3); 
     786           0 :     TVirtualMC::GetMC()->Gspos("BA62", 1, "BA59", 0.25, 0.0, 0.0, 0, "ONLY");
     787             : 
     788           0 :     dz = -iFrH0 / 2. + longH / 2. - 1. * sin10 + dext;
     789           0 :     dx = hR * tan10 - longW / 4. * cos10 - 0.065;
     790           0 :     for (jmod = 0; jmod < 18; jmod++) {
     791           0 :       TVirtualMC::GetMC()->Gspos("BA59", 2*jmod+1, module[jmod],  dx, 0.0, dz, idrotm[2096], "ONLY");
     792           0 :       TVirtualMC::GetMC()->Gspos("BA59", 2*jmod+2, module[jmod], -dx, 0.0, dz, idrotm[2087], "ONLY");
     793             :     }
     794             : 
     795             :   //
     796             :   // Rails for TRD
     797             :   //
     798             :   // Pos 1
     799             :   //
     800             :   // angular 80 deg profile
     801           0 :   lbox[2] = 4.0;
     802           0 :   lbox[0] = 0.2;
     803           0 :   lbox[1] = longLI / 2.;
     804           0 :   TVirtualMC::GetMC()->Gsvolu("BTRDR_10", "BOX",  kSteel, lbox, 3); 
     805             : 
     806           0 :   ptrd1[0] =  3.;
     807           0 :   ptrd1[1] =  3. + 0.4 * tan10;
     808           0 :   ptrd1[2] =  longLI / 2.;
     809           0 :   ptrd1[3] =  0.2;  
     810           0 :   TVirtualMC::GetMC()->Gsvolu("BTRDR_11", "TRD1", kSteel, ptrd1, 4);
     811             : 
     812           0 :   lbox[2] = 2.0;
     813           0 :   lbox[0] = 0.3;
     814           0 :   lbox[1] = longLI / 2.;
     815           0 :   TVirtualMC::GetMC()->Gsvolu("BTRDR_12", "BOX",  kAlu, lbox, 3); 
     816           0 :   gGeoManager->GetVolume("BTRDR_12")->SetVisContainers();
     817             : 
     818           0 :   lbox[2] = 2.0;
     819           0 :   lbox[0] = 0.1;
     820           0 :   lbox[1] = longLI / 2.;
     821           0 :   TVirtualMC::GetMC()->Gsvolu("BTRDR_13", "BOX",  kG10, lbox, 3); 
     822           0 :   TVirtualMC::GetMC()->Gspos("BTRDR_13", 1, "BTRDR_12",   -0.2,  0.0, 0.0, 0, "ONLY");
     823             : 
     824           0 :   lbox[2] = 0.1;
     825           0 :   lbox[0] = 2.0;
     826           0 :   lbox[1] = longLI / 2.;
     827           0 :   TVirtualMC::GetMC()->Gsvolu("BTRDR_14", "BOX",  kG10, lbox, 3); 
     828             :   dz = -iFrH0 / 2. + longH / 2. + dext; 
     829             :   Float_t zpos = 80.;
     830           0 :   Int_t isec_1[11] = {0, 1, 2, 3, 4, 5, 13, 14, 15, 16, 17};
     831             : 
     832           0 :    for (Int_t index = 0; index < 11; index++) {
     833           0 :      jmod = isec_1[index];
     834           0 :      Float_t dz1 =  dz + 3. + (zpos - 4.);
     835           0 :      dx0 = (hR + dz0 + zpos - 4.) * tan10 - (longW / 2. + 0.2) / cos10 - 0.05;
     836           0 :      if (jmod !=  5) TVirtualMC::GetMC()->Gspos("BTRDR_10", 2*jmod+1, module[jmod],   dx0,  0.0, dz1, idrotm[2096], "ONLY");
     837           0 :      if (jmod != 13) TVirtualMC::GetMC()->Gspos("BTRDR_10", 2*jmod+2, module[jmod],  -dx0,  0.0, dz1, idrotm[2086], "ONLY");
     838           0 :      dx0 -= 0.5;
     839           0 :      if (jmod !=  5) TVirtualMC::GetMC()->Gspos("BTRDR_12", 2*jmod+1, module[jmod],   dx0,  0.0, dz1, idrotm[2096], "ONLY");
     840           0 :      if (jmod != 13) TVirtualMC::GetMC()->Gspos("BTRDR_12", 2*jmod+2, module[jmod],  -dx0,  0.0, dz1, idrotm[2087], "ONLY");
     841           0 :      dz1 += (4 - 0.2);                 
     842           0 :      dz1 += dext;
     843           0 :      dx0 = (hR + dz0 + zpos - 0.2) * tan10 - (longW / 2. + 3. + 0.4) / cos10;
     844           0 :      if (jmod !=  5) TVirtualMC::GetMC()->Gspos("BTRDR_11", 2*jmod+1, module[jmod],   dx0,  0.0, dz1, 0, "ONLY");
     845           0 :      if (jmod != 13) TVirtualMC::GetMC()->Gspos("BTRDR_11", 2*jmod+2, module[jmod],  -dx0,  0.0, dz1, 0, "ONLY");
     846           0 :      dz1 -= 0.3;
     847           0 :      dx0 -= 0.5;
     848           0 :      if (jmod !=  5) TVirtualMC::GetMC()->Gspos("BTRDR_14", 2*jmod+1, module[jmod],   dx0,  0.0, dz1, 0, "ONLY");
     849           0 :      if (jmod != 13) TVirtualMC::GetMC()->Gspos("BTRDR_14", 2*jmod+2, module[jmod],  -dx0,  0.0, dz1, 0, "ONLY");
     850             :    }
     851             : 
     852             :   // Pos 2
     853             :   // 40 x 10 
     854           0 :   lbox[2] = 2.0;
     855           0 :   lbox[0] = 0.5;
     856           0 :   lbox[1] = longLI / 2.;
     857           0 :   TVirtualMC::GetMC()->Gsvolu("BTRDR_2", "BOX", kAlu, lbox, 3); 
     858           0 :   lbox[2] = 2.0;
     859           0 :   lbox[0] = 0.1;
     860           0 :   lbox[1] = longLI / 2.;
     861           0 :   TVirtualMC::GetMC()->Gsvolu("BTRDR_21", "BOX", kG10, lbox, 3); 
     862           0 :   TVirtualMC::GetMC()->Gspos("BTRDR_21", 1, "BTRDR_2",   -0.4, 0.0, 0.0, 0, "ONLY");
     863             : 
     864           0 :   Int_t isec_2a[16] = {1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17};
     865           0 :   for (Int_t index = 0; index < 16; index++) {
     866           0 :     jmod = isec_2a[index];
     867           0 :     dx0 = (hR + dz0 ) * tan10 + 10. * sin10 - (longW / 4. + 0.5) / cos10;
     868           0 :     if (jmod >8) {
     869           0 :       TVirtualMC::GetMC()->Gspos("BTRDR_2", 2*jmod+1, module[jmod],   dx0-1.5,  0.0, dz + 3. + 8. * cos10, idrotm[2096], "ONLY");
     870             :     } else {
     871           0 :       TVirtualMC::GetMC()->Gspos("BTRDR_2", 2*jmod+2, module[jmod],  -dx0+1.5,  0.0, dz + 3. + 8. * cos10, idrotm[2087], "ONLY");
     872             :     }
     873             :   }
     874             :   
     875           0 :   Int_t isec_2b[6]  = {6, 7, 8, 10, 11, 12};
     876           0 :   for (Int_t index = 0; index < 6; index++) {
     877           0 :     jmod = isec_2b[index];
     878           0 :     dx0 = (hR + dz0 + zpos - 3.) * tan10 - (longW / 4. + 0.5) / cos10;
     879           0 :     if (index < 3) {
     880           0 :       TVirtualMC::GetMC()->Gspos("BTRDR_2", 2*jmod+2, module[jmod],  -dx0+1.5,  0.0, dz + 3. + zpos - 3., idrotm[2087], "ONLY");
     881             :     } else {
     882           0 :       TVirtualMC::GetMC()->Gspos("BTRDR_2", 2*jmod+1, module[jmod],   dx0-1.5,  0.0, dz + 3. + zpos -3. , idrotm[2096], "ONLY");
     883             :     }
     884             :   }
     885             : 
     886             : 
     887             :   // Pos 3
     888             :   // 40 x 14
     889           0 :   lbox[0] = 2.0;
     890           0 :   lbox[2] = 0.7;
     891           0 :   lbox[1] = longLI / 2.;
     892           0 :   TVirtualMC::GetMC()->Gsvolu("BTRDR_3", "BOX", kAlu, lbox, 3); 
     893             : 
     894           0 :   lbox[0] = 2.0;
     895           0 :   lbox[2] = 0.1;
     896           0 :   lbox[1] = longLI / 2.;
     897           0 :   TVirtualMC::GetMC()->Gsvolu("BTRDR_31", "BOX", kG10, lbox, 3); 
     898           0 :   TVirtualMC::GetMC()->Gspos("BTRDR_31", 1, "BTRDR_3",   0,  0.0, 0.6, 0, "ONLY");
     899             :   
     900           0 :   Int_t isec_3[9]  = {5, 6, 7, 8, 9, 10, 11, 12, 13};
     901             : 
     902             : 
     903             : 
     904           0 :    for (Int_t index = 0; index < 9; index++) {
     905           0 :      jmod = isec_3[index];
     906           0 :      if (index > 1) TVirtualMC::GetMC()->Gspos("BTRDR_3", 2*jmod+1, module[jmod],   50.96-5-2.,  0.0, dz+3.7, 0, "ONLY");
     907           0 :      if (index < 7) TVirtualMC::GetMC()->Gspos("BTRDR_3", 2*jmod+2, module[jmod],  -50.96+5+2.,  0.0, dz+3.7, 0, "ONLY");
     908             :    }
     909             :    //
     910             :    // Fixation Blocks with tie anchors
     911             :    // 
     912             :    // inner
     913           0 :    Float_t thetFB1 = 10./180. * TMath::Pi();
     914           0 :    Float_t thetFB2 = 40./180. * TMath::Pi();
     915             :    // half height of the block
     916             :    Double_t dzFB = 6.;
     917             :    // half width of the block
     918             :    Float_t dyFB = 3.9/2.;
     919             :    // lenth upper face
     920             :    Float_t dxFB = 46.; 
     921             :    // lower face
     922           0 :    Float_t dx1FB = dxFB/2. - 2. * dzFB * TMath::Tan(thetFB1);
     923           0 :    Float_t dx2FB = dxFB/2. - 2. * dzFB * TMath::Tan(thetFB2);
     924             : 
     925           0 :    TGeoArb8* shFB1 = new TGeoArb8(dzFB);
     926           0 :    shFB1->SetVertex(0, -dyFB/2., -dxFB/2.);
     927           0 :    shFB1->SetVertex(1, -dyFB/2.,  dxFB/2.);
     928           0 :    shFB1->SetVertex(2,  dyFB/2.,  dxFB/2.);
     929           0 :    shFB1->SetVertex(3,  dyFB/2., -dxFB/2.);
     930             :    
     931           0 :    shFB1->SetVertex(4, -dyFB/2.,  -dx1FB);
     932           0 :    shFB1->SetVertex(5, -dyFB/2.,   dx2FB);
     933           0 :    shFB1->SetVertex(6,  dyFB/2.,   dx2FB);
     934           0 :    shFB1->SetVertex(7,  dyFB/2.,  -dx1FB);
     935             : 
     936           0 :    TGeoVolume* volFB1   = new TGeoVolume("BTRD_FB1", shFB1, kMedAlu);
     937             :    //
     938             :    // tie anchors rectangular profile 4 x 8
     939           0 :    TGeoVolume* volTAR11 = new TGeoVolume("BTRD_TAR11", 
     940           0 :                                          new TGeoBBox(dyFB/2., dxFB/2.-0.7, 4.), 
     941             :                                          kMedAlu);
     942           0 :    TGeoVolume* volTAR12 = new TGeoVolume("BTRD_TAR12", 
     943           0 :                                          new TGeoBBox(dyFB/2.-0.25, dxFB/2., 3.-0.5), 
     944             :                                          kMedAir);
     945           0 :    volTAR11->AddNode(volTAR12,  1, new TGeoTranslation(0.25, 0.,  0.0));
     946             :    // clamp (about twice the length of the block), 6 mm thick (read off from a foto)
     947           0 :    TGeoVolume* volTAR13 = new TGeoVolume("BTRD_TAR13", 
     948           0 :                                          new TGeoBBox(0.3, 45., 3.), 
     949             :                                          kMedAlu);
     950             :    // square block with screw r = 0.9 cm
     951           0 :    TGeoVolume* volTAR141 = new TGeoVolume("BTRD_TAR141", 
     952           0 :                                          new TGeoBBox(1., 2., 6.), 
     953             :                                          kMedAir);
     954           0 :    TGeoVolume* volTAR142 = new TGeoVolume("BTRD_TAR142", 
     955           0 :                                          new TGeoBBox(1., 2., 6.), 
     956             :                                          kMedAir);
     957             : 
     958           0 :    TGeoVolume* volTAR15 = new TGeoVolume("BTRD_TAR15", new TGeoBBox(1., 2., 3.), kMedAlu);
     959           0 :    TGeoVolume* volTAR16 = new TGeoVolume("BTRD_TAR16", new TGeoTubeSeg(0., 0.78, 1.5, 90., 270.), kMedSteel);
     960           0 :    TGeoVolume* volTAR17 = new TGeoVolume("BTRD_TAR17", new TGeoTubeSeg(0., 0.78, 1.5, -90, 90.), kMedSteel);
     961           0 :    volTAR141->AddNode(volTAR15,  1, new TGeoTranslation(0, 0, 0));
     962           0 :    volTAR141->AddNode(volTAR16,  1, new TGeoTranslation(1., 0, +4.5));
     963           0 :    volTAR141->AddNode(volTAR16,  2, new TGeoTranslation(1., 0, -4.5));
     964             : 
     965           0 :    volTAR142->AddNode(volTAR15,  1, new TGeoTranslation(0, 0, 0));
     966           0 :    volTAR142->AddNode(volTAR17,  1, new TGeoTranslation(-1., 0, +4.5));
     967           0 :    volTAR142->AddNode(volTAR17,  2, new TGeoTranslation(-1., 0, -4.5));
     968             : 
     969           0 :    TGeoVolumeAssembly* asFB1 = new TGeoVolumeAssembly("BTRD_FBAS1");
     970           0 :    TGeoVolumeAssembly* asFB2 = new TGeoVolumeAssembly("BTRD_FBAS2");
     971           0 :    asFB1->AddNode(volFB1,   1, gGeoIdentity);
     972           0 :    asFB1->AddNode(volTAR11, 1, new TGeoTranslation(0., 0., -dzFB - 3.));
     973           0 :    asFB1->AddNode(volTAR13, 1, new TGeoTranslation(-1.36, 4.5, -dzFB-3.));
     974           0 :    asFB1->AddNode(volTAR141, 1, new TGeoTranslation(0.,  dxFB-2.+4.5, -dzFB-3.));
     975           0 :    asFB1->AddNode(volTAR141, 2, new TGeoTranslation(0., -dxFB+2.+4.5, -dzFB-3.));
     976             : 
     977           0 :    asFB2->AddNode(volFB1,   2, gGeoIdentity);
     978           0 :    asFB2->AddNode(volTAR11, 2, new TGeoTranslation(0., 0., -dzFB - 3.));
     979           0 :    asFB2->AddNode(volTAR13, 2, new TGeoTranslation(1.36, 4.5, -dzFB-3.));
     980           0 :    asFB2->AddNode(volTAR142, 3, new TGeoTranslation(0.,  dxFB-2.+4.5, -dzFB-3.));
     981           0 :    asFB2->AddNode(volTAR142, 4, new TGeoTranslation(0., -dxFB+2.+4.5, -dzFB-3.));
     982             :    //
     983             :    // Fixation block outer
     984             :    //
     985           0 :    thetFB1 = 20./180. * TMath::Pi();
     986           0 :    thetFB2 = 27./180. * TMath::Pi();
     987             : 
     988             :    dxFB = 42.0;
     989             : 
     990           0 :    dx1FB = dxFB/2. - 2. * dzFB * TMath::Tan(thetFB1);
     991           0 :    dx2FB = dxFB/2. - 2. * dzFB * TMath::Tan(thetFB2);
     992             : 
     993           0 :    TGeoArb8* shFB2 = new TGeoArb8(dzFB);
     994           0 :    shFB2->SetVertex(0, -dyFB/2., -dxFB/2.);
     995           0 :    shFB2->SetVertex(1, -dyFB/2.,  dxFB/2.);
     996           0 :    shFB2->SetVertex(2,  dyFB/2.,  dxFB/2.);
     997           0 :    shFB2->SetVertex(3,  dyFB/2., -dxFB/2.);
     998             :    
     999           0 :    shFB2->SetVertex(4, -dyFB/2.,  -dx1FB);
    1000           0 :    shFB2->SetVertex(5, -dyFB/2.,   dx2FB);
    1001           0 :    shFB2->SetVertex(6,  dyFB/2.,   dx2FB);
    1002           0 :    shFB2->SetVertex(7,  dyFB/2.,  -dx1FB);
    1003             : 
    1004           0 :    TGeoVolume* volFB2 = new TGeoVolume("BTRD_FB2", shFB2, kMedAlu);
    1005           0 :    TGeoVolume* volTAR21 = new TGeoVolume("BTRD_TAR21", 
    1006           0 :                                          new TGeoBBox(dyFB/2., dxFB/2., 3.), 
    1007             :                                          kMedAlu);
    1008           0 :    TGeoVolume* volTAR22 = new TGeoVolume("BTRD_TAR22", 
    1009           0 :                                          new TGeoBBox(dyFB/2.-0.25, dxFB/2., 3.-0.5), 
    1010             :                                          kMedAir);
    1011           0 :    volTAR21->AddNode(volTAR22,  1, new TGeoTranslation(-0.25, 0.,  0.0));
    1012             :    // tie anchor
    1013           0 :    TGeoVolume* volTAR23 = new TGeoVolume("BTRD_TAR23", new TGeoBBox(0.3, 40., 3.), kMedAlu); 
    1014             : 
    1015             : 
    1016           0 :    TGeoVolumeAssembly* asFB3 = new TGeoVolumeAssembly("BTRD_FBAS3");
    1017           0 :    TGeoVolumeAssembly* asFB4 = new TGeoVolumeAssembly("BTRD_FBAS4");
    1018           0 :    asFB3->AddNode(volFB2,   1, gGeoIdentity);
    1019           0 :    asFB3->AddNode(volTAR21, 1, new TGeoTranslation(0., 0., -dzFB - 3.));
    1020           0 :    asFB3->AddNode(volTAR23, 1, new TGeoTranslation(-1.36, 0., -dzFB-3.));
    1021           0 :    asFB3->AddNode(volTAR141, 1, new TGeoTranslation(0.,  dxFB-2., -dzFB-3.));
    1022           0 :    asFB3->AddNode(volTAR141, 2, new TGeoTranslation(0., -dxFB+2., -dzFB-3.));
    1023             : 
    1024           0 :    asFB4->AddNode(volFB2,   2, gGeoIdentity);
    1025           0 :    asFB4->AddNode(volTAR21, 2, new TGeoTranslation(0., 0., -dzFB - 3.));
    1026           0 :    asFB4->AddNode(volTAR23, 2, new TGeoTranslation(1.36, 0.5, -dzFB-3.));
    1027           0 :    asFB4->AddNode(volTAR142, 3, new TGeoTranslation(0.,  dxFB-2.+0.5, -dzFB-3.));
    1028           0 :    asFB4->AddNode(volTAR142, 4, new TGeoTranslation(0., -dxFB+2.+0.5, -dzFB-3.));
    1029             : 
    1030             :    Float_t zTA1  = 21.1;
    1031             :    Float_t yFB1  = 87.6;
    1032             :    Float_t yFB2  = 231.4;
    1033           0 :    dx = ((hR - longH/2. + iFrH0 / 2. ) - dext + zTA1) * tan10 -3.9/4.; 
    1034             : 
    1035           0 :    for (Int_t index = 0; index < 11; index++) {
    1036           0 :      Int_t imod = isec_1[index];
    1037           0 :      if (imod !=5)   
    1038           0 :        TVirtualMC::GetMC()->Gspos("BTRD_FBAS2",      index, module[imod],   dx,  -yFB1, zTA1, idrotm[2097] , "ONLY");
    1039             : 
    1040           0 :      if (imod != 13)
    1041           0 :        TVirtualMC::GetMC()->Gspos("BTRD_FBAS1",   11+index, module[imod],  -dx,  -yFB1, zTA1, idrotm[2087] , "ONLY");
    1042             : 
    1043           0 :      if (imod != 5) 
    1044           0 :        TVirtualMC::GetMC()->Gspos("BTRD_FBAS1",   22+index, module[imod],   dx,   yFB1, zTA1, idrotm[2096] , "ONLY");
    1045             : 
    1046           0 :      if (imod != 13)
    1047           0 :        TVirtualMC::GetMC()->Gspos("BTRD_FBAS2",   33+index, module[imod],  -dx,   yFB1, zTA1, idrotm[2086] , "ONLY");
    1048             : 
    1049           0 :      if (imod != 5) 
    1050           0 :        TVirtualMC::GetMC()->Gspos("BTRD_FBAS4",    index, module[imod],   dx,  -yFB2, zTA1, idrotm[2097] , "ONLY");
    1051             : 
    1052           0 :      if (imod !=13)
    1053           0 :        TVirtualMC::GetMC()->Gspos("BTRD_FBAS3",   11+index, module[imod],  -dx,  -yFB2, zTA1, idrotm[2087] , "ONLY");
    1054             : 
    1055           0 :      if (imod != 5)
    1056           0 :        TVirtualMC::GetMC()->Gspos("BTRD_FBAS3",   22+index, module[imod],   dx,   yFB2, zTA1, idrotm[2096] , "ONLY");
    1057             : 
    1058           0 :      if (imod !=13)
    1059           0 :        TVirtualMC::GetMC()->Gspos("BTRD_FBAS4",   33+index, module[imod],  -dx,   yFB2, zTA1, idrotm[2086] , "ONLY");
    1060             :    }
    1061             : 
    1062             : //                                                                                                                                
    1063             : // TOF Support Structures
    1064             : 
    1065             : //                                                                                                                                 
    1066             : // Frame extension rectangular beams
    1067           0 :    lbox[0] = 6;
    1068           0 :    lbox[1] = 3.;
    1069           0 :    lbox[2] = 36.0;
    1070           0 :    TGeoVolume* voBTOFS1 = new TGeoVolume("BTOFS1", new TGeoBBox(lbox), gGeoManager->GetMedium("FRAME_Steel"));
    1071           0 :    lbox[0] = 5.5;
    1072           0 :    lbox[1] = 2.5;
    1073           0 :    lbox[2] = 36.0;
    1074           0 :    TGeoVolume* voBTOFS11 = new TGeoVolume("BTOFS11", new TGeoBBox(lbox), gGeoManager->GetMedium("FRAME_Air"));
    1075           0 :    voBTOFS1->AddNode(voBTOFS11, 1, gGeoIdentity);
    1076             : 
    1077             : //                                                                                                                                 
    1078             : // Frame extension rectangular beams
    1079             : // upper clamps
    1080           0 :    TGeoXtru* shBTOFS2 = new TGeoXtru(2);
    1081           0 :    TGeoXtru* shBTOFS3 = new TGeoXtru(2);
    1082           0 :    TGeoXtru* shBTOFS4 = new TGeoXtru(2);
    1083           0 :    TGeoXtru* shBTOFS5 = new TGeoXtru(2);
    1084             :    
    1085           0 :    Double_t xxtru1[7];
    1086           0 :    Double_t yxtru1[7];
    1087             :    // 1
    1088           0 :    xxtru1[0] =  8.5;
    1089           0 :    yxtru1[0] =  4.5;
    1090             :    // 2
    1091           0 :    xxtru1[1] = -6.0;
    1092           0 :    yxtru1[1] =  4.5;
    1093             :    // 3
    1094           0 :    xxtru1[2] = -8.5;
    1095           0 :    yxtru1[2] =  4.5 - 2.5 * sin10;
    1096             :     // 4
    1097           0 :    xxtru1[3] = 8.5 - 14.5 / cos10;
    1098           0 :    yxtru1[3] = -6. - 14.5 * sin10;
    1099             :     // 5
    1100           0 :    xxtru1[4] = 8.5 - 10.5 / cos10;
    1101           0 :    yxtru1[4] = -6. - 10.5 * sin10;
    1102             :    // 6
    1103           0 :    xxtru1[5] = xxtru1[4] + 8. * sin10;
    1104           0 :    yxtru1[5] = yxtru1[4] - 8./cos10; 
    1105             :    // 7
    1106           0 :    xxtru1[6] =  8.5;
    1107           0 :    yxtru1[6] = -6.0;
    1108             : 
    1109           0 :    Double_t xxtru2[7];
    1110           0 :    for (i = 0; i < 7; i++) xxtru2[i]  = -xxtru1[i];
    1111             : 
    1112           0 :    Double_t xxtru3[5];
    1113           0 :    Double_t yxtru3[5];
    1114           0 :    Double_t xxtru4[5];
    1115           0 :    for (i = 0; i < 4; i++) {
    1116           0 :      xxtru3[i] = xxtru1[i];
    1117           0 :      yxtru3[i] = yxtru1[i];
    1118             :    }
    1119           0 :    xxtru3[4] = xxtru1[6];
    1120           0 :    yxtru3[4] = yxtru1[6];
    1121           0 :    for (i = 0; i < 5; i++) xxtru4[i]  = -xxtru3[i];
    1122             : 
    1123           0 :    shBTOFS2->DefinePolygon(7, xxtru1, yxtru1);
    1124           0 :    shBTOFS2->DefineSection(0, -4.);
    1125           0 :    shBTOFS2->DefineSection(1, +4.);
    1126             : 
    1127           0 :    shBTOFS3->DefinePolygon(7, xxtru2, yxtru1);
    1128           0 :    shBTOFS3->DefineSection(0, -4.);
    1129           0 :    shBTOFS3->DefineSection(1, +4.);
    1130           0 :    TGeoVolume* voBTOFS2 = new TGeoVolume("BTOFS2", shBTOFS2, gGeoManager->GetMedium("FRAME_Steel"));
    1131           0 :    TGeoVolume* voBTOFS3 = new TGeoVolume("BTOFS3", shBTOFS3, gGeoManager->GetMedium("FRAME_Steel"));
    1132             : 
    1133             :    // different fixation for clamps close to web frame
    1134           0 :    shBTOFS4->DefinePolygon(5, xxtru3, yxtru3);
    1135           0 :    shBTOFS4->DefineSection(0, -4.);
    1136           0 :    shBTOFS4->DefineSection(1, +4.);
    1137             : 
    1138           0 :    shBTOFS5->DefinePolygon(5, xxtru4, yxtru3);
    1139           0 :    shBTOFS5->DefineSection(0, -4.);
    1140           0 :    shBTOFS5->DefineSection(1, +4.);
    1141           0 :    TGeoVolume* voBTOFS4 = new TGeoVolume("BTOFS4", shBTOFS4, gGeoManager->GetMedium("FRAME_Steel"));
    1142           0 :    TGeoVolume* voBTOFS5 = new TGeoVolume("BTOFS5", shBTOFS5, gGeoManager->GetMedium("FRAME_Steel"));
    1143             : 
    1144             : 
    1145           0 :    lbox[0] = 5.5;
    1146           0 :    lbox[1] = 2.5;
    1147           0 :    lbox[2] = 4.0;
    1148           0 :    TGeoVolume* voBTOFS21 = new TGeoVolume("BTOFS21", new TGeoBBox(lbox), gGeoManager->GetMedium("FRAME_Air"));
    1149           0 :    voBTOFS2->AddNode(voBTOFS21, 1, gGeoIdentity);
    1150           0 :    voBTOFS3->AddNode(voBTOFS21, 2, gGeoIdentity);
    1151           0 :    voBTOFS4->AddNode(voBTOFS21, 3, gGeoIdentity);
    1152           0 :    voBTOFS5->AddNode(voBTOFS21, 4, gGeoIdentity);
    1153             : 
    1154           0 :    TGeoVolumeAssembly* asTOFS00 = new TGeoVolumeAssembly("BTOFS00");                                                                                   
    1155           0 :    asTOFS00->AddNode(voBTOFS1, 1, gGeoIdentity);
    1156           0 :    asTOFS00->AddNode(voBTOFS2, 1, new TGeoTranslation(0., 0.,  40.));
    1157           0 :    asTOFS00->AddNode(voBTOFS2, 2, new TGeoTranslation(0., 0., -40.));
    1158             : 
    1159           0 :    TGeoVolumeAssembly* asTOFS01 = new TGeoVolumeAssembly("BTOFS01");                                                                                   
    1160           0 :    asTOFS01->AddNode(voBTOFS1, 2, gGeoIdentity);
    1161           0 :    asTOFS01->AddNode(voBTOFS3, 1, new TGeoTranslation(0., 0.,  40.));
    1162           0 :    asTOFS01->AddNode(voBTOFS3, 2, new TGeoTranslation(0., 0., -40.));
    1163             : 
    1164           0 :    TGeoVolumeAssembly* asTOFS02 = new TGeoVolumeAssembly("BTOFS02");
    1165           0 :    asTOFS02->AddNode(voBTOFS1, 3, gGeoIdentity);
    1166           0 :    asTOFS02->AddNode(voBTOFS2, 3, new TGeoTranslation(0., 0., -40.));
    1167           0 :    asTOFS02->AddNode(voBTOFS4, 2, new TGeoTranslation(0., 0.,  40.));
    1168             : 
    1169           0 :    TGeoVolumeAssembly* asTOFS03 = new TGeoVolumeAssembly("BTOFS03");                                                                                   
    1170           0 :    asTOFS03->AddNode(voBTOFS1, 4, gGeoIdentity);
    1171           0 :    asTOFS03->AddNode(voBTOFS3, 3, new TGeoTranslation(0., 0., -40.));
    1172           0 :    asTOFS03->AddNode(voBTOFS5, 2, new TGeoTranslation(0., 0.,  40.));
    1173             : 
    1174             : 
    1175           0 :    asTOFS00->SetVisibility(1);
    1176           0 :    asTOFS01->SetVisibility(1);
    1177             : 
    1178           0 :    for (i = 0; i < 18; i++) {
    1179           0 :      Float_t phi1 = i * 20.;
    1180           0 :      Float_t phi2 = 270. + phi1;
    1181           0 :      rot1 = new TGeoRotation(Form("TOFS_R1_%d", i),  90.0, phi1, 90., phi2, 0., 0.);  
    1182           0 :      dx =  TMath::Sin((phi1+8.95) * kdeg2rad) * (rout2 + 12.);
    1183           0 :      dy = -TMath::Cos((phi1+8.95) * kdeg2rad) * (rout2 + 12.);
    1184           0 :      if ((i >3 && i < 8) || (i > 10 && i < 15)) { 
    1185           0 :        (gGeoManager->GetVolume("B077"))->AddNode(asTOFS03, i,    new TGeoCombiTrans(dx, dy, 345.-53.-0.5, rot1));
    1186             :      } else {
    1187           0 :        (gGeoManager->GetVolume("B077"))->AddNode(asTOFS01, i,    new TGeoCombiTrans(dx, dy, 345.-53.-0.5, rot1));
    1188             :      }
    1189           0 :      dx =  TMath::Sin((phi1-8.95) * kdeg2rad) * (rout2 + 12.);
    1190           0 :      dy = -TMath::Cos((phi1-8.95) * kdeg2rad) * (rout2 + 12.);
    1191           0 :      if ((i >3 && i < 8) || (i > 10 && i <= 15)) { 
    1192           0 :        (gGeoManager->GetVolume("B077"))->AddNode(asTOFS02, i,     new TGeoCombiTrans(dx, dy, 345.-53-0.5, rot1));
    1193             :      } else {
    1194           0 :        (gGeoManager->GetVolume("B077"))->AddNode(asTOFS00, i,     new TGeoCombiTrans(dx, dy, 345.-53-0.5, rot1));
    1195             :      }
    1196             :    }
    1197             : 
    1198             : //
    1199             : // Thermal shield
    1200             : //
    1201             : 
    1202             :   Float_t dyM  =  99.0;
    1203           0 :   MakeHeatScreen("M",   dyM, idrotm[2090], idrotm[2091]);
    1204             :   Float_t dyAM = 119.5;
    1205           0 :   MakeHeatScreen("AM", dyAM, idrotm[2090], idrotm[2091]);
    1206             :   Float_t dyA  = 122.5 - 5.5;
    1207           0 :   MakeHeatScreen("A" ,  dyA, idrotm[2090], idrotm[2091]);
    1208             : 
    1209             : //
    1210             : //
    1211             : //
    1212             :   dz = -57.2 + 0.6;  
    1213           0 :   for (i = 0; i < 18; i++) {
    1214             : 
    1215           0 :       char nameMo[16];
    1216           0 :       snprintf(nameMo, 16, "BSEGMO%d",i);
    1217             :       // M
    1218           0 :       TVirtualMC::GetMC()->Gspos("BTSH_M" , i+1 , nameMo,  0., 0., dz, 0, "ONLY"); 
    1219             :       // AM, CM
    1220           0 :       dy = dymodL[0] + dyAM / 2. + 3.;
    1221           0 :       TVirtualMC::GetMC()->Gspos("BTSH_AM", i+ 1, nameMo, 0.,  dy, dz, 0, "ONLY"); 
    1222           0 :       TVirtualMC::GetMC()->Gspos("BTSH_AM", i+19, nameMo, 0., -dy, dz, 0, "ONLY"); 
    1223             :       // A, C
    1224           0 :       dy = dymodL[1] + dyA / 2 + 0.4;
    1225           0 :       TVirtualMC::GetMC()->Gspos("BTSH_A" , i+ 1, nameMo, 0.,  dy, dz, 0, "ONLY"); 
    1226           0 :       TVirtualMC::GetMC()->Gspos("BTSH_A" , i+19, nameMo, 0., -dy, dz, 0, "ONLY"); 
    1227           0 : }
    1228             :   
    1229             : 
    1230             :   //
    1231             :   // TRD mother volumes
    1232             :   //
    1233             :   // absolute position of center 290.43 + 38.95 = 329.38
    1234             :   // frame center                283.00 + 59.50 = 342.50
    1235             :   // relative position of TRD    329.38 - 342.50
    1236             :   //
    1237             :   // shift wrt v2
    1238             :   //
    1239             :   const Float_t zsh = -0.326;
    1240             :   //
    1241           0 :   ptrd1[0] = 47.4405;   // CBL 28/6/2006
    1242           0 :   ptrd1[1] = 61.1765;   // CBL
    1243           0 :   ptrd1[2] = 375.5;     // CBL
    1244           0 :   ptrd1[3] = 38.95;     // CBL
    1245             :   
    1246           0 :   for (i = 0; i < 18; i++) {
    1247           0 :     char nameCh[16];
    1248           0 :     snprintf(nameCh, 16, "BTRD%d",i);
    1249           0 :     char nameMo[16];
    1250           0 :     snprintf(nameMo, 16, "BSEGMO%d",i);
    1251           0 :     TVirtualMC::GetMC()->Gsvolu(nameCh, "TRD1", kAir, ptrd1, 4);
    1252           0 :     gGeoManager->GetVolume(nameCh)->SetVisibility(kFALSE);
    1253           0 :     TVirtualMC::GetMC()->Gspos(nameCh, 1, nameMo, 0., 0., -12.62 + zsh, 0, "ONLY"); // CBL 28/6/2006
    1254           0 :   }
    1255             : 
    1256             : // 
    1257             : // TOF mother volumes as modified by B.Guerzoni
    1258             : // to remove overlaps/extrusions in case of aligned TOF SMs
    1259             : // 
    1260           0 :   ptrd1[0] = 62.2500; 
    1261           0 :   ptrd1[1] = 64.25; 
    1262           0 :   ptrd1[2] = 372.6; 
    1263           0 :   ptrd1[3] = 14.525/2;
    1264             : 
    1265           0 :   char nameChA[16];
    1266           0 :   snprintf(nameChA, 16, "BTOFA");
    1267           0 :   TGeoTrd1 *trd1=new TGeoTrd1(nameChA,ptrd1[0],ptrd1[1],ptrd1[2],ptrd1[3]);
    1268           0 :   trd1->SetName("BTOFA"); // just to avoid a warning
    1269             : 
    1270           0 :   char nameChB[16];
    1271           0 :   snprintf(nameChB, 16, "BTOFB");
    1272           0 :   TGeoBBox *box1 = new TGeoBBox(nameChB,64.25, 372.6, 1.0);
    1273           0 :   box1->SetName("BTOFB"); // just to avoid a warning
    1274             : 
    1275           0 :   char nameChC[16];
    1276           0 :   snprintf(nameChC, 16, "BTOFC");
    1277           0 :   TGeoBBox *box2 = new TGeoBBox(nameChC,62.25, 372.6, 6.2625);
    1278           0 :   box2->SetName("BTOFC"); // just to avoid a warning
    1279             : 
    1280           0 :   TGeoTranslation *tr1 = new TGeoTranslation("trnsl1",0, 0, -14.525/2 );
    1281           0 :   tr1->RegisterYourself();
    1282           0 :   TGeoTranslation *tr2 = new TGeoTranslation("trnsl2",0, 0, +1.0 );
    1283           0 :   tr2->RegisterYourself();
    1284           0 :   TGeoTranslation *tr3 = new TGeoTranslation("trnsl3",0, 0, 8.2625 );
    1285           0 :   tr3->RegisterYourself();
    1286           0 :   TGeoCompositeShape *btofcs =new TGeoCompositeShape("Btofcs","(BTOFA:trnsl1)+(BTOFB:trnsl2)+(BTOFC:trnsl3)");
    1287           0 :   for (i = 0; i < 18; i++) {
    1288           0 :     char nameCh[16];
    1289           0 :     snprintf(nameCh, 16, "BTOF%d",i);
    1290           0 :     char nameMo[16];
    1291           0 :     snprintf(nameMo, 16, "BSEGMO%d",i);
    1292           0 :     TGeoVolume* btf = new TGeoVolume(nameCh, btofcs, gGeoManager->GetMedium("FRAME_Air"));
    1293           0 :     btf->SetName(nameCh); 
    1294           0 :     gGeoManager->GetVolume(nameCh)->SetVisibility(kFALSE);
    1295           0 :     TVirtualMC::GetMC()->Gspos(nameCh, 1, nameMo, 0., 0., 43.525 + zsh, 0, "ONLY"); 
    1296           0 :   }
    1297             : 
    1298             :   //Create TOF Rail
    1299           0 :   char nameRaV1[16];
    1300           0 :   snprintf(nameRaV1, 16, "RaV1");
    1301           0 :   TGeoBBox *boxRaV1 = new TGeoBBox(nameRaV1, 0.5 ,350.0, 1.5);
    1302           0 :   char nameRaO1[16];
    1303           0 :   snprintf(nameRaO1, 16, "RaO1");
    1304           0 :   TGeoBBox *boxRaO1 = new TGeoBBox(nameRaO1, 1.5 ,350.0, 0.5);
    1305           0 :   TGeoCompositeShape* C1=(TGeoCompositeShape*) CreateTOFRail(45.61);
    1306           0 :   C1->SetName("C1");
    1307           0 :   TGeoCompositeShape* C2=(TGeoCompositeShape*) CreateTOFRail(61.61);
    1308           0 :   C2->SetName("C2");
    1309           0 :   TGeoCompositeShape* C3=(TGeoCompositeShape*) CreateTOFRail(63.11);
    1310           0 :   C3->SetName("C3");
    1311           0 :   TGeoCompositeShape* C4=(TGeoCompositeShape*) CreateTOFRail(61.61);
    1312           0 :   C4->SetName("C4");
    1313           0 :   TGeoCompositeShape* C5=(TGeoCompositeShape*) CreateTOFRail(45.61);
    1314           0 :   C5->SetName("C5");
    1315           0 :   TGeoTranslation *trRaO1 = new TGeoTranslation("trRaO1",1., 0., -2.);
    1316           0 :   trRaO1->RegisterYourself();
    1317           0 :   TGeoTranslation *trC1 = new TGeoTranslation("trC1",-3.39, -286.6, -0.15);
    1318           0 :   trC1->RegisterYourself();
    1319           0 :   TGeoTranslation *trC2 = new TGeoTranslation("trC2",-3.39, -152., -0.15);
    1320           0 :   trC2->RegisterYourself();
    1321           0 :   TGeoTranslation *trC3 = new TGeoTranslation("trC3",-3.39, +8.5, -0.15);
    1322           0 :   trC3->RegisterYourself();
    1323           0 :   TGeoTranslation *trC4 = new TGeoTranslation("trC4",-3.39, +151.8, -0.15);
    1324           0 :   trC4->RegisterYourself();
    1325           0 :   TGeoTranslation *trC5 = new TGeoTranslation("trC5",-3.39, 286.6, -0.15);
    1326           0 :   trC5->RegisterYourself();
    1327             :   
    1328           0 :   TGeoCompositeShape *TOFrail =new TGeoCompositeShape("TOFrail","(RaV1+RaO1:trRaO1)+C1:trC1+C2:trC2+C3:trC3+C4:trC4+C5:trC5");
    1329             :   
    1330           0 :   char nameTR[16];
    1331           0 :   snprintf(nameTR, 16, "VolTOFrail");
    1332           0 :   TGeoVolume* VolTOFrail = new TGeoVolume(nameTR, TOFrail, gGeoManager->GetMedium("FRAME_Aluminum"));
    1333           0 :   VolTOFrail->SetName(nameTR); 
    1334           0 :   gGeoManager->GetVolume(nameTR)->SetVisibility(kTRUE);
    1335           0 :   AliMatrix(idrotm[2102],  90.0,   180.0,  90.0, 270.0,   0.0, 180.0);  
    1336             : 
    1337           0 :   for (i = 0; i < 18; i++) {
    1338           0 :     char nameMo[16];
    1339           0 :     snprintf(nameMo, 16, "BSEGMO%d",i);
    1340           0 :     TVirtualMC::GetMC()->Gspos("VolTOFrail", 2*i,   nameMo, -66.27, 0., +56.33 + zsh, 0, "ONLY");
    1341           0 :     TVirtualMC::GetMC()->Gspos("VolTOFrail", 2*i+1, nameMo,  66.27, 0., +56.33 + zsh, idrotm[2102], "ONLY");
    1342           0 :   }
    1343             : 
    1344             : //
    1345             : //    Geometry of Rails starts here
    1346             : //
    1347             : //
    1348             : //
    1349             : //    Rails for space-frame
    1350             : //
    1351           0 :   Float_t rbox[3];
    1352             : 
    1353           0 :   rbox[0] =  25.00;
    1354           0 :   rbox[1] =  27.50;
    1355           0 :   rbox[2] = 600.00;
    1356           0 :   TVirtualMC::GetMC()->Gsvolu("BRS1", "BOX", kAir, rbox, 3);
    1357             :   
    1358           0 :   rbox[0] =  25.00;
    1359           0 :   rbox[1] =   3.75;
    1360           0 :   TVirtualMC::GetMC()->Gsvolu("BRS2", "BOX", kSteel, rbox, 3);
    1361             :   
    1362           0 :   rbox[0] =   3.00;
    1363           0 :   rbox[1] =  20.00;
    1364           0 :   TVirtualMC::GetMC()->Gsvolu("BRS3", "BOX", kSteel, rbox, 3);
    1365             :   
    1366           0 :   TVirtualMC::GetMC()->Gspos("BRS2", 1, "BRS1", 0., -27.5+3.75, 0., 0, "ONLY");
    1367           0 :   TVirtualMC::GetMC()->Gspos("BRS2", 2, "BRS1", 0.,  27.5-3.75, 0., 0, "ONLY");
    1368           0 :   TVirtualMC::GetMC()->Gspos("BRS3", 1, "BRS1", 0.,         0., 0., 0, "ONLY");
    1369           0 :   TVirtualMC::GetMC()->Gspos("BRS1", 1, "ALIC", -430.-3.,    -190., 0., 0, "ONLY");
    1370           0 :   TVirtualMC::GetMC()->Gspos("BRS1", 2, "ALIC",  430.+3.,    -190., 0., 0, "ONLY");
    1371             : 
    1372           0 :   rbox[0] =    3.0;
    1373           0 :   rbox[1] =  145./4.;
    1374           0 :   rbox[2] =   25.0;
    1375           0 :   TVirtualMC::GetMC()->Gsvolu("BRS4", "BOX", kSteel, rbox, 3);
    1376             : 
    1377           0 :   TVirtualMC::GetMC()->Gspos("BRS4", 1, "ALIC",  430.+3.,    -190.+55./2.+rbox[1],  224., 0, "ONLY");
    1378           0 :   TVirtualMC::GetMC()->Gspos("BRS4", 2, "ALIC",  430.+3.,    -190.+55./2.+rbox[1], -224., 0, "ONLY");
    1379             : 
    1380             :   //
    1381             :   // The Backframe
    1382             :   //
    1383             :   // Inner radius 
    1384             :   Float_t kBFMRin = 270.0;
    1385             :   // Outer Radius
    1386             :   Float_t kBFMRou = 417.5;
    1387             :   // Width
    1388             :   Float_t kBFMdz  = 118.0;
    1389             :   //
    1390             :   //
    1391             :   // Rings
    1392             :   Float_t kBFRdr   =  7.5;
    1393             :   Float_t kBFRdz   =  8.0;
    1394             :   //
    1395             :   //
    1396             :   // Bars and Spokes
    1397             :   //
    1398             :   Float_t kBFBd   =   8.0;
    1399             :   Float_t kBFBdd  =   0.6;
    1400             :   
    1401             : 
    1402             :   // The Mother volume
    1403           0 :   Float_t tpar[3];
    1404           0 :   tpar[0] = kBFMRin;
    1405           0 :   tpar[1] = kBFMRou;
    1406           0 :   tpar[2] = kBFMdz / 2.;
    1407           0 :   TVirtualMC::GetMC()->Gsvolu("BFMO", "TUBE", kAir, tpar, 3);  
    1408             : 
    1409             :   // CBL ////////////////////////////////////////////////////////
    1410             :   //
    1411             :   // TRD mother volume
    1412             :   //
    1413             : 
    1414           0 :   ptrd1[0] = 47.4405 - 0.3;
    1415           0 :   ptrd1[1] = 61.1765 - 0.3;
    1416           0 :   ptrd1[2] = kBFMdz / 2.;
    1417           0 :   ptrd1[3] = 38.95;
    1418           0 :   TVirtualMC::GetMC()->Gsvolu("BFTRD", "TRD1", kAir, ptrd1, 4);
    1419           0 :   gGeoManager->GetVolume("BFTRD")->SetVisibility(kFALSE);
    1420             : 
    1421           0 :   for (i = 0; i < 18; i++) {
    1422             : 
    1423           0 :     Float_t phiBF  = i * 20.0;      
    1424           0 :     dx =  TMath::Sin(phiBF*kdeg2rad)*(342.0-12.62);
    1425           0 :     dy = -TMath::Cos(phiBF*kdeg2rad)*(342.0-12.62);      
    1426           0 :     TVirtualMC::GetMC()->Gspos("BFTRD",i,"BFMO",dx,dy,0.0,idrotm[2034+i],"ONLY");
    1427             : 
    1428             :   }
    1429             : 
    1430             :   // CBL ////////////////////////////////////////////////////////
    1431             :   
    1432             :   // Rings
    1433             :   //
    1434             :   // Inner Ring
    1435           0 :   tpar[0] =  kBFMRin;
    1436           0 :   tpar[1] =  tpar[0] +  kBFRdr;
    1437           0 :   tpar[2] =  kBFRdz / 2.;
    1438             :   
    1439           0 :   TVirtualMC::GetMC()->Gsvolu("BFIR", "TUBE", kSteel, tpar, 3);  
    1440             :   
    1441           0 :   tpar[0] =  tpar[0] +  kBFBdd;
    1442           0 :   tpar[1] =  tpar[1] -  kBFBdd;
    1443           0 :   tpar[2] =  (kBFRdz - 2. * kBFBdd) / 2.;
    1444             : 
    1445           0 :   TVirtualMC::GetMC()->Gsvolu("BFII", "TUBE", kAir, tpar, 3);  
    1446           0 :   TVirtualMC::GetMC()->Gspos("BFII", 1, "BFIR", 0., 0., 0., 0, "ONLY");  
    1447             : 
    1448             :   //
    1449             :   // Outer RING
    1450           0 :   tpar[0] =  kBFMRou - kBFRdr + 0.1;
    1451           0 :   tpar[1] =  kBFMRou;
    1452           0 :   tpar[2] =  kBFRdz / 2.;
    1453             :   
    1454           0 :   TVirtualMC::GetMC()->Gsvolu("BFOR", "TUBE", kSteel, tpar, 3);  
    1455             :   
    1456           0 :   tpar[0] =  tpar[0] +  kBFBdd;
    1457           0 :   tpar[1] =  tpar[1] -  kBFBdd;
    1458           0 :   tpar[2] =  (kBFRdz - 2. * kBFBdd) / 2.;
    1459             : 
    1460           0 :   TVirtualMC::GetMC()->Gsvolu("BFOO", "TUBE", kAir, tpar, 3);  
    1461           0 :   TVirtualMC::GetMC()->Gspos("BFOO", 1, "BFOR", 0., 0., 0., 0, "ONLY");  
    1462             : 
    1463             : 
    1464           0 :   dz = kBFMdz/2. -  kBFRdz / 2.;
    1465           0 :   TVirtualMC::GetMC()->Gspos("BFIR", 1, "BFMO", 0., 0.,  dz, 0, "ONLY");  
    1466           0 :   TVirtualMC::GetMC()->Gspos("BFIR", 2, "BFMO", 0., 0., -dz, 0, "ONLY");  
    1467           0 :   TVirtualMC::GetMC()->Gspos("BFOR", 1, "BFMO", 0., 0.,  dz, 0, "ONLY");  
    1468           0 :   TVirtualMC::GetMC()->Gspos("BFOR", 2, "BFMO", 0., 0., -dz, 0, "ONLY");  
    1469             :   
    1470             :   // 
    1471             :   // Longitudinal Bars
    1472             :   // 
    1473           0 :   Float_t bpar[3];
    1474             :   
    1475           0 :   bpar[0] =  kBFBd/2;
    1476           0 :   bpar[1] =  bpar[0];
    1477           0 :   bpar[2] =  kBFMdz/2.  - kBFBd;
    1478           0 :   TVirtualMC::GetMC()->Gsvolu("BFLB", "BOX ", kSteel, bpar, 3); 
    1479             : 
    1480           0 :   bpar[0] = bpar[0] - kBFBdd;
    1481           0 :   bpar[1] = bpar[1] - kBFBdd;
    1482           0 :   bpar[2] = bpar[2] - kBFBdd;
    1483           0 :   TVirtualMC::GetMC()->Gsvolu("BFLL", "BOX ", kAir, bpar, 3); 
    1484           0 :   TVirtualMC::GetMC()->Gspos("BFLL", 1, "BFLB", 0., 0., 0., 0, "ONLY");  
    1485             : 
    1486           0 :   for (i = 0; i < 18; i++)
    1487             :   {
    1488           0 :       Float_t ro   = kBFMRou - kBFBd / 2. - 0.02;
    1489           0 :       Float_t ri   = kBFMRin + kBFBd / 2.;
    1490             : 
    1491           0 :       Float_t phi0 = Float_t(i) * 20.;
    1492             :       
    1493           0 :       Float_t xb = ri * TMath::Cos(phi0 * kDegrad);
    1494           0 :       Float_t yb = ri * TMath::Sin(phi0 * kDegrad);
    1495           0 :       AliMatrix(idrotm[2090+i],  90.0, phi0,  90.0, phi0 + 270., 0., 0.);
    1496             :       
    1497           0 :       TVirtualMC::GetMC()->Gspos("BFLB", i + 1, "BFMO", xb, yb, 0., idrotm[2090 + i], "ONLY");      
    1498             : 
    1499           0 :       xb = ro * TMath::Cos(phi0 * kDegrad);
    1500           0 :       yb = ro * TMath::Sin(phi0 * kDegrad);
    1501             : 
    1502           0 :       TVirtualMC::GetMC()->Gspos("BFLB", i + 19, "BFMO", xb, yb, 0., idrotm[2090 +i], "ONLY");       
    1503             :  }
    1504             : 
    1505             :   // 
    1506             :   // Radial Bars
    1507             :   // 
    1508           0 :   bpar[0] =  (kBFMRou - kBFMRin - 2. * kBFRdr) / 2.;
    1509           0 :   bpar[1] =  kBFBd/2;
    1510           0 :   bpar[2] =  bpar[1];
    1511             :   //
    1512             :   // Avoid overlap with circle
    1513             :   Float_t rr    = kBFMRou - kBFRdr;
    1514           0 :   Float_t delta = rr - TMath::Sqrt(rr * rr - kBFBd * kBFBd / 4.) + 0.01;
    1515           0 :   bpar[0] -= delta /2.;
    1516             :   
    1517             : 
    1518           0 :   TVirtualMC::GetMC()->Gsvolu("BFRB", "BOX ", kSteel, bpar, 3); 
    1519             : 
    1520           0 :   bpar[0] = bpar[0] - kBFBdd;
    1521           0 :   bpar[1] = bpar[1] - kBFBdd;
    1522           0 :   bpar[2] = bpar[2] - kBFBdd;
    1523           0 :   TVirtualMC::GetMC()->Gsvolu("BFRR", "BOX ", kAir, bpar, 3); 
    1524           0 :   TVirtualMC::GetMC()->Gspos("BFRR", 1, "BFRB", 0., 0., 0., 0, "ONLY");  
    1525             : 
    1526           0 :   Int_t iphi[10] = {0, 1, 3, 6, 8, 9, 10, 12, 15, 17};
    1527             :   
    1528           0 :   for (i = 0; i < 10; i++)
    1529             :   {
    1530             :       
    1531           0 :       Float_t rb   = (kBFMRin + kBFMRou)/2.;
    1532           0 :       Float_t phib = Float_t(iphi[i]) * 20.;
    1533             :       
    1534           0 :       Float_t xb = rb * TMath::Cos(phib * kDegrad);
    1535           0 :       Float_t yb = rb * TMath::Sin(phib * kDegrad);
    1536             :       
    1537           0 :       TVirtualMC::GetMC()->Gspos("BFRB", i + 1,  "BFMO", xb, yb,  dz, idrotm[2034 + iphi[i]], "ONLY");      
    1538           0 :       TVirtualMC::GetMC()->Gspos("BFRB", i + 11, "BFMO", xb, yb, -dz, idrotm[2034 + iphi[i]], "ONLY");      
    1539             : 
    1540             :  }
    1541             : 
    1542           0 :   TVirtualMC::GetMC()->Gspos("BFMO", i + 19, "ALIC", 0, 0, - 376. - kBFMdz/2. - 0.5 , 0, "ONLY");       
    1543             : 
    1544             : 
    1545             : 
    1546             : //
    1547             : //
    1548             : //  The Baby Frame
    1549             : //
    1550             : //
    1551             :   //
    1552             :   // Inner radius 
    1553             :   Float_t kBBMRin = 278.0;
    1554             :   // Outer Radius
    1555             :   Float_t kBBMRou = 410.5;
    1556             :   // Width
    1557             :   Float_t kBBMdz  = 223.0;
    1558             :   Float_t kBBBdz  = 6.0;
    1559             :   Float_t kBBBdd  = 0.6;
    1560             : 
    1561             :   
    1562             :   // The Mother volume
    1563             : 
    1564           0 :   ppgon[0] =   0.;
    1565           0 :   ppgon[1] = 360.;
    1566           0 :   ppgon[2] =  18.;
    1567             :   
    1568           0 :   ppgon[3] =   2.;
    1569           0 :   ppgon[4] = -kBBMdz / 2. ;
    1570           0 :   ppgon[5] =  kBBMRin;
    1571           0 :   ppgon[6] =  kBBMRou;
    1572             :   
    1573           0 :   ppgon[7] =  -ppgon[4]; 
    1574           0 :   ppgon[8] =   ppgon[5];
    1575           0 :   ppgon[9] =   ppgon[6];
    1576             : 
    1577           0 :   TVirtualMC::GetMC()->Gsvolu("BBMO", "PGON", kAir, ppgon, 10);
    1578           0 :   TVirtualMC::GetMC()->Gsdvn("BBCE", "BBMO", 18, 2);
    1579             : 
    1580             :   // CBL ////////////////////////////////////////////////////////
    1581             :   //
    1582             :   // TRD mother volume
    1583             :   //
    1584             : 
    1585           0 :   AliMatrix(idrotm[2092],  90.0,  90.0,   0.0,   0.0,   90.0,  0.0);
    1586             : 
    1587           0 :   ptrd1[0] = 47.4405 - 2.5;
    1588           0 :   ptrd1[1] = 61.1765 - 2.5;
    1589           0 :   ptrd1[2] = kBBMdz / 2.;
    1590           0 :   ptrd1[3] = 38.95;
    1591           0 :   TVirtualMC::GetMC()->Gsvolu("BBTRD", "TRD1", kAir, ptrd1, 4);
    1592           0 :   gGeoManager->GetVolume("BBTRD")->SetVisibility(kFALSE);
    1593           0 :   TVirtualMC::GetMC()->Gspos("BBTRD", 1, "BBCE", 342.0-12.62, 0.0, 0.0, idrotm[2092], "ONLY");
    1594             : 
    1595             :   // CBL ////////////////////////////////////////////////////////
    1596             : 
    1597             :   // Longitudinal bars
    1598           0 :   bpar[0] =  kBBBdz/2.;
    1599           0 :   bpar[1] =  bpar[0];
    1600           0 :   bpar[2] =  kBBMdz/2.  - kBBBdz;
    1601           0 :   TVirtualMC::GetMC()->Gsvolu("BBLB", "BOX ", kSteel, bpar, 3); 
    1602           0 :   bpar[0] -= kBBBdd;
    1603           0 :   bpar[1] -= kBBBdd;
    1604           0 :   bpar[2] -= kBBBdd;
    1605           0 :   TVirtualMC::GetMC()->Gsvolu("BBLL", "BOX ", kAir, bpar, 3); 
    1606           0 :   TVirtualMC::GetMC()->Gspos("BBLL", 1, "BBLB", 0., 0., 0., 0, "ONLY"); 
    1607             : 
    1608           0 :   dx = kBBMRin + kBBBdz/2. + (bpar[1] + kBBBdd) * TMath::Sin(10. * kDegrad);
    1609           0 :   dy = dx * TMath::Tan(10. * kDegrad) - kBBBdz/2./TMath::Cos(10. * kDegrad);
    1610           0 :   TVirtualMC::GetMC()->Gspos("BBLB", 1, "BBCE", dx, dy, 0., idrotm[2052], "ONLY"); 
    1611             : 
    1612           0 :   dx = kBBMRou - kBBBdz/2. - (bpar[1] + kBBBdd) * TMath::Sin(10. * kDegrad);
    1613           0 :   dy = dx * TMath::Tan(10. * kDegrad) - kBBBdz/2./TMath::Cos(10. * kDegrad);
    1614             :  
    1615           0 :   TVirtualMC::GetMC()->Gspos("BBLB", 2, "BBCE", dx, dy, 0., idrotm[2052], "ONLY");  
    1616             : 
    1617             :   // 
    1618             :   // Radial Bars
    1619             :   // 
    1620           0 :   bpar[0] =  (kBBMRou - kBBMRin) / 2. - kBBBdz;
    1621           0 :   bpar[1] =  kBBBdz/2;
    1622           0 :   bpar[2] =  bpar[1];
    1623             : 
    1624           0 :   TVirtualMC::GetMC()->Gsvolu("BBRB", "BOX ", kSteel, bpar, 3); 
    1625           0 :   bpar[0] -= kBBBdd;
    1626           0 :   bpar[1] -= kBBBdd;
    1627           0 :   bpar[2] -= kBBBdd;
    1628           0 :   TVirtualMC::GetMC()->Gsvolu("BBRR", "BOX ", kAir, bpar, 3); 
    1629           0 :   TVirtualMC::GetMC()->Gspos("BBRR", 1, "BBRB", 0., 0., 0., 0, "ONLY"); 
    1630             : 
    1631             : 
    1632           0 :   dx = (kBBMRou + kBBMRin) / 2.;
    1633           0 :   dy = ((kBBMRou + kBBMRin)/ 2) *  TMath::Tan(10 * kDegrad) - kBBBdz / 2./ TMath::Cos(10 * kDegrad);
    1634           0 :   dz = kBBMdz/2. -  kBBBdz / 2.;
    1635             : 
    1636           0 :   TVirtualMC::GetMC()->Gspos("BBRB", 1, "BBCE", dx, dy,   dz, idrotm[2052], "ONLY");  
    1637           0 :   TVirtualMC::GetMC()->Gspos("BBRB", 2, "BBCE", dx, dy, - dz, idrotm[2052], "ONLY");  
    1638           0 :   TVirtualMC::GetMC()->Gspos("BBRB", 3, "BBCE", dx, dy,   0., idrotm[2052], "ONLY");  
    1639             :  
    1640             :  //
    1641             :  // Circular bars 
    1642             :  //
    1643             :  //  Inner
    1644             :   
    1645           0 :   bpar[1] =  kBBMRin * TMath::Sin(10. * kDegrad);
    1646           0 :   bpar[0] =  kBBBdz/2;
    1647           0 :   bpar[2] =  bpar[0];
    1648           0 :   TVirtualMC::GetMC()->Gsvolu("BBC1", "BOX ", kSteel, bpar, 3); 
    1649           0 :   bpar[0] -= kBBBdd;
    1650           0 :   bpar[1] -= kBBBdd;
    1651           0 :   bpar[2] -= kBBBdd;
    1652           0 :   TVirtualMC::GetMC()->Gsvolu("BBC2", "BOX ", kAir, bpar, 3); 
    1653           0 :   TVirtualMC::GetMC()->Gspos("BBC2", 1, "BBC1", 0., 0., 0., 0, "ONLY"); 
    1654           0 :   dx = kBBMRin + kBBBdz/2;
    1655             :   dy = 0.;
    1656           0 :   TVirtualMC::GetMC()->Gspos("BBC1", 1, "BBCE", dx, dy,   dz, 0, "ONLY");  
    1657           0 :   TVirtualMC::GetMC()->Gspos("BBC1", 2, "BBCE", dx, dy,  -dz, 0, "ONLY");  
    1658             :   //
    1659             :   // Outer
    1660           0 :   bpar[1] =  (kBBMRou - kBBBdz) * TMath::Sin(10. * kDegrad);
    1661           0 :   bpar[0] =  kBBBdz/2;
    1662           0 :   bpar[2] =  bpar[0];
    1663           0 :   TVirtualMC::GetMC()->Gsvolu("BBC3", "BOX ", kSteel, bpar, 3); 
    1664           0 :   bpar[0] -= kBBBdd;
    1665           0 :   bpar[1] -= kBBBdd;
    1666           0 :   bpar[2] -= kBBBdd;
    1667           0 :   TVirtualMC::GetMC()->Gsvolu("BBC4", "BOX ", kAir, bpar, 3); 
    1668           0 :   TVirtualMC::GetMC()->Gspos("BBC4", 1, "BBC3", 0., 0., 0., 0, "ONLY"); 
    1669           0 :   dx = kBBMRou - kBBBdz/2;
    1670             :   dy = 0.;
    1671           0 :   TVirtualMC::GetMC()->Gspos("BBC3", 1, "BBCE", dx, dy,   dz, 0, "ONLY");  
    1672           0 :   TVirtualMC::GetMC()->Gspos("BBC3", 2, "BBCE", dx, dy, - dz, 0, "ONLY");
    1673             :   //
    1674             :   // Diagonal Bars
    1675             :   //
    1676             :   h  = (kBBMRou - kBBMRin - 2. * kBBBdz);;
    1677             :   d  = kBBBdz;
    1678           0 :   dz = kBBMdz/2. - 1.6 * kBBBdz;
    1679           0 :   dq = h*h+dz*dz;
    1680             : 
    1681           0 :   x  =  TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
    1682             :   
    1683             : 
    1684           0 :   theta = kRaddeg * TMath::ACos(x);
    1685             :   
    1686           0 :   ptrap[0]  = dz/2.;
    1687           0 :   ptrap[1]  = theta;
    1688           0 :   ptrap[2]  =  0.;
    1689           0 :   ptrap[3]  =  d/2;
    1690           0 :   ptrap[4]  =  d/x/2;
    1691           0 :   ptrap[5]  = ptrap[4];
    1692           0 :   ptrap[6]  = 0;
    1693           0 :   ptrap[7]  = ptrap[3];
    1694           0 :   ptrap[8]  = ptrap[4];
    1695           0 :   ptrap[9]  = ptrap[4];
    1696           0 :   ptrap[10] = 0;
    1697           0 :   TVirtualMC::GetMC()->Gsvolu("BBD1", "TRAP", kSteel, ptrap, 11);
    1698           0 :   ptrap[3]  =  d/2-kBBBdd;
    1699           0 :   ptrap[4]  = (d/2-kBBBdd)/x;
    1700           0 :   ptrap[5]  = ptrap[4];
    1701           0 :   ptrap[7]  = ptrap[3];
    1702           0 :   ptrap[8]  = ptrap[4];
    1703           0 :   ptrap[9]  = ptrap[4];
    1704           0 :   TVirtualMC::GetMC()->Gsvolu("BBD3", "TRAP", kAir, ptrap, 11);
    1705           0 :   TVirtualMC::GetMC()->Gspos("BBD3", 1, "BBD1", 0.0, 0.0, 0., 0, "ONLY");
    1706             :   dx = (kBBMRou + kBBMRin) / 2.;
    1707           0 :   dy = ((kBBMRou + kBBMRin)/ 2) *  TMath::Tan(10 * kDegrad) - kBBBdz / 2./ TMath::Cos(10 * kDegrad);
    1708           0 :   TVirtualMC::GetMC()->Gspos("BBD1", 1, "BBCE", dx, dy,   dz/2. + kBBBdz/2., idrotm[2052], "ONLY");  
    1709             : 
    1710             : 
    1711           0 :   ptrap[0]  = dz/2.;
    1712           0 :   ptrap[1]  = -theta;
    1713           0 :   ptrap[2]  =  0.;
    1714           0 :   ptrap[3]  =  d/2;
    1715           0 :   ptrap[4]  =  d/2/x;
    1716           0 :   ptrap[5]  = ptrap[4];
    1717           0 :   ptrap[6]  = 0;
    1718           0 :   ptrap[7]  = ptrap[3];
    1719           0 :   ptrap[8]  = ptrap[4];
    1720           0 :   ptrap[9]  = ptrap[4];
    1721           0 :   ptrap[10] = 0;
    1722           0 :   TVirtualMC::GetMC()->Gsvolu("BBD2", "TRAP", kSteel, ptrap, 11);
    1723           0 :   ptrap[3]  = d/2-kBBBdd;
    1724           0 :   ptrap[4]  = (d/2-kBBBdd)/x;
    1725           0 :   ptrap[5]  = ptrap[4];
    1726           0 :   ptrap[7]  = ptrap[3];
    1727           0 :   ptrap[8]  = ptrap[4];
    1728           0 :   ptrap[9]  = ptrap[4];
    1729           0 :   TVirtualMC::GetMC()->Gsvolu("BBD4", "TRAP", kAir, ptrap, 11);
    1730           0 :   TVirtualMC::GetMC()->Gspos("BBD4", 1, "BBD2", 0.0, 0.0, 0., 0, "ONLY");
    1731             :   dx = (kBBMRou + kBBMRin) / 2.;
    1732           0 :   dy = ((kBBMRou + kBBMRin)/ 2) *  TMath::Tan(10 * kDegrad) - kBBBdz / 2./ TMath::Cos(10 * kDegrad);
    1733           0 :   TVirtualMC::GetMC()->Gspos("BBD2", 1, "BBCE", dx, dy,   -dz/2. - kBBBdz/2., idrotm[2052], "ONLY");  
    1734             : 
    1735             : 
    1736           0 :   TVirtualMC::GetMC()->Gspos("BBMO", 1, "ALIC", 0., 0., + 376. + kBBMdz / 2. + 0.5, 0, "ONLY");  
    1737             : 
    1738             : 
    1739           0 : }
    1740             : 
    1741             : //___________________________________________
    1742             : void AliFRAMEv3::AddAlignableVolumes() const
    1743             : {
    1744             :   // Add the 18 spaceframe sectors as alignable volumes
    1745           0 :   TString basesymname("FRAME/Sector");
    1746           0 :   TString basevolpath("ALIC_1/B077_1/BSEGMO");
    1747           0 :   TString symname;
    1748           0 :   TString volpath;
    1749             :   
    1750           0 :   for(Int_t sec=0; sec<18; sec++)
    1751             :   {
    1752           0 :       symname = basesymname;
    1753           0 :       symname += sec;
    1754           0 :       volpath = basevolpath;
    1755           0 :       volpath += sec;
    1756           0 :       volpath += "_1";
    1757           0 :       if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data()))
    1758           0 :         AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",
    1759             :               symname.Data(),volpath.Data()));
    1760             :   }
    1761           0 : }
    1762             : 
    1763             : //___________________________________________
    1764             : void AliFRAMEv3::CreateMaterials()
    1765             : {
    1766             :   // Creates the materials
    1767             :   Float_t epsil, stemax, tmaxfd, deemax, stmin;
    1768             :   
    1769             :   epsil  = 1.e-4;     // Tracking precision, 
    1770             :   stemax = -0.01;     // Maximum displacement for multiple scat 
    1771             :   tmaxfd = -20.;      // Maximum angle due to field deflection 
    1772             :   deemax = -.3;       // Maximum fractional energy loss, DLS 
    1773             :   stmin  = -.8;
    1774           0 :   Int_t   isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();
    1775           0 :   Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();
    1776             : 
    1777             : 
    1778           0 :   Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
    1779           0 :   Float_t zsteel[4] = { 26.,24.,28.,14. };
    1780           0 :   Float_t wsteel[4] = { .715,.18,.1,.005 };
    1781             :   
    1782             :   //Air
    1783             :   
    1784           0 :   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
    1785           0 :   Float_t zAir[4]={6.,7.,8.,18.};
    1786           0 :   Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
    1787             :   Float_t dAir = 1.20479E-3;
    1788             : 
    1789             :   // G10 
    1790             :   // G10 60% SiO2 40% epoxy
    1791           0 :   Float_t ag10[4]= {12.01, 1., 15.994, 28.086};
    1792           0 :   Float_t zg10[4] = { 6.,   1.,  8.,    14.};
    1793           0 :   Float_t wg10[4] = {0.194, 0.023, 0.443, 0.340};
    1794             : 
    1795             : 
    1796           0 :   AliMixture(22, "G10", ag10, zg10, 1.7 , 4, wg10);
    1797             : 
    1798           0 :   AliMixture(65, "STEEL$", asteel, zsteel, 7.88, 4, wsteel);
    1799           0 :   AliMixture(5,  "AIR$      ", aAir, zAir, dAir,4, wAir);
    1800           0 :   AliMaterial(9, "ALU      ", 26.98, 13., 2.7, 8.9, 37.2);
    1801             : 
    1802           0 :   AliMedium(65, "Steel", 65, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
    1803           0 :   AliMedium( 5, "Air", 5, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
    1804           0 :   AliMedium( 9, "Aluminum", 9, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
    1805           0 :   AliMedium(22, "G10", 22, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
    1806             : 
    1807           0 : }
    1808             : 
    1809             : //_____________________________________________________________________________
    1810             : void AliFRAMEv3::Init()
    1811             : {
    1812             :   //
    1813             :   // Initialise the module after the geometry has been defined
    1814             :   //
    1815           0 :     if(AliLog::GetGlobalDebugLevel()>0) {
    1816           0 :         printf("%s: **************************************"
    1817             :                " FRAME "
    1818           0 :                "**************************************\n",ClassName());
    1819           0 :         printf("\n%s:      Version 2 of FRAME initialised, symmetric FRAME\n\n",ClassName());
    1820           0 :         printf("%s: **************************************"
    1821             :                " FRAME "
    1822           0 :                "**************************************\n",ClassName());
    1823           0 :     }
    1824             : //
    1825             : // The reference volume id
    1826           0 :     fRefVolumeId1 = TVirtualMC::GetMC()->VolId("BREF1");
    1827           0 :     fRefVolumeId2 = TVirtualMC::GetMC()->VolId("BREF2");
    1828           0 : }
    1829             : 
    1830             : Int_t AliFRAMEv3::IsVersion() const 
    1831             : {
    1832             :   // Returns the version of the FRAME (1 if no holes, 0 otherwise) 
    1833             :     Int_t version = 0;
    1834           0 :     if (fHoles == 0) version = 1;
    1835           0 :     return version;
    1836             : }
    1837             : 
    1838             : void AliFRAMEv3::StepManager()
    1839             : {
    1840             : //
    1841             : // Stepmanager of AliFRAMEv3.cxx
    1842             : // Used for recording of reference tracks entering the spaceframe mother volume
    1843             : //
    1844           0 :   Int_t   copy, id;
    1845             :   
    1846             :   //
    1847             :   // Only charged tracks
    1848           0 :   if( !(TVirtualMC::GetMC()->TrackCharge()) ) return; 
    1849             :   //
    1850             :   // Only tracks entering mother volume
    1851             :   // 
    1852             : 
    1853           0 :   id=TVirtualMC::GetMC()->CurrentVolID(copy);
    1854             : 
    1855           0 :   if ((id != fRefVolumeId1) && (id != fRefVolumeId2))  return;
    1856           0 :   if(!TVirtualMC::GetMC()->IsTrackEntering()) return;
    1857             :   //
    1858             :   // Add the reference track
    1859             :   //
    1860           0 :   AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kFRAME);
    1861           0 : }
    1862             : 
    1863             :   
    1864             : 
    1865             : void AliFRAMEv3::MakeHeatScreen(const char* name, Float_t dyP, Int_t rot1, Int_t rot2)
    1866             : {
    1867             :     // Heat screen panel
    1868             :     //
    1869           0 :     Int_t *idtmed = fIdtmed->GetArray()-1999;
    1870           0 :     const Int_t kAir   = idtmed[2004];
    1871           0 :     const Int_t kAlu   = idtmed[2008];
    1872             : 
    1873             :     Float_t dx, dy;
    1874           0 :     char mname[16];
    1875           0 :     char cname [16];
    1876           0 :     char t1name[16];
    1877           0 :     char t2name[16];
    1878           0 :     char t3name[16];
    1879           0 :     char t4name[16];
    1880           0 :     char t5name[16];
    1881             :     
    1882             :     // 
    1883           0 :     Float_t dxP =  2. * (287. * TMath::Sin(10.* TMath::Pi()/180.) - 2.);
    1884             :     Float_t dzP =  1.05;
    1885             :     //
    1886             :     // Mother volume
    1887           0 :     Float_t thshM[3];
    1888           0 :     thshM[0]  =  dxP / 2.;
    1889           0 :     thshM[1]  =  dyP / 2.;
    1890           0 :     thshM[2]  =  dzP / 2.;
    1891           0 :     snprintf(mname, 16, "BTSH_%s", name);
    1892           0 :     TVirtualMC::GetMC()->Gsvolu(mname,  "BOX ", kAir, thshM,  3);
    1893             :     //
    1894             :     // Aluminum sheet
    1895           0 :     thshM[2] = 0.025;
    1896           0 :     snprintf(cname, 16, "BTSHA_%s", name);
    1897           0 :     TVirtualMC::GetMC()->Gsvolu(cname, "BOX ", kAlu, thshM,  3);
    1898           0 :     TVirtualMC::GetMC()->Gspos(cname, 1, mname, 0., 0., -0.5, 0);
    1899             :     //
    1900             :     // Tubes
    1901           0 :     Float_t thshT[3];
    1902           0 :     thshT[0] = 0.4;
    1903           0 :     thshT[1] = 0.5;
    1904           0 :     thshT[2] = (dyP / 2. - 8.);
    1905             :     //
    1906           0 :     snprintf(t1name, 16, "BTSHT1_%s", name);
    1907           0 :     TVirtualMC::GetMC()->Gsvolu(t1name,  "TUBE", kAlu, thshT,  3);
    1908           0 :     dx = - dxP / 2. + 8. - 0.5;
    1909           0 :     TVirtualMC::GetMC()->Gspos(t1name, 1, mname,  dx, 0., 0.025, rot1);
    1910             :     //
    1911           0 :     snprintf(t2name, 16, "BTSHT2_%s", name);
    1912           0 :     snprintf(t3name, 16, "BTSHT3_%s", name);
    1913           0 :     snprintf(t4name, 16, "BTSHT4_%s", name);
    1914           0 :     snprintf(t5name, 16, "BTSHT5_%s", name);
    1915           0 :     thshT[2] = (thshM[1] - 12.);
    1916           0 :     TVirtualMC::GetMC()->Gsvolu(t2name,  "TUBE", kAlu, thshT,  3);
    1917           0 :     thshT[2] = 7.9/2.;
    1918           0 :     TVirtualMC::GetMC()->Gsvolu(t3name,  "TUBE", kAlu, thshT,  3);
    1919           0 :     thshT[2] = 23.9/2.;
    1920           0 :     TVirtualMC::GetMC()->Gsvolu(t4name,  "TUBE", kAlu, thshT,  3);
    1921             : 
    1922             :     Int_t sig = 1;
    1923             :     Int_t ipo = 1;
    1924           0 :     for (Int_t i = 0; i < 5; i++) {
    1925           0 :         sig *= -1;
    1926           0 :         dx += 8.00;
    1927           0 :         dy = 4. * sig;
    1928           0 :         Float_t dy1 =  - (thshM[1] - 15.5) * sig;
    1929           0 :         Float_t dy2 =  - (thshM[1] -  7.5) * sig;
    1930             :         
    1931           0 :         TVirtualMC::GetMC()->Gspos(t2name, ipo++, mname, dx, dy, 0.025, rot1);
    1932           0 :         dx += 6.9;
    1933           0 :         TVirtualMC::GetMC()->Gspos(t2name, ipo++, mname, dx, dy, 0.025, rot1);      
    1934             :         
    1935           0 :         TVirtualMC::GetMC()->Gspos(t3name, i+1,   mname, dx - 3.45, dy1, 0.025, rot2);      
    1936           0 :         TVirtualMC::GetMC()->Gspos(t4name, i+1,   mname, dx - 3.45, dy2, 0.025, rot2);      
    1937             :     }
    1938           0 :     dx += 8.;
    1939           0 :     TVirtualMC::GetMC()->Gspos(t1name, 2, mname, dx, 0., 0.025, rot1);
    1940           0 :     TVirtualMC::GetMC()->Gspos(t3name, 6,   mname, dx - 3.45, -(thshM[1] - 7.5), 0.025, rot2);      
    1941           0 : }
    1942             : 
    1943             : 
    1944             : 
    1945             : void AliFRAMEv3::WebFrame(const char* name, Float_t dHz, Float_t theta0, Float_t phi0)
    1946             : {
    1947             :     //
    1948             :     // Create a web frame element
    1949             :     //
    1950             :     phi0 =  0.;
    1951           0 :     Int_t *idtmed = fIdtmed->GetArray()-1999;
    1952           0 :     const Float_t krad2deg = 180. / TMath::Pi();
    1953           0 :     const Float_t kdeg2rad = 1. / krad2deg;
    1954           0 :     const Int_t   kAir   = idtmed[2004];
    1955           0 :     const Int_t   kSteel = idtmed[2064];
    1956             : 
    1957           0 :     Float_t ptrap[11];
    1958           0 :     char nameA[16];
    1959           0 :     snprintf(nameA, 16, "%sA", name );
    1960             : 
    1961           0 :     char nameI[16];
    1962           0 :     snprintf(nameI, 16, "%sI", name );
    1963             : 
    1964           0 :     theta0 *= kdeg2rad;
    1965           0 :     phi0   *= kdeg2rad;
    1966             :     //    Float_t theta   = TMath::ATan(TMath::Tan(theta0)/TMath::Sin(phi0));
    1967           0 :     Float_t theta = TMath::Pi()/2.;
    1968           0 :     Float_t phi     = TMath::ACos(TMath::Cos(theta0) * TMath::Cos(phi0));
    1969             : 
    1970           0 :     if (phi0 < 0) phi = -phi;
    1971             : 
    1972           0 :     phi   *= krad2deg;
    1973           0 :     theta *= krad2deg;
    1974             :     
    1975           0 :     ptrap[0]  = dHz/2;
    1976           0 :     ptrap[2]  = theta;
    1977           0 :     ptrap[1]  = phi;
    1978           0 :     ptrap[3]  = 6./cos(theta0 * kdeg2rad)/2.;
    1979           0 :     ptrap[4]  = 1.;
    1980           0 :     ptrap[5]  = ptrap[4];
    1981           0 :     ptrap[6]  = 0;
    1982           0 :     ptrap[7]  = ptrap[3];
    1983           0 :     ptrap[8]  = ptrap[4];
    1984           0 :     ptrap[9]  = ptrap[4];
    1985           0 :     ptrap[10] = 0;
    1986           0 :     TVirtualMC::GetMC()->Gsvolu(name,  "TRAP", kSteel, ptrap, 11);
    1987           0 :     TVirtualMC::GetMC()->Gsvolu(nameI, "TRAP", kSteel, ptrap, 11);
    1988           0 :     ptrap[3]  =  (6. - 1.)/cos(theta0 * kdeg2rad)/2.;
    1989           0 :     ptrap[4]  =  0.75;
    1990           0 :     ptrap[5]  = ptrap[4];
    1991           0 :     ptrap[7]  = ptrap[3];
    1992           0 :     ptrap[8]  = ptrap[4];
    1993           0 :     ptrap[9]  = ptrap[4];
    1994             :     
    1995           0 :     TVirtualMC::GetMC()->Gsvolu(nameA, "TRAP", kAir, ptrap, 11);
    1996           0 :     TVirtualMC::GetMC()->Gspos(nameA, 1, name,  -0.25, 0.0, 0., 0, "ONLY");
    1997           0 :     TVirtualMC::GetMC()->Gspos(nameA, 2, nameI, +0.25, 0.0, 0., 0, "ONLY");
    1998           0 :     gGeoManager->GetVolume(name)->SetVisContainers();;
    1999           0 :     gGeoManager->GetVolume(nameI)->SetVisContainers();;
    2000           0 : }
    2001             : 
    2002             : TGeoCompositeShape* AliFRAMEv3::CreateTOFRail (Float_t y)
    2003             : {
    2004           0 :    char nameSostA1[16];
    2005           0 :    snprintf(nameSostA1, 16, "SostA1");
    2006           0 :    TGeoBBox *boxSostA1 = new TGeoBBox(nameSostA1, 0.5, y, 2.0);
    2007           0 :    char nameCV[16];
    2008           0 :    snprintf(nameCV, 16, "CV");
    2009           0 :    TGeoArb8 *CV = new TGeoArb8(nameCV, 2.35);
    2010           0 :    CV->SetVertex(0, 0.89, -y);
    2011           0 :    CV->SetVertex(1, 0.89, y);
    2012           0 :    CV->SetVertex(2, 0.09, y);
    2013           0 :    CV->SetVertex(3, 0.09, -y);
    2014           0 :    CV->SetVertex(4, -0.09, -y);
    2015           0 :    CV->SetVertex(5, -0.09, y);
    2016           0 :    CV->SetVertex(6, -0.89, y);
    2017           0 :    CV->SetVertex(7, -0.89, -y);
    2018           0 :    char nameCOB[16];
    2019           0 :    snprintf(nameCOB, 16, "COB");
    2020           0 :    TGeoBBox *boxCOB = new TGeoBBox(nameCOB, 2.0, y, 0.4);
    2021           0 :    char nameCOT[16];
    2022           0 :    snprintf(nameCOT, 16, "COT");
    2023           0 :    TGeoBBox *boxCOT = new TGeoBBox(nameCOT, 1.7, y, 0.4);
    2024             : 
    2025             : 
    2026           0 :    TGeoTranslation *trCOB = new TGeoTranslation("trCOB",2.09, 0., -2.75 );
    2027           0 :    trCOB->RegisterYourself();
    2028           0 :    TGeoTranslation *trCOT = new TGeoTranslation("trCOT",0.81, 0., +2.75 );
    2029           0 :    trCOT->RegisterYourself();
    2030           0 :    TGeoTranslation *trSostA1 = new TGeoTranslation("trSostA1", 2.39, 0., -0.35 );
    2031           0 :    trSostA1->RegisterYourself();
    2032             : 
    2033           0 :    TGeoCompositeShape *btofS1 =new TGeoCompositeShape("BtofS1","CV+(COB:trCOB)+(COT:trCOT)+(SostA1:trSostA1)");
    2034           0 :    return btofS1;
    2035             : 
    2036           0 : }

Generated by: LCOV version 1.11