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/AliFITv2Class.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 AliFITv2::AliFITv2(): AliFIT(),
73 // Standart constructor for T0 Detector version 0
75 //--------------------------------------------------------------------
76 AliFITv2::AliFITv2(const char *name, const char *title):
83 // Standart constructor for T0 Detector version 0
88 //_____________________________________________________________________________
95 //-------------------------------------------------------------------------
96 void AliFITv2::CreateGeometry()
99 // Create the geometry of FIT Detector version 1 full geometry
104 Int_t *idtmed = fIdtmed->GetArray();
110 Float_t pstartC[3] = {6., 20 ,5};
111 Float_t pstartA[3] = {2.55, 20 ,5};
112 // Float_t pinstart[3] = {3.2,3.2,3.9};
113 Float_t pinstart[3] = {3.2,3.2,4.};
114 Float_t pmcp[3] = {3.19, 3.19, 2.8}; //MCP
115 Float_t ptop[3] = {1.324, 1.324, 1.};//cherenkov radiator
116 Float_t preg[3] = {1.324, 1.324, 0.05};//photcathode
119 Float_t pV0Amother[3] = {4.25, 41.25, 0.6};
120 Float_t pV0A[3] = {4.3, 41.2, 0.5};
122 AliMatrix(idrotm[901], 90., 0., 90., 90., 180., 0.);
124 //-------------------------------------------------------------------
126 //-------------------------------------------------------------------
129 Float_t zc[36] = {2,0, 2,0, 2,0, 2,0, 2,2, 2,2, 2,2, 2,2, 0,0,0,0};
130 Float_t za[25] = {2,0, 2,0, 2,2, 0,2, 0,2, 2,0, 2,0, 0,0, 0,0,0,0};
133 TGeoVolumeAssembly * stlinA = new TGeoVolumeAssembly("0STL"); // A side mother
134 TGeoVolumeAssembly * stlinC = new TGeoVolumeAssembly("0STR"); // C side mother
136 TVirtualMC::GetMC()->Gsvolu("0INS","BOX",idtmed[kAir],pinstart,3);
137 TGeoVolume *ins = gGeoManager->GetVolume("0INS");
139 TGeoTranslation *tr[40];
146 for (Int_t itrx=0; itrx<5; itrx++) {
147 for (Int_t itry=0; itry<5; itry++) {
148 nameTr = Form("0TR%i",itr+1);
149 z=-pstartA[2]+pinstart[2]/*+za[itr]*/;
151 if(TMath::Abs(xa)<10 && TMath::Abs(ya)<10) z= z-2;
152 tr[itr] = new TGeoTranslation(nameTr.Data(),xa,ya, z );
153 tr[itr]->RegisterYourself();
154 stlinA->AddNode(ins,itr,tr[itr]);
156 printf(" A %i %f %f %f \n",itr, xa, ya, z+zdetA);
165 for (Int_t itrx=0; itrx<6; itrx++) {
166 for (Int_t itry=0; itry<6; itry++) {
167 nameTr = Form("0TR%i",itr+1);
168 z=-pstartC[2]+pinstart[2]/*+zc[itr]*/;
169 if (itr!=39 && itr!=40 && itr!=45 &&itr!=46) {
170 if( TMath::Abs(xc)<10 && TMath::Abs(yc)<10) z= z+2;
171 tr[itr] = new TGeoTranslation(nameTr.Data(),xc,yc, z );
172 tr[itr]->RegisterYourself();
173 stlinC->AddNode(ins,itr,tr[itr]);
175 printf(" C %i %f %f %f \n",itr,xc, yc, z+zdetC);
182 TGeoVolume *alice = gGeoManager->GetVolume("ALIC");
183 alice->AddNode(stlinA,1,new TGeoTranslation(0,0, zdetA ) );
184 // alice->AddNode(stlinC,1,new TGeoTranslation(0,0, zdetC ) );
185 TGeoRotation * rotC = new TGeoRotation( "rotC",90., 0., 90., 90., 180., 0.);
186 alice->AddNode(stlinC,1, new TGeoCombiTrans(0., 0., -zdetC , rotC) );
191 // Entry window (glass)
192 TVirtualMC::GetMC()->Gsvolu("0TOP","BOX",idtmed[kOpGlass],ptop,3); //glass
193 TGeoVolume *top = gGeoManager->GetVolume("0TOP");
194 TVirtualMC::GetMC()->Gsvolu ("0REG", "BOX", idtmed[kOpGlassCathode], preg, 3);
195 TGeoVolume *cat = gGeoManager->GetVolume("0REG");
196 TVirtualMC::GetMC()->Gsvolu("0MCP","BOX",idtmed[kGlass],pmcp,3); //glass
197 TGeoVolume *mcp = gGeoManager->GetVolume("0MCP");
200 Float_t xin=0, yin=0;
201 for (Int_t ix=0; ix<2; ix++) {
202 xin = - pinstart[0] + 0.55 + (ix+0.5)*2*ptop[0] ;
203 for (Int_t iy=0; iy<2 ; iy++) {
204 z = - pinstart[2]+ptop[2];
205 yin = - pinstart[1] + 0.55 + (iy+0.5)*2*ptop[1];
207 ins->AddNode(top, ntops, new TGeoTranslation(xin,yin,z) );
208 // printf(" 0TOP full x %f y %f z %f \n", xin, yin, z);
209 z = -pinstart[2] + 2 * ptop[2] + preg[2];
210 ins->AddNode(cat, ntops, new TGeoTranslation(xin,yin,z) );
212 // printf(" GEOGEO %i %i %i %f %f %f %f %f %f \n", ntops, ix, iy,
213 // xin,yin,x1[ntops],y1[ntops],x1[ntops]+xin,y1[ntops]+yin);
217 z=-pinstart[2] + 2*ptop[2] + 2*preg[2] + pmcp[2];
218 ins->AddNode(mcp, 1 , new TGeoTranslation(0,0,z) );
221 TVirtualMC::GetMC()->Gsvolu("0V0AM","TUBE",idtmed[kAir],pV0Amother,3);
222 TVirtualMC::GetMC()->Gspos ("0V0AM",1, "ALIC", 0,0,zV0A , 0, "ONLY");
223 TVirtualMC::GetMC()->Gsvolu("0V0A","TUBE",idtmed[kSensAir],pV0A,3);
224 TVirtualMC::GetMC()->Gspos ("0V0A",1, "0V0AM", 0, 0, 0, 0, "ONLY");
229 //------------------------------------------------------------------------
230 void AliFITv2::AddAlignableVolumes() const
233 // Create entries for alignable volumes associating the symbolic volume
234 // name with the corresponding volume path. Needs to be syncronized with
235 // eventual changes in the geometry.
239 TString vpAalign = "/ALIC_1/0STL_1";
240 TString vpCalign = "/ALIC_1/0STR_1";
241 for (Int_t imod=0; imod<2; imod++) {
242 if (imod==0) {volPath = vpCalign; symName="/ALIC_1/0STL"; }
243 if (imod==1) {volPath = vpAalign; symName="/ALIC_1/0STR"; }
245 AliDebug(2,"--------------------------------------------");
246 AliDebug(2,Form("volPath=%s\n",volPath.Data()));
247 AliDebug(2,Form("symName=%s\n",symName.Data()));
248 AliDebug(2,"--------------------------------------------");
249 if(!gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data()))
250 AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",
251 symName.Data(),volPath.Data()));
254 //------------------------------------------------------------------------
255 void AliFITv2::CreateMaterials()
258 Int_t isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();
259 Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();
260 // Float_t a,z,d,radl,absl,buf[1];
264 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
265 Float_t zAir[4]={6.,7.,8.,18.};
266 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
267 Float_t dAir = 1.20479E-3;
268 Float_t dAir1 = 1.20479E-11;
269 // Radiator glass SiO2
270 Float_t aglass[2]={28.0855,15.9994};
271 Float_t zglass[2]={14.,8.};
272 Float_t wglass[2]={1.,2.};
275 Float_t dglass_mcp=1.3;
276 //*** Definition Of avaible T0 materials ***
277 AliMixture(1, "Vacuum$", aAir, zAir, dAir1,4,wAir);
278 AliMixture(2, "Air$", aAir, zAir, dAir,4,wAir);
279 AliMixture( 4, "MCP glass $",aglass,zglass,dglass_mcp,-2,wglass);
280 AliMixture( 24, "Radiator Optical glass$",aglass,zglass,dglass,-2,wglass);
282 AliMedium(1, "Air$", 2, 0, isxfld, sxmgmx, 10., .1, 1., .003, .003);
283 AliMedium(3, "Vacuum$", 1, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
284 AliMedium(6, "Glass$", 4, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
286 AliMedium(16, "OpticalGlass$", 24, 1, isxfld, sxmgmx, 10., .01, .1, .003, .003);
287 AliMedium(19, "OpticalGlassCathode$", 24, 1, isxfld, sxmgmx, 10., .01, .1, .003, .003);
288 AliMedium(22, "SensAir$", 2, 1, isxfld, sxmgmx, 10., .1, 1., .003, .003);
290 AliDebugClass(1,": ++++++++++++++Medium set++++++++++");
295 //-------------------------------------------------------------------
296 void AliFITv2::DefineOpticalProperties()
300 // Optical properties definition.
301 Int_t *idtmed = fIdtmed->GetArray();
302 // Definition Cherenkov parameters
304 const Int_t kNbins=31;
306 Float_t rindexSiO2[kNbins], efficAll[kNbins], rindexAir[kNbins], absorAir[kNbins],rindexCathodeNext[kNbins], absorbCathodeNext[kNbins];
307 Double_t efficMet[kNbins], aReflMet[kNbins];
310 Float_t aAbsSiO2[kNbins]={29.0, 28.6, 28.3, 27.7, 27.3, 26.7, 26.4,
311 25.9, 25.3, 24.9, 24.5, 23.7,
312 23.2, 22.8, 22.4, 21.8, 21.3,
313 22.8, 22.1, 21.7, 21.2, 20.5,
314 19.9, 19.3, 18.7, 18.0, 17.1,
315 16.3, 15.3, 14.3, 14.3 };
317 Float_t aPckov[kNbins] ={3.87, 3.94, 4.02, 4.11, 4.19, 4.29, 4.38,
318 4.48, 4.58, 4.69, 4.81, 4.93,
319 5.05, 5.19, 5.33, 5.48, 5.63,
320 5.8, 5.97, 6.16, 6.36, 6.57,
321 6.8, 7.04, 7.3, 7.58, 7.89,
322 8.22, 8.57, 8.97, 9.39 };
323 Double_t dPckov[kNbins] ={3.87, 3.94, 4.02, 4.11, 4.19, 4.29, 4.38,
324 4.48, 4.58, 4.69, 4.81, 4.93,
325 5.05, 5.19, 5.33, 5.48, 5.63,
326 5.8, 5.97, 6.16, 6.36, 6.57,
327 6.8, 7.04, 7.3, 7.58, 7.89,
328 8.22, 8.57, 8.97, 9.39 };
331 Float_t effCathode[kNbins]={0.11, 0.13, 0.15, 0.16, 0.18, 0.19, 0.20,
332 0.21, 0.22, 0.23, 0.24, 0.26,
333 0.27, 0.29, 0.30, 0.29, 0.29,
334 0.28, 0.28, 0.27, 0.26, 0.25,
335 0.25, 0.23, 0.20, 0.19, 0.17,
336 0.17, 0.17, 0.2, 0.23};
338 // Float_t aAbsSiO2[kNbins]; //quartz 30mm
339 for(i=0;i<kNbins;i++)
342 aPckov[i]=aPckov[i]*1e-9;//Photons energy bins 4 eV - 8.5 eV step 0.1 eV
343 dPckov[i]=dPckov[i]*1e-9;//Photons energy bins 4 eV - 8.5 eV step 0.1 eV
344 // rindexAir[i]=0.0001;
346 rindexSiO2[i]=1.458; //refractive index for qwarts
347 rindexCathodeNext[i]=0;
351 // aAbsSiO2[i]=28.5; //quartz 30mm
353 absorbCathodeNext[i]=0;
357 TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpGlass], kNbins, aPckov, aAbsSiO2, efficAll, rindexSiO2 );
358 // TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpGlassCathode], kNbins, aPckov, aAbsSiO2, effCathode, rindexSiO2 );
359 TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpGlassCathode], kNbins, aPckov, aAbsSiO2,efficAll , rindexSiO2 );
360 // TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpAir], kNbins, aPckov,absorAir , efficAll,rindexAir );
361 // TVirtualMC::GetMC()->SetCerenkov (idtmed[kOpAirNext], kNbins, aPckov,absorbCathodeNext , efficAll, rindexCathodeNext);
363 //Define a boarder for radiator optical properties
364 TVirtualMC::GetMC()->DefineOpSurface("surfRd", kUnified /*kGlisur*/,kDielectric_metal,kPolished, 0.);
365 TVirtualMC::GetMC()->SetMaterialProperty("surfRd", "EFFICIENCY", kNbins, dPckov, efficMet);
366 TVirtualMC::GetMC()->SetMaterialProperty("surfRd", "REFLECTIVITY", kNbins, dPckov, aReflMet);
371 //-------------------------------------------------------------------
372 void AliFITv2::Init()
374 // Initialises version 0 of the Forward Multiplicity Detector
377 fIdSens1=TVirtualMC::GetMC()->VolId("0REG");
378 fIdSens2=TVirtualMC::GetMC()->VolId("0V0A");
380 AliDebug(1,Form("%s: *** FIT version 1 initialized ***\n",ClassName()));
383 //-------------------------------------------------------------------
385 void AliFITv2::StepManager()
388 // Called for every step in the T0 Detector
391 static Float_t hits[6];
396 // TClonesArray &lhits = *fHits;
398 if(!TVirtualMC::GetMC()->IsTrackAlive()) return; // particle has disappeared
400 id=TVirtualMC::GetMC()->CurrentVolID(copy);
401 // Check the sensetive volume
403 if(TVirtualMC::GetMC()->IsTrackEntering()) {
404 TVirtualMC::GetMC()->CurrentVolOffID(1,copy1);
407 TVirtualMC::GetMC()->TrackPosition(pos);
411 if(pos[2]<0) vol[2] = 0;
413 // 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] );
415 Float_t etot=TVirtualMC::GetMC()->Etot();
417 Int_t iPart= TVirtualMC::GetMC()->TrackPid();
418 Int_t partID=TVirtualMC::GetMC()->IdFromPDG(iPart);
420 Float_t ttime=TVirtualMC::GetMC()->TrackTime();
422 if (TVirtualMC::GetMC()->TrackPid() == 50000050) // If particles is photon then ...
424 // if(RegisterPhotoE(vol[1]-1,hits[3])) {
425 if(RegisterPhotoE(hits[3])) {
426 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol,hits);
427 // Create a track reference at the exit of photocatode
432 if ( TVirtualMC::GetMC()->TrackCharge() )
433 AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kFIT);
439 if ( TVirtualMC::GetMC()->TrackCharge() ) {
440 if(TVirtualMC::GetMC()->IsTrackEntering()) {
441 TVirtualMC::GetMC()->TrackPosition(pos);
449 Float_t etot=TVirtualMC::GetMC()->Etot();
451 Int_t iPart= TVirtualMC::GetMC()->TrackPid();
452 Int_t partID=TVirtualMC::GetMC()->IdFromPDG(iPart);
454 Float_t ttime=TVirtualMC::GetMC()->TrackTime();
456 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol,hits);
457 // printf(" volumes pmt %i mcp %i vol %i x %f y %f z %f particle %i all \n", vol[0], vol[1], vol[2], hits[0], hits[1], hits[2], hits[4]);
465 //------------------------------------------------------------------------
466 Bool_t AliFITv2::RegisterPhotoE(Double_t energy)
470 // Float_t hc=197.326960*1.e6; //mev*nm
471 Double_t hc=1.973*1.e-6; //gev*nm
472 Float_t lambda=hc/energy;
473 Float_t eff = fPMTeff->Eval(lambda);
474 Double_t p = gRandom->Rndm();
482 //----------------------------------------------------------------------------
484 void AliFITv2::SetPMTeff()
487 Float_t eff[50 ] = {0, 0, 0.23619, 0.202909, 0.177913,
488 0.175667, 0.17856, 0.190769, 0.206667, 0.230286,
489 0.252276, 0.256267,0.26, 0.27125, 0.281818,
490 0.288118, 0.294057,0.296222, 0.301622, 0.290421,
491 0.276615, 0.2666, 0.248, 0.23619, 0.227814,
492 0.219818, 0.206667,0.194087, 0.184681, 0.167917,
493 0.154367, 0.1364, 0.109412, 0.0834615,0.0725283,
494 0.0642963,0.05861, 0.0465, 0.0413333,0.032069,
495 0.0252203,0.02066, 0.016262, 0.012, 0.00590476,
496 0.003875, 0.00190, 0, 0, 0 } ;
497 for (Int_t i=0; i<50; i++) lambda[i]=200+10*i;
499 fPMTeff = new TGraph(50,lambda,eff);