LCOV - code coverage report
Current view: top level - ZDC/ZDCsim - AliZDCv3.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 1467 0.1 %
Date: 2016-06-14 17:26:59 Functions: 1 13 7.7 %

          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             : 
      17             : ///////////////////////////////////////////////////////////////////////
      18             : //                                                                   //
      19             : //              AliZDCv3 --- new ZDC geometry                        //
      20             : //          with both ZDC arms geometry implemented                  //
      21             : //                                                                   //  
      22             : ///////////////////////////////////////////////////////////////////////
      23             : 
      24             : // --- Standard libraries
      25             : #include "stdio.h"
      26             : 
      27             : // --- ROOT system
      28             : #include <TMath.h>
      29             : #include <TRandom.h>
      30             : #include <TSystem.h>
      31             : #include <TTree.h>
      32             : #include <TVirtualMC.h>
      33             : #include <TGeoManager.h>
      34             : #include <TGeoMatrix.h>
      35             : #include <TGeoTube.h>
      36             : #include <TGeoCone.h>
      37             : #include <TGeoShape.h>
      38             : #include <TGeoScaledShape.h>
      39             : #include <TGeoCompositeShape.h>
      40             : #include <TParticle.h>
      41             : 
      42             : // --- AliRoot classes
      43             : #include "AliLog.h"
      44             : #include "AliConst.h"
      45             : #include "AliMagF.h"
      46             : #include "AliRun.h"
      47             : #include "AliZDCv3.h"
      48             : #include "AliMC.h"
      49             :  
      50             : class  AliZDCHit;
      51             : class  AliPDG;
      52             : class  AliDetector;
      53             :  
      54             :  
      55          12 : ClassImp(AliZDCv3)
      56             : 
      57             : //_____________________________________________________________________________
      58             : AliZDCv3::AliZDCv3() : 
      59           0 :   AliZDC(),
      60           0 :   fMedSensF1(0),
      61           0 :   fMedSensF2(0),
      62           0 :   fMedSensZP(0),
      63           0 :   fMedSensZN(0),
      64           0 :   fMedSensZEM(0),
      65           0 :   fMedSensGR(0),
      66           0 :   fMedSensPI(0),
      67           0 :   fMedSensTDI(0),
      68           0 :   fMedSensVColl(0),
      69           0 :   fMedSensLumi(0),
      70           0 :   fNalfan(0),
      71           0 :   fNalfap(0),
      72           0 :   fNben(0),  
      73           0 :   fNbep(0),
      74           0 :   fZEMLength(0),
      75           0 :   fpLostITC(0), 
      76           0 :   fpLostD1C(0), 
      77           0 :   fpcVCollC(0),
      78           0 :   fpDetectedC(0),
      79           0 :   fnDetectedC(0),
      80           0 :   fpLostITA(0), 
      81           0 :   fpLostD1A(0), 
      82           0 :   fpLostTDI(0), 
      83           0 :   fpcVCollA(0),
      84           0 :   fpDetectedA(0),
      85           0 :   fnDetectedA(0),
      86           0 :   fVCollSideCAperture(7./2.),
      87           0 :   fVCollSideCApertureNeg(7./2.),
      88           0 :   fVCollSideCCentreY(0.),
      89           0 :   fVCollSideAAperture(7./2.),
      90           0 :   fVCollSideAApertureNeg(7./2.),
      91           0 :   fVCollSideACentreY(0.),
      92           0 :   fTCDDAperturePos(2.0),
      93           0 :   fTCDDApertureNeg(2.2),
      94           0 :   fTDIAperturePos(5.5),
      95           0 :   fTDIApertureNeg(5.5),
      96           0 :   fLumiLength(15.)
      97           0 : {
      98             :   //
      99             :   // Default constructor for Zero Degree Calorimeter
     100             :   //
     101           0 :   for(Int_t i=0; i<3; i++){
     102           0 :      fDimZN[i] = fDimZP[i] = 0.;
     103           0 :      fPosZNC[i] = fPosZNA[i] = fPosZPC[i]= fPosZPA[i] = fPosZEM[i] = 0.;
     104           0 :      fFibZN[i] = fFibZP[i] = 0.;
     105             :   }
     106           0 : }
     107             :  
     108             : //_____________________________________________________________________________
     109             : AliZDCv3::AliZDCv3(const char *name, const char *title) : 
     110           0 :   AliZDC(name,title),
     111           0 :   fMedSensF1(0),
     112           0 :   fMedSensF2(0),
     113           0 :   fMedSensZP(0),
     114           0 :   fMedSensZN(0),
     115           0 :   fMedSensZEM(0),
     116           0 :   fMedSensGR(0),
     117           0 :   fMedSensPI(0),
     118           0 :   fMedSensTDI(0),
     119           0 :   fMedSensVColl(0),
     120           0 :   fMedSensLumi(0),
     121           0 :   fNalfan(90),
     122           0 :   fNalfap(90),
     123           0 :   fNben(18),  
     124           0 :   fNbep(28), 
     125           0 :   fZEMLength(0),
     126           0 :   fpLostITC(0), 
     127           0 :   fpLostD1C(0), 
     128           0 :   fpcVCollC(0),
     129           0 :   fpDetectedC(0),
     130           0 :   fnDetectedC(0),
     131           0 :   fpLostITA(0), 
     132           0 :   fpLostD1A(0), 
     133           0 :   fpLostTDI(0), 
     134           0 :   fpcVCollA(0),
     135           0 :   fpDetectedA(0),
     136           0 :   fnDetectedA(0),
     137           0 :   fVCollSideCAperture(7./2.),
     138           0 :   fVCollSideCApertureNeg(7./2.),
     139           0 :   fVCollSideCCentreY(0.),
     140           0 :   fVCollSideAAperture(7./2.),
     141           0 :   fVCollSideAApertureNeg(7./2.),
     142           0 :   fVCollSideACentreY(0.),
     143           0 :   fTCDDAperturePos(2.0),
     144           0 :   fTCDDApertureNeg(2.2),
     145           0 :   fTDIAperturePos(5.5),
     146           0 :   fTDIApertureNeg(5.5),
     147           0 :   fLumiLength(15.)  
     148           0 : {
     149             :   //
     150             :   // Standard constructor for Zero Degree Calorimeter 
     151             :   //
     152             :   //
     153             :   // Check that DIPO, ABSO, DIPO and SHIL is there (otherwise tracking is wrong!!!)
     154             :   
     155           0 :   AliModule* pipe=gAlice->GetModule("PIPE");
     156           0 :   AliModule* abso=gAlice->GetModule("ABSO");
     157           0 :   AliModule* dipo=gAlice->GetModule("DIPO");
     158           0 :   AliModule* shil=gAlice->GetModule("SHIL");
     159           0 :   if((!pipe) || (!abso) || (!dipo) || (!shil)) {
     160           0 :     Error("Constructor","ZDC needs PIPE, ABSO, DIPO and SHIL!!!\n");
     161           0 :     exit(1);
     162             :   } 
     163             :   //
     164             :   Int_t ip,jp,kp;
     165           0 :   for(ip=0; ip<4; ip++){
     166           0 :      for(kp=0; kp<fNalfap; kp++){
     167           0 :         for(jp=0; jp<fNbep; jp++){
     168           0 :            fTablep[ip][kp][jp] = 0;
     169             :         } 
     170             :      }
     171             :   }
     172             :   Int_t in,jn,kn;
     173           0 :   for(in=0; in<4; in++){
     174           0 :      for(kn=0; kn<fNalfan; kn++){
     175           0 :         for(jn=0; jn<fNben; jn++){
     176           0 :            fTablen[in][kn][jn] = 0;
     177             :         } 
     178             :      }
     179             :   }
     180             :   //
     181             :   // Parameters for hadronic calorimeters geometry
     182             :   // Positions updated after post-installation measurements
     183           0 :   fDimZN[0] = 3.52;
     184           0 :   fDimZN[1] = 3.52;
     185           0 :   fDimZN[2] = 50.;  
     186           0 :   fDimZP[0] = 11.2;
     187           0 :   fDimZP[1] = 6.;
     188           0 :   fDimZP[2] = 75.;    
     189           0 :   fPosZNC[0] = 0.;
     190           0 :   fPosZNC[1] = 0.;
     191           0 :   fPosZNC[2] = -11397.3; 
     192           0 :   fPosZPC[0] = 24.35;
     193           0 :   fPosZPC[1] = 0.;
     194           0 :   fPosZPC[2] = -11389.3; 
     195           0 :   fPosZNA[0] = 0.;
     196           0 :   fPosZNA[1] = 0.;
     197           0 :   fPosZNA[2] = 11395.8;  
     198           0 :   fPosZPA[0] = 24.35;
     199           0 :   fPosZPA[1] = 0.;
     200           0 :   fPosZPA[2] = 11387.8; 
     201           0 :   fFibZN[0] = 0.;
     202           0 :   fFibZN[1] = 0.01825;
     203           0 :   fFibZN[2] = 50.;
     204           0 :   fFibZP[0] = 0.;
     205           0 :   fFibZP[1] = 0.0275;
     206           0 :   fFibZP[2] = 75.;
     207             :   // Parameters for EM calorimeter geometry
     208           0 :   fPosZEM[0] = 8.5;
     209           0 :   fPosZEM[1] = 0.;
     210           0 :   fPosZEM[2] = 735.;
     211           0 :   Float_t kDimZEMPb  = 0.15*(TMath::Sqrt(2.));  // z-dimension of the Pb slice
     212             :   Float_t kDimZEMAir = 0.001;                   // scotch
     213             :   Float_t kFibRadZEM = 0.0315;                  // External fiber radius (including cladding)
     214             :   Int_t   kDivZEM[3] = {92, 0, 20};             // Divisions for EM detector
     215           0 :   Float_t kDimZEM0 = 2*kDivZEM[2]*(kDimZEMPb+kDimZEMAir+kFibRadZEM*(TMath::Sqrt(2.)));
     216           0 :   fZEMLength = kDimZEM0;
     217             :   
     218           0 : }
     219             :  
     220             : //_____________________________________________________________________________
     221             : void AliZDCv3::CreateGeometry()
     222             : {
     223             :   //
     224             :   // Create the geometry for the Zero Degree Calorimeter version 2
     225             :   //* Initialize COMMON block ZDC_CGEOM
     226             :   //*
     227             : 
     228           0 :   CreateBeamLine();
     229           0 :   CreateZDC();
     230           0 : }
     231             :   
     232             : //_____________________________________________________________________________
     233             : void AliZDCv3::CreateBeamLine()
     234             : {
     235             :   //
     236             :   // Create the beam line elements
     237             :   //
     238             :   
     239             :   Double_t zd1, zd2, zCorrDip, zInnTrip, zD1, zD2;
     240           0 :   Double_t conpar[9], tubpar[3], tubspar[5], boxpar[3];
     241             : 
     242             :   //-- rotation matrices for the legs
     243           0 :   Int_t irotpipe1, irotpipe2;
     244           0 :   TVirtualMC::GetMC()->Matrix(irotpipe1,90.-1.0027,0.,90.,90.,1.0027,180.);      
     245           0 :   TVirtualMC::GetMC()->Matrix(irotpipe2,90.+1.0027,0.,90.,90.,1.0027,0.);
     246             : 
     247             :   //
     248           0 :   Int_t *idtmed = fIdtmed->GetArray();
     249             :   
     250             :   ////////////////////////////////////////////////////////////////
     251             :   //                                                            //
     252             :   //                SIDE C - RB26 (dimuon side)                 //
     253             :   //                                                            //
     254             :   ///////////////////////////////////////////////////////////////
     255             :   
     256             :   
     257             :   // -- Mother of the ZDCs (Vacuum PCON)
     258             :   zd1 = 1921.6;
     259             :   
     260           0 :   conpar[0] = 0.;
     261           0 :   conpar[1] = 360.;
     262           0 :   conpar[2] = 2.;
     263           0 :   conpar[3] = -13500.;
     264           0 :   conpar[4] = 0.;
     265           0 :   conpar[5] = 55.;
     266           0 :   conpar[6] = -zd1;
     267           0 :   conpar[7] = 0.;
     268           0 :   conpar[8] = 55.;
     269           0 :   TVirtualMC::GetMC()->Gsvolu("ZDCC", "PCON", idtmed[10], conpar, 9);
     270           0 :   TVirtualMC::GetMC()->Gspos("ZDCC", 1, "ALIC", 0., 0., 0., 0, "ONLY");
     271             :   
     272             : 
     273             :   // -- BEAM PIPE from compensator dipole to the beginning of D1) 
     274           0 :   tubpar[0] = 6.3/2.;
     275           0 :   tubpar[1] = 6.7/2.;
     276             :   // From beginning of ZDC volumes to beginning of D1
     277           0 :   tubpar[2] = (5838.3-zd1)/2.;
     278           0 :   TVirtualMC::GetMC()->Gsvolu("QT01", "TUBE", idtmed[7], tubpar, 3);
     279           0 :   TVirtualMC::GetMC()->Gspos("QT01", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     280             :   // Ch.debug
     281             :   //printf("       QT01 TUBE pipe from z = %1.2f to z= %1.2f (D1 beg.)\n",-zd1,-2*tubpar[2]-zd1);
     282             :   
     283             :   //-- BEAM PIPE from the end of D1 to the beginning of D2) 
     284             :   
     285             :   //-- FROM MAGNETIC BEGINNING OF D1 TO MAGNETIC END OF D1
     286             :   //--  Cylindrical pipe (r = 3.47) + conical flare  
     287             :   // -> Beginning of D1
     288           0 :   zd1 += 2.*tubpar[2];
     289             :   
     290           0 :   tubpar[0] = 6.94/2.;
     291           0 :   tubpar[1] = 7.34/2.;
     292           0 :   tubpar[2] = (6909.8-zd1)/2.;
     293           0 :   TVirtualMC::GetMC()->Gsvolu("QT02", "TUBE", idtmed[7], tubpar, 3);
     294           0 :   TVirtualMC::GetMC()->Gspos("QT02", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     295             :   // Ch.debug
     296             :   //printf("       QT02 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     297             : 
     298           0 :   zd1 += 2.*tubpar[2];
     299             :   
     300           0 :   tubpar[0] = 9./2.;
     301           0 :   tubpar[1] = 9.6/2.;
     302           0 :   tubpar[2] = (7022.8-zd1)/2.;
     303           0 :   TVirtualMC::GetMC()->Gsvolu("QT03", "TUBE", idtmed[7], tubpar, 3);
     304           0 :   TVirtualMC::GetMC()->Gspos("QT03", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     305             :   // Ch.debug
     306             :   //printf("       QT03 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     307             : 
     308           0 :   zd1 += 2.*tubpar[2];
     309             :   
     310           0 :   conpar[0] = 39.2/2.;
     311           0 :   conpar[1] = 18./2.;
     312           0 :   conpar[2] = 18.6/2.;
     313           0 :   conpar[3] = 9./2.;
     314           0 :   conpar[4] = 9.6/2.;
     315           0 :   TVirtualMC::GetMC()->Gsvolu("QC01", "CONE", idtmed[7], conpar, 5);
     316           0 :   TVirtualMC::GetMC()->Gspos("QC01", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
     317             :   // Ch.debug
     318             :   //printf("       QC01 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
     319             :   
     320           0 :   zd1 += conpar[0] * 2.;
     321             :   
     322             :   // ******************************************************
     323             :   // N.B.-> according to last vacuum layout 
     324             :   // private communication by D. Macina, mail 27/1/2009
     325             :   // ****************************************************** 
     326             :   // 2nd section of VCTCQ+VAMTF+TCTVB+VAMTF+TCLIA+VAMTF+1st part of VCTCP
     327             :   Float_t totLength1 = 160.8 + 78. + 148. + 78. + 148. + 78. + 9.3;
     328             :   //
     329           0 :   tubpar[0] = 18.6/2.;
     330           0 :   tubpar[1] = 7.6/2.;
     331           0 :   tubpar[2] = totLength1/2.;
     332             : //  TVirtualMC::GetMC()->Gsvolu("QE01", "ELTU", idtmed[7], tubpar, 3);  
     333             :   // temporary replace with a scaled tube (AG)
     334           0 :   TGeoTube *tubeQE01 = new TGeoTube(0.,tubpar[0],tubpar[2]);
     335           0 :   TGeoScale *scaleQE01 = new TGeoScale(1., tubpar[1]/tubpar[0], 1.);
     336           0 :   TGeoScaledShape *sshapeQE01 = new TGeoScaledShape(tubeQE01, scaleQE01);
     337           0 :   new TGeoVolume("QE01", sshapeQE01, gGeoManager->GetMedium(idtmed[7]));
     338             : 
     339           0 :   tubpar[0] = 18.0/2.;
     340           0 :   tubpar[1] = 7.0/2.;
     341           0 :   tubpar[2] = totLength1/2.;
     342             : //  TVirtualMC::GetMC()->Gsvolu("QE02", "ELTU", idtmed[10], tubpar, 3);  
     343             :   // temporary replace with a scaled tube (AG)
     344           0 :   TGeoTube *tubeQE02 = new TGeoTube(0.,tubpar[0],tubpar[2]);
     345           0 :   TGeoScale *scaleQE02 = new TGeoScale(1., tubpar[1]/tubpar[0], 1.);
     346           0 :   TGeoScaledShape *sshapeQE02 = new TGeoScaledShape(tubeQE02, scaleQE02);
     347           0 :   new TGeoVolume("QE02", sshapeQE02, gGeoManager->GetMedium(idtmed[10]));
     348             : 
     349           0 :   TVirtualMC::GetMC()->Gspos("QE01", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY"); 
     350           0 :   TVirtualMC::GetMC()->Gspos("QE02", 1, "QE01", 0., 0., 0., 0, "ONLY");  
     351             :   // Ch.debug
     352             :   //printf("       QE01 ELTU from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     353             :   
     354             :   // Vertical collimator jaws (defined ONLY if fVCollAperture<3.5!)
     355           0 :   if(fVCollSideCAperture<3.5){
     356           0 :     boxpar[0] = 5.4/2.;
     357           0 :     boxpar[1] = (3.5-fVCollSideCAperture-fVCollSideCCentreY-0.7)/2.;
     358           0 :     if(boxpar[1]<0.) boxpar[1]=0.;
     359           0 :     boxpar[2] = 124.4/2.;
     360           0 :     printf("  AliZDCv3 -> sideC VCollimator jaws: apertures +%1.2f/-%1.2f center %1.2f [cm]\n", 
     361           0 :         fVCollSideCAperture, fVCollSideCApertureNeg,fVCollSideCCentreY);
     362           0 :     TVirtualMC::GetMC()->Gsvolu("QCVC" , "BOX ", idtmed[13], boxpar, 3); 
     363           0 :     TVirtualMC::GetMC()->Gspos("QCVC", 1, "QE02", -boxpar[0],  fVCollSideCAperture+fVCollSideCCentreY+boxpar[1], -totLength1/2.+160.8+78.+148./2., 0, "ONLY");  
     364           0 :     TVirtualMC::GetMC()->Gspos("QCVC", 2, "QE02", -boxpar[0], -fVCollSideCApertureNeg+fVCollSideCCentreY-boxpar[1], -totLength1/2.+160.8+78.+148./2., 0, "ONLY");  
     365           0 :   }
     366             :   
     367           0 :   zd1 += tubpar[2] * 2.;
     368             :   
     369             :   // 2nd part of VCTCP
     370           0 :   conpar[0] = 31.5/2.;
     371           0 :   conpar[1] = 21.27/2.;
     372           0 :   conpar[2] = 21.87/2.;
     373           0 :   conpar[3] = 18.0/2.;
     374           0 :   conpar[4] = 18.6/2.;
     375           0 :   TVirtualMC::GetMC()->Gsvolu("QC02", "CONE", idtmed[7], conpar, 5);
     376           0 :   TVirtualMC::GetMC()->Gspos("QC02", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
     377             :   // Ch.debug
     378             :   //printf("       QC02 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
     379             :   
     380           0 :   zd1 += conpar[0] * 2.;
     381             : 
     382             :   // 3rd section of VCTCP+VCDWC+VMLGB   
     383             :   Float_t totLenght2 = 9.2 + 530.5+40.;
     384           0 :   tubpar[0] = 21.2/2.;
     385           0 :   tubpar[1] = 21.9/2.;
     386           0 :   tubpar[2] = totLenght2/2.;
     387           0 :   TVirtualMC::GetMC()->Gsvolu("QT04", "TUBE", idtmed[7], tubpar, 3);
     388           0 :   TVirtualMC::GetMC()->Gspos("QT04", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     389             :   // Ch.debug
     390             :   //printf("       QT04 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     391             :   
     392           0 :   zd1 += tubpar[2] * 2.;
     393             :   
     394             :   // First part of VCTCD
     395             :   // skewed transition cone from ID=212.7 mm to ID=797 mm
     396           0 :   conpar[0] = 121./2.;
     397           0 :   conpar[1] = 79.7/2.;
     398           0 :   conpar[2] = 81.3/2.;
     399           0 :   conpar[3] = 21.27/2.;
     400           0 :   conpar[4] = 21.87/2.;
     401           0 :   TVirtualMC::GetMC()->Gsvolu("QC03", "CONE", idtmed[7], conpar, 5);
     402           0 :   TVirtualMC::GetMC()->Gspos("QC03", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
     403             :   // Ch.debug
     404             :   //printf("       QC03 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
     405             :   
     406           0 :   zd1 += 2.*conpar[0];
     407             :   
     408             :   // VCDGB + 1st part of VCTCH
     409           0 :   tubpar[0] = 79.7/2.;
     410           0 :   tubpar[1] = 81.3/2.;
     411           0 :   tubpar[2] = (5*475.2+97.)/2.;
     412           0 :   TVirtualMC::GetMC()->Gsvolu("QT05", "TUBE", idtmed[7], tubpar, 3);
     413           0 :   TVirtualMC::GetMC()->Gspos("QT05", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     414             :   // Ch.debug
     415             :   //printf("       QT05 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     416             :   
     417           0 :   zd1 += 2.*tubpar[2];
     418             :      
     419             :   // 2nd part of VCTCH
     420             :   // Transition from ID=797 mm to ID=196 mm:
     421             :   // in order to simulate the thin window opened in the transition cone
     422             :   // we divide the transition cone in three cones:
     423             :   // (1) 8 mm thick (2) 3 mm thick (3) the third 8 mm thick
     424             :   
     425             :   // (1) 8 mm thick
     426           0 :   conpar[0] = 9.09/2.; // 15 degree
     427           0 :   conpar[1] = 74.82868/2.;
     428           0 :   conpar[2] = 76.42868/2.; // thickness 8 mm 
     429           0 :   conpar[3] = 79.7/2.;
     430           0 :   conpar[4] = 81.3/2.; // thickness 8 mm  
     431           0 :   TVirtualMC::GetMC()->Gsvolu("QC04", "CONE", idtmed[7], conpar, 5);
     432           0 :   TVirtualMC::GetMC()->Gspos("QC04", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
     433             :   // Ch.debug
     434             :   //printf("       QC04 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
     435             : 
     436           0 :   zd1 += 2.*conpar[0];  
     437             : 
     438             :   // (2) 3 mm thick
     439           0 :   conpar[0] = 96.2/2.; // 15 degree
     440           0 :   conpar[1] = 23.19588/2.;
     441           0 :   conpar[2] = 23.79588/2.; // thickness 3 mm 
     442           0 :   conpar[3] = 74.82868/2.;
     443           0 :   conpar[4] = 75.42868/2.; // thickness 3 mm  
     444           0 :   TVirtualMC::GetMC()->Gsvolu("QC05", "CONE", idtmed[7], conpar, 5);
     445           0 :   TVirtualMC::GetMC()->Gspos("QC05", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");  
     446             :   // Ch.debug
     447             :   //printf("       QC05 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
     448             : 
     449           0 :   zd1 += 2.*conpar[0];
     450             :   
     451             :   // (3) 8 mm thick
     452           0 :   conpar[0] = 6.71/2.; // 15 degree
     453           0 :   conpar[1] = 19.6/2.;
     454           0 :   conpar[2] = 21.2/2.;// thickness 8 mm 
     455           0 :   conpar[3] = 23.19588/2.;
     456           0 :   conpar[4] = 24.79588/2.;// thickness 8 mm 
     457           0 :   TVirtualMC::GetMC()->Gsvolu("QC06", "CONE", idtmed[7], conpar, 5);
     458           0 :   TVirtualMC::GetMC()->Gspos("QC06", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
     459             :   // Ch.debug
     460             :   //printf("       QC06 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
     461             : 
     462           0 :   zd1 += 2.*conpar[0];
     463             :   
     464             :   // VMZAR (5 volumes)  
     465           0 :   tubpar[0] = 20.2/2.;
     466           0 :   tubpar[1] = 20.6/2.;
     467           0 :   tubpar[2] = 2.15/2.;
     468           0 :   TVirtualMC::GetMC()->Gsvolu("QT06", "TUBE", idtmed[7], tubpar, 3);
     469           0 :   TVirtualMC::GetMC()->Gspos("QT06", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     470             :   // Ch.debug
     471             :   //printf("       QT06 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     472             : 
     473           0 :   zd1 += 2.*tubpar[2];
     474             :   
     475           0 :   conpar[0] = 6.9/2.;
     476           0 :   conpar[1] = 23.9/2.;
     477           0 :   conpar[2] = 24.3/2.;
     478           0 :   conpar[3] = 20.2/2.;
     479           0 :   conpar[4] = 20.6/2.;
     480           0 :   TVirtualMC::GetMC()->Gsvolu("QC07", "CONE", idtmed[7], conpar, 5);
     481           0 :   TVirtualMC::GetMC()->Gspos("QC07", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
     482             :   // Ch.debug
     483             :   //printf("       QC07 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
     484             : 
     485           0 :   zd1 += 2.*conpar[0];
     486             : 
     487           0 :   tubpar[0] = 23.9/2.;
     488           0 :   tubpar[1] = 25.5/2.;
     489           0 :   tubpar[2] = 17.0/2.;
     490           0 :   TVirtualMC::GetMC()->Gsvolu("QT07", "TUBE", idtmed[7], tubpar, 3);
     491           0 :   TVirtualMC::GetMC()->Gspos("QT07", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     492             :   // Ch.debug
     493             :   //printf("       QT07 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     494             :  
     495           0 :   zd1 += 2.*tubpar[2];
     496             :   
     497           0 :   conpar[0] = 6.9/2.;
     498           0 :   conpar[1] = 20.2/2.;
     499           0 :   conpar[2] = 20.6/2.;
     500           0 :   conpar[3] = 23.9/2.;
     501           0 :   conpar[4] = 24.3/2.;
     502           0 :   TVirtualMC::GetMC()->Gsvolu("QC08", "CONE", idtmed[7], conpar, 5);
     503           0 :   TVirtualMC::GetMC()->Gspos("QC08", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
     504             :   // Ch.debug
     505             :   //printf("       QC08 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
     506             : 
     507           0 :   zd1 += 2.*conpar[0];
     508             :   
     509           0 :   tubpar[0] = 20.2/2.;
     510           0 :   tubpar[1] = 20.6/2.;
     511           0 :   tubpar[2] = 2.15/2.;
     512           0 :   TVirtualMC::GetMC()->Gsvolu("QT08", "TUBE", idtmed[7], tubpar, 3);
     513           0 :   TVirtualMC::GetMC()->Gspos("QT08", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     514             :   // Ch.debug
     515             :   //printf("       QT08 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     516             : 
     517           0 :   zd1 += 2.*tubpar[2];
     518             :   
     519             :   // Flange (ID=196 mm)(last part of VMZAR and first part of VCTYB)
     520           0 :   tubpar[0] = 19.6/2.;
     521           0 :   tubpar[1] = 25.3/2.;
     522           0 :   tubpar[2] = 4.9/2.;
     523           0 :   TVirtualMC::GetMC()->Gsvolu("QT09", "TUBE", idtmed[7], tubpar, 3);
     524           0 :   TVirtualMC::GetMC()->Gspos("QT09", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     525             :   // Ch.debug
     526             :   //printf("       QT09 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     527             :  
     528           0 :   zd1 += 2.*tubpar[2];
     529             :   // Ch.debug
     530             :   //printf("       Beginning of VCTYB volume @ z = %1.2f \n",-zd1);
     531             :   
     532             :   // simulation of the trousers (VCTYB)     
     533           0 :   tubpar[0] = 19.6/2.;
     534           0 :   tubpar[1] = 20.0/2.;
     535           0 :   tubpar[2] = 3.9/2.;
     536           0 :   TVirtualMC::GetMC()->Gsvolu("QT10", "TUBE", idtmed[7], tubpar, 3);
     537           0 :   TVirtualMC::GetMC()->Gspos("QT10", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     538             :   // Ch.debug
     539             :   //printf("       QT10 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     540             : 
     541           0 :   zd1 += 2.*tubpar[2];
     542             : 
     543             :   // transition cone from ID=196. to ID=216.6
     544           0 :   conpar[0] = 32.55/2.;
     545           0 :   conpar[1] = 21.66/2.;
     546           0 :   conpar[2] = 22.06/2.;
     547           0 :   conpar[3] = 19.6/2.;
     548           0 :   conpar[4] = 20.0/2.;
     549           0 :   TVirtualMC::GetMC()->Gsvolu("QC09", "CONE", idtmed[7], conpar, 5);
     550           0 :   TVirtualMC::GetMC()->Gspos("QC09", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
     551             :   // Ch.debug
     552             :   //printf("       QC09 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
     553             : 
     554           0 :   zd1 += 2.*conpar[0]; 
     555             :   
     556             :   // tube  
     557           0 :   tubpar[0] = 21.66/2.;
     558           0 :   tubpar[1] = 22.06/2.;
     559           0 :   tubpar[2] = 28.6/2.;
     560           0 :   TVirtualMC::GetMC()->Gsvolu("QT11", "TUBE", idtmed[7], tubpar, 3);
     561           0 :   TVirtualMC::GetMC()->Gspos("QT11", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
     562             :   // Ch.debug
     563             :   //printf("       QT11 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     564             : 
     565           0 :   zd1 += 2.*tubpar[2];
     566             :   // Ch.debug
     567             :   //printf("       Beginning of recombination chamber @ z = %f \n",-zd1);
     568             : 
     569             :   // --------------------------------------------------------
     570             :   // RECOMBINATION CHAMBER IMPLEMENTED USING TGeo CLASSES!!!!
     571             :   // author: Chiara (August 2008)
     572             :   // --------------------------------------------------------
     573             :   // TRANSFORMATION MATRICES
     574             :   // Combi transformation: 
     575             :   Double_t dx = -3.970000;
     576             :   Double_t dy = 0.000000;
     577             :   Double_t dz = 0.0;
     578             :   // Rotation: 
     579             :   Double_t thx = 84.989100;   Double_t phx = 180.000000;
     580             :   Double_t thy = 90.000000;   Double_t phy = 90.000000;
     581             :   Double_t thz = 185.010900;  Double_t phz = 0.000000;
     582           0 :   TGeoRotation *rotMatrix1c = new TGeoRotation("c",thx,phx,thy,phy,thz,phz);
     583             :   // Combi transformation: 
     584             :   dx = -3.970000;
     585             :   dy = 0.000000;
     586             :   dz = 0.0;
     587           0 :   TGeoCombiTrans *rotMatrix2c = new TGeoCombiTrans("ZDCC_c1", dx,dy,dz,rotMatrix1c);
     588           0 :   rotMatrix2c->RegisterYourself();
     589             :   // Combi transformation: 
     590             :   dx = 3.970000;
     591             :   dy = 0.000000;
     592             :   dz = 0.0;
     593             :   // Rotation: 
     594             :   thx = 95.010900;   phx = 180.000000;
     595             :   thy = 90.000000;   phy = 90.000000;
     596             :   thz = 180.-5.010900;    phz = 0.000000;
     597           0 :   TGeoRotation *rotMatrix3c = new TGeoRotation("",thx,phx,thy,phy,thz,phz);
     598           0 :   TGeoCombiTrans *rotMatrix4c = new TGeoCombiTrans("ZDCC_c2", dx,dy,dz,rotMatrix3c);
     599           0 :   rotMatrix4c->RegisterYourself();
     600             : 
     601             :   // VOLUMES DEFINITION
     602             :   // Volume: ZDCC
     603           0 :   TGeoVolume *pZDCC = gGeoManager->GetVolume("ZDCC");
     604             :   
     605           0 :   conpar[0] = (90.1-0.95-0.26-0.0085)/2.;
     606           0 :   conpar[1] = 0.0/2.;
     607           0 :   conpar[2] = 21.6/2.;
     608           0 :   conpar[3] = 0.0/2.;
     609           0 :   conpar[4] = 5.8/2.;
     610           0 :   new TGeoCone("QCLext", conpar[0],conpar[1],conpar[2],conpar[3],conpar[4]);
     611             :   
     612           0 :   conpar[0] = (90.1-0.95-0.26-0.0085)/2.;
     613           0 :   conpar[1] = 0.0/2.;
     614           0 :   conpar[2] = 21.2/2.;
     615           0 :   conpar[3] = 0.0/2.;
     616           0 :   conpar[4] = 5.4/2.;
     617           0 :   new TGeoCone("QCLint", conpar[0],conpar[1],conpar[2],conpar[3],conpar[4]);
     618             : 
     619             :   // Outer trousers
     620           0 :   TGeoCompositeShape *pOutTrousersC = new TGeoCompositeShape("outTrousersC", "QCLext:ZDCC_c1+QCLext:ZDCC_c2");
     621             :   
     622             :   // Volume: QCLext
     623           0 :   TGeoMedium *medZDCFe = gGeoManager->GetMedium("ZDC_ZIRONT");
     624           0 :   TGeoVolume *pQCLext = new TGeoVolume("QCLext",pOutTrousersC, medZDCFe);
     625           0 :   pQCLext->SetLineColor(kGreen);
     626           0 :   pQCLext->SetVisLeaves(kTRUE);
     627             :   //
     628           0 :   TGeoTranslation *tr1c = new TGeoTranslation(0., 0., (Double_t) -conpar[0]-0.95-zd1);
     629             :   //printf("       Recombination chamber from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-0.95-zd1);
     630             :   //
     631           0 :   pZDCC->AddNode(pQCLext, 1, tr1c);
     632             :   // Inner trousers
     633           0 :   TGeoCompositeShape *pIntTrousersC = new TGeoCompositeShape("intTrousersC", "QCLint:ZDCC_c1+QCLint:ZDCC_c2");
     634             :   // Volume: QCLint
     635           0 :   TGeoMedium *medZDCvoid = gGeoManager->GetMedium("ZDC_ZVOID");
     636           0 :   TGeoVolume *pQCLint = new TGeoVolume("QCLint",pIntTrousersC, medZDCvoid);
     637           0 :   pQCLint->SetLineColor(kTeal);
     638           0 :   pQCLint->SetVisLeaves(kTRUE);
     639           0 :   pQCLext->AddNode(pQCLint, 1);
     640             :     
     641           0 :   zd1 += 90.1;
     642             :   Double_t offset = 0.5;
     643           0 :   zd1 = zd1+offset;
     644             :   
     645             :   //  second section : 2 tubes (ID = 54. OD = 58.)  
     646           0 :   tubpar[0] = 5.4/2.;
     647           0 :   tubpar[1] = 5.8/2.;
     648           0 :   tubpar[2] = 40.0/2.;
     649           0 :   TVirtualMC::GetMC()->Gsvolu("QT12", "TUBE", idtmed[7], tubpar, 3);
     650           0 :   TVirtualMC::GetMC()->Gspos("QT12", 1, "ZDCC", -15.8/2., 0., -tubpar[2]-zd1, 0, "ONLY");
     651           0 :   TVirtualMC::GetMC()->Gspos("QT12", 2, "ZDCC",  15.8/2., 0., -tubpar[2]-zd1, 0, "ONLY");  
     652             :   // Ch.debug
     653             :   //printf("       QT12 TUBE from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
     654             :   
     655           0 :   zd1 += 2.*tubpar[2];
     656             :   
     657             :   // transition x2zdc to recombination chamber : skewed cone  
     658           0 :   conpar[0] = (10.-0.2-offset)/2.;
     659           0 :   conpar[1] = 6.3/2.;
     660           0 :   conpar[2] = 7.0/2.;
     661           0 :   conpar[3] = 5.4/2.;
     662           0 :   conpar[4] = 5.8/2.;
     663           0 :   TVirtualMC::GetMC()->Gsvolu("QC10", "CONE", idtmed[7], conpar, 5); 
     664           0 :   TVirtualMC::GetMC()->Gspos("QC10", 1, "ZDCC", -7.9-0.175, 0., -conpar[0]-0.1-zd1, irotpipe1, "ONLY");
     665           0 :   TVirtualMC::GetMC()->Gspos("QC10", 2, "ZDCC", 7.9+0.175, 0., -conpar[0]-0.1-zd1, irotpipe2, "ONLY");
     666             :   //printf("       QC10 CONE from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-0.2-zd1);
     667             : 
     668           0 :   zd1 += 2.*conpar[0]+0.2;
     669             :   
     670             :   // 2 tubes (ID = 63 mm OD=70 mm)      
     671           0 :   tubpar[0] = 6.3/2.;
     672           0 :   tubpar[1] = 7.0/2.;
     673           0 :   tubpar[2] = 639.8/2.;
     674           0 :   TVirtualMC::GetMC()->Gsvolu("QT13", "TUBE", idtmed[7], tubpar, 3);
     675           0 :   TVirtualMC::GetMC()->Gspos("QT13", 1, "ZDCC", -16.5/2., 0., -tubpar[2]-zd1, 0, "ONLY");
     676           0 :   TVirtualMC::GetMC()->Gspos("QT13", 2, "ZDCC",  16.5/2., 0., -tubpar[2]-zd1, 0, "ONLY");
     677             :   //printf("       QT13 TUBE from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);  
     678             : 
     679           0 :   zd1 += 2.*tubpar[2];
     680             :   //printf("       END OF SIDE C BEAM PIPE DEFINITION @ z = %f\n",-zd1);
     681             : 
     682             :            
     683             :   // -- Luminometer (Cu box) in front of ZN - side C
     684           0 :   boxpar[0] = 8.0/2.;
     685           0 :   boxpar[1] = 8.0/2.;
     686           0 :   boxpar[2] = fLumiLength/2.;
     687           0 :   TVirtualMC::GetMC()->Gsvolu("QLUC", "BOX ", idtmed[9], boxpar, 3);
     688           0 :   TVirtualMC::GetMC()->Gspos("QLUC", 1, "ZDCC", 0., 0.,  fPosZNC[2]+66.+boxpar[2], 0, "ONLY");
     689             :   //printf("       QLUC LUMINOMETER from z = %1.2f to z= %1.2f\n",  fPosZNC[2]+66., fPosZNC[2]+66.+2*boxpar[2]);
     690             :                  
     691             :   // --  END OF BEAM PIPE VOLUME DEFINITION FOR SIDE C (RB26 SIDE) 
     692             :   // ----------------------------------------------------------------
     693             : 
     694             :   ////////////////////////////////////////////////////////////////
     695             :   //                                                            //
     696             :   //                SIDE A - RB24                               //
     697             :   //                                                            //
     698             :   ///////////////////////////////////////////////////////////////
     699             : 
     700             :   // Rotation Matrices definition
     701           0 :   Int_t irotpipe3, irotpipe4, irotpipe5;
     702             :   //-- rotation matrices for the tilted cone after the TDI to recenter vacuum chamber      
     703           0 :   TVirtualMC::GetMC()->Matrix(irotpipe3,90.-1.8934,0.,90.,90.,1.8934,180.);    
     704             :   //-- rotation matrices for the tilted tube before and after the TDI 
     705           0 :   TVirtualMC::GetMC()->Matrix(irotpipe4,90.-3.8,0.,90.,90.,3.8,180.);       
     706             :   //-- rotation matrix for the tilted cone after the TDI
     707           0 :   TVirtualMC::GetMC()->Matrix(irotpipe5,90.+9.8,0.,90.,90.,9.8,0.);     
     708             : 
     709             :   // -- Mother of the ZDCs (Vacuum PCON)                
     710             :   zd2 = 1910.22;// zd2 initial value
     711             :   
     712           0 :   conpar[0] = 0.;
     713           0 :   conpar[1] = 360.;
     714           0 :   conpar[2] = 2.;
     715           0 :   conpar[3] = zd2;
     716           0 :   conpar[4] = 0.;
     717           0 :   conpar[5] = 55.;
     718           0 :   conpar[6] = 13500.;
     719           0 :   conpar[7] = 0.;
     720           0 :   conpar[8] = 55.;
     721           0 :   TVirtualMC::GetMC()->Gsvolu("ZDCA", "PCON", idtmed[10], conpar, 9);
     722           0 :   TVirtualMC::GetMC()->Gspos("ZDCA", 1, "ALIC", 0., 0., 0., 0, "ONLY");
     723             :   
     724             :   // To avoid overlaps 1 micron are left between certain volumes!
     725             :   Double_t dxNoOverlap = 0.0;
     726             :   //zd2 += dxNoOverlap;  
     727             :   
     728             :   // BEAM PIPE from 19.10 m to inner triplet beginning (22.965 m)  
     729           0 :   tubpar[0] = 6.0/2.;
     730           0 :   tubpar[1] = 6.4/2.;
     731           0 :   tubpar[2] = 386.28/2. - dxNoOverlap; 
     732           0 :   TVirtualMC::GetMC()->Gsvolu("QA01", "TUBE", idtmed[7], tubpar, 3);
     733           0 :   TVirtualMC::GetMC()->Gspos("QA01", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
     734             :   // Ch.debug
     735             :   //printf("       QA01 TUBE centred in %f from z = %1.2f to z= %1.2f (IT begin)\n",tubpar[2]+zd2,zd2,2*tubpar[2]+zd2);
     736             :   
     737           0 :   zd2 += 2.*tubpar[2];  
     738             : 
     739             :   // -- FIRST SECTION OF THE BEAM PIPE (from beginning of inner triplet to
     740             :   //    beginning of D1)  
     741           0 :   tubpar[0] = 6.3/2.;
     742           0 :   tubpar[1] = 6.7/2.;
     743           0 :   tubpar[2] = 3541.8/2. - dxNoOverlap;
     744           0 :   TVirtualMC::GetMC()->Gsvolu("QA02", "TUBE", idtmed[7], tubpar, 3);
     745           0 :   TVirtualMC::GetMC()->Gspos("QA02", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
     746             :   // Ch.debug
     747             :   //printf("       QA02 TUBE from z = %1.2f to z= %1.2f (D1 begin)\n",zd2,2*tubpar[2]+zd2);
     748             :   
     749           0 :   zd2 += 2.*tubpar[2]; 
     750             :   
     751             :     
     752             :   // -- SECOND SECTION OF THE BEAM PIPE (from the beginning of D1 to the beginning of D2)
     753             :   //
     754             :   //  FROM (MAGNETIC) BEGINNING OF D1 TO THE (MAGNETIC) END OF D1 + 126.5 cm
     755             :   //  CYLINDRICAL PIPE of diameter increasing from 6.75 cm up to 8.0 cm
     756             :   //  from magnetic end :
     757             :   //  1) 80.1 cm still with ID = 6.75 radial beam screen
     758             :   //  2) 2.5 cm conical section from ID = 6.75 to ID = 8.0 cm
     759             :   //  3) 43.9 cm straight section (tube) with ID = 8.0 cm
     760             : 
     761           0 :   tubpar[0] = 6.75/2.;
     762           0 :   tubpar[1] = 7.15/2.;
     763           0 :   tubpar[2] = (945.0+80.1)/2.;
     764           0 :   TVirtualMC::GetMC()->Gsvolu("QA03", "TUBE", idtmed[7], tubpar, 3);
     765           0 :   TVirtualMC::GetMC()->Gspos("QA03", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
     766             :   // Ch.debug
     767             :   //printf("       QA03 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
     768             :   
     769           0 :   zd2 += 2.*tubpar[2];
     770             : 
     771             :   // Transition Cone from ID=67.5 mm  to ID=80 mm
     772           0 :   conpar[0] = 2.5/2.;
     773           0 :   conpar[1] = 6.75/2.;
     774           0 :   conpar[2] = 7.15/2.;
     775           0 :   conpar[3] = 8.0/2.;
     776           0 :   conpar[4] = 8.4/2.;
     777           0 :   TVirtualMC::GetMC()->Gsvolu("QA04", "CONE", idtmed[7], conpar, 5);
     778           0 :   TVirtualMC::GetMC()->Gspos("QA04", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
     779             :   //printf("       QA04 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
     780             : 
     781           0 :   zd2 += 2.*conpar[0];
     782             :   
     783           0 :   tubpar[0] = 8.0/2.;
     784           0 :   tubpar[1] = 8.4/2.;
     785           0 :   tubpar[2] = (43.9+20.+28.5+28.5)/2.;
     786           0 :   TVirtualMC::GetMC()->Gsvolu("QA05", "TUBE", idtmed[7], tubpar, 3);
     787           0 :   TVirtualMC::GetMC()->Gspos("QA05", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
     788             :   // Ch.debug
     789             :   //printf("       QA05 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
     790             :   
     791           0 :   zd2 += 2.*tubpar[2];
     792             : 
     793             :   // Second section of VAEHI (transition cone from ID=80mm to ID=98mm)
     794           0 :   conpar[0] = 4.0/2.;
     795           0 :   conpar[1] = 8.0/2.;
     796           0 :   conpar[2] = 8.4/2.;
     797           0 :   conpar[3] = 9.8/2.;
     798           0 :   conpar[4] = 10.2/2.;
     799           0 :   TVirtualMC::GetMC()->Gsvolu("QAV1", "CONE", idtmed[7], conpar, 5);
     800           0 :   TVirtualMC::GetMC()->Gspos("QAV1", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
     801             :   //printf("       QAV1 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
     802             : 
     803           0 :   zd2 += 2.*conpar[0];
     804             :   
     805             :   //Third section of VAEHI (transition cone from ID=98mm to ID=90mm)
     806           0 :   conpar[0] = 1.0/2.;
     807           0 :   conpar[1] = 9.8/2.;
     808           0 :   conpar[2] = 10.2/2.;
     809           0 :   conpar[3] = 9.0/2.;
     810           0 :   conpar[4] = 9.4/2.;
     811           0 :   TVirtualMC::GetMC()->Gsvolu("QAV2", "CONE", idtmed[7], conpar, 5);
     812           0 :   TVirtualMC::GetMC()->Gspos("QAV2", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
     813             :   //printf("       QAV2 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
     814             : 
     815           0 :   zd2 += 2.*conpar[0];
     816             :  
     817             :   // Fourth section of VAEHI (tube ID=90mm)    
     818           0 :   tubpar[0] = 9.0/2.;
     819           0 :   tubpar[1] = 9.4/2.;
     820           0 :   tubpar[2] = 31.0/2.;
     821           0 :   TVirtualMC::GetMC()->Gsvolu("QAV3", "TUBE", idtmed[7], tubpar, 3);
     822           0 :   TVirtualMC::GetMC()->Gspos("QAV3", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
     823             :   // Ch.debug
     824             :   //printf("       QAV3 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
     825             :   
     826           0 :   zd2 += 2.*tubpar[2]; 
     827             : 
     828             :   //---------------------------- TCDD beginning ----------------------------------    
     829             :   // space for the insertion of the collimator TCDD (2 m)
     830             :   // TCDD ZONE - 1st volume
     831           0 :   conpar[0] = 1.3/2.;
     832           0 :   conpar[1] = 9.0/2.;
     833           0 :   conpar[2] = 13.0/2.;
     834           0 :   conpar[3] = 9.6/2.;
     835           0 :   conpar[4] = 13.0/2.;
     836           0 :   TVirtualMC::GetMC()->Gsvolu("Q01T", "CONE", idtmed[7], conpar, 5);
     837           0 :   TVirtualMC::GetMC()->Gspos("Q01T", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
     838             :   //printf("       Q01T CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
     839             : 
     840           0 :   zd2 += 2.*conpar[0];  
     841             : 
     842             :   // TCDD ZONE - 2nd volume    
     843           0 :   tubpar[0] = 9.6/2.;
     844           0 :   tubpar[1] = 10.0/2.;
     845           0 :   tubpar[2] = 1.0/2.;
     846           0 :   TVirtualMC::GetMC()->Gsvolu("Q02T", "TUBE", idtmed[7], tubpar, 3);
     847           0 :   TVirtualMC::GetMC()->Gspos("Q02T", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
     848             :   // Ch.debug
     849             :   //printf("       Q02T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
     850             :   
     851           0 :   zd2 += 2.*tubpar[2]; 
     852             : 
     853             :   // TCDD ZONE - third volume
     854           0 :   conpar[0] = 9.04/2.;
     855           0 :   conpar[1] = 9.6/2.;
     856           0 :   conpar[2] = 10.0/2.;
     857           0 :   conpar[3] = 13.8/2.;
     858           0 :   conpar[4] = 14.2/2.;
     859           0 :   TVirtualMC::GetMC()->Gsvolu("Q03T", "CONE", idtmed[7], conpar, 5);
     860           0 :   TVirtualMC::GetMC()->Gspos("Q03T", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
     861             :   //printf("       Q03T CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
     862             : 
     863           0 :   zd2 += 2.*conpar[0];  
     864             : 
     865             :   // TCDD ZONE - 4th volume    
     866           0 :   tubpar[0] = 13.8/2.;
     867           0 :   tubpar[1] = 14.2/2.;
     868           0 :   tubpar[2] = 38.6/2.;
     869           0 :   TVirtualMC::GetMC()->Gsvolu("Q04T", "TUBE", idtmed[7], tubpar, 3);
     870           0 :   TVirtualMC::GetMC()->Gspos("Q04T", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
     871             :   // Ch.debug
     872             :   //printf("       Q04T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
     873             :   
     874           0 :   zd2 += 2.*tubpar[2]; 
     875             : 
     876             :   // TCDD ZONE - 5th volume    
     877           0 :   tubpar[0] = 21.0/2.;
     878           0 :   tubpar[1] = 21.4/2.;
     879           0 :   tubpar[2] = 100.12/2.;
     880           0 :   TVirtualMC::GetMC()->Gsvolu("Q05T", "TUBE", idtmed[7], tubpar, 3);
     881           0 :   TVirtualMC::GetMC()->Gspos("Q05T", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
     882             :   // Ch.debug
     883             :   //printf("       Q05T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
     884             : 
     885           0 :   zd2 += 2.*tubpar[2]; 
     886             :  
     887             :   // TCDD ZONE - 6th volume    
     888           0 :   tubpar[0] = 13.8/2.;
     889           0 :   tubpar[1] = 14.2/2.;
     890           0 :   tubpar[2] = 38.6/2.;
     891           0 :   TVirtualMC::GetMC()->Gsvolu("Q06T", "TUBE", idtmed[7], tubpar, 3);
     892           0 :   TVirtualMC::GetMC()->Gspos("Q06T", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
     893             :   // Ch.debug
     894             :   //printf("       Q06T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
     895             :   
     896           0 :   zd2 += 2.*tubpar[2];
     897             : 
     898             :   // TCDD ZONE - 7th volume
     899           0 :   conpar[0] = 11.34/2.;
     900           0 :   conpar[1] = 13.8/2.;
     901           0 :   conpar[2] = 14.2/2.;
     902           0 :   conpar[3] = 18.0/2.;
     903           0 :   conpar[4] = 18.4/2.;
     904           0 :   TVirtualMC::GetMC()->Gsvolu("Q07T", "CONE", idtmed[7], conpar, 5);
     905           0 :   TVirtualMC::GetMC()->Gspos("Q07T", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
     906             :   //printf("       Q07T CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
     907             : 
     908           0 :   zd2 += 2.*conpar[0];
     909             : 
     910             :   // Upper section : one single phi segment of a tube 
     911             :   //  5 parameters for tubs: inner radius = 0.,
     912             :   //    outer radius = 7. cm, half length = 50 cm
     913             :   //    phi1 = 0., phi2 = 180. 
     914           0 :   tubspar[0] = 0.0/2.;
     915           0 :   tubspar[1] = 14.0/2.;
     916           0 :   tubspar[2] = 100.0/2.;
     917           0 :   tubspar[3] = 0.;
     918           0 :   tubspar[4] = 180.;  
     919           0 :   TVirtualMC::GetMC()->Gsvolu("Q08T", "TUBS", idtmed[7], tubspar, 5);
     920             :   // Ch.debug
     921             :   //printf("       upper part : one single phi segment of a tube (Q08T)\n");  
     922             :   
     923             :   // rectangular beam pipe inside TCDD upper section (Vacuum)  
     924           0 :   boxpar[0] = 7.0/2.;
     925           0 :   boxpar[1] = 2.2/2.;
     926           0 :   boxpar[2] = 100./2.;
     927           0 :   TVirtualMC::GetMC()->Gsvolu("Q09T", "BOX ", idtmed[10], boxpar, 3);
     928             :   // positioning vacuum box in the upper section of TCDD
     929           0 :   TVirtualMC::GetMC()->Gspos("Q09T", 1, "Q08T", 0., 1.1,  0., 0, "ONLY");
     930             :   
     931             :   // lower section : one single phi segment of a tube       
     932           0 :   tubspar[0] = 0.0/2.;
     933           0 :   tubspar[1] = 14.0/2.;
     934           0 :   tubspar[2] = 100.0/2.;
     935           0 :   tubspar[3] = 180.;
     936           0 :   tubspar[4] = 360.;  
     937           0 :   TVirtualMC::GetMC()->Gsvolu("Q10T", "TUBS", idtmed[7], tubspar, 5);
     938             :   // rectangular beam pipe inside TCDD lower section (Vacuum)  
     939           0 :   boxpar[0] = 7.0/2.;
     940           0 :   boxpar[1] = 2.2/2.;
     941           0 :   boxpar[2] = 100./2.;
     942           0 :   TVirtualMC::GetMC()->Gsvolu("Q11T", "BOX ", idtmed[10], boxpar, 3);
     943             :   // positioning vacuum box in the lower section of TCDD
     944           0 :   TVirtualMC::GetMC()->Gspos("Q11T", 1, "Q10T", 0., -1.1,  0., 0, "ONLY");  
     945             :   
     946             :   // positioning  TCDD elements in ZDCA, (inside TCDD volume)
     947           0 :   TVirtualMC::GetMC()->Gspos("Q08T", 1, "ZDCA", 0., fTCDDAperturePos, -100.+zd2, 0, "ONLY");  
     948           0 :   TVirtualMC::GetMC()->Gspos("Q10T", 1, "ZDCA", 0., -fTCDDApertureNeg, -100.+zd2, 0, "ONLY");  
     949           0 :   printf("  AliZDCv3 -> TCDD apertures +%1.2f/-%1.2f cm\n", 
     950           0 :         fTCDDAperturePos, fTCDDApertureNeg);
     951             :     
     952             :   // RF screen 
     953           0 :   boxpar[0] = 0.2/2.;
     954           0 :   boxpar[1] = 4.0/2.;
     955           0 :   boxpar[2] = 100./2.;
     956           0 :   TVirtualMC::GetMC()->Gsvolu("Q12T", "BOX ", idtmed[7], boxpar, 3);  
     957             :   // positioning RF screen at both sides of TCDD
     958           0 :   TVirtualMC::GetMC()->Gspos("Q12T", 1, "ZDCA", tubspar[1]+boxpar[0], 0., -100.+zd2, 0, "ONLY");  
     959           0 :   TVirtualMC::GetMC()->Gspos("Q12T", 2, "ZDCA", -tubspar[1]-boxpar[0], 0., -100.+zd2, 0, "ONLY");      
     960             :   //---------------------------- TCDD end ---------------------------------------    
     961             : 
     962             :   // The following elliptical tube 180 mm x 70 mm
     963             :   // (obtained positioning the void QA09 in QA08)
     964             :   // represents VMTSA (780 mm) + space reserved to the TCTVB (1480 mm)+ 
     965             :   //            VMTSA (780 mm) + first part of VCTCP (93 mm)
     966             : 
     967           0 :   tubpar[0] = 18.4/2.;
     968           0 :   tubpar[1] = 7.4/2.;
     969           0 :   tubpar[2] = 313.3/2.;
     970             : //  TVirtualMC::GetMC()->Gsvolu("QA06", "ELTU", idtmed[7], tubpar, 3);  
     971             :   // temporary replace with a scaled tube (AG)
     972           0 :   TGeoTube *tubeQA06 = new TGeoTube(0.,tubpar[0],tubpar[2]);
     973           0 :   TGeoScale *scaleQA06 = new TGeoScale(1., tubpar[1]/tubpar[0], 1.);
     974           0 :   TGeoScaledShape *sshapeQA06 = new TGeoScaledShape(tubeQA06, scaleQA06);
     975           0 :   new TGeoVolume("QA06", sshapeQA06, gGeoManager->GetMedium(idtmed[7]));
     976             :   //printf("       QA06 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
     977             : 
     978           0 :   tubpar[0] = 18.0/2.;
     979           0 :   tubpar[1] = 7.0/2.;
     980           0 :   tubpar[2] = 313.3/2.;
     981             : //  TVirtualMC::GetMC()->Gsvolu("QA07", "ELTU", idtmed[10], tubpar, 3);  
     982             :   // temporary replace with a scaled tube (AG)
     983           0 :   TGeoTube *tubeQA07 = new TGeoTube(0.,tubpar[0],tubpar[2]);
     984           0 :   TGeoScale *scaleQA07 = new TGeoScale(1., tubpar[1]/tubpar[0], 1.);
     985           0 :   TGeoScaledShape *sshapeQA07 = new TGeoScaledShape(tubeQA07, scaleQA07);
     986           0 :   new TGeoVolume("QA07", sshapeQA07, gGeoManager->GetMedium(idtmed[10]));
     987             :   //printf("       QA07 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
     988           0 :   TVirtualMC::GetMC()->Gspos("QA06", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY"); 
     989           0 :   TVirtualMC::GetMC()->Gspos("QA07", 1, "QA06", 0., 0., 0., 0, "ONLY");  
     990             :   
     991             :   // Vertical collimator jaws (defined ONLY if fVCollAperture<3.5!)
     992           0 :   if(fVCollSideAAperture<3.5){
     993           0 :     boxpar[0] = 5.4/2.;
     994           0 :     boxpar[1] = (3.5-fVCollSideAAperture-fVCollSideACentreY-0.7)/2.;
     995           0 :     if(boxpar[1]<0.) boxpar[1]=0.;
     996           0 :     boxpar[2] = 124.4/2.;
     997           0 :     TVirtualMC::GetMC()->Gsvolu("QCVA" , "BOX ", idtmed[13], boxpar, 3); 
     998           0 :     TVirtualMC::GetMC()->Gspos("QCVA", 1, "QA07", -boxpar[0], fVCollSideAAperture+fVCollSideACentreY+boxpar[1], -313.3/2.+78.+148./2., 0, "ONLY");  
     999           0 :     TVirtualMC::GetMC()->Gspos("QCVA", 2, "QA07", -boxpar[0], -fVCollSideAApertureNeg+fVCollSideACentreY-boxpar[1], -313.3/2.+78.+148./2., 0, "ONLY");  
    1000           0 :     printf("  AliZDCv3 -> sideA VCollimator jaws: apertures +%1.2f/-%1.2f center %1.2f [cm]\n", 
    1001           0 :         fVCollSideAAperture, fVCollSideAApertureNeg,fVCollSideACentreY);
    1002           0 :   }
    1003             :   
    1004           0 :   zd2 += 2.*tubpar[2];
    1005             :       
    1006             :   // VCTCP second part: transition cone from ID=180 to ID=212.7 
    1007           0 :   conpar[0] = 31.5/2.;
    1008           0 :   conpar[1] = 18.0/2.;
    1009           0 :   conpar[2] = 18.6/2.;
    1010           0 :   conpar[3] = 21.27/2.;
    1011           0 :   conpar[4] = 21.87/2.;
    1012           0 :   TVirtualMC::GetMC()->Gsvolu("QA08", "CONE", idtmed[7], conpar, 5);
    1013           0 :   TVirtualMC::GetMC()->Gspos("QA08", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
    1014             :   // Ch.debug  
    1015             :   //printf("       QA08 CONE from z = %Third part of VCTCR: tube (ID=196 mm) f to z = %f\n",zd2,2*conpar[0]+zd2);
    1016             : 
    1017           0 :   zd2 += 2.*conpar[0];
    1018             :   
    1019             :   // Tube ID 212.7 mm
    1020             :   // Represents VCTCP third part (92 mm) + VCDWB (765 mm) + VMBGA (400 mm) +
    1021             :   //            VCDWE (300 mm) + VMBGA (400 mm)
    1022           0 :   tubpar[0] = 21.27/2.;
    1023           0 :   tubpar[1] = 21.87/2.;
    1024           0 :   tubpar[2] = 195.7/2.;
    1025           0 :   TVirtualMC::GetMC()->Gsvolu("QA09", "TUBE", idtmed[7], tubpar, 3);
    1026           0 :   TVirtualMC::GetMC()->Gspos("QA09", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1027             :   //printf("       QA09 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1028             : 
    1029           0 :   zd2 += 2.*tubpar[2];
    1030             : 
    1031             :   // skewed transition piece (ID=212.7 mm to 332 mm) (before TDI)   
    1032           0 :   conpar[0] = (50.0-0.73-1.13)/2.;
    1033           0 :   conpar[1] = 21.27/2.;
    1034           0 :   conpar[2] = 21.87/2.;
    1035           0 :   conpar[3] = 33.2/2.;
    1036           0 :   conpar[4] = 33.8/2.;
    1037           0 :   TVirtualMC::GetMC()->Gsvolu("QA10", "CONE", idtmed[7], conpar, 5);
    1038           0 :   TVirtualMC::GetMC()->Gspos("QA10", 1, "ZDCA", -1.66, 0., conpar[0]+0.73+zd2, irotpipe4, "ONLY");
    1039             :   // Ch.debug  
    1040             :   //printf("       QA10 skewed CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+0.73+1.13+zd2);
    1041             : 
    1042           0 :   zd2 += 2.*conpar[0]+0.73+1.13;
    1043             :       
    1044             :   // Vacuum chamber containing TDI  
    1045           0 :   tubpar[0] = 0.;
    1046           0 :   tubpar[1] = 54.6/2.;
    1047           0 :   tubpar[2] = 540.0/2.;
    1048           0 :   TVirtualMC::GetMC()->Gsvolu("Q13TM", "TUBE", idtmed[10], tubpar, 3);
    1049           0 :   TVirtualMC::GetMC()->Gspos("Q13TM", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1050           0 :   tubpar[0] = 54.0/2.;
    1051           0 :   tubpar[1] = 54.6/2.;
    1052           0 :   tubpar[2] = 540.0/2.;
    1053           0 :   TVirtualMC::GetMC()->Gsvolu("Q13T", "TUBE", idtmed[7], tubpar, 3);
    1054           0 :   TVirtualMC::GetMC()->Gspos("Q13T", 1, "Q13TM", 0., 0., 0., 0, "ONLY");
    1055             :   // Ch.debug
    1056             :   //printf("       Q13T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1057             : 
    1058           0 :   zd2 += 2.*tubpar[2];
    1059             :   
    1060             :   //---------------- INSERT TDI INSIDE Q13T -----------------------------------    
    1061           0 :   boxpar[0] = 11.0/2.;
    1062           0 :   boxpar[1] = 9.0/2.;
    1063           0 :   boxpar[2] = 540.0/2.;
    1064           0 :   TVirtualMC::GetMC()->Gsvolu("QTD1", "BOX ", idtmed[7], boxpar, 3);
    1065           0 :   TVirtualMC::GetMC()->Gspos("QTD1", 1, "Q13TM", -3.8, boxpar[1]+fTDIAperturePos,  0., 0, "ONLY");
    1066           0 :   boxpar[0] = 11.0/2.;
    1067           0 :   boxpar[1] = 9.0/2.;
    1068           0 :   boxpar[2] = 540.0/2.;
    1069           0 :   TVirtualMC::GetMC()->Gsvolu("QTD2", "BOX ", idtmed[7], boxpar, 3);
    1070           0 :   TVirtualMC::GetMC()->Gspos("QTD2", 1, "Q13TM", -3.8, -boxpar[1]-fTDIApertureNeg,  0., 0, "ONLY");  
    1071           0 :   boxpar[0] = 5.1/2.;
    1072           0 :   boxpar[1] = 0.2/2.;
    1073           0 :   boxpar[2] = 540.0/2.;
    1074           0 :   TVirtualMC::GetMC()->Gsvolu("QTD3", "BOX ", idtmed[7], boxpar, 3);
    1075           0 :   TVirtualMC::GetMC()->Gspos("QTD3", 1, "Q13TM", -3.8+5.5+boxpar[0], fTDIAperturePos,  0., 0, "ONLY");  
    1076           0 :   TVirtualMC::GetMC()->Gspos("QTD3", 2, "Q13TM", -3.8+5.5+boxpar[0], -fTDIApertureNeg,  0., 0, "ONLY"); 
    1077           0 :   TVirtualMC::GetMC()->Gspos("QTD3", 3, "Q13TM", -3.8-5.5-boxpar[0], fTDIAperturePos,  0., 0, "ONLY");  
    1078           0 :   TVirtualMC::GetMC()->Gspos("QTD3", 4, "Q13TM", -3.8-5.5-boxpar[0], -fTDIApertureNeg,  0., 0, "ONLY");  
    1079           0 :   printf("  AliZDCv3 -> TDI apertures +%1.2f/-%1.2f cm\n\n", 
    1080           0 :         fTDIAperturePos, fTDIApertureNeg);
    1081             :   //
    1082           0 :   tubspar[0] = 12.0/2.;
    1083           0 :   tubspar[1] = 12.4/2.;
    1084           0 :   tubspar[2] = 540.0/2.;
    1085           0 :   tubspar[3] = 90.;
    1086           0 :   tubspar[4] = 270.;  
    1087           0 :   TVirtualMC::GetMC()->Gsvolu("QTD4", "TUBS", idtmed[7], tubspar, 5);
    1088           0 :   TVirtualMC::GetMC()->Gspos("QTD4", 1, "Q13TM", -3.8-10.6, 0.,  0., 0, "ONLY");
    1089           0 :   tubspar[0] = 12.0/2.;
    1090           0 :   tubspar[1] = 12.4/2.;
    1091           0 :   tubspar[2] = 540.0/2.;
    1092           0 :   tubspar[3] = -90.;
    1093           0 :   tubspar[4] = 90.;  
    1094           0 :   TVirtualMC::GetMC()->Gsvolu("QTD5", "TUBS", idtmed[7], tubspar, 5);
    1095           0 :   TVirtualMC::GetMC()->Gspos("QTD5", 1, "Q13TM", -3.8+10.6, 0.,  0., 0, "ONLY"); 
    1096             :   //---------------- END DEFINING TDI INSIDE Q13T -------------------------------
    1097             :   
    1098             :   // VCTCG skewed transition piece (ID=332 mm to 212.7 mm) (after TDI)
    1099           0 :   conpar[0] = (50.0-2.92-1.89)/2.;
    1100           0 :   conpar[1] = 33.2/2.;
    1101           0 :   conpar[2] = 33.8/2.;
    1102           0 :   conpar[3] = 21.27/2.;
    1103           0 :   conpar[4] = 21.87/2.;
    1104           0 :   TVirtualMC::GetMC()->Gsvolu("QA11", "CONE", idtmed[7], conpar, 5);
    1105           0 :   TVirtualMC::GetMC()->Gspos("QA11", 1, "ZDCA", 4.32-3.8, 0., conpar[0]+2.92+zd2, irotpipe5, "ONLY");
    1106             :   // Ch.debug  
    1107             :   //printf("       QA11 skewed CONE from z = %f to z =%f\n",zd2,2*conpar[0]+2.92+1.89+zd2);
    1108             : 
    1109           0 :   zd2 += 2.*conpar[0]+2.92+1.89;
    1110             :   
    1111             :   // The following tube ID 212.7 mm  
    1112             :   // represents VMBGA (400 mm) + VCDWE (300 mm) + VMBGA (400 mm) +
    1113             :   //            BTVTS (600 mm) + VMLGB (400 mm)  
    1114           0 :   tubpar[0] = 21.27/2.;
    1115           0 :   tubpar[1] = 21.87/2.;
    1116           0 :   tubpar[2] = 210.0/2.;
    1117           0 :   TVirtualMC::GetMC()->Gsvolu("QA12", "TUBE", idtmed[7], tubpar, 3);
    1118           0 :   TVirtualMC::GetMC()->Gspos("QA12", 1, "ZDCA", 4., 0., tubpar[2]+zd2, 0, "ONLY");
    1119             :   // Ch.debug
    1120             :   //printf("       QA12 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1121             : 
    1122           0 :   zd2 += 2.*tubpar[2];  
    1123             :   
    1124             :   // First part of VCTCC
    1125             :   // skewed transition cone from ID=212.7 mm to ID=797 mm
    1126           0 :   conpar[0] = (121.0-0.37-1.35)/2.;
    1127           0 :   conpar[1] = 21.27/2.;
    1128           0 :   conpar[2] = 21.87/2.;
    1129           0 :   conpar[3] = 79.7/2.;
    1130           0 :   conpar[4] = 81.3/2.;
    1131           0 :   TVirtualMC::GetMC()->Gsvolu("QA13", "CONE", idtmed[7], conpar, 5);
    1132           0 :   TVirtualMC::GetMC()->Gspos("QA13", 1, "ZDCA", 4.-2., 0., conpar[0]+0.37+zd2, irotpipe3, "ONLY");
    1133             :   // Ch.debug  
    1134             :   //printf("       QA13 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+0.37+1.35+zd2);
    1135             : 
    1136           0 :   zd2 += 2.*conpar[0]+0.37+1.35;
    1137             :   
    1138             :   // The following tube ID 797 mm  --- (volume QA16)
    1139             :   // represents the second part of VCTCC (4272 mm) + 
    1140             :   //            4 x VCDGA (4 x 4272 mm) + 
    1141             :   //            the first part of VCTCR (850 mm)
    1142           0 :   tubpar[0] = 79.7/2.;
    1143           0 :   tubpar[1] = 81.3/2.;
    1144           0 :   tubpar[2] = 2221./2.;
    1145           0 :   TVirtualMC::GetMC()->Gsvolu("QA14", "TUBE", idtmed[7], tubpar, 3);
    1146           0 :   TVirtualMC::GetMC()->Gspos("QA14", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1147             :   // Ch.debug  
    1148             :   //printf("       QA14 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1149             : 
    1150           0 :   zd2 += 2.*tubpar[2];
    1151             :         
    1152             :   // Second part of VCTCR
    1153             :   // Transition from ID=797 mm to ID=196 mm:
    1154             :   // in order to simulate the thin window opened in the transition cone
    1155             :   // we divide the transition cone in three cones:
    1156             :   // (1) 8 mm thick (2) 3 mm thick (3) the third 8 mm thick
    1157             :   
    1158             :   // (1) 8 mm thick
    1159           0 :   conpar[0] = 9.09/2.; // 15 degree
    1160           0 :   conpar[1] = 79.7/2.;
    1161           0 :   conpar[2] = 81.3/2.; // thickness 8 mm  
    1162           0 :   conpar[3] = 74.82868/2.;
    1163           0 :   conpar[4] = 76.42868/2.; // thickness 8 mm 
    1164           0 :   TVirtualMC::GetMC()->Gsvolu("QA15", "CONE", idtmed[7], conpar, 5);
    1165           0 :   TVirtualMC::GetMC()->Gspos("QA15", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
    1166             :   //printf("       QA15 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
    1167             : 
    1168           0 :   zd2 += 2.*conpar[0];  
    1169             : 
    1170             :   // (2) 3 mm thick
    1171           0 :   conpar[0] = 96.2/2.; // 15 degree
    1172           0 :   conpar[1] = 74.82868/2.;
    1173           0 :   conpar[2] = 75.42868/2.; // thickness 3 mm  
    1174           0 :   conpar[3] = 23.19588/2.;
    1175           0 :   conpar[4] = 23.79588/2.; // thickness 3 mm 
    1176           0 :   TVirtualMC::GetMC()->Gsvolu("QA16", "CONE", idtmed[7], conpar, 5);
    1177           0 :   TVirtualMC::GetMC()->Gspos("QA16", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");  
    1178             :   //printf("       QA16 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
    1179             : 
    1180           0 :   zd2 += 2.*conpar[0];
    1181             :   
    1182             :   // (3) 8 mm thick
    1183           0 :   conpar[0] = 6.71/2.; // 15 degree
    1184           0 :   conpar[1] = 23.19588/2.;
    1185           0 :   conpar[2] = 24.79588/2.;// thickness 8 mm 
    1186           0 :   conpar[3] = 19.6/2.;
    1187           0 :   conpar[4] = 21.2/2.;// thickness 8 mm 
    1188           0 :   TVirtualMC::GetMC()->Gsvolu("QA17", "CONE", idtmed[7], conpar, 5);
    1189           0 :   TVirtualMC::GetMC()->Gspos("QA17", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
    1190             :   //printf("       QA19 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
    1191             : 
    1192           0 :   zd2 += 2.*conpar[0];
    1193             :  
    1194             :   // Third part of VCTCR: tube (ID=196 mm)  
    1195           0 :   tubpar[0] = 19.6/2.;
    1196           0 :   tubpar[1] = 21.2/2.;
    1197           0 :   tubpar[2] = 9.55/2.;
    1198           0 :   TVirtualMC::GetMC()->Gsvolu("QA18", "TUBE", idtmed[7], tubpar, 3);
    1199           0 :   TVirtualMC::GetMC()->Gspos("QA18", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1200             :   // Ch.debug  
    1201             :   //printf("       QA18 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1202             : 
    1203           0 :   zd2 += 2.*tubpar[2];  
    1204             :   
    1205             :   // Flange (ID=196 mm) (last part of VCTCR and first part of VMZAR)
    1206           0 :   tubpar[0] = 19.6/2.;
    1207           0 :   tubpar[1] = 25.3/2.;
    1208           0 :   tubpar[2] = 4.9/2.;
    1209           0 :   TVirtualMC::GetMC()->Gsvolu("QF01", "TUBE", idtmed[7], tubpar, 3);
    1210           0 :   TVirtualMC::GetMC()->Gspos("QF01", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1211             :   // Ch.debug  
    1212             :   //printf("       QF01  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1213             : 
    1214           0 :   zd2 += 2.*tubpar[2];
    1215             :   
    1216             :   // VMZAR (5 volumes)  
    1217           0 :   tubpar[0] = 20.2/2.;
    1218           0 :   tubpar[1] = 20.6/2.;
    1219           0 :   tubpar[2] = 2.15/2.;
    1220           0 :   TVirtualMC::GetMC()->Gsvolu("QA19", "TUBE", idtmed[7], tubpar, 3);
    1221           0 :   TVirtualMC::GetMC()->Gspos("QA19", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1222             :   // Ch.debug  
    1223             :   //printf("       QA19  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1224             : 
    1225           0 :   zd2 += 2.*tubpar[2];
    1226             :   
    1227           0 :   conpar[0] = 6.9/2.;
    1228           0 :   conpar[1] = 20.2/2.;
    1229           0 :   conpar[2] = 20.6/2.;
    1230           0 :   conpar[3] = 23.9/2.;
    1231           0 :   conpar[4] = 24.3/2.;
    1232           0 :   TVirtualMC::GetMC()->Gsvolu("QA20", "CONE", idtmed[7], conpar, 5);
    1233           0 :   TVirtualMC::GetMC()->Gspos("QA20", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
    1234             :   // Ch.debug  
    1235             :   //printf("       QA20 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
    1236             : 
    1237           0 :   zd2 += 2.*conpar[0];
    1238             : 
    1239           0 :   tubpar[0] = 23.9/2.;
    1240           0 :   tubpar[1] = 25.5/2.;
    1241           0 :   tubpar[2] = 17.0/2.;
    1242           0 :   TVirtualMC::GetMC()->Gsvolu("QA21", "TUBE", idtmed[7], tubpar, 3);
    1243           0 :   TVirtualMC::GetMC()->Gspos("QA21", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1244             :   // Ch.debug  
    1245             :   //printf("       QA21  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1246             : 
    1247           0 :   zd2 += 2.*tubpar[2];
    1248             :   
    1249           0 :   conpar[0] = 6.9/2.;
    1250           0 :   conpar[1] = 23.9/2.;
    1251           0 :   conpar[2] = 24.3/2.;
    1252           0 :   conpar[3] = 20.2/2.;
    1253           0 :   conpar[4] = 20.6/2.;
    1254           0 :   TVirtualMC::GetMC()->Gsvolu("QA22", "CONE", idtmed[7], conpar, 5);
    1255           0 :   TVirtualMC::GetMC()->Gspos("QA22", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
    1256             :   // Ch.debug  
    1257             :   //printf("       QA22 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
    1258             : 
    1259           0 :   zd2 += 2.*conpar[0];
    1260             :   
    1261           0 :   tubpar[0] = 20.2/2.;
    1262           0 :   tubpar[1] = 20.6/2.;
    1263           0 :   tubpar[2] = 2.15/2.;
    1264           0 :   TVirtualMC::GetMC()->Gsvolu("QA23", "TUBE", idtmed[7], tubpar, 3);
    1265           0 :   TVirtualMC::GetMC()->Gspos("QA23", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1266             :   // Ch.debug  
    1267             :   //printf("       QA23  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1268             : 
    1269           0 :   zd2 += 2.*tubpar[2];
    1270             :   
    1271             :   // Flange (ID=196 mm)(last part of VMZAR and first part of VCTYD)
    1272           0 :   tubpar[0] = 19.6/2.;
    1273           0 :   tubpar[1] = 25.3/2.;
    1274           0 :   tubpar[2] = 4.9/2.;
    1275           0 :   TVirtualMC::GetMC()->Gsvolu("QF02", "TUBE", idtmed[7], tubpar, 3);
    1276           0 :   TVirtualMC::GetMC()->Gspos("QF02", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1277             :   // Ch.debug  
    1278             :   //printf("       QF02 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1279             : 
    1280           0 :   zd2 += 2.*tubpar[2];
    1281             :   
    1282             :   // simulation of the trousers (VCTYB)     
    1283           0 :   tubpar[0] = 19.6/2.;
    1284           0 :   tubpar[1] = 20.0/2.;
    1285           0 :   tubpar[2] = 3.9/2.;
    1286           0 :   TVirtualMC::GetMC()->Gsvolu("QA24", "TUBE", idtmed[7], tubpar, 3);
    1287           0 :   TVirtualMC::GetMC()->Gspos("QA24", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1288             :   // Ch.debug
    1289             :   //printf("       QA24  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1290             : 
    1291           0 :   zd2 += 2.*tubpar[2];
    1292             : 
    1293             :   // transition cone from ID=196. to ID=216.6
    1294           0 :   conpar[0] = 32.55/2.;
    1295           0 :   conpar[1] = 19.6/2.;
    1296           0 :   conpar[2] = 20.0/2.;
    1297           0 :   conpar[3] = 21.66/2.;
    1298           0 :   conpar[4] = 22.06/2.;
    1299           0 :   TVirtualMC::GetMC()->Gsvolu("QA25", "CONE", idtmed[7], conpar, 5);
    1300           0 :   TVirtualMC::GetMC()->Gspos("QA25", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
    1301             :   // Ch.debug  
    1302             :   //printf("       QA25 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
    1303             : 
    1304           0 :   zd2 += 2.*conpar[0]; 
    1305             :   
    1306             :   // tube  
    1307           0 :   tubpar[0] = 21.66/2.;
    1308           0 :   tubpar[1] = 22.06/2.;
    1309           0 :   tubpar[2] = 28.6/2.;
    1310           0 :   TVirtualMC::GetMC()->Gsvolu("QA26", "TUBE", idtmed[7], tubpar, 3);
    1311           0 :   TVirtualMC::GetMC()->Gspos("QA26", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
    1312             :   // Ch.debug 
    1313             :   //printf("       QA26  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1314             : 
    1315           0 :   zd2 += 2.*tubpar[2];
    1316             : 
    1317             :   // --------------------------------------------------------
    1318             :   // RECOMBINATION CHAMBER IMPLEMENTED USING TGeo CLASSES!!!!
    1319             :   // author: Chiara (June 2008)
    1320             :   // --------------------------------------------------------
    1321             :   // TRANSFORMATION MATRICES
    1322             :   // Combi transformation: 
    1323             :   dx = -3.970000;
    1324             :   dy = 0.000000;
    1325             :   dz = 0.0;
    1326             :   // Rotation: 
    1327             :   thx = 84.989100;   phx = 0.000000;
    1328             :   thy = 90.000000;   phy = 90.000000;
    1329             :   thz = 5.010900;    phz = 180.000000;
    1330           0 :   TGeoRotation *rotMatrix1 = new TGeoRotation("",thx,phx,thy,phy,thz,phz);
    1331             :   // Combi transformation: 
    1332             :   dx = -3.970000;
    1333             :   dy = 0.000000;
    1334             :   dz = 0.0;
    1335           0 :   TGeoCombiTrans *rotMatrix2 = new TGeoCombiTrans("ZDC_c1", dx,dy,dz,rotMatrix1);
    1336           0 :   rotMatrix2->RegisterYourself();
    1337             :   // Combi transformation: 
    1338             :   dx = 3.970000;
    1339             :   dy = 0.000000;
    1340             :   dz = 0.0;
    1341             :   // Rotation: 
    1342             :   thx = 95.010900;   phx = 0.000000;
    1343             :   thy = 90.000000;   phy = 90.000000;
    1344             :   thz = 5.010900;    phz = 0.000000;
    1345           0 :   TGeoRotation *rotMatrix3 = new TGeoRotation("",thx,phx,thy,phy,thz,phz);
    1346           0 :   TGeoCombiTrans *rotMatrix4 = new TGeoCombiTrans("ZDC_c2", dx,dy,dz,rotMatrix3);
    1347           0 :   rotMatrix4->RegisterYourself();
    1348             :   
    1349             :   
    1350             :   // VOLUMES DEFINITION
    1351             :   // Volume: ZDCA
    1352           0 :   TGeoVolume *pZDCA = gGeoManager->GetVolume("ZDCA");
    1353             :   
    1354           0 :   conpar[0] = (90.1-0.95-0.26)/2.;
    1355           0 :   conpar[1] = 0.0/2.;
    1356           0 :   conpar[2] = 21.6/2.;
    1357           0 :   conpar[3] = 0.0/2.;
    1358           0 :   conpar[4] = 5.8/2.;
    1359           0 :   new TGeoCone("QALext", conpar[0],conpar[1],conpar[2],conpar[3],conpar[4]);
    1360             :   
    1361           0 :   conpar[0] = (90.1-0.95-0.26)/2.;
    1362           0 :   conpar[1] = 0.0/2.;
    1363           0 :   conpar[2] = 21.2/2.;
    1364           0 :   conpar[3] = 0.0/2.;
    1365           0 :   conpar[4] = 5.4/2.;
    1366           0 :   new TGeoCone("QALint", conpar[0],conpar[1],conpar[2],conpar[3],conpar[4]);
    1367             : 
    1368             :   // Outer trousers
    1369           0 :   TGeoCompositeShape *pOutTrousers = new TGeoCompositeShape("outTrousers", "QALext:ZDC_c1+QALext:ZDC_c2");
    1370             :   
    1371             :   // Volume: QALext
    1372             :   //TGeoMedium *medZDCFe = gGeoManager->GetMedium("ZDC_ZIRON");
    1373           0 :   TGeoVolume *pQALext = new TGeoVolume("QALext",pOutTrousers, medZDCFe);
    1374           0 :   pQALext->SetLineColor(kBlue);
    1375           0 :   pQALext->SetVisLeaves(kTRUE);
    1376             :   //
    1377           0 :   TGeoTranslation *tr1 = new TGeoTranslation(0., 0., (Double_t) conpar[0]+0.95+zd2);
    1378           0 :   pZDCA->AddNode(pQALext, 1, tr1);
    1379             :   // Inner trousers
    1380           0 :   TGeoCompositeShape *pIntTrousers = new TGeoCompositeShape("intTrousers", "QALint:ZDC_c1+QALint:ZDC_c2");
    1381             :   // Volume: QALint
    1382             :   //TGeoMedium *medZDCvoid = gGeoManager->GetMedium("ZDC_ZVOID");
    1383           0 :   TGeoVolume *pQALint = new TGeoVolume("QALint",pIntTrousers, medZDCvoid);
    1384           0 :   pQALint->SetLineColor(kAzure);
    1385           0 :   pQALint->SetVisLeaves(kTRUE);
    1386           0 :   pQALext->AddNode(pQALint, 1);
    1387             :     
    1388           0 :   zd2 += 90.1;
    1389             :   
    1390             :   //  second section : 2 tubes (ID = 54. OD = 58.)  
    1391           0 :   tubpar[0] = 5.4/2.;
    1392           0 :   tubpar[1] = 5.8/2.;
    1393           0 :   tubpar[2] = 40.0/2.;
    1394           0 :   TVirtualMC::GetMC()->Gsvolu("QA27", "TUBE", idtmed[7], tubpar, 3);
    1395           0 :   TVirtualMC::GetMC()->Gspos("QA27", 1, "ZDCA", -15.8/2., 0., tubpar[2]+zd2, 0, "ONLY");
    1396           0 :   TVirtualMC::GetMC()->Gspos("QA27", 2, "ZDCA",  15.8/2., 0., tubpar[2]+zd2, 0, "ONLY");  
    1397             :   // Ch.debug
    1398             :   //printf("       QA27 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
    1399             :   
    1400           0 :   zd2 += 2.*tubpar[2];
    1401             :  
    1402             :   // transition x2zdc to recombination chamber : skewed cone  
    1403           0 :   conpar[0] = (10.-1.)/2.;
    1404           0 :   conpar[1] = 5.4/2.;
    1405           0 :   conpar[2] = 5.8/2.;
    1406           0 :   conpar[3] = 6.3/2.;
    1407           0 :   conpar[4] = 7.0/2.;
    1408           0 :   TVirtualMC::GetMC()->Gsvolu("QA28", "CONE", idtmed[7], conpar, 5); 
    1409           0 :   TVirtualMC::GetMC()->Gspos("QA28", 1, "ZDCA", -7.9-0.175, 0., conpar[0]+0.5+zd2, irotpipe1, "ONLY");
    1410           0 :   TVirtualMC::GetMC()->Gspos("QA28", 2, "ZDCA", 7.9+0.175, 0., conpar[0]+0.5+zd2, irotpipe2, "ONLY");
    1411             :   //printf("       QA28 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+0.2+zd2);
    1412             : 
    1413           0 :   zd2 += 2.*conpar[0]+1.;
    1414             :   
    1415             :   // 2 tubes (ID = 63 mm OD=70 mm)      
    1416           0 :   tubpar[0] = 6.3/2.;
    1417           0 :   tubpar[1] = 7.0/2.;
    1418           0 :   tubpar[2] = (342.5+498.3)/2.;
    1419           0 :   TVirtualMC::GetMC()->Gsvolu("QA29", "TUBE", idtmed[7], tubpar, 3);
    1420           0 :   TVirtualMC::GetMC()->Gspos("QA29", 1, "ZDCA", -16.5/2., 0., tubpar[2]+zd2, 0, "ONLY");
    1421           0 :   TVirtualMC::GetMC()->Gspos("QA29", 2, "ZDCA",  16.5/2., 0., tubpar[2]+zd2, 0, "ONLY");
    1422             :   //printf("       QA29 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);  
    1423             : 
    1424           0 :   zd2 += 2.*tubpar[2];
    1425             :            
    1426             :   // -- Luminometer (Cu box) in front of ZN - side A
    1427           0 :   boxpar[0] = 8.0/2.;
    1428           0 :   boxpar[1] = 8.0/2.;
    1429           0 :   boxpar[2] = fLumiLength/2.;
    1430           0 :   TVirtualMC::GetMC()->Gsvolu("QLUA", "BOX ", idtmed[9], boxpar, 3);
    1431           0 :   TVirtualMC::GetMC()->Gspos("QLUA", 1, "ZDCA", 0., 0.,  fPosZNA[2]-66.-boxpar[2], 0, "ONLY");
    1432             :   //printf("       QLUA LUMINOMETER from z = %1.2f to z= %1.2f\n\n",  fPosZNA[2]-66., fPosZNA[2]-66.-2*boxpar[2]);
    1433             : 
    1434             :   //printf("       END OF BEAM PIPE VOLUME DEFINITION AT z = %f\n",zd2);
    1435             :   
    1436             : 
    1437             :   // ----------------------------------------------------------------
    1438             :   // --  MAGNET DEFINITION  -> LHC OPTICS 6.5  
    1439             :   // ----------------------------------------------------------------      
    1440             :   // ***************************************************************  
    1441             :   //            SIDE C - RB26  (dimuon side) 
    1442             :   // ***************************************************************   
    1443             :   // --  COMPENSATOR DIPOLE (MBXW)
    1444             :   zCorrDip = 1972.5;   
    1445             :   
    1446             :   // --  GAP (VACUUM WITH MAGNETIC FIELD)
    1447           0 :   tubpar[0] = 0.;
    1448           0 :   tubpar[1] = 3.14;
    1449           0 :   tubpar[2] = 153./2.;
    1450           0 :   TVirtualMC::GetMC()->Gsvolu("MBXW", "TUBE", idtmed[11], tubpar, 3);
    1451             : 
    1452             :   // --  YOKE 
    1453           0 :   tubpar[0] = 4.5;
    1454           0 :   tubpar[1] = 55.;
    1455           0 :   tubpar[2] = 153./2.;
    1456           0 :   TVirtualMC::GetMC()->Gsvolu("YMBX", "TUBE", idtmed[7], tubpar, 3);
    1457             : 
    1458           0 :   TVirtualMC::GetMC()->Gspos("MBXW", 1, "ZDCC", 0., 0., -tubpar[2]-zCorrDip, 0, "ONLY");
    1459           0 :   TVirtualMC::GetMC()->Gspos("YMBX", 1, "ZDCC", 0., 0., -tubpar[2]-zCorrDip, 0, "ONLY");
    1460             :   
    1461             :   
    1462             :   // -- INNER TRIPLET 
    1463             :   zInnTrip = 2296.5; 
    1464             : 
    1465             :   // -- DEFINE MQXL AND MQX QUADRUPOLE ELEMENT 
    1466             :   // --  MQXL 
    1467             :   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
    1468           0 :   tubpar[0] = 0.;
    1469           0 :   tubpar[1] = 3.14;
    1470           0 :   tubpar[2] = 637./2.;
    1471           0 :   TVirtualMC::GetMC()->Gsvolu("MQXL", "TUBE", idtmed[11], tubpar, 3);
    1472             :     
    1473             :   // --  YOKE 
    1474           0 :   tubpar[0] = 3.5;
    1475           0 :   tubpar[1] = 22.;
    1476           0 :   tubpar[2] = 637./2.;
    1477           0 :   TVirtualMC::GetMC()->Gsvolu("YMQL", "TUBE", idtmed[7], tubpar, 3);
    1478             :   
    1479           0 :   TVirtualMC::GetMC()->Gspos("MQXL", 1, "ZDCC", 0., 0., -tubpar[2]-zInnTrip, 0, "ONLY");
    1480           0 :   TVirtualMC::GetMC()->Gspos("YMQL", 1, "ZDCC", 0., 0., -tubpar[2]-zInnTrip, 0, "ONLY");
    1481             :   
    1482           0 :   TVirtualMC::GetMC()->Gspos("MQXL", 2, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-2400., 0, "ONLY");
    1483           0 :   TVirtualMC::GetMC()->Gspos("YMQL", 2, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-2400., 0, "ONLY");
    1484             :   
    1485             :   // --  MQX 
    1486             :   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
    1487           0 :   tubpar[0] = 0.;
    1488           0 :   tubpar[1] = 3.14;
    1489           0 :   tubpar[2] = 550./2.;
    1490           0 :   TVirtualMC::GetMC()->Gsvolu("MQX ", "TUBE", idtmed[11], tubpar, 3);
    1491             :   
    1492             :   // --  YOKE 
    1493           0 :   tubpar[0] = 3.5;
    1494           0 :   tubpar[1] = 22.;
    1495           0 :   tubpar[2] = 550./2.;
    1496           0 :   TVirtualMC::GetMC()->Gsvolu("YMQ ", "TUBE", idtmed[7], tubpar, 3);
    1497             :   
    1498           0 :   TVirtualMC::GetMC()->Gspos("MQX ", 1, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-908.5,  0, "ONLY");
    1499           0 :   TVirtualMC::GetMC()->Gspos("YMQ ", 1, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-908.5,  0, "ONLY");
    1500             :   
    1501           0 :   TVirtualMC::GetMC()->Gspos("MQX ", 2, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-1558.5, 0, "ONLY");
    1502           0 :   TVirtualMC::GetMC()->Gspos("YMQ ", 2, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-1558.5, 0, "ONLY");
    1503             :   
    1504             :   // -- SEPARATOR DIPOLE D1 
    1505             :   zD1 = 5838.3001;
    1506             :   
    1507             :   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
    1508           0 :   tubpar[0] = 0.;
    1509           0 :   tubpar[1] = 3.46;
    1510           0 :   tubpar[2] = 945./2.;
    1511           0 :   TVirtualMC::GetMC()->Gsvolu("MD1 ", "TUBE", idtmed[11], tubpar, 3);
    1512             :   
    1513             :   // --  Insert horizontal Cu plates inside D1 
    1514             :   // --   (to simulate the vacuum chamber)
    1515           0 :   boxpar[0] = TMath::Sqrt(tubpar[1]*tubpar[1]-(2.98+0.2)*(2.98+0.2)) - 0.05;
    1516           0 :   boxpar[1] = 0.2/2.;
    1517           0 :   boxpar[2] = 945./2.;
    1518           0 :   TVirtualMC::GetMC()->Gsvolu("MD1V", "BOX ", idtmed[6], boxpar, 3);
    1519           0 :   TVirtualMC::GetMC()->Gspos("MD1V", 1, "MD1 ", 0., 2.98+boxpar[1], 0., 0, "ONLY");
    1520           0 :   TVirtualMC::GetMC()->Gspos("MD1V", 2, "MD1 ", 0., -2.98-boxpar[1], 0., 0, "ONLY");
    1521             :     
    1522             :   // --  YOKE 
    1523           0 :   tubpar[0] = 3.68;
    1524           0 :   tubpar[1] = 110./2.;
    1525           0 :   tubpar[2] = 945./2.;
    1526           0 :   TVirtualMC::GetMC()->Gsvolu("YD1 ", "TUBE", idtmed[7], tubpar, 3);
    1527             :   
    1528           0 :   TVirtualMC::GetMC()->Gspos("YD1 ", 1, "ZDCC", 0., 0., -tubpar[2]-zD1, 0, "ONLY");
    1529           0 :   TVirtualMC::GetMC()->Gspos("MD1 ", 1, "ZDCC", 0., 0., -tubpar[2]-zD1, 0, "ONLY");
    1530             :   // Ch debug
    1531             :   //printf("       MD1 from z = %1.2f to z= %1.2f cm\n",-zD1, -zD1-2*tubpar[2]); 
    1532             :   
    1533             :   // -- DIPOLE D2 
    1534             :   zD2 = 12167.8;
    1535             :   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
    1536           0 :   tubpar[0] = 0.;
    1537           0 :   tubpar[1] = 7.5/2.;
    1538           0 :   tubpar[2] = 945./2.;
    1539           0 :   TVirtualMC::GetMC()->Gsvolu("MD2 ", "TUBE", idtmed[11], tubpar, 3);
    1540             :   
    1541             :   // --  YOKE 
    1542           0 :   tubpar[0] = 0.;
    1543           0 :   tubpar[1] = 55.;
    1544           0 :   tubpar[2] = 945./2.;
    1545           0 :   TVirtualMC::GetMC()->Gsvolu("YD2 ", "TUBE", idtmed[7], tubpar, 3);
    1546             :   
    1547           0 :   TVirtualMC::GetMC()->Gspos("YD2 ", 1, "ZDCC", 0., 0., -tubpar[2]-zD2, 0, "ONLY");
    1548             :   // Ch debug
    1549             :   //printf("       YD2 from z = %1.2f to z= %1.2f cm\n",-zD2, -zD2-2*tubpar[2]); 
    1550             :   
    1551           0 :   TVirtualMC::GetMC()->Gspos("MD2 ", 1, "YD2 ", -9.4, 0., 0., 0, "ONLY");
    1552           0 :   TVirtualMC::GetMC()->Gspos("MD2 ", 2, "YD2 ",  9.4, 0., 0., 0, "ONLY");
    1553             :   
    1554             :   // ***************************************************************  
    1555             :   //            SIDE A - RB24 
    1556             :   // ***************************************************************
    1557             :   
    1558             :   // COMPENSATOR DIPOLE (MCBWA) (2nd compensator)
    1559             :   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
    1560           0 :   tubpar[0] = 0.;
    1561           0 :   tubpar[1] = 3.;  
    1562           0 :   tubpar[2] = 153./2.;
    1563           0 :   TVirtualMC::GetMC()->Gsvolu("MCBW", "TUBE", idtmed[11], tubpar, 3);  
    1564           0 :   TVirtualMC::GetMC()->Gspos("MCBW", 1, "ZDCA", 0., 0., tubpar[2]+zCorrDip, 0, "ONLY");
    1565             :     
    1566             :    // --  YOKE 
    1567           0 :   tubpar[0] = 4.5;
    1568           0 :   tubpar[1] = 55.;
    1569           0 :   tubpar[2] = 153./2.;
    1570           0 :   TVirtualMC::GetMC()->Gsvolu("YMCB", "TUBE", idtmed[7], tubpar, 3);
    1571           0 :   TVirtualMC::GetMC()->Gspos("YMCB", 1, "ZDCA", 0., 0., tubpar[2]+zCorrDip, 0, "ONLY");  
    1572             :   
    1573             :    // -- INNER TRIPLET 
    1574             :   // -- DEFINE MQX1 AND MQX2 QUADRUPOLE ELEMENT 
    1575             :   // --  MQX1 
    1576             :   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
    1577           0 :   tubpar[0] = 0.;
    1578           0 :   tubpar[1] = 3.14;
    1579           0 :   tubpar[2] = 637./2.;
    1580           0 :   TVirtualMC::GetMC()->Gsvolu("MQX1", "TUBE", idtmed[11], tubpar, 3);
    1581           0 :   TVirtualMC::GetMC()->Gsvolu("MQX4", "TUBE", idtmed[11], tubpar, 3);
    1582             :     
    1583             :   // --  YOKE 
    1584           0 :   tubpar[0] = 3.5;
    1585           0 :   tubpar[1] = 22.;
    1586           0 :   tubpar[2] = 637./2.;
    1587           0 :   TVirtualMC::GetMC()->Gsvolu("YMQ1", "TUBE", idtmed[7], tubpar, 3);
    1588             : 
    1589             :   // -- Q1
    1590           0 :   TVirtualMC::GetMC()->Gspos("MQX1", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip, 0, "ONLY");
    1591           0 :   TVirtualMC::GetMC()->Gspos("YMQ1", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip, 0, "ONLY");
    1592             : 
    1593             :    // -- BEAM SCREEN FOR Q1
    1594           0 :    tubpar[0] = 4.78/2.;
    1595           0 :    tubpar[1] = 5.18/2.;
    1596           0 :    tubpar[2] = 637./2.;
    1597           0 :    TVirtualMC::GetMC()->Gsvolu("QBS1", "TUBE", idtmed[6], tubpar, 3);
    1598           0 :    TVirtualMC::GetMC()->Gspos("QBS1", 1, "MQX1", 0., 0., 0., 0, "ONLY");
    1599             :    // INSERT VERTICAL PLATE INSIDE Q1
    1600           0 :    boxpar[0] = 0.2/2.0;
    1601           0 :    boxpar[1] = TMath::Sqrt(tubpar[0]*tubpar[0]-(1.9+0.2)*(1.9+0.2));
    1602           0 :    boxpar[2] =637./2.;
    1603           0 :    TVirtualMC::GetMC()->Gsvolu("QBS2", "BOX ", idtmed[6], boxpar, 3);
    1604           0 :    TVirtualMC::GetMC()->Gspos("QBS2", 1, "MQX1", 1.9+boxpar[0], 0., 0., 0, "ONLY");
    1605           0 :    TVirtualMC::GetMC()->Gspos("QBS2", 2, "MQX1", -1.9-boxpar[0], 0., 0., 0, "ONLY");
    1606             : 
    1607             :    // -- Q3   
    1608           0 :    TVirtualMC::GetMC()->Gspos("MQX4", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip+2400., 0, "ONLY");
    1609           0 :    TVirtualMC::GetMC()->Gspos("YMQ1", 2, "ZDCA", 0., 0., tubpar[2]+zInnTrip+2400., 0, "ONLY");
    1610             : 
    1611             :    // -- BEAM SCREEN FOR Q3
    1612           0 :    tubpar[0] = 5.79/2.;
    1613           0 :    tubpar[1] = 6.14/2.;
    1614           0 :    tubpar[2] = 637./2.;
    1615           0 :    TVirtualMC::GetMC()->Gsvolu("QBS3", "TUBE", idtmed[6], tubpar, 3);
    1616           0 :    TVirtualMC::GetMC()->Gspos("QBS3", 1, "MQX4", 0., 0., 0., 0, "ONLY");
    1617             :    // INSERT VERTICAL PLATE INSIDE Q3
    1618           0 :    boxpar[0] = 0.2/2.0;
    1619           0 :    boxpar[1] = TMath::Sqrt(tubpar[0]*tubpar[0]-(2.405+0.2)*(2.405+0.2));
    1620           0 :    boxpar[2] =637./2.;
    1621           0 :    TVirtualMC::GetMC()->Gsvolu("QBS4", "BOX ", idtmed[6], boxpar, 3);
    1622           0 :    TVirtualMC::GetMC()->Gspos("QBS4", 1, "MQX4", 2.405+boxpar[0], 0., 0., 0, "ONLY");
    1623           0 :    TVirtualMC::GetMC()->Gspos("QBS4", 2, "MQX4", -2.405-boxpar[0], 0., 0., 0, "ONLY");
    1624             :     
    1625             :   
    1626             :   
    1627             :   // --  MQX2
    1628             :   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
    1629           0 :   tubpar[0] = 0.;
    1630           0 :   tubpar[1] = 3.14;
    1631           0 :   tubpar[2] = 550./2.;
    1632           0 :   TVirtualMC::GetMC()->Gsvolu("MQX2", "TUBE", idtmed[11], tubpar, 3);
    1633           0 :   TVirtualMC::GetMC()->Gsvolu("MQX3", "TUBE", idtmed[11], tubpar, 3);
    1634             :   
    1635             :   // --  YOKE 
    1636           0 :   tubpar[0] = 3.5;
    1637           0 :   tubpar[1] = 22.;
    1638           0 :   tubpar[2] = 550./2.;
    1639           0 :   TVirtualMC::GetMC()->Gsvolu("YMQ2", "TUBE", idtmed[7], tubpar, 3);
    1640             : 
    1641             :    // -- BEAM SCREEN FOR Q2
    1642           0 :    tubpar[0] = 5.79/2.;
    1643           0 :    tubpar[1] = 6.14/2.;
    1644           0 :    tubpar[2] = 550./2.;
    1645           0 :    TVirtualMC::GetMC()->Gsvolu("QBS5", "TUBE", idtmed[6], tubpar, 3);
    1646             :    //    VERTICAL PLATE INSIDE Q2
    1647           0 :    boxpar[0] = 0.2/2.0;
    1648           0 :    boxpar[1] = TMath::Sqrt(tubpar[0]*tubpar[0]-(2.405+0.2)*(2.405+0.2));
    1649           0 :    boxpar[2] =550./2.;
    1650           0 :    TVirtualMC::GetMC()->Gsvolu("QBS6", "BOX ", idtmed[6], boxpar, 3);
    1651             : 
    1652             :   // -- Q2A
    1653           0 :   TVirtualMC::GetMC()->Gspos("MQX2", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip+908.5,  0, "ONLY");
    1654           0 :   TVirtualMC::GetMC()->Gspos("QBS5", 1, "MQX2", 0., 0., 0., 0, "ONLY");  
    1655           0 :   TVirtualMC::GetMC()->Gspos("QBS6", 1, "MQX2", 2.405+boxpar[0], 0., 0., 0, "ONLY");
    1656           0 :   TVirtualMC::GetMC()->Gspos("QBS6", 2, "MQX2", -2.405-boxpar[0], 0., 0., 0, "ONLY");  
    1657           0 :   TVirtualMC::GetMC()->Gspos("YMQ2", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip+908.5,  0, "ONLY");
    1658             : 
    1659             :   
    1660             :   // -- Q2B
    1661           0 :   TVirtualMC::GetMC()->Gspos("MQX3", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip+1558.5, 0, "ONLY");
    1662           0 :   TVirtualMC::GetMC()->Gspos("QBS5", 2, "MQX3", 0., 0., 0., 0, "ONLY");  
    1663           0 :   TVirtualMC::GetMC()->Gspos("QBS6", 3, "MQX3", 2.405+boxpar[0], 0., 0., 0, "ONLY");
    1664           0 :   TVirtualMC::GetMC()->Gspos("QBS6", 4, "MQX3", -2.405-boxpar[0], 0., 0., 0, "ONLY");
    1665           0 :   TVirtualMC::GetMC()->Gspos("YMQ2", 2, "ZDCA", 0., 0., tubpar[2]+zInnTrip+1558.5, 0, "ONLY");
    1666             : 
    1667             :   // -- SEPARATOR DIPOLE D1 
    1668             :   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
    1669           0 :   tubpar[0] = 0.;
    1670           0 :   tubpar[1] = 6.75/2.;//3.375
    1671           0 :   tubpar[2] = 945./2.;
    1672           0 :   TVirtualMC::GetMC()->Gsvolu("MD1L", "TUBE", idtmed[11], tubpar, 3);
    1673             : 
    1674             :   // --  The beam screen tube is provided by the beam pipe in D1 (QA03 volume)
    1675             :   // --  Insert the beam screen horizontal Cu plates inside D1  
    1676             :   // --   (to simulate the vacuum chamber)
    1677           0 :   boxpar[0] = TMath::Sqrt(tubpar[1]*tubpar[1]-(2.885+0.2)*(2.885+0.2));
    1678           0 :   boxpar[1] = 0.2/2.;
    1679           0 :   boxpar[2] =945./2.;  
    1680           0 :   TVirtualMC::GetMC()->Gsvolu("QBS7", "BOX ", idtmed[6], boxpar, 3);
    1681           0 :   TVirtualMC::GetMC()->Gspos("QBS7", 1, "MD1L", 0., 2.885+boxpar[1],0., 0, "ONLY");
    1682           0 :   TVirtualMC::GetMC()->Gspos("QBS7", 2, "MD1L", 0., -2.885-boxpar[1],0., 0, "ONLY");  
    1683             :     
    1684             :   // --  YOKE 
    1685           0 :   tubpar[0] = 3.68;
    1686           0 :   tubpar[1] = 110./2;
    1687           0 :   tubpar[2] = 945./2.;
    1688           0 :   TVirtualMC::GetMC()->Gsvolu("YD1L", "TUBE", idtmed[7], tubpar, 3);
    1689             :   
    1690           0 :   TVirtualMC::GetMC()->Gspos("YD1L", 1, "ZDCA", 0., 0., tubpar[2]+zD1, 0, "ONLY");  
    1691           0 :   TVirtualMC::GetMC()->Gspos("MD1L", 1, "ZDCA", 0., 0., tubpar[2]+zD1, 0, "ONLY");  
    1692             :   
    1693             :   // -- DIPOLE D2 
    1694             :   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
    1695           0 :   tubpar[0] = 0.;
    1696           0 :   tubpar[1] = 7.5/2.; // this has to be checked
    1697           0 :   tubpar[2] = 945./2.;
    1698           0 :   TVirtualMC::GetMC()->Gsvolu("MD2L", "TUBE", idtmed[11], tubpar, 3);
    1699             :   
    1700             :   // --  YOKE 
    1701           0 :   tubpar[0] = 0.;
    1702           0 :   tubpar[1] = 55.;
    1703           0 :   tubpar[2] = 945./2.;
    1704           0 :   TVirtualMC::GetMC()->Gsvolu("YD2L", "TUBE", idtmed[7], tubpar, 3);
    1705             :   
    1706           0 :   TVirtualMC::GetMC()->Gspos("YD2L", 1, "ZDCA", 0., 0., tubpar[2]+zD2, 0, "ONLY");
    1707             :   
    1708           0 :   TVirtualMC::GetMC()->Gspos("MD2L", 1, "YD2L", -9.4, 0., 0., 0, "ONLY");
    1709           0 :   TVirtualMC::GetMC()->Gspos("MD2L", 2, "YD2L",  9.4, 0., 0., 0, "ONLY");
    1710             :   
    1711             :   // -- END OF MAGNET DEFINITION     
    1712           0 : }
    1713             :   
    1714             : //_____________________________________________________________________________
    1715             : void AliZDCv3::CreateZDC()
    1716             : {
    1717             :  //
    1718             :  // Create the various ZDCs (ZN + ZP)
    1719             :  //
    1720             :   
    1721           0 :   Float_t dimPb[6], dimVoid[6];
    1722             :   
    1723           0 :   Int_t *idtmed = fIdtmed->GetArray();
    1724             : 
    1725             :   // Parameters for hadronic calorimeters geometry
    1726             :   // NB -> parameters used ONLY in CreateZDC()
    1727           0 :   Float_t fGrvZN[3] = {0.03, 0.03, 50.};  // Grooves for neutron detector
    1728           0 :   Float_t fGrvZP[3] = {0.04, 0.04, 75.};  // Grooves for proton detector
    1729             :   Int_t   fDivZN[3] = {11, 11, 0};        // Division for neutron detector
    1730             :   Int_t   fDivZP[3] = {7, 15, 0};         // Division for proton detector
    1731             :   Int_t   fTowZN[2] = {2, 2};             // Tower for neutron detector
    1732             :   Int_t   fTowZP[2] = {4, 1};             // Tower for proton detector
    1733             : 
    1734             :   // Parameters for EM calorimeter geometry
    1735             :   // NB -> parameters used ONLY in CreateZDC()
    1736           0 :   Float_t kDimZEMPb  = 0.15*(TMath::Sqrt(2.));  // z-dimension of the Pb slice
    1737             :   Float_t kFibRadZEM = 0.0315;                  // External fiber radius (including cladding)
    1738             :   Int_t   fDivZEM[3] = {92, 0, 20};             // Divisions for EM detector
    1739           0 :   Float_t fDimZEM[6] = {fZEMLength, 3.5, 3.5, 45., 0., 0.}; // Dimensions of EM detector
    1740           0 :   Float_t fFibZEM2 = fDimZEM[2]/TMath::Sin(fDimZEM[3]*kDegrad)-kFibRadZEM;
    1741           0 :   Float_t fFibZEM[3] = {0., 0.0275, fFibZEM2};  // Fibers for EM calorimeter
    1742             : 
    1743             :   
    1744             :   //-- Create calorimeters geometry
    1745             :   
    1746             :   // -------------------------------------------------------------------------------
    1747             :   //--> Neutron calorimeter (ZN) 
    1748             :   
    1749           0 :   TVirtualMC::GetMC()->Gsvolu("ZNEU", "BOX ", idtmed[1], fDimZN, 3); // Passive material  
    1750           0 :   TVirtualMC::GetMC()->Gsvolu("ZNF1", "TUBE", idtmed[3], fFibZN, 3); // Active material
    1751           0 :   TVirtualMC::GetMC()->Gsvolu("ZNF2", "TUBE", idtmed[4], fFibZN, 3); 
    1752           0 :   TVirtualMC::GetMC()->Gsvolu("ZNF3", "TUBE", idtmed[4], fFibZN, 3); 
    1753           0 :   TVirtualMC::GetMC()->Gsvolu("ZNF4", "TUBE", idtmed[3], fFibZN, 3); 
    1754           0 :   TVirtualMC::GetMC()->Gsvolu("ZNG1", "BOX ", idtmed[12], fGrvZN, 3); // Empty grooves 
    1755           0 :   TVirtualMC::GetMC()->Gsvolu("ZNG2", "BOX ", idtmed[12], fGrvZN, 3); 
    1756           0 :   TVirtualMC::GetMC()->Gsvolu("ZNG3", "BOX ", idtmed[12], fGrvZN, 3); 
    1757           0 :   TVirtualMC::GetMC()->Gsvolu("ZNG4", "BOX ", idtmed[12], fGrvZN, 3); 
    1758             :   
    1759             :   // Divide ZNEU in towers (for hits purposes) 
    1760             :   
    1761           0 :   TVirtualMC::GetMC()->Gsdvn("ZNTX", "ZNEU", fTowZN[0], 1); // x-tower 
    1762           0 :   TVirtualMC::GetMC()->Gsdvn("ZN1 ", "ZNTX", fTowZN[1], 2); // y-tower
    1763             :   
    1764             :   //-- Divide ZN1 in minitowers 
    1765             :   //  fDivZN[0]= NUMBER OF FIBERS PER TOWER ALONG X-AXIS, 
    1766             :   //  fDivZN[1]= NUMBER OF FIBERS PER TOWER ALONG Y-AXIS
    1767             :   //  (4 fibres per minitower) 
    1768             :   
    1769           0 :   TVirtualMC::GetMC()->Gsdvn("ZNSL", "ZN1 ", fDivZN[1], 2); // Slices 
    1770           0 :   TVirtualMC::GetMC()->Gsdvn("ZNST", "ZNSL", fDivZN[0], 1); // Sticks
    1771             :   
    1772             :   // --- Position the empty grooves in the sticks (4 grooves per stick)
    1773           0 :   Float_t dx = fDimZN[0] / fDivZN[0] / 4.;
    1774           0 :   Float_t dy = fDimZN[1] / fDivZN[1] / 4.;
    1775             :   
    1776           0 :   TVirtualMC::GetMC()->Gspos("ZNG1", 1, "ZNST", 0.-dx, 0.+dy, 0., 0, "ONLY");
    1777           0 :   TVirtualMC::GetMC()->Gspos("ZNG2", 1, "ZNST", 0.+dx, 0.+dy, 0., 0, "ONLY");
    1778           0 :   TVirtualMC::GetMC()->Gspos("ZNG3", 1, "ZNST", 0.-dx, 0.-dy, 0., 0, "ONLY");
    1779           0 :   TVirtualMC::GetMC()->Gspos("ZNG4", 1, "ZNST", 0.+dx, 0.-dy, 0., 0, "ONLY");
    1780             :   
    1781             :   // --- Position the fibers in the grooves 
    1782           0 :   TVirtualMC::GetMC()->Gspos("ZNF1", 1, "ZNG1", 0., 0., 0., 0, "ONLY");
    1783           0 :   TVirtualMC::GetMC()->Gspos("ZNF2", 1, "ZNG2", 0., 0., 0., 0, "ONLY");
    1784           0 :   TVirtualMC::GetMC()->Gspos("ZNF3", 1, "ZNG3", 0., 0., 0., 0, "ONLY");
    1785           0 :   TVirtualMC::GetMC()->Gspos("ZNF4", 1, "ZNG4", 0., 0., 0., 0, "ONLY");
    1786             :   
    1787             :   // --- Position the neutron calorimeter in ZDC 
    1788             :   // -- Rotation of ZDCs
    1789           0 :   Int_t irotzdc;
    1790           0 :   TVirtualMC::GetMC()->Matrix(irotzdc, 90., 180., 90., 90., 180., 0.);
    1791             :   //
    1792           0 :   TVirtualMC::GetMC()->Gspos("ZNEU", 1, "ZDCC", fPosZNC[0], fPosZNC[1], fPosZNC[2]-fDimZN[2], irotzdc, "ONLY");
    1793             :   //Ch debug
    1794             :   //printf("\n ZN -> %f < z < %f cm\n",fPosZN[2],fPosZN[2]-2*fDimZN[2]);
    1795             : 
    1796             :   // --- Position the neutron calorimeter in ZDC2 (left line) 
    1797             :   // -- No Rotation of ZDCs
    1798           0 :   TVirtualMC::GetMC()->Gspos("ZNEU", 2, "ZDCA", fPosZNA[0], fPosZNA[1], fPosZNA[2]+fDimZN[2], 0, "ONLY");
    1799             :   //Ch debug
    1800             :   //printf("\n ZN left -> %f < z < %f cm\n",fPosZNl[2],fPosZNl[2]+2*fDimZN[2]);
    1801             : 
    1802             : 
    1803             :   // -------------------------------------------------------------------------------
    1804             :   //--> Proton calorimeter (ZP)  
    1805             :   
    1806           0 :   TVirtualMC::GetMC()->Gsvolu("ZPRO", "BOX ", idtmed[2], fDimZP, 3); // Passive material
    1807           0 :   TVirtualMC::GetMC()->Gsvolu("ZPF1", "TUBE", idtmed[3], fFibZP, 3); // Active material
    1808           0 :   TVirtualMC::GetMC()->Gsvolu("ZPF2", "TUBE", idtmed[4], fFibZP, 3); 
    1809           0 :   TVirtualMC::GetMC()->Gsvolu("ZPF3", "TUBE", idtmed[4], fFibZP, 3); 
    1810           0 :   TVirtualMC::GetMC()->Gsvolu("ZPF4", "TUBE", idtmed[3], fFibZP, 3); 
    1811           0 :   TVirtualMC::GetMC()->Gsvolu("ZPG1", "BOX ", idtmed[12], fGrvZP, 3); // Empty grooves 
    1812           0 :   TVirtualMC::GetMC()->Gsvolu("ZPG2", "BOX ", idtmed[12], fGrvZP, 3); 
    1813           0 :   TVirtualMC::GetMC()->Gsvolu("ZPG3", "BOX ", idtmed[12], fGrvZP, 3); 
    1814           0 :   TVirtualMC::GetMC()->Gsvolu("ZPG4", "BOX ", idtmed[12], fGrvZP, 3); 
    1815             :     
    1816             :   //-- Divide ZPRO in towers(for hits purposes) 
    1817             :   
    1818           0 :   TVirtualMC::GetMC()->Gsdvn("ZPTX", "ZPRO", fTowZP[0], 1); // x-tower 
    1819           0 :   TVirtualMC::GetMC()->Gsdvn("ZP1 ", "ZPTX", fTowZP[1], 2); // y-tower
    1820             :   
    1821             :   
    1822             :   //-- Divide ZP1 in minitowers 
    1823             :   //  fDivZP[0]= NUMBER OF FIBERS ALONG X-AXIS PER MINITOWER, 
    1824             :   //  fDivZP[1]= NUMBER OF FIBERS ALONG Y-AXIS PER MINITOWER
    1825             :   //  (4 fiber per minitower) 
    1826             :   
    1827           0 :   TVirtualMC::GetMC()->Gsdvn("ZPSL", "ZP1 ", fDivZP[1], 2); // Slices 
    1828           0 :   TVirtualMC::GetMC()->Gsdvn("ZPST", "ZPSL", fDivZP[0], 1); // Sticks
    1829             :   
    1830             :   // --- Position the empty grooves in the sticks (4 grooves per stick)
    1831           0 :   dx = fDimZP[0] / fTowZP[0] / fDivZP[0] / 2.;
    1832           0 :   dy = fDimZP[1] / fTowZP[1] / fDivZP[1] / 2.;
    1833             :   
    1834           0 :   TVirtualMC::GetMC()->Gspos("ZPG1", 1, "ZPST", 0.-dx, 0.+dy, 0., 0, "ONLY");
    1835           0 :   TVirtualMC::GetMC()->Gspos("ZPG2", 1, "ZPST", 0.+dx, 0.+dy, 0., 0, "ONLY");
    1836           0 :   TVirtualMC::GetMC()->Gspos("ZPG3", 1, "ZPST", 0.-dx, 0.-dy, 0., 0, "ONLY");
    1837           0 :   TVirtualMC::GetMC()->Gspos("ZPG4", 1, "ZPST", 0.+dx, 0.-dy, 0., 0, "ONLY");
    1838             :   
    1839             :   // --- Position the fibers in the grooves 
    1840           0 :   TVirtualMC::GetMC()->Gspos("ZPF1", 1, "ZPG1", 0., 0., 0., 0, "ONLY");
    1841           0 :   TVirtualMC::GetMC()->Gspos("ZPF2", 1, "ZPG2", 0., 0., 0., 0, "ONLY");
    1842           0 :   TVirtualMC::GetMC()->Gspos("ZPF3", 1, "ZPG3", 0., 0., 0., 0, "ONLY");
    1843           0 :   TVirtualMC::GetMC()->Gspos("ZPF4", 1, "ZPG4", 0., 0., 0., 0, "ONLY");
    1844             :   
    1845             : 
    1846             :   // --- Position the proton calorimeter in ZDCC
    1847           0 :   TVirtualMC::GetMC()->Gspos("ZPRO", 1, "ZDCC", fPosZPC[0], fPosZPC[1], fPosZPC[2]-fDimZP[2], irotzdc, "ONLY");
    1848             :   //Ch debug
    1849             :   //printf("\n ZP -> %f < z < %f cm\n",fPosZP[2],fPosZP[2]-2*fDimZP[2]);
    1850             :   
    1851             :   // --- Position the proton calorimeter in ZDCA
    1852             :   // --- No rotation 
    1853           0 :   TVirtualMC::GetMC()->Gspos("ZPRO", 2, "ZDCA", fPosZPA[0], fPosZPA[1], fPosZPA[2]+fDimZP[2], 0, "ONLY");
    1854             :   //Ch debug
    1855             :   //printf("\n ZP left -> %f < z < %f cm\n",fPosZPl[2],fPosZPl[2]+2*fDimZP[2]);  
    1856             :     
    1857             :   
    1858             :   // -------------------------------------------------------------------------------
    1859             :   // -> EM calorimeter (ZEM)  
    1860             :   
    1861           0 :   TVirtualMC::GetMC()->Gsvolu("ZEM ", "PARA", idtmed[10], fDimZEM, 6);
    1862             : 
    1863           0 :   Int_t irot1, irot2;
    1864           0 :   TVirtualMC::GetMC()->Matrix(irot1,0.,0.,90.,90.,-90.,0.);                 // Rotation matrix 1  
    1865           0 :   TVirtualMC::GetMC()->Matrix(irot2,180.,0.,90.,fDimZEM[3]+90.,90.,fDimZEM[3]);// Rotation matrix 2
    1866             :   //printf("irot1 = %d, irot2 = %d \n", irot1, irot2);
    1867             :   
    1868           0 :   TVirtualMC::GetMC()->Gsvolu("ZEMF", "TUBE", idtmed[3], fFibZEM, 3);    // Active material
    1869             : 
    1870           0 :   TVirtualMC::GetMC()->Gsdvn("ZETR", "ZEM ", fDivZEM[2], 1);             // Tranches 
    1871             :   
    1872           0 :   dimPb[0] = kDimZEMPb;                                 // Lead slices 
    1873           0 :   dimPb[1] = fDimZEM[2];
    1874           0 :   dimPb[2] = fDimZEM[1];
    1875             :   //dimPb[3] = fDimZEM[3]; //controllare
    1876           0 :   dimPb[3] = 90.-fDimZEM[3]; //originale
    1877           0 :   dimPb[4] = 0.;
    1878           0 :   dimPb[5] = 0.;
    1879           0 :   TVirtualMC::GetMC()->Gsvolu("ZEL0", "PARA", idtmed[5], dimPb, 6);
    1880           0 :   TVirtualMC::GetMC()->Gsvolu("ZEL1", "PARA", idtmed[5], dimPb, 6);
    1881           0 :   TVirtualMC::GetMC()->Gsvolu("ZEL2", "PARA", idtmed[5], dimPb, 6);
    1882             :   
    1883             :   // --- Position the lead slices in the tranche 
    1884           0 :   Float_t zTran = fDimZEM[0]/fDivZEM[2]; 
    1885           0 :   Float_t zTrPb = -zTran+kDimZEMPb;
    1886           0 :   TVirtualMC::GetMC()->Gspos("ZEL0", 1, "ZETR", zTrPb, 0., 0., 0, "ONLY");
    1887           0 :   TVirtualMC::GetMC()->Gspos("ZEL1", 1, "ZETR", kDimZEMPb, 0., 0., 0, "ONLY");
    1888             :   
    1889             :   // --- Vacuum zone (to be filled with fibres)
    1890           0 :   dimVoid[0] = (zTran-2*kDimZEMPb)/2.;
    1891           0 :   dimVoid[1] = fDimZEM[2];
    1892           0 :   dimVoid[2] = fDimZEM[1];
    1893           0 :   dimVoid[3] = 90.-fDimZEM[3];
    1894           0 :   dimVoid[4] = 0.;
    1895           0 :   dimVoid[5] = 0.;
    1896           0 :   TVirtualMC::GetMC()->Gsvolu("ZEV0", "PARA", idtmed[10], dimVoid,6);
    1897           0 :   TVirtualMC::GetMC()->Gsvolu("ZEV1", "PARA", idtmed[10], dimVoid,6);
    1898             :   
    1899             :   // --- Divide the vacuum slice into sticks along x axis
    1900           0 :   TVirtualMC::GetMC()->Gsdvn("ZES0", "ZEV0", fDivZEM[0], 3); 
    1901           0 :   TVirtualMC::GetMC()->Gsdvn("ZES1", "ZEV1", fDivZEM[0], 3); 
    1902             :   
    1903             :   // --- Positioning the fibers into the sticks
    1904           0 :   TVirtualMC::GetMC()->Gspos("ZEMF", 1,"ZES0", 0., 0., 0., irot2, "ONLY");
    1905           0 :   TVirtualMC::GetMC()->Gspos("ZEMF", 1,"ZES1", 0., 0., 0., irot2, "ONLY");
    1906             :   
    1907             :   // --- Positioning the vacuum slice into the tranche
    1908             :   //Float_t displFib = fDimZEM[1]/fDivZEM[0];
    1909           0 :   TVirtualMC::GetMC()->Gspos("ZEV0", 1,"ZETR", -dimVoid[0], 0., 0., 0, "ONLY");
    1910           0 :   TVirtualMC::GetMC()->Gspos("ZEV1", 1,"ZETR", -dimVoid[0]+zTran, 0., 0., 0, "ONLY");
    1911             : 
    1912             :   // --- Positioning the ZEM into the ZDC - rotation for 90 degrees  
    1913             :   // NB -> ZEM is positioned in ALIC (instead of in ZDC) volume
    1914           0 :   TVirtualMC::GetMC()->Gspos("ZEM ", 1,"ALIC", -fPosZEM[0], fPosZEM[1], fPosZEM[2]+fDimZEM[0], irot1, "ONLY");
    1915             :   
    1916             :   // Second EM ZDC (same side w.r.t. IP, just on the other side w.r.t. beam pipe)
    1917           0 :   TVirtualMC::GetMC()->Gspos("ZEM ", 2,"ALIC", fPosZEM[0], fPosZEM[1], fPosZEM[2]+fDimZEM[0], irot1, "ONLY");
    1918             :   
    1919             :   // --- Adding last slice at the end of the EM calorimeter 
    1920           0 :   Float_t zLastSlice = fPosZEM[2]+kDimZEMPb+2*fDimZEM[0];
    1921           0 :   TVirtualMC::GetMC()->Gspos("ZEL2", 1,"ALIC", fPosZEM[0], fPosZEM[1], zLastSlice, irot1, "ONLY");
    1922             :   //Ch debug
    1923             :   //printf("\n ZEM lenght = %f cm\n",2*fZEMLength);
    1924             :   //printf("\n ZEM -> %f < z < %f cm\n",fPosZEM[2],fPosZEM[2]+2*fZEMLength+zLastSlice+kDimZEMPb);
    1925             :   
    1926           0 : }
    1927             :  
    1928             : //_____________________________________________________________________________
    1929             : void AliZDCv3::CreateMaterials()
    1930             : {
    1931             :   //
    1932             :   // Create Materials for the Zero Degree Calorimeter
    1933             :   //
    1934           0 :   Float_t dens, ubuf[1], wmat[3], a[3], z[3];
    1935             : 
    1936             :   // --- W alloy -> ZN passive material
    1937             :   dens = 17.6;
    1938           0 :   a[0] = 183.85;
    1939           0 :   a[1] = 55.85;
    1940           0 :   a[2] = 58.71;
    1941           0 :   z[0] = 74.;
    1942           0 :   z[1] = 26.;
    1943           0 :   z[2] = 28.;
    1944           0 :   wmat[0] = .93;
    1945           0 :   wmat[1] = .03;
    1946           0 :   wmat[2] = .04;
    1947           0 :   AliMixture(1, "WALL", a, z, dens, 3, wmat);
    1948             : 
    1949             :   // --- Brass (CuZn)  -> ZP passive material
    1950             :   dens = 8.48;
    1951           0 :   a[0] = 63.546;
    1952           0 :   a[1] = 65.39;
    1953           0 :   z[0] = 29.;
    1954           0 :   z[1] = 30.;
    1955           0 :   wmat[0] = .63;
    1956           0 :   wmat[1] = .37;
    1957           0 :   AliMixture(2, "BRASS", a, z, dens, 2, wmat);
    1958             :   
    1959             :   // --- SiO2 
    1960             :   dens = 2.64;
    1961           0 :   a[0] = 28.086;
    1962           0 :   a[1] = 15.9994;
    1963           0 :   z[0] = 14.;
    1964           0 :   z[1] = 8.;
    1965           0 :   wmat[0] = 1.;
    1966           0 :   wmat[1] = 2.;
    1967           0 :   AliMixture(3, "SIO2", a, z, dens, -2, wmat);  
    1968             :   
    1969             :   // --- Lead 
    1970           0 :   ubuf[0] = 1.12;
    1971           0 :   AliMaterial(5, "LEAD", 207.19, 82., 11.35, .56, 0., ubuf, 1);
    1972             : 
    1973             :   // --- Copper (energy loss taken into account)
    1974           0 :   ubuf[0] = 1.10;
    1975           0 :   AliMaterial(6, "COPP0", 63.54, 29., 8.96, 1.4, 0., ubuf, 1);
    1976             : 
    1977             :   // --- Copper 
    1978           0 :   ubuf[0] = 1.10;
    1979           0 :   AliMaterial(9, "COPP1", 63.54, 29., 8.96, 1.4, 0., ubuf, 1);
    1980             :   
    1981             :   // --- Iron (energy loss taken into account)
    1982           0 :   ubuf[0] = 1.1;
    1983           0 :   AliMaterial(7, "IRON0", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
    1984             :   
    1985             :   // --- Iron (no energy loss)
    1986           0 :   ubuf[0] = 1.1;
    1987           0 :   AliMaterial(8, "IRON1", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
    1988             :   
    1989             :   // --- Tatalum 
    1990           0 :   ubuf[0] = 1.1;
    1991           0 :   AliMaterial(13, "TANT", 183.84, 74., 19.3, 0.35, 0., ubuf, 1);
    1992             :     
    1993             :   // ---------------------------------------------------------  
    1994           0 :   Float_t aResGas[3]={1.008,12.0107,15.9994};
    1995           0 :   Float_t zResGas[3]={1.,6.,8.};
    1996           0 :   Float_t wResGas[3]={0.28,0.28,0.44};
    1997             :   Float_t dResGas = 3.2E-14;
    1998             : 
    1999             :   // --- Vacuum (no magnetic field) 
    2000           0 :   AliMixture(10, "VOID", aResGas, zResGas, dResGas, 3, wResGas);
    2001             :   
    2002             :   // --- Vacuum (with magnetic field) 
    2003           0 :   AliMixture(11, "VOIM", aResGas, zResGas, dResGas, 3, wResGas);
    2004             :   
    2005             :   // --- Air (no magnetic field)
    2006           0 :   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
    2007           0 :   Float_t zAir[4]={6.,7.,8.,18.};
    2008           0 :   Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
    2009             :   Float_t dAir = 1.20479E-3;
    2010             :   //
    2011           0 :   AliMixture(12, "Air    $", aAir, zAir, dAir, 4, wAir);
    2012             :   
    2013             :   // ---  Definition of tracking media: 
    2014             :   
    2015             :   // --- Tantalum = 1 ; 
    2016             :   // --- Brass = 2 ; 
    2017             :   // --- Fibers (SiO2) = 3 ; 
    2018             :   // --- Fibers (SiO2) = 4 ; 
    2019             :   // --- Lead = 5 ; 
    2020             :   // --- Copper (with high thr.)= 6 ;
    2021             :   // --- Copper (with low thr.)=  9;
    2022             :   // --- Iron (with energy loss) = 7 ; 
    2023             :   // --- Iron (without energy loss) = 8 ; 
    2024             :   // --- Vacuum (no field) = 10 
    2025             :   // --- Vacuum (with field) = 11 
    2026             :   // --- Air (no field) = 12 
    2027             :   
    2028             :   // **************************************************** 
    2029             :   //     Tracking media parameters
    2030             :   //
    2031             :   Float_t epsil  = 0.01;   // Tracking precision, 
    2032             :   Float_t stmin  = 0.01;   // Min. value 4 max. step (cm)
    2033             :   Float_t stemax = 1.;     // Max. step permitted (cm) 
    2034             :   Float_t tmaxfd = 0.;     // Maximum angle due to field (degrees) 
    2035             :   Float_t tmaxfdv = 0.1;   // Maximum angle due to field (degrees) 
    2036             :   Float_t deemax = -1.;    // Maximum fractional energy loss
    2037             :   Float_t nofieldm = 0.;   // Max. field value (no field)
    2038             :   Float_t fieldm = 45.;    // Max. field value (with field)
    2039             :   Int_t isvol = 0;         // ISVOL =0 -> not sensitive volume
    2040             :   Int_t isvolActive = 1;   // ISVOL =1 -> sensitive volume
    2041             :   Int_t inofld = 0;        // IFIELD=0 -> no magnetic field
    2042             :   Int_t ifield =2;         // IFIELD=2 -> magnetic field defined in AliMagFC.h
    2043             :   // *****************************************************
    2044             :   
    2045           0 :   AliMedium(1, "ZWALL", 1, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2046           0 :   AliMedium(2, "ZBRASS",2, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2047           0 :   AliMedium(3, "ZSIO2", 3, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2048           0 :   AliMedium(4, "ZQUAR", 3, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2049           0 :   AliMedium(5, "ZLEAD", 5, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2050           0 :   AliMedium(6, "ZCOPP", 6, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2051           0 :   AliMedium(7, "ZIRON", 7, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2052           0 :   AliMedium(8, "ZIRONN",8, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2053           0 :   AliMedium(9, "ZCOPL", 9, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2054           0 :   AliMedium(10,"ZVOID",10, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2055           0 :   AliMedium(11,"ZVOIM",11, isvol, ifield, fieldm, tmaxfdv, stemax, deemax, epsil, stmin);
    2056           0 :   AliMedium(12,"ZAIR", 12, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2057           0 :   AliMedium(13,"ZTANT",13, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2058           0 :   AliMedium(14,"ZIRONT",7, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
    2059             : 
    2060           0 : } 
    2061             : 
    2062             : //_____________________________________________________________________________
    2063             : void AliZDCv3::AddAlignableVolumes() const
    2064             : {
    2065             :  //
    2066             :  // Create entries for alignable volumes associating the symbolic volume
    2067             :  // name with the corresponding volume path. Needs to be syncronized with
    2068             :  // eventual changes in the geometry.
    2069             :  //
    2070           0 :  TString volpath1 = "ALIC_1/ZDCC_1/ZNEU_1";
    2071           0 :  TString volpath2 = "ALIC_1/ZDCC_1/ZPRO_1";
    2072           0 :  TString volpath3 = "ALIC_1/ZDCA_1/ZNEU_2";
    2073           0 :  TString volpath4 = "ALIC_1/ZDCA_1/ZPRO_2";
    2074             : 
    2075           0 :  TString symname1="ZDC/NeutronZDC_C";
    2076           0 :  TString symname2="ZDC/ProtonZDC_C";
    2077           0 :  TString symname3="ZDC/NeutronZDC_A";
    2078           0 :  TString symname4="ZDC/ProtonZDC_A";
    2079             : 
    2080           0 :  if(!gGeoManager->SetAlignableEntry(symname1.Data(),volpath1.Data()))
    2081           0 :      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname1.Data(),volpath1.Data()));
    2082             : 
    2083           0 :  if(!gGeoManager->SetAlignableEntry(symname2.Data(),volpath2.Data()))
    2084           0 :      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname2.Data(),volpath2.Data()));
    2085             : 
    2086           0 :  if(!gGeoManager->SetAlignableEntry(symname3.Data(),volpath3.Data()))
    2087           0 :      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname1.Data(),volpath1.Data()));
    2088             : 
    2089           0 :  if(!gGeoManager->SetAlignableEntry(symname4.Data(),volpath4.Data()))
    2090           0 :      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname2.Data(),volpath2.Data()));
    2091             : 
    2092           0 : }
    2093             : 
    2094             : 
    2095             : //_____________________________________________________________________________
    2096             : void AliZDCv3::Init()
    2097             : {
    2098           0 :  InitTables();
    2099           0 :   Int_t *idtmed = fIdtmed->GetArray();  
    2100             :   //
    2101           0 :   fMedSensZN     = idtmed[1];  // Sensitive volume: ZN passive material
    2102           0 :   fMedSensZP     = idtmed[2];  // Sensitive volume: ZP passive material
    2103           0 :   fMedSensF1     = idtmed[3];  // Sensitive volume: fibres type 1
    2104           0 :   fMedSensF2     = idtmed[4];  // Sensitive volume: fibres type 2
    2105           0 :   fMedSensZEM    = idtmed[5];  // Sensitive volume: ZEM passive material
    2106           0 :   fMedSensTDI    = idtmed[6];  // Sensitive volume: TDI Cu shield
    2107           0 :   fMedSensPI     = idtmed[7];  // Sensitive volume: beam pipes
    2108           0 :   fMedSensLumi   = idtmed[9];  // Sensitive volume: luminometer
    2109           0 :   fMedSensGR     = idtmed[12]; // Sensitive volume: air into the grooves
    2110           0 :   fMedSensVColl  = idtmed[13]; // Sensitive volume: collimator jaws
    2111           0 : }
    2112             : 
    2113             : //_____________________________________________________________________________
    2114             : void AliZDCv3::InitTables()
    2115             : {
    2116             :  //
    2117             :  // Read light tables for Cerenkov light production parameterization 
    2118             :  //
    2119             : 
    2120             :   Int_t k, j;
    2121             :   int read=1;
    2122             : 
    2123             :   //  --- Reading light tables for ZN 
    2124           0 :   char *lightfName1 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362207s");
    2125           0 :   FILE *fp1 = fopen(lightfName1,"r");
    2126           0 :   if(fp1 == NULL){
    2127           0 :      printf("Cannot open file fp1 \n");
    2128           0 :      return;
    2129             :   }
    2130             :   else{
    2131           0 :     for(k=0; k<fNalfan; k++){
    2132           0 :       for(j=0; j<fNben; j++){
    2133           0 :        read = fscanf(fp1,"%f",&fTablen[0][k][j]);
    2134           0 :        if(read==0) AliDebug(3, " Error in reading light table 1");
    2135             :       }
    2136             :     }
    2137           0 :     fclose(fp1);
    2138             :   }
    2139           0 :   char *lightfName2 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362208s");
    2140           0 :   FILE *fp2 = fopen(lightfName2,"r");
    2141           0 :   if(fp2 == NULL){
    2142           0 :      printf("Cannot open file fp2 \n");
    2143           0 :      return;
    2144             :   }  
    2145             :   else{
    2146           0 :     for(k=0; k<fNalfan; k++){
    2147           0 :       for(j=0; j<fNben; j++){
    2148           0 :        read = fscanf(fp2,"%f",&fTablen[1][k][j]);
    2149           0 :        if(read==0) AliDebug(3, " Error in reading light table 2");
    2150             :       }
    2151             :     }
    2152           0 :     fclose(fp2);
    2153             :   }
    2154           0 :   char *lightfName3 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362209s");
    2155           0 :   FILE *fp3 = fopen(lightfName3,"r");
    2156           0 :   if(fp3 == NULL){
    2157           0 :      printf("Cannot open file fp3 \n");
    2158           0 :      return;
    2159             :   }
    2160             :   else{
    2161           0 :     for(k=0; k<fNalfan; k++){
    2162           0 :       for(j=0; j<fNben; j++){
    2163           0 :        read = fscanf(fp3,"%f",&fTablen[2][k][j]);
    2164           0 :        if(read==0) AliDebug(3, " Error in reading light table 3");
    2165             :       }
    2166             :     }
    2167           0 :     fclose(fp3);
    2168             :   }
    2169           0 :   char *lightfName4 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362210s");
    2170           0 :   FILE *fp4 = fopen(lightfName4,"r");
    2171           0 :   if(fp4 == NULL){
    2172           0 :      printf("Cannot open file fp4 \n");
    2173           0 :      return;
    2174             :   }
    2175             :   else{
    2176           0 :     for(k=0; k<fNalfan; k++){
    2177           0 :       for(j=0; j<fNben; j++){
    2178           0 :        read = fscanf(fp4,"%f",&fTablen[3][k][j]);
    2179           0 :        if(read==0) AliDebug(3, " Error in reading light table 4");
    2180             :       }
    2181             :     }
    2182           0 :     fclose(fp4);
    2183             :   }
    2184             :     
    2185             :   //  --- Reading light tables for ZP and ZEM
    2186           0 :   char *lightfName5 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552207s");
    2187           0 :   FILE *fp5 = fopen(lightfName5,"r");
    2188           0 :   if(fp5 == NULL){
    2189           0 :      printf("Cannot open file fp5 \n");
    2190           0 :      return;
    2191             :   }
    2192             :   else{
    2193           0 :     for(k=0; k<fNalfap; k++){
    2194           0 :       for(j=0; j<fNbep; j++){
    2195           0 :        read = fscanf(fp5,"%f",&fTablep[0][k][j]);
    2196           0 :        if(read==0) AliDebug(3, " Error in reading light table 5");
    2197             :       }
    2198             :     }
    2199           0 :     fclose(fp5);
    2200             :   }
    2201           0 :   char *lightfName6 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552208s");
    2202           0 :   FILE *fp6 = fopen(lightfName6,"r");
    2203           0 :   if(fp6 == NULL){
    2204           0 :      printf("Cannot open file fp6 \n");
    2205           0 :      return;
    2206             :   }
    2207             :   else{
    2208           0 :     for(k=0; k<fNalfap; k++){
    2209           0 :       for(j=0; j<fNbep; j++){
    2210           0 :        read = fscanf(fp6,"%f",&fTablep[1][k][j]);
    2211           0 :        if(read==0) AliDebug(3, " Error in reading light table 6");
    2212             :       }
    2213             :     }
    2214           0 :     fclose(fp6);
    2215             :   }
    2216           0 :   char *lightfName7 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552209s");
    2217           0 :   FILE *fp7 = fopen(lightfName7,"r");
    2218           0 :   if(fp7 == NULL){
    2219           0 :      printf("Cannot open file fp7 \n");
    2220           0 :      return;
    2221             :   }
    2222             :   else{
    2223           0 :     for(k=0; k<fNalfap; k++){
    2224           0 :       for(j=0; j<fNbep; j++){
    2225           0 :        read = fscanf(fp7,"%f",&fTablep[2][k][j]);
    2226           0 :        if(read==0) AliDebug(3, " Error in reading light table 7");
    2227             :       }
    2228             :     }
    2229           0 :    fclose(fp7);
    2230             :   }
    2231           0 :   char *lightfName8 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552210s");
    2232           0 :   FILE *fp8 = fopen(lightfName8,"r");
    2233           0 :   if(fp8 == NULL){
    2234           0 :      printf("Cannot open file fp8 \n");
    2235           0 :      return;
    2236             :   }
    2237             :   else{
    2238           0 :     for(k=0; k<fNalfap; k++){
    2239           0 :       for(j=0; j<fNbep; j++){
    2240           0 :        read = fscanf(fp8,"%f",&fTablep[3][k][j]);
    2241           0 :        if(read==0) AliDebug(3, " Error in reading light table 8");
    2242             :       }
    2243             :     }
    2244           0 :    fclose(fp8);
    2245             :   }
    2246             : 
    2247           0 : }
    2248             : //_____________________________________________________________________________
    2249             : void AliZDCv3::StepManager()
    2250             : {
    2251             :   //
    2252             :   // Routine called at every step in the Zero Degree Calorimeters
    2253             :   //
    2254           0 :   Int_t   j, vol[2]={0,0}, ibeta=0, ialfa=0, ibe=0, nphe=0;
    2255           0 :   Float_t hits[14], x[3], xdet[3]={999.,999.,999.}, um[3], ud[3];
    2256             :   Float_t destep=0., be=0., out=0.;
    2257           0 :   Double_t s[3], p[4];
    2258           0 :   const char *knamed = (TVirtualMC::GetMC())->CurrentVolName();
    2259             :   //Int_t  mid = TVirtualMC::GetMC()->CurrentMedium();
    2260           0 :   TVirtualMC::GetMC()->TrackPosition(s[0],s[1],s[2]);
    2261             :   //printf("\tZDC::StepManager\t volume %s medium %d (x,y,z) = (%f, %f, %f)\n", knamed, mid, s[0], s[1], s[2]);
    2262             :   //
    2263           0 :   for(j=0;j<14;j++) hits[j]=-999.;
    2264             :   //
    2265             :   // --- This part is for no shower developement in beam pipe, TDI, VColl
    2266             :   // If particle interacts with beam pipe, TDI, VColl -> return
    2267           0 :   if(fNoShower==1 && ((TVirtualMC::GetMC()->CurrentMedium() == fMedSensPI) || (TVirtualMC::GetMC()->CurrentMedium() == fMedSensTDI) ||  
    2268           0 :      (TVirtualMC::GetMC()->CurrentMedium() == fMedSensVColl || (TVirtualMC::GetMC()->CurrentMedium() == fMedSensLumi)))){ 
    2269             :     
    2270             :     // If option NoShower is set -> StopTrack
    2271             : 
    2272             :     Int_t ipr = 0; 
    2273           0 :       if(TVirtualMC::GetMC()->CurrentMedium() == fMedSensPI){
    2274           0 :         if(!strncmp(knamed,"YMQ",3)){
    2275           0 :           if(s[2]<0) fpLostITC += 1;
    2276           0 :           else fpLostITA += 1;
    2277             :           ipr=1;
    2278           0 :         }
    2279           0 :         else if(!strncmp(knamed,"YD1",3)){
    2280           0 :           if(s[2]<0) fpLostD1C += 1;
    2281           0 :           else fpLostD1A += 1;
    2282             :           ipr=1;
    2283           0 :         }
    2284             :       }
    2285           0 :       else if(TVirtualMC::GetMC()->CurrentMedium() == fMedSensTDI){ 
    2286           0 :         if(!strncmp(knamed,"MD1",3)){
    2287           0 :           if(s[2]<0) fpLostD1C += 1;
    2288           0 :           else  fpLostD1A += 1;
    2289             :           ipr=1;
    2290           0 :         }
    2291           0 :         else if(!strncmp(knamed,"QTD",3)) fpLostTDI += 1;
    2292             :       }
    2293           0 :       else if(TVirtualMC::GetMC()->CurrentMedium() == fMedSensVColl){ 
    2294           0 :         if(!strncmp(knamed,"QCVC",4)) fpcVCollC++;
    2295           0 :         else if(!strncmp(knamed,"QCVA",4))  fpcVCollA++;
    2296             :         ipr=1;
    2297           0 :       }
    2298             :       //
    2299             :       //TVirtualMC::GetMC()->TrackMomentum(p[0], p[1], p[2], p[3]);
    2300             :       //printf("\t Particle: mass = %1.3f, E = %1.3f GeV, pz = %1.2f GeV -> stopped in volume %s\n", 
    2301             :       //     TVirtualMC::GetMC()->TrackMass(), p[3], p[2], TVirtualMC::GetMC()->CurrentVolName());
    2302             :       //
    2303           0 :       if(ipr!=0){
    2304           0 :         printf("\n\t **********************************\n");
    2305           0 :         printf("\t ********** Side C **********\n");
    2306           0 :         printf("\t # of particles in IT = %d\n",fpLostITC);
    2307           0 :         printf("\t # of particles in D1 = %d\n",fpLostD1C);
    2308           0 :         printf("\t # of particles in VColl = %d\n",fpcVCollC);
    2309           0 :         printf("\t ********** Side A **********\n");
    2310           0 :         printf("\t # of particles in IT = %d\n",fpLostITA);
    2311           0 :         printf("\t # of particles in D1 = %d\n",fpLostD1A);
    2312           0 :         printf("\t # of particles in TDI = %d\n",fpLostTDI);
    2313           0 :         printf("\t # of particles in VColl = %d\n",fpcVCollA);
    2314           0 :         printf("\t **********************************\n");
    2315           0 :       }
    2316           0 :       TVirtualMC::GetMC()->StopTrack();
    2317             :       return;
    2318             :   }
    2319             :   
    2320           0 :   if((TVirtualMC::GetMC()->CurrentMedium() == fMedSensZN) || (TVirtualMC::GetMC()->CurrentMedium() == fMedSensZP) ||
    2321           0 :      (TVirtualMC::GetMC()->CurrentMedium() == fMedSensGR) || (TVirtualMC::GetMC()->CurrentMedium() == fMedSensF1) ||
    2322           0 :      (TVirtualMC::GetMC()->CurrentMedium() == fMedSensF2) || (TVirtualMC::GetMC()->CurrentMedium() == fMedSensZEM)){
    2323             : 
    2324             :     
    2325             :   //Particle coordinates 
    2326           0 :     for(j=0; j<=2; j++) x[j] = s[j];
    2327           0 :     hits[0] = x[0];
    2328           0 :     hits[1] = x[1];
    2329           0 :     hits[2] = x[2];
    2330             : 
    2331             :   // Determine in which ZDC the particle is
    2332           0 :     if(!strncmp(knamed,"ZN",2)){
    2333           0 :           if(x[2]<0.) vol[0]=1; // ZNC (dimuon side)
    2334           0 :           else if(x[2]>0.) vol[0]=4; //ZNA
    2335             :     }
    2336           0 :     else if(!strncmp(knamed,"ZP",2)){ 
    2337           0 :           if(x[2]<0.) vol[0]=2; //ZPC (dimuon side)
    2338           0 :           else if(x[2]>0.) vol[0]=5; //ZPA  
    2339             :     }
    2340           0 :     else if(!strncmp(knamed,"ZE",2)) vol[0]=3; //ZEM
    2341             :   
    2342             :   // Determine in which quadrant the particle is
    2343           0 :     if(vol[0]==1){      //Quadrant in ZNC
    2344             :       // Calculating particle coordinates inside ZNC
    2345           0 :       xdet[0] = x[0]-fPosZNC[0];
    2346           0 :       xdet[1] = x[1]-fPosZNC[1];
    2347             :       // Calculating quadrant in ZN
    2348           0 :       if(xdet[0]<=0.){
    2349           0 :         if(xdet[1]<=0.) vol[1]=1;
    2350           0 :         else vol[1]=3;
    2351             :       }
    2352           0 :       else if(xdet[0]>0.){
    2353           0 :         if(xdet[1]<=0.) vol[1]=2;
    2354           0 :         else vol[1]=4;
    2355             :       }
    2356             :     }
    2357             :     
    2358           0 :     else if(vol[0]==2){ //Quadrant in ZPC
    2359             :       // Calculating particle coordinates inside ZPC
    2360           0 :       xdet[0] = x[0]-fPosZPC[0];
    2361           0 :       xdet[1] = x[1]-fPosZPC[1];
    2362           0 :       if(xdet[0]>=fDimZP[0])  xdet[0]=fDimZP[0]-0.01;
    2363           0 :       if(xdet[0]<=-fDimZP[0]) xdet[0]=-fDimZP[0]+0.01;
    2364             :       // Calculating tower in ZP
    2365           0 :       Float_t xqZP = xdet[0]/(fDimZP[0]/2.);
    2366           0 :       for(int i=1; i<=4; i++){
    2367           0 :          if(xqZP>=(i-3) && xqZP<(i-2)){
    2368           0 :            vol[1] = i;
    2369           0 :            break;
    2370             :          }
    2371             :       }
    2372           0 :     }
    2373             :     //
    2374             :     // Quadrant in ZEM: vol[1] = 1 -> particle in 1st ZEM (placed at x = 8.5 cm)
    2375             :     //                  vol[1] = 2 -> particle in 2nd ZEM (placed at x = -8.5 cm)
    2376           0 :     else if(vol[0] == 3){       
    2377           0 :       if(x[0]>0.){
    2378           0 :         vol[1] = 1;
    2379             :         // Particle x-coordinate inside ZEM1
    2380           0 :         xdet[0] = x[0]-fPosZEM[0];
    2381           0 :       }
    2382             :       else{
    2383           0 :         vol[1] = 2;
    2384             :         // Particle x-coordinate inside ZEM2
    2385           0 :         xdet[0] = x[0]+fPosZEM[0];
    2386             :       }
    2387           0 :       xdet[1] = x[1]-fPosZEM[1];
    2388           0 :     }
    2389             :     //
    2390           0 :     else if(vol[0]==4){ //Quadrant in ZNA
    2391             :       // Calculating particle coordinates inside ZNA
    2392           0 :       xdet[0] = x[0]-fPosZNA[0];
    2393           0 :       xdet[1] = x[1]-fPosZNA[1];
    2394             :       // Calculating quadrant in ZNA
    2395           0 :       if(xdet[0]>=0.){
    2396           0 :         if(xdet[1]<=0.) vol[1]=1;
    2397           0 :         else vol[1]=3;
    2398             :       }
    2399           0 :       else if(xdet[0]<0.){
    2400           0 :         if(xdet[1]<=0.) vol[1]=2;
    2401           0 :         else vol[1]=4;
    2402             :       }
    2403             :     }    
    2404             :     //
    2405           0 :     else if(vol[0]==5){ //Quadrant in ZPA
    2406             :       // Calculating particle coordinates inside ZPA
    2407           0 :       xdet[0] = x[0]-fPosZPA[0];
    2408           0 :       xdet[1] = x[1]-fPosZPA[1];
    2409           0 :       if(xdet[0]>=fDimZP[0])  xdet[0]=fDimZP[0]-0.01;
    2410           0 :       if(xdet[0]<=-fDimZP[0]) xdet[0]=-fDimZP[0]+0.01;
    2411             :       // Calculating tower in ZP
    2412           0 :       Float_t xqZP = -xdet[0]/(fDimZP[0]/2.);
    2413           0 :       for(int i=1; i<=4; i++){
    2414           0 :          if(xqZP>=(i-3) && xqZP<(i-2)){
    2415           0 :            vol[1] = i;
    2416           0 :            break;
    2417             :          }
    2418             :       }
    2419           0 :     }    
    2420           0 :     if((vol[1]!=1) && (vol[1]!=2) && (vol[1]!=3) && (vol[1]!=4))
    2421           0 :       AliError(Form(" WRONG tower for det %d: tow %d with xdet=(%f, %f)\n",
    2422             :                 vol[0], vol[1], xdet[0], xdet[1]));
    2423             :     // Ch. debug
    2424             :     //printf("\t *** det %d vol %d xdet(%f, %f)\n",vol[0], vol[1], xdet[0], xdet[1]);
    2425             :     
    2426             :     
    2427             :     // Store impact point and kinetic energy of the ENTERING particle
    2428             :     
    2429           0 :     if(TVirtualMC::GetMC()->IsTrackEntering()){
    2430             :       //Particle energy
    2431           0 :       TVirtualMC::GetMC()->TrackMomentum(p[0],p[1],p[2],p[3]);
    2432           0 :       hits[3] = p[3];
    2433             :       
    2434             :       // Impact point on ZDC
    2435             :       // X takes into account the LHC x-axis sign
    2436             :       // which is opposite to positive x on detector front face
    2437             :       // for side A detectors (ZNA and ZPA)  
    2438           0 :       if(vol[0]==4 || vol[0]==5){
    2439           0 :         hits[4] = -xdet[0];
    2440           0 :       }
    2441             :       else{
    2442           0 :         hits[4] = xdet[0];
    2443             :       }
    2444           0 :       hits[5] = xdet[1];
    2445           0 :       hits[6] = 0;
    2446           0 :       hits[7] = 0;
    2447           0 :       hits[8] = 0;
    2448           0 :       hits[9] = 0;
    2449             :       //
    2450           0 :       Int_t curTrackN = gAlice->GetMCApp()->GetCurrentTrackNumber();
    2451           0 :       TParticle *part = gAlice->GetMCApp()->Particle(curTrackN);
    2452           0 :       hits[10] = part->GetPdgCode();
    2453             :       //printf("\t PDGCode = %d\n", part->GetPdgCode());
    2454             :       //
    2455           0 :       Int_t imo = part->GetFirstMother();
    2456           0 :       if(imo>0){
    2457           0 :         TParticle * pmot = gAlice->GetMCApp()->Particle(imo);
    2458           0 :         hits[11] = pmot->GetPdgCode();
    2459           0 :       }
    2460           0 :       else hits[11]=0;
    2461             :       //
    2462           0 :       hits[12] = 1.0e09*TVirtualMC::GetMC()->TrackTime(); // in ns!
    2463             :       //printf("\t TrackTime = %f\n", hits[12]);
    2464           0 :       hits[13] = part->Eta();
    2465             : 
    2466           0 :       AddHit(curTrackN, vol, hits);
    2467             : 
    2468           0 :       if(fNoShower==1){
    2469           0 :         if(vol[0]==1){
    2470           0 :           fnDetectedC += 1;
    2471           0 :           if(fnDetectedC==1) printf("      ### Particle in ZNC\n\n");
    2472             :         }
    2473           0 :         else if(vol[0]==2){
    2474           0 :           fpDetectedC += 1;
    2475           0 :           if(fpDetectedC==1) printf("      ### Particle in ZPC\n\n");
    2476             :         }
    2477           0 :         else if(vol[0]==4){
    2478           0 :           fnDetectedA += 1;
    2479           0 :           if(fnDetectedA==1) printf("      ### Particle in ZNA\n\n");   
    2480             :         }
    2481           0 :         else if(vol[0]==5){
    2482           0 :           fpDetectedA += 1;
    2483           0 :           if(fpDetectedA==1) printf("      ### Particle in ZPA\n\n");          
    2484             :         }
    2485             :         //
    2486             :         //printf("\t Pc: x %1.2f y %1.2f z %1.2f  E %1.2f GeV pz = %1.2f GeV in volume %s\n", 
    2487             :         //   x[0],x[1],x[3],p[3],p[2],TVirtualMC::GetMC()->CurrentVolName());
    2488             :         //
    2489           0 :         TVirtualMC::GetMC()->StopTrack();
    2490           0 :         return;
    2491             :       }
    2492           0 :     }
    2493             :            
    2494             :     // Particle energy loss
    2495           0 :     if(TVirtualMC::GetMC()->Edep() != 0){
    2496           0 :       hits[9] = TVirtualMC::GetMC()->Edep();
    2497           0 :       hits[7] = 0.;
    2498           0 :       hits[8] = 0.;
    2499           0 :       AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
    2500           0 :     }
    2501             :   }
    2502             :  
    2503             : 
    2504             :   // *** Light production in fibres 
    2505           0 :   if((TVirtualMC::GetMC()->CurrentMedium() == fMedSensF1) || (TVirtualMC::GetMC()->CurrentMedium() == fMedSensF2)){
    2506             : 
    2507             :      //Select charged particles
    2508           0 :      if((destep=TVirtualMC::GetMC()->Edep())){
    2509             : 
    2510             :        // Particle velocity
    2511             :        Float_t beta = 0.;
    2512           0 :        TVirtualMC::GetMC()->TrackMomentum(p[0],p[1],p[2],p[3]);
    2513           0 :        Float_t ptot=TMath::Sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
    2514           0 :        if(p[3] > 0.00001) beta =  ptot/p[3];
    2515           0 :        else return;
    2516           0 :        if(beta<0.67)return;
    2517           0 :        else if((beta>=0.67) && (beta<=0.75)) ibeta = 0;
    2518           0 :        else if((beta>0.75)  && (beta<=0.85)) ibeta = 1;
    2519           0 :        else if((beta>0.85)  && (beta<=0.95)) ibeta = 2;
    2520           0 :        else if(beta>0.95) ibeta = 3;
    2521             :  
    2522             :        // Angle between particle trajectory and fibre axis
    2523             :        // 1 -> Momentum directions
    2524           0 :        um[0] = p[0]/ptot;
    2525           0 :        um[1] = p[1]/ptot;
    2526           0 :        um[2] = p[2]/ptot;
    2527           0 :        TVirtualMC::GetMC()->Gmtod(um,ud,2);
    2528             :        // 2 -> Angle < limit angle
    2529           0 :        Double_t alfar = TMath::ACos(ud[2]);
    2530           0 :        Double_t alfa = alfar*kRaddeg;
    2531           0 :        if(alfa>=110.) return;
    2532             :        //
    2533           0 :        ialfa = Int_t(1.+alfa/2.);
    2534             :  
    2535             :        // Distance between particle trajectory and fibre axis
    2536           0 :        for(j=0; j<=2; j++){
    2537           0 :           x[j] = s[j];
    2538             :        }
    2539           0 :        TVirtualMC::GetMC()->Gmtod(x,xdet,1);
    2540           0 :        if(TMath::Abs(ud[0])>0.00001){
    2541           0 :          Float_t dcoeff = ud[1]/ud[0];
    2542           0 :          be = TMath::Abs((xdet[1]-dcoeff*xdet[0])/TMath::Sqrt(dcoeff*dcoeff+1.));
    2543           0 :        }
    2544             :        else{
    2545           0 :          be = TMath::Abs(ud[0]);
    2546             :        }
    2547             :  
    2548           0 :        ibe = Int_t(be*1000.+1);
    2549             :   
    2550             :        //Looking into the light tables 
    2551           0 :        Float_t charge = TVirtualMC::GetMC()->TrackCharge();
    2552             :        
    2553           0 :        if(vol[0]==1 || vol[0]==4) {     // (1)  ZN fibres
    2554           0 :          if(ibe>fNben) ibe=fNben;
    2555           0 :          out =  charge*charge*fTablen[ibeta][ialfa][ibe];
    2556           0 :          nphe = gRandom->Poisson(out);
    2557             :          // Ch. debug
    2558             :          //if(ibeta==3) printf("\t %f \t %f \t %f\n",alfa, be, out);
    2559             :          //printf("\t ibeta = %d, ialfa = %d, ibe = %d -> nphe = %d\n\n",ibeta,ialfa,ibe,nphe);
    2560           0 :          if(TVirtualMC::GetMC()->CurrentMedium() == fMedSensF1){
    2561           0 :            hits[7] = nphe;      //fLightPMQ
    2562           0 :            hits[8] = 0;
    2563           0 :            hits[9] = 0;
    2564           0 :            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
    2565           0 :          }
    2566             :          else{
    2567           0 :            hits[7] = 0;
    2568           0 :            hits[8] = nphe;      //fLightPMC
    2569           0 :            hits[9] = 0;
    2570           0 :            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
    2571             :          }
    2572             :        } 
    2573           0 :        else if(vol[0]==2 || vol[0]==5) {// (2) ZP fibres
    2574           0 :          if(ibe>fNbep) ibe=fNbep;
    2575           0 :          out =  charge*charge*fTablep[ibeta][ialfa][ibe];
    2576           0 :          nphe = gRandom->Poisson(out);
    2577           0 :          if(TVirtualMC::GetMC()->CurrentMedium() == fMedSensF1){
    2578           0 :            hits[7] = nphe;      //fLightPMQ
    2579           0 :            hits[8] = 0;
    2580           0 :            hits[9] = 0;
    2581           0 :            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
    2582           0 :          }
    2583             :          else{
    2584           0 :            hits[7] = 0;
    2585           0 :            hits[8] = nphe;      //fLightPMC
    2586           0 :            hits[9] = 0;
    2587           0 :            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
    2588             :          }
    2589             :        } 
    2590           0 :        else if(vol[0]==3) {     // (3) ZEM fibres
    2591           0 :          if(ibe>fNbep) ibe=fNbep;
    2592           0 :          out =  charge*charge*fTablep[ibeta][ialfa][ibe];
    2593           0 :          Float_t xalic[3];
    2594           0 :          for(j=0; j<3; j++){
    2595           0 :             xalic[j] = s[j];
    2596             :          }
    2597             :          // z-coordinate from ZEM front face 
    2598             :          // NB-> fPosZEM[2]+fZEMLength = -1000.+2*10.3 = 979.69 cm
    2599           0 :          Float_t z = -xalic[2]+fPosZEM[2]+2*fZEMLength-xalic[1];
    2600             :          //z = xalic[2]-fPosZEM[2]-fZEMLength-xalic[1]*(TMath::Tan(45.*kDegrad));
    2601             :          //printf("        fPosZEM[2]+2*fZEMLength = %f", fPosZEM[2]+2*fZEMLength);
    2602             :          //
    2603             :          // Parametrization for light guide uniformity
    2604             :          // NEW!!! Light guide tilted @ 51 degrees
    2605             :          Float_t guiPar[4]={0.31,-0.0006305,0.01337,0.8895};
    2606           0 :          Float_t guiEff = guiPar[0]*(guiPar[1]*z*z+guiPar[2]*z+guiPar[3]);
    2607           0 :          out = out*guiEff;
    2608           0 :          nphe = gRandom->Poisson(out);
    2609             :          //printf("        out*guiEff = %f nphe = %d", out, nphe);
    2610           0 :          if(vol[1] == 1){
    2611           0 :            hits[7] = 0;         
    2612           0 :            hits[8] = nphe;      //fLightPMC (ZEM1)
    2613           0 :            hits[9] = 0;
    2614           0 :            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
    2615           0 :          }
    2616             :          else{
    2617           0 :            hits[7] = nphe;      //fLightPMQ (ZEM2)
    2618           0 :            hits[8] = 0;         
    2619           0 :            hits[9] = 0;
    2620           0 :            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
    2621             :          }
    2622           0 :        }
    2623           0 :      }
    2624             :    }
    2625           0 : }

Generated by: LCOV version 1.11