1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 /////////////////////////////////////////////////////////////////////
19 // FIT detector full geometry version 1 //
23 <img src="gif/AliFITv1Class.gif">
28 //////////////////////////////////////////////////////////////////////
30 #include <Riostream.h>
33 #include "TGeoCompositeShape.h"
34 #include "TGeoManager.h"
35 #include "TGeoMatrix.h"
36 #include "TGeoVolume.h"
42 #include <TGeoGlobalMagField.h>
44 #include <TLorentzVector.h>
46 #include <TVirtualMC.h>
53 #include "AliFITHits.h"
57 #include "AliCDBLocal.h"
58 #include "AliCDBStorage.h"
59 #include "AliCDBManager.h"
60 #include "AliCDBEntry.h"
61 #include "AliTrackReference.h"
66 //--------------------------------------------------------------------
67 AliFITv1::AliFITv1(): AliFIT(),
73 // Standart constructor for T0 Detector version 0
75 //--------------------------------------------------------------------
76 AliFITv1::AliFITv1(const char *name, const char *title):
83 // Standart constructor for T0 Detector version 0
88 //_____________________________________________________________________________
95 //-------------------------------------------------------------------------
96 void AliFITv1::CreateGeometry()
99 // Create the geometry of FIT Detector version 1 full geometry
104 Int_t *idtmed = fIdtmed->GetArray();
106 Float_t zdetA = 375.;
110 Float_t pstart[3] = {6, 20 ,3};
111 Float_t pinstart[3] = {3,3,2.55};
112 Float_t pmcp[3] = {2.95, 2.95, 1.5}; //MCP
113 Float_t ptop[3] = {1.324, 1.324, 1.};//cherenkov radiator
114 Float_t preg[3] = {1.324, 1.324, 0.05};//photcathode
116 AliMatrix(idrotm[901], 90., 0., 90., 90., 180., 0.);
118 //-------------------------------------------------------------------
120 //-------------------------------------------------------------------
122 Float_t x1[20] = {9, 9, 15 ,15 , 9,
124 -9, -9, -15, -15, -9,
127 Float_t y1[20] = {3.2, -3.2, 3.2, -3.2, -9.2,
128 -9, -9, -15, -15, -9.2,
129 -3.2, 3.2, -3.2, 3.2, 9.2,
134 TGeoVolumeAssembly * stlin = new TGeoVolumeAssembly("0STL");//empty segment
136 TVirtualMC::GetMC()->Gsvolu("0INS","BOX",idtmed[kAir],pinstart,3);
137 TGeoVolume *ins = gGeoManager->GetVolume("0INS");
139 TGeoTranslation *tr [20];
141 for (Int_t itr=0; itr<20; itr++) {
142 nameTr = Form("0TR%i",itr+1);
143 z=-pstart[2]+pinstart[2];
144 tr[itr] = new TGeoTranslation(nameTr.Data(),x1[itr],y1[itr], z );
145 tr[itr]->RegisterYourself();
146 stlin->AddNode(ins,itr,tr[itr]);
148 TGeoVolume *alice = gGeoManager->GetVolume("ALIC");
149 alice->AddNode(stlin,1,new TGeoTranslation(0,0, zdetA ) );
150 TGeoRotation * rotC = new TGeoRotation( "rotC",90., 0., 90., 90., 180., 0.);
151 alice->AddNode(stlin,2, new TGeoCombiTrans(0., 0., -zdetC , rotC) );
156 // Entry window (glass)
157 TVirtualMC::GetMC()->Gsvolu("0TOP","BOX",idtmed[kOpGlass],ptop,3); //glass
158 TGeoVolume *top = gGeoManager->GetVolume("0TOP");
159 TVirtualMC::GetMC()->Gsvolu ("0REG", "BOX", idtmed[kOpGlassCathode], preg, 3);
160 TGeoVolume *cat = gGeoManager->GetVolume("0REG");
161 TVirtualMC::GetMC()->Gsvolu("0MCP","BOX",idtmed[kGlass],pmcp,3); //glass
162 TGeoVolume *mcp = gGeoManager->GetVolume("0MCP");
165 Float_t xin=0, yin=0;
166 for (Int_t ix=0; ix<2; ix++) {
167 xin = - pinstart[0] + 0.35 + (ix+0.5)*2*ptop[0] ;
168 for (Int_t iy=0; iy<2; iy++) {
169 z = - pinstart[2]+ptop[2];
170 yin = - pinstart[1] + 0.35 + (iy+0.5)*2*ptop[1];
172 ins->AddNode(top, ntops, new TGeoTranslation(xin,yin,z) );
173 // printf(" 0TOP full x %f y %f z %f \n", xin, yin, z);
174 z = -pinstart[2] + 2 * ptop[2] + preg[2];
175 ins->AddNode(cat, ntops, new TGeoTranslation(xin,yin,z) );
177 // printf(" GEOGEO %i %i %i %f %f %f %f %f %f \n", ntops, ix, iy,
178 // xin,yin,x1[ntops],y1[ntops],x1[ntops]+xin,y1[ntops]+yin);
182 z=-pinstart[2] + 2*ptop[2] + 2*preg[2] + pmcp[2];
183 ins->AddNode(mcp, 1 , new TGeoTranslation(0,0,z) );
189 //------------------------------------------------------------------------
190 void AliFITv1::AddAlignableVolumes() const
193 // Create entries for alignable volumes associating the symbolic volume
194 // name with the corresponding volume path. Needs to be syncronized with
195 // eventual changes in the geometry.
199 TString vpAalign = "/ALIC_1/0STL_1";
200 TString vpCalign = "/ALIC_1/0STL_2";
201 for (Int_t imod=0; imod<2; imod++) {
202 if (imod==0) {volPath = vpCalign; symName="/ALIC_1/0STL_1"; }
203 if (imod==1) {volPath = vpAalign; symName="/ALIC_1/0STL_2"; }
205 AliDebug(2,"--------------------------------------------");
206 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
207 AliDebug(2,Form("symName=%s\n",symName.Data()));
208 AliDebug(2,"--------------------------------------------");
209 if(!gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data()))
210 AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",
211 symName.Data(),volPath.Data()));
214 //------------------------------------------------------------------------
215 void AliFITv1::CreateMaterials()
218 Int_t isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();
219 Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();
220 // Float_t a,z,d,radl,absl,buf[1];
224 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
225 Float_t zAir[4]={6.,7.,8.,18.};
226 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
227 Float_t dAir = 1.20479E-3;
228 Float_t dAir1 = 1.20479E-11;
229 // Radiator glass SiO2
230 Float_t aglass[2]={28.0855,15.9994};
231 Float_t zglass[2]={14.,8.};
232 Float_t wglass[2]={1.,2.};
235 Float_t dglass_mcp=1.3;
236 //*** Definition Of avaible T0 materials ***
237 AliMixture(1, "Vacuum$", aAir, zAir, dAir1,4,wAir);
238 AliMixture(2, "Air$", aAir, zAir, dAir,4,wAir);
239 AliMixture( 4, "MCP glass $",aglass,zglass,dglass_mcp,-2,wglass);
240 AliMixture( 24, "Radiator Optical glass$",aglass,zglass,dglass,-2,wglass);
242 AliMedium(1, "Air$", 2, 0, isxfld, sxmgmx, 10., .1, 1., .003, .003);
243 AliMedium(3, "Vacuum$", 1, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
244 AliMedium(6, "Glass$", 4, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
246 AliMedium(16, "OpticalGlass$", 24, 1, isxfld, sxmgmx, 10., .01, .1, .003, .003);
247 AliMedium(19, "OpticalGlassCathode$", 24, 1, isxfld, sxmgmx, 10., .01, .1, .003, .003);
248 AliMedium(22, "SensAir$", 2, 1, isxfld, sxmgmx, 10., .1, 1., .003, .003);
250 AliDebugClass(1,": ++++++++++++++Medium set++++++++++");
255 //-------------------------------------------------------------------
256 void AliFITv1::DefineOpticalProperties()
260 // Optical properties definition.
261 Int_t *idtmed = fIdtmed->GetArray();
262 // Definition Cherenkov parameters
264 const Int_t kNbins=31;
266 Float_t rindexSiO2[kNbins], efficAll[kNbins], rindexAir[kNbins], absorAir[kNbins],rindexCathodeNext[kNbins], absorbCathodeNext[kNbins];
267 Double_t efficMet[kNbins], aReflMet[kNbins];
270 Float_t aAbsSiO2[kNbins]={29.0, 28.6, 28.3, 27.7, 27.3, 26.7, 26.4,
271 25.9, 25.3, 24.9, 24.5, 23.7,
272 23.2, 22.8, 22.4, 21.8, 21.3,
273 22.8, 22.1, 21.7, 21.2, 20.5,
274 19.9, 19.3, 18.7, 18.0, 17.1,
275 16.3, 15.3, 14.3, 14.3 };
277 Float_t aPckov[kNbins] ={3.87, 3.94, 4.02, 4.11, 4.19, 4.29, 4.38,
278 4.48, 4.58, 4.69, 4.81, 4.93,
279 5.05, 5.19, 5.33, 5.48, 5.63,
280 5.8, 5.97, 6.16, 6.36, 6.57,
281 6.8, 7.04, 7.3, 7.58, 7.89,
282 8.22, 8.57, 8.97, 9.39 };
283 Double_t dPckov[kNbins] ={3.87, 3.94, 4.02, 4.11, 4.19, 4.29, 4.38,
284 4.48, 4.58, 4.69, 4.81, 4.93,
285 5.05, 5.19, 5.33, 5.48, 5.63,
286 5.8, 5.97, 6.16, 6.36, 6.57,
287 6.8, 7.04, 7.3, 7.58, 7.89,
288 8.22, 8.57, 8.97, 9.39 };
291 Float_t effCathode[kNbins]={0.11, 0.13, 0.15, 0.16, 0.18, 0.19, 0.20,
292 0.21, 0.22, 0.23, 0.24, 0.26,
293 0.27, 0.29, 0.30, 0.29, 0.29,
294 0.28, 0.28, 0.27, 0.26, 0.25,
295 0.25, 0.23, 0.20, 0.19, 0.17,
296 0.17, 0.17, 0.2, 0.23};
298 // Float_t aAbsSiO2[kNbins]; //quartz 30mm
299 for(i=0;i<kNbins;i++)
302 aPckov[i]=aPckov[i]*1e-9;//Photons energy bins 4 eV - 8.5 eV step 0.1 eV
303 dPckov[i]=dPckov[i]*1e-9;//Photons energy bins 4 eV - 8.5 eV step 0.1 eV
304 // rindexAir[i]=0.0001;
306 rindexSiO2[i]=1.458; //refractive index for qwarts
307 rindexCathodeNext[i]=0;
311 // aAbsSiO2[i]=28.5; //quartz 30mm
313 absorbCathodeNext[i]=0;
317 TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpGlass], kNbins, aPckov, aAbsSiO2, efficAll, rindexSiO2 );
318 // TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpGlassCathode], kNbins, aPckov, aAbsSiO2, effCathode, rindexSiO2 );
319 TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpGlassCathode], kNbins, aPckov, aAbsSiO2,efficAll , rindexSiO2 );
320 // TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpAir], kNbins, aPckov,absorAir , efficAll,rindexAir );
321 // TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpAirNext], kNbins, aPckov,absorbCathodeNext , efficAll, rindexCathodeNext);
323 //Define a boarder for radiator optical properties
324 TVirtualMC::GetMC()->DefineOpSurface("surfRd", kUnified /*kGlisur*/,kDielectric_metal,kPolished, 0.);
325 TVirtualMC::GetMC()->SetMaterialProperty("surfRd", "EFFICIENCY", kNbins, dPckov, efficMet);
326 TVirtualMC::GetMC()->SetMaterialProperty("surfRd", "REFLECTIVITY", kNbins, dPckov, aReflMet);
331 //-------------------------------------------------------------------
332 void AliFITv1::Init()
334 // Initialises version 0 of the Forward Multiplicity Detector
337 fIdSens1=TVirtualMC::GetMC()->VolId("0REG");
339 AliDebug(1,Form("%s: *** FIT version 1 initialized ***\n",ClassName()));
342 //-------------------------------------------------------------------
344 void AliFITv1::StepManager()
347 // Called for every step in the T0 Detector
350 static Float_t hits[6];
355 // TClonesArray &lhits = *fHits;
357 if(!TVirtualMC::GetMC()->IsTrackAlive()) return; // particle has disappeared
359 id=TVirtualMC::GetMC()->CurrentVolID(copy);
360 // Check the sensetive volume
362 if(TVirtualMC::GetMC()->IsTrackEntering()) {
363 TVirtualMC::GetMC()->CurrentVolOffID(1,copy1);
366 TVirtualMC::GetMC()->TrackPosition(pos);
370 if(pos[2]<0) vol[2] = 0;
372 // printf(" volumes pmt %i mcp %i side %i x %f y %f z %f\n", vol[0], vol[1], vol[2], hits[0], hits[1], hits[2] );
374 Float_t etot=TVirtualMC::GetMC()->Etot();
376 Int_t iPart= TVirtualMC::GetMC()->TrackPid();
377 Int_t partID=TVirtualMC::GetMC()->IdFromPDG(iPart);
379 Float_t ttime=TVirtualMC::GetMC()->TrackTime();
381 if (TVirtualMC::GetMC()->TrackPid() == 50000050) // If particles is photon then ...
383 // if(RegisterPhotoE(vol[1]-1,hits[3])) {
384 if(RegisterPhotoE(hits[3])) {
385 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol,hits);
386 // Create a track reference at the exit of photocatode
391 if ( TVirtualMC::GetMC()->TrackCharge() )
392 AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kFIT);
401 //------------------------------------------------------------------------
402 Bool_t AliFITv1::RegisterPhotoE(Double_t energy)
406 // Float_t hc=197.326960*1.e6; //mev*nm
407 Double_t hc=1.973*1.e-6; //gev*nm
408 Float_t lambda=hc/energy;
409 Float_t eff = fPMTeff->Eval(lambda);
410 Double_t p = gRandom->Rndm();
418 //----------------------------------------------------------------------------
420 void AliFITv1::SetPMTeff()
423 Float_t eff[50 ] = {0, 0, 0.23619, 0.202909, 0.177913,
424 0.175667, 0.17856, 0.190769, 0.206667, 0.230286,
425 0.252276, 0.256267,0.26, 0.27125, 0.281818,
426 0.288118, 0.294057,0.296222, 0.301622, 0.290421,
427 0.276615, 0.2666, 0.248, 0.23619, 0.227814,
428 0.219818, 0.206667,0.194087, 0.184681, 0.167917,
429 0.154367, 0.1364, 0.109412, 0.0834615,0.0725283,
430 0.0642963,0.05861, 0.0465, 0.0413333,0.032069,
431 0.0252203,0.02066, 0.016262, 0.012, 0.00590476,
432 0.003875, 0.00190, 0, 0, 0 } ;
433 for (Int_t i=0; i<50; i++) lambda[i]=200+10*i;
435 fPMTeff = new TGraph(50,lambda,eff);