X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCv2.cxx;h=9c342510ab9fabeed06d8f5292954ca68ed19afd;hb=8acd5e6001d451de4da3c0a67c3ab89e3cee2207;hp=d2d23e491f83aacdf2e1a635593cee65a41d31d8;hpb=1bae4c82f25af0416beefd80b031952ba8fee2a9;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCv2.cxx b/TPC/AliTPCv2.cxx index d2d23e491f8..9c342510ab9 100644 --- a/TPC/AliTPCv2.cxx +++ b/TPC/AliTPCv2.cxx @@ -39,6 +39,7 @@ #include "AliTPCParam.h" #include "AliTPCTrackHitsV2.h" #include "AliTPCv2.h" +#include "AliGeomManager.h" #include "TGeoVolume.h" #include "TGeoPcon.h" #include "TGeoTube.h" @@ -908,7 +909,8 @@ void AliTPCv2::AddAlignableVolumes() const void AliTPCv2::SetInnerChambersAlignable() const { // - Int_t modnum = 0; + AliGeomManager::ELayerID idTPC1 = AliGeomManager::kTPC1; + Int_t modUID, modnum = 0; TString vpstr1 = "ALIC_1/TPC_M_1/TPC_Drift_1/TPC_ENDCAP_1/TPC_SECT_"; TString vpstr2 = "ALIC_1/TPC_M_1/TPC_Drift_1/TPC_ENDCAP_2/TPC_SECT_"; TString vpappend = "/TPC_IROC_1"; @@ -918,42 +920,35 @@ void AliTPCv2::SetInnerChambersAlignable() const TString volpath, symname; for(Int_t cnt=1; cnt<=18; cnt++){ + modUID = AliGeomManager::LayerToVolUID(idTPC1,modnum++); volpath = vpstr1; volpath += cnt; volpath += vpappend; symname = snstr1; symname += cnt; symname += snappend; - if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data())) + if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data(),modUID)) AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", symname.Data(),volpath.Data())); - // - TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(symname.Data()); - const char *path = alignableEntry->GetTitle(); - if (!gGeoManager->cd(path)) - AliFatal(Form("Volume path %s not valid!",path)); - TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix(); + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig(); TGeoHMatrix* matTtoL = fTPCParam->Tracking2LocalMatrix(globMatrix,cnt-1); alignableEntry->SetMatrix(matTtoL); - modnum++; } for(Int_t cnt=1; cnt<=18; cnt++){ + modUID = AliGeomManager::LayerToVolUID(idTPC1,modnum++); volpath = vpstr2; volpath += cnt; volpath += vpappend; symname = snstr2; symname += cnt; symname += snappend; - if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data())) + if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data(),modUID)) AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", symname.Data(),volpath.Data())); - TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(symname.Data()); - const char *path = alignableEntry->GetTitle(); - if (!gGeoManager->cd(path)) - AliFatal(Form("Volume path %s not valid!",path)); - TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix(); + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig(); TGeoHMatrix* matTtoL = fTPCParam->Tracking2LocalMatrix(globMatrix,18+cnt-1); alignableEntry->SetMatrix(matTtoL); - modnum++; } } @@ -961,7 +956,8 @@ void AliTPCv2::SetInnerChambersAlignable() const void AliTPCv2::SetOuterChambersAlignable() const { // - Int_t modnum = 0; + AliGeomManager::ELayerID idTPC2 = AliGeomManager::kTPC2; + Int_t modUID, modnum = 0; TString vpstr1 = "ALIC_1/TPC_M_1/TPC_Drift_1/TPC_ENDCAP_1/TPC_SECT_"; TString vpstr2 = "ALIC_1/TPC_M_1/TPC_Drift_1/TPC_ENDCAP_2/TPC_SECT_"; TString vpappend = "/TPC_OROC_1"; @@ -971,41 +967,35 @@ void AliTPCv2::SetOuterChambersAlignable() const TString volpath, symname; for(Int_t cnt=1; cnt<=18; cnt++){ + modUID = AliGeomManager::LayerToVolUID(idTPC2,modnum++); volpath = vpstr1; volpath += cnt; volpath += vpappend; symname = snstr1; symname += cnt; symname += snappend; - if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data())) + if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data(),modUID)) AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", symname.Data(),volpath.Data())); - TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(symname.Data()); - const char *path = alignableEntry->GetTitle(); - if (!gGeoManager->cd(path)) - AliFatal(Form("Volume path %s not valid!",path)); - TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix(); + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig(); TGeoHMatrix* matTtoL = fTPCParam->Tracking2LocalMatrix(globMatrix,36+cnt-1); alignableEntry->SetMatrix(matTtoL); - modnum++; } for(Int_t cnt=1; cnt<=18; cnt++){ + modUID = AliGeomManager::LayerToVolUID(idTPC2,modnum++); volpath = vpstr2; volpath += cnt; volpath += vpappend; symname = snstr2; symname += cnt; symname += snappend; - if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data())) + if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data(),modUID)) AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", symname.Data(),volpath.Data())); - TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(symname.Data()); - const char *path = alignableEntry->GetTitle(); - if (!gGeoManager->cd(path)) - AliFatal(Form("Volume path %s not valid!",path)); - TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix(); + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig(); TGeoHMatrix* matTtoL = fTPCParam->Tracking2LocalMatrix(globMatrix,36+18+cnt-1); alignableEntry->SetMatrix(matTtoL); - modnum++; } } @@ -1144,9 +1134,18 @@ void AliTPCv2::Init() fIDrift=gMC->VolId("TPC_Drift"); fSecOld=-100; // fake number - gMC->SetMaxNStep(30000); // max. number of steps increased + gMC->SetMaxNStep(-30000); // max. number of steps increased + + if (fPrimaryIonisation) { + gMC->Gstpar(idtmed[2],"PRIMIO_E", 20.77); // 1st ionisation potential + + gMC->Gstpar(idtmed[2],"PRIMIO_N", 14.35); + gMC->Gstpar(idtmed[2],"LOSS", 14); // specific energy loss + gMC->Gstpar(idtmed[2],"STRA",4); + } else { + gMC->Gstpar(idtmed[2],"LOSS", 5); // specific energy loss + } - gMC->Gstpar(idtmed[2],"LOSS",5); // specific energy loss AliInfo("*** TPC version 2 initialized ***"); AliInfo(Form("Maximum number of steps = %d",gMC->GetMaxNStep())); @@ -1179,7 +1178,7 @@ void AliTPCv2::StepManager() vol[1]=0; // preset row number to 0 // - gMC->SetMaxStep(kbig); + if (fPrimaryIonisation) gMC->SetMaxStep(kbig); if(!gMC->IsTrackAlive()) return; // particle has disappeared @@ -1274,8 +1273,14 @@ void AliTPCv2::StepManager() // charged particle is in the sensitive drift volume //----------------------------------------------------------------- if(gMC->TrackStep() > 0) { - - Int_t nel = (Int_t)(((gMC->Edep())-kpoti)/kwIon) + 1; + Int_t nel=0; + if (!fPrimaryIonisation) { + nel = (Int_t)(((gMC->Edep())-kpoti)/kwIon) + 1; + } + else { + Float_t edep = gMC->Edep(); + if (edep > 0.) nel = (Int_t)((gMC->Edep()*1.5)/kwIon) + 1; + } nel=TMath::Min(nel,300); // 300 electrons corresponds to 10 keV // gMC->TrackPosition(p); @@ -1304,28 +1309,29 @@ void AliTPCv2::StepManager() Float_t pp; TLorentzVector mom; - gMC->TrackMomentum(mom); - Float_t ptot=mom.Rho(); - Float_t betaGamma = ptot/gMC->TrackMass(); - - Int_t pid=gMC->TrackPid(); - if((pid==kElectron || pid==kPositron) && ptot > 0.002) - { - pp = kprim*1.58; // electrons above 20 MeV/c are on the plateau! - } - else - { + // below is valid only for Geant3 (fPromaryIonisation not set) + if(!fPrimaryIonisation){ + gMC->TrackMomentum(mom); + Float_t ptot=mom.Rho(); + Float_t betaGamma = ptot/gMC->TrackMass(); + + Int_t pid=gMC->TrackPid(); + if((pid==kElectron || pid==kPositron) && ptot > 0.002) + { + pp = kprim*1.58; // electrons above 20 MeV/c are on the plateau! + } + else + { - betaGamma = TMath::Max(betaGamma,(Float_t)7.e-3); // protection against too small bg - pp=kprim*BetheBloch(betaGamma); + betaGamma = TMath::Max(betaGamma,(Float_t)7.e-3); // protection against too small bg + pp=kprim*BetheBloch(betaGamma); - if(TMath::Abs(charge) > 1.) pp *= (charge*charge); } - Double_t rnd = gMC->GetRandom()->Rndm(); - - gMC->SetMaxStep(-TMath::Log(rnd)/pp); + Double_t rnd = gMC->GetRandom()->Rndm(); + gMC->SetMaxStep(-TMath::Log(rnd)/pp); + } }