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

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

Generated by: LCOV version 1.11