LCOV - code coverage report
Current view: top level - STRUCT - AliFRAMEv2.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 853 860 99.2 %
Date: 2016-06-14 17:26:59 Functions: 13 13 100.0 %

          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             : //  AliFRAMEv2.cxx
      20             : //  symmetric space frame with possibility for holes
      21             : //  Author: A.Morsch
      22             : //------------------------------------------------------------------------
      23             : 
      24             : #include <TGeoBBox.h>
      25             : #include <TGeoCompositeShape.h>
      26             : #include <TGeoGlobalMagField.h>
      27             : #include <TGeoManager.h>
      28             : #include <TGeoMatrix.h>
      29             : #include <TGeoPgon.h>
      30             : #include <TString.h>
      31             : #include <TSystem.h>
      32             : #include <TVirtualMC.h>
      33             : 
      34             : #include "AliFRAMEv2.h"
      35             : #include "AliMagF.h"
      36             : #include "AliRun.h"
      37             : #include "AliConst.h"
      38             : #include "AliMC.h"
      39             : #include "AliLog.h"
      40             : #include "AliTrackReference.h"
      41             :  
      42             : 
      43             : #include <TGeoTrd1.h>
      44             : 
      45          12 : ClassImp(AliFRAMEv2)
      46             : 
      47             :  
      48             : //_____________________________________________________________________________
      49          12 :   AliFRAMEv2::AliFRAMEv2():
      50          12 :     fHoles(0)
      51          60 : {
      52             : // Constructor
      53          24 : }
      54             : 
      55             : //_____________________________________________________________________________
      56             : AliFRAMEv2::AliFRAMEv2(const char *name, const char *title)
      57           1 :     : AliFRAME(name,title), 
      58           1 :       fHoles(0)
      59           5 : {
      60             : // Constructor
      61           2 : }
      62             : 
      63             : //___________________________________________
      64             : void AliFRAMEv2::CreateGeometry()
      65             : {
      66             : //Begin_Html
      67             : /*
      68             : <img src="picts/frame.gif">
      69             : */
      70             : //End_Html
      71             : 
      72             : 
      73             : //Begin_Html
      74             : /*
      75             : <img src="picts/tree_frame.gif">
      76             : */
      77             : //End_Html
      78             : 
      79           2 :   Int_t idrotm[2299];
      80             : 
      81             : 
      82             :  
      83           1 :   AliMatrix(idrotm[2070],  90.0,   0.0,  90.0, 270.0,   0.0,   0.0);  
      84             : //
      85           1 :   AliMatrix(idrotm[2083], 170.0,   0.0,  90.0,  90.0,  80.0,   0.0);
      86           1 :   AliMatrix(idrotm[2084], 170.0, 180.0,  90.0,  90.0,  80.0, 180.0);
      87           1 :   AliMatrix(idrotm[2085],  90.0, 180.0,  90.0,  90.0,   0.0,   0.0);
      88             : //  
      89           1 :   AliMatrix(idrotm[2086],  90.0,   0.0, 90.0,   90.,   0.0,   0.0);
      90           1 :   AliMatrix(idrotm[2087],  90.0, 180.0, 90.0,  270.,   0.0,   0.0);
      91           1 :   AliMatrix(idrotm[2088],  90.0,  90.0, 90.0,  180.,   0.0,   0.0);
      92           1 :   AliMatrix(idrotm[2089],  90.0,  90.0, 90.0,    0.,   0.0,   0.0);
      93             : //
      94           1 :   AliMatrix(idrotm[2090],  90.0,   0.0,   0.0,    0.,   90.0, 90.0);
      95           1 :   AliMatrix(idrotm[2091],   0.0,   0.0,  90.0,   90.,   90.0,  0.0);
      96             : //
      97             : // Matrices have been imported from Euclid. Some simplification
      98             : // seems possible
      99             : //
     100             : 
     101           1 :   AliMatrix(idrotm[2003],   0.0, 0.0, 90.0, 130.0, 90.0,  40.0);
     102           1 :   AliMatrix(idrotm[2004], 180.0, 0.0, 90.0, 130.0, 90.0,  40.0);
     103           1 :   AliMatrix(idrotm[2005], 180.0, 0.0, 90.0, 150.0, 90.0, 240.0);
     104           1 :   AliMatrix(idrotm[2006],   0.0, 0.0, 90.0, 150.0, 90.0, 240.0);
     105           1 :   AliMatrix(idrotm[2007],   0.0, 0.0, 90.0, 170.0, 90.0,  80.0);
     106           1 :   AliMatrix(idrotm[2008], 180.0, 0.0, 90.0, 190.0, 90.0, 280.0);
     107           1 :   AliMatrix(idrotm[2009], 180.0, 0.0, 90.0, 170.0, 90.0,  80.0);
     108           1 :   AliMatrix(idrotm[2010],   0.0, 0.0, 90.0, 190.0, 90.0, 280.0);
     109           1 :   AliMatrix(idrotm[2011],   0.0, 0.0, 90.0, 350.0, 90.0, 260.0);
     110           1 :   AliMatrix(idrotm[2012], 180.0, 0.0, 90.0, 350.0, 90.0, 260.0);
     111           1 :   AliMatrix(idrotm[2013], 180.0, 0.0, 90.0,  10.0, 90.0, 100.0);
     112           1 :   AliMatrix(idrotm[2014],   0.0, 0.0, 90.0,  10.0, 90.0, 100.0);
     113           1 :   AliMatrix(idrotm[2015],   0.0, 0.0, 90.0,  30.0, 90.0, 300.0);
     114           1 :   AliMatrix(idrotm[2016], 180.0, 0.0, 90.0,  30.0, 90.0, 300.0);
     115           1 :   AliMatrix(idrotm[2017], 180.0, 0.0, 90.0,  50.0, 90.0, 140.0);
     116           1 :   AliMatrix(idrotm[2018],   0.0, 0.0, 90.0,  50.0, 90.0, 140.0);
     117             : 
     118           1 :   AliMatrix(idrotm[2019], 180.0, 0.0, 90.0, 130.0, 90.0, 220.0);
     119           1 :   AliMatrix(idrotm[2020], 180.0, 0.0, 90.0,  50.0, 90.0, 320.0);
     120           1 :   AliMatrix(idrotm[2021], 180.0, 0.0, 90.0, 150.0, 90.0,  60.0);
     121           1 :   AliMatrix(idrotm[2022], 180.0, 0.0, 90.0,  30.0, 90.0, 120.0);
     122           1 :   AliMatrix(idrotm[2023], 180.0, 0.0, 90.0, 170.0, 90.0, 260.0);
     123           1 :   AliMatrix(idrotm[2024], 180.0, 0.0, 90.0, 190.0, 90.0, 100.0);
     124           1 :   AliMatrix(idrotm[2025], 180.0, 0.0, 90.0, 350.0, 90.0,  80.0);
     125           1 :   AliMatrix(idrotm[2026], 180.0, 0.0, 90.0,  10.0, 90.0, 280.0);
     126             :   
     127           1 :   AliMatrix(idrotm[2027],   0.0, 0.0, 90.0,  50.0, 90.0, 320.0);
     128           1 :   AliMatrix(idrotm[2028],   0.0, 0.0, 90.0, 150.0, 90.0,  60.0); 
     129           1 :   AliMatrix(idrotm[2029],   0.0, 0.0, 90.0,  30.0, 90.0, 120.0);
     130           1 :   AliMatrix(idrotm[2030],   0.0, 0.0, 90.0,  10.0, 90.0, 280.0);
     131           1 :   AliMatrix(idrotm[2031],   0.0, 0.0, 90.0, 170.0, 90.0, 260.0);
     132           1 :   AliMatrix(idrotm[2032],   0.0, 0.0, 90.0, 190.0, 90.0, 100.0);
     133           1 :   AliMatrix(idrotm[2033],   0.0, 0.0, 90.0, 350.0, 90.0,  80.0);
     134             : 
     135             : 
     136           1 :   Int_t *idtmed = fIdtmed->GetArray()-1999;
     137             : //
     138             : // The Space frame
     139             : //
     140             : //
     141           1 :   Float_t pbox[3], ptrap[11], ptrd1[4], ppgon[10];
     142             :   
     143             :   Float_t dx, dy, dz;
     144             :   Int_t i, j, jmod;
     145             :   jmod = 0;
     146             : //
     147             : // Constants 
     148             :   const Float_t kEps   = 0.01;
     149           1 :   const Int_t   kAir   = idtmed[2004];
     150           1 :   const Int_t   kSteel = idtmed[2064];
     151             :   
     152           1 :   const Float_t krad2deg = 180. / TMath::Pi();
     153           1 :   const Float_t kdeg2rad = 1. / krad2deg;
     154             : 
     155             :   Float_t iFrH   = 118.66;  // Height of inner frame 
     156             :   Float_t ringH  =   6.00;  // Height of the ring bars 
     157             :   Float_t ringW  =  10.00;  // Width  of the ring bars in z
     158             :   Float_t longH  =   6.00; 
     159             :   Float_t longW  =   4.00; 
     160             : // 
     161           1 :   Float_t dymodU[3] = {70.0, 224.0, 340.2};
     162           1 :   Float_t dymodL[3] = {50.0, 175.0, 297.5};
     163             :   //
     164             :   
     165             : //
     166             : // Frame mother volume
     167             : //
     168           1 :   TGeoPgon* shB77A = new TGeoPgon(0., 360., 18, 2);
     169           1 :   shB77A->SetName("shB77A");
     170           1 :   shB77A->DefineSection( 0, -376.5, 280., 415.7);
     171           1 :   shB77A->DefineSection( 1,  376.5, 280., 415.7);
     172           1 :   TGeoBBox* shB77B = new TGeoBBox(3.42, 2., 375.5);
     173           1 :   shB77B->SetName("shB77B");
     174           1 :   TGeoTranslation* trB77A = new TGeoTranslation("trB77A", +283.32, 0., 0.);
     175           1 :   TGeoTranslation* trB77B = new TGeoTranslation("trB77B", -283.32, 0., 0.);
     176           1 :   trB77A->RegisterYourself();
     177           1 :   trB77B->RegisterYourself();
     178           1 :   TGeoCompositeShape* shB77 = new TGeoCompositeShape("shB77", "shB77A+shB77B:trB77A+shB77B:trB77B");
     179           2 :   TGeoVolume* voB77 = new TGeoVolume("B077", shB77, gGeoManager->GetMedium("FRAME_Air"));
     180           1 :   voB77->SetName("B077"); // just to avoid a warning
     181           1 :   TVirtualMC::GetMC()->Gspos("B077", 1, "ALIC", 0., 0., 0., 0, "ONLY");
     182             : //
     183             : // Reference plane #1 for TRD
     184           1 :   TGeoPgon* shBREFA = new TGeoPgon(0.0, 360., 18, 2);
     185           1 :   shBREFA->DefineSection( 0, -376., 280., 280.1);
     186           1 :   shBREFA->DefineSection( 1,  376., 280., 280.1);
     187           1 :   shBREFA->SetName("shBREFA");
     188           1 :   TGeoCompositeShape* shBREF1 = new TGeoCompositeShape("shBREF1", "shBREFA-(shB77B:trB77A+shB77B:trB77B)");
     189           2 :   TGeoVolume* voBREF = new TGeoVolume("BREF1", shBREF1, gGeoManager->GetMedium("FRAME_Air"));
     190           1 :   voBREF->SetVisibility(0);
     191           1 :   TVirtualMC::GetMC()->Gspos("BREF1", 1, "B077", 0., 0., 0., 0, "ONLY");
     192             : //
     193             : //  The outer Frame
     194             : //
     195             : 
     196             :   Float_t dol = 4.;
     197             :   Float_t doh = 4.;
     198             :   Float_t ds  = 0.63;
     199             : //
     200             : // Mother volume
     201             : //
     202           1 :   ppgon[0] =   0.;
     203           1 :   ppgon[1] = 360.;
     204           1 :   ppgon[2] =  18.;
     205             : 
     206           1 :   ppgon[3] =   2.;
     207             : 
     208           1 :   ppgon[4] = -350.;
     209           1 :   ppgon[5] =  401.35;
     210           1 :   ppgon[6] =  415.6;
     211             : 
     212           1 :   ppgon[7] =  -ppgon[4]; 
     213           1 :   ppgon[8] =   ppgon[5];
     214           1 :   ppgon[9] =   ppgon[6];
     215           1 :   TVirtualMC::GetMC()->Gsvolu("B076", "PGON", kAir, ppgon, 10);
     216           1 :   TVirtualMC::GetMC()->Gspos("B076", 1, "B077", 0., 0., 0., 0, "ONLY");
     217             : //  
     218             : // Rings    
     219             : //
     220           1 :   dz = 2. * 410.2 * TMath::Sin(10.*kdeg2rad) - 2. *dol * TMath::Cos(10.*kdeg2rad)- 2. * doh * TMath::Tan(10.*kdeg2rad);
     221           1 :   Float_t l1 = dz/2.;
     222           1 :   Float_t l2 = dz/2.+2.*doh*TMath::Tan(10.*kdeg2rad);
     223             : 
     224             : 
     225           1 :   TGeoVolumeAssembly* asBI42 = new TGeoVolumeAssembly("BI42");
     226             :  // Horizontal
     227           1 :   ptrd1[0] =  l2 - 0.6 * TMath::Tan(10.*kdeg2rad);
     228           1 :   ptrd1[1] =  l2;
     229           1 :   ptrd1[2] =  8.0 / 2.;
     230           1 :   ptrd1[3] =  0.6 / 2.;
     231           1 :   TVirtualMC::GetMC()->Gsvolu("BIH142", "TRD1", kSteel, ptrd1, 4);
     232           1 :   ptrd1[0] =  l1;
     233           1 :   ptrd1[1] =  l1 + 0.6 * TMath::Tan(10.*kdeg2rad);
     234           1 :   ptrd1[2] =  8.0 / 2.;
     235           1 :   ptrd1[3] =  0.6 / 2.;
     236           1 :   TVirtualMC::GetMC()->Gsvolu("BIH242", "TRD1", kSteel, ptrd1, 4);
     237             : 
     238             :   // Vertical 
     239           1 :   ptrd1[0] =  l1 + 0.6 * TMath::Tan(10.*kdeg2rad);
     240           1 :   ptrd1[1] =  l2 - 0.6 * TMath::Tan(10.*kdeg2rad);
     241           1 :   ptrd1[2] =  0.8 / 2.;
     242           1 :   ptrd1[3] =  6.8 / 2.;
     243           1 :   TVirtualMC::GetMC()->Gsvolu("BIV42", "TRD1", kSteel, ptrd1, 4);
     244             :   // Place 
     245           2 :   asBI42->AddNode(gGeoManager->GetVolume("BIV42"),  1, new TGeoTranslation(0., 0., 0.));
     246           2 :   asBI42->AddNode(gGeoManager->GetVolume("BIH142"), 1, new TGeoTranslation(0., 0.,  3.7));
     247           2 :   asBI42->AddNode(gGeoManager->GetVolume("BIH242"), 1, new TGeoTranslation(0., 0., -3.7));
     248             : //
     249             : // longitudinal bars
     250             : //
     251             : // 80 x 80 x 6.3
     252             : //
     253           1 :   pbox[0] = dol;
     254           1 :   pbox[1] = doh;
     255           1 :   pbox[2] = 345.;
     256           1 :   TVirtualMC::GetMC()->Gsvolu("B033", "BOX", kSteel, pbox, 3);
     257           1 :   pbox[0] = dol-ds;
     258           1 :   pbox[1] = doh-ds;
     259           1 :   TVirtualMC::GetMC()->Gsvolu("B034", "BOX", kAir, pbox, 3);
     260           1 :   TVirtualMC::GetMC()->Gspos("B034", 1, "B033", 0., 0., 0., 0, "ONLY");
     261             : 
     262             : 
     263             :   //
     264             :   // TPC support
     265             :   //
     266           1 :   pbox[0] =   3.37;
     267           1 :   pbox[1] =   2.0;
     268           1 :   pbox[2] = 375.5;
     269           1 :   TVirtualMC::GetMC()->Gsvolu("B080", "BOX", kSteel, pbox, 3);
     270           1 :   pbox[0] =   2.78;
     271           1 :   pbox[1] =   1.4;
     272           1 :   pbox[2] = 375.5;
     273           1 :   TVirtualMC::GetMC()->Gsvolu("B081", "BOX", kAir, pbox, 3);
     274           1 :   TVirtualMC::GetMC()->Gspos("B081", 1, "B080",  0., 0., 0., 0, "ONLY");
     275             : 
     276             :   // Small 2nd reference plane elemenet 
     277           1 :    pbox[0] =   0.05;
     278           1 :    pbox[1] =   2.0;
     279           1 :    pbox[2] = 375.5;
     280           1 :    TVirtualMC::GetMC()->Gsvolu("BREF2", "BOX", kAir, pbox, 3);
     281           1 :    TVirtualMC::GetMC()->Gspos("BREF2", 1, "B080",  3.37 - 0.05, 0., 0., 0, "ONLY");
     282             : 
     283           1 :   TVirtualMC::GetMC()->Gspos("B080", 1, "B077",  283.3, 0., 0., 0, "ONLY");
     284           1 :   TVirtualMC::GetMC()->Gspos("B080", 2, "B077", -283.3, 0., 0., idrotm[2087], "ONLY");
     285             : 
     286             :    
     287             : //
     288             : // Diagonal bars (1) 
     289             : //
     290             :   Float_t h, d, dq, x, theta;
     291             :   
     292           1 :   h  = (dymodU[1]-dymodU[0]-2.*dol)*.999;
     293             :   d  = 2.*dol;
     294           1 :   dq = h*h+dz*dz;
     295             : 
     296           1 :   x  =  TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
     297             :   
     298             : 
     299           1 :   theta = krad2deg * TMath::ACos(x);
     300             :   
     301           1 :   ptrap[0]  = dz/2.;
     302           1 :   ptrap[1]  = theta;
     303           1 :   ptrap[2]  = 0.;
     304           1 :   ptrap[3]  = doh;
     305           1 :   ptrap[4]  = dol/x;
     306           1 :   ptrap[5]  = ptrap[4];
     307           1 :   ptrap[6]  = 0;
     308           1 :   ptrap[7]  = ptrap[3];
     309           1 :   ptrap[8]  = ptrap[4];
     310           1 :   ptrap[9]  = ptrap[4];
     311           1 :   ptrap[10] = 0;
     312             : 
     313           1 :   TVirtualMC::GetMC()->Gsvolu("B047", "TRAP", kSteel, ptrap, 11);
     314           1 :   ptrap[3]  = doh-ds;
     315           1 :   ptrap[4]  = (dol-ds)/x;
     316           1 :   ptrap[5]  = ptrap[4];
     317           1 :   ptrap[7]  = ptrap[3];
     318           1 :   ptrap[8]  = ptrap[4];
     319           1 :   ptrap[9]  = ptrap[4];
     320           1 :   TVirtualMC::GetMC()->Gsvolu("B048", "TRAP", kAir, ptrap, 11);
     321           1 :   TVirtualMC::GetMC()->Gspos("B048", 1, "B047", 0.0, 0.0, 0., 0, "ONLY");
     322             : 
     323             : /*
     324             :  Crosses (inner most) 
     325             :        \\  //
     326             :         \\//
     327             :         //\\
     328             :        //  \\
     329             : */
     330           1 :   h  = (2.*dymodU[0]-2.*dol)*.999;
     331             : // 
     332             : // Mother volume
     333             : //
     334           1 :   pbox[0] = h/2;
     335           1 :   pbox[1] = doh;
     336           1 :   pbox[2] = dz/2.;
     337           1 :   TVirtualMC::GetMC()->Gsvolu("BM49", "BOX ", kAir, pbox, 3);
     338             :   
     339             :   
     340           1 :   dq = h*h+dz*dz;
     341           1 :   x  =  TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
     342           1 :   theta = krad2deg * TMath::ACos(x);
     343             : 
     344           1 :   ptrap[0]  = dz/2.-kEps;
     345           1 :   ptrap[1]  = theta;
     346           1 :   ptrap[2]  = 0.;
     347           1 :   ptrap[3]  = doh-kEps;
     348           1 :   ptrap[4]  = dol/x;
     349           1 :   ptrap[5]  = ptrap[4];
     350           1 :   ptrap[7]  = ptrap[3];
     351           1 :   ptrap[8]  = ptrap[4];
     352           1 :   ptrap[9]  = ptrap[4];
     353             : 
     354           1 :   TVirtualMC::GetMC()->Gsvolu("B049", "TRAP", kSteel, ptrap, 11);
     355           1 :   ptrap[0]  = ptrap[0]-kEps;
     356           1 :   ptrap[3]  = (doh-ds);
     357           1 :   ptrap[4]  = (dol-ds)/x;
     358           1 :   ptrap[5]  = ptrap[4];
     359           1 :   ptrap[7]  = ptrap[3];
     360           1 :   ptrap[8]  = ptrap[4];
     361           1 :   ptrap[9]  = ptrap[4];
     362           1 :   TVirtualMC::GetMC()->Gsvolu("B050", "TRAP", kAir, ptrap, 11);
     363           1 :   TVirtualMC::GetMC()->Gspos("B050", 1, "B049", 0.0, 0.0, 0., 0, "ONLY");
     364           1 :   TVirtualMC::GetMC()->Gspos("B049", 1, "BM49", 0.0, 0.0, 0., 0, "ONLY");
     365             : 
     366             : 
     367           1 :   Float_t dd1    = d*TMath::Tan(theta*kdeg2rad);
     368           1 :   Float_t dd2    = d/TMath::Tan(2.*theta*kdeg2rad);
     369           1 :   Float_t theta2 = TMath::ATan(TMath::Abs(dd2-dd1)/d/2.);
     370             :   
     371             : 
     372           1 :   ptrap[0] = dol;
     373           1 :   ptrap[1] = theta2*krad2deg;
     374           1 :   ptrap[2] = 0.;
     375           1 :   ptrap[3] = doh;
     376           1 :   ptrap[4] = (dz/2./x-dd1-dd2)/2.;
     377           1 :   ptrap[5] = ptrap[4];
     378           1 :   ptrap[6] = 0.;
     379           1 :   ptrap[7] = ptrap[3];
     380           1 :   ptrap[8] = dz/4./x;
     381           1 :   ptrap[9] = ptrap[8];
     382             : 
     383             : 
     384           1 :   TVirtualMC::GetMC()->Gsvolu("B051", "TRAP", kSteel, ptrap, 11);
     385           1 :   Float_t ddx0 = ptrap[8];
     386             :   
     387           1 :   Float_t dd1s    = dd1*(1.-2.*ds/d);
     388           1 :   Float_t dd2s    = dd2*(1.-2.*ds/d); 
     389           1 :   Float_t theta2s = TMath::ATan(TMath::Abs(dd2s-dd1s)/(d-2.*ds)/2.);
     390             : 
     391             : 
     392           1 :   ptrap[0] = dol-ds;
     393           1 :   ptrap[1] = theta2s*krad2deg;
     394           1 :   ptrap[2] = 0.;
     395           1 :   ptrap[3] = doh-ds;
     396           1 :   ptrap[4] = ptrap[4]+ds/d/2.*(dd1+dd2);
     397           1 :   ptrap[5] = ptrap[4];
     398           1 :   ptrap[6] = 0.;
     399           1 :   ptrap[7] = ptrap[3];
     400           1 :   ptrap[8] = ptrap[8]-ds/2./d*(dd1+dd2);
     401           1 :   ptrap[9] = ptrap[8];
     402             :   
     403           1 :   TVirtualMC::GetMC()->Gsvolu("B052", "TRAP", kAir, ptrap, 11);
     404           1 :   TVirtualMC::GetMC()->Gspos("B052", 1, "B051", 0.0, 0.0, 0., 0, "ONLY");
     405             : 
     406             :   Float_t ddx, ddz, drx, drz, rtheta;
     407             : 
     408           1 :   AliMatrix(idrotm[2001], -theta+180, 0.0, 90.0, 90.0, 90.-theta, 0.0); 
     409           1 :   rtheta = (90.-theta)*kdeg2rad;
     410           1 :   ddx = -ddx0-dol*TMath::Tan(theta2);
     411             :   ddz = -dol;
     412             :   
     413           1 :   drx = TMath::Cos(rtheta) * ddx +TMath::Sin(rtheta) *ddz+pbox[0];
     414           1 :   drz = -TMath::Sin(rtheta) * ddx +TMath::Cos(rtheta) *ddz-pbox[2];
     415           2 :   TVirtualMC::GetMC()->Gspos("B051", 1, "BM49", 
     416           1 :              drx, 0.0, drz,
     417           1 :              idrotm[2001], "ONLY");
     418             : 
     419           1 :   AliMatrix(idrotm[2002], -theta, 0.0, 90.0, 90.0, 270.-theta, 0.0);
     420           1 :   rtheta = (270.-theta)*kdeg2rad;
     421             :   
     422           1 :   drx =  TMath::Cos(rtheta) * ddx +  TMath::Sin(rtheta) * ddz-pbox[0];
     423           1 :   drz = -TMath::Sin(rtheta) * ddx +  TMath::Cos(rtheta) * ddz+pbox[2];
     424           2 :   TVirtualMC::GetMC()->Gspos("B051", 2, "BM49", 
     425           1 :              drx, 0.0, drz,
     426           1 :              idrotm[2002], "ONLY");
     427             : 
     428             : //
     429             : // Diagonal bars (3) 
     430             : //
     431           1 :   h  = ((dymodU[2]-dymodU[1])-2.*dol)*.999;
     432           1 :   dq = h*h+dz*dz;
     433           1 :   x  =  TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
     434           1 :   theta = krad2deg * TMath::ACos(x);
     435             :   
     436           1 :   ptrap[0]  = dz/2.;
     437           1 :   ptrap[1]  = theta;
     438           1 :   ptrap[3]  =  doh;
     439           1 :   ptrap[4]  =  dol/x;
     440           1 :   ptrap[5]  = ptrap[4];
     441           1 :   ptrap[7]  = ptrap[3];
     442           1 :   ptrap[8]  = ptrap[4];
     443           1 :   ptrap[9]  = ptrap[4];
     444             : 
     445           1 :   TVirtualMC::GetMC()->Gsvolu("B045", "TRAP", kSteel, ptrap, 11);
     446           1 :   ptrap[3]  =  doh-ds;
     447           1 :   ptrap[4]  =  (dol-ds)/x;
     448           1 :   ptrap[5]  = ptrap[4];
     449           1 :   ptrap[7]  = ptrap[3];
     450           1 :   ptrap[8]  = ptrap[4];
     451           1 :   ptrap[9]  = ptrap[4];
     452           1 :   TVirtualMC::GetMC()->Gsvolu("B046", "TRAP", kAir, ptrap, 11);
     453           1 :   TVirtualMC::GetMC()->Gspos("B046", 1, "B045", 0.0, 0.0, 0., 0, "ONLY");
     454             : 
     455             : //
     456             : // Positioning of diagonal bars
     457             :   
     458             :   Float_t rd =  405.5;
     459           1 :   dz = (dymodU[1]+dymodU[0])/2.;
     460           1 :   Float_t dz2 =  (dymodU[1]+dymodU[2])/2.;
     461             : 
     462             : //
     463             : //  phi = 40
     464             : //
     465             :   Float_t  phi = 40;
     466           1 :   dx = rd * TMath::Sin(phi*kdeg2rad);
     467           1 :   dy = rd * TMath::Cos(phi*kdeg2rad);
     468             :   
     469             : 
     470           1 :   TVirtualMC::GetMC()->Gspos("B045", 1, "B076", -dx,  dy,  dz2, idrotm[2019], "ONLY");
     471           1 :   TVirtualMC::GetMC()->Gspos("B045", 2, "B076", -dx,  dy, -dz2, idrotm[2003], "ONLY"); // ?
     472           1 :   TVirtualMC::GetMC()->Gspos("B045", 3, "B076",  dx,  dy,  dz2, idrotm[2020], "ONLY");
     473           1 :   TVirtualMC::GetMC()->Gspos("B045", 4, "B076",  dx,  dy, -dz2, idrotm[2027], "ONLY");
     474             : 
     475             : 
     476             : //
     477             : //  phi = 60
     478             : //
     479             : 
     480             :   phi = 60;
     481           1 :   dx = rd * TMath::Sin(phi*kdeg2rad);
     482           1 :   dy = rd * TMath::Cos(phi*kdeg2rad);
     483             : 
     484           1 :   TVirtualMC::GetMC()->Gspos("B045", 5, "B076", -dx,  dy,  dz2, idrotm[2021], "ONLY");
     485           1 :   TVirtualMC::GetMC()->Gspos("B045", 6, "B076", -dx,  dy, -dz2, idrotm[2028], "ONLY");
     486           1 :   TVirtualMC::GetMC()->Gspos("B045", 7, "B076",  dx,  dy,  dz2, idrotm[2022], "ONLY");
     487           1 :   TVirtualMC::GetMC()->Gspos("B045", 8, "B076",  dx,  dy, -dz2, idrotm[2029], "ONLY");
     488             : 
     489             : //
     490             : //  phi = 80
     491             : //
     492             : 
     493             :   phi = 80;
     494           1 :   dx = rd * TMath::Sin(phi*kdeg2rad);
     495           1 :   dy = rd * TMath::Cos(phi*kdeg2rad);
     496             : 
     497           1 :   TVirtualMC::GetMC()->Gspos("B047", 13, "B076", -dx, -dy,  dz, idrotm[2008], "ONLY");
     498           1 :   TVirtualMC::GetMC()->Gspos("B047", 14, "B076", -dx, -dy, -dz, idrotm[2010], "ONLY");
     499           1 :   TVirtualMC::GetMC()->Gspos("B047", 15, "B076",  dx, -dy,  dz, idrotm[2012], "ONLY");
     500           1 :   TVirtualMC::GetMC()->Gspos("B047", 16, "B076",  dx, -dy, -dz, idrotm[2011], "ONLY");
     501             : 
     502           1 :   TVirtualMC::GetMC()->Gspos("B045",  9, "B076", -dx,  dy,  dz2, idrotm[2023], "ONLY");
     503           1 :   TVirtualMC::GetMC()->Gspos("B045", 10, "B076", -dx,  dy, -dz2, idrotm[2031], "ONLY");
     504           1 :   TVirtualMC::GetMC()->Gspos("B045", 11, "B076",  dx,  dy,  dz2, idrotm[2026], "ONLY");
     505           1 :   TVirtualMC::GetMC()->Gspos("B045", 12, "B076",  dx,  dy, -dz2, idrotm[2030], "ONLY");
     506             : 
     507           1 :   TVirtualMC::GetMC()->Gspos("B045", 13, "B076", -dx, -dy,  dz2, idrotm[2024], "ONLY");
     508           1 :   TVirtualMC::GetMC()->Gspos("B045", 14, "B076", -dx, -dy, -dz2, idrotm[2032], "ONLY");
     509           1 :   TVirtualMC::GetMC()->Gspos("B045", 15, "B076",  dx, -dy,  dz2, idrotm[2025], "ONLY");
     510           1 :   TVirtualMC::GetMC()->Gspos("B045", 16, "B076",  dx, -dy, -dz2, idrotm[2033], "ONLY");
     511             : 
     512           1 :   TVirtualMC::GetMC()->Gspos("BM49", 7, "B076",  dx, -dy,  0., idrotm[2025], "ONLY");
     513           1 :   TVirtualMC::GetMC()->Gspos("BM49", 8, "B076", -dx, -dy,  0., idrotm[2024], "ONLY");
     514             : 
     515             : //
     516             : // The internal frame
     517             : //
     518             : //
     519             : //
     520             : //  Mother Volumes
     521             : //
     522             : 
     523           1 :   ptrd1[0] =  49.8;
     524           1 :   ptrd1[1] =  70.7;
     525           1 :   ptrd1[2] = 376.5;  
     526           1 :   ptrd1[3] =  iFrH / 2.;  
     527             :   
     528             :   Float_t r      = 342.0;
     529             :   Float_t rout1  = 405.5;
     530             :   Float_t rout2  = 411.55;
     531          37 :   TString module[18];
     532             :   
     533          38 :   for (i = 0; i < 18; i++) {
     534             : 
     535             :       // Create volume i 
     536          18 :       char name[16];
     537          18 :       Int_t mod = i + 13;
     538          31 :       if (mod > 17) mod -= 18;
     539          18 :       snprintf(name, 16, "BSEGMO%d", mod);
     540          36 :       TVirtualMC::GetMC()->Gsvolu(name, "TRD1", kAir, ptrd1, 4);
     541          36 :       gGeoManager->GetVolume(name)->SetVisibility(kFALSE);
     542             : 
     543          18 :       module[i] = name;
     544             :       // Place volume i
     545          18 :       Float_t phi1  = i * 20.;
     546          18 :       Float_t phi2 = 270 + phi1;
     547          31 :       if (phi2 >= 360.) phi2 -= 360.;
     548             :       
     549          18 :       dx =  TMath::Sin(phi1*kdeg2rad)*r;
     550          18 :       dy = -TMath::Cos(phi1*kdeg2rad)*r;
     551             :       
     552          18 :       char nameR[16];
     553          18 :       snprintf(nameR, 16, "B43_Rot_%d", i);
     554          36 :       TGeoRotation* rot = new TGeoRotation(nameR,  90.0, phi1, 0., 0., 90., phi2);  
     555          18 :       AliMatrix(idrotm[2034+i],  90.0, phi1, 0., 0., 90., phi2);  
     556          18 :       TGeoVolume* vol77 = gGeoManager->GetVolume("B077");
     557          18 :       TGeoVolume* volS  = gGeoManager->GetVolume(name);
     558          54 :       vol77->AddNode(volS, 1,  new TGeoCombiTrans(dx, dy, 0., rot));
     559             : 
     560             : //
     561             : //    Position elements of outer Frame
     562             : //
     563          18 :       dx =  TMath::Sin(phi1*kdeg2rad)*rout1;
     564          18 :       dy = -TMath::Cos(phi1*kdeg2rad)*rout1;
     565         144 :       for (j = 0; j < 3; j++)
     566             :       {
     567          54 :           dz = dymodU[j];
     568          54 :           TGeoVolume* vol = gGeoManager->GetVolume("B076");
     569         162 :           vol->AddNode(asBI42, 6*i+2*j+1, new TGeoCombiTrans(dx, dy,  dz, rot));
     570         162 :           vol->AddNode(asBI42, 6*i+2*j+2, new TGeoCombiTrans(dx, dy, -dz, rot));
     571             :       }
     572             : 
     573          18 :       phi1 = i*20.+10;
     574          18 :       phi2 = 270+phi1;
     575          18 :       AliMatrix(idrotm[2052+i],  90.0, phi1, 90., phi2, 0., 0.);  
     576             : 
     577          18 :       dx =  TMath::Sin(phi1*kdeg2rad)*rout2;
     578          18 :       dy = -TMath::Cos(phi1*kdeg2rad)*rout2;
     579          36 :       TVirtualMC::GetMC()->Gspos("B033", i+1, "B076", dx, dy,  0., idrotm[2052+i], "ONLY");      
     580             : //
     581          18 :   }
     582             : // Internal Frame rings
     583             : //
     584             : //
     585             : //            60x60x5x6  for inner rings (I-beam)
     586             : //           100x60x5    for front and rear rings
     587             : //
     588             : // Front and rear 
     589           1 :   ptrd1[0] =  287. * TMath::Sin(10.* kdeg2rad) - 2.1;
     590           1 :   ptrd1[1] =  293. * TMath::Sin(10.* kdeg2rad) - 2.1;
     591           1 :   ptrd1[2] =  ringW/2.;
     592           1 :   ptrd1[3] =  ringH/2.;  
     593             :   
     594           2 :   TVirtualMC::GetMC()->Gsvolu("B072", "TRD1", kSteel, ptrd1, 4);
     595             : 
     596           1 :   ptrd1[0] =  287.5 * TMath::Sin(10. * kdeg2rad) - 2.1;
     597           1 :   ptrd1[1] =  292.5 * TMath::Sin(10. * kdeg2rad) - 2.1;
     598           1 :   ptrd1[2] =  ringW / 2. - 0.5;
     599           1 :   ptrd1[3] =  ringH / 2. - 0.5;  
     600             : 
     601           2 :   TVirtualMC::GetMC()->Gsvolu("B073", "TRD1", kAir, ptrd1, 4);
     602           2 :   TVirtualMC::GetMC()->Gspos("B073", 1, "B072", 0., 0., 0., 0, "ONLY");
     603             : //
     604             : // I-Beam
     605             : // Mother volume
     606           2 :   TGeoVolumeAssembly* asBI72 = new TGeoVolumeAssembly("BI72");
     607             :  // Horizontal
     608           1 :   ptrd1[0] =  292.5 * TMath::Sin(10.* kdeg2rad) - 2.1;
     609           1 :   ptrd1[1] =  293.0 * TMath::Sin(10.* kdeg2rad) - 2.1;
     610           1 :   ptrd1[2] =  6./2.;
     611           1 :   ptrd1[3] =  0.5/2.;
     612           2 :   TVirtualMC::GetMC()->Gsvolu("BIH172", "TRD1", kSteel, ptrd1, 4);
     613           1 :   ptrd1[0] =  287.0 * TMath::Sin(10.* kdeg2rad) - 2.1;
     614           1 :   ptrd1[1] =  287.5 * TMath::Sin(10.* kdeg2rad) - 2.1;
     615           1 :   ptrd1[2] =  6./2.;
     616           1 :   ptrd1[3] =  0.5/2.;
     617           2 :   TVirtualMC::GetMC()->Gsvolu("BIH272", "TRD1", kSteel, ptrd1, 4);
     618             : 
     619             :   // Vertical 
     620           1 :   ptrd1[0] =  287.5 * TMath::Sin(10.* kdeg2rad) - 2.1;
     621           1 :   ptrd1[1] =  292.5 * TMath::Sin(10.* kdeg2rad) - 2.1;
     622           1 :   ptrd1[2] =  0.6/2.;
     623           1 :   ptrd1[3] =  5./2.;
     624           2 :   TVirtualMC::GetMC()->Gsvolu("BIV72", "TRD1", kSteel, ptrd1, 4);
     625             :   // Place 
     626           4 :   asBI72->AddNode(gGeoManager->GetVolume("BIV72"), 1,  new TGeoTranslation(0., 0., 0.));
     627           4 :   asBI72->AddNode(gGeoManager->GetVolume("BIH172"), 1, new TGeoTranslation(0., 0.,  2.75));
     628           4 :   asBI72->AddNode(gGeoManager->GetVolume("BIH272"), 1, new TGeoTranslation(0., 0., -2.75));
     629             : 
     630             : // Web frame 0-degree
     631             : //
     632             : // h x w x s = 60x40x5 
     633             : // (attention: element is are half bars, "U" shaped)  
     634             : //
     635             :   Float_t dHz    = 112.66;
     636             :   
     637           1 :   WebFrame("B063",  dHz, 10.0,  10.);
     638           1 :   WebFrame("B063I", dHz, 10.0, -10.);
     639             : 
     640           1 :   WebFrame("B163",  dHz,  -40.0,  10.);
     641           1 :   WebFrame("B163I", dHz,  -40.0, -10.);
     642             : 
     643           1 :   WebFrame("B263",  dHz,  20.0,  10.);
     644           1 :   WebFrame("B263I", dHz,  20.0, -10.);
     645             : 
     646           1 :   WebFrame("B363",  dHz,  -27.1,  10.);
     647           1 :   WebFrame("B363I", dHz,  -27.1, -10.);
     648             : 
     649           1 :   WebFrame("B463",  dHz, 18.4,  10.);
     650           1 :   WebFrame("B463I", dHz, 18.4, -10.);
     651             : 
     652             : 
     653           1 :   dz = -iFrH/2.+ringH/2.+kEps;
     654             :   Float_t dz0 = 3.;  
     655           1 :   Float_t dx0 = 49.8 + dHz/2. * TMath::Tan(10. * kdeg2rad) + 0.035;
     656             :   
     657          38 :   for (jmod = 0; jmod< 18; jmod++)
     658             :   {
     659             : // ring bars
     660         144 :       for (i = 0; i < 3; i++) {
     661             :         //      if ((i == 2) || (jmod ==0) || (jmod == 8)) { 
     662          54 :         if (i == 2) { 
     663          54 :           TVirtualMC::GetMC()->Gspos("B072", 6*jmod+i+1, module[jmod], 0,  dymodL[i], dz, 0, "ONLY");
     664          54 :           TVirtualMC::GetMC()->Gspos("B072", 6*jmod+i+4, module[jmod], 0, -dymodL[i], dz, idrotm[2070], "ONLY");      
     665             :         } else {
     666          72 :           TGeoVolume* vol = gGeoManager->GetVolume(module[jmod]);
     667         108 :           vol->AddNode(asBI72, 6*jmod+i+1, new TGeoTranslation(0,   dymodL[i], dz));
     668         108 :           vol->AddNode(asBI72, 6*jmod+i+4, new TGeoTranslation(0,  -dymodL[i], dz));
     669             :         }
     670             :       }
     671             :   }
     672             :   
     673             : // outer diagonal web
     674             : 
     675           1 :   dy = dymodL[0] + (dHz/2. - 4.) * TMath::Tan(10. * kdeg2rad);
     676             :   
     677          38 :   for (jmod = 0; jmod < 18; jmod++) {
     678          54 :       TVirtualMC::GetMC()->Gspos("B063",   4*jmod+1, module[jmod],  dx0,   dy, dz0, idrotm[2086], "ONLY");
     679          54 :       TVirtualMC::GetMC()->Gspos("B063I",  4*jmod+2, module[jmod],  dx0,  -dy, dz0, idrotm[2087], "ONLY");
     680          54 :       TVirtualMC::GetMC()->Gspos("B063",   4*jmod+3, module[jmod], -dx0,  -dy, dz0, idrotm[2087], "ONLY");
     681          54 :       TVirtualMC::GetMC()->Gspos("B063I",  4*jmod+4, module[jmod], -dx0,   dy, dz0, idrotm[2086], "ONLY");
     682             :   }
     683             : 
     684           1 :   dy = 73.6 + (dHz/2. + 4.)  * TMath::Tan(40. * kdeg2rad);
     685             : 
     686          38 :   for (jmod = 0; jmod < 18; jmod++) {
     687          54 :       TVirtualMC::GetMC()->Gspos("B163",  4*jmod+1, module[jmod],  dx0,   dy, dz0, idrotm[2086], "ONLY");
     688          54 :       TVirtualMC::GetMC()->Gspos("B163I", 4*jmod+2, module[jmod],  dx0,  -dy, dz0, idrotm[2087], "ONLY");
     689          54 :       TVirtualMC::GetMC()->Gspos("B163",  4*jmod+3, module[jmod], -dx0,  -dy, dz0, idrotm[2087], "ONLY");
     690          54 :       TVirtualMC::GetMC()->Gspos("B163I", 4*jmod+4, module[jmod], -dx0,   dy, dz0, idrotm[2086], "ONLY");
     691             :   }
     692             : 
     693           1 :   dy = 224.5 -  (dHz/2 + 4.) * TMath::Tan(20. * kdeg2rad);
     694             : 
     695          38 :     for (jmod = 0; jmod < 18; jmod++) {
     696          54 :       TVirtualMC::GetMC()->Gspos("B263",  4*jmod+1, module[jmod],  dx0,   dy, dz0, idrotm[2086], "ONLY");
     697          54 :       TVirtualMC::GetMC()->Gspos("B263I", 4*jmod+2, module[jmod],  dx0,  -dy, dz0, idrotm[2087], "ONLY");
     698          54 :       TVirtualMC::GetMC()->Gspos("B263",  4*jmod+3, module[jmod], -dx0,  -dy, dz0, idrotm[2087], "ONLY");
     699          54 :       TVirtualMC::GetMC()->Gspos("B263I", 4*jmod+4, module[jmod], -dx0,   dy, dz0, idrotm[2086], "ONLY");
     700             :   }
     701             : 
     702           1 :   dy = 231.4 +  (dHz/2.+ 4.) * TMath::Tan(27.1 * kdeg2rad);
     703             : 
     704          38 :     for (jmod = 0; jmod < 18; jmod++) {
     705          54 :       TVirtualMC::GetMC()->Gspos("B363",  4*jmod+1, module[jmod],  dx0,   dy, dz0, idrotm[2086], "ONLY");
     706          54 :       TVirtualMC::GetMC()->Gspos("B363I", 4*jmod+2, module[jmod],  dx0,  -dy, dz0, idrotm[2087], "ONLY");
     707          54 :       TVirtualMC::GetMC()->Gspos("B363",  4*jmod+3, module[jmod], -dx0,  -dy, dz0, idrotm[2087], "ONLY");
     708          54 :       TVirtualMC::GetMC()->Gspos("B363I", 4*jmod+4, module[jmod], -dx0,   dy, dz0, idrotm[2086], "ONLY");
     709             :   }
     710             : 
     711           1 :   dy = 340.2 -  (dHz/2.+ 4.) * TMath::Tan(18.4 * kdeg2rad);
     712             : 
     713          38 :     for (jmod = 0; jmod < 18; jmod++) {
     714          54 :       TVirtualMC::GetMC()->Gspos("B463",  4*jmod+1, module[jmod],  dx0,   dy, dz0, idrotm[2086], "ONLY");
     715          54 :       TVirtualMC::GetMC()->Gspos("B463I", 4*jmod+2, module[jmod],  dx0,  -dy, dz0, idrotm[2087], "ONLY");
     716          54 :       TVirtualMC::GetMC()->Gspos("B463",  4*jmod+3, module[jmod], -dx0,  -dy, dz0, idrotm[2087], "ONLY");
     717          54 :       TVirtualMC::GetMC()->Gspos("B463I", 4*jmod+4, module[jmod], -dx0,   dy, dz0, idrotm[2086], "ONLY");
     718             :   }
     719             :  
     720             : // longitudinal bars (TPC rails attached)
     721             : //  new specs:
     722             : //  h x w x s = 100 x 75 x 6 
     723             : //  current: 
     724             : //  Attention: 2 "U" shaped half rods per cell 
     725             : //
     726             : //  not yet used 
     727             : //
     728           1 :   ptrap[0]  =   2.50;
     729           1 :   ptrap[1]  =  10.00;
     730           1 :   ptrap[2]  =   0.00;
     731           1 :   ptrap[3]  = 350.00;
     732           1 :   ptrap[4]  =   3.75;
     733           1 :   ptrap[5]  = ptrap[4];
     734           1 :   ptrap[6]  = 0;
     735           1 :   ptrap[7]  = ptrap[3];
     736           1 :   ptrap[8]  = ptrap[4];
     737           1 :   ptrap[9]  = ptrap[4];
     738           1 :   ptrap[10] = 0;
     739             : //  TVirtualMC::GetMC()->Gsvolu("B059", "TRAP", kSteel, ptrap, 11);
     740           1 :   ptrap[0]  =  2.2;
     741           1 :   ptrap[4]  =  2.15;
     742           1 :   ptrap[5]  = ptrap[4];
     743           1 :   ptrap[7]  = ptrap[3];
     744           1 :   ptrap[8]  = ptrap[4];
     745           1 :   ptrap[9]  = ptrap[4];
     746             :   //TVirtualMC::GetMC()->Gsvolu("B062", "TRAP", kAir, ptrap, 11);
     747             :   //TVirtualMC::GetMC()->Gspos("B062", 1, "B059", 0.0, 0., 0., 0, "ONLY");
     748             : 
     749             : //
     750             : // longitudinal bars (no TPC rails attached)
     751             : // new specs: h x w x s = 40 x 60 x 5
     752             : //
     753             : //
     754             : // 
     755           1 :   ptrap[0]  = longW/4.;
     756           1 :   ptrap[4]  = longH/2.;
     757           1 :   ptrap[5]  = ptrap[4];
     758           1 :   ptrap[7]  = ptrap[3];
     759           1 :   ptrap[8]  = ptrap[4];
     760           1 :   ptrap[9]  = ptrap[4];
     761             : 
     762           2 :   TVirtualMC::GetMC()->Gsvolu("BA59", "TRAP", kSteel, ptrap, 11);
     763           1 :   ptrap[0]  = longW/4.-0.25;
     764           1 :   ptrap[4]  = longH/2.-0.50;
     765           1 :   ptrap[5]  = ptrap[4];
     766           1 :   ptrap[7]  = ptrap[3];
     767           1 :   ptrap[8]  = ptrap[4];
     768           1 :   ptrap[9]  = ptrap[4];
     769           2 :   TVirtualMC::GetMC()->Gsvolu("BA62", "TRAP", kAir, ptrap, 11);
     770           2 :   TVirtualMC::GetMC()->Gspos("BA62", 1, "BA59", 0.0, 0.0, -0.15, 0, "ONLY");
     771             : 
     772           1 :   dz = -iFrH/2. + longH/2.;
     773             : 
     774          38 :   for (jmod = 0; jmod < 18; jmod++) {
     775          54 :       TVirtualMC::GetMC()->Gspos("BA59", 2*jmod+1, module[jmod],  49.31, 0.0, dz, idrotm[2084], "ONLY");
     776          54 :       TVirtualMC::GetMC()->Gspos("BA59", 2*jmod+2, module[jmod], -49.31, 0.0, dz, idrotm[2083], "ONLY");
     777             :   }
     778             : 
     779             :   
     780             : //
     781             : // Thermal shield
     782             : //
     783             : 
     784             :   Float_t dyM  =  99.0;
     785           1 :   MakeHeatScreen("M",   dyM, idrotm[2090], idrotm[2091]);
     786             :   Float_t dyAM = 119.5;
     787           1 :   MakeHeatScreen("AM", dyAM, idrotm[2090], idrotm[2091]);
     788             :   Float_t dyA  = 122.5 - 5.5;
     789           1 :   MakeHeatScreen("A" ,  dyA, idrotm[2090], idrotm[2091]);
     790             : 
     791             : //
     792             : //
     793             : //
     794             :   dz = -57.2 + 0.6;  
     795          38 :   for (i = 0; i < 18; i++) {
     796             : 
     797          18 :       char nameMo[16];
     798          18 :       snprintf(nameMo, 16, "BSEGMO%d",i);
     799             :       // M
     800          36 :       TVirtualMC::GetMC()->Gspos("BTSH_M" , i+1 , nameMo,  0., 0., dz, 0, "ONLY"); 
     801             :       // AM, CM
     802          18 :       dy = dymodL[0] + dyAM / 2. + 3.;
     803          36 :       TVirtualMC::GetMC()->Gspos("BTSH_AM", i+ 1, nameMo, 0.,  dy, dz, 0, "ONLY"); 
     804          36 :       TVirtualMC::GetMC()->Gspos("BTSH_AM", i+19, nameMo, 0., -dy, dz, 0, "ONLY"); 
     805             :       // A, C
     806          18 :       dy = dymodL[1] + dyA / 2 + 0.4;
     807          36 :       TVirtualMC::GetMC()->Gspos("BTSH_A" , i+ 1, nameMo, 0.,  dy, dz, 0, "ONLY"); 
     808          36 :       TVirtualMC::GetMC()->Gspos("BTSH_A" , i+19, nameMo, 0., -dy, dz, 0, "ONLY"); 
     809          18 : }
     810             :   
     811             : 
     812             :   //
     813             :   // TRD mother volumes
     814             :   //
     815             : 
     816           1 :   ptrd1[0] = 47.4405;   // CBL 28/6/2006
     817           1 :   ptrd1[1] = 61.1765;   // CBL
     818           1 :   ptrd1[2] = 375.5;     // CBL
     819           1 :   ptrd1[3] = 38.95;     // CBL
     820             : 
     821          38 :   for (i = 0; i < 18; i++) {
     822          18 :     char nameCh[16];
     823          18 :     snprintf(nameCh, 16, "BTRD%d",i);
     824          18 :     char nameMo[16];
     825          18 :     snprintf(nameMo, 16, "BSEGMO%d",i);
     826          36 :     TVirtualMC::GetMC()->Gsvolu(nameCh, "TRD1", kAir, ptrd1, 4);
     827          36 :     gGeoManager->GetVolume(nameCh)->SetVisibility(kFALSE);
     828          36 :     TVirtualMC::GetMC()->Gspos(nameCh, 1, nameMo, 0., 0., -12.62, 0, "ONLY"); // CBL 28/6/2006
     829          18 :   }
     830             : 
     831             : // 
     832             : // TOF mother volumes as modified by B.Guerzoni
     833             : // to remove overlaps/extrusions in case of aligned TOF SMs
     834             : // 
     835           1 :   ptrd1[0] = 62.2500; 
     836           1 :   ptrd1[1] = 64.25; 
     837           1 :   ptrd1[2] = 372.6; 
     838           1 :   ptrd1[3] = 14.525/2;
     839           1 :   char nameChA[16];
     840           1 :   snprintf(nameChA, 16, "BTOFA");
     841           2 :   TGeoTrd1 *trd1=new TGeoTrd1(nameChA,ptrd1[0],ptrd1[1],ptrd1[2],ptrd1[3]); 
     842           1 :   trd1->SetName("BTOFA"); // just to avoid a warning
     843           1 :   char nameChB[16];
     844           1 :   snprintf(nameChB, 16, "BTOFB");
     845           2 :   TGeoBBox *box1 = new TGeoBBox(nameChB,64.25 ,372.6, 14.525/2);
     846           1 :   box1->SetName("BTOFB"); // just to avoid a warning
     847           2 :   TGeoTranslation *tr1 = new TGeoTranslation("trnsl1",0, 0, -14.525/2 );
     848           1 :   tr1->RegisterYourself();
     849           2 :   TGeoTranslation *tr2 = new TGeoTranslation("trnsl2",0, 0, +14.525/2 );
     850           1 :   tr2->RegisterYourself();
     851           2 :   TGeoCompositeShape *btofcs =new TGeoCompositeShape("Btofcs","(BTOFA:trnsl1)+(BTOFB:trnsl2)");
     852             : 
     853             : 
     854          38 :   for (i = 0; i < 18; i++) {
     855          18 :     char nameCh[16];
     856          18 :     snprintf(nameCh, 16, "BTOF%d",i);
     857          18 :     char nameMo[16];
     858          18 :     snprintf(nameMo, 16, "BSEGMO%d",i);
     859          54 :     TGeoVolume* btf = new TGeoVolume(nameCh, btofcs, gGeoManager->GetMedium("FRAME_Air"));
     860          18 :     btf->SetName(nameCh); 
     861          36 :     gGeoManager->GetVolume(nameCh)->SetVisibility(kFALSE);
     862          36 :     TVirtualMC::GetMC()->Gspos(nameCh, 1, nameMo, 0., 0., 43.525, 0, "ONLY"); 
     863          18 :   }
     864             : //
     865             : //    Geometry of Rails starts here
     866             : //
     867             : //
     868             : //
     869             : //    Rails for space-frame
     870             : //
     871           1 :   Float_t rbox[3];
     872             : 
     873           1 :   rbox[0] =  25.00;
     874           1 :   rbox[1] =  27.50;
     875           1 :   rbox[2] = 600.00;
     876           2 :   TVirtualMC::GetMC()->Gsvolu("BRS1", "BOX", kAir, rbox, 3);
     877             :   
     878           1 :   rbox[0] =  25.00;
     879           1 :   rbox[1] =   3.75;
     880           2 :   TVirtualMC::GetMC()->Gsvolu("BRS2", "BOX", kSteel, rbox, 3);
     881             :   
     882           1 :   rbox[0] =   3.00;
     883           1 :   rbox[1] =  20.00;
     884           2 :   TVirtualMC::GetMC()->Gsvolu("BRS3", "BOX", kSteel, rbox, 3);
     885             :   
     886           2 :   TVirtualMC::GetMC()->Gspos("BRS2", 1, "BRS1", 0., -27.5+3.75, 0., 0, "ONLY");
     887           2 :   TVirtualMC::GetMC()->Gspos("BRS2", 2, "BRS1", 0.,  27.5-3.75, 0., 0, "ONLY");
     888           2 :   TVirtualMC::GetMC()->Gspos("BRS3", 1, "BRS1", 0.,         0., 0., 0, "ONLY");
     889           2 :   TVirtualMC::GetMC()->Gspos("BRS1", 1, "ALIC", -430.-3.,    -190., 0., 0, "ONLY");
     890           2 :   TVirtualMC::GetMC()->Gspos("BRS1", 2, "ALIC",  430.+3.,    -190., 0., 0, "ONLY");
     891             : 
     892           1 :   rbox[0] =    3.0;
     893           1 :   rbox[1] =  145./4.;
     894           1 :   rbox[2] =   25.0;
     895           2 :   TVirtualMC::GetMC()->Gsvolu("BRS4", "BOX", kSteel, rbox, 3);
     896             : 
     897           2 :   TVirtualMC::GetMC()->Gspos("BRS4", 1, "ALIC",  430.+3.,    -190.+55./2.+rbox[1],  224., 0, "ONLY");
     898           2 :   TVirtualMC::GetMC()->Gspos("BRS4", 2, "ALIC",  430.+3.,    -190.+55./2.+rbox[1], -224., 0, "ONLY");
     899             : //  TVirtualMC::GetMC()->Gspos("BRS4", 3, "ALIC", -430.+3,    -180.+55./2.+rbox[1],  224., 0, "ONLY");
     900             : //  TVirtualMC::GetMC()->Gspos("BRS4", 4, "ALIC", -430.+3,    -180.+55./2.+rbox[1], -224., 0, "ONLY");
     901             : 
     902             : 
     903             : 
     904             :   //
     905             :   // The Backframe
     906             :   //
     907             :   // Inner radius 
     908             :   Float_t kBFMRin = 270.0;
     909             :   // Outer Radius
     910             :   Float_t kBFMRou = 417.5;
     911             :   // Width
     912             :   Float_t kBFMdz  = 118.0;
     913             :   //
     914             :   //
     915             :   // Rings
     916             :   Float_t kBFRdr   =  7.5;
     917             :   Float_t kBFRdz   =  8.0;
     918             :   //
     919             :   //
     920             :   // Bars and Spokes
     921             :   //
     922             :   Float_t kBFBd   =   8.0;
     923             :   Float_t kBFBdd  =   0.6;
     924             :   
     925             : 
     926             :   // The Mother volume
     927           1 :   Float_t tpar[3];
     928           1 :   tpar[0] = kBFMRin;
     929           1 :   tpar[1] = kBFMRou;
     930           1 :   tpar[2] = kBFMdz / 2.;
     931           2 :   TVirtualMC::GetMC()->Gsvolu("BFMO", "TUBE", kAir, tpar, 3);  
     932             : 
     933             :   // CBL ////////////////////////////////////////////////////////
     934             :   //
     935             :   // TRD mother volume
     936             :   //
     937             : 
     938           1 :   ptrd1[0] = 47.4405 - 0.3;
     939           1 :   ptrd1[1] = 61.1765 - 0.3;
     940           1 :   ptrd1[2] = kBFMdz / 2.;
     941           1 :   ptrd1[3] = 38.95;
     942           2 :   TVirtualMC::GetMC()->Gsvolu("BFTRD", "TRD1", kAir, ptrd1, 4);
     943           2 :   gGeoManager->GetVolume("BFTRD")->SetVisibility(kFALSE);
     944             : 
     945          38 :   for (i = 0; i < 18; i++) {
     946             : 
     947          18 :     Float_t phiBF  = i * 20.0;      
     948          18 :     dx =  TMath::Sin(phiBF*kdeg2rad)*(342.0-12.62);
     949          18 :     dy = -TMath::Cos(phiBF*kdeg2rad)*(342.0-12.62);      
     950          36 :     TVirtualMC::GetMC()->Gspos("BFTRD",i,"BFMO",dx,dy,0.0,idrotm[2034+i],"ONLY");
     951             : 
     952             :   }
     953             : 
     954             :   // CBL ////////////////////////////////////////////////////////
     955             :   
     956             :   // Rings
     957             :   //
     958             :   // Inner Ring
     959           1 :   tpar[0] =  kBFMRin;
     960           1 :   tpar[1] =  tpar[0] +  kBFRdr;
     961           1 :   tpar[2] =  kBFRdz / 2.;
     962             :   
     963           2 :   TVirtualMC::GetMC()->Gsvolu("BFIR", "TUBE", kSteel, tpar, 3);  
     964             :   
     965           1 :   tpar[0] =  tpar[0] +  kBFBdd;
     966           1 :   tpar[1] =  tpar[1] -  kBFBdd;
     967           1 :   tpar[2] =  (kBFRdz - 2. * kBFBdd) / 2.;
     968             : 
     969           2 :   TVirtualMC::GetMC()->Gsvolu("BFII", "TUBE", kAir, tpar, 3);  
     970           2 :   TVirtualMC::GetMC()->Gspos("BFII", 1, "BFIR", 0., 0., 0., 0, "ONLY");  
     971             : 
     972             :   //
     973             :   // Outer RING
     974           1 :   tpar[0] =  kBFMRou - kBFRdr + 0.1;
     975           1 :   tpar[1] =  kBFMRou;
     976           1 :   tpar[2] =  kBFRdz / 2.;
     977             :   
     978           2 :   TVirtualMC::GetMC()->Gsvolu("BFOR", "TUBE", kSteel, tpar, 3);  
     979             :   
     980           1 :   tpar[0] =  tpar[0] +  kBFBdd;
     981           1 :   tpar[1] =  tpar[1] -  kBFBdd;
     982           1 :   tpar[2] =  (kBFRdz - 2. * kBFBdd) / 2.;
     983             : 
     984           2 :   TVirtualMC::GetMC()->Gsvolu("BFOO", "TUBE", kAir, tpar, 3);  
     985           2 :   TVirtualMC::GetMC()->Gspos("BFOO", 1, "BFOR", 0., 0., 0., 0, "ONLY");  
     986             : 
     987             : 
     988           1 :   dz = kBFMdz/2. -  kBFRdz / 2.;
     989           2 :   TVirtualMC::GetMC()->Gspos("BFIR", 1, "BFMO", 0., 0.,  dz, 0, "ONLY");  
     990           2 :   TVirtualMC::GetMC()->Gspos("BFIR", 2, "BFMO", 0., 0., -dz, 0, "ONLY");  
     991           2 :   TVirtualMC::GetMC()->Gspos("BFOR", 1, "BFMO", 0., 0.,  dz, 0, "ONLY");  
     992           2 :   TVirtualMC::GetMC()->Gspos("BFOR", 2, "BFMO", 0., 0., -dz, 0, "ONLY");  
     993             :   
     994             :   // 
     995             :   // Longitudinal Bars
     996             :   // 
     997           1 :   Float_t bpar[3];
     998             :   
     999           1 :   bpar[0] =  kBFBd/2;
    1000           1 :   bpar[1] =  bpar[0];
    1001           1 :   bpar[2] =  kBFMdz/2.  - kBFBd;
    1002           2 :   TVirtualMC::GetMC()->Gsvolu("BFLB", "BOX ", kSteel, bpar, 3); 
    1003             : 
    1004           1 :   bpar[0] = bpar[0] - kBFBdd;
    1005           1 :   bpar[1] = bpar[1] - kBFBdd;
    1006           1 :   bpar[2] = bpar[2] - kBFBdd;
    1007           2 :   TVirtualMC::GetMC()->Gsvolu("BFLL", "BOX ", kAir, bpar, 3); 
    1008           2 :   TVirtualMC::GetMC()->Gspos("BFLL", 1, "BFLB", 0., 0., 0., 0, "ONLY");  
    1009             : 
    1010          38 :   for (i = 0; i < 18; i++)
    1011             :   {
    1012          18 :       Float_t ro   = kBFMRou - kBFBd / 2. - 0.02;
    1013          18 :       Float_t ri   = kBFMRin + kBFBd / 2.;
    1014             : 
    1015          18 :       Float_t phi0 = Float_t(i) * 20.;
    1016             :       
    1017          18 :       Float_t xb = ri * TMath::Cos(phi0 * kDegrad);
    1018          18 :       Float_t yb = ri * TMath::Sin(phi0 * kDegrad);
    1019          18 :       AliMatrix(idrotm[2090+i],  90.0, phi0,  90.0, phi0 + 270., 0., 0.);
    1020             :       
    1021          36 :       TVirtualMC::GetMC()->Gspos("BFLB", i + 1, "BFMO", xb, yb, 0., idrotm[2090 + i], "ONLY");      
    1022             : 
    1023          18 :       xb = ro * TMath::Cos(phi0 * kDegrad);
    1024          18 :       yb = ro * TMath::Sin(phi0 * kDegrad);
    1025             : 
    1026          36 :       TVirtualMC::GetMC()->Gspos("BFLB", i + 19, "BFMO", xb, yb, 0., idrotm[2090 +i], "ONLY");       
    1027             :  }
    1028             : 
    1029             :   // 
    1030             :   // Radial Bars
    1031             :   // 
    1032           1 :   bpar[0] =  (kBFMRou - kBFMRin - 2. * kBFRdr) / 2.;
    1033           1 :   bpar[1] =  kBFBd/2;
    1034           1 :   bpar[2] =  bpar[1];
    1035             :   //
    1036             :   // Avoid overlap with circle
    1037             :   Float_t rr    = kBFMRou - kBFRdr;
    1038           1 :   Float_t delta = rr - TMath::Sqrt(rr * rr - kBFBd * kBFBd / 4.) + 0.01;
    1039           1 :   bpar[0] -= delta /2.;
    1040             :   
    1041             : 
    1042           2 :   TVirtualMC::GetMC()->Gsvolu("BFRB", "BOX ", kSteel, bpar, 3); 
    1043             : 
    1044           1 :   bpar[0] = bpar[0] - kBFBdd;
    1045           1 :   bpar[1] = bpar[1] - kBFBdd;
    1046           1 :   bpar[2] = bpar[2] - kBFBdd;
    1047           2 :   TVirtualMC::GetMC()->Gsvolu("BFRR", "BOX ", kAir, bpar, 3); 
    1048           2 :   TVirtualMC::GetMC()->Gspos("BFRR", 1, "BFRB", 0., 0., 0., 0, "ONLY");  
    1049             : 
    1050           1 :   Int_t iphi[10] = {0, 1, 3, 6, 8, 9, 10, 12, 15, 17};
    1051             :   
    1052          22 :   for (i = 0; i < 10; i++)
    1053             :   {
    1054             :       
    1055          10 :       Float_t rb   = (kBFMRin + kBFMRou)/2.;
    1056          10 :       Float_t phib = Float_t(iphi[i]) * 20.;
    1057             :       
    1058          10 :       Float_t xb = rb * TMath::Cos(phib * kDegrad);
    1059          10 :       Float_t yb = rb * TMath::Sin(phib * kDegrad);
    1060             :       
    1061          20 :       TVirtualMC::GetMC()->Gspos("BFRB", i + 1,  "BFMO", xb, yb,  dz, idrotm[2034 + iphi[i]], "ONLY");      
    1062          20 :       TVirtualMC::GetMC()->Gspos("BFRB", i + 11, "BFMO", xb, yb, -dz, idrotm[2034 + iphi[i]], "ONLY");      
    1063             : 
    1064             :  }
    1065             : 
    1066           2 :   TVirtualMC::GetMC()->Gspos("BFMO", i + 19, "ALIC", 0, 0, - 376. - kBFMdz/2. - 0.5 , 0, "ONLY");       
    1067             : 
    1068             : 
    1069             : 
    1070             : //
    1071             : //
    1072             : //  The Baby Frame
    1073             : //
    1074             : //
    1075             :   //
    1076             :   // Inner radius 
    1077             :   Float_t kBBMRin = 278.0;
    1078             :   // Outer Radius
    1079             :   Float_t kBBMRou = 410.5;
    1080             :   // Width
    1081             :   Float_t kBBMdz  = 223.0;
    1082             :   Float_t kBBBdz  = 6.0;
    1083             :   Float_t kBBBdd  = 0.6;
    1084             : 
    1085             :   
    1086             :   // The Mother volume
    1087             : 
    1088           1 :   ppgon[0] =   0.;
    1089           1 :   ppgon[1] = 360.;
    1090           1 :   ppgon[2] =  18.;
    1091             :   
    1092           1 :   ppgon[3] =   2.;
    1093           1 :   ppgon[4] = -kBBMdz / 2. ;
    1094           1 :   ppgon[5] =  kBBMRin;
    1095           1 :   ppgon[6] =  kBBMRou;
    1096             :   
    1097           1 :   ppgon[7] =  -ppgon[4]; 
    1098           1 :   ppgon[8] =   ppgon[5];
    1099           1 :   ppgon[9] =   ppgon[6];
    1100             : 
    1101           2 :   TVirtualMC::GetMC()->Gsvolu("BBMO", "PGON", kAir, ppgon, 10);
    1102           2 :   TVirtualMC::GetMC()->Gsdvn("BBCE", "BBMO", 18, 2);
    1103             : 
    1104             :   // CBL ////////////////////////////////////////////////////////
    1105             :   //
    1106             :   // TRD mother volume
    1107             :   //
    1108             : 
    1109           1 :   AliMatrix(idrotm[2092],  90.0,  90.0,   0.0,   0.0,   90.0,  0.0);
    1110             : 
    1111           1 :   ptrd1[0] = 47.4405 - 2.5;
    1112           1 :   ptrd1[1] = 61.1765 - 2.5;
    1113           1 :   ptrd1[2] = kBBMdz / 2.;
    1114           1 :   ptrd1[3] = 38.95;
    1115           2 :   TVirtualMC::GetMC()->Gsvolu("BBTRD", "TRD1", kAir, ptrd1, 4);
    1116           2 :   gGeoManager->GetVolume("BBTRD")->SetVisibility(kFALSE);
    1117           2 :   TVirtualMC::GetMC()->Gspos("BBTRD", 1, "BBCE", 342.0-12.62, 0.0, 0.0, idrotm[2092], "ONLY");
    1118             : 
    1119             :   // CBL ////////////////////////////////////////////////////////
    1120             : 
    1121             :   // Longitudinal bars
    1122           1 :   bpar[0] =  kBBBdz/2.;
    1123           1 :   bpar[1] =  bpar[0];
    1124           1 :   bpar[2] =  kBBMdz/2.  - kBBBdz;
    1125           2 :   TVirtualMC::GetMC()->Gsvolu("BBLB", "BOX ", kSteel, bpar, 3); 
    1126           1 :   bpar[0] -= kBBBdd;
    1127           1 :   bpar[1] -= kBBBdd;
    1128           1 :   bpar[2] -= kBBBdd;
    1129           2 :   TVirtualMC::GetMC()->Gsvolu("BBLL", "BOX ", kAir, bpar, 3); 
    1130           2 :   TVirtualMC::GetMC()->Gspos("BBLL", 1, "BBLB", 0., 0., 0., 0, "ONLY"); 
    1131             : 
    1132           1 :   dx = kBBMRin + kBBBdz/2. + (bpar[1] + kBBBdd) * TMath::Sin(10. * kDegrad);
    1133           1 :   dy = dx * TMath::Tan(10. * kDegrad) - kBBBdz/2./TMath::Cos(10. * kDegrad);
    1134           2 :   TVirtualMC::GetMC()->Gspos("BBLB", 1, "BBCE", dx, dy, 0., idrotm[2052], "ONLY"); 
    1135             : 
    1136           1 :   dx = kBBMRou - kBBBdz/2. - (bpar[1] + kBBBdd) * TMath::Sin(10. * kDegrad);
    1137           1 :   dy = dx * TMath::Tan(10. * kDegrad) - kBBBdz/2./TMath::Cos(10. * kDegrad);
    1138             :  
    1139           2 :   TVirtualMC::GetMC()->Gspos("BBLB", 2, "BBCE", dx, dy, 0., idrotm[2052], "ONLY");  
    1140             : 
    1141             :   // 
    1142             :   // Radial Bars
    1143             :   // 
    1144           1 :   bpar[0] =  (kBBMRou - kBBMRin) / 2. - kBBBdz;
    1145           1 :   bpar[1] =  kBBBdz/2;
    1146           1 :   bpar[2] =  bpar[1];
    1147             : 
    1148           2 :   TVirtualMC::GetMC()->Gsvolu("BBRB", "BOX ", kSteel, bpar, 3); 
    1149           1 :   bpar[0] -= kBBBdd;
    1150           1 :   bpar[1] -= kBBBdd;
    1151           1 :   bpar[2] -= kBBBdd;
    1152           2 :   TVirtualMC::GetMC()->Gsvolu("BBRR", "BOX ", kAir, bpar, 3); 
    1153           2 :   TVirtualMC::GetMC()->Gspos("BBRR", 1, "BBRB", 0., 0., 0., 0, "ONLY"); 
    1154             : 
    1155             : 
    1156           1 :   dx = (kBBMRou + kBBMRin) / 2.;
    1157           1 :   dy = ((kBBMRou + kBBMRin)/ 2) *  TMath::Tan(10 * kDegrad) - kBBBdz / 2./ TMath::Cos(10 * kDegrad);
    1158           1 :   dz = kBBMdz/2. -  kBBBdz / 2.;
    1159             : 
    1160           2 :   TVirtualMC::GetMC()->Gspos("BBRB", 1, "BBCE", dx, dy,   dz, idrotm[2052], "ONLY");  
    1161           2 :   TVirtualMC::GetMC()->Gspos("BBRB", 2, "BBCE", dx, dy, - dz, idrotm[2052], "ONLY");  
    1162           2 :   TVirtualMC::GetMC()->Gspos("BBRB", 3, "BBCE", dx, dy,   0., idrotm[2052], "ONLY");  
    1163             :  
    1164             :  //
    1165             :  // Circular bars 
    1166             :  //
    1167             :  //  Inner
    1168             :   
    1169           1 :   bpar[1] =  kBBMRin * TMath::Sin(10. * kDegrad);
    1170           1 :   bpar[0] =  kBBBdz/2;
    1171           1 :   bpar[2] =  bpar[0];
    1172           2 :   TVirtualMC::GetMC()->Gsvolu("BBC1", "BOX ", kSteel, bpar, 3); 
    1173           1 :   bpar[0] -= kBBBdd;
    1174           1 :   bpar[1] -= kBBBdd;
    1175           1 :   bpar[2] -= kBBBdd;
    1176           2 :   TVirtualMC::GetMC()->Gsvolu("BBC2", "BOX ", kAir, bpar, 3); 
    1177           2 :   TVirtualMC::GetMC()->Gspos("BBC2", 1, "BBC1", 0., 0., 0., 0, "ONLY"); 
    1178           1 :   dx = kBBMRin + kBBBdz/2;
    1179             :   dy = 0.;
    1180           2 :   TVirtualMC::GetMC()->Gspos("BBC1", 1, "BBCE", dx, dy,   dz, 0, "ONLY");  
    1181           2 :   TVirtualMC::GetMC()->Gspos("BBC1", 2, "BBCE", dx, dy,  -dz, 0, "ONLY");  
    1182             :   //
    1183             :   // Outer
    1184           1 :   bpar[1] =  (kBBMRou - kBBBdz) * TMath::Sin(10. * kDegrad);
    1185           1 :   bpar[0] =  kBBBdz/2;
    1186           1 :   bpar[2] =  bpar[0];
    1187           2 :   TVirtualMC::GetMC()->Gsvolu("BBC3", "BOX ", kSteel, bpar, 3); 
    1188           1 :   bpar[0] -= kBBBdd;
    1189           1 :   bpar[1] -= kBBBdd;
    1190           1 :   bpar[2] -= kBBBdd;
    1191           2 :   TVirtualMC::GetMC()->Gsvolu("BBC4", "BOX ", kAir, bpar, 3); 
    1192           2 :   TVirtualMC::GetMC()->Gspos("BBC4", 1, "BBC3", 0., 0., 0., 0, "ONLY"); 
    1193           1 :   dx = kBBMRou - kBBBdz/2;
    1194             :   dy = 0.;
    1195           2 :   TVirtualMC::GetMC()->Gspos("BBC3", 1, "BBCE", dx, dy,   dz, 0, "ONLY");  
    1196           2 :   TVirtualMC::GetMC()->Gspos("BBC3", 2, "BBCE", dx, dy, - dz, 0, "ONLY");
    1197             :   //
    1198             :   // Diagonal Bars
    1199             :   //
    1200             :   h  = (kBBMRou - kBBMRin - 2. * kBBBdz);;
    1201             :   d  = kBBBdz;
    1202           1 :   dz = kBBMdz/2. - 1.6 * kBBBdz;
    1203           1 :   dq = h*h+dz*dz;
    1204             : 
    1205           1 :   x  =  TMath::Sqrt((dz*dz-d*d)/dq + d*d*h*h/dq/dq)+d*h/dq;
    1206             :   
    1207             : 
    1208           1 :   theta = kRaddeg * TMath::ACos(x);
    1209             :   
    1210           1 :   ptrap[0]  = dz/2.;
    1211           1 :   ptrap[1]  = theta;
    1212           1 :   ptrap[2]  =  0.;
    1213           1 :   ptrap[3]  =  d/2;
    1214           1 :   ptrap[4]  =  d/x/2;
    1215           1 :   ptrap[5]  = ptrap[4];
    1216           1 :   ptrap[6]  = 0;
    1217           1 :   ptrap[7]  = ptrap[3];
    1218           1 :   ptrap[8]  = ptrap[4];
    1219           1 :   ptrap[9]  = ptrap[4];
    1220           1 :   ptrap[10] = 0;
    1221           2 :   TVirtualMC::GetMC()->Gsvolu("BBD1", "TRAP", kSteel, ptrap, 11);
    1222           1 :   ptrap[3]  =  d/2-kBBBdd;
    1223           1 :   ptrap[4]  = (d/2-kBBBdd)/x;
    1224           1 :   ptrap[5]  = ptrap[4];
    1225           1 :   ptrap[7]  = ptrap[3];
    1226           1 :   ptrap[8]  = ptrap[4];
    1227           1 :   ptrap[9]  = ptrap[4];
    1228           2 :   TVirtualMC::GetMC()->Gsvolu("BBD3", "TRAP", kAir, ptrap, 11);
    1229           2 :   TVirtualMC::GetMC()->Gspos("BBD3", 1, "BBD1", 0.0, 0.0, 0., 0, "ONLY");
    1230             :   dx = (kBBMRou + kBBMRin) / 2.;
    1231           1 :   dy = ((kBBMRou + kBBMRin)/ 2) *  TMath::Tan(10 * kDegrad) - kBBBdz / 2./ TMath::Cos(10 * kDegrad);
    1232           2 :   TVirtualMC::GetMC()->Gspos("BBD1", 1, "BBCE", dx, dy,   dz/2. + kBBBdz/2., idrotm[2052], "ONLY");  
    1233             : 
    1234             : 
    1235           1 :   ptrap[0]  = dz/2.;
    1236           1 :   ptrap[1]  = -theta;
    1237           1 :   ptrap[2]  =  0.;
    1238           1 :   ptrap[3]  =  d/2;
    1239           1 :   ptrap[4]  =  d/2/x;
    1240           1 :   ptrap[5]  = ptrap[4];
    1241           1 :   ptrap[6]  = 0;
    1242           1 :   ptrap[7]  = ptrap[3];
    1243           1 :   ptrap[8]  = ptrap[4];
    1244           1 :   ptrap[9]  = ptrap[4];
    1245           1 :   ptrap[10] = 0;
    1246           2 :   TVirtualMC::GetMC()->Gsvolu("BBD2", "TRAP", kSteel, ptrap, 11);
    1247           1 :   ptrap[3]  = d/2-kBBBdd;
    1248           1 :   ptrap[4]  = (d/2-kBBBdd)/x;
    1249           1 :   ptrap[5]  = ptrap[4];
    1250           1 :   ptrap[7]  = ptrap[3];
    1251           1 :   ptrap[8]  = ptrap[4];
    1252           1 :   ptrap[9]  = ptrap[4];
    1253           2 :   TVirtualMC::GetMC()->Gsvolu("BBD4", "TRAP", kAir, ptrap, 11);
    1254           2 :   TVirtualMC::GetMC()->Gspos("BBD4", 1, "BBD2", 0.0, 0.0, 0., 0, "ONLY");
    1255             :   dx = (kBBMRou + kBBMRin) / 2.;
    1256           1 :   dy = ((kBBMRou + kBBMRin)/ 2) *  TMath::Tan(10 * kDegrad) - kBBBdz / 2./ TMath::Cos(10 * kDegrad);
    1257           2 :   TVirtualMC::GetMC()->Gspos("BBD2", 1, "BBCE", dx, dy,   -dz/2. - kBBBdz/2., idrotm[2052], "ONLY");  
    1258             : 
    1259             : 
    1260           2 :   TVirtualMC::GetMC()->Gspos("BBMO", 1, "ALIC", 0., 0., + 376. + kBBMdz / 2. + 0.5, 0, "ONLY");  
    1261             : 
    1262             : 
    1263          20 : }
    1264             : 
    1265             : //___________________________________________
    1266             : void AliFRAMEv2::AddAlignableVolumes() const
    1267             : {
    1268             :   // Add the 18 spaceframe sectors as alignable volumes
    1269           2 :   TString basesymname("FRAME/Sector");
    1270           1 :   TString basevolpath("ALIC_1/B077_1/BSEGMO");
    1271           1 :   TString symname;
    1272           1 :   TString volpath;
    1273             :   
    1274          38 :   for(Int_t sec=0; sec<18; sec++)
    1275             :   {
    1276          18 :       symname = basesymname;
    1277          18 :       symname += sec;
    1278          18 :       volpath = basevolpath;
    1279          18 :       volpath += sec;
    1280          18 :       volpath += "_1";
    1281          72 :       if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data()))
    1282           0 :         AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",
    1283             :               symname.Data(),volpath.Data()));
    1284             :   }
    1285           1 : }
    1286             : 
    1287             : //___________________________________________
    1288             : void AliFRAMEv2::CreateMaterials()
    1289             : {
    1290             :   // Creates the materials
    1291             :   Float_t epsil, stemax, tmaxfd, deemax, stmin;
    1292             :   
    1293             :   epsil  = 1.e-4;     // Tracking precision, 
    1294             :   stemax = -0.01;     // Maximum displacement for multiple scat 
    1295             :   tmaxfd = -20.;      // Maximum angle due to field deflection 
    1296             :   deemax = -.3;       // Maximum fractional energy loss, DLS 
    1297             :   stmin  = -.8;
    1298           2 :   Int_t   isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();
    1299           1 :   Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();
    1300             : 
    1301             : 
    1302           1 :   Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
    1303           1 :   Float_t zsteel[4] = { 26.,24.,28.,14. };
    1304           1 :   Float_t wsteel[4] = { .715,.18,.1,.005 };
    1305             :   
    1306             :   //Air
    1307             :   
    1308           1 :   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
    1309           1 :   Float_t zAir[4]={6.,7.,8.,18.};
    1310           1 :   Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
    1311             :   Float_t dAir = 1.20479E-3;
    1312             : 
    1313           1 :   AliMixture(65, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
    1314           1 :   AliMixture(5, "AIR$      ", aAir, zAir, dAir,4, wAir);
    1315           1 :   AliMaterial(9, "ALU      ", 26.98, 13., 2.7, 8.9, 37.2);
    1316             : 
    1317           1 :   AliMedium(65, "Stainless Steel", 65, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
    1318           1 :   AliMedium( 5, "Air", 5, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
    1319           1 :   AliMedium( 9, "Aluminum", 9, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
    1320             : 
    1321           1 : }
    1322             : 
    1323             : //_____________________________________________________________________________
    1324             : void AliFRAMEv2::Init()
    1325             : {
    1326             :   //
    1327             :   // Initialise the module after the geometry has been defined
    1328             :   //
    1329           2 :     if(AliLog::GetGlobalDebugLevel()>0) {
    1330           0 :         printf("%s: **************************************"
    1331             :                " FRAME "
    1332           0 :                "**************************************\n",ClassName());
    1333           0 :         printf("\n%s:      Version 2 of FRAME initialised, symmetric FRAME\n\n",ClassName());
    1334           0 :         printf("%s: **************************************"
    1335             :                " FRAME "
    1336           0 :                "**************************************\n",ClassName());
    1337           0 :     }
    1338             : //
    1339             : // The reference volume id
    1340           1 :     fRefVolumeId1 = TVirtualMC::GetMC()->VolId("BREF1");
    1341           1 :     fRefVolumeId2 = TVirtualMC::GetMC()->VolId("BREF2");
    1342           1 : }
    1343             : 
    1344             : Int_t AliFRAMEv2::IsVersion() const 
    1345             : {
    1346             :   // Returns the version of the FRAME (1 if no holes, 0 otherwise) 
    1347             :     Int_t version = 0;
    1348           2 :     if (fHoles == 0) version = 1;
    1349           1 :     return version;
    1350             : }
    1351             : 
    1352             : void AliFRAMEv2::StepManager()
    1353             : {
    1354             : //
    1355             : // Stepmanager of AliFRAMEv2.cxx
    1356             : // Used for recording of reference tracks entering the spaceframe mother volume
    1357             : //
    1358      205888 :   Int_t   copy, id;
    1359             :   
    1360             :   //
    1361             :   // Only charged tracks
    1362      139539 :   if( !(TVirtualMC::GetMC()->TrackCharge()) ) return; 
    1363             :   //
    1364             :   // Only tracks entering mother volume
    1365             :   // 
    1366             : 
    1367       66349 :   id=TVirtualMC::GetMC()->CurrentVolID(copy);
    1368             : 
    1369      196997 :   if ((id != fRefVolumeId1) && (id != fRefVolumeId2))  return;
    1370        2018 :   if(!TVirtualMC::GetMC()->IsTrackEntering()) return;
    1371             :   //
    1372             :   // Add the reference track
    1373             :   //
    1374         112 :   AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kFRAME);
    1375      103056 : }
    1376             : 
    1377             :   
    1378             : 
    1379             : void AliFRAMEv2::MakeHeatScreen(const char* name, Float_t dyP, Int_t rot1, Int_t rot2)
    1380             : {
    1381             :     // Heat screen panel
    1382             :     //
    1383           6 :     Int_t *idtmed = fIdtmed->GetArray()-1999;
    1384           3 :     const Int_t kAir   = idtmed[2004];
    1385           3 :     const Int_t kAlu   = idtmed[2008];
    1386             : 
    1387             :     Float_t dx, dy;
    1388           3 :     char mname[16];
    1389           3 :     char cname [16];
    1390           3 :     char t1name[16];
    1391           3 :     char t2name[16];
    1392           3 :     char t3name[16];
    1393           3 :     char t4name[16];
    1394           3 :     char t5name[16];
    1395             :     
    1396             :     // 
    1397           3 :     Float_t dxP =  2. * (287. * TMath::Sin(10.* TMath::Pi()/180.) - 2.);
    1398             :     Float_t dzP =  1.05;
    1399             :     //
    1400             :     // Mother volume
    1401           3 :     Float_t thshM[3];
    1402           3 :     thshM[0]  =  dxP / 2.;
    1403           3 :     thshM[1]  =  dyP / 2.;
    1404           3 :     thshM[2]  =  dzP / 2.;
    1405           3 :     snprintf(mname, 16, "BTSH_%s", name);
    1406           3 :     TVirtualMC::GetMC()->Gsvolu(mname,  "BOX ", kAir, thshM,  3);
    1407             :     //
    1408             :     // Aluminum sheet
    1409           3 :     thshM[2] = 0.025;
    1410           3 :     snprintf(cname, 16, "BTSHA_%s", name);
    1411           3 :     TVirtualMC::GetMC()->Gsvolu(cname, "BOX ", kAlu, thshM,  3);
    1412           3 :     TVirtualMC::GetMC()->Gspos(cname, 1, mname, 0., 0., -0.5, 0);
    1413             :     //
    1414             :     // Tubes
    1415           3 :     Float_t thshT[3];
    1416           3 :     thshT[0] = 0.4;
    1417           3 :     thshT[1] = 0.5;
    1418           3 :     thshT[2] = (dyP / 2. - 8.);
    1419             :     //
    1420           3 :     snprintf(t1name, 16, "BTSHT1_%s", name);
    1421           3 :     TVirtualMC::GetMC()->Gsvolu(t1name,  "TUBE", kAlu, thshT,  3);
    1422           3 :     dx = - dxP / 2. + 8. - 0.5;
    1423           3 :     TVirtualMC::GetMC()->Gspos(t1name, 1, mname,  dx, 0., 0.025, rot1);
    1424             :     //
    1425           3 :     snprintf(t2name, 16, "BTSHT2_%s", name);
    1426           3 :     snprintf(t3name, 16, "BTSHT3_%s", name);
    1427           3 :     snprintf(t4name, 16, "BTSHT4_%s", name);
    1428           3 :     snprintf(t5name, 16, "BTSHT5_%s", name);
    1429           3 :     thshT[2] = (thshM[1] - 12.);
    1430           3 :     TVirtualMC::GetMC()->Gsvolu(t2name,  "TUBE", kAlu, thshT,  3);
    1431           3 :     thshT[2] = 7.9/2.;
    1432           3 :     TVirtualMC::GetMC()->Gsvolu(t3name,  "TUBE", kAlu, thshT,  3);
    1433           3 :     thshT[2] = 23.9/2.;
    1434           3 :     TVirtualMC::GetMC()->Gsvolu(t4name,  "TUBE", kAlu, thshT,  3);
    1435             : 
    1436             :     Int_t sig = 1;
    1437             :     Int_t ipo = 1;
    1438          36 :     for (Int_t i = 0; i < 5; i++) {
    1439          15 :         sig *= -1;
    1440          15 :         dx += 8.00;
    1441          15 :         dy = 4. * sig;
    1442          15 :         Float_t dy1 =  - (thshM[1] - 15.5) * sig;
    1443          15 :         Float_t dy2 =  - (thshM[1] -  7.5) * sig;
    1444             :         
    1445          15 :         TVirtualMC::GetMC()->Gspos(t2name, ipo++, mname, dx, dy, 0.025, rot1);
    1446          15 :         dx += 6.9;
    1447          15 :         TVirtualMC::GetMC()->Gspos(t2name, ipo++, mname, dx, dy, 0.025, rot1);      
    1448             :         
    1449          15 :         TVirtualMC::GetMC()->Gspos(t3name, i+1,   mname, dx - 3.45, dy1, 0.025, rot2);      
    1450          15 :         TVirtualMC::GetMC()->Gspos(t4name, i+1,   mname, dx - 3.45, dy2, 0.025, rot2);      
    1451             :     }
    1452           3 :     dx += 8.;
    1453           3 :     TVirtualMC::GetMC()->Gspos(t1name, 2, mname, dx, 0., 0.025, rot1);
    1454           3 :     TVirtualMC::GetMC()->Gspos(t3name, 6,   mname, dx - 3.45, -(thshM[1] - 7.5), 0.025, rot2);      
    1455           3 : }
    1456             : 
    1457             : 
    1458             : 
    1459             : void AliFRAMEv2::WebFrame(const char* name, Float_t dHz, Float_t theta0, Float_t phi0)
    1460             : {
    1461             :     //
    1462             :     // Create a web frame element
    1463             :     //
    1464          20 :     Int_t *idtmed = fIdtmed->GetArray()-1999;
    1465          10 :     const Float_t krad2deg = 180. / TMath::Pi();
    1466          10 :     const Float_t kdeg2rad = 1. / krad2deg;
    1467          10 :     const Int_t   kAir   = idtmed[2004];
    1468          10 :     const Int_t   kSteel = idtmed[2064];
    1469             : 
    1470          10 :     Float_t ptrap[11];
    1471          10 :     char nameA[16];
    1472          10 :     snprintf(nameA, 16, "%sA", name );
    1473          10 :     theta0 *= kdeg2rad;
    1474          10 :     phi0   *= kdeg2rad;
    1475          10 :     Float_t theta   = TMath::ATan(TMath::Tan(theta0)/TMath::Sin(phi0));
    1476          10 :     Float_t phi     = TMath::ACos(TMath::Cos(theta0) * TMath::Cos(phi0));
    1477          15 :     if (phi0 < 0) phi = -phi;
    1478             : 
    1479          10 :     phi   *= krad2deg;
    1480          10 :     theta *= krad2deg;
    1481             :     
    1482          10 :     ptrap[0]  = dHz/2;
    1483          10 :     ptrap[2]  = theta;
    1484          10 :     ptrap[1]  = phi;
    1485          10 :     ptrap[3]  = 6./cos(theta0 * kdeg2rad)/2.;
    1486          10 :     ptrap[4]  = 1.;
    1487          10 :     ptrap[5]  = ptrap[4];
    1488          10 :     ptrap[6]  = 0;
    1489          10 :     ptrap[7]  = ptrap[3];
    1490          10 :     ptrap[8]  = ptrap[4];
    1491          10 :     ptrap[9]  = ptrap[4];
    1492          10 :     ptrap[10] = 0;
    1493          10 :     TVirtualMC::GetMC()->Gsvolu(name, "TRAP", kSteel, ptrap, 11);
    1494          10 :     ptrap[3]  =  (6. - 1.)/cos(theta0 * kdeg2rad)/2.;
    1495          10 :     ptrap[4]  =  0.75;
    1496          10 :     ptrap[5]  = ptrap[4];
    1497          10 :     ptrap[7]  = ptrap[3];
    1498          10 :     ptrap[8]  = ptrap[4];
    1499          10 :     ptrap[9]  = ptrap[4];
    1500             :     
    1501          10 :     TVirtualMC::GetMC()->Gsvolu(nameA, "TRAP", kAir, ptrap, 11);
    1502          10 :     TVirtualMC::GetMC()->Gspos(nameA, 1, name, 0.0, -0.25, 0., 0, "ONLY");
    1503          10 :     gGeoManager->GetVolume(name)->SetVisibility(1);
    1504          10 : }
    1505             : 

Generated by: LCOV version 1.11