#include "AliTPCcalibDB.h"
#include "AliTPCTransform.h"
+#include "AliTPCRecoParam.h"
#include "AliTPCclusterMI.h"
#include "AliTPCseed.h"
#include "AliTPCPointCorrection.h"
ClassImp(AliTPCcalibCalib)
AliTPCcalibCalib::AliTPCcalibCalib():
- AliTPCcalibBase()
+AliTPCcalibBase(),
+ fApplyExBCorrection(1), // apply ExB correction
+ fApplyTOFCorrection(1), // apply TOF correction
+ fApplyPositionCorrection(1), // apply position correction
+ fApplySectorAlignment(1), // apply sector alignment
+ fApplyRPhiCorrection(1), // apply R-Phi correction
+ fApplyRCorrection(1) // apply Radial correction
+
{
//
// Constructor
AliTPCcalibCalib::AliTPCcalibCalib(const Text_t *name, const Text_t *title)
- :AliTPCcalibBase()
+ :AliTPCcalibBase(),
+ fApplyExBCorrection(1), // apply ExB correction
+ fApplyTOFCorrection(1), // apply TOF correction
+ fApplyPositionCorrection(1), // apply position correction
+ fApplySectorAlignment(1), // apply sector alignment
+ fApplyRPhiCorrection(1), // apply R-Phi correction
+ fApplyRCorrection(1) // apply Radial correction
{
SetName(name);
SetTitle(title);
AliTPCcalibCalib::AliTPCcalibCalib(const AliTPCcalibCalib&calib):
- AliTPCcalibBase(calib)
+ AliTPCcalibBase(calib),
+ fApplyExBCorrection(calib.GetApplyExBCorrection()),
+ fApplyTOFCorrection(calib.GetApplyTOFCorrection()),
+ fApplyPositionCorrection(calib.GetApplyPositionCorrection()),
+ fApplySectorAlignment(calib.GetApplySectorAlignment()),
+ fApplyRPhiCorrection(calib.GetApplyRPhiCorrection()),
+ fApplyRCorrection(calib.GetApplyRCorrection())
+
{
//
// copy constructor
if ((seed=dynamic_cast<AliTPCseed*>(calibObject))) break;
}
if (!seed) continue;
- RefitTrack(track, seed);
+ RefitTrack(track, seed,event->GetMagneticField());
}
return;
}
-Bool_t AliTPCcalibCalib::RefitTrack(AliESDtrack * track, AliTPCseed *seed){
+Bool_t AliTPCcalibCalib::RefitTrack(AliESDtrack * track, AliTPCseed *seed, Float_t magesd){
//
// Refit track
- //
+ // if magesd==0 forget the curvature
//
// 0 - Setup transform object
AliTPCTransform *transform = AliTPCcalibDB::Instance()->GetTransform() ;
transform->SetCurrentRun(fRun);
transform->SetCurrentTimeStamp((UInt_t)fTime);
+ if(!fApplyExBCorrection) { // disable ExB correction in transform
+ if(transform->GetCurrentRecoParam())
+ transform->GetCurrentRecoParamNonConst()->SetUseExBCorrection(0);
+ }
+ if(!fApplyTOFCorrection) { // disable TOF correction in transform
+ if(transform->GetCurrentRecoParam())
+ transform->GetCurrentRecoParamNonConst()->SetUseTOFCorrection(kFALSE);
+ }
+
//
// First apply calibration
//
AliTPCclusterMI cl0(*cluster);
Double_t x[3]={cluster->GetRow(),cluster->GetPad(),cluster->GetTimeBin()};
Int_t i[1]={cluster->GetDetector()};
+
transform->Transform(x,i,0,1);
//
// get position correction
if (cluster->GetDetector()>35) ipad=1;
Float_t dy =AliTPCClusterParam::SPosCorrection(0,ipad,cluster->GetPad(),cluster->GetTimeBin(),cluster->GetZ(),cluster->GetSigmaY2(),cluster->GetSigmaZ2(),cluster->GetMax());
Float_t dz =AliTPCClusterParam::SPosCorrection(1,ipad,cluster->GetPad(),cluster->GetTimeBin(),cluster->GetZ(),cluster->GetSigmaY2(),cluster->GetSigmaZ2(),cluster->GetMax());
+ // if(fApplyPositionCorrection) {
//x[1]-=dy;
//x[2]-=dz;
+ // }
//
// Apply sector alignment
//
cluster->GetY(),cluster->GetZ());
Double_t dzq = AliTPCPointCorrection::SGetCorrectionSector(2,cluster->GetDetector()%36,cluster->GetX(),
cluster->GetY(),cluster->GetZ());
- if (kTRUE){
+ if (fApplySectorAlignment){
x[0]-=dxq;
x[1]-=dyq;
x[2]-=dzq;
// R correction
Double_t corrR = corr->CorrectionOutR0(kFALSE,kFALSE,cluster->GetX(),cluster->GetY(),cluster->GetZ(),cluster->GetDetector());
- if (kTRUE){
+ if (fApplyRPhiCorrection){
if (cluster->GetY()>0) x[1]+=corrclY; // rphi correction
if (cluster->GetY()<0) x[1]-=corrclY; // rphi correction
+ }
+ if (fApplyRCorrection){
x[0]+=corrR; // radial correction
}
covar[2]=10.*10.;
covar[5]=10.*10./(64.*64.);
covar[9]=10.*10./(64.*64.);
- covar[14]=1*1;
-
+ covar[14]=0.3*0.3;
+ if (TMath::Abs(magesd)<0.05) {
+ covar[14]=0.025*0.025;
+ }
//
// And now do refit
//
AliExternalTrackParam * trackOutOld = (AliExternalTrackParam*)track->GetOuterParam();
AliExternalTrackParam trackIn = *trackOutOld;
- trackIn.ResetCovariance(200.);
+ if (TMath::Abs(magesd)<0.05) {
+ ((Double_t&)(trackIn.GetParameter()[4]))=0.000000001;
+ }
+ trackIn.ResetCovariance(20.);
trackIn.AddCovariance(covar);
Double_t xyz[3];
Int_t nclIn=0,nclOut=0;
if (cl->GetX()<80) continue;
Int_t sector = cl->GetDetector();
Float_t dalpha = TMath::DegToRad()*(sector%18*20.+10.)-trackIn.GetAlpha();
- if (TMath::Abs(dalpha)>0.01)
- trackIn.Rotate(TMath::DegToRad()*(sector%18*20.+10.));
+ if (TMath::Abs(dalpha)>0.01){
+ if (!trackIn.Rotate(TMath::DegToRad()*(sector%18*20.+10.))) break;
+ }
Double_t r[3]={cl->GetX(),cl->GetY(),cl->GetZ()};
Double_t cov[3]={0.01,0.,0.01}; //TODO: correct error parametrisation
AliTPCseed::GetError(cl, &trackIn,cov[0],cov[2]);
}
//
AliExternalTrackParam trackOut = trackIn;
- trackOut.ResetCovariance(200.);
+ if (TMath::Abs(magesd)<0.05) {
+ ((Double_t&)(trackOut.GetParameter()[4]))=0.000000001;
+ }
+ trackOut.ResetCovariance(20.);
trackOut.AddCovariance(covar);
//
// Refit out
Int_t sector = cl->GetDetector();
Float_t dalpha = TMath::DegToRad()*(sector%18*20.+10.)-trackOut.GetAlpha();
- if (TMath::Abs(dalpha)>0.01)
- trackOut.Rotate(TMath::DegToRad()*(sector%18*20.+10.));
+ if (TMath::Abs(dalpha)>0.01){
+ if (!trackOut.Rotate(TMath::DegToRad()*(sector%18*20.+10.))) break;
+ }
Double_t r[3]={cl->GetX(),cl->GetY(),cl->GetZ()};
Double_t cov[3]={0.01,0.,0.01}; //TODO: correct error parametrisation
if (cl->GetX()<80) continue;
Int_t sector = cl->GetDetector();
Float_t dalpha = TMath::DegToRad()*(sector%18*20.+10.)-trackIn.GetAlpha();
- if (TMath::Abs(dalpha)>0.01)
- trackIn.Rotate(TMath::DegToRad()*(sector%18*20.+10.));
+ if (TMath::Abs(dalpha)>0.01){
+ if (!trackIn.Rotate(TMath::DegToRad()*(sector%18*20.+10.))) break;
+ }
Double_t r[3]={cl->GetX(),cl->GetY(),cl->GetZ()};
Double_t cov[3]={0.01,0.,0.01}; //TODO: correct error parametrisation
AliTPCseed::GetError(cl, &trackIn,cov[0],cov[2]);
Double_t cov[3]={0.01,0.,0.01}; //TODO: correct error parametrisation
AliTPCseed::GetError(cl, param,cov[0],cov[2]);
+ if (param->GetSigmaY2()<0 || param->GetSigmaZ2()<0){
+ AliError("Wrong parameters");
+ return kFALSE;
+ }
Double_t py = (cl->GetY()-param->GetY())/TMath::Sqrt(cov[0]*cov[0]+param->GetSigmaY2());
Double_t pz = (cl->GetZ()-param->GetZ())/TMath::Sqrt(cov[2]*cov[2]+param->GetSigmaZ2());
//