#include "AliTPCRecoParam.h"
#include "AliTPCCalibVdrift.h"
#include "AliTPCTransform.h"
+#include "AliMagF.h"
+#include "TGeoGlobalMagField.h"
+#include "AliTracker.h"
#include <AliCTPTimeParams.h>
ClassImp(AliTPCTransform)
// 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];
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();
+ 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
//
//
// old ExB correction
//
- if(fCurrentRecoParam&&fCurrentRecoParam->GetUseExBCorrection()) {
+ if(fCurrentRecoParam->GetUseExBCorrection()) {
calib->GetExB()->Correct(x,xx);
//
// new composed correction - will replace soon ExB correction
//
- if(fCurrentRecoParam&&fCurrentRecoParam->GetUseComposedCorrection()&&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) {
// 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)
- xx[1]-=distortionMapY->GetCalROC(sector)->GetValue(row,pad);
+ 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)
- xx[2]-=distortionMapZ->GetCalROC(sector)->GetValue(row,pad);
+ 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];
//
//
//
+ if (!fCurrentRecoParam) return;
const Int_t kMax =60; // cache for 60 seconds
static Int_t lastStamp=-1; //cached values
static Double_t lastCorr = 1;
//
// 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&&fCurrentRecoParam->GetUseDriftCorrectionTime()>0) {
+ if(fCurrentRecoParam->GetUseDriftCorrectionTime()>0) {
vdcorrectionTime = (1+AliTPCcalibDB::Instance()->
GetVDriftCorrectionTime(fCurrentTimeStamp,
fCurrentRun,
fCurrentRecoParam->GetUseDriftCorrectionTime());
}
//
- if(fCurrentRecoParam&&fCurrentRecoParam->GetUseDriftCorrectionGY()>0) {
- Float_t xyzPad[3];
- AliTPCROC::Instance()->GetPositionGlobal(sector, TMath::Nint(x[0]) ,TMath::Nint(x[1]), xyzPad);
+ if(fCurrentRecoParam->GetUseDriftCorrectionGY()>0) {
- Double_t corrGy= (1+(xyzPad[1])*AliTPCcalibDB::Instance()->
+ Double_t corrGy= AliTPCcalibDB::Instance()->
GetVDriftCorrectionGy(fCurrentTimeStamp,
AliTPCcalibDB::Instance()->GetRun(),
sector%36>=18,
- fCurrentRecoParam->GetUseDriftCorrectionGY()));
- vdcorrectionTime *=corrGy;
+ 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]);
const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector();
Double_t sign = 1.;
Double_t zwidth = param->GetZWidth()*driftCorr;
- if (AliTPCRecoParam:: GetUseTimeCalibration()) zwidth*=vdcorrectionTime;
+ 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;