/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Id$ */ ///////////////////////////////////////////////////////////////////// // // // T0 ( T-zero) detector version 0 // // //Begin Html /* */ //End Html // // // // ////////////////////////////////////////////////////////////////////// #define RIGHT_ARRAY 1 #define LEFT_ARRAY 2 #include #include #include #include #include #include "AliMagF.h" #include "AliRun.h" #include "AliT0hit.h" #include "AliT0v2.h" #include "AliMC.h" ClassImp(AliT0v2) ////////////////////////////////////////////////////////////////////// // Standart constructor for T0 Detector version 2 ////////////////////////////////////////////////////////////////////// AliT0v2::AliT0v2(const char *name, const char *title): AliT0(name,title) { fIdSens1 = 0; // setBufferSize(128000); } ////////////////////////////////////////////////////////////////////// // Create the geometry of T0 Detector version 2 ////////////////////////////////////////////////////////////////////// void AliT0v2::CreateGeometry() { /* */ Int_t *idtmed; Int_t idrotm[999]; Int_t i, j; Float_t x, y, z; Float_t zRight; Float_t zLeft; Float_t phi[3]; Float_t theta; Double_t angel; Float_t pstart[3] = {4.5, 10.7, 5.3}; Float_t pinstart[3] = {0., 1.31, 5.25}; Float_t ppmt[3] = {0., 1.31, 3.5}; Float_t ptop[3] = {0., 1.3, 1.5}; // Float_t preg[3] = {0., 1.3, 0.005}; Float_t preg[3] = {0., 0.875, 0.005}; Float_t pdes[3] = {0.875, 1.3, 0.005}; zRight = 75.; zLeft = 350.; theta = (180 / TMath::Pi()) * TMath::ATan(6.5 / zRight); angel = 2 * TMath::Pi() / 12; idtmed = fIdtmed->GetArray(); AliMatrix (idrotm[901], 90., 0., 90., 90., 180., 0.); gMC->Gsvolu ("0RST", "TUBE", idtmed[3], pstart, 3); gMC->Gsvolu ("0LST", "TUBE", idtmed[3], pstart, 3); gMC->Gspos ("0RST", 1, "ALIC", 0., 0., -zRight, 0, "ONLY"); gMC->Gspos ("0LST", 1, "ALIC", 0., 0., zLeft, idrotm[901], "ONLY"); // 12 unit: PMT + divider gMC->Gsvolu("0INS", "TUBE", idtmed[3], pinstart, 3); z = 0; for (i = 0; i < 12; i++) { x = 6.5 * TMath::Sin(i * angel); y = 6.5 * TMath::Cos(i * angel); phi[0] = -30 * i; phi[1] = 90 - i * 30; phi[2] = 90 - i * 30; for (j = 0; j < 3; j++) if (phi[j] < 0) phi[j] += 360; AliMatrix (idrotm[902 + i], 90., phi[0], 90. + theta, phi[1], theta, phi[2]); gMC->Gspos ("0INS", i + 1, "0RST", x, y, z, idrotm[902 + i], "ONLY"); gMC->Gspos ("0INS", i + 13, "0LST", x, y, z, 0, "ONLY"); } gMC->Gsvolu ("0PMT", "TUBE", idtmed[1], ppmt, 3); x = y = 0; z = -pinstart[2] + ppmt[2]; gMC->Gspos ("0PMT", 1, "0INS", x, y, z, 0, "ONLY"); // PMT // Entry window (glass) gMC->Gsvolu ("0TOP", "TUBE", idtmed[6], ptop, 3); z = -ppmt[2] + ptop[2]; gMC->Gspos ("0TOP", 1, "0PMT", 0, 0, z, 0, "ONLY"); gMC->Gsvolu ("0REG", "TUBE", idtmed[6], preg, 3); z = -ppmt[2] + 2 * ptop[2] + preg[2]; gMC->Gspos ("0REG", 1, "0PMT", 0, 0, z, 0, "ONLY"); gMC->Gsvolu ("0DES", "TUBE", idtmed[6], pdes, 3); z = -ppmt[2] + 2 * ptop[2] + preg[2]; gMC->Gspos ("0DES", 1, "0PMT", 0, 0, z, 0, "ONLY"); } ////////////////////////////////////////////////////////////////////// // Definition of avaible T0 materials ////////////////////////////////////////////////////////////////////// void AliT0v2::CreateMaterials() { Int_t isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ(); Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max(); Float_t a, z, d, radl, absl, buf[1]; Int_t nbuf; // Scintillator CH Float_t ascin[2] = {1.01, 12.01}; Float_t zscin[2] = {1., 6.}; Float_t wscin[2] = {1., 1.}; Float_t denscin = 1.03; // PMT glass SiO2 Float_t aglass[2] = {28.0855, 15.9994}; Float_t zglass[2] = {14., 8.}; Float_t wglass[2] = { 1., 2.}; Float_t dglass = 2.65; // Ceramic 97.2% Al2O3 , 2.8% SiO2 Float_t acer[2], zcer[2]; Float_t wcer[2] = { 0.972, 0.028}; Float_t aal2o3[2] = {26.981539, 15.9994 }; Float_t zal2o3[2] = {13., 8.}; Float_t wal2o3[2] = { 2., 3.}; Float_t denscer = 3.6; // Brass 80% Cu, 20% Zn Float_t abrass[2] = {63.546, 65.39}; Float_t zbrass[2] = {29., 30.}; Float_t wbrass[2] = { 0.8, 0.2}; Float_t denbrass = 8.96; //Ribber C6H12S Float_t aribber[3] = {12., 1., 32.}; Float_t zribber[3] = { 6., 1., 16.}; Float_t wribber[3] = { 6., 12., 1.}; Float_t denribber = 0.8; AliMaterial (0, "T0 Steel$", 55.850, 26., 7.87, 1.76, 999); AliMaterial (1, "T0 Vacuum$", 1.e-16, 1.e-16, 1.e-16, 1.e16, 999); AliMaterial (2, "T0 Air$", 14.61, 7.3, .001205, 30423., 999); AliMixture (3, "Al2O3 $", aal2o3, zal2o3, denscer, -2, wal2o3); AliMixture (4, "PMT glass $", aglass, zglass, dglass, -2, wglass); char namate[21]=""; gMC->Gfmate ((*fIdmate)[3], namate, a, z, d, radl, absl, buf, nbuf); acer[0] = a; zcer[0] = z; gMC->Gfmate ((*fIdmate)[4], namate, a, z, d, radl, absl, buf, nbuf); acer[1] = a; zcer[1] = z; AliMixture (5, "Scintillator$",ascin,zscin,denscin,-2,wscin); AliMixture (6, "Brass $", abrass, zbrass, denbrass, 2, wbrass); AliMixture (7, "Ribber $",aribber,zribber,denribber,-3,wribber); AliMixture (9, "Ceramic $", acer, zcer, denscer, 2, wcer); AliMedium (1, "T0 Air$", 2, 0, isxfld, sxmgmx, 10., .1, 1., .003, .003); AliMedium (2, "Scintillator$", 5, 1, isxfld, sxmgmx, 10., .01, 1., .003, .003); AliMedium (3, "Vacuum$", 1, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003); AliMedium (4, "Ceramic$", 9, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003); AliMedium (6, "Glass$", 4, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003); AliMedium (8, "Steel$", 0, 0, isxfld, sxmgmx, 1., .001, 1., .001, .001); AliMedium (9, "Ribber $", 7, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003); AliMedium(11, "Brass $", 6, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003); } ////////////////////////////////////////////////////////////////////// // Definition of optical properties for the Forward Multiplicity Detector ////////////////////////////////////////////////////////////////////// void AliT0v2::DefineOpticalProperties() { // Optical properties definition. // Definition Cherenkov parameters const Int_t NUMENTRIES = 32; Float_t ppckov[NUMENTRIES] = { 2.034E-9, 2.068E-9, 2.103E-9, 2.139E-9, 2.177E-9, 2.216E-9, 2.256E-9, 2.298E-9, 2.341E-9, 2.386E-9, 2.433E-9, 2.481E-9, 2.532E-9, 2.585E-9, 2.640E-9, 2.697E-9, 2.757E-9, 2.820E-9, 2.885E-9, 2.954E-9, 3.026E-9, 3.102E-9, 3.181E-9, 3.265E-9, 3.353E-9, 3.446E-9, 3.545E-9, 3.649E-9, 3.760E-9, 3.877E-9, 4.002E-9, 4.136E-9 }; Float_t rindex_qwarz[NUMENTRIES] = { 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458 }; Float_t rindex_air[NUMENTRIES] = { 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1. }; Float_t effic_all[NUMENTRIES] = { 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1. }; Float_t absor_qwarz[NUMENTRIES] = { 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000., 2000. }; Float_t absor_air[NUMENTRIES] = { 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200., 200. }; Int_t *idtmed = fIdtmed->GetArray(); gMC->SetCerenkov (idtmed[6], NUMENTRIES, ppckov, absor_qwarz, effic_all, rindex_qwarz); gMC->SetCerenkov (idtmed[1], NUMENTRIES, ppckov, absor_air, effic_all, rindex_air); } ////////////////////////////////////////////////////////////////////// // Initialises version 2 of the Forward Multiplicity Detector ////////////////////////////////////////////////////////////////////// void AliT0v2::Init() { AliT0::Init(); fIdSens1 = gMC->VolId ("0REG"); printf ("*** T0 version 2 initialized ***\n"); } ////////////////////////////////////////////////////////////////////// // Called for every step in the T0 Detector ////////////////////////////////////////////////////////////////////// void AliT0v2::StepManager() { Int_t id; Int_t copy; // Int_t copy1; Float_t xyz[3]; Float_t XYZ[3]; Float_t hitPhoton[6]; static Float_t hits[7]; static Float_t edep; static Int_t vol[2]; TLorentzVector pos; TLorentzVector mom; if(!gMC->IsTrackAlive()) return; // particle has disappeared // TGeant3 *g3 = (TGeant3*) gMC; // g3->Gpcxyz(); TClonesArray &lhits = *fHits; /////////////////////////////////////////////// // If particles is photon then ... if (gMC->TrackPid() == 50000050) { id = gMC->CurrentVolID(copy); // Check the sensetive volume if (id == fIdSens1) { if (gMC->IsTrackEntering()) { gMC->CurrentVolOffID(2,copy); if (copy < 13) { vol[0] = RIGHT_ARRAY; vol[1] = copy; } else { vol[0] = LEFT_ARRAY; vol[1] = copy - 12; } gMC->TrackPosition(pos); gMC->TrackMomentum(mom); XYZ[0] = pos[0]; XYZ[1] = pos[1]; XYZ[2] = pos[2]; gMC->Gmtod (XYZ, xyz, 1); hitPhoton[0] = sqrt (xyz[0] * xyz[0] + xyz[1] * xyz[1]); hitPhoton[1] = mom[0]; hitPhoton[2] = mom[1]; hitPhoton[3] = mom[2]; hitPhoton[4] = 1e9 * gMC->TrackTime(); hitPhoton[5] = 1e9 * gMC->Etot(); AddHitPhoton (gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hitPhoton); } gMC->StopTrack(); } else if (id == gMC->VolId ("0DES")) gMC->StopTrack(); } // end photon particalary /////////////////////////////////////////////// /////////////////////////////////////////////// // If particles is charge then ... // Float_t charge = gMC->TrackCharge(); // if(TMath::Abs(charge) <= 0.) return; id = gMC->CurrentVolID(copy); // printf("gMC->ckine->ipart %d",gMC->ckine->ipart); // Check the sensetive volume if(id==gMC->VolId("0TOP") ) { if(gMC->IsTrackEntering()) { gMC->CurrentVolOffID(2,copy); if (copy < 13) { vol[0] = RIGHT_ARRAY; vol[1] = copy; } else { vol[0] = LEFT_ARRAY; vol[1] = copy - 12; } gMC->TrackPosition(pos); hits[0] = pos[0]; hits[1] = pos[1]; hits[2] = pos[2]; Float_t etot = gMC->Etot(); hits[4] = etot; Int_t part = gMC->TrackPid(); hits[5] = part; Float_t ttime = gMC->TrackTime(); hits[6] = ttime*1e9; edep = 0; } if(gMC->IsTrackInside()) { Float_t de = gMC->Edep(); edep = edep + de; // printf ("E deposition %f\n",edep); // for (i=0; i<=6; i++){ // printf(" HITS on T0 inside %f\n",hits[i]); } } if(gMC->IsTrackExiting()) { Float_t de = gMC->Edep(); edep = edep + de; hits[3] = edep * 1e3; // for (i=0; i<=6; i++){ // printf(" HITS on T0 Exit %f\n",hits[i]); } //for (i=0; i<=1; i++) { printf("T0 vol %d\n",vol[i]);} new(lhits[fNhits++]) AliT0hit(fIshunt,gAlice->GetMCApp()->GetCurrentTrackNumber(),vol,hits); } } // end charge particles particalary /////////////////////////////////////////////// }