LCOV - code coverage report
Current view: top level - ZDC/ZDCsim - AliZDCv4.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1337 1530 87.4 %
Date: 2016-06-14 17:26:59 Functions: 13 13 100.0 %

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

Generated by: LCOV version 1.11