+ }
+}
+
+
+
+void AliTPCCalROC::GlobalFit(const AliTPCCalROC* ROCoutliers, Bool_t robust, TVectorD &fitParam, TMatrixD &covMatrix, Float_t & chi2, Int_t fitType, Double_t chi2Threshold, Double_t robustFraction){
+ //
+ // Makes a GlobalFit for the given secotr and return fit-parameters, covariance and chi2
+ // The origin of the fit function is the center of the ROC!
+ // fitType == 0: fit plane function
+ // fitType == 1: fit parabolic function
+ // ROCoutliers - pads with value !=0 are not used in fitting procedure
+ // chi2Threshold: Threshold for chi2 when EvalRobust is called
+ // robustFraction: Fraction of data that will be used in EvalRobust
+ //
+ TLinearFitter* fitterG = 0;
+ Double_t xx[6];
+
+ if (fitType == 1)
+ fitterG = new TLinearFitter (6,"x0++x1++x2++x3++x4++x5");
+ else
+ fitterG = new TLinearFitter(3,"x0++x1++x2");
+ fitterG->StoreData(kTRUE);
+ fitterG->ClearPoints();
+ Int_t npoints=0;
+
+ Float_t dlx, dly;
+ Float_t centerPad[3] = {0};
+ Float_t localXY[3] = {0};
+
+ AliTPCROC* tpcROCinstance = AliTPCROC::Instance();
+ tpcROCinstance->GetPositionLocal(fSector, GetNrows()/2, GetNPads(GetNrows()/2)/2, centerPad); // calculate center of ROC
+
+ // loop over all channels and read data into fitterG
+ if (fitType == 1) { // parabolic fit
+ fitParam.ResizeTo(6);
+ covMatrix.ResizeTo(6,6);
+ for (UInt_t irow = 0; irow < GetNrows(); irow++) {
+ for (UInt_t ipad = 0; ipad < GetNPads(irow); ipad++) {
+ // fill fitterG
+ tpcROCinstance->GetPositionLocal(fSector, irow, ipad, localXY); // calculate position localXY by pad and row number
+ dlx = centerPad[0] - localXY[0];
+ dly = centerPad[1] - localXY[1];
+ xx[0] = 1;
+ xx[1] = dlx;
+ xx[2] = dly;
+ xx[3] = dlx*dlx;
+ xx[4] = dly*dly;
+ xx[5] = dlx*dly;
+ if (!ROCoutliers || ROCoutliers->GetValue(irow, ipad) != 1) {
+ npoints++;
+ fitterG->AddPoint(xx, GetValue(irow, ipad), 1);
+ }
+ }
+ }
+ }
+ else { // linear fit
+ fitParam.ResizeTo(3);
+ covMatrix.ResizeTo(3,3);
+ for (UInt_t irow = 0; irow < GetNrows(); irow++) {
+ for (UInt_t ipad = 0; ipad < GetNPads(irow); ipad++) {
+ // fill fitterG
+ tpcROCinstance->GetPositionLocal(fSector, irow, ipad, localXY); // calculate position localXY by pad and row number
+ dlx = centerPad[0] - localXY[0];
+ dly = centerPad[1] - localXY[1];
+ xx[0] = 1;
+ xx[1] = dlx;
+ xx[2] = dly;
+ if (!ROCoutliers || ROCoutliers->GetValue(irow, ipad) != 1) {
+ npoints++;
+ fitterG->AddPoint(xx, GetValue(irow, ipad), 1);
+ }
+ }
+ }
+ }
+ fitterG->Eval();
+ fitterG->GetParameters(fitParam);
+ fitterG->GetCovarianceMatrix(covMatrix);
+ if (fitType == 1)
+ chi2 = fitterG->GetChisquare()/(npoints-6.);
+ else chi2 = fitterG->GetChisquare()/(npoints-3.);
+ if (robust && chi2 > chi2Threshold) {
+ // std::cout << "robust fitter called... " << std::endl;
+ fitterG->EvalRobust(robustFraction);
+ fitterG->GetParameters(fitParam);
+ }
+ delete fitterG;
+}
+
+
+AliTPCCalROC* AliTPCCalROC::CreateGlobalFitCalROC(TVectorD &fitParam, Int_t sector){
+ //
+ // Create ROC with global fit parameters
+ // The origin of the fit function is the center of the ROC!
+ // loop over all channels, write fit values into new ROC and return it
+ //
+ Float_t dlx, dly;
+ Float_t centerPad[3] = {0};
+ Float_t localXY[3] = {0};
+ AliTPCCalROC * ROCfitted = new AliTPCCalROC(sector);
+ AliTPCROC* tpcROCinstance = AliTPCROC::Instance();
+ tpcROCinstance->GetPositionLocal(sector, ROCfitted->GetNrows()/2, ROCfitted->GetNPads(ROCfitted->GetNrows()/2)/2, centerPad); // calculate center of ROC
+ Int_t fitType = 1;
+ if (fitParam.GetNoElements() == 6) fitType = 1;
+ else fitType = 0;
+ Double_t value = 0;
+ if (fitType == 1) { // parabolic fit
+ for (UInt_t irow = 0; irow < ROCfitted->GetNrows(); irow++) {
+ for (UInt_t ipad = 0; ipad < ROCfitted->GetNPads(irow); ipad++) {
+ tpcROCinstance->GetPositionLocal(sector, irow, ipad, localXY); // calculate position localXY by pad and row number
+ dlx = centerPad[0] - localXY[0];
+ dly = centerPad[1] - localXY[1];
+ value = fitParam[0] + fitParam[1]*dlx + fitParam[2]*dly + fitParam[3]*dlx*dlx + fitParam[4]*dly*dly + fitParam[5]*dlx*dly;
+ ROCfitted->SetValue(irow, ipad, value);
+ }
+ }
+ }
+ else { // linear fit
+ for (UInt_t irow = 0; irow < ROCfitted->GetNrows(); irow++) {
+ for (UInt_t ipad = 0; ipad < ROCfitted->GetNPads(irow); ipad++) {
+ tpcROCinstance->GetPositionLocal(sector, irow, ipad, localXY); // calculate position localXY by pad and row number
+ dlx = centerPad[0] - localXY[0];
+ dly = centerPad[1] - localXY[1];
+ value = fitParam[0] + fitParam[1]*dlx + fitParam[2]*dly;
+ ROCfitted->SetValue(irow, ipad, value);
+ }
+ }
+ }
+ return ROCfitted;