RegisterFormula("TPCscalingRIFC",(GenFuncG)(AliTPCTransformation::TPCscalingRIFC));
RegisterFormula("TPCscalingROFC",(GenFuncG)(AliTPCTransformation::TPCscalingROFC));
//
+ RegisterFormula("TPCdeltaFCROC",(GenFuncG)(AliTPCTransformation::TPCdeltaFCROC));
+ RegisterFormula("TPCdeltaFCCE",(GenFuncG)(AliTPCTransformation::TPCdeltaFCCE));
+ //
RegisterFormula("TPCscalingZDr",(GenFuncG)(AliTPCTransformation::TPCscalingZDrift));
RegisterFormula("TPCscalingZDrGy",(GenFuncG)(AliTPCTransformation::TPCscalingZDriftGy));
RegisterFormula("TPCscalingZDriftT0",(GenFuncG)(AliTPCTransformation::TPCscalingZDriftT0));
fCoordSystem(0), // coord system of output deltas
fParam(0), // free parameter of transformation
fSigma(0), // uncertainty of the parameter
+ fSigmaMax(0), //maximal sigma (Not allowed to increase in propagate time by bigger factor)
fSigma2Time(0), // change of the error in time - (For kalman filter)
fFixedParam(0), // fixed parameters of tranformation
fIsActive(kTRUE), // swith - On/Off
fCoordSystem(coordSystem), // coordinate system of output deltas
fParam(0), // free parameter of transformation
fSigma(0),
+ fSigmaMax(0), //maximal sigma (Not allowed to increase in propagate time by bigger factor)
fSigma2Time(0), // change of sigma in time
fFixedParam(0), // fixed parameters of tranformation
fIsActive(kTRUE), // swith - On/Off
fCoordSystem(0), // coord system of output deltas
fParam(trafo.fParam), // free parameter of transformation
fSigma(trafo.fSigma), // uncertainty of the parameter
+ fSigmaMax(trafo.fSigma), //maximal sigma (Not allowed to increase in propagate time by bigger factor)
fSigma2Time(trafo.fSigma2Time), // change of the error in time - (For kalman filter)
fFixedParam(0), // fixed parameters of tranformation
fIsActive(trafo.fIsActive), // swith - On/Off
fFormulaY(0), // y formula - pointer to the function
fFormulaZ(0) // z formula - pointer to the function
{
+ //
+ // comment are above
+ //
if (trafo.fNameX) fNameX = new TString(*(trafo.fNameX));
if (trafo.fNameY) fNameY = new TString(*(trafo.fNameY));
if (trafo.fNameZ) fNameZ = new TString(*(trafo.fNameZ));
delete fBitMask;
delete fFixedParam;
}
-void AliTPCTransformation::SetParams(Double_t param, Double_t sigma, Double_t sigma2Time, TVectorD* fixedParams){
+void AliTPCTransformation::SetParams(Double_t param, Double_t sigma, Double_t sigma2Time, const TVectorD *const fixedParams){
//
// Set parameters of transformation
//
fParam = param;
fSigma = sigma;
+ fSigmaMax = sigma;
fSigma2Time = sigma2Time;
if (fFixedParam) delete fFixedParam;
fFixedParam = new TVectorD(*fixedParams);
TBits * AliTPCTransformation::BitsSide(Bool_t aside){
+ //
+ // Set bits for given side
//
TBits * bits = new TBits(72);
for (Int_t i=0; i<72;i++){
TBits * AliTPCTransformation::BitsAll(){
//
- //
+ // Set all bits to kTRUE
//
TBits * bits = new TBits(72);
for (Int_t i=0; i<72;i++){
return bits;
}
+// Double_t AliTPCTransformation::GetDeltaXYZ(Int_t coord, Int_t volID, Double_t param, Double_t x, Double_t y, Double_t z){
+// //
+// //
+// // coord - type of coordinate
+// // - 0 -X
+// // 1 -Y
+// // 2 -Z
+// // 3 -R
+// // 4 -RPhi
+// if (!fIsActive) return 0;
+// if (fBitMask && (!(*fBitMask)[volID])) return 0;
+// Double_t xyz[5]={x,y,z, param,volID};
+// if (fCoordSystem==0){
+// // cartezian system
+// if (coord==0 && fFormulaX) return fFormulaX(xyz,fFixedParam->GetMatrixArray());
+// if (coord==1 && fFormulaY) return fFormulaY(xyz,fFixedParam->GetMatrixArray());
+// if (coord==2 && fFormulaZ) return fFormulaZ(xyz,fFixedParam->GetMatrixArray());
+// }
+// if (fCoordSystem==1){
+// // cylindrical system
+// if (coord==2) {
+// if (fFormulaZ==0) return 0;
+// return fFormulaZ(xyz,fFixedParam->GetMatrixArray());
+// }
+// Double_t rrphiz[3]={0,0,0};
+// if (fFormulaX) rrphiz[0] = fFormulaX(xyz,fFixedParam->GetMatrixArray());
+// if (fFormulaY) rrphiz[1] = fFormulaY(xyz,fFixedParam->GetMatrixArray());
+// Double_t alpha = TMath::ATan2(y,x);
+// Double_t ca = TMath::Cos(alpha);
+// Double_t sa = TMath::Sin(alpha);
+// if (coord==0) return ca*rrphiz[0]-sa*rrphiz[1];
+// if (coord==1) return sa*rrphiz[0]+ca*rrphiz[1];
+// }
+// return 0;
+// }
+
+
Double_t AliTPCTransformation::GetDeltaXYZ(Int_t coord, Int_t volID, Double_t param, Double_t x, Double_t y, Double_t z){
//
//
// 2 -Z
// 3 -R
// 4 -RPhi
+ // 5 -Z
if (!fIsActive) return 0;
if (fBitMask && (!(*fBitMask)[volID])) return 0;
Double_t xyz[5]={x,y,z, param,volID};
+ Double_t alpha = TMath::ATan2(y,x);
+ Double_t ca = TMath::Cos(alpha);
+ Double_t sa = TMath::Sin(alpha);
+
if (fCoordSystem==0){
// cartezian system
- if (coord==0 && fFormulaX) return fFormulaX(xyz,fFixedParam->GetMatrixArray());
- if (coord==1 && fFormulaY) return fFormulaY(xyz,fFixedParam->GetMatrixArray());
- if (coord==2 && fFormulaZ) return fFormulaZ(xyz,fFixedParam->GetMatrixArray());
+ Double_t dxdydz[3]={0,0,0};
+ if(fFormulaX) dxdydz[0]=fFormulaX(xyz,fFixedParam->GetMatrixArray());
+ if(fFormulaY) dxdydz[1]=fFormulaY(xyz,fFixedParam->GetMatrixArray());
+ if(fFormulaZ) dxdydz[2]=fFormulaZ(xyz,fFixedParam->GetMatrixArray());
+
+ if (coord==0) return dxdydz[0];
+ if (coord==1) return dxdydz[1];
+ if (coord==2) return dxdydz[2];
+ if (coord==3) return dxdydz[0]*ca+dxdydz[1]*sa;
+ if (coord==4) return -dxdydz[0]*sa+dxdydz[1]*ca;
+ if (coord==5) return dxdydz[2];
}
if (fCoordSystem==1){
// cylindrical system
- if (coord==2) {
+ if (coord==2||coord==5) {
if (fFormulaZ==0) return 0;
return fFormulaZ(xyz,fFixedParam->GetMatrixArray());
}
Double_t rrphiz[3]={0,0,0};
if (fFormulaX) rrphiz[0] = fFormulaX(xyz,fFixedParam->GetMatrixArray());
if (fFormulaY) rrphiz[1] = fFormulaY(xyz,fFixedParam->GetMatrixArray());
- Double_t alpha = TMath::ATan2(y,x);
- Double_t ca = TMath::Cos(alpha);
- Double_t sa = TMath::Sin(alpha);
+ alpha = TMath::ATan2(y,x);
+ ca = TMath::Cos(alpha);
+ sa = TMath::Sin(alpha);
if (coord==0) return ca*rrphiz[0]-sa*rrphiz[1];
if (coord==1) return sa*rrphiz[0]+ca*rrphiz[1];
+ if (coord==3) return rrphiz[0];
+ if (coord==4) return rrphiz[1];
}
return 0;
}
-Double_t AliTPCTransformation::TPCscalingRPol(Double_t *xyz, Double_t * param){
+
+
+Double_t AliTPCTransformation::TPCscalingRPol(Double_t *xyz, const Double_t * const param){
//
// Scaling and shift of TPC radius
// xyz[0..2] - global xyz of point
}
-Double_t AliTPCTransformation::TPCscalingZDrift(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPCscalingZDrift(Double_t *xyz, const Double_t * const param){
//
//
// Scaling and shift of TPC radius
return deltaZ*xyz[3];
}
-Double_t AliTPCTransformation::TPCscalingZDriftT0(Double_t *xyz, Double_t * /*param*/){
+Double_t AliTPCTransformation::TPCscalingZDriftT0(Double_t *xyz, const Double_t * const /*param*/){
//
//
// Z shift because time 0 offset
}
-Double_t AliTPCTransformation::TPCscalingZDriftGy(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPCscalingZDriftGy(Double_t *xyz, const Double_t * const param){
//
//
// Scaling and shift of TPC radius
-Double_t AliTPCTransformation::TPCscalingPhiLocal(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPCscalingPhiLocal(Double_t *xyz, const Double_t * const param){
//
//
// Scaling if the local y -phi
return deltaAlpha*xyz[3];
}
-Double_t AliTPCTransformation::TPClocalRPhiEdge(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPClocalRPhiEdge(Double_t *xyz, const Double_t *const param){
//
//
// Scaling if the local y -phi
}
-Double_t AliTPCTransformation::TPCscalingRIFC(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPCscalingRIFC(Double_t *xyz, const Double_t * const param){
//
// inner field cage r distorion - proportinal to 1 over distance to the IFC
// param[0] - drift polynom order
return xyz[3]*value;
}
-Double_t AliTPCTransformation::TPCscalingROFC(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPCscalingROFC(Double_t *xyz, const Double_t * const param){
//
// outer field cage r distorion - proportinal to 1 over distance to the OFC
// param[0] - drift polynom order
}
+Double_t AliTPCTransformation::TPCdeltaFCROC(Double_t *xyz, const Double_t *const param){
+ //
+ // delta R(Z) ROC induced
+ // param[0] - switch 0 - use distance to IFC - 1 - distance to IFC
+ // param[1] - kFC scaling factor (multiplication factor of (OFC-IFC))
+ // param[2] - kROC scaling factor
+ // parameters [1] and [2] should be obtained from the electric field
+ // simulation
+ //
+ Double_t rInner=78.8;
+ Double_t rFirst=85.2;
+ Double_t rLast=245.8;
+ Double_t rOuter=258.0;
+
+ Double_t radius = TMath::Sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
+ //calculate distance to the FC - inner or outer
+ Double_t deltaFC = (param[0]<0.5)? TMath::Abs(radius-rFirst) : TMath::Abs(radius-rLast);
+ deltaFC/=(rOuter-rInner);
+ Double_t scalingFC = 1./(1.+deltaFC/(param[1]));
+ //
+ Double_t drift = 1.-TMath::Abs(xyz[2]/250.); // normalized drift length
+ Double_t scalingROC = (1.-1./(1.+drift/param[2]));
+ //
+ return xyz[3]*scalingFC*scalingROC;
+}
+
+
+Double_t AliTPCTransformation::TPCdeltaFCCE(Double_t *xyz, const Double_t *const param){
+ //
+ // delta R(Z) CE (central electrode) induced
+ // param[0] - switch 0 - use distance to IFC - 1 - distance to IFC
+ // param[1] - kFC scaling factor (multiplication factor of (OFC-IFC))
+ // param[2] - kCE scaling factor
+ // parameters [1] and [2] should be obtained from the electric field
+ // simulation
+ Double_t rInner=78.8;
+ Double_t rFirst=85.2;
+ Double_t rLast =245.8;
+ Double_t rOuter=258.0;
+
+ Double_t radius = TMath::Sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
+ //calculate distance to the FC - inner or outer
+ Double_t deltaFC = (param[0]<0.5)? TMath::Abs(radius-rFirst) : TMath::Abs(radius-rLast);
+ deltaFC/=(rOuter-rInner);
+ Double_t scalingFC = 1./(1.+deltaFC/(param[1]));
+ //
+ Double_t drift = 1.-TMath::Abs(xyz[2]/250.); // normalized drift length
+ Double_t scalingCE = 1/(1.+(1.-drift)/param[2]); //
+ //
+ return xyz[3]*scalingFC*scalingCE;
+}
+
+
+
+
+
+
+
//
// TPC sector local misalignment
//
//
//
-Double_t AliTPCTransformation:: TPClocaldLxdGX(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation:: TPClocaldLxdGX(Double_t *xyz, const Double_t *const param){
//
// xyz - [0..2] - position
// [3] - scale parameter
return ca*factor;
}
-Double_t AliTPCTransformation::TPClocaldLxdGY(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPClocaldLxdGY(Double_t *xyz, const Double_t *const param){
//
// xyz - [0..2] - position
// [3] - scale parameter
return sa*factor;
}
-Double_t AliTPCTransformation:: TPClocaldLydGX(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation:: TPClocaldLydGX(Double_t *xyz, const Double_t *const param){
//
// xyz - [0..2] - position
// [3] - scale parameter
return -sa*factor;
}
-Double_t AliTPCTransformation::TPClocaldLydGY(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPClocaldLydGY(Double_t *xyz, const Double_t *const param){
//
// xyz - [0..2] - position
// [3] - scale parameter
}
-Double_t AliTPCTransformation::TPClocaldRzdGX(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPClocaldRzdGX(Double_t *xyz, const Double_t *const param){
//
// xyz - [0..2] - position
// [3] - scale parameter - rotation angle in mrad
return dgxR;
}
-Double_t AliTPCTransformation::TPClocaldRzdGY(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPClocaldRzdGY(Double_t *xyz, const Double_t *const param){
//
// xyz - [0..2] - position
// [3] - scale parameter - rotation angle in mrad
return xyz[3]*sign*signZ;
}
-Double_t AliTPCTransformation::TPCDeltaZ(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPCDeltaZ(Double_t *xyz, const Double_t *const param){
//
// xyz - [0..2] - position
// [3] - scale parameter
}
-Double_t AliTPCTransformation::TPCTiltingZ(Double_t *xyz, Double_t * param){
+Double_t AliTPCTransformation::TPCTiltingZ(Double_t *xyz, const Double_t *const param){
// xyz - [0..2] - position
// [3] - scale parameter
// [4] - volID