X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCv2.cxx;h=9c342510ab9fabeed06d8f5292954ca68ed19afd;hb=8acd5e6001d451de4da3c0a67c3ab89e3cee2207;hp=6832f297d2389f8c204179a16648121200f492e8;hpb=a1ec4d073607f1e7bad0e027746dad890100bcc6;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCv2.cxx b/TPC/AliTPCv2.cxx index 6832f297d23..9c342510ab9 100644 --- a/TPC/AliTPCv2.cxx +++ b/TPC/AliTPCv2.cxx @@ -35,9 +35,11 @@ #include #include #include "AliLog.h" +#include "AliTrackReference.h" #include "AliTPCParam.h" #include "AliTPCTrackHitsV2.h" #include "AliTPCv2.h" +#include "AliGeomManager.h" #include "TGeoVolume.h" #include "TGeoPcon.h" #include "TGeoTube.h" @@ -45,6 +47,8 @@ #include "TGeoTrd1.h" #include "TGeoCompositeShape.h" #include "TGeoPara.h" +#include "TGeoPhysicalNode.h" + ClassImp(AliTPCv2) //_____________________________________________________________________________ @@ -678,12 +682,12 @@ void AliTPCv2::CreateGeometry() Double_t x0,y0; x0=110.2*TMath::Cos(openingAngle); y0=110.2*TMath::Sin(openingAngle); - TGeoCombiTrans *combi1a = new TGeoCombiTrans("combi1",x0,y0,1.09+0.222,rot); //a-side - TGeoCombiTrans *combi1c = new TGeoCombiTrans("combi1",x0,y0,1.09+0.195,rot); //c-side + TGeoCombiTrans *combi1a = new TGeoCombiTrans("combi1",x0,y0,1.09+0.195,rot); //a-side + TGeoCombiTrans *combi1c = new TGeoCombiTrans("combi1",x0,y0,1.09+0.222,rot); //c-side x0=188.45*TMath::Cos(openingAngle); y0=188.45*TMath::Sin(openingAngle); - TGeoCombiTrans *combi2a = new TGeoCombiTrans("combi2",x0,y0,0.99+0.222,rot); //a-side - TGeoCombiTrans *combi2c = new TGeoCombiTrans("combi2",x0,y0,0.99+0.195,rot); //c-side + TGeoCombiTrans *combi2a = new TGeoCombiTrans("combi2",x0,y0,0.99+0.195,rot); //a-side + TGeoCombiTrans *combi2c = new TGeoCombiTrans("combi2",x0,y0,0.99+0.222,rot); //c-side // // // A-side @@ -882,6 +886,8 @@ void AliTPCv2::CreateGeometry() gGeoManager->Node("TPC_Rod",i+55,"TPC_Drift",x,y,-z,0,kTRUE,upar,3); } + delete [] upar; + TGeoVolume *alice = gGeoManager->GetVolume("ALIC"); alice->AddNode(v1,1); @@ -903,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"; @@ -912,28 +919,36 @@ void AliTPCv2::SetInnerChambersAlignable() const TString snappend="/InnerChamber"; TString volpath, symname; - for(Int_t cnt=1; cnt<=18; cnt++){ - volpath = vpstr1; - volpath += cnt; - volpath += vpappend; - symname = snstr1; - symname += cnt; - symname += snappend; - if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data())) + 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(),modUID)) AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", symname.Data(),volpath.Data())); - modnum++; - } + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig(); + TGeoHMatrix* matTtoL = fTPCParam->Tracking2LocalMatrix(globMatrix,cnt-1); + alignableEntry->SetMatrix(matTtoL); + } 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())); - modnum++; + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig(); + TGeoHMatrix* matTtoL = fTPCParam->Tracking2LocalMatrix(globMatrix,18+cnt-1); + alignableEntry->SetMatrix(matTtoL); } } @@ -941,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"; @@ -951,27 +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())); - modnum++; + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig(); + TGeoHMatrix* matTtoL = fTPCParam->Tracking2LocalMatrix(globMatrix,36+cnt-1); + alignableEntry->SetMatrix(matTtoL); } 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())); - modnum++; + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig(); + TGeoHMatrix* matTtoL = fTPCParam->Tracking2LocalMatrix(globMatrix,36+18+cnt-1); + alignableEntry->SetMatrix(matTtoL); } } @@ -1110,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())); @@ -1145,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 @@ -1194,7 +1227,7 @@ void AliTPCv2::StepManager() if(sector != fSecOld){ fSecOld=sector; // add track reference - AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber()); + AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kTPC); } // track is in the sensitive strip if(id == fIdSens){ @@ -1240,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); @@ -1270,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); + } }