-
// **************************************************************************
// * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
// * *
#include "AliHMPIDParam.h" //StepManager()
#include "AliHMPIDHit.h" //Hits2SDigs(),StepManager()
#include "AliHMPIDDigit.h" //Digits2Raw(), Raw2SDigits()
+#include "AliHMPIDRawStream.h" //Digits2Raw(), Raw2SDigits()
#include "AliRawReader.h" //Raw2SDigits()
-#include <TVirtualMC.h> //StepManager() for gMC
+#include "AliTrackReference.h"
+#include <TVirtualMC.h> //StepManager() for TVirtualMC::GetMC()
#include <TPDGCode.h> //StepHistory()
#include <AliStack.h> //StepManager(),Hits2SDigits()78.6
#include <AliLoader.h> //Hits2SDigits()
#include <AliMC.h> //StepManager()
#include <AliRun.h> //CreateMaterials()
#include <AliMagF.h> //CreateMaterials()
-#include <TGeoManager.h> //CreateGeometry()
+#include "AliGeomManager.h" //AddAlignableVolumes()
+#include <AliCDBEntry.h> //CreateMaterials()
+#include <AliCDBManager.h> //CreateMaterials()
#include <TF1.h> //DefineOpticalProperties()
#include <TF2.h> //DefineOpticalProperties()
-#include <TLorentzVector.h> //IsLostByFresnel()
-#include <AliCDBManager.h> //CreateMaterials()
-#include <AliCDBEntry.h> //CreateMaterials()
+#include <TGeoGlobalMagField.h>
#include <TGeoPhysicalNode.h> //AddAlignableVolumes()
-
+#include <TLorentzVector.h> //IsLostByFresnel()
+#include <TTree.h>
+
ClassImp(AliHMPIDv2)
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDv2::AddAlignableVolumes()const
// Associates the symbolic volume name with the corresponding volume path. Interface method from AliModule invoked from AliMC
// Arguments: none
// Returns: none
-
+
+ AliGeomManager::ELayerID idHMPID = AliGeomManager::kHMPID;
+ Int_t modUID, modnum = 0;
+
TGeoHMatrix *pGm = new TGeoHMatrix;
- Double_t trans[3]={0.5*AliHMPIDDigit::SizeAllX(),0.5*AliHMPIDDigit::SizeAllY(),0}; //clm: translation from LORS to TGeo RS
+ Double_t trans[3]={0.5*131.24,0.5*126.16,0}; //translation from LORS to TGeo RS (half size AllX, half size allY,0)
pGm->SetTranslation(trans);
- for(Int_t i=AliHMPIDDigit::kMinCh;i<=AliHMPIDDigit::kMaxCh;i++) {
- TGeoPNEntry *pPn=gGeoManager->SetAlignableEntry(Form("/HMPID/Chamber%i",i),Form("ALIC_1/Hmp_%i",i));
- if(pPn) pPn->SetMatrix(pGm);
- }
+ Double_t ph[7]={10.,10., 30.,30.,30. ,50.,50};
+
+ for(Int_t iCh=AliHMPIDParam::kMinCh;iCh<=AliHMPIDParam::kMaxCh;iCh++) {
+ modUID = AliGeomManager::LayerToVolUID(idHMPID,modnum++);
+ if(!gGeoManager->SetAlignableEntry(Form("/HMPID/Chamber%i",iCh),Form("ALIC_1/Hmp_%i",iCh),modUID))
+ AliError("AliHMPIDv3::Unable to set alignable entry!!"); //aligment without AliCluster3D
+ //Get Tracking To Local matricies for alignment with AliCluster3D
+ TGeoPNEntry *eCh = gGeoManager->GetAlignableEntryByUID(modUID);
+ TGeoHMatrix *globMatrix = eCh->GetGlobalOrig();
+
+ //Double_t phi = 20.0 * ((iCh+1) / 3) + 10.0;
+ Double_t phi = ph[iCh];
+ TGeoHMatrix *t2l = new TGeoHMatrix();
+ t2l->RotateZ(phi);
+ t2l->MultiplyLeft(&(globMatrix->Inverse()));
+ eCh->SetMatrix(t2l);
+ }//iCh loop
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDv2::CreateMaterials()
Float_t aC6F14[2]={ 12.01 , 18.99} , zC6F14[2]={ 6 , 9} , wC6F14[2]={6 , 14} , dC6F14=1.68 ; Int_t nC6F14=-2;
Float_t aSiO2[2]={ 28.09 , 15.99} , zSiO2[2]={14 , 8} , wSiO2[2]={1 , 2} , dSiO2=2.64 ; Int_t nSiO2=-2;
Float_t aCH4[2]={ 12.01 , 1.01} , zCH4[2]={ 6 , 1} , wCH4[2]={1 , 4} , dCH4=7.17e-4 ; Int_t nCH4=-2;
- Float_t aCsI[2]={132.90 ,126.90} , zCsI[2]={55 ,53} , wCsI[2]={1 , 1} , dCsI=0.1 ; Int_t nCsI=-2;
+// not necessary...PCB properties instead! Float_t aCsI[2]={132.90 ,126.90} , zCsI[2]={55 ,53} , wCsI[2]={1 , 1} , dCsI=0.1 ; Int_t nCsI=-2;
- Float_t aRoha= 12.01 , zRoha= 6 , dRoha= 0.10 , radRoha= 18.80 , absRoha= 86.3/dRoha; //special material- quasi quartz
- Float_t aCu= 63.55 , zCu= 29 , dCu= 8.96 , radCu= 1.43 , absCu= 134.9/dCu ;
- Float_t aW=183.84 , zW= 74 , dW= 19.30 , radW= 0.35 , absW= 185.0/dW ;
- Float_t aAl= 26.98 , zAl= 13 , dAl= 2.70 , radAl= 8.90 , absAl= 106.4/dAl ;
- Float_t aAr= 39.94 , zAr= 18 , dAr= 1.396e-3, radAr= 14.0 , absAr= 117.2/dAr ;
-
+ Float_t aRoha = 12.01 , zRoha = 6 , dRoha = 0.10 , radRoha = 18.80 , absRoha = 86.3/dRoha; //special material- quasi quartz
+ Float_t aCu = 63.55 , zCu = 29 , dCu = 8.96 , radCu = 1.43 , absCu = 134.9/dCu ;
+ Float_t aW =183.84 , zW = 74 , dW = 19.30 , radW = 0.35 , absW = 185.0/dW ;
+ Float_t aAl = 26.98 , zAl = 13 , dAl = 2.70 , radAl = 8.90 , absAl = 106.4/dAl ;
+ Float_t aAr = 39.94 , zAr = 18 , dAr = 1.396e-3, radAr = 14.0 , absAr = 117.2/dAr ;
+
Int_t matId=0; //tmp material id number
Int_t unsens = 0, sens=1; //sensitive or unsensitive medium
- Int_t itgfld = gAlice->Field()->Integ(); //type of field intergration 0 no field -1 user in guswim 1 Runge Kutta 2 helix 3 const field along z
- Float_t maxfld = gAlice->Field()->Max(); //max field value
+ Int_t itgfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ(); //type of field intergration 0 no field -1 user in guswim 1 Runge Kutta 2 helix 3 const field along z
+ Float_t maxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max(); //max field value
Float_t tmaxfd = -10.0; //max deflection angle due to magnetic field in one step
Float_t deemax = - 0.2; //max fractional energy loss in one step
- Float_t stemax = - 0.1; //mas step allowed [cm]
+ Float_t stemax = - 0.1; //max step allowed [cm]
Float_t epsil = 0.001; //abs tracking precision [cm]
Float_t stmin = - 0.001; //min step size [cm] in continius process transport, negative value: choose it automatically
+
+ // PCB copmposed mainly by G10 (Si,C,H,O) -> CsI is negligible (<500nm thick)
+ // So what is called CsI has the optical properties of CsI, but the composition of G-10 (for delta elec, etc production...)
+
+ Float_t aG10[4] = {28.09,12.01,1.01,16.00};
+ Float_t zG10[4] = {14., 6., 1., 8.};
+ Float_t wG10[4] = {0.129060,0.515016,0.061873,0.294050};
+ Float_t dG10 = 1.7;
+ Int_t nG10 = 4;
AliMixture(++matId,"Air" ,aAir ,zAir ,dAir ,nAir ,wAir ); AliMedium(kAir ,"Air" ,matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
AliMixture(++matId,"C6F14",aC6F14,zC6F14,dC6F14,nC6F14,wC6F14); AliMedium(kC6F14,"C6F14",matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
AliMixture(++matId,"SiO2" ,aSiO2 ,zSiO2 ,dSiO2 ,nSiO2 ,wSiO2 ); AliMedium(kSiO2 ,"SiO2" ,matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
AliMixture(++matId,"CH4" ,aCH4 ,zCH4 ,dCH4 ,nCH4 ,wCH4 ); AliMedium(kCH4 ,"CH4" ,matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
- AliMixture(++matId,"CsI" ,aCsI ,zCsI ,dCsI ,nCsI ,wCsI ); AliMedium(kCsI ,"CsI" ,matId, sens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);//sensitive
-
- AliMixture(++matId ,"Neo" ,aSiO2 ,zSiO2 ,dSiO2 ,nSiO2 ,wSiO2 ); AliMedium(kNeo,"Neo" , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin); //clm neoceram
- AliMaterial(++matId,"Roha",aRoha,zRoha,dRoha,radRoha,absRoha); AliMedium(kRoha,"Roha", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin); //Roha->honeycomb
+// AliMixture(++matId,"CsI" ,aCsI ,zCsI ,dCsI ,nCsI ,wCsI ); AliMedium(kCsI ,"CsI" ,matId, sens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);//sensitive
+ AliMixture(++matId,"CsI+PCB",aG10 , zG10, dG10,nG10 ,wG10 ); AliMedium(kCsI ,"CsI" ,matId, sens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);//sensitive
+
+ AliMixture(++matId ,"Neo" ,aSiO2 ,zSiO2 ,dSiO2 ,nSiO2 ,wSiO2 ); AliMedium(kNeo ,"Neo" ,matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin); //clm neoceram
+ AliMaterial(++matId,"Roha",aRoha,zRoha,dRoha,radRoha,absRoha); AliMedium(kRoha ,"Roha" ,matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin); //Roha->honeycomb
+
-
AliMaterial(++matId,"Cu" ,aCu ,zCu ,dCu ,radCu ,absCu ); AliMedium(kCu ,"Cu" , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
AliMaterial(++matId,"W" ,aW ,zW ,dW ,radW ,absW ); AliMedium(kW ,"W" , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
AliMaterial(++matId,"Al" ,aAl ,zAl ,dAl ,radAl ,absAl ); AliMedium(kAl ,"Al" , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
AliMaterial(++matId,"Ar" ,aAr ,zAr ,dAr ,radAr ,absAr ); AliMedium(kAr ,"Ar" , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
+
+ //InitProperties();
+
}//void AliHMPID::CreateMaterials()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//void AliHMPIDv2::InitProperties()
+//{
+/*
+* HMPID
+* ====
+*
+* GAM ELEC NHAD CHAD MUON EBREM MUHAB EDEL MUDEL MUPA ANNI BREM COMP DCAY DRAY HADR LOSS MULS PAIR PHOT RAYL
+* Quarz Window (>1000 keV delta-electrons)
+HMPID 3 1.e-4 1.e-4 1.e-4 -1. 1.e-4 -1. -1. 1.e-3 1.e-3 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+* Freon Radiator (> 500 keV delta-electrons)
+HMPID 4 1.e-4 1.e-4 1.e-4 -1. 1.e-4 -1. -1. 5.e-4 5.e-4 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+* Methane Gap (> 100 keV delta-electrons)
+HMPID 5 5.e-5 1.e-5 1.e-4 -1. 1.e-4 -1. -1. 1.e-4 1.e-4 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+* Sensitive Volume (> 50 keV delta-electrons)
+HMPID 9 1.e-5 1.e-5 1.e-4 -1. 1.e-4 -1. -1. 5.e-5 5.e-5 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+* CSI (> 50 keV delta-electrons)
+HMPID 6 1.e-5 1.e-5 1.e-4 -1. 1.e-4 -1. -1. 5.e-5 5.e-5 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+* PCB backplane (> 50 keV delta-electrons)
+HMPID 12 1.e-5 1.e-5 1.e-4 -1. 1.e-4 -1. -1. 5.e-5 5.e-5 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+
+ Int_t *idtmed = fIdtmed->GetArray();
+ Int_t imed;
+
+ imed = kSiO2; // * Quarz Window (>1000 keV delta-electrons)
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,1.e-3);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",1.e-3);
+
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
+
+ imed = kC6F14; // * Freon Radiator (> 500 keV delta-electrons)
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-4);
+
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
+
+ imed = kCH4; // * Methane Gap (> 100 keV delta-electrons)
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",1.e-4);
+
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
+
+ imed = kCsI; // * CSI (> 50 keV delta-electrons)
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
+
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
+
+ imed = kAl; // * Alluminium (> 50 keV delta-electrons)
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
+
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
+
+ imed = kCu; // * Copper (> 50 keV delta-electrons)
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
+
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
+
+ imed = kW; // * Tungsten (> 50 keV delta-electrons)
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
+
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
+
+}*/
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDv2::CreateGeometry()
{
//Creates detailed geometry simulation (currently GEANT volumes tree)
AliDebug(1,"Start main.");
- if(!gMC->IsRootGeometrySupported()) return;
+ if(!TVirtualMC::GetMC()->IsRootGeometrySupported()) return;
Double_t cm=1,mm=0.1*cm,um=0.001*mm;//default is cm
if(title.Contains("TestBeam")){
gGeoManager->GetVolume("ALIC")->AddNode(hmp,0);
}else{
- for(Int_t iCh=AliHMPIDDigit::kMinCh;iCh<=AliHMPIDDigit::kMaxCh;iCh++){//place 7 chambers
+ for(Int_t iCh=AliHMPIDParam::kMinCh;iCh<=AliHMPIDParam::kMaxCh;iCh++){//place 7 chambers
TGeoHMatrix *pMatrix=new TGeoHMatrix;
IdealPosition(iCh,pMatrix);
gGeoManager->GetVolume("ALIC")->AddNode(hmp,iCh,pMatrix);
TGeoVolume *cel= row->Divide ("Hcel",1,nPadX,0,0);//along X->80 cells
TGeoVolume *cat=gGeoManager->MakeTube("Hcat",cu , 0.00*mm , 50.00*um , cellx/2);
TGeoVolume *ano=gGeoManager->MakeTube("Hano",w , 0.00*mm , 20.00*um , cellx/2);
- TGeoVolume *pad=gGeoManager->MakeBox ("Hpad",csi , 7.54*mm/2 , 7.90*mm/2 , 1.7*mm/2); //2006P1
+ TGeoVolume *pad=gGeoManager->MakeBox ("Hpad",csi , 7.54*mm/2 , 7.90*mm/2 , 1.7*mm/2); //2006P1 PCB material...
TGeoVolume *fr1=gGeoManager->MakeBox ("Hfr1",al , 1463*mm/2 , 1422.00*mm/2 , 58.3*mm/2);//2040P1
TGeoVolume *fr1up=gGeoManager->MakeBox ("Hfr1up",ch4,(1426.00-37.00)*mm/2 , (1385.00-37.00)*mm/2 , 20.0*mm/2);//2040P1
TGeoVolume *fr1perUpBig=gGeoManager->MakeBox ("Hfr1perUpBig",ch4,1389*mm/2,35*mm/2,10*mm/2);
TGeoVolume *smo=gGeoManager->MakeBox ("Hsmo",ar , 114*mm/2 , 89.25*mm/2 , 38.3*mm/2);//2001P2
+
+ TGeoVolume *fr3= gGeoManager->MakeBox("Hfr3", al, 1463*mm/2, 1422*mm/2, 34*mm/2);//2041P1
+ TGeoVolume *fr3up= gGeoManager->MakeBox("Hfr3up", ch4, 1323*mm/2, 1282*mm/2, 20*mm/2);//2041P1
+ TGeoVolume *fr3down=gGeoManager->MakeBox("Hfr3down", ch4, 1437*mm/2, 1370*mm/2, 14*mm/2);//2041P1
+
+
+
// ^ Y z= z=-12mm z=98.25mm ALIC->7xHmp (virtual)-->1xHsbo (virtual) --->2xHcov (real) 2072P1
// | ____________________________________ | |-->1xHhon (real) 2072P1
// | | ______ ____ ______ | |
ppf->AddNode(smo,6,new TGeoTranslation(+ 65.0*mm,+ 50.625*mm, 0.*mm));
ppf->AddNode(smo,7,new TGeoTranslation(+ 65.0*mm,+151.875*mm, 0.*mm));
-
+hmp->AddNode(fr3,1,new TGeoTranslation(0.,0.,(80.-29.)*mm-34.*mm/2));
+ fr3->AddNode( fr3up,1, new TGeoTranslation(0., 0., 7*mm));
+ fr3->AddNode(fr3down,1,new TGeoTranslation(0., 0., -10*mm));
AliDebug(1,"Stop v2. HMPID option");
}//CreateGeometry()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDv2::Init()
{
-// This methode defines ID for sensitive volumes, i.e. such geometry volumes for which there are if(gMC->CurrentVolID()==XXX) statements in StepManager()
+// This method defines ID for sensitive volumes, i.e. such geometry volumes for which there are if(TVirtualMC::GetMC()->CurrentVolID()==XXX)
+// statements in StepManager()
// Arguments: none
// Returns: none
AliDebug(1,"Start v2 HMPID.");
- fIdPad = gMC->VolId("Hpad");
- fIdCell = gMC->VolId("Hcel");
+ fIdPad = TVirtualMC::GetMC()->VolId("Hpad");
+ fIdCell = TVirtualMC::GetMC()->VolId("Hcel");
AliDebug(1,"Stop v2 HMPID.");
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
const Int_t kNbins=30; //number of photon energy points
Float_t emin=5.5,emax=8.5; //Photon energy range,[eV]
Float_t aEckov [kNbins];
+ Double_t dEckov [kNbins];
Float_t aAbsRad[kNbins], aAbsWin[kNbins], aAbsGap[kNbins], aAbsMet[kNbins];
Float_t aIdxRad[kNbins], aIdxWin[kNbins], aIdxGap[kNbins], aIdxMet[kNbins], aIdxPc[kNbins];
Float_t aQeAll [kNbins], aQePc [kNbins];
+ Double_t dReflMet[kNbins], dQePc[kNbins];
- TF2 *pRaIF=new TF2("HidxRad","sqrt(1+0.554*(1239.84/x)^2/((1239.84/x)^2-5796)-0.0005*(y-20))" ,emin,emax,0,50); //DiMauro mail temp 0-50 degrees C
+ TF2 *pRaIF=new TF2("HidxRad","sqrt(1+0.554*(1239.84/x)^2/((1239.84/x)^2-5769)-0.0005*(y-20))" ,emin,emax,0,50); //DiMauro mail temp 0-50 degrees C
TF1 *pWiIF=new TF1("HidxWin","sqrt(1+46.411/(10.666*10.666-x*x)+228.71/(18.125*18.125-x*x))" ,emin,emax); //SiO2 idx TDR p.35
TF1 *pGaIF=new TF1("HidxGap","1+0.12489e-6/(2.62e-4 - x*x/1239.84/1239.84)" ,emin,emax); //?????? from where
for(Int_t i=0;i<kNbins;i++){
Float_t eV=emin+0.1*i; //Ckov energy in eV
aEckov [i] =1e-9*eV; //Ckov energy in GeV
+ dEckov [i] = aEckov[i];
aAbsRad[i]=pRaAF->Eval(eV); (isFlatIdx)? aIdxRad[i]=1.292: aIdxRad[i]=pRaIF->Eval(eV,20);
aAbsWin[i]=pWiAF->Eval(eV); aIdxWin[i]=pWiIF->Eval(eV);
aAbsGap[i]=pGaAF->Eval(eV); aIdxGap[i]=pGaIF->Eval(eV);
aQeAll[i] =1; //QE for all other materials except for PC must be 1.
aAbsMet[i] =0.0001; aIdxMet[i]=0; //metal ref idx must be 0 in order to reflect photon
aIdxPc [i]=1; aQePc [i]=pQeF->Eval(eV); //PC ref idx must be 1 in order to apply photon to QE conversion
-
+ dQePc [i]=pQeF->Eval(eV);
+ dReflMet[i] = 0.; // no reflection on the surface of the pc (?)
}
- gMC->SetCerenkov((*fIdtmed)[kC6F14] , kNbins, aEckov, aAbsRad , aQeAll , aIdxRad );
- gMC->SetCerenkov((*fIdtmed)[kSiO2] , kNbins, aEckov, aAbsWin , aQeAll , aIdxWin );
- gMC->SetCerenkov((*fIdtmed)[kCH4] , kNbins, aEckov, aAbsGap , aQeAll , aIdxGap );
- gMC->SetCerenkov((*fIdtmed)[kCu] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet );
- gMC->SetCerenkov((*fIdtmed)[kW] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet ); //n=0 means reflect photons
- gMC->SetCerenkov((*fIdtmed)[kCsI] , kNbins, aEckov, aAbsMet , aQePc , aIdxPc ); //n=1 means convert photons
- gMC->SetCerenkov((*fIdtmed)[kAl] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kC6F14] , kNbins, aEckov, aAbsRad , aQeAll , aIdxRad );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kSiO2] , kNbins, aEckov, aAbsWin , aQeAll , aIdxWin );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kCH4] , kNbins, aEckov, aAbsGap , aQeAll , aIdxGap );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kCu] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kW] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet ); //n=0 means reflect photons
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kCsI] , kNbins, aEckov, aAbsMet , aQePc , aIdxPc ); //n=1 means convert photons
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kAl] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet );
+
+ // Define a skin surface for the photocatode to enable 'detection' in G4
+ TVirtualMC::GetMC()->DefineOpSurface("surfPc", kGlisur /*kUnified*/,kDielectric_metal,kPolished, 0.);
+ TVirtualMC::GetMC()->SetMaterialProperty("surfPc", "EFFICIENCY", kNbins, dEckov, dQePc);
+ TVirtualMC::GetMC()->SetMaterialProperty("surfPc", "REFLECTIVITY", kNbins, dEckov, dReflMet);
+ TVirtualMC::GetMC()->SetSkinSurface("skinPc", "Rpc", "surfPc");
+
delete pRaAF;delete pWiAF;delete pGaAF; delete pRaIF; delete pWiIF; delete pGaIF; delete pQeF;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Calculate probability for the photon to be lost by Fresnel reflection.
TLorentzVector p4;
Double_t mom[3],localMom[3];
- gMC->TrackMomentum(p4); mom[0]=p4(1); mom[1]=p4(2); mom[2]=p4(3);
+ TVirtualMC::GetMC()->TrackMomentum(p4); mom[0]=p4(1); mom[1]=p4(2); mom[2]=p4(3);
localMom[0]=0; localMom[1]=0; localMom[2]=0;
- gMC->Gmtod(mom,localMom,2);
+ TVirtualMC::GetMC()->Gmtod(mom,localMom,2);
Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2];
Double_t localTheta = TMath::ATan2(TMath::Sqrt(localTc),localMom[1]);
Double_t cotheta = TMath::Abs(TMath::Cos(localTheta));
- if(gMC->GetRandom()->Rndm() < Fresnel(p4.E()*1e9,cotheta,1)){
+ if(TVirtualMC::GetMC()->GetRandom()->Rndm() < Fresnel(p4.E()*1e9,cotheta,1)){
AliDebug(1,"Photon lost");
return kTRUE;
}else
// Generate FeedBack photons for the current particle. To be invoked from StepManager().
// eloss=0 means photon so only pulse height distribution is to be analysed.
TLorentzVector x4;
- gMC->TrackPosition(x4);
- Int_t iNphotons=gMC->GetRandom()->Poisson(0.02*qtot); //# of feedback photons is proportional to the charge of hit
+ TVirtualMC::GetMC()->TrackPosition(x4);
+ Int_t iNphotons=TVirtualMC::GetMC()->GetRandom()->Poisson(0.02*qtot); //# of feedback photons is proportional to the charge of hit
AliDebug(1,Form("N photons=%i",iNphotons));
Int_t j;
Float_t cthf, phif, enfp = 0, sthf, e1[3], e2[3], e3[3], vmod, uswop,dir[3], phi,pol[3], mom[4];
//Generate photons
for(Int_t i=0;i<iNphotons;i++){//feedbacks loop
Double_t ranf[2];
- gMC->GetRandom()->RndmArray(2,ranf); //Sample direction
+ TVirtualMC::GetMC()->GetRandom()->RndmArray(2,ranf); //Sample direction
cthf=ranf[0]*2-1.0;
if(cthf<0) continue;
- sthf = TMath::Sqrt((1 - cthf) * (1 + cthf));
+ sthf = TMath::Sqrt((1. - cthf) * (1. + cthf));
phif = ranf[1] * 2 * TMath::Pi();
- if(Double_t randomNumber=gMC->GetRandom()->Rndm()<=0.57)
+ if(Double_t randomNumber=TVirtualMC::GetMC()->GetRandom()->Rndm()<=0.57)
enfp = 7.5e-9;
else if(randomNumber<=0.7)
enfp = 6.4e-9;
dir[0] = sthf * TMath::Sin(phif); dir[1] = cthf; dir[2] = sthf * TMath::Cos(phif);
- gMC->Gdtom(dir, mom, 2);
+ TVirtualMC::GetMC()->Gdtom(dir, mom, 2);
mom[0]*=enfp; mom[1]*=enfp; mom[2]*=enfp;
mom[3] = TMath::Sqrt(mom[0]*mom[0]+mom[1]*mom[1]+mom[2]*mom[2]);
vmod=0; for(j=0;j<3;j++) vmod+=e1[j]*e1[j]; vmod=TMath::Sqrt(1/vmod); for(j=0;j<3;j++) e1[j]*=vmod;
vmod=0; for(j=0;j<3;j++) vmod+=e2[j]*e2[j]; vmod=TMath::Sqrt(1/vmod); for(j=0;j<3;j++) e2[j]*=vmod;
- phi = gMC->GetRandom()->Rndm()* 2 * TMath::Pi();
+ phi = TVirtualMC::GetMC()->GetRandom()->Rndm()* 2 * TMath::Pi();
for(j=0;j<3;j++) pol[j]=e1[j]*TMath::Sin(phi)+e2[j]*TMath::Cos(phi);
- gMC->Gdtom(pol, pol, 2);
+ TVirtualMC::GetMC()->Gdtom(pol, pol, 2);
Int_t outputNtracksStored;
gAlice->GetMCApp()->PushTrack(1, //transport
gAlice->GetMCApp()->GetCurrentTrackNumber(),//parent track
}
treeD->GetEntry(0);
- AliHMPIDDigit::WriteRaw(DigLst());
-
+
+ AliHMPIDRawStream *pRS=0x0;
+ pRS->WriteRaw(DigLst());
+
GetLoader()->UnloadDigits();
AliDebug(1,"Stop.");
}//Digits2Raw()
//FORMULAE FROM HANDBOOK OF OPTICS, 33.23 OR
//W.R. HUNTER, J.O.S.A. 54 (1964),15 , J.O.S.A. 55(1965),1197
- Float_t sinin=TMath::Sqrt(1-pdoti*pdoti);
+ Float_t sinin=TMath::Sqrt((1.-pdoti)*(1.+pdoti));
Float_t tanin=sinin/pdoti;
Float_t c1=cn*cn-ck*ck-sinin*sinin;
// Interface methode ivoked from AliSimulation to create a list of sdigits from raw digits. Events loop is done in AliSimulation
// Arguments: pRR- raw reader
// Returns: kTRUE on success (currently ignored in AliSimulation::ConvertRaw2SDigits())
- AliHMPIDDigit sdi; //tmp sdigit, raw digit will be converted to it
+ //AliHMPIDDigit sdi; //tmp sdigit, raw digit will be converted to it
if(!GetLoader()->TreeS()) {MakeTree("S"); MakeBranch("S");}
TClonesArray *pSdiLst=SdiLst(); Int_t iSdiCnt=0; //tmp list of sdigits for all chambers
- pRR->Select("HMPID",0,13);//select all HMPID DDL files
- UInt_t w32=0;
- while(pRR->ReadNextInt(w32)){//raw records loop (in selected DDL files)
- UInt_t ddl=pRR->GetDDLID(); //returns 0,1,2 ... 13
- sdi.Raw(ddl,w32);
- new((*pSdiLst)[iSdiCnt++]) AliHMPIDDigit(sdi); //add this digit to the tmp list
- }//raw records loop
+ AliHMPIDRawStream stream(pRR);
+ while(stream.Next())
+ {
+ for(Int_t iPad=0;iPad<stream.GetNPads();iPad++) {
+ AliHMPIDDigit sdi(stream.GetPadArray()[iPad],stream.GetChargeArray()[iPad]);
+ new((*pSdiLst)[iSdiCnt++]) AliHMPIDDigit(sdi); //add this digit to the tmp list
+ }
+ }
+
GetLoader()->TreeS()->Fill(); GetLoader()->WriteSDigits("OVERWRITE");//write out sdigits
SdiReset();
return kTRUE;
// This methode is invoked from StepManager() in order to print out
static Int_t iStepN;
const char *sParticle;
- switch(gMC->TrackPid()){
+ switch(TVirtualMC::GetMC()->TrackPid()){
case kProton: sParticle="PROTON" ;break;
case kNeutron: sParticle="neutron" ;break;
case kGamma: sParticle="gamma" ;break;
}
TString flag="fanny combination";
- if(gMC->IsTrackAlive())
- if(gMC->IsTrackEntering()) flag="enters to";
- else if(gMC->IsTrackExiting()) flag="exits from";
- else if(gMC->IsTrackInside()) flag="inside";
- else
- if(gMC->IsTrackStop()) flag="stoped in";
-
-
-
+ if(TVirtualMC::GetMC()->IsTrackAlive()) {
+ if(TVirtualMC::GetMC()->IsTrackEntering()) flag="enters to";
+ else if(TVirtualMC::GetMC()->IsTrackExiting()) flag="exits from";
+ else if(TVirtualMC::GetMC()->IsTrackInside()) flag="inside";
+ } else {
+ if(TVirtualMC::GetMC()->IsTrackStop()) flag="stopped in";
+ }
Int_t vid=0,copy=0;
- TString path=gMC->CurrentVolName(); path.Prepend("-");path.Prepend(gMC->CurrentVolOffName(1));//current volume and his mother are always there
- vid=gMC->CurrentVolOffID(2,copy); if(vid) {path.Prepend("-");path.Prepend(gMC->VolName(vid));}
- vid=gMC->CurrentVolOffID(3,copy); if(vid) {path.Prepend("-");path.Prepend(gMC->VolName(vid));}
+ TString path=TVirtualMC::GetMC()->CurrentVolName(); path.Prepend("-");path.Prepend(TVirtualMC::GetMC()->CurrentVolOffName(1));//current volume and his mother are always there
+ vid=TVirtualMC::GetMC()->CurrentVolOffID(2,copy); if(vid) {path.Prepend("-");path.Prepend(TVirtualMC::GetMC()->VolName(vid));}
+ vid=TVirtualMC::GetMC()->CurrentVolOffID(3,copy); if(vid) {path.Prepend("-");path.Prepend(TVirtualMC::GetMC()->VolName(vid));}
- Printf("Step %i: %s (%i) %s %s m=%.6f GeV q=%.1f dEdX=%.4f Etot=%.4f",iStepN,sParticle,gMC->TrackPid(),flag.Data(),path.Data(),gMC->TrackMass(),gMC->TrackCharge(),gMC->Edep()*1e9,gMC->Etot());
+ Printf("Step %i: %s (%i) %s %s m=%.6f GeV q=%.1f dEdX=%.4f Etot=%.4f",iStepN,sParticle,TVirtualMC::GetMC()->TrackPid(),flag.Data(),path.Data(),TVirtualMC::GetMC()->TrackMass(),TVirtualMC::GetMC()->TrackCharge(),TVirtualMC::GetMC()->Edep()*1e9,TVirtualMC::GetMC()->Etot());
- Double_t gMcTrackPos[3]; gMC->TrackPosition(gMcTrackPos[0],gMcTrackPos[1],gMcTrackPos[2]);
- Double_t gMcTrackPosLoc[3]; gMC->Gmtod(gMcTrackPos,gMcTrackPosLoc,1);
- Printf("gMC Track Position (MARS) x: %5.3lf, y: %5.3lf, z: %5.3lf (r: %5.3lf) ---> (LOC) x: %5.3f, y: %5.3f, z: %5.3f",gMcTrackPos[0],gMcTrackPos[1],gMcTrackPos[2],TMath::Sqrt(gMcTrackPos[0]*gMcTrackPos[0]+gMcTrackPos[1]*gMcTrackPos[1]+gMcTrackPos[2]*gMcTrackPos[2]),gMcTrackPosLoc[0],gMcTrackPosLoc[1],gMcTrackPosLoc[2]);
+ Double_t gMcTrackPos[3]; TVirtualMC::GetMC()->TrackPosition(gMcTrackPos[0],gMcTrackPos[1],gMcTrackPos[2]);
+ Double_t gMcTrackPosLoc[3]; TVirtualMC::GetMC()->Gmtod(gMcTrackPos,gMcTrackPosLoc,1);
+ Printf("TVirtualMC::GetMC() Track Position (MARS) x: %5.3lf, y: %5.3lf, z: %5.3lf (r: %5.3lf) ---> (LOC) x: %5.3f, y: %5.3f, z: %5.3f",gMcTrackPos[0],gMcTrackPos[1],gMcTrackPos[2],TMath::Sqrt(gMcTrackPos[0]*gMcTrackPos[0]+gMcTrackPos[1]*gMcTrackPos[1]+gMcTrackPos[2]*gMcTrackPos[2]),gMcTrackPosLoc[0],gMcTrackPosLoc[1],gMcTrackPosLoc[2]);
Printf("Step %i: tid=%i flags alive=%i disap=%i enter=%i exit=%i inside=%i out=%i stop=%i new=%i",
iStepN, gAlice->GetMCApp()->GetCurrentTrackNumber(),
- gMC->IsTrackAlive(), gMC->IsTrackDisappeared(),gMC->IsTrackEntering(), gMC->IsTrackExiting(),
- gMC->IsTrackInside(),gMC->IsTrackOut(), gMC->IsTrackStop(), gMC->IsNewTrack());
+ TVirtualMC::GetMC()->IsTrackAlive(), TVirtualMC::GetMC()->IsTrackDisappeared(),TVirtualMC::GetMC()->IsTrackEntering(), TVirtualMC::GetMC()->IsTrackExiting(),
+ TVirtualMC::GetMC()->IsTrackInside(),TVirtualMC::GetMC()->IsTrackOut(), TVirtualMC::GetMC()->IsTrackStop(), TVirtualMC::GetMC()->IsNewTrack());
Float_t a,z,den,rad,abs; a=z=den=rad=abs=-1;
- Int_t mid=gMC->CurrentMaterial(a,z,den,rad,abs);
+ Int_t mid=TVirtualMC::GetMC()->CurrentMaterial(a,z,den,rad,abs);
Printf("Step %i: mid=%i a=%7.2f z=%7.2f den=%9.4f rad=%9.2f abs=%9.2f\n\n",iStepN,mid,a,z,den,rad,abs);
- TArrayI proc; gMC->StepProcesses(proc);
+ TArrayI proc; TVirtualMC::GetMC()->StepProcesses(proc);
Printf("Processes in this step:");
for ( int i = 0 ; i < proc.GetSize(); i++)
{
Int_t copy; //volume copy aka node
//Treat photons
- if((gMC->TrackPid()==50000050||gMC->TrackPid()==50000051)&&gMC->CurrentVolID(copy)==fIdPad){ //photon (Ckov or feedback) hit PC (fIdPad)
- if(gMC->Edep()>0){ //photon survided QE test i.e. produces electron
- if(IsLostByFresnel()){ gMC->StopTrack(); return;} //photon lost due to fersnel reflection on PC
- gMC->CurrentVolOffID(5,copy); //current chamber since geomtry tree is Hmp-Hsec-Hgap-Hrow-Hcel-Hpad
- Int_t tid= gMC->GetStack()->GetCurrentTrackNumber(); //take TID
- Int_t pid= gMC->TrackPid(); //take PID
- Float_t etot= gMC->Etot(); //total hpoton energy, [GeV]
- Double_t x[3]; gMC->TrackPosition(x[0],x[1],x[2]); //take MARS position at entrance to PC
+ if((TVirtualMC::GetMC()->TrackPid()==50000050||TVirtualMC::GetMC()->TrackPid()==50000051)&&TVirtualMC::GetMC()->CurrentVolID(copy)==fIdPad){ //photon (Ckov or feedback) hit PC (fIdPad)
+ if(TVirtualMC::GetMC()->Edep()>0){ //photon survided QE test i.e. produces electron
+ if(IsLostByFresnel()){ TVirtualMC::GetMC()->StopTrack(); return;} //photon lost due to fersnel reflection on PC
+ TVirtualMC::GetMC()->CurrentVolOffID(5,copy); //current chamber since geomtry tree is Hmp-Hsec-Hgap-Hrow-Hcel-Hpad
+ Int_t tid= TVirtualMC::GetMC()->GetStack()->GetCurrentTrackNumber(); //take TID
+ Int_t pid= TVirtualMC::GetMC()->TrackPid(); //take PID
+ Float_t etot= TVirtualMC::GetMC()->Etot(); //total hpoton energy, [GeV]
+ Double_t x[3]; TVirtualMC::GetMC()->TrackPosition(x[0],x[1],x[2]); //take MARS position at entrance to PC
+ Float_t hitTime= (Float_t)TVirtualMC::GetMC()->TrackTime(); //hit formation time
Float_t xl,yl; AliHMPIDParam::Instance()->Mars2Lors(copy,x,xl,yl); //take LORS position
- new((*fHits)[fNhits++])AliHMPIDHit(copy,etot,pid,tid,xl,yl,x); //HIT for photon, position at P, etot will be set to Q
+ new((*fHits)[fNhits++])AliHMPIDHit(copy,etot,pid,tid,xl,yl,hitTime,x); //HIT for photon, position at P, etot will be set to Q
if(fDoFeed) GenFee(etot); //generate feedback photons etot is modified in hit ctor to Q of hit
}//photon hit PC and DE >0
}//photon hit PC
//Treat charged particles
static Float_t eloss; //need to store mip parameters between different steps
- static Double_t in[3];
- if(gMC->TrackCharge() && gMC->CurrentVolID(copy)==fIdCell){ //charged particle in amplification gap (fIdCell)
- if(gMC->IsTrackEntering()||gMC->IsNewTrack()) { //entering or newly created
+ static Double_t in[3];
+ if(TVirtualMC::GetMC()->IsTrackEntering() && TVirtualMC::GetMC()->TrackCharge() && TVirtualMC::GetMC()->CurrentVolID(copy)==fIdPad) //Trackref stored when entering in the pad volume
+ AddTrackReference(TVirtualMC::GetMC()->GetStack()->GetCurrentTrackNumber(), AliTrackReference::kHMPID); //for acceptance calculations
+ if(TVirtualMC::GetMC()->TrackCharge() && TVirtualMC::GetMC()->CurrentVolID(copy)==fIdCell){ //charged particle in amplification gap (fIdCell)
+ if(TVirtualMC::GetMC()->IsTrackEntering()||TVirtualMC::GetMC()->IsNewTrack()) { //entering or newly created
eloss=0; //reset Eloss collector
- gMC->TrackPosition(in[0],in[1],in[2]); //take position at the entrance
- }else if(gMC->IsTrackExiting()||gMC->IsTrackStop()||gMC->IsTrackDisappeared()){ //exiting or disappeared
- eloss +=gMC->Edep(); //take into account last step Eloss
- gMC->CurrentVolOffID(4,copy); //take current chamber since geometry tree is Hmp-Hsec-Hgap-Hrow-Hcel
- Int_t tid= gMC->GetStack()->GetCurrentTrackNumber(); //take TID
- Int_t pid= gMC->TrackPid(); //take PID
- Double_t out[3]; gMC->TrackPosition(out[0],out[1],out[2]); //take MARS position at exit
+ TVirtualMC::GetMC()->TrackPosition(in[0],in[1],in[2]); //take position at the entrance
+ }else if(TVirtualMC::GetMC()->IsTrackExiting()||TVirtualMC::GetMC()->IsTrackStop()||TVirtualMC::GetMC()->IsTrackDisappeared()){ //exiting or disappeared
+ eloss +=TVirtualMC::GetMC()->Edep(); //take into account last step Eloss
+ TVirtualMC::GetMC()->CurrentVolOffID(4,copy); //take current chamber since geometry tree is Hmp-Hsec-Hgap-Hrow-Hcel
+ Int_t tid= TVirtualMC::GetMC()->GetStack()->GetCurrentTrackNumber(); //take TID
+ Int_t pid= TVirtualMC::GetMC()->TrackPid(); //take PID
+ Double_t out[3]; TVirtualMC::GetMC()->TrackPosition(out[0],out[1],out[2]); //take MARS position at exit
+ Float_t hitTime= (Float_t)TVirtualMC::GetMC()->TrackTime(); //hit formation time
out[0]=0.5*(out[0]+in[0]); //>
out[1]=0.5*(out[1]+in[1]); //take hit position at the anod plane
out[2]=0.5*(out[2]+in[2]); //>
Float_t xl,yl;AliHMPIDParam::Instance()->Mars2Lors(copy,out,xl,yl); //take LORS position
- new((*fHits)[fNhits++])AliHMPIDHit(copy,eloss,pid,tid,xl,yl,out); //HIT for MIP, position near anod plane, eloss will be set to Q
+ new((*fHits)[fNhits++])AliHMPIDHit(copy,eloss,pid,tid,xl,yl,hitTime,out); //HIT for MIP, position near anod plane, eloss will be set to Q
if(fDoFeed) GenFee(eloss); //generate feedback photons
}else //just going inside
- eloss += gMC->Edep(); //collect this step eloss
+ eloss += TVirtualMC::GetMC()->Edep(); //collect this step eloss
}//MIP in GAP
}//StepManager()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Test method to check geometry
//
+ //TGeoManager::Import("misaligned_geometry.root");
TGeoManager::Import("geometry.root");
- for(Int_t ch=AliHMPIDDigit::kMinCh;ch<=AliHMPIDDigit::kMaxCh;ch++)
+ for(Int_t ch=AliHMPIDParam::kMinCh;ch<=AliHMPIDParam::kMaxCh;ch++)
TestPoint(ch,0,0);
}//TestPoint()
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++