LCOV - code coverage report
Current view: top level - T0/T0sim - AliT0v1.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 370 371 99.7 %
Date: 2016-06-14 17:26:59 Functions: 15 15 100.0 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             :  *                                                                        *
       4             :  * Author: The ALICE Off-line Project.                                    *
       5             :  * Contributors are mentioned in the code where appropriate.              *
       6             :  *                                                                        *
       7             :  * Permission to use, copy, modify and distribute this software and its   *
       8             :  * documentation strictly for non-commercial purposes is hereby granted   *
       9             :  * without fee, provided that the above copyright notice appears in all   *
      10             :  * copies and that both the copyright notice and this permission notice   *
      11             :  * appear in the supporting documentation. The authors make no claims     *
      12             :  * about the suitability of this software for any purpose. It is          *
      13             :  * provided "as is" without express or implied warranty.                  *
      14             :  **************************************************************************/
      15             : 
      16             : /* $Id$ */
      17             : 
      18             : /////////////////////////////////////////////////////////////////////
      19             : //                                                                 //
      20             : // T0 ( T-zero) detector  version 1                             //
      21             : //
      22             : //Begin Html       
      23             : /*
      24             : <img src="gif/AliT0v1Class.gif">
      25             : */
      26             : //End Html
      27             : //                                                                  //
      28             : //                                                                  //
      29             : //////////////////////////////////////////////////////////////////////
      30             : 
      31             : #include <Riostream.h>
      32             : #include <stdlib.h>
      33             : 
      34             : #include "TGeoCompositeShape.h"
      35             : #include "TGeoManager.h"
      36             : #include "TGeoMatrix.h"
      37             : #include "TGeoPcon.h"
      38             : #include "TGeoTube.h"
      39             : #include <TGeoGlobalMagField.h>
      40             : #include <TGraph.h>
      41             : #include <TLorentzVector.h>
      42             : #include <TMath.h>
      43             : #include <TVirtualMC.h>
      44             : #include <TString.h>
      45             : 
      46             : #include "AliLog.h"
      47             : #include "AliMagF.h"
      48             : #include "AliRun.h"
      49             : 
      50             : #include "AliT0hit.h"
      51             : #include "AliT0v1.h"
      52             : #include "AliT0Parameters.h"
      53             : 
      54             : #include "AliMC.h"
      55             : #include "AliCDBLocal.h"
      56             : #include "AliCDBStorage.h"
      57             : #include "AliCDBManager.h"
      58             : #include "AliCDBEntry.h"
      59             : #include "AliTrackReference.h"
      60             : 
      61          12 : ClassImp(AliT0v1)
      62             : 
      63             : 
      64             : //--------------------------------------------------------------------
      65          12 : AliT0v1::AliT0v1():  AliT0(),
      66          12 :                      fIdSens1(0),
      67          12 :                      fEffPMT(0x0)
      68             : 
      69          60 : {
      70             :   //
      71             :   // Standart constructor for T0 Detector version 0
      72          24 : }
      73             : //--------------------------------------------------------------------
      74             : AliT0v1::AliT0v1(const char *name, const char *title):
      75           1 :   AliT0(name,title),
      76           1 :   fIdSens1(0),
      77           1 :   fEffPMT(0x0)
      78             : 
      79           5 : {
      80             :   //
      81             :   // Standart constructor for T0 Detector version 0
      82             :   //
      83           1 :   fIshunt = 2;
      84           1 :   AliT0Parameters* param = AliT0Parameters::Instance();
      85          50 :   for (Int_t i=0; i<24; i++){
      86          24 :     TGraph* grEff = param ->GetPMTeff(i);
      87          24 :     fEffPMT.AddAtAndExpand(grEff,i);
      88             :   }
      89           2 : }
      90             : //_____________________________________________________________________________
      91             : 
      92             : AliT0v1::~AliT0v1() 
      93          78 : {
      94             :   // desctructor  
      95          39 : }
      96             : 
      97             : //-------------------------------------------------------------------------
      98             : void AliT0v1::CreateGeometry()
      99             : {
     100             :   //
     101             :   // Create the geometry of T0 Detector version 0
     102             :   //
     103             :   // begin Html
     104             :   /*
     105             :    <img src="gif/AliT0v0.gif">
     106             :   */
     107             :   //
     108             : 
     109             : 
     110           2 :    Int_t *idtmed = fIdtmed->GetArray();
     111             :    /*
     112             :    AliT0Parameters* param = AliT0Parameters::Instance();
     113             :    param->Init();
     114             :   Float_t zdetC = param->GetZposition(0);
     115             :   Float_t zdetA = param->GetZposition(1);
     116             :    */
     117             :    Float_t zdetC = 69.7;
     118             :    Float_t zdetA = 373.;
     119             : 
     120             :   Int_t is;
     121           1 :   Int_t idrotm[999];
     122             :   Double_t x,y,z;
     123             :   //C T0 mother volume
     124           1 :   Float_t pstartR[18]={0., 360., 5., 
     125             :                        -6.8, 4.25, 10., //-76.5+0.00+69.7
     126             :                        //  -0.75 , 4.45, 10.,  // -76.5+6.05+69.7
     127             :                        //  1.25   , 4.45, 10.,  //-76.5+8.05+69.7
     128             :                        -0.75 , 4.5, 10.,  // -76.5+6.05+69.7
     129             :                        1.25   , 4.5, 10.,  //-76.5+8.05+69.7
     130             :                        1.25 , 5.1, 10, //-76.5+8.05+69.7 
     131             :                        6.8 , 5.1, 10.};  //-62.9+0.00+69.7
     132             :   
     133           1 :   Float_t pstart[3]={4., 12.5,6.8};
     134           1 :   Float_t pinstart[3]={0.,1.45,6.5};
     135           1 :   Float_t ppmt[3]={0.,1.4,3.5};
     136           1 :   Float_t ptop[3]={0.,1.,1.0};
     137           1 :   Float_t preg[3]={0., 1.0, 0.005}; //photcathode dobavil bogdanov
     138           1 :   Float_t ptopout[3]={1.,1.01, 1.};  //metal air around raiator for photos reflection 
     139           1 :   Float_t pbot[3]={0.6,1.2,0.1};
     140           1 :   Float_t pglass[3]={1.2,1.3,2.};
     141           1 :   Float_t pcer[3]={0.9,1.1,1.35};
     142           1 :   Float_t psteel[3]={0.9,1.1,0.15};
     143           1 :   Float_t psupport1[3] = {4.51,4.52,4.0};//C kozhuh vnutri
     144           1 :   Float_t psupport2[3] = {9.5,9.6,4.0};// snaruzhi  C
     145           1 :   Float_t psupport3[3] = {4.52,9.5, 0.05};//kryshki  C
     146           1 :   Float_t psupport5[3] = {1.44,1.45,6.5}; // stakanchik dlai feu  C
     147           1 :   Float_t psupport6[3] = {0,1.4,0.04}; //kryshechka stakanchika  Al
     148           1 :   Float_t psupport7[3] = {1.44,1.45,0.4}; //kolechko snaruzhu stakanchika Al
     149             :    
     150             :   // Mother Volume katushka dlia krepezha vokrug truby k Absorbru
     151           1 :     AliMatrix(idrotm[901], 90., 0., 90., 90., 180., 0.);
     152           1 :   Float_t ppcon[70]; 
     153           1 :     ppcon[0]  =   0;
     154           1 :     ppcon[1]  = 360;
     155           1 :     ppcon[2]  =  13;
     156             : //  1: 
     157           1 :     ppcon[3]  =  7.2;
     158           1 :     ppcon[4]  =   4.4;
     159           1 :     ppcon[5]  =   4.5;
     160             : //  2
     161           1 :     ppcon[6]  = 8.2;
     162           1 :     ppcon[7]  = 4.4;
     163           1 :     ppcon[8]  = 4.5;
     164             : //  3
     165           1 :     ppcon[9]  = 8.2;
     166           1 :     ppcon[10] = 4.4;
     167           1 :     ppcon[11] = 5.1;
     168             : 
     169             : //  4
     170             : 
     171           1 :     ppcon[12] = 8.3; 
     172           1 :     ppcon[13] = 4.4;
     173           1 :     ppcon[14] = 5.1;
     174             : //  5
     175             : 
     176           1 :     ppcon[15] = 8.3;
     177           1 :     ppcon[16] = 4.9;
     178           1 :     ppcon[17] = 5.1;
     179             :     
     180             : //  6
     181           1 :     ppcon[18] = 15.; 
     182           1 :     ppcon[19] = 4.9;
     183           1 :     ppcon[20] = 5.1;
     184             :     
     185             : //  7
     186           1 :     ppcon[21] = 15.; 
     187           1 :     ppcon[22] = 3.15  ;
     188           1 :     ppcon[23] = 5.1;
     189             : 
     190             : /// 8
     191           1 :     ppcon[24] = 15.01; 
     192           1 :     ppcon[25] = 3.15;
     193           1 :     ppcon[26] = 5.1;
     194             : 
     195             : /// 9
     196           1 :     ppcon[27] = 15.01; 
     197           1 :     ppcon[28] = 3.15;
     198           1 :     ppcon[29] = 3.25;
     199             : 
     200             :     
     201             : /// 9
     202           1 :      ppcon[30] = 19.71;
     203           1 :      ppcon[31] = 3.15;
     204           1 :      ppcon[32] = 3.25; 
     205             : //  10
     206           1 :     ppcon[33] = 19.8; 
     207           1 :     ppcon[34] = 3.15;
     208           1 :     ppcon[35] = 3.25;
     209             :     //  11
     210           1 :     ppcon[36] = 19.8;
     211           1 :     ppcon[37] = 3.15;
     212           1 :     ppcon[38] = 7.6;
     213             :         
     214             :    //  14
     215             : 
     216           1 :     ppcon[39] =  19.99;
     217           1 :     ppcon[40] =  3.15;
     218           1 :     ppcon[41] =  7.6;
     219             : 
     220             : 
     221           1 :     TVirtualMC::GetMC()->Gsvolu("0SUP", "PCON", idtmed[kAir], ppcon,42);
     222             :     z = -zdetC;
     223           1 :     TVirtualMC::GetMC()->Gspos("0SUP",1,"ALIC",0.,0.,z,idrotm[901],"ONLY");
     224             :    
     225             : //-------------------------------------------------------------------
     226             :  //  T0 volume 
     227             :  //-------------------------------------------------------------------
     228             :   
     229             :     
     230           1 :     TVirtualMC::GetMC()->Gsvolu("0STR","PCON",idtmed[kAir],pstartR,18);
     231           1 :     TVirtualMC::GetMC()->Gspos("0STR",1,"ALIC",0.,0.,-zdetC+pstartR[3],idrotm[901],"ONLY");
     232             :     // TVirtualMC::GetMC()->Gspos("0STL",1,"ALIC",0.,0.,zdetA+pstart[2],0,"ONLY");
     233             : 
     234             : //T0 interior
     235           1 :    TVirtualMC::GetMC()->Gsvolu("0INS","TUBE",idtmed[kAir],pinstart,3);
     236           1 :    TVirtualMC::GetMC()->Gsvolu("0PMT","TUBE",idtmed[kAir],ppmt,3);     
     237             :           
     238           1 :     TVirtualMC::GetMC()->Gsvolu("0SU1","TUBE",idtmed[kC],psupport1,3);//C kozhuh vnutri
     239           1 :     TVirtualMC::GetMC()->Gsvolu("0SU2","TUBE",idtmed[kC],psupport2,3);// snaruzhi  C
     240           1 :     TVirtualMC::GetMC()->Gsvolu("0SU3","TUBE",idtmed[kC],psupport3,3);//kryshka perednaiai  C
     241           1 :     TVirtualMC::GetMC()->Gsvolu("0SU4","TUBE",idtmed[kC],psupport3,3);//kryshka zadnaiai  C
     242             :     //    TVirtualMC::GetMC()->Gsvolu("0SU5","TUBE",idtmed[kAir],psupport4,3);// dyrki dlia feu v zadnej kryshke Air
     243           1 :     TVirtualMC::GetMC()->Gsvolu("0SU6","TUBE",idtmed[kC],psupport5,3);// stakanchik dlai feu  C
     244           1 :     TVirtualMC::GetMC()->Gsvolu("0SU7","TUBE",idtmed[kAl],psupport6,3);//kryshechka stakanchika  Al
     245           1 :     TVirtualMC::GetMC()->Gsvolu("0SU8","TUBE",idtmed[kAl],psupport7,3);//kolechko snaruzhu stakanchika Al
     246             :    
     247             :  
     248             : 
     249             :    //non-absorber side support  and T0A !!!!!!!!
     250             :     
     251           1 :     TGeoPcon * supPgon = new TGeoPcon("0supPgon",0.,360.,4);
     252           1 :     supPgon->DefineSection(0, 0, 4.1, 5.5);
     253           1 :     supPgon->DefineSection(1, 10.5 , 4.1, 5.5);
     254           1 :     supPgon->DefineSection(2, 10.5 , 4.1, 4.9);
     255           1 :     supPgon->DefineSection(3, 12.5 , 4.1, 4.9);
     256           1 :     TGeoTranslation *trPgon = new TGeoTranslation("0trPgon",0,0,0);
     257           1 :     trPgon->RegisterYourself();
     258             :  
     259           1 :     TGeoVolumeAssembly * stlin = new TGeoVolumeAssembly("0STL");//empty segment
     260           1 :     TGeoVolume *ins = gGeoManager->GetVolume("0INS");
     261             : 
     262           1 :     new TGeoTube("0HOLE", 0, 1.51, 6.5);
     263           1 :     TGeoTranslation *tr [12];
     264           1 :     Double_t angle  = 2 * TMath::Pi() / 12;
     265             :     // Char_t nameTr[40];
     266           1 :     TString nameTr;
     267          26 :     for (Int_t itr=0; itr<12; itr++) {
     268             :       //      sprintf (nameTr,"0TR%i",itr+1);
     269          24 :       nameTr = Form("0TR%i",itr+1);
     270          12 :       x = 6.5 * TMath::Sin(itr * angle);
     271          12 :       y = 6.5 * TMath::Cos(itr * angle);
     272          48 :       tr[itr] = new TGeoTranslation(nameTr.Data(),x,y,6.5);
     273          12 :       tr[itr]->RegisterYourself();
     274          12 :       stlin->AddNode(ins,itr+13,tr[itr]);
     275             :     }
     276           2 :     TGeoCompositeShape *supsh = new TGeoCompositeShape("0supsh","0supPgon:0trPgon-(0HOLE:0TR1+0HOLE:0TR2+0HOLE:0TR3+0HOLE:0TR4+0HOLE:0TR5+0HOLE:0TR6+0HOLE:0TR7+0HOLE:0TR8+0HOLE:0TR9+0HOLE:0TR10+0HOLE:0TR11+0HOLE:0TR12)");
     277             :   
     278           1 :     TGeoMedium *medal = gGeoManager->GetMedium("T0_Aluminium$");
     279           2 :     TGeoVolume *supA = new TGeoVolume("0SUA",supsh,medal);
     280           3 :     stlin->AddNode(supA,1,new TGeoTranslation(0,0,0));
     281             :  
     282           1 :     TGeoVolume *alice = gGeoManager->GetVolume("ALIC");
     283           3 :     alice->AddNode(stlin,1,new TGeoTranslation(0,0, zdetA ));
     284             :             
     285             :     // T0A finished
     286             : 
     287             :     //T0C 
     288             : // first ring: 12 units of Scintillator+PMT+divider
     289           1 :   Float_t  theta  = (180 / TMath::Pi()) * TMath::ATan(6.6 / zdetC);
     290           1 :   Float_t phi[3];
     291          26 :    for (is=0; is<12; is++)
     292             :       {  
     293             : 
     294          12 :         x = 6.6 * TMath::Sin(is * angle);
     295          12 :         y = 6.6 * TMath::Cos(is * angle);
     296             :         
     297          12 :         phi[0] = -30 * is;
     298          12 :         phi[1] = 90 - is * 30;
     299          12 :         phi[2] = 90 - is * 30;
     300          96 :         for (Int_t j = 0; j < 3; j++)
     301          63 :           if (phi[j] < 0)  phi[j] += 360;
     302             :         
     303          24 :         AliMatrix (idrotm[902 + is], 90.,         phi[0],
     304          12 :                    90. + theta, phi[1],
     305          12 :                    theta,       phi[2]);  
     306          12 :         z=-pstart[2]+pinstart[2]+0.3;
     307          24 :         TVirtualMC::GetMC()->Gspos ("0INS", is + 1, "0STR", x, y, z, idrotm[902 + is], "ONLY");
     308             :   }     
     309             :      
     310             :    x=0;
     311             :    y=0;
     312             :    //   z=-pinstart[2]+ppmt[2]+psupport6[2]*2;
     313           1 :    z=-pinstart[2]+ppmt[2]+0.08; //+psupport6[2];
     314           2 :    TVirtualMC::GetMC()->Gspos("0PMT",1,"0INS",x,y,z,0,"ONLY");
     315             :    // PMT
     316             :    
     317             :    // Entry window (glass)
     318           2 :    TVirtualMC::GetMC()->Gsvolu("0TOP","TUBE",idtmed[kOpGlass],ptop,3); //glass
     319           1 :    z=-ppmt[2]+ptop[2];
     320           2 :    TVirtualMC::GetMC()->Gspos("0TOP",1,"0PMT",0,0,z,0,"ONLY");
     321             :    //"metal" air volume to simulate reclection  
     322           2 :    TVirtualMC::GetMC()->Gsvolu("0TOO","TUBE",idtmed[kOpAir],ptopout,3); 
     323           2 :    TVirtualMC::GetMC()->Gspos("0TOO",1,"0PMT",0,0,z,0,"ONLY");
     324             : 
     325             :    //Fotokatod
     326           2 :    TVirtualMC::GetMC()->Gsvolu ("0REG", "TUBE", idtmed[kOpGlassCathode], preg, 3); 
     327           1 :    z = -ppmt[2] + 2 * ptop[2] + preg[2]; 
     328           2 :    TVirtualMC::GetMC()->Gspos ("0REG", 1, "0PMT", 0, 0, z, 0, "ONLY"); 
     329             :   // Bottom glass
     330           2 :    TVirtualMC::GetMC()->Gsvolu("0BOT","TUBE",idtmed[kGlass],pbot,3);
     331           1 :    z=ppmt[2]-pbot[2];
     332           2 :    TVirtualMC::GetMC()->Gspos("0BOT",1,"0PMT",0,0,z,0,"ONLY");
     333             :    // Side cylinder glass
     334           2 :    TVirtualMC::GetMC()->Gsvolu("0OUT","TUBE",idtmed[kGlass],pglass,3);
     335           1 :    z=ppmt[2]-pglass[2];
     336           2 :    TVirtualMC::GetMC()->Gspos("0OUT",1,"0PMT",0,0,z,0,"ONLY");
     337             :    //PMT electrodes support structure
     338           2 :    TVirtualMC::GetMC()->Gsvolu("0CER","TUBE",idtmed[kCer],pcer,3);
     339           2 :    TVirtualMC::GetMC()->Gsvolu("0STE","TUBE",idtmed[kSteel],psteel,3);
     340           1 :    z=-ppmt[2]+2*ptop[2]+0.3 + pcer[2];
     341           2 :    TVirtualMC::GetMC()->Gspos("0CER",1,"0PMT",0,0,z,0,"ONLY");
     342           1 :    z +=psteel[2]+pcer[2];
     343           2 :    TVirtualMC::GetMC()->Gspos("0STE",1,"0PMT",0,0,z,0,"ONLY");
     344             :     
     345             :    //Support absorber (C) side
     346           1 :    z=-pstart[2]+psupport1[2];//  0.05; //0.1;
     347           2 :    TVirtualMC::GetMC()->Gspos("0SU1",1,"0STR",0,0,z,0,"ONLY"); //C kozhuh snaruzhi
     348           2 :    TVirtualMC::GetMC()->Gspos("0SU2",1,"0STR",0,0,z,0,"ONLY"); //C kozhuh vnutri
     349           1 :    z=-pstart[2]+psupport3[2];//  - 0.1;
     350           2 :    TVirtualMC::GetMC()->Gspos("0SU3",1,"0STR",0,0,z,0,"ONLY"); //peredniaia kryshka
     351           1 :    z=-pstart[2]+2.*psupport1[2];//+0.1;
     352           2 :    TVirtualMC::GetMC()->Gspos("0SU4",1,"0STR",0,0,z,0,"MANY"); //zadnaiai kryshka
     353           2 :    TVirtualMC::GetMC()->Gspos("0SU6",1,"0INS",0,0,0,0,"ONLY");//C stakanchik dlia feu 
     354           1 :    z=-pinstart[2]+psupport6[2]; //-0.1;
     355           2 :    TVirtualMC::GetMC()->Gspos("0SU7",1,"0INS",0,0,z,0,"ONLY"); //Al kryshechka 
     356             :    
     357           1 :    z=pinstart[2]-psupport7[2];
     358             :    //  TVirtualMC::GetMC()->Gspos("0SU8",1,"0SU6",0,0,z,0,"ONLY"); //Al kolechko
     359             :    
     360             :    
     361           1 :    Float_t par[3];
     362           1 :    par[0]=4.4;
     363           1 :    par[1]=4.5;
     364           1 :    par[2]=0.5;
     365           2 :    TVirtualMC::GetMC()->Gsvolu("0SC0","TUBE",idtmed[kC],par,3);
     366           1 :    z=ppcon[3]+par[2];
     367           2 :    TVirtualMC::GetMC()->Gspos("0SC0",1,"0SUP",0,0,z,0,"ONLY"); 
     368           1 :    z += par[2];
     369           1 :    par[0]=4.4;
     370           1 :    par[1]=5.1;
     371           1 :    par[2]=0.05;
     372           2 :    TVirtualMC::GetMC()->Gsvolu("0SC1","TUBE",idtmed[kC],par,3);
     373           1 :    z += par[2];
     374           2 :    TVirtualMC::GetMC()->Gspos("0SC1",1,"0SUP",0,0,z,0,"ONLY"); 
     375           1 :    z=z+par[2];
     376           1 :    par[0]=4.9;
     377           1 :    par[1]=5.0;
     378           1 :    par[2]=6.7/2;
     379           2 :     TVirtualMC::GetMC()->Gsvolu("0SC2","TUBE",idtmed[kC],par,3);
     380           1 :     z += par[2];
     381           2 :     TVirtualMC::GetMC()->Gspos("0SC2",1,"0SUP",0,0,z,0,"ONLY"); 
     382           1 :     z += par[2];
     383             :    
     384           1 :     par[0]=3.15;
     385           1 :     par[1]=4.9;
     386           1 :     par[2]=0.01/2;
     387             : 
     388           2 :     TVirtualMC::GetMC()->Gsvolu("0SA1","TUBE",idtmed[kAl],par,3);
     389             :     
     390           1 :      z += par[2];
     391             :      //  z -= par[2];
     392           2 :     TVirtualMC::GetMC()->Gspos("0SA1",1,"0SUP",0,0,z,0,"ONLY"); 
     393           1 :     z=z+par[2];
     394           1 :     par[0]=3.15;
     395           1 :     par[1]=3.16;
     396           1 :     par[2]=4.7/2;
     397           2 :     TVirtualMC::GetMC()->Gsvolu("0SA2","TUBE",idtmed[kAl],par,3);
     398           1 :     z += par[2];
     399           2 :     TVirtualMC::GetMC()->Gspos("0SA2",1,"0SUP",0,0,z,0,"ONLY"); 
     400           1 :     z=z+par[2];
     401           1 :     par[0]=3.16; // eta chast' prikruchena k absorberu
     402           1 :     par[1]=7.4;
     403           1 :     par[2]=0.01;
     404           2 :     TVirtualMC::GetMC()->Gsvolu("0SA3","TUBE",idtmed[kAl],par,3);
     405             :     //   z += par[2];
     406           1 :    z = ppcon[39] - par[2];
     407           2 :     TVirtualMC::GetMC()->Gspos("0SA3",1,"0SUP",0,0,z,0,"ONLY"); 
     408           1 :     par[0]=3.16; // gvozdi eta chast' prikruchena k absorberu
     409           1 :     par[1]=7.4;
     410           1 :     par[2]=0.01;
     411           2 :     TVirtualMC::GetMC()->Gsvolu("0SN2","TUBE",idtmed[kSteel],par,3);
     412           2 :     TVirtualMC::GetMC()->Gspos("0SN2",1,"0SUP",0,0,z,0,"MANY"); 
     413             :  
     414             :    
     415             : 
     416             :  
     417           1 : }    
     418             : //------------------------------------------------------------------------
     419             : void AliT0v1::AddAlignableVolumes() const
     420             : {
     421             :   //
     422             :   // Create entries for alignable volumes associating the symbolic volume
     423             :   // name with the corresponding volume path. Needs to be syncronized with
     424             :   // eventual changes in the geometry.
     425             :   //
     426             : 
     427             :   // TString volPath;
     428             :   // TString symName, sn;
     429             :   
     430             : 
     431             : 
     432             : 
     433           2 :   TString volPath;
     434           2 :   TString symName, sn;
     435             : 
     436           1 :   TString vpA  = "/ALIC_1/0STL_1/0INS_";
     437           1 :   TString vpC  = "/ALIC_1/0STR_1/0INS_";
     438           1 :   TString vpInside  = "/0PMT_1/0TOP_1";
     439           1 :   TString vpAalign = "/ALIC_1/0STL_1";
     440           1 :   TString vpCalign = "/ALIC_1/0STR_1";
     441             :   
     442          54 :   for (Int_t imod=0; imod<26; imod++)
     443             :     {
     444          26 :       if (imod < 24)
     445             :       {
     446          24 :        if (imod < 12)
     447          24 :          { volPath  = vpC; sn="T0/C/PMT";}
     448             :         else
     449          24 :           { volPath  = vpA; sn="T0/A/PMT";}
     450          24 :       volPath += imod+1;
     451          24 :       volPath += vpInside;
     452          24 :       symName = sn;
     453          24 :      symName += imod+1;
     454             :      }
     455           2 :      else if (imod == 24)
     456           2 :        {volPath  = vpCalign; symName="/ALIC_1/0STR_1";}
     457             :      else
     458           2 :        {volPath  = vpAalign; symName="/ALIC_1/0STL_1";}
     459             : 
     460         130 :       AliDebug(2,"--------------------------------------------");
     461         130 :       AliDebug(2,Form("Alignable object %d", imod));
     462         130 :       AliDebug(2,Form("volPath=%s\n",volPath.Data()));
     463         130 :       AliDebug(2,Form("symName=%s\n",symName.Data()));
     464         130 :       AliDebug(2,"--------------------------------------------");
     465         104 :       if(!gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data()))
     466           0 :        AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",
     467             : symName.Data(),volPath.Data()));
     468             :    }
     469           1 : }   
     470             : //------------------------------------------------------------------------
     471             : void AliT0v1::CreateMaterials()
     472             : {
     473           2 :    Int_t isxfld   = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();
     474           1 :    Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();
     475             :    //   Float_t a,z,d,radl,absl,buf[1];
     476             :    // Int_t nbuf;
     477             : // AIR
     478             :                                                                                 
     479           1 :    Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
     480           1 :    Float_t zAir[4]={6.,7.,8.,18.};
     481           1 :    Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
     482             :    Float_t dAir = 1.20479E-3;
     483             :    Float_t dAir1 = 1.20479E-11;
     484             :                                                                                
     485             : // Scintillator CH
     486           1 :    Float_t ascin[2]={1.01,12.01};
     487           1 :    Float_t zscin[2]={1,6};
     488           1 :    Float_t wscin[2]={1,1};
     489             :    Float_t denscin=1.03;
     490             : //Lucite C(CH3)CO2CH3
     491           1 :    Float_t alucite[3]={1.01,12.01,15.999};
     492           1 :    Float_t zlucite[3]={1,6,8};
     493           1 :    Float_t wlucite[3]={8,5,2};
     494             :    Float_t denlucite=1.16;
     495             :  // PMT glass SiO2
     496           1 :    Float_t aglass[2]={28.0855,15.9994};
     497           1 :    Float_t zglass[2]={14.,8.};
     498           1 :    Float_t wglass[2]={1.,2.};
     499             :    Float_t dglass=2.65;
     500             : // Ceramic   97.2% Al2O3 , 2.8% SiO2
     501             :    // Float_t wcer[2]={0.972,0.028};
     502           1 :    Float_t aCeramic[2]  = { 26.981539,15.9994 };
     503           1 :    Float_t zCeramic[2]  = { 13.,8. };
     504           1 :    Float_t wCeramic[2]  = { 2.,3. };
     505             :    Float_t denscer  = 3.6;
     506             : 
     507             : // Brass 80% Cu, 20% Zn
     508           1 :    Float_t abrass[2] = {63.546,65.39};
     509           1 :    Float_t zbrass[2] = {29,30};
     510           1 :    Float_t wbrass[2] = {0.8,0.2};
     511             :    Float_t denbrass=8.96;
     512             : 
     513             : //Ribber C6H12S
     514           1 :    Float_t aribber[3] = {12.,1.,32.};
     515           1 :    Float_t zribber[3] = {6.,1.,16.};
     516           1 :    Float_t wribber[3] = {6.,12.,1.};
     517             :    Float_t denribber=0.8;
     518             : // Support inside 
     519           1 :    Float_t asupport[2] = {12.,1.};
     520           1 :    Float_t zsupport[2] = {6.,1.};
     521           1 :    Float_t wsupport[2] = {1.,1.};
     522             :    Float_t densupport=0.1;
     523             :     
     524             : //*** Definition Of avaible T0 materials ***
     525           1 :    AliMaterial(0, "Steel$", 55.850,26.,7.87,1.76,999);
     526           1 :    AliMixture(1, "Vacuum$", aAir, zAir, dAir1,4,wAir);
     527           1 :    AliMixture(2, "Air$", aAir, zAir, dAir,4,wAir);
     528           1 :    AliMaterial(10, "CarbonPlastic$", 12.01, 6.0, 2.26, 18.8,999); 
     529           1 :    AliMaterial(11, "Aliminium$", 26.98, 13.0, 2.7, 8.9,999); 
     530             : 
     531           1 :    AliMixture( 3, "Ceramic  $",aCeramic, zCeramic, denscer, -2, wCeramic);
     532           1 :    AliMixture( 4, "PMT glass   $",aglass,zglass,dglass,-2,wglass);
     533             :    /* 
     534             :   char namate[21]="";
     535             :   
     536             :    TVirtualMC::GetMC()->Gfmate((*fIdmate)[3], namate, a, z, d, radl, absl, buf, nbuf);
     537             :    acer[0]=a;  
     538             : 
     539             :    zcer[0]=z;
     540             :    TVirtualMC::GetMC()->Gfmate((*fIdmate)[4], namate, a, z, d, radl, absl, buf, nbuf);
     541             :    acer[1]=a;
     542             :    zcer[1]=z;
     543             :    AliMixture( 11, "Ceramic    $", acer, zcer, denscer, 2, wcer);
     544             :    */ 
     545           1 :     AliMixture( 5, "Scintillator$",ascin,zscin,denscin,-2,wscin);
     546           1 :    AliMixture( 6, "Brass    $", abrass, zbrass, denbrass, 2, wbrass);
     547           1 :    AliMixture( 7, "Ribber $",aribber,zribber,denribber,-3,wribber);
     548           1 :    AliMixture( 8, "Lucite$",alucite,zlucite,denlucite,-3,wlucite);
     549           1 :    AliMixture( 9, "Penoplast$",asupport,zsupport,densupport,-2,wsupport);
     550           1 :    AliMixture( 21, "PMT Optical glass   $",aglass,zglass,dglass,-2,wglass);
     551           1 :    AliMixture( 24, "PMT Optical glass cathode $",aglass,zglass,dglass,-2,wglass);
     552           1 :     AliMixture(22, "T0 Opt Air$", aAir, zAir, dAir,4,wAir);
     553           1 :    AliMixture(23, "T0 Opt Air Next$", aAir, zAir, dAir,4,wAir);
     554             :    
     555           1 :    AliMedium(1, "T0 Air$", 2, 0, isxfld, sxmgmx, 10., .1, 1., .003, .003);
     556           1 :    AliMedium(2, "Scintillator$", 5, 1, isxfld, sxmgmx, 10., .01, 1., .003, .003);
     557           1 :    AliMedium(3, "Vacuum$", 1, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
     558           1 :    AliMedium(4, "Ceramic$", 3, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
     559           1 :    AliMedium(6, "Glass$", 4, 1, isxfld, sxmgmx, 10., .01, .1, .003, .003);
     560           1 :    AliMedium(8, "Steel$", 0, 0, isxfld, sxmgmx, 1., .001, 1., .001, .001);
     561           1 :    AliMedium(9, "Ribber  $", 7, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
     562           1 :    AliMedium(11, "Brass  $", 6, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
     563           1 :    AliMedium(12, "Lucite$", 8, 1, isxfld, sxmgmx, 10., .01, 1., .003, .003);  
     564           1 :    AliMedium(13, "CarbonPlastic$", 10, 0, isxfld, sxmgmx, 10., .01, 1., .003, .003);  
     565           1 :    AliMedium(14, "PenoPlast$", 9, 0, isxfld, sxmgmx, 10., .01, 1., .003, .003);  
     566           1 :    AliMedium(15, "Aluminium$", 11, 0, isxfld, sxmgmx, 10., .01, 1., .003, .003);  
     567           1 :    AliMedium(16, "OpticalGlass$", 21, 1, isxfld, sxmgmx, 10., .01, .1, .003, .003);
     568           1 :    AliMedium(17, "T0 OpAir$", 22, 0, isxfld, sxmgmx, 10., .1, 1., .003, .003);
     569           1 :    AliMedium(18, "T0 OpAirNext$", 23, 0, isxfld, sxmgmx, 10., .1, 1., .003, .003);
     570           1 :     AliMedium(19, "OpticalGlassCathode$", 24, 1, isxfld, sxmgmx, 10., .01, .1, .003, .003);
     571             :    
     572           3 :    AliDebugClass(1,": ++++++++++++++Medium set++++++++++");
     573             :    
     574             :    
     575           1 : }
     576             : 
     577             : //-------------------------------------------------------------------
     578             : void AliT0v1::DefineOpticalProperties()
     579             : {
     580             : // Optical properties definition.
     581           2 :    Int_t *idtmed = fIdtmed->GetArray();
     582             : // Definition Cherenkov parameters
     583             :    int i;
     584             :    const Int_t kNbins=31;
     585             :    
     586           1 :    Float_t rindexSiO2[kNbins],  efficAll[kNbins], rindexAir[kNbins], absorAir[kNbins],rindexCathodeNext[kNbins], absorbCathodeNext[kNbins];
     587           1 :    Double_t efficMet[kNbins], aReflMet[kNbins];
     588             :            
     589             :    // quartz 20mm
     590           1 :    Float_t aAbsSiO2[kNbins]={29.0, 28.6, 28.3, 27.7, 27.3, 26.7, 26.4, 
     591             :                              25.9, 25.3, 24.9, 24.5, 23.7, 
     592             :                              23.2, 22.8, 22.4, 21.8, 21.3,
     593             :                              22.8, 22.1, 21.7, 21.2, 20.5, 
     594             :                              19.9, 19.3, 18.7, 18.0, 17.1, 
     595             :                              16.3, 15.3, 14.3, 14.3   };
     596             :           
     597           1 :    Float_t aPckov[kNbins]  ={3.87, 3.94, 4.02, 4.11, 4.19, 4.29, 4.38,
     598             :                              4.48, 4.58, 4.69, 4.81, 4.93, 
     599             :                              5.05, 5.19, 5.33, 5.48, 5.63,
     600             :                              5.8,  5.97, 6.16, 6.36, 6.57, 
     601             :                              6.8,  7.04, 7.3,  7.58, 7.89, 
     602             :                              8.22, 8.57, 8.97, 9.39 };  
     603           1 :   Double_t dPckov[kNbins]  ={3.87, 3.94, 4.02, 4.11, 4.19, 4.29, 4.38,
     604             :                              4.48, 4.58, 4.69, 4.81, 4.93,
     605             :                              5.05, 5.19, 5.33, 5.48, 5.63,
     606             :                              5.8,  5.97, 6.16, 6.36, 6.57,
     607             :                              6.8,  7.04, 7.3,  7.58, 7.89,
     608             :                              8.22, 8.57, 8.97, 9.39 };
     609             : 
     610             :    /*     
     611             :    Float_t effCathode[kNbins]={0.11, 0.13, 0.15, 0.16, 0.18, 0.19, 0.20,
     612             :                               0.21, 0.22, 0.23, 0.24, 0.26, 
     613             :                               0.27, 0.29, 0.30, 0.29, 0.29, 
     614             :                               0.28, 0.28, 0.27, 0.26, 0.25, 
     615             :                               0.25, 0.23, 0.20, 0.19, 0.17,
     616             :                               0.17, 0.17, 0.2, 0.23};
     617             :    */     
     618             :    //  Float_t aAbsSiO2[kNbins]; //quartz 30mm
     619          64 :  for(i=0;i<kNbins;i++)
     620             : 
     621             :     {
     622          31 :       aPckov[i]=aPckov[i]*1e-9;//Photons energy bins 4 eV - 8.5 eV step 0.1 eV
     623          31 :       dPckov[i]=dPckov[i]*1e-9;//Photons energy bins 4 eV - 8.5 eV step 0.1 eV 
     624             :       //      rindexAir[i]=0.0001;
     625          31 :       rindexAir[i] = 1.;
     626          31 :       rindexSiO2[i]=1.458; //refractive index for qwarts
     627          31 :       rindexCathodeNext[i]=0;
     628          31 :       efficAll[i]=1.;
     629          31 :       efficMet[i]=0.;
     630          31 :       aReflMet[i]=1.;
     631             :       //      aAbsSiO2[i]=28.5; //quartz 30mm
     632          31 :       absorAir[i]=0.3;      
     633          31 :       absorbCathodeNext[i]=0;
     634             : 
     635             :     }
     636             :   
     637           1 :   TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpGlass], kNbins, aPckov, aAbsSiO2, efficAll, rindexSiO2 );
     638             :    // TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpGlassCathode], kNbins, aPckov, aAbsSiO2, effCathode, rindexSiO2 );
     639           1 :    TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpGlassCathode], kNbins, aPckov, aAbsSiO2,efficAll , rindexSiO2 );
     640           1 :   TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpAir], kNbins, aPckov,absorAir , efficAll,rindexAir );
     641           1 :    TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpAirNext], kNbins, aPckov,absorbCathodeNext , efficAll, rindexCathodeNext);
     642             : 
     643             :    //Define a boarder for radiator optical properties
     644           1 :    TVirtualMC::GetMC()->DefineOpSurface("surfRd", kUnified /*kGlisur*/,kDielectric_metal,kPolished, 0.);
     645           1 :    TVirtualMC::GetMC()->SetMaterialProperty("surfRd", "EFFICIENCY", kNbins, dPckov, efficMet);
     646           1 :    TVirtualMC::GetMC()->SetMaterialProperty("surfRd", "REFLECTIVITY", kNbins, dPckov, aReflMet);
     647           1 :    TVirtualMC::GetMC()->SetBorderSurface("0TOPborder", "0TOP",1,"0TOO",1, "surfRd");
     648             : 
     649             : 
     650           1 : }
     651             : 
     652             : //-------------------------------------------------------------------
     653             : void AliT0v1::Init()
     654             : {
     655             : // Initialises version 0 of the Forward Multiplicity Detector
     656             : //
     657           2 :   AliT0::Init();
     658           1 :   fIdSens1=TVirtualMC::GetMC()->VolId("0REG");
     659             : 
     660           3 :    AliDebug(1,Form("%s: *** T0 version 1 initialized ***\n",ClassName()));
     661           1 : }
     662             : 
     663             : //-------------------------------------------------------------------
     664             : 
     665             : void AliT0v1::StepManager()
     666             : {
     667             :   //
     668             :   // Called for every step in the T0 Detector
     669             :   //
     670      159600 :   Int_t id,copy,copy1;
     671             :   static Float_t hits[6];
     672             :   static Int_t vol[2];
     673       79800 :   TLorentzVector pos;
     674       79800 :   TLorentzVector mom;
     675             :   
     676             :   //   TClonesArray &lhits = *fHits;
     677             :   
     678      256430 :   if(!TVirtualMC::GetMC()->IsTrackAlive()) return; // particle has disappeared
     679             :   
     680      125540 :   id=TVirtualMC::GetMC()->CurrentVolID(copy);
     681             :   
     682             :   // Check the sensetive volume
     683       62770 :   if(id==fIdSens1 ) { 
     684       38697 :     if(TVirtualMC::GetMC()->IsTrackEntering()) {
     685       25760 :       TVirtualMC::GetMC()->CurrentVolOffID(2,copy);
     686       12880 :       vol[1]=copy;
     687       25760 :       TVirtualMC::GetMC()->CurrentVolOffID(3,copy1);
     688       12880 :       vol[0]=copy1;
     689       25760 :       TVirtualMC::GetMC()->TrackPosition(pos);
     690       25760 :       hits[0] = pos[0];
     691       25760 :       hits[1] = pos[1];
     692       25760 :       hits[2] = pos[2];
     693       27818 :       if(pos[2]<0) vol[0] = 2;
     694       36582 :       if(pos[2]>=0) vol[0] = 1; 
     695             :       
     696       38640 :       Float_t etot=TVirtualMC::GetMC()->Etot();
     697       12880 :       hits[3]=etot;
     698       25760 :       Int_t iPart= TVirtualMC::GetMC()->TrackPid();
     699       25760 :       Int_t partID=TVirtualMC::GetMC()->IdFromPDG(iPart);
     700       12880 :       hits[4]=partID;
     701       38640 :       Float_t ttime=TVirtualMC::GetMC()->TrackTime();
     702       12880 :       hits[5]=ttime*1e12;
     703       38640 :       if (TVirtualMC::GetMC()->TrackPid() == 50000050)   // If particles is photon then ...
     704             :         {
     705       25722 :           if(RegisterPhotoE(vol[1]-1,hits[3])) {
     706        5488 :             AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol,hits);
     707             :             // Create a track reference at the exit of photocatode
     708             :           }         
     709             :         }
     710             : 
     711             :       //charge particle 
     712       38640 :       if ( TVirtualMC::GetMC()->TrackCharge() )
     713          16 :         AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kT0);
     714             :       
     715             :         /*              
     716             :                 printf("track(%i) alive(%i) disap(%i) enter(%i) exit(%i) inside(%i) out(%i) stop(%i) new(%i) \n",
     717             :                        gAlice->GetMCApp()->GetCurrentTrackNumber(),
     718             :                TVirtualMC::GetMC()->IsTrackAlive(),
     719             :                TVirtualMC::GetMC()->IsTrackDisappeared(),
     720             :                TVirtualMC::GetMC()->IsTrackEntering(),
     721             :                TVirtualMC::GetMC()->IsTrackExiting(),
     722             :                TVirtualMC::GetMC()->IsTrackInside(),
     723             :                TVirtualMC::GetMC()->IsTrackOut(),
     724             :                TVirtualMC::GetMC()->IsTrackStop(),
     725             :                TVirtualMC::GetMC()->IsNewTrack());
     726             :         */
     727       12880 :     }// trck entering           
     728             :   } //sensitive
     729             :   
     730      142570 : }
     731             : 
     732             : 
     733             : 
     734             : //------------------------------------------------------------------------
     735             : Bool_t AliT0v1::RegisterPhotoE(Int_t ipmt,Double_t energy)
     736             : {
     737             : 
     738             :   
     739             :   //  Float_t hc=197.326960*1.e6; //mev*nm
     740             :   Double_t hc=1.973*1.e-6; //gev*nm
     741       25722 :   Float_t lambda=hc/energy;
     742       12861 :   Float_t eff = ((TGraph*) fEffPMT.At(ipmt))->Eval(lambda);
     743       12861 :   Double_t  p = gRandom->Rndm();
     744             : 
     745       12861 :   if (p > eff)
     746       10117 :     return kFALSE;
     747             :   
     748        2744 :   return kTRUE;
     749       12861 : }
     750             : 
     751             : //----------------------------------------------------------------------------
     752             : 
     753             : 
     754             : 
     755             : 
     756             : 
     757             : 

Generated by: LCOV version 1.11