LCOV - code coverage report
Current view: top level - ACORDE/ACORDEsim - AliACORDEv1.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 349 397 87.9 %
Date: 2016-06-14 17:26:59 Functions: 14 16 87.5 %

          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: AliACORDEv1.cxx,v 1.2 2007/12/03 08:40:00 hristov Exp $ */
      17             : 
      18             : ///////////////////////////////////////////////////////////////////////////////
      19             : //                                                                           //
      20             : // ALICE Cosmic Ray Trigger                                                  //
      21             : //                                                                           //
      22             : //  This class contains the functions for final version of the ALICE Cosmic  //
      23             : //  Ray Trigger. This version will be used to simulation comic rays in alice //
      24             : //  with all the detectors. It includes the last survey of 2009.             //
      25             : //  It include geometry and hits (position and momentum)                     //
      26             : //                                                                           //
      27             : //   Author: Mario Rodriguez Cahuantzi, FCFM-BUAP, Puebla, Pue. Mexico       //
      28             : //                                                                           //
      29             : //                  Send comments to:                                        //
      30             : //                                                                           //
      31             : //      Arturo Fernandez Tellez         <afernand@fcfm.buap.mx>              //
      32             : //      Eleazar Cuautle Flores          <ecuautle@nucleares.unam.mx>         //
      33             : //      Mario Rodriguez Cahuantzi       <mrodrigu@mail.cern.ch>                // 
      34             : //                                                                           //
      35             : //                      Puebla, Pue. Mexico December 2007                    //
      36             : //                                                                           //
      37             : //      Last Update: Nov. 17th 2009                                          //
      38             : //      Mario Rodriguez Cahuantzi                                            //
      39             : ///////////////////////////////////////////////////////////////////////////////
      40             : 
      41             : 
      42             : #include <Riostream.h>
      43             : #include <TGeoMatrix.h>
      44             : #include <TMath.h>
      45             : #include <TString.h>
      46             : #include <TSystem.h>
      47             : #include <TTree.h>
      48             : 
      49             : #include "AliConst.h"
      50             : #include "AliRun.h"
      51             : 
      52             : #include "TGeoManager.h"
      53             : #include "TGeoVolume.h"
      54             : #include "TGeoPcon.h"
      55             : #include "TGeoPgon.h"
      56             : #include "TGeoTrd1.h"
      57             : #include "TGeoCompositeShape.h"
      58             : #include "TGeoPara.h"
      59             : 
      60             : #include "AliACORDEv1.h"
      61             : #include <TClonesArray.h>
      62             : #include <TLorentzVector.h>
      63             : #include <TVirtualMC.h>
      64             : #include <TPDGCode.h>
      65             : 
      66             : #include "AliRun.h"
      67             : #include "AliConst.h"
      68             : #include "AliACORDEhit.h"
      69             : #include "AliACORDEConstants.h"
      70             : #include "AliMC.h"
      71             : #include "AliLog.h"
      72             : 
      73          12 : ClassImp(AliACORDEv1)
      74             :  
      75             : //_____________________________________________________________________________
      76             : AliACORDEv1::AliACORDEv1()
      77          12 :   : AliACORDE()
      78          60 : {
      79             :   //
      80             :   // Default constructor
      81          12 :   fIshunt = 0;
      82          12 :   fHits = 0;
      83             :   //
      84          24 : } 
      85             : //_____________________________________________________________________________
      86             : AliACORDEv1::AliACORDEv1(const char *name, const char *title)
      87           1 :   : AliACORDE(name, title)
      88           5 : {
      89             :   //
      90             :   // Standard constructor
      91             :   //
      92           1 :   fIshunt = 1; // All hits are associated with primary particles 
      93           3 :   fHits =  new TClonesArray("AliACORDEhit",400);
      94           1 :   gAlice->GetMCApp()->AddHitList(fHits);
      95           2 : }
      96             : //_____________________________________________________________________________
      97             : AliACORDEv1::~AliACORDEv1()
      98          52 : {
      99             :   //
     100             :   // Default destructor
     101             :   //
     102          52 : }
     103             : //_____________________________________________________________________________
     104             : void AliACORDEv1::CreateGeometry()
     105             : {
     106           2 :   CreateAcorde();
     107           1 : }
     108             : void AliACORDEv1::CreateAcorde()
     109             : {  
     110             : 
     111             :         // Call the global constants for the Modules
     112             :         
     113           2 :         AliACORDEConstants* constants = AliACORDEConstants::Instance();
     114             : 
     115             :         // Get the Alice Volume
     116             : 
     117           1 :         TGeoVolume *alice = gGeoManager->GetVolume("ALIC");
     118             : 
     119             :         // Define some materials & medium
     120             : 
     121             :         //*** Aluminium ***
     122             : 
     123           1 :         TGeoMedium* aluminium = gGeoManager->GetMedium("ACORDE_ALU_C0");
     124             : 
     125             :         //*** Scintillator ***
     126             : 
     127           1 :         TGeoMedium* scintillator = gGeoManager->GetMedium("ACORDE_CPV scint.1");
     128             :         
     129             :         //Define the mother volume for the ACORDE detector
     130             : 
     131           2 :         TGeoVolume *acorde = new TGeoVolumeAssembly("ACORDE");
     132             : 
     133             : 
     134             :         // Define 2 main-daughter volumes for ACORDE
     135             :         
     136           2 :         TGeoVolume *supportBars = new TGeoVolumeAssembly("ACORDE_SUPPORTS_BARS");
     137           2 :         TGeoVolume *acordeModules = new TGeoVolumeAssembly("ALL_ACORDE_MODULES");
     138             : 
     139             :   
     140             :         // Define rotation Matrix for Side's faces in Alice
     141             :         
     142           1 :         TGeoRotation *idrotm231 = new TGeoRotation("idrotm231",90, 45, 90, 135, 0, 0);
     143           1 :         TGeoRotation *idrotm232 = new TGeoRotation("idrotm232",90, 315, 90, 45, 0, 0);
     144             : 
     145             :         // Begin the Geometry for ACORDE
     146             : 
     147             :         // *** Definition of ACORDE's Modules ***
     148             : 
     149             :         // Define Measures of ACORDE's Modules
     150             : 
     151             :         Float_t acoFrameBox1[3],acoFrameBox2[3];
     152             : 
     153           1 :         acoFrameBox1[0] = constants->ModuleLength()/2;
     154           1 :         acoFrameBox1[1] = constants->ModuleHeight()/2;
     155             :         acoFrameBox1[2] = 2.50;
     156             : 
     157             :         acoFrameBox2[0] = 20.0;
     158           1 :         acoFrameBox2[1] = constants->ModuleHeight()/2;
     159             :         acoFrameBox2[2] = 10.0;
     160             : 
     161             :         // Define Measures of Scintillators
     162             :         
     163             :         Float_t acoScinBox[3];  
     164           1 :         acoScinBox[0] = constants->PlasticLength()/2;
     165           1 :         acoScinBox[1] = constants->PlasticHeight()/2;
     166           1 :         acoScinBox[2] = constants->PlasticWidth()/2;
     167             : 
     168             : 
     169             :         // Create the Modules of ACORDE, 1 aluminium frame and two scintillator plastics
     170             : 
     171             :         //*** Aluminium frame ***
     172             : 
     173           1 :         TGeoBBox *acordeModFrameBoxL = new TGeoBBox("acordeModFrameBoxL",acoFrameBox1[0],acoFrameBox1[1],acoFrameBox1[2]);
     174           1 :         TGeoBBox *acordeModFrameBoxH = new TGeoBBox("acordeModFrameBoxH",acoFrameBox2[0],acoFrameBox2[1],acoFrameBox2[2]);
     175           1 :         TGeoVolume *acordeModFrameVolumeL = new TGeoVolume("ACORDEMODFRAMEVOLUMEL",acordeModFrameBoxL,aluminium);
     176           1 :         TGeoVolume *acordeModFrameVolumeH = new TGeoVolume("ACORDEMODFRAMEVOLUMEH",acordeModFrameBoxH,aluminium);
     177             : 
     178             : 
     179             :         //*** Scintillators ***
     180             : 
     181           1 :         TGeoBBox *acordeScintillatorBox = new TGeoBBox("acordeScintillatorBox",acoScinBox[0],acoScinBox[1],acoScinBox[2]);
     182           1 :         TGeoVolume *acordeScintillatorVolume = new TGeoVolume("ACORDESCINTILLATORMODULE",acordeScintillatorBox,scintillator);
     183             : 
     184             : 
     185             :         // Here I create a single ACORDE module and then we make 60 copies of it
     186             : 
     187           2 :         TGeoVolume *acordeSingleModule = new TGeoVolumeAssembly("ACORDE_MODULE");
     188           2 :         acordeSingleModule->AddNode(acordeModFrameVolumeL,1,new TGeoTranslation("acordeFrame_01",0,0,12.5));
     189           2 :         acordeSingleModule->AddNode(acordeModFrameVolumeL,2,new TGeoTranslation("acordeFrame_02",0,0,-12.5));
     190           2 :         acordeSingleModule->AddNode(acordeModFrameVolumeH,3,new TGeoTranslation("acordeFrame_03",130,0,0));
     191           2 :         acordeSingleModule->AddNode(acordeModFrameVolumeH,4,new TGeoTranslation("acordeFrame_04",-130,0,0));
     192           2 :         acordeSingleModule->AddNode(acordeScintillatorVolume,5, new TGeoTranslation("acordeScintillator_01",0,1,0));
     193           2 :         acordeSingleModule->AddNode(acordeScintillatorVolume,6, new TGeoTranslation("acordeScintillator_01",0,-1,0));
     194             : 
     195             :         // Put the Modules of In-Face
     196             :         
     197          18 :         for(Int_t iAcordeModule=1;iAcordeModule<9;iAcordeModule++)
     198             :         {
     199             : 
     200           8 :                 Float_t posx = constants->CenterModulePositionX(iAcordeModule);
     201           8 :                 Float_t posy = constants->CenterModulePositionY(iAcordeModule);
     202           8 :                 Float_t posz = constants->CenterModulePositionZ(iAcordeModule);      
     203             :                 
     204          16 :                 acordeModules->AddNode(acordeSingleModule,iAcordeModule,
     205          16 :                         new TGeoCombiTrans("aco01",posx,posy,posz,idrotm232));
     206             :         }
     207             : 
     208          22 :         for(Int_t iAcordeModule=10;iAcordeModule<20;iAcordeModule++)
     209             :         {
     210          10 :                 Float_t posx = constants->CenterModulePositionX(iAcordeModule);
     211          10 :                 Float_t posy = constants->CenterModulePositionY(iAcordeModule);
     212          10 :                 Float_t posz = constants->CenterModulePositionZ(iAcordeModule);
     213             : 
     214          20 :                 acordeModules->AddNode(acordeSingleModule,iAcordeModule,
     215          20 :                         new TGeoCombiTrans("aco01",posx,posy,posz,idrotm232));
     216             :         }
     217             : 
     218             :         // Put he Modules of Up-Face
     219             : 
     220          42 :         for(Int_t iAcordeModule=20;iAcordeModule<40;iAcordeModule++)
     221             :         {
     222          20 :                 Float_t posx = constants->CenterModulePositionX(iAcordeModule);
     223          20 :                 Float_t posy = constants->CenterModulePositionY(iAcordeModule);
     224          20 :                 Float_t posz = constants->CenterModulePositionZ(iAcordeModule);      
     225             : 
     226          40 :                 acordeModules->AddNode(acordeSingleModule,iAcordeModule,new TGeoTranslation("aco01",posx,posy,posz));
     227             :         }
     228             : 
     229             :         // Put the Modules of Out-Face
     230             : 
     231          22 :         for(Int_t iAcordeModule=40;iAcordeModule<50;iAcordeModule++)
     232             :         {
     233          10 :                 Float_t posx = constants->CenterModulePositionX(iAcordeModule);
     234          10 :                 Float_t posy = constants->CenterModulePositionY(iAcordeModule);
     235          10 :                 Float_t posz = constants->CenterModulePositionZ(iAcordeModule);      
     236             : 
     237          20 :                 acordeModules->AddNode(acordeSingleModule,iAcordeModule,
     238          20 :                         new TGeoCombiTrans("aco01",posx,posy,posz,idrotm231));
     239             :         }
     240             : 
     241             :         // Put the Modules of Out-Face
     242             : 
     243          18 :         for(Int_t iAcordeModule=51;iAcordeModule<59;iAcordeModule++)
     244             :         {
     245           8 :                 Float_t posx = constants->CenterModulePositionX(iAcordeModule);
     246           8 :                 Float_t posy = constants->CenterModulePositionY(iAcordeModule);
     247           8 :                 Float_t posz = constants->CenterModulePositionZ(iAcordeModule);      
     248          16 :                 acordeModules->AddNode(acordeSingleModule,iAcordeModule,
     249          16 :                                         new TGeoCombiTrans("aco01",posx,posy,posz,idrotm231));
     250             :         }
     251             : 
     252             :         // Put the 4-central modules (Old-ITS modules)
     253           1 :         if (Get4CentralModulesGeometry()) 
     254             :         { 
     255           2 :                 acordeModules->AddNode(acordeSingleModule,0,
     256           5 :                         new TGeoTranslation("Mod0_0",constants->CenterModulePositionX(0),constants->CenterModulePositionY(0),constants->CenterModulePositionZ(0)));
     257           2 :                 acordeModules->AddNode(acordeSingleModule,9,
     258           5 :                         new TGeoTranslation("Mod0_9",constants->CenterModulePositionX(9),constants->CenterModulePositionY(9),constants->CenterModulePositionZ(9)));
     259           2 :                 acordeModules->AddNode(acordeSingleModule,50,
     260           5 :                         new TGeoTranslation("Mod0_50",constants->CenterModulePositionX(50),constants->CenterModulePositionY(50),constants->CenterModulePositionZ(50)));
     261           2 :                 acordeModules->AddNode(acordeSingleModule,59,
     262           5 :                         new TGeoTranslation("Mod0_59",constants->CenterModulePositionX(59),constants->CenterModulePositionY(59),constants->CenterModulePositionZ(59)));
     263           1 :         }
     264             : 
     265             :         // Create a dummy support & bars of Aluminium (it doesn't exist a survey of this structure)
     266             : 
     267             :         Float_t boxLongSupport[3],boxThinSupport[3];
     268             : 
     269             :         boxLongSupport[0]=10.0;
     270             :         boxLongSupport[1]=0.5;
     271             :         boxLongSupport[2]=500.0;
     272             : 
     273             :         boxThinSupport[0]=1.0;
     274             :         boxThinSupport[1]=5.0;
     275             :         boxThinSupport[2]=500.0;
     276             : 
     277           1 :         TGeoBBox *acordeLongSupport = new TGeoBBox("ACORDELONGSUPPORT",boxLongSupport[0],boxLongSupport[1],boxLongSupport[2]);
     278           1 :         TGeoBBox *acordeThinSupport = new TGeoBBox("ACORDETHINSUPPORT",boxThinSupport[0],boxThinSupport[1],boxThinSupport[2]);
     279             : 
     280           1 :         TGeoVolume *acordeLSupport = new TGeoVolume("ACORDELS",acordeLongSupport,aluminium);
     281           1 :         TGeoVolume *acordeTSupport = new TGeoVolume("ACORDETS",acordeThinSupport,aluminium);
     282           2 :         TGeoVolume *acordeMainSupport = new TGeoVolumeAssembly("ACORDE_SUPPORT"); 
     283           2 :         acordeMainSupport->AddNode(acordeLSupport,1,new TGeoTranslation("ACOLSA",0,5.5,0));
     284           2 :         acordeMainSupport->AddNode(acordeLSupport,2,new TGeoTranslation("ACOLSB",0,-7.5,0));
     285           1 :         acordeMainSupport->AddNode(acordeTSupport,3);
     286             : 
     287             :         // Set the values for the bars support
     288             :         
     289             :         Float_t boxSingleBar[3];
     290             :         boxSingleBar[0]=10;
     291             :         boxSingleBar[1]=37;//36.722; // Correction to avoid overlaps with the L3 magnet
     292             :         boxSingleBar[2]=10;
     293             : 
     294             :         Float_t boxUnionUp[3];
     295             :         boxUnionUp[0]=10;
     296             :         boxUnionUp[1]=0.5;
     297             :         boxUnionUp[2]=15;
     298             : 
     299             :         Float_t boxUnionDown[3];
     300             :         boxUnionDown[0]=20;
     301             :         boxUnionDown[1]=1;
     302             :         boxUnionDown[2]=20;
     303             :         
     304             :         // Volume and Box for the bar
     305             :         
     306           1 :         TGeoBBox *acordeSingleBarSupport = new TGeoBBox("ACORDESBARS",boxSingleBar[0],boxSingleBar[1],boxSingleBar[2]);
     307           1 :         TGeoVolume *acordeBarSupport = new TGeoVolume("ACORDEBARSUPPORT",acordeSingleBarSupport,aluminium);
     308             : 
     309             :         // Volume and Box for the bar union with the long support (Up-with supports and Down with L3 magnet)
     310             :         
     311           1 :         TGeoBBox *acordeSingleBoxUnionUp = new TGeoBBox("ACORDEBUP",boxUnionUp[0],boxUnionUp[1],boxUnionUp[2]);
     312           1 :         TGeoVolume *acordeBoxUnionUp = new TGeoVolume("ACORDEBOXUNIONUP",acordeSingleBoxUnionUp,aluminium);
     313             :         
     314           1 :         TGeoBBox *acordeSingleBoxUnionDown = new TGeoBBox("ACORDEBDOWN",boxUnionDown[0],boxUnionDown[1],boxUnionDown[2]);
     315           1 :         TGeoVolume *acordeBoxUnionDown = new TGeoVolume("ACORDEBOXUNIONDOWN",acordeSingleBoxUnionDown,aluminium);
     316             : 
     317           2 :         TGeoVolume *acordeMainBar = new TGeoVolumeAssembly("ACORDE_BAR");
     318           2 :         acordeMainBar->AddNode(acordeBoxUnionUp,1,new TGeoTranslation("ACOBAR01",0,boxSingleBar[1]+boxUnionUp[1],0));
     319           1 :         acordeMainBar->AddNode(acordeBarSupport,2);
     320           2 :         acordeMainBar->AddNode(acordeBoxUnionDown,3,new TGeoTranslation("ACOBAR01",0,-boxSingleBar[1]-boxUnionDown[1],0));
     321             : 
     322             :         // Volume for the Full support (supports and bars) UP face of L3 Magnet
     323           1 :         Float_t supportPosXIn = constants->CenterModulePositionX(20);
     324             :         Float_t supportPosY = 859.044-7.5-5.5; // Minimum module position Y less the heigh of the support
     325             :         Float_t supportPosZ = 0;
     326           1 :         Float_t supportPosXOut = constants->CenterModulePositionX(30);
     327             :         Float_t deltaXA = 120.;
     328             :         Float_t deltaXB = 60.;
     329             : 
     330           2 :         TGeoVolume *acordeFullSupportUpFace = new TGeoVolumeAssembly("ACORDE_FULL_SUPPORT_UPFACE");
     331           2 :         acordeFullSupportUpFace->AddNode(acordeMainSupport,1,new TGeoTranslation("ACOFSB01",supportPosXIn+deltaXA,supportPosY,supportPosZ));
     332           2 :         acordeFullSupportUpFace->AddNode(acordeMainSupport,2,new TGeoTranslation("ACOFSB02",supportPosXIn+deltaXB,supportPosY,supportPosZ));
     333           2 :         acordeFullSupportUpFace->AddNode(acordeMainSupport,3,new TGeoTranslation("ACOFSB03",supportPosXIn-deltaXA,supportPosY,supportPosZ));
     334           2 :         acordeFullSupportUpFace->AddNode(acordeMainSupport,4,new TGeoTranslation("ACOFSB04",supportPosXIn-deltaXB,supportPosY,supportPosZ));
     335           2 :         acordeFullSupportUpFace->AddNode(acordeMainSupport,5,new TGeoTranslation("ACOFSB05",supportPosXOut+deltaXA,supportPosY,supportPosZ));
     336           2 :         acordeFullSupportUpFace->AddNode(acordeMainSupport,6,new TGeoTranslation("ACOFSB06",supportPosXOut+deltaXB,supportPosY,supportPosZ));
     337           2 :         acordeFullSupportUpFace->AddNode(acordeMainSupport,7,new TGeoTranslation("ACOFSB07",supportPosXOut-deltaXA,supportPosY,supportPosZ));
     338           2 :         acordeFullSupportUpFace->AddNode(acordeMainSupport,8,new TGeoTranslation("ACOFSB08",supportPosXOut-deltaXB,supportPosY,supportPosZ));
     339             :         
     340             :         // Put the bars in the main volume acordeFullSupportUpFace
     341             : 
     342           1 :         Float_t barPosXIn = constants->CenterModulePositionX(20);
     343             :         Float_t barPosY = supportPosY-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     344             :         Float_t barPosZ = 0;
     345             :         Int_t barIndex = 9;
     346          12 :         for(Int_t iBarModule = 20; iBarModule<30; iBarModule+=2)
     347             :         {
     348           5 :                 barPosZ = constants->CenterModulePositionZ(iBarModule);
     349          10 :                 acordeFullSupportUpFace->AddNode(acordeMainBar,barIndex,new TGeoTranslation("ACOFSB09",barPosXIn+deltaXA,barPosY,barPosZ));        
     350          10 :                 acordeFullSupportUpFace->AddNode(acordeMainBar,barIndex+1,new TGeoTranslation("ACOFSB09",barPosXIn+deltaXB,barPosY,barPosZ));      
     351          10 :                 acordeFullSupportUpFace->AddNode(acordeMainBar,barIndex+2,new TGeoTranslation("ACOFSB09",barPosXIn-deltaXA,barPosY,barPosZ));
     352          10 :                 acordeFullSupportUpFace->AddNode(acordeMainBar,barIndex+3,new TGeoTranslation("ACOFSB09",barPosXIn-deltaXB,barPosY,barPosZ));
     353             : 
     354           5 :                 barIndex+=4;
     355             :         }
     356             : 
     357           1 :         Float_t barPosXOut = constants->CenterModulePositionX(30);
     358          12 :         for(Int_t iBarModule = 30; iBarModule<40; iBarModule+=2)
     359             :         {
     360           5 :                 barPosZ = constants->CenterModulePositionZ(iBarModule);
     361          10 :                 acordeFullSupportUpFace->AddNode(acordeMainBar,barIndex,new TGeoTranslation("ACOFSB09",barPosXOut+deltaXA,barPosY,barPosZ));
     362          10 :                 acordeFullSupportUpFace->AddNode(acordeMainBar,barIndex+1,new TGeoTranslation("ACOFSB09",barPosXOut+deltaXB,barPosY,barPosZ));
     363          10 :                 acordeFullSupportUpFace->AddNode(acordeMainBar,barIndex+2,new TGeoTranslation("ACOFSB09",barPosXOut-deltaXA,barPosY,barPosZ));
     364          10 :                 acordeFullSupportUpFace->AddNode(acordeMainBar,barIndex+3,new TGeoTranslation("ACOFSB09",barPosXOut-deltaXB,barPosY,barPosZ));
     365             : 
     366           5 :                 barIndex+=4;
     367             :         }
     368             : 
     369             :         // Supports and bars for the InSide of L3 Magnet
     370             : 
     371           2 :         TGeoVolume *acordeFullSupportInFace = new TGeoVolumeAssembly("ACORDE_FULL_SUPPORT_INFACE");
     372           1 :         Float_t supportPosXInA = constants->CenterModulePositionX(1)+deltaXA;
     373             :         Float_t supportPosYInA = 592.017-7.5-5.5;
     374           1 :         Float_t x0 = constants->CenterModulePositionX(1);
     375           1 :         Float_t y0 = constants->CenterModulePositionY(1);
     376           1 :         Float_t theta = -1*TMath::Pi()/4;
     377           1 :         Float_t supportPosXInPA = x0+(supportPosXInA-x0)*TMath::Cos(theta)-(supportPosYInA-y0)*TMath::Sin(theta);
     378           1 :         Float_t supportPosYInPA = y0+(supportPosYInA-y0)*TMath::Cos(theta)+(supportPosXInA-x0)*TMath::Sin(theta);
     379             :         Float_t supportPosZInIn = 0;
     380             : 
     381           1 :         Float_t supportPosXInB = constants->CenterModulePositionX(1)+deltaXB;
     382           1 :         Float_t supportPosXInPB = x0+(supportPosXInB-x0)*TMath::Cos(theta)-(supportPosYInA-y0)*TMath::Sin(theta);
     383           1 :         Float_t supportPosYInPB = y0+(supportPosYInA-y0)*TMath::Cos(theta)+(supportPosXInB-x0)*TMath::Sin(theta);
     384             : 
     385           1 :         Float_t supportPosXInC = constants->CenterModulePositionX(1)-deltaXA;
     386           1 :         Float_t supportPosXInPC = x0+(supportPosXInC-x0)*TMath::Cos(theta)-(supportPosYInA-y0)*TMath::Sin(theta);
     387           1 :         Float_t supportPosYInPC = y0+(supportPosYInA-y0)*TMath::Cos(theta)+(supportPosXInC-x0)*TMath::Sin(theta);
     388             : 
     389           1 :         Float_t supportPosXInD = constants->CenterModulePositionX(1)-deltaXB;
     390           1 :         Float_t supportPosXInPD = x0+(supportPosXInD-x0)*TMath::Cos(theta)-(supportPosYInA-y0)*TMath::Sin(theta);
     391           1 :         Float_t supportPosYInPD = y0+(supportPosYInA-y0)*TMath::Cos(theta)+(supportPosXInD-x0)*TMath::Sin(theta);
     392             : 
     393             : 
     394           2 :         acordeFullSupportInFace->AddNode(acordeMainSupport,1,new TGeoCombiTrans("ACOFSBIN01",supportPosXInPA,supportPosYInPA,supportPosZInIn,idrotm232));
     395           2 :         acordeFullSupportInFace->AddNode(acordeMainSupport,2,new TGeoCombiTrans("ACOFSBIN02",supportPosXInPB,supportPosYInPB,supportPosZInIn,idrotm232));
     396           2 :         acordeFullSupportInFace->AddNode(acordeMainSupport,3,new TGeoCombiTrans("ACOFSBIN03",supportPosXInPC,supportPosYInPC,supportPosZInIn,idrotm232));
     397           2 :         acordeFullSupportInFace->AddNode(acordeMainSupport,4,new TGeoCombiTrans("ACOFSBIN04",supportPosXInPD,supportPosYInPD,supportPosZInIn,idrotm232));
     398             : 
     399           1 :         Float_t supportPosXInE = constants->CenterModulePositionX(10)+deltaXA;
     400             :         Float_t supportPosYInE = 806.312-7.5-5.5;
     401           1 :         Float_t x00 = constants->CenterModulePositionX(10);
     402           1 :         Float_t y00 = constants->CenterModulePositionY(10);
     403           1 :         Float_t supportPosXInPE = x00+(supportPosXInE-x00)*TMath::Cos(theta)-(supportPosYInE-y00)*TMath::Sin(theta);
     404           1 :         Float_t supportPosYInPE = y00+(supportPosYInE-y00)*TMath::Cos(theta)+(supportPosXInE-x00)*TMath::Sin(theta);
     405             : 
     406           1 :         Float_t supportPosXInF = constants->CenterModulePositionX(10)+deltaXB;
     407           1 :         Float_t supportPosXInPF = x00+(supportPosXInF-x00)*TMath::Cos(theta)-(supportPosYInE-y00)*TMath::Sin(theta);
     408           1 :         Float_t supportPosYInPF = y00+(supportPosYInE-y00)*TMath::Cos(theta)+(supportPosXInF-x00)*TMath::Sin(theta);
     409             : 
     410           1 :         Float_t supportPosXInG = constants->CenterModulePositionX(10)-deltaXA+100;
     411           1 :         Float_t supportPosXInPG = x00+(supportPosXInG-x00)*TMath::Cos(theta)-(supportPosYInE-y00)*TMath::Sin(theta);
     412           1 :         Float_t supportPosYInPG = y00+(supportPosYInE-y00)*TMath::Cos(theta)+(supportPosXInG-x00)*TMath::Sin(theta);
     413             : 
     414           2 :         acordeFullSupportInFace->AddNode(acordeMainSupport,5,new TGeoCombiTrans("ACOFSBIN05",supportPosXInPE,supportPosYInPE,supportPosZInIn,idrotm232));
     415           2 :         acordeFullSupportInFace->AddNode(acordeMainSupport,6,new TGeoCombiTrans("ACOFSBIN06",supportPosXInPF,supportPosYInPF,supportPosZInIn,idrotm232));
     416           2 :         acordeFullSupportInFace->AddNode(acordeMainSupport,7,new TGeoCombiTrans("ACOFSBIN07",supportPosXInPG,supportPosYInPG,supportPosZInIn,idrotm232));
     417             : 
     418             :         // Put the bars in the main volume acordeFullSupportInFace
     419             : 
     420             :         Int_t barIndexIn = 8;
     421             : 
     422          10 :         for (Int_t iBarModule=1; iBarModule<9; iBarModule+=2)
     423             :         {
     424           4 :                 Float_t barPosXInIn = constants->CenterModulePositionX(iBarModule)+deltaXA;
     425             :                 Float_t barPosYInIn = supportPosYInA-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     426           4 :                 Float_t barPosZInIn = constants->CenterModulePositionZ(iBarModule);
     427           4 :                 Float_t barPosXInP = x0+(barPosXInIn-x0)*TMath::Cos(theta)-(barPosYInIn-y0)*TMath::Sin(theta);
     428           4 :                 Float_t barPosYInP = y0+(barPosYInIn-y0)*TMath::Cos(theta)+(barPosXInIn-x0)*TMath::Sin(theta);
     429             : 
     430           4 :                 Float_t barPosXInInA = constants->CenterModulePositionX(iBarModule)+deltaXB;
     431             :                 Float_t barPosYInInA = supportPosYInA-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     432           4 :                 Float_t barPosZInInA = constants->CenterModulePositionZ(iBarModule);
     433           4 :                 Float_t barPosXInPA = x0+(barPosXInInA-x0)*TMath::Cos(theta)-(barPosYInInA-y0)*TMath::Sin(theta);
     434           4 :                 Float_t barPosYInPA = y0+(barPosYInInA-y0)*TMath::Cos(theta)+(barPosXInInA-x0)*TMath::Sin(theta);
     435             : 
     436           4 :                 Float_t barPosXInInB = constants->CenterModulePositionX(iBarModule)-deltaXA;
     437             :                 Float_t barPosYInInB = supportPosYInA-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     438           4 :                 Float_t barPosZInInB = constants->CenterModulePositionZ(iBarModule);
     439           4 :                 Float_t barPosXInPB = x0+(barPosXInInB-x0)*TMath::Cos(theta)-(barPosYInInB-y0)*TMath::Sin(theta);
     440           4 :                 Float_t barPosYInPB = y0+(barPosYInInB-y0)*TMath::Cos(theta)+(barPosXInInB-x0)*TMath::Sin(theta);
     441             : 
     442           4 :                 Float_t barPosXInInC = constants->CenterModulePositionX(iBarModule)-deltaXB;
     443             :                 Float_t barPosYInInC = supportPosYInA-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     444           4 :                 Float_t barPosZInInC = constants->CenterModulePositionZ(iBarModule);
     445           4 :                 Float_t barPosXInPC = x0+(barPosXInInC-x0)*TMath::Cos(theta)-(barPosYInInC-y0)*TMath::Sin(theta);
     446           4 :                 Float_t barPosYInPC = y0+(barPosYInInC-y0)*TMath::Cos(theta)+(barPosXInInC-x0)*TMath::Sin(theta);
     447             : 
     448           8 :                 acordeFullSupportInFace->AddNode(acordeMainBar,barIndexIn,new TGeoCombiTrans("ACOFSBIN08",barPosXInP,barPosYInP,barPosZInIn,idrotm232));
     449           8 :                 acordeFullSupportInFace->AddNode(acordeMainBar,barIndexIn+1,new TGeoCombiTrans("ACOFSBIN09",barPosXInPA,barPosYInPA,barPosZInInA,idrotm232));
     450           8 :                 acordeFullSupportInFace->AddNode(acordeMainBar,barIndexIn+2,new TGeoCombiTrans("ACOFSBIN10",barPosXInPB,barPosYInPB,barPosZInInB,idrotm232));
     451           8 :                 acordeFullSupportInFace->AddNode(acordeMainBar,barIndexIn+3,new TGeoCombiTrans("ACOFSBIN11",barPosXInPC,barPosYInPC,barPosZInInC,idrotm232));
     452             : 
     453           4 :                 barIndexIn+=4;
     454             :         }
     455             : 
     456          12 :         for (Int_t iBarModule=10; iBarModule<20; iBarModule+=2)
     457             :         {
     458           5 :                 Float_t barPosXInIn = constants->CenterModulePositionX(iBarModule)+deltaXA;
     459             :                 Float_t barPosYInIn = supportPosYInE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     460           5 :                 Float_t barPosZInIn = constants->CenterModulePositionZ(iBarModule);
     461           5 :                 Float_t barPosXInP = x00+(barPosXInIn-x00)*TMath::Cos(theta)-(barPosYInIn-y00)*TMath::Sin(theta);
     462           5 :                 Float_t barPosYInP = y00+(barPosYInIn-y00)*TMath::Cos(theta)+(barPosXInIn-x00)*TMath::Sin(theta);
     463             : 
     464           5 :                 Float_t barPosXInInA = constants->CenterModulePositionX(iBarModule)+deltaXB;
     465             :                 Float_t barPosYInInA = supportPosYInE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     466           5 :                 Float_t barPosZInInA = constants->CenterModulePositionZ(iBarModule);
     467           5 :                 Float_t barPosXInPA = x00+(barPosXInInA-x00)*TMath::Cos(theta)-(barPosYInInA-y00)*TMath::Sin(theta);
     468           5 :                 Float_t barPosYInPA = y00+(barPosYInInA-y00)*TMath::Cos(theta)+(barPosXInInA-x00)*TMath::Sin(theta);
     469             : 
     470           5 :                 Float_t barPosXInInB = constants->CenterModulePositionX(iBarModule)-deltaXA+100;
     471             :                 Float_t barPosYInInB = supportPosYInE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     472           5 :                 Float_t barPosZInInB = constants->CenterModulePositionZ(iBarModule);
     473           5 :                 Float_t barPosXInPB = x00+(barPosXInInB-x00)*TMath::Cos(theta)-(barPosYInInB-y00)*TMath::Sin(theta);
     474           5 :                 Float_t barPosYInPB = y00+(barPosYInInB-y00)*TMath::Cos(theta)+(barPosXInInB-x00)*TMath::Sin(theta);
     475             : 
     476          10 :                 acordeFullSupportInFace->AddNode(acordeMainBar,barIndexIn,new TGeoCombiTrans("ACOFSBIN08",barPosXInP,barPosYInP,barPosZInIn,idrotm232));
     477          10 :                 acordeFullSupportInFace->AddNode(acordeMainBar,barIndexIn+1,new TGeoCombiTrans("ACOFSBIN09",barPosXInPA,barPosYInPA,barPosZInInA,idrotm232));
     478          10 :                 acordeFullSupportInFace->AddNode(acordeMainBar,barIndexIn+2,new TGeoCombiTrans("ACOFSBIN10",barPosXInPB,barPosYInPB,barPosZInInB,idrotm232));
     479             : 
     480           5 :                 barIndexIn+=4;
     481             :         }
     482             : 
     483             : 
     484             :         // Construction of the support and bars for the OutSide
     485             : 
     486             : 
     487           2 :         TGeoVolume *acordeFullSupportOutFace = new TGeoVolumeAssembly("ACORDE_FULL_SUPPORT_OUTFACE");
     488           1 :         Float_t supportPosXOutA = constants->CenterModulePositionX(45)+deltaXA-90;
     489             :         Float_t supportPosYOutA = 807.2915-7.5-5.5;
     490           1 :         Float_t x000 = constants->CenterModulePositionX(45);
     491           1 :         Float_t y000 = constants->CenterModulePositionY(45);
     492           1 :         Float_t theta1 = 1*TMath::Pi()/4;
     493             : 
     494           1 :         Float_t supportPosXOutPA = x000+(supportPosXOutA-x000)*TMath::Cos(theta1)-(supportPosYOutA-y000)*TMath::Sin(theta1);
     495           1 :         Float_t supportPosYOutPA = y000+(supportPosYOutA-y000)*TMath::Cos(theta1)+(supportPosXOutA-x000)*TMath::Sin(theta1);
     496             :         Float_t supportPosZOutIn = 0;
     497             : 
     498             : 
     499           1 :         Float_t supportPosXOutC = constants->CenterModulePositionX(45)-deltaXA;
     500           1 :         Float_t supportPosXOutPC = x000+(supportPosXOutC-x000)*TMath::Cos(theta1)-(supportPosYOutA-1-y000)*TMath::Sin(theta1);
     501           1 :         Float_t supportPosYOutPC = y000+(supportPosYOutA-1-y000)*TMath::Cos(theta1)+(supportPosXOutC-x000)*TMath::Sin(theta1);
     502             : 
     503           1 :         Float_t supportPosXOutD = constants->CenterModulePositionX(45)-deltaXB;
     504           1 :         Float_t supportPosXOutPD = x000+(supportPosXOutD-x000)*TMath::Cos(theta1)-(supportPosYOutA-1-y000)*TMath::Sin(theta1);
     505           1 :         Float_t supportPosYOutPD = y000+(supportPosYOutA-1-y000)*TMath::Cos(theta1)+(supportPosXOutD-x000)*TMath::Sin(theta1);
     506             : 
     507             : 
     508           2 :         acordeFullSupportOutFace->AddNode(acordeMainSupport,1,new TGeoCombiTrans("ACOFSBOUT01",supportPosXOutPA,supportPosYOutPA,supportPosZOutIn,idrotm231));
     509           2 :         acordeFullSupportOutFace->AddNode(acordeMainSupport,2,new TGeoCombiTrans("ACOFSBOUT02",supportPosXOutPC,supportPosYOutPC,supportPosZOutIn,idrotm231));
     510           2 :         acordeFullSupportOutFace->AddNode(acordeMainSupport,3,new TGeoCombiTrans("ACOFSBOUT03",supportPosXOutPD,supportPosYOutPD,supportPosZOutIn,idrotm231));
     511             :         
     512             : 
     513           1 :         Float_t supportPosXOutE = constants->CenterModulePositionX(52)+deltaXA;
     514             :         Float_t supportPosYOutE = 585.616-7.5-5.5-0.1;
     515           1 :         Float_t x0000 = constants->CenterModulePositionX(52);
     516           1 :         Float_t y0000 = constants->CenterModulePositionY(52);
     517             : 
     518           1 :         Float_t supportPosXOutEP = x0000+(supportPosXOutE-x0000)*TMath::Cos(theta1)-(supportPosYOutE-y0000)*TMath::Sin(theta1);
     519           1 :         Float_t supportPosYOutEP = y0000+(supportPosYOutE-y0000)*TMath::Cos(theta1)+(supportPosXOutE-x0000)*TMath::Sin(theta1);
     520             :         
     521           1 :         Float_t supportPosXOutF = constants->CenterModulePositionX(52)+deltaXB;
     522             : 
     523           1 :         Float_t supportPosXOutFP = x0000+(supportPosXOutF-x0000)*TMath::Cos(theta1)-(supportPosYOutE-y0000)*TMath::Sin(theta1);
     524           1 :         Float_t supportPosYOutFP = y0000+(supportPosYOutE-y0000)*TMath::Cos(theta1)+(supportPosXOutF-x0000)*TMath::Sin(theta1);
     525             : 
     526           1 :         Float_t supportPosXOutG = constants->CenterModulePositionX(52)-deltaXA;
     527           1 :         Float_t supportPosXOutGP = x0000+(supportPosXOutG-x0000)*TMath::Cos(theta1)-(supportPosYOutE-y0000)*TMath::Sin(theta1);
     528           1 :         Float_t supportPosYOutGP = y0000+(supportPosYOutE-y0000)*TMath::Cos(theta1)+(supportPosXOutG-x0000)*TMath::Sin(theta1);
     529             : 
     530           1 :         Float_t supportPosXOutH = constants->CenterModulePositionX(52)-deltaXB;
     531           1 :         Float_t supportPosXOutHP = x0000+(supportPosXOutH-x0000)*TMath::Cos(theta1)-(supportPosYOutE-0.4-y0000)*TMath::Sin(theta1);
     532           1 :         Float_t supportPosYOutHP = y0000+(supportPosYOutE-0.4-y0000)*TMath::Cos(theta1)+(supportPosXOutH-x0000)*TMath::Sin(theta1);
     533             : 
     534             : 
     535           2 :         acordeFullSupportOutFace->AddNode(acordeMainSupport,4,new TGeoCombiTrans("ACOFSBOUT04",supportPosXOutEP,supportPosYOutEP,supportPosZOutIn,idrotm231));
     536           2 :         acordeFullSupportOutFace->AddNode(acordeMainSupport,5,new TGeoCombiTrans("ACOFSBOUT05",supportPosXOutFP,supportPosYOutFP,supportPosZOutIn,idrotm231));
     537           2 :         acordeFullSupportOutFace->AddNode(acordeMainSupport,6,new TGeoCombiTrans("ACOFSBOUT06",supportPosXOutGP,supportPosYOutGP,supportPosZOutIn,idrotm231));
     538           2 :         acordeFullSupportOutFace->AddNode(acordeMainSupport,7,new TGeoCombiTrans("ACOFSBOUT07",supportPosXOutHP,supportPosYOutHP,supportPosZOutIn,idrotm231));
     539             : 
     540             :         // Put the bars of the PutFace Side 2 L3-Magnet
     541             : 
     542             : 
     543             :         Int_t indexBar0=8;
     544          12 :         for(Int_t iAcoBar = 40;iAcoBar < 50 ; iAcoBar+=2)
     545             :         {
     546           5 :                 Float_t barPosXOutIn = constants->CenterModulePositionX(iAcoBar)+deltaXA-90;
     547             :                 Float_t barPosYOutIn = supportPosYOutA-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     548           5 :                 Float_t barPosZOutIn = constants->CenterModulePositionZ(iAcoBar);
     549           5 :                 Float_t barPosXOutP = x000+(barPosXOutIn-x000)*TMath::Cos(theta1)-(barPosYOutIn-y000)*TMath::Sin(theta1);
     550           5 :                 Float_t barPosYOutP = y000+(barPosYOutIn-y000)*TMath::Cos(theta1)+(barPosXOutIn-x000)*TMath::Sin(theta1);
     551             : 
     552           5 :                 Float_t barPosXOutInA = constants->CenterModulePositionX(iAcoBar)-deltaXA;
     553             :                 Float_t barPosYOutInA = supportPosYOutA-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5-1.;
     554           5 :                 Float_t barPosZOutInA = constants->CenterModulePositionZ(iAcoBar);
     555           5 :                 Float_t barPosXOutPA = x000+(barPosXOutInA-x000)*TMath::Cos(theta1)-(barPosYOutInA-y000)*TMath::Sin(theta1);
     556           5 :                 Float_t barPosYOutPA = y000+(barPosYOutInA-y000)*TMath::Cos(theta1)+(barPosXOutInA-x000)*TMath::Sin(theta1);
     557             : 
     558             : 
     559           5 :                 Float_t barPosXOutInB = constants->CenterModulePositionX(iAcoBar)-deltaXB;
     560             :                 Float_t barPosYOutInB = supportPosYOutA-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5-1.;
     561           5 :                 Float_t barPosZOutInB = constants->CenterModulePositionZ(iAcoBar);
     562           5 :                 Float_t barPosXOutPB = x000+(barPosXOutInB-x000)*TMath::Cos(theta1)-(barPosYOutInB-y000)*TMath::Sin(theta1);
     563           5 :                 Float_t barPosYOutPB = y000+(barPosYOutInB-y000)*TMath::Cos(theta1)+(barPosXOutInB-x000)*TMath::Sin(theta1);
     564             :         
     565          10 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutP,barPosYOutP,barPosZOutIn,idrotm231));
     566          10 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+1,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPA,barPosYOutPA,barPosZOutInA,idrotm231));
     567          10 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+2,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPB,barPosYOutPB,barPosZOutInB,idrotm231));
     568             : 
     569           5 :                 indexBar0+=4;
     570             :         }
     571           6 :         for(Int_t iAcoBar = 51;iAcoBar < 54 ; iAcoBar+=2)
     572             :         {
     573             : 
     574           2 :                 Float_t barPosXOutInC = constants->CenterModulePositionX(iAcoBar)+deltaXA;
     575             :                 Float_t barPosYOutInC = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     576           2 :                 Float_t barPosZOutInC = constants->CenterModulePositionZ(iAcoBar);
     577           2 :                 Float_t barPosXOutPC = x0000+(barPosXOutInC-x0000)*TMath::Cos(theta1)-(barPosYOutInC-y0000)*TMath::Sin(theta1);
     578           2 :                 Float_t barPosYOutPC = y0000+(barPosYOutInC-y0000)*TMath::Cos(theta1)+(barPosXOutInC-x0000)*TMath::Sin(theta1);
     579             : 
     580             : 
     581           2 :                 Float_t barPosXOutInD = constants->CenterModulePositionX(iAcoBar)+deltaXB;
     582             :                 Float_t barPosYOutInD = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     583           2 :                 Float_t barPosZOutInD = constants->CenterModulePositionZ(iAcoBar);
     584           2 :                 Float_t barPosXOutPD = x0000+(barPosXOutInD-x0000)*TMath::Cos(theta1)-(barPosYOutInD-y0000)*TMath::Sin(theta1);
     585           2 :                 Float_t barPosYOutPD = y0000+(barPosYOutInD-y0000)*TMath::Cos(theta1)+(barPosXOutInD-x0000)*TMath::Sin(theta1);
     586             : 
     587             : 
     588           2 :                 Float_t barPosXOutInE = constants->CenterModulePositionX(iAcoBar)-deltaXA;
     589             :                 Float_t barPosYOutInE = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     590           2 :                 Float_t barPosZOutInE = constants->CenterModulePositionZ(iAcoBar);
     591           2 :                 Float_t barPosXOutPE = x0000+(barPosXOutInE-x0000)*TMath::Cos(theta1)-(barPosYOutInE-y0000)*TMath::Sin(theta1);
     592           2 :                 Float_t barPosYOutPE = y0000+(barPosYOutInE-y0000)*TMath::Cos(theta1)+(barPosXOutInE-x0000)*TMath::Sin(theta1);
     593           2 :                 Float_t barPosXOutInF = constants->CenterModulePositionX(iAcoBar)-deltaXB;
     594             :                 Float_t barPosYOutInF = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     595           2 :                 Float_t barPosZOutInF = constants->CenterModulePositionZ(iAcoBar);
     596           2 :                 Float_t barPosXOutPF = x0000+(barPosXOutInF-x0000)*TMath::Cos(theta1)-(barPosYOutInF-0.4-y0000)*TMath::Sin(theta1);
     597           2 :                 Float_t barPosYOutPF = y0000+(barPosYOutInF-0.4-y0000)*TMath::Cos(theta1)+(barPosXOutInF-x0000)*TMath::Sin(theta1);
     598             : 
     599           4 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPC,barPosYOutPC,barPosZOutInC,idrotm231));
     600           4 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+1,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPD,barPosYOutPD,barPosZOutInD,idrotm231));
     601           4 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+2,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPE,barPosYOutPE,barPosZOutInE,idrotm231));
     602           4 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+3,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPF,barPosYOutPF,barPosZOutInF,idrotm231));
     603           2 :                 indexBar0+=4;
     604             :         }
     605             : 
     606             : 
     607           4 :         for(Int_t iAcoBar = 57;iAcoBar < 58 ; iAcoBar+=2)
     608             :         {
     609             : 
     610           1 :                 Float_t barPosXOutInC = constants->CenterModulePositionX(iAcoBar)+deltaXA;
     611             :                 Float_t barPosYOutInC = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     612           1 :                 Float_t barPosZOutInC = constants->CenterModulePositionZ(iAcoBar);
     613           1 :                 Float_t barPosXOutPC = x0000+(barPosXOutInC-x0000)*TMath::Cos(theta1)-(barPosYOutInC-y0000)*TMath::Sin(theta1);
     614           1 :                 Float_t barPosYOutPC = y0000+(barPosYOutInC-y0000)*TMath::Cos(theta1)+(barPosXOutInC-x0000)*TMath::Sin(theta1);
     615             : 
     616             : 
     617           1 :                 Float_t barPosXOutInD = constants->CenterModulePositionX(iAcoBar)+deltaXB;
     618             :                 Float_t barPosYOutInD = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     619           1 :                 Float_t barPosZOutInD = constants->CenterModulePositionZ(iAcoBar);
     620           1 :                 Float_t barPosXOutPD = x0000+(barPosXOutInD-x0000)*TMath::Cos(theta1)-(barPosYOutInD-y0000)*TMath::Sin(theta1);
     621           1 :                 Float_t barPosYOutPD = y0000+(barPosYOutInD-y0000)*TMath::Cos(theta1)+(barPosXOutInD-x0000)*TMath::Sin(theta1);
     622             : 
     623             : 
     624           1 :                 Float_t barPosXOutInE = constants->CenterModulePositionX(iAcoBar)-deltaXA;
     625             :                 Float_t barPosYOutInE = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     626           1 :                 Float_t barPosZOutInE = constants->CenterModulePositionZ(iAcoBar);
     627           1 :                 Float_t barPosXOutPE = x0000+(barPosXOutInE-x0000)*TMath::Cos(theta1)-(barPosYOutInE-y0000)*TMath::Sin(theta1);
     628           1 :                 Float_t barPosYOutPE = y0000+(barPosYOutInE-y0000)*TMath::Cos(theta1)+(barPosXOutInE-x0000)*TMath::Sin(theta1);
     629           1 :                 Float_t barPosXOutInF = constants->CenterModulePositionX(iAcoBar)-deltaXB;
     630             :                 Float_t barPosYOutInF = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     631           1 :                 Float_t barPosZOutInF = constants->CenterModulePositionZ(iAcoBar);
     632           1 :                 Float_t barPosXOutPF = x0000+(barPosXOutInF-x0000)*TMath::Cos(theta1)-(barPosYOutInF-0.4-y0000)*TMath::Sin(theta1);
     633           1 :                 Float_t barPosYOutPF = y0000+(barPosYOutInF-0.4-y0000)*TMath::Cos(theta1)+(barPosXOutInF-x0000)*TMath::Sin(theta1);
     634             : 
     635           2 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPC,barPosYOutPC,barPosZOutInC,idrotm231));
     636           2 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+1,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPD,barPosYOutPD,barPosZOutInD,idrotm231));
     637           2 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+2,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPE,barPosYOutPE,barPosZOutInE,idrotm231));
     638           2 :                 acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+3,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPF,barPosYOutPF,barPosZOutInF,idrotm231));
     639           1 :                 indexBar0+=4;
     640             :         }
     641             : 
     642             : 
     643           1 :         Float_t barPosXOutInC = constants->CenterModulePositionX(52)+deltaXA;
     644             :         Float_t barPosYOutInC = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     645           1 :         Float_t barPosZOutInC = constants->CenterModulePositionZ(55);
     646           1 :         Float_t barPosXOutPC = x0000+(barPosXOutInC-x0000)*TMath::Cos(theta1)-(barPosYOutInC-y0000)*TMath::Sin(theta1);
     647           1 :         Float_t barPosYOutPC = y0000+(barPosYOutInC-y0000)*TMath::Cos(theta1)+(barPosXOutInC-x0000)*TMath::Sin(theta1);
     648             : 
     649             : 
     650           1 :         Float_t barPosXOutInD = constants->CenterModulePositionX(52)+deltaXB;
     651             :         Float_t barPosYOutInD = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     652           1 :         Float_t barPosXOutPD = x0000+(barPosXOutInD-x0000)*TMath::Cos(theta1)-(barPosYOutInD-y0000)*TMath::Sin(theta1);
     653           1 :         Float_t barPosYOutPD = y0000+(barPosYOutInD-y0000)*TMath::Cos(theta1)+(barPosXOutInD-x0000)*TMath::Sin(theta1);
     654             : 
     655             : 
     656           1 :         Float_t barPosXOutInE = constants->CenterModulePositionX(52)-deltaXA;
     657             :         Float_t barPosYOutInE = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     658           1 :         Float_t barPosXOutPE = x0000+(barPosXOutInE-x0000)*TMath::Cos(theta1)-(barPosYOutInE-y0000)*TMath::Sin(theta1);
     659           1 :         Float_t barPosYOutPE = y0000+(barPosYOutInE-y0000)*TMath::Cos(theta1)+(barPosXOutInE-x0000)*TMath::Sin(theta1);
     660           1 :         Float_t barPosXOutInF = constants->CenterModulePositionX(52)-deltaXB;
     661             :         Float_t barPosYOutInF = supportPosYOutE-boxSingleBar[1]-boxUnionUp[1]-boxUnionDown[1]-7.5;
     662           1 :         Float_t barPosXOutPF = x0000+(barPosXOutInF-x0000)*TMath::Cos(theta1)-(barPosYOutInF-0.4-y0000)*TMath::Sin(theta1);
     663           1 :         Float_t barPosYOutPF = y0000+(barPosYOutInF-0.4-y0000)*TMath::Cos(theta1)+(barPosXOutInF-x0000)*TMath::Sin(theta1);
     664             : 
     665           2 :         acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPC,barPosYOutPC,barPosZOutInC,idrotm231));
     666           2 :         acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+1,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPD,barPosYOutPD,barPosZOutInC,idrotm231));
     667           2 :         acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+2,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPE,barPosYOutPE,barPosZOutInC,idrotm231));
     668           2 :         acordeFullSupportOutFace->AddNode(acordeMainBar,indexBar0+3,new TGeoCombiTrans("ACOFSBOUT08",barPosXOutPF,barPosYOutPF,barPosZOutInC,idrotm231));
     669             :         
     670             : 
     671             : 
     672             : 
     673             : 
     674           1 :         supportBars->AddNode(acordeFullSupportUpFace,1);
     675           1 :         supportBars->AddNode(acordeFullSupportInFace,2);
     676           1 :         supportBars->AddNode(acordeFullSupportOutFace,3);
     677           1 :         acorde->AddNode(acordeModules,1);
     678           1 :         acorde->AddNode(supportBars,2);
     679           1 :         alice->AddNode(acorde,1);//---> put volume of ACORDE over ALICE's volume
     680             : 
     681             : 
     682             : 
     683           1 : }
     684             : //__________________________________________________________________________
     685             : 
     686             : void AliACORDEv1::Init()
     687             : {
     688             :   // Initialise L3 magnet after it has been built
     689             :   Int_t i;
     690           2 :   if(AliLog::GetGlobalDebugLevel()>0) {
     691           0 :     printf("\n%s: ",ClassName());
     692           0 :     for(i=0;i<35;i++) printf("*");
     693           0 :     printf(" ACORDEv1_INIT ");
     694           0 :     for(i=0;i<35;i++) printf("*");
     695           0 :     printf("\n%s: ",ClassName());
     696             :     // Here the ACORDEv initialisation code (if any!)
     697           0 :     for(i=0;i<80;i++) printf("*");
     698           0 :     printf("\n");
     699           0 :   }
     700             :  // AliACORDE::Init();  
     701           1 : }
     702             : //____________________________________________________________________________
     703             : void AliACORDEv1::StepManager()
     704             : {
     705             : 
     706             :   //
     707             :   // Called for every step in the Cosmic Ray Trigger
     708             :   //
     709             : 
     710             : 
     711             :   // volume: 
     712             :   //  [0] = module number 1-60 (1==>(0-0), 60 (5-9)
     713             :   //  [1] = Plastic number: 0 (down) to 1 (up)
     714             :   static Int_t   vol[2]; 
     715             :   //
     716             :   // hit
     717             :   // [0] = PID
     718             :   // [1-3] = x, y, z 
     719             :   // [4] = time 
     720             :   // [5-7] = px, py, pz
     721             :   // [8] = energy 
     722             :   // [9] = energy loss
     723             :   // [10] = length of track through plastic
     724             :   static Float_t hits[11];
     725             : 
     726             :   // local static variables
     727             :   static Float_t eloss;
     728             :   static Float_t step;
     729             :   // scintillator volume
     730          52 :  static Int_t idScint = TVirtualMC::GetMC()->VolId("ACORDESCINTILLATORMODULE");
     731             :   // local variables
     732          24 :   Int_t copy;
     733          24 :   TLorentzVector pos;
     734          24 :   TLorentzVector mom;
     735             : 
     736             :   // only charged tracks
     737         144 :   if ( !TVirtualMC::GetMC()->TrackCharge() || !TVirtualMC::GetMC()->IsTrackAlive() ) return;
     738             : 
     739             :   // only in sensitive material
     740          72 :   if (TVirtualMC::GetMC()->CurrentVolID(copy) == idScint) {
     741             : 
     742           0 :     step  += TVirtualMC::GetMC()->TrackStep();
     743           0 :     eloss += TVirtualMC::GetMC()->Edep();
     744             :     // set all hit variables except eloss which is resetted
     745             :     // set volume variables
     746           0 :     if (TVirtualMC::GetMC()->IsTrackEntering()) {
     747           0 :       eloss = 0.0;
     748           0 :       step = 0.0;
     749           0 :       TVirtualMC::GetMC()->TrackPosition(pos);
     750           0 :       TVirtualMC::GetMC()->TrackMomentum(mom);
     751             :       // hit
     752             :       // [0] = PID
     753             :       // [1-3] = x, y, z 
     754             :       // [4] = time 
     755             :       // [5-7] = px, py, pz
     756             :       // [8] = energy 
     757             :       // [9] = energy loss
     758           0 :       hits[0]  = (Float_t ) TVirtualMC::GetMC()->TrackPid(); 
     759             : 
     760             : 
     761           0 :       hits[1] = pos[0]; 
     762           0 :       hits[2] = pos[1]; 
     763           0 :       hits[3] = pos[2]; 
     764           0 :       hits[4] = TVirtualMC::GetMC()->TrackTime();
     765           0 :       hits[5] = mom[0];
     766           0 :       hits[6] = mom[1];
     767           0 :       hits[7] = mom[2];
     768           0 :       hits[8] = TVirtualMC::GetMC()->Etot();
     769             :       // volume: 
     770             :       //  [0] = module number 1-60 (1==>(0-0), 60 (5-9)
     771             :       //  [1] = Plastic number: 0 (down) to 1 (up)
     772           0 :       Int_t copyPlastic; // plastic: down=1, up=2
     773           0 :       Int_t copyModule; // module: 1-60
     774           0 :       TVirtualMC::GetMC()->CurrentVolID(copyPlastic);
     775           0 :       TVirtualMC::GetMC()->CurrentVolOffID(1, copyModule);
     776             :       // module
     777           0 :       vol[0] = copyModule;
     778             :       // plastic: 0 = down, 1 = up
     779           0 :       vol[1] = copyPlastic - 4 ; // !!!!!!!
     780             :     // vol[1] = copyPlastic;
     781           0 :     } // end if TVirtualMC::GetMC()->IsTrackEntering()
     782             : 
     783             :     // set hit[9] = total energy loss and book hit
     784           0 :     if( TVirtualMC::GetMC()->IsTrackExiting() || 
     785           0 :         TVirtualMC::GetMC()->IsTrackStop() || 
     786           0 :         TVirtualMC::GetMC()->IsTrackDisappeared()){
     787           0 :       hits[9] = eloss;
     788           0 :       hits[10] = step;
     789           0 :       eloss = 0.0;
     790           0 :       step = 0.0;
     791           0 :       AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
     792             :      }
     793             :   } 
     794             : 
     795             : 
     796             : 
     797          48 : }
     798             : 
     799             : //_____________________________________________________________________________
     800             : void AliACORDEv1::AddHit(Int_t track, Int_t *vol, Float_t *hits)
     801             : {
     802             :   //
     803             :   // Add an ACORDE hit
     804             :   //
     805           0 :   TClonesArray &lhits = *fHits;
     806           0 :   new(lhits[fNhits++]) AliACORDEhit(fIshunt,track,vol,hits);
     807           0 : }
     808             : 
     809             : //_____________________________________________________________________________
     810             : void AliACORDEv1::AddDigits(Int_t* track, Int_t module, Float_t time)
     811             : {
     812             :   
     813             :   // Adds Digit
     814             :   
     815           0 :   TClonesArray &ldigits = *fDigits;
     816           0 :   new(ldigits[fNdigits++]) AliACORDEdigit(track,module,time);
     817           0 : }
     818             : //_____________________________________________________________________________
     819             : 
     820             : void AliACORDEv1::MakeBranch(Option_t *option)
     821             : {
     822             : // Creates new branches in the current Root Tree
     823             :     
     824           8 :   char branchname[10];
     825           4 :   snprintf(branchname,9,"%s",GetName());
     826          12 :   AliDebug(2,Form("fBufferSize = %d",fBufferSize));
     827           4 :   const char *cH = strstr(option,"H");
     828           8 :   if (fHits   && fLoader->TreeH() && cH) {
     829           4 :     fLoader->TreeH()->Branch(branchname,&fHits, fBufferSize);
     830          12 :     AliDebug(2,Form("Making Branch %s for hits",branchname));
     831             :   }     
     832           4 :   const char *cD = strstr(option,"D");
     833           4 :   if (fDigits   && fLoader->TreeD() && cD) {
     834           0 :     fLoader->TreeD()->Branch(branchname,&fDigits, fBufferSize);
     835           0 :     AliDebug(2,Form("Making Branch %s for digits",branchname));
     836             :   }  
     837           4 : }
     838             : 
     839             : //_____________________________________________________________________________
     840             : void AliACORDEv1::AddAlignableVolumes() const
     841             : {
     842             :   //
     843             :   // Create entries for alignable volumes associating the symbolic volume
     844             :   // name with the corresponding volume path. Needs to be syncronized with
     845             :   // eventual changes in the geometry.
     846             :   // 
     847             : 
     848             :         // The alignable volumes are only the "ACORDE_MODULE_%d"
     849             :         //
     850             :         //      Structure of ACORDE's Geometry
     851             :         //
     852             :         //      ALIC_1
     853             :         //          |---> ACORDE_1   
     854             :         //                      |----> ALL_ACORDE_MODULES_1/ACORDE_MODULE_%d (d:0->to->59)
     855             :         //                      |----> ACORDE_SUPPORT_BARS_2    |--> BARS&SUPPORTS
     856             :         //
     857             :         //     Send comments to: Mario Rodriguez Cahuantzi <mrodrigu@mail.cern.ch>
     858             : 
     859           2 :         TString vpstr1 = "ALIC_1/ACORDE_1/ALL_ACORDE_MODULES_1/ACORDE_MODULE_";
     860           1 :         TString snstr1 = "ACORDE/Array";
     861           2 :         TString volpath, symname;
     862         122 :         for(Int_t dy=0; dy<60 ; dy++)
     863             :         {
     864          60 :                 volpath = vpstr1;
     865          60 :                 volpath += dy;
     866          60 :                 symname = snstr1;
     867          60 :                 symname += dy;
     868         240 :                 if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data()))
     869           0 :                 AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", symname.Data(),volpath.Data()));
     870             :         }
     871           1 : }

Generated by: LCOV version 1.11