X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCTransform.cxx;h=69618adf81eedda5774e8d63bc1deea711ec273d;hb=1fc8d3c0b7ed03fa096cea25940e7383e08bd469;hp=702735485f77a83a9ebd22f769114463a2f8ae3f;hpb=3ce45991bc3183cf4c96489c483e0899868a0f7c;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCTransform.cxx b/TPC/AliTPCTransform.cxx index 702735485f7..69618adf81e 100755 --- a/TPC/AliTPCTransform.cxx +++ b/TPC/AliTPCTransform.cxx @@ -59,10 +59,15 @@ #include "TMath.h" #include "AliLog.h" #include "AliTPCExB.h" +#include "AliTPCCorrection.h" #include "TGeoMatrix.h" #include "AliTPCRecoParam.h" #include "AliTPCCalibVdrift.h" #include "AliTPCTransform.h" +#include "AliMagF.h" +#include "TGeoGlobalMagField.h" +#include "AliTracker.h" +#include ClassImp(AliTPCTransform) @@ -135,27 +140,36 @@ void AliTPCTransform::Transform(Double_t *x,Int_t *i,UInt_t /*time*/, // TOF of particle calculated assuming the speed-of-light and // line approximation // - - + if (!fCurrentRecoParam) { + return; + } Int_t row=TMath::Nint(x[0]); Int_t pad=TMath::Nint(x[1]); Int_t sector=i[0]; AliTPCcalibDB* calib=AliTPCcalibDB::Instance(); // AliTPCCalPad * time0TPC = calib->GetPadTime0(); + AliTPCCalPad * distortionMapY = calib->GetDistortionMap(0); + AliTPCCalPad * distortionMapZ = calib->GetDistortionMap(1); + AliTPCCalPad * distortionMapR = calib->GetDistortionMap(2); AliTPCParam * param = calib->GetParameters(); + AliTPCCorrection * correction = calib->GetTPCComposedCorrection(); // first user defined correction // if does not exist try to get it from calibDB array + if (!correction) correction = calib->GetTPCComposedCorrection(AliTracker::GetBz()); if (!time0TPC){ AliFatal("Time unisochronity missing"); + return ; // make coverity happy } + AliTPCCorrection * correctionDelta = calib->GetTPCComposedCorrectionDelta(); if (!param){ AliFatal("Parameters missing"); + return; // make coverity happy } Double_t xx[3]; // Apply Time0 correction - Pad by pad fluctuation - // - x[2]-=time0TPC->GetCalROC(sector)->GetValue(row,pad); + // + if (!calib->HasAlignmentOCDB()) x[2]-=time0TPC->GetCalROC(sector)->GetValue(row,pad); // // Tranform from pad - time coordinate system to the rotated global (tracking) system // @@ -166,11 +180,11 @@ void AliTPCTransform::Transform(Double_t *x,Int_t *i,UInt_t /*time*/, // Alignment //TODO: calib->GetParameters()->GetClusterMatrix(sector)->LocalToMaster(x,xx); RotatedGlobal2Global(sector,x); + // + // old ExB correction // - // ExB correction - // - if(fCurrentRecoParam&&fCurrentRecoParam->GetUseExBCorrection()) { + if(fCurrentRecoParam->GetUseExBCorrection()) { calib->GetExB()->Correct(x,xx); @@ -181,10 +195,29 @@ void AliTPCTransform::Transform(Double_t *x,Int_t *i,UInt_t /*time*/, xx[2] = x[2]; } + // + // new composed correction - will replace soon ExB correction + // + if(fCurrentRecoParam->GetUseComposedCorrection()&&correction) { + Float_t distPoint[3]={xx[0],xx[1],xx[2]}; + correction->CorrectPoint(distPoint, sector); + xx[0]=distPoint[0]; + xx[1]=distPoint[1]; + xx[2]=distPoint[2]; + if (correctionDelta&&fCurrentRecoParam->GetUseAlignmentTime()){ // appply time dependent correction if available and enabled + Float_t distPointDelta[3]={xx[0],xx[1],xx[2]}; + correctionDelta->CorrectPoint(distPointDelta, sector); + xx[0]=distPointDelta[0]; + xx[1]=distPointDelta[1]; + xx[2]=distPointDelta[2]; + } + } + + // // Time of flight correction // - if (fCurrentRecoParam&&fCurrentRecoParam->GetUseTOFCorrection()){ + if (fCurrentRecoParam->GetUseTOFCorrection()){ const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector(); Float_t sign=1; if (sector < kNIS) { @@ -209,6 +242,40 @@ void AliTPCTransform::Transform(Double_t *x,Int_t *i,UInt_t /*time*/, // Global2RotatedGlobal(sector,xx); + + // + // Apply non linear distortion correction + // + if (distortionMapY ){ + // wt - to get it form the OCDB + // ignore T1 and T2 + AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField(); + Double_t bzField = magF->SolenoidField()/10.; //field in T + Double_t vdrift = param->GetDriftV()/1000000.; // [cm/us] // From dataBase: to be updated: per second (ideally) + Double_t ezField = 400; // [V/cm] // to be updated: never (hopefully) + if (sector%36<18) ezField*=-1; + Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ; + Double_t c0=1./(1.+wt*wt); + Double_t c1=wt/c0; + + //can be switch on for each dimension separatelly + if (fCurrentRecoParam->GetUseFieldCorrection()&0x2) + if (distortionMapY){ + xx[1]-= c0*distortionMapY->GetCalROC(sector)->GetValue(row,pad); + xx[0]-= c1*distortionMapY->GetCalROC(sector)->GetValue(row,pad); + } + if (fCurrentRecoParam->GetUseFieldCorrection()&0x4) + if (distortionMapZ) + xx[2]-=distortionMapZ->GetCalROC(sector)->GetValue(row,pad); + if (fCurrentRecoParam->GetUseFieldCorrection()&0x8) + if (distortionMapR){ + xx[0]-= c0*distortionMapR->GetCalROC(sector)->GetValue(row,pad); + xx[1]-=-c1*distortionMapR->GetCalROC(sector)->GetValue(row,pad)*wt; + } + + } + // + // x[0]=xx[0];x[1]=xx[1];x[2]=xx[2]; } @@ -225,6 +292,7 @@ void AliTPCTransform::Local2RotatedGlobal(Int_t sector, Double_t *x) const { // // // + if (!fCurrentRecoParam) return; const Int_t kMax =60; // cache for 60 seconds static Int_t lastStamp=-1; //cached values static Double_t lastCorr = 1; @@ -246,11 +314,43 @@ void AliTPCTransform::Local2RotatedGlobal(Int_t sector, Double_t *x) const { } } - + // + // simple caching non thread save + static Double_t vdcorrectionTime=1; + static Double_t vdcorrectionTimeGY=0; + static Double_t time0corrTime=0; + static Int_t lastStampT=-1; + // + if (lastStampT!=(Int_t)fCurrentTimeStamp){ + lastStampT=fCurrentTimeStamp; + if(fCurrentRecoParam->GetUseDriftCorrectionTime()>0) { + vdcorrectionTime = (1+AliTPCcalibDB::Instance()-> + GetVDriftCorrectionTime(fCurrentTimeStamp, + fCurrentRun, + sector%36>=18, + fCurrentRecoParam->GetUseDriftCorrectionTime())); + time0corrTime= AliTPCcalibDB::Instance()-> + GetTime0CorrectionTime(fCurrentTimeStamp, + fCurrentRun, + sector%36>=18, + fCurrentRecoParam->GetUseDriftCorrectionTime()); + } + // + if(fCurrentRecoParam->GetUseDriftCorrectionGY()>0) { + + Double_t corrGy= AliTPCcalibDB::Instance()-> + GetVDriftCorrectionGy(fCurrentTimeStamp, + AliTPCcalibDB::Instance()->GetRun(), + sector%36>=18, + fCurrentRecoParam->GetUseDriftCorrectionGY()); + vdcorrectionTimeGY = corrGy; + } + } if (!param){ AliFatal("Parameters missing"); + return; // make coverity happy } Int_t row=TMath::Nint(x[0]); // Int_t pad=TMath::Nint(x[1]); @@ -258,6 +358,9 @@ void AliTPCTransform::Local2RotatedGlobal(Int_t sector, Double_t *x) const { const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector(); Double_t sign = 1.; Double_t zwidth = param->GetZWidth()*driftCorr; + Float_t xyzPad[3]; + AliTPCROC::Instance()->GetPositionGlobal(sector, TMath::Nint(x[0]) ,TMath::Nint(x[1]), xyzPad); + if (AliTPCRecoParam:: GetUseTimeCalibration()) zwidth*=vdcorrectionTime*(1+xyzPad[1]*vdcorrectionTimeGY); Double_t padWidth = 0; Double_t padLength = 0; Double_t maxPad = 0; @@ -290,8 +393,18 @@ void AliTPCTransform::Local2RotatedGlobal(Int_t sector, Double_t *x) const { // // Z coordinate // + if (AliTPCcalibDB::Instance()->IsTrgL0()){ + // by defualt we assume L1 trigger is used - make a correction in case of L0 + AliCTPTimeParams* ctp = AliTPCcalibDB::Instance()->GetCTPTimeParams(); + if (ctp){ + //for TPC standalone runs no ctp info + Double_t delay = ctp->GetDelayL1L0()*0.000000025; + x[2]-=delay/param->GetTSample(); + } + } + x[2]-= param->GetNTBinsL1(); x[2]*= zwidth; // tranform time bin to the distance to the ROC - x[2]-= 3.*param->GetZSigma() + param->GetNTBinsL1()*zwidth; + x[2]-= 3.*param->GetZSigma() + time0corrTime; // subtract the time offsets x[2] = sign*( param->GetZLength(sector) - x[2]); } @@ -325,3 +438,12 @@ void AliTPCTransform::GetCosAndSin(Int_t sector,Double_t &cos, } +void AliTPCTransform::ApplyTransformations(Double_t */*xyz*/, Int_t /*volID*/){ + // + // Modify global position + // xyz - global xyz position + // volID - volID of detector (sector number) + // + // + +}