]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/CalibMacros/CalibAlignKalman.C
Corrected Goofie configuration entry (TPC_ANODE_I_A00_STAT removed)
[u/mrichter/AliRoot.git] / TPC / CalibMacros / CalibAlignKalman.C
index 7c131cd01ff1fcff8097a0fabd17275503611ee8..8e46c41d5e1c754972c34c747cec347b1532bdc6 100644 (file)
@@ -1,24 +1,32 @@
 /*
   
-gSystem->AddIncludePath("-I$ALICE_ROOT/TPC");
-gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
-gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+");
+ gSystem->AddIncludePath("-I$ALICE_ROOT/TPC");
+ gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
+ gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+");
 
-// gROOT->LoadMacro("$ALICE_ROOT/TPC/CalibMacros/CalibAlignKalman.C+");
-// AliTPCTransformation::BuildBasicFormulas();
+ gROOT->LoadMacro("$ALICE_ROOT/TPC/CalibMacros/CalibAlignKalman.C+");
 
-// AliXRDPROOFtoolkit tool;
-// chainPoints = tool.MakeChainRandom("align.txt","trackPoints",0,50000);
-// chainPoints->Lookup();
+ AliTPCTransformation::BuildBasicFormulas();
 
-// CalibAlignKalman(40000);
+ AliXRDPROOFtoolkit tool;
+ chainPoints = tool.MakeChainRandom("align.txt","trackPoints",0,50000);
+ chainPoints->Lookup();
+ //
+ chainMS = tool.MakeChainRandom("kalmanFit.list","kf",0,50000);
+ chainMS->Lookup();
+
+ chainFP = tool.MakeChainRandom("kalmanFit.list","filter",0,50000);
+ chainFP->Lookup();
+
+// CalibAlignKalmanFit(40000,1);
 // kalmanFit0->DumpCorelation(0.8);
 // TFile f("kalmanfitTPC.root");
+*/
 
 
-*/
+#ifdef __CINT__
+#else
 #include <fstream>
-
 #include "TSystem.h"
 #include "TROOT.h"
 #include "TRandom.h"
@@ -32,81 +40,146 @@ gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+");
 #include "TCut.h"
 #include "TEntryList.h"
 #include "TH1F.h"
+#include "THnSparse.h"
 
 
+#include "AliSysInfo.h"
+#include "AliExternalTrackParam.h"
 #include "TTreeStream.h"
 #include "AliTrackPointArray.h"
 #include "AliLog.h"
 #include "AliTPCTransformation.h"
 #include "AliTPCkalmanFit.h"
+#include "AliMathBase.h"
 #include "AliXRDPROOFtoolkit.h"
+#endif
+
+
+//
+//
+// track point cuts
+//
+const Float_t krmsYcut      = 0.2;   // cluster RMS cut in Y - residuals form local  fit
+const Float_t krmsZcut      = 0.2;   // cluster RMS cut in Z - residuals from local  fit 
+const Float_t krmsYcutGlobal= 0.2;   // cluster RMS cut in Y - residuals form global fit
+const Float_t krmsZcutGlobal= 2.0;   // cluster RMS cut in Z - residuals from global fit 
+const Float_t kSigmaCut     = 5.;    // clusters to be removed 
+const Int_t   knclCut       =  80;   // minimal number of clusters
+const Double_t kArmCut      = 50.;   // minimal level arm
+const Double_t kNsigma      = 5.;    // cut on track level
+//
+// mult. scattering cuts    
+/*
+TCut cutClY("rms09.fElements[0]<0.15");
+TCut cuttY("rms09.fElements[1]/rms09.fElements[0]<0.9");
+TCut cutkY("rms09.fElements[2]<0.015");
+TCut cutClZ("rms09.fElements[3]<0.2");
+TCut cuttZ("rms09.fElements[4]/rms09.fElements[3]<0.9");
+TCut cutkZ("rms09.fElements[5]<0.015");
+TCut cutMS=cutClY+cuttY+cutkY+cutClZ+cuttZ+cutkZ
+*/
+TMatrixD cutMatrix(4*7,2);
+const Double_t rmsCut09[6]={0.15,0.9,0.015, 0.2, 0.9, 0.015};
+
+
+
+//
+//
+Int_t          toSkip       = 2;     // 
+Int_t          toSkipOffset = 0;
+Int_t          toSkipTrack       = 2;
+Int_t          toSkipTrackOffset = 0;
+Int_t          isFilterTest = 0;
+//
+// Track cuts
+//
+TCut * cSide[4]={0,0,0,0};
+TCut *cP3[4]={0,0,0,0};
+TCut *cSP3[4]={0,0,0,0};
+TCut *cP4[4]={0,0,0,0};
+TCut *cM4[4]={0,0,0,0};
+TCut *cA[4]={0,0,0,0};
+
+TCut cutAll="";
 
 
+//
+//
 //
 TChain *chainPoints=0; 
 TEntryList *elist=0;
-AliTPCkalmanFit * kalmanFit0=0;
-AliTPCkalmanFit * kalmanFitIdeal=0;
+AliTPCkalmanFit * kalmanFitNew=0;
+AliTPCkalmanFit * kalmanFitOrig=0;
+AliTPCkalmanFit * kalmanFitApply=0;
 
-AliTPCkalmanFit *  CalibAlignKalmanFit(Int_t maxTracks);
+AliTPCkalmanFit *  CalibAlignKalmanFit(Int_t maxTracks, Int_t trackDump);
 void FilterTracks();
 AliTPCkalmanFit * SetupFit();
+//
 void              AddFitFieldCage(AliTPCkalmanFit *kalmanFit);
 void              AddPhiScaling(AliTPCkalmanFit *kalmanFit);
-void              AddZShift(AliTPCkalmanFit *kalmanFit);
-void              AddZRotation(AliTPCkalmanFit *kalmanFit);
+void              AddZShift(AliTPCkalmanFit *kalmanFit, Int_t ncos, Int_t nsin );
+void              AddZTilting(AliTPCkalmanFit *kalmanFit, Int_t ncos, Int_t nsin);
 void              AddLocalXYMisalignment(AliTPCkalmanFit *kalmanFit);
+void              AddLocalXYMisalignmentSector(AliTPCkalmanFit *kalmanFit);
+void              AddAlignOROCIROCFourier(AliTPCkalmanFit *kalmanFit, Int_t ncos, Int_t nsin);
+void              AddAlignSectorFourier(AliTPCkalmanFit *kalmanFit, Int_t ncos, Int_t nsin);
+void              AddDrift(AliTPCkalmanFit *kalmanFit);
+
+
 AliTrackPointArray *FilterPoints(AliTrackPointArray &points, Int_t dir, TTreeSRedirector *pcstream);
-AliTPCkalmanFit *   FitPointsLinear(Int_t maxTracks);
 
-void CalibAlignKalman(Int_t npoints, Int_t maxFiles, Int_t startFile){
+TVectorD * EstimateScatteringKalmanLinear(AliTrackPointArray &points, AliExternalTrackParam &p0, AliExternalTrackParam &p1 , TTreeSRedirector *pcstream);
+AliTrackPointArray *SkipPoints(AliTrackPointArray &points, Int_t nskip, Int_t nskipOffset);
+
+AliTPCkalmanFit *   FitPointsLinear(Int_t maxTracks, Int_t trackDump);
+
+void CalibAlignKalman(Int_t npoints, Int_t maxFiles, Int_t startFile, Int_t trackDump, Int_t nSkipTrack, Int_t nSkipTrackOffset, Int_t nSkip, Int_t nSkipOffset, Int_t bfilterTest){
+  //
+  //
+  //
+  AliTPCTransformation::BuildBasicFormulas();
+  toSkip=nSkip;
+  toSkipOffset= nSkipOffset;
+  toSkipTrack = nSkipTrack;
+  toSkipTrackOffset = nSkipTrackOffset;
+  isFilterTest = bfilterTest;
+  //
+  // read the transformation to be applied
+  TFile ftrafo("kalmanFitApply.root");
+  kalmanFitApply = (AliTPCkalmanFit *)ftrafo.Get("kalmanFitNew");
+  if (kalmanFitApply) {
+    printf("Loaded transforamtion\n");
+    kalmanFitApply->DumpCalib("IROCOROC");
+    kalmanFitApply->InitTransformation();
+  }else{
+    printf("Not trnasformation specified\n");
+  }
   //
   //
   //
   gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
   gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+");
-  
-  AliTPCTransformation::BuildBasicFormulas();
+  //
   AliXRDPROOFtoolkit tool;
   chainPoints = tool.MakeChainRandom("align.txt","trackPoints",0, maxFiles, startFile);
-  chainPoints->Lookup();
-  CalibAlignKalmanFit(npoints);
+  CalibAlignKalmanFit(npoints, trackDump);
 }
 
 
 
-//
-//
-// track point cuts
-//
-const Float_t krmsYcut    = 0.3;
-const Float_t krmsZcut    = 0.3;
-const Float_t kSigmaCut   = 10.;
-const Int_t   knclCut     =  80;
-const Double_t kArmCut    = 50.;
-//
-// Track cuts
-//
-TCut cutsP3="abs(p0Out.fP[3]-p0In.fP[3])<0.0002&&abs(p1Out.fP[3]-p1In.fP[3])<0.0002";
-TCut cutsP4="abs(p0Out.fP[4]-p0In.fP[4])<0.005&&abs(p1Out.fP[4]-p1In.fP[4])<0.005";
-TCut cutP3 ="abs(p1In.fP[3]+p0In.fP[3]-0.0015)<0.0025";
-TCut cutP4 ="abs(p1In.fP[4])<0.03&&abs(p0In.fP[4])<0.03";
-TCut cutSide="p1Out.fP[1]*p0Out.fP[1]>0&&p1In.fP[1]*p0In.fP[1]>0";
-TCut cutAll=cutSide+cutsP4+cutsP3+cutP3+cutP4+"abs(mag)<0.01&&ncont>0&&p.fNPoints>120";
-
-
-
 
-AliTPCkalmanFit *  CalibAlignKalmanFit(Int_t maxTracks){
+AliTPCkalmanFit *  CalibAlignKalmanFit(Int_t maxTracks, Int_t trackDump){
   //
+  // Fitting procedure
   //
   AliTPCTransformation::BuildBasicFormulas();
   FilterTracks();
-  kalmanFit0     = SetupFit();  
-  kalmanFitIdeal = SetupFit();
-  kalmanFit0->Init();
-  kalmanFitIdeal->Init();
-  return FitPointsLinear(maxTracks);
+  kalmanFitNew     = SetupFit();  
+  kalmanFitOrig  = SetupFit();
+  kalmanFitNew->Init();
+  kalmanFitOrig->Init();
+  return FitPointsLinear(maxTracks,trackDump);
 }
 
 
@@ -116,9 +189,14 @@ AliTPCkalmanFit * SetupFit(){
   AliTPCkalmanFit *kalmanFit =  new AliTPCkalmanFit;
   AddFitFieldCage(kalmanFit); 
   AddPhiScaling(kalmanFit);
-  AddZShift(kalmanFit); 
-  AddZRotation(kalmanFit); 
-  AddLocalXYMisalignment(kalmanFit);  
+  AddDrift(kalmanFit);
+  AddZShift(kalmanFit,3,3); 
+  AddZTilting(kalmanFit,3,3); 
+  //  AddLocalXYMisalignment(kalmanFit);  
+  //  AddLocalXYMisalignmentSector(kalmanFit);  
+  AddAlignSectorFourier(kalmanFit,4,4); 
+  AddAlignOROCIROCFourier(kalmanFit,5,5);
+  kalmanFit->Init();
   return kalmanFit;
 }
 
@@ -127,6 +205,94 @@ void FilterTracks(){
   //
   //
   //
+
+  cSide[0] = new TCut("cutAA","p0In.fP[1]>0&&p1In.fP[1]>0");
+  cSide[1] = new TCut("cutCC","p0In.fP[1]<0&&p1In.fP[1]<0");
+  cSide[2] = new TCut("cutAC","p0In.fP[1]>0&&p1In.fP[1]<0");
+  cSide[3] = new TCut("cutCA","p0In.fP[1]<0&&p1In.fP[1]>0");
+  //  
+  TH1F * phisP3 = new TH1F("hhisP3","hhisP3",100,-0.01,0.01);
+  TH1F * phisSP3 = new TH1F("hhisSP3","hhisSP3",100,-0.001,0.001);
+  TH1F * phisP4 = new TH1F("hhisP4","hhisP4",100,-0.1,0.1);
+  TH1F * phisM4 = new TH1F("hhisM4","hhisM4",100,-0.01,0.01);
+  
+  //
+
+  TF1 *fg = new TF1("fg","gaus");
+  for (Int_t iter=0; iter<2; iter++){
+    for (Int_t ic=0;ic<4;ic++){
+      if (!cA[ic]){
+       cA[ic]=new TCut;
+       *cA[ic]= *cSide[ic];
+      }
+      //
+      // cutP3
+      //
+      chainPoints->Draw("p0In.fP[3]+p1In.fP[3]>>hhisP3",*cA[ic],"goff");
+      phisP3->Fit(fg,"QNR","QNR",phisP3->GetBinCenter(phisP3->GetMaximumBin())-0.003,phisP3->GetBinCenter(phisP3->GetMaximumBin())+0.003);
+      cP3[ic]=new TCut(Form("abs(p0In.fP[3]+p1In.fP[3]-%f)<%f",fg->GetParameter(1), fg->GetParameter(2)*kNsigma));
+      cutMatrix(7*ic+0,0) = fg->GetParameter(1);
+      cutMatrix(7*ic+0,1) = fg->GetParameter(2);
+      //
+      // cutSP3
+      //
+      chainPoints->Draw("p0Out.fP[3]-p0In.fP[3]>>hhisSP3",*cA[ic],"goff");
+      phisSP3->Fit(fg,"QNR","QNR",phisP3->GetBinCenter(phisSP3->GetMaximumBin())-0.0015,phisP3->GetBinCenter(phisSP3->GetMaximumBin())+0.0015);
+      cSP3[ic]=new TCut(Form("abs(p0Out.fP[3]-p0In.fP[3]-%f)<%f",fg->GetParameter(1), fg->GetParameter(2)*kNsigma));
+      cutMatrix(7*ic+1,0) = fg->GetParameter(1);
+      cutMatrix(7*ic+1,1) = fg->GetParameter(2);
+      //
+      chainPoints->Draw("p1Out.fP[3]-p1In.fP[3]>>hhisSP3",*cA[ic],"goff");
+      phisSP3->Fit(fg,"QNR","QNR",phisP3->GetBinCenter(phisSP3->GetMaximumBin())-0.0015,phisP3->GetBinCenter(phisSP3->GetMaximumBin())+0.0015);
+      *cSP3[ic]+=Form("abs(p1Out.fP[3]-p1In.fP[3]-%f)<%f",fg->GetParameter(1), fg->GetParameter(2)*kNsigma);  
+      cutMatrix(7*ic+2,0) = fg->GetParameter(1);
+      cutMatrix(7*ic+2,1) = fg->GetParameter(2);    
+      //
+      // cutP4
+      //
+      chainPoints->Draw("p0Out.fP[4]>>hhisP4",*cA[ic],"goff");
+      phisP4->Fit(fg,"QNR","QNR",phisP4->GetBinCenter(phisP4->GetMaximumBin())-0.03,phisP4->GetBinCenter(phisP4->GetMaximumBin())+0.03);
+      cP4[ic]=new TCut(Form("abs(p0Out.fP[4]-%f)<%f",fg->GetParameter(1), fg->GetParameter(2)*kNsigma));
+      cutMatrix(7*ic+3,0) = fg->GetParameter(1);
+      cutMatrix(7*ic+3,1) = fg->GetParameter(2);    
+      chainPoints->Draw("p1Out.fP[4]>>hhisP4",*cA[ic],"goff");
+      phisP4->Fit(fg,"QNR","QNR",phisP4->GetBinCenter(phisP4->GetMaximumBin())-0.03,phisP4->GetBinCenter(phisP4->GetMaximumBin())+0.03);
+      *cP4[ic]+=Form("abs(p1Out.fP[4]-%f)<%f",fg->GetParameter(1), fg->GetParameter(2)*kNsigma);
+      cutMatrix(7*ic+4,0) = fg->GetParameter(1);
+      cutMatrix(7*ic+4,1) = fg->GetParameter(2);    
+
+    //
+      // cutM4
+      //
+      chainPoints->Draw("p0Out.fP[4]-p0In.fP[4]>>hhisM4",*cA[ic],"goff");
+      phisM4->Fit(fg,"QNR","QNR",phisM4->GetBinCenter(phisM4->GetMaximumBin())-0.03,phisM4->GetBinCenter(phisM4->GetMaximumBin())+0.03);
+      cM4[ic]=new TCut(Form("abs(p0Out.fP[4]-p0In.fP[4]-%f)<%f",fg->GetParameter(1), fg->GetParameter(2)*kNsigma));
+      cutMatrix(7*ic+5,0) = fg->GetParameter(1);
+      cutMatrix(7*ic+5,1) = fg->GetParameter(2);    
+
+      chainPoints->Draw("p1Out.fP[4]-p1In.fP[4]>>hhisM4",*cA[ic],"goff");
+      phisM4->Fit(fg,"QNR","QNR",phisM4->GetBinCenter(phisM4->GetMaximumBin())-0.03,phisM4->GetBinCenter(phisM4->GetMaximumBin())+0.03);
+      *cM4[ic]+=Form("abs(p1Out.fP[4]-p1In.fP[4]-%f)<%f",fg->GetParameter(1), fg->GetParameter(2)*kNsigma);
+      cutMatrix(7*ic+6,0) = fg->GetParameter(1);
+      cutMatrix(7*ic+6,1) = fg->GetParameter(2);    
+      //
+      //
+      //
+      cA[ic]=new TCut;
+      *cA[ic]= *cSide[ic]+*cP3[ic]+*cSP3[ic]+*cP4[ic]+*cM4[ic];
+    }
+  }
+  cutMatrix.Print();
+
+  cutAll = (*cA[0])||(*cA[1])||(*cA[2])||(*cA[3])+"abs(mag)<0.01&&ncont>0&&p.fNPoints>120";
+
+  delete  phisP3; // = new TH1F("hhisP3","hhisP3",100,-0.01,0.01);
+  delete  phisSP3; // = new TH1F("hhisSP3","hhisSP3",100,-0.001,0.001);
+  delete  phisP4;// = new TH1F("hhisP4","hhisP4",100,-0.1,0.1);
+  delete  phisM4;// = new TH1F("hhisM4","hhisM4",100,-0.01,0.01);
+
+
+
   chainPoints->Draw(">>listEL",cutAll,"entryList");
   elist = (TEntryList*)gDirectory->Get("listEL");
   chainPoints->SetEntryList(elist);
@@ -135,60 +301,231 @@ void FilterTracks(){
 
 
 
-AliTPCkalmanFit * FitPointsLinear(Int_t maxTracks){
+AliTPCkalmanFit * FitPointsLinear(Int_t maxTracks, Int_t trackDump){
   //
   //
   //
   // create debug streeamers
   TTreeSRedirector *pcstream      = new TTreeSRedirector("kalmanfitTPC.root");  
-  TTreeSRedirector *pcstreamIdeal = new TTreeSRedirector("kalmanfitTPCOrig.root");  
+  TTreeSRedirector *pcstreamOrig = new TTreeSRedirector("kalmanfitTPCOrig.root");  
+  pcstream->GetFile()->cd();
+  cutMatrix.Write("cutMarix");
+  elist->Write("eventList");
   //
   //
-  AliTrackPointArray *points=0;
+  AliTrackPointArray *pointsNS=0;
   Float_t mag=0;
   Int_t   time=0;
-  chainPoints->SetBranchAddress("p.",&points);
+  AliExternalTrackParam *param0=0;
+  AliExternalTrackParam *param1=0;
+  chainPoints->SetBranchAddress("p.",&pointsNS);
+  chainPoints->SetBranchAddress("p0In.",&param0);
+  chainPoints->SetBranchAddress("p1In.",&param1);
   chainPoints->SetBranchAddress("mag",&mag);
   chainPoints->SetBranchAddress("time",&time);
   Int_t accepted=0;
+  printf("\n*\n*\n*Selected entries = %d\n*\n*\n*",Int_t(elist->GetN()));
+
   //
   for (Int_t itrack=0;itrack<elist->GetN(); itrack++){
+    if (itrack%toSkipTrack!=toSkipTrackOffset) continue;   
     Int_t entry=chainPoints->GetEntryNumber(itrack);
     chainPoints->GetEntry(entry);
-    if (TMath::Abs(mag)>0.01) {printf("mag- Cut not accpeted\n"); continue;}
-    if (points->GetNPoints()<knclCut) {printf("ncl - Cut not accpeted\n"); continue;}
     if (accepted>maxTracks) break;
+    //
+    AliTrackPointArray *points = AliTPCkalmanFit::SortPoints(*pointsNS);    
+    if (kalmanFitApply)  kalmanFitApply->ApplyCalibration(points,-1.);
+    //
+    // estimate and filter scattering
+    //
+    TVectorD *vecRMS09 = EstimateScatteringKalmanLinear(*points,*param0,*param1,pcstream);
+    if (!vecRMS09) continue;
+    Bool_t isOK=kTRUE;
+    if ((*vecRMS09)[0] >rmsCut09[0]) isOK=kFALSE;
+    if ((*vecRMS09)[1]/(*vecRMS09)[0] >rmsCut09[1]) isOK=kFALSE;;
+    if ((*vecRMS09)[2] >rmsCut09[2]) isOK=kFALSE;
+    if ((*vecRMS09)[3] >rmsCut09[3]) isOK=kFALSE;
+    if ((*vecRMS09)[4]/(*vecRMS09)[0] >rmsCut09[4]) isOK=kFALSE;
+    if ((*vecRMS09)[5] >rmsCut09[5]) isOK=kFALSE;
+    if (!isOK || isFilterTest) {
+      delete points;
+      continue;
+    }
+    kalmanFitNew->PropagateTime(time);
+    //
+    //
     for (Int_t idir=-1; idir<=1; idir++){
-      AliTrackPointArray *pointsF = FilterPoints(*points,idir, pcstream);
+      AliTrackPointArray *pointsF = FilterPoints(*points,idir, pcstream);      
       if (!pointsF) continue;
+      AliTrackPointArray *spointsF = 0;     
+      // we skip points for alignemnt  but not for QA
+      if (idir==0)  spointsF = SkipPoints(*pointsF, toSkip*2, toSkipOffset);
+      if (idir!=0)  spointsF = SkipPoints(*pointsF, toSkip,   toSkipOffset);
       if (idir==0)  accepted++;
       //
       if (accepted%50==0) {
-       kalmanFit0->FitTrackLinear(*pointsF, 10, pcstream);
+       kalmanFitNew->FitTrackLinear(*pointsF, pcstream);
       }else{
-       kalmanFit0->FitTrackLinear(*pointsF, 1, 0);
+       if (idir==0) kalmanFitNew->FitTrackLinear(*spointsF, 0);
+       if (idir!=0) kalmanFitNew->FitTrackLinear(*spointsF, 0);
       }    
-      if (idir==0) kalmanFit0->DumpTrackLinear(*pointsF,pcstream);
-      if (idir==0) kalmanFitIdeal->DumpTrackLinear(*pointsF,pcstreamIdeal);
-      if (accepted%25==0) printf("%d\n", accepted);
+      if (idir==0) kalmanFitNew->DumpTrackLinear(*pointsF,pcstream);
+      if (idir==0) kalmanFitOrig->DumpTrackLinear(*pointsF,pcstreamOrig);
+      if (accepted%trackDump==0) {
+       printf("%d\n", accepted);
+      }
+      AliSysInfo::AddStamp("trackFit", accepted,itrack);
       delete pointsF;
+      delete spointsF;
     }
+    delete points;
   }
   pcstream->GetFile()->cd();
-  kalmanFit0->Write("kalmanFit");
-  pcstreamIdeal->GetFile()->cd();
-  kalmanFitIdeal->Write("kalmanFitIdeal");
+  kalmanFitNew->Write("kalmanFit");
+  pcstreamOrig->GetFile()->cd();
+  kalmanFitOrig->Write("kalmanFitOrig");
+  pcstreamOrig->GetFile()->cd();
+  if (kalmanFitApply) kalmanFitApply->Write("kalmanFitApply");
+  
   delete pcstream;  
-  delete pcstreamIdeal;  
-  return kalmanFit0;   
+  delete pcstreamOrig;  
+  return kalmanFitNew;   
 }
 
+void  QAPointsLinear(Int_t maxTracks, Int_t trackDump){
+  //
+  // check  the consistency of kalman fit
+  // Apply transformation
+  //
+  // create debug streeamers
+  TTreeSRedirector *pcstreamNonCalib      = new TTreeSRedirector("kalmanfitTPCQANonCalib.root");
+  TTreeSRedirector *pcstreamCalib         = new TTreeSRedirector("kalmanfitTPCQACalib.root");
+  TTreeSRedirector *pcstream=0;
+  AliTPCkalmanFit  *kalmanFitters[6]={0,0,0,0,0,0};
+  for (Int_t i=0;i<6;i++){
+    kalmanFitters[i]=SetupFit();
+  }
+  //
+  //
+  AliTrackPointArray *points=0;
+  AliExternalTrackParam *param0=0;
+  AliExternalTrackParam *param1=0;
+  Float_t mag=0;
+  Int_t   time=0;
+  chainPoints->SetBranchAddress("p.",&points);
+  chainPoints->SetBranchAddress("mag",&mag);
+  chainPoints->SetBranchAddress("time",&time);
+  chainPoints->SetBranchAddress("p0In.",&param0);
+  chainPoints->SetBranchAddress("p1In.",&param1);
+
+  Int_t accepted=0;
+  //
 
 
+  for (Int_t itrack=0;itrack<elist->GetN(); itrack++){
+    if (itrack%toSkipTrack!=toSkipTrackOffset) continue;   
+    Int_t entry=chainPoints->GetEntryNumber(itrack);
+    chainPoints->GetEntry(entry);
+    if (accepted>maxTracks) break;
+    //
 
-AliTrackPointArray *FilterPoints(AliTrackPointArray &points, Int_t dir, TTreeSRedirector */*pcstream*/){
+    AliTrackPointArray pointsCalib(*points); 
+    for (Int_t iscalib=0; iscalib<1;iscalib++){
+      if (iscalib>0)  kalmanFitNew->ApplyCalibration(&pointsCalib,-1.);
+      if (iscalib==0) pcstream=pcstreamNonCalib;
+      if (iscalib>0)  pcstream=pcstreamCalib;
+      for (Int_t idir=-1; idir<=1; idir++){
+       AliTrackPointArray *pointsF = FilterPoints(pointsCalib,idir, pcstream);
+       if (!pointsF) continue;
+       //
+       if (idir==0) accepted++;
+       kalmanFitters[iscalib*3+idir+1]->DumpTrackLinear(*pointsF,0);
+       EstimateScatteringKalmanLinear(*pointsF,*param0,*param1,pcstream);
+       delete pointsF;
+      }
+    }
+    if (accepted%trackDump==0) {
+      printf("%d\n", accepted);
+    }
+  }
+  pcstreamCalib->GetFile()->cd();
+  kalmanFitters[0]->Write("fitUpNonCalib");
+  kalmanFitters[1]->Write("fitUpDownNonCalib");
+  kalmanFitters[2]->Write("fitDownNonCalib");
+  kalmanFitters[3]->Write("fitUpCalib");
+  kalmanFitters[4]->Write("fitUpDownCalib");
+  kalmanFitters[5]->Write("fitDownCalib");
+  delete pcstreamCalib;  
+  delete pcstreamNonCalib;  
+}
+
+
+void  TestScattering(Int_t maxTracks, Int_t trackDump){
+  //
+  // test Multiple scattering algorithm
+  // Apply transformation
+  //
+  // create debug streeamers
+  TTreeSRedirector *pcstream      = new TTreeSRedirector("kalmanfitTPCMS.root");
+  //
+  //
+  AliTrackPointArray *points=0;
+  AliExternalTrackParam *param0=0;
+  AliExternalTrackParam *param1=0;
+  Float_t mag=0;
+  Int_t   time=0;
+  chainPoints->SetBranchAddress("p.",&points);
+  chainPoints->SetBranchAddress("mag",&mag);
+  chainPoints->SetBranchAddress("time",&time);
+  chainPoints->SetBranchAddress("p0In.",&param0);
+  chainPoints->SetBranchAddress("p1In.",&param1);
+  Int_t accepted=0;
   //
+  for (Int_t itrack=0;itrack<elist->GetN(); itrack++){
+    Int_t entry=chainPoints->GetEntryNumber(itrack);
+    chainPoints->GetEntry(entry);
+    if (accepted>maxTracks) break;
+    //
+    AliTrackPointArray *pointsSorted = AliTPCkalmanFit::SortPoints(*points);
+    EstimateScatteringKalmanLinear(*pointsSorted,*param0,*param1,pcstream);
+    accepted++;
+    if (accepted%trackDump==0) {
+      printf("%d\n", accepted);
+    }
+    delete pointsSorted;
+  }
+  delete pcstream;  
+}
+
+
+
+
+
+AliTrackPointArray *SkipPoints(AliTrackPointArray &points, Int_t nskip, Int_t nskipOffset){
   //
+  // create new array with skipped points
+  //
+  Int_t npoints = points.GetNPoints();
+  Int_t npointsF = (npoints-nskipOffset-1)/nskip;
+  AliTrackPoint point;
+  AliTrackPointArray *pointsF= new AliTrackPointArray(npointsF);
+  Int_t used=0;
+  for (Int_t ipoint=nskipOffset; ipoint<npoints; ipoint+=nskip){
+    //
+    if (!points.GetPoint(point,ipoint)) continue;
+    pointsF->AddPoint(used,&point);
+    used++;
+    if (used==npointsF) break;
+  }
+  return pointsF;
+}
+
+
+
+AliTrackPointArray *FilterPoints(AliTrackPointArray &points, Int_t dir, TTreeSRedirector *pcstream){
+  //
+  //  Filter points - input points for KalmanFilter
+  //                
   //
   TLinearFitter lfitY(2,"pol1");
   TLinearFitter lfitZ(2,"pol1");
@@ -227,11 +564,12 @@ AliTrackPointArray *FilterPoints(AliTrackPointArray &points, Int_t dir, TTreeSRe
   //
   Double_t chi2Y = lfitY.GetChisquare()/lfitY.GetNpoints();
   Double_t chi2Z = lfitZ.GetChisquare()/lfitZ.GetNpoints();
-  if (TMath::Sqrt(chi2Y)>krmsYcut) return 0;
-  if (TMath::Sqrt(chi2Z)>krmsZcut) return 0;
+  if (TMath::Sqrt(chi2Y)>krmsYcutGlobal) return 0;
+  if (TMath::Sqrt(chi2Y)>krmsYcutGlobal) return 0;
   //
   //
   Int_t accepted=0;
+  Int_t toBeUsed    =0;
   AliTrackPoint point;
   AliTrackPointArray *pointsF=0;
   for (Int_t iter=0; iter<2;iter++){
@@ -249,17 +587,284 @@ AliTrackPointArray *FilterPoints(AliTrackPointArray &points, Int_t dir, TTreeSRe
       Double_t fz = vecZ[0]+vecZ[1]*rx;
       if (TMath::Abs(fy-ry)>erry*kSigmaCut) continue;
       if (TMath::Abs(fz-rz)>errz*kSigmaCut) continue;
-      if (pointsF) pointsF->AddPoint(accepted,&point);
       accepted++;
+      if (pointsF) pointsF->AddPoint(toBeUsed,&point);
+      toBeUsed++;
+    }
+    if (pcstream){
+      (*pcstream)<<"filter"<<
+       "iter="<<iter<<
+       "accepted="<<accepted<<
+       "minX="<<minX<<
+       "maxX="<<maxX<<
+       "vY.="<<&vecY<<
+       "vZ.="<<&vecZ<<
+       "chi2Y="<<chi2Y<<
+       "chi2Z="<<chi2Z<<
+       "\n";
     }
     if (accepted<knclCut) break;
-    if (iter==0) pointsF = new AliTrackPointArray(accepted);
+    if (iter==0) pointsF = new AliTrackPointArray(toBeUsed);
     accepted=0;
+    toBeUsed=0;
   }
   return pointsF;
 }
 
 
+AliTrackPointArray * SortPoints(AliTrackPointArray &points){
+  //
+  //Creates the array  - points sorted according radius - neccessay for kalman fit
+  // 
+  //
+  // 0. choose the frame - rotation angle
+  //
+  Int_t npoints = points.GetNPoints();
+  if (npoints<1) return 0;
+  Double_t currentAlpha = TMath::ATan2(points.GetY()[npoints-1]-points.GetY()[0], points.GetX()[npoints-1]-points.GetX()[0]);  
+  Double_t ca = TMath::Cos(currentAlpha);
+  Double_t sa = TMath::Sin(currentAlpha);
+  //
+  // 1. sort the points
+  //
+  Double_t *rxvector = new Double_t[npoints];
+  Int_t    *indexes  = new Int_t[npoints];
+  for (Int_t ipoint=0; ipoint<npoints-1; ipoint++){
+    rxvector[ipoint]=ca*points.GetX()[ipoint]+sa*points.GetY()[ipoint];
+  }
+  TMath::Sort(npoints, rxvector,indexes,kFALSE);
+  AliTrackPoint point;
+  AliTrackPointArray *pointsSorted= new AliTrackPointArray(npoints);
+  for (Int_t ipoint=0; ipoint<npoints; ipoint++){
+    if (!points.GetPoint(point,indexes[ipoint])) continue;
+    pointsSorted->AddPoint(ipoint,&point);
+  }
+  delete [] rxvector;
+  delete [] indexes;
+  return pointsSorted;
+}
+
+TVectorD *  EstimateScatteringKalmanLinear(AliTrackPointArray &points, AliExternalTrackParam &p0, AliExternalTrackParam &p1 , TTreeSRedirector *pcstream){
+  //
+  // Algorithm - 0. Fit the track forward and backward
+  //           - 1. Store the current parameters in each point
+
+  const Int_t kMinPoints= 70;
+  const Double_t kResY  = 0.1;
+  const Double_t kResZ  = 0.1;
+  const Double_t kMisY  = 0.02;
+  const Double_t kMisZ  = 0.02;
+  const Double_t kLArm  = 120.;
+  const Double_t kACsideFac = 10.;
+  const Double_t kMS0   = kResY/20.;
+    
+  Int_t npoints = points.GetNPoints();
+  if (npoints<kMinPoints) return 0;
+
+  TVectorD *vecPos[11]={0,0,0,0,0,0,0,0,0,0,0};
+  for (Int_t i=0;i<11;i++){
+    vecPos[i]=new TVectorD(npoints);
+  }
+
+  //
+  Double_t currentAlpha = TMath::ATan2(points.GetY()[npoints-1]-points.GetY()[0], points.GetX()[npoints-1]-points.GetX()[0]);  
+  Double_t ca  = TMath::Cos(currentAlpha);
+  Double_t sa  = TMath::Sin(currentAlpha);
+  //
+  //
+  TMatrixD trParamY(2,1),trCovarY(2,2);
+  TMatrixD trParamZ(2,1),trCovarZ(2,2);
+  Int_t kNmeas  = 1; 
+  Int_t nelem   = 2;
+  //
+  TMatrixD matHk(kNmeas,nelem);     // vector to mesurement
+  TMatrixD matHkT(nelem,kNmeas);    // helper matrix Hk transpose
+  TMatrixD matFk(nelem,nelem);      
+  TMatrixD matFkT(nelem,nelem);      
+  TMatrixD vecYk(kNmeas,1);         // Innovation or measurement residual
+  TMatrixD vecZk(kNmeas,1);         // Innovation or measurement residual
+  TMatrixD measR(kNmeas,kNmeas);
+  TMatrixD matSk(kNmeas,kNmeas);    // Innovation (or residual) covariance
+  TMatrixD matKk(nelem,kNmeas);     // Optimal Kalman gain
+  TMatrixD covXk2(nelem,nelem);     // helper matrix
+  TMatrixD covXk3(nelem,nelem);     // helper matrix
+  TMatrixD mat1(nelem,nelem);
+  mat1(0,0)=1.; mat1(0,1)=0.;
+  mat1(1,0)=0.; mat1(1,1)=1.;
+  matHk(0,0)=1;
+  matHk(0,1)=0;
+
+  Double_t lastX    = 0;
+  Int_t lastVolId=-1;
+  for (Int_t idir=0; idir<2;idir++){
+    // fit direction
+    //
+    for (Int_t ip=0; ip<npoints; ip++){
+      Int_t ipoint= ip;
+      if (idir>0) ipoint = npoints-ip-1;
+      Double_t rx =   ca*points.GetX()[ipoint]+sa*points.GetY()[ipoint];
+      Double_t ry =  -sa*points.GetX()[ipoint]+ca*points.GetY()[ipoint];
+      Double_t rz =  points.GetZ()[ipoint];
+      Int_t  volId= points.GetVolumeID()[ipoint];
+      //
+      if (ip==0){
+       // set initital parameters and covariance - use first and middle point
+       Double_t rxm =   ca*points.GetX()[npoints/2]+sa*points.GetY()[npoints/2];
+       Double_t rym =  -sa*points.GetX()[npoints/2]+ca*points.GetY()[npoints/2];
+       Double_t rzm =  points.GetZ()[npoints/2];
+       trParamY(0,0) = ry; 
+       trParamY(1,0) = (rym-ry)/(rxm-rx);
+       trParamZ(0,0) = rz;
+       trParamZ(1,0) = (rzm-rz)/(rxm-rx);
+       //
+       trCovarY(0,0) = kResY*kResY;
+       trCovarY(1,1) = (kResY*kResY)/((rxm-rx)*(rxm-rx));
+       trCovarZ(0,0) = kResZ*kResZ;
+       trCovarZ(1,1) = (kResZ*kResZ)/((rxm-rx)*(rxm-rx));
+       lastX     = rx;
+       lastVolId = volId;
+      }
+      //
+      // Propagate
+      //
+      if ((volId%36)<18 && (lastVolId%36)>=18){
+       // A - C side cross
+       trCovarY(0,0)+=kMisY*kMisY*kACsideFac;
+       trCovarZ(0,0)+=kMisZ*kMisZ*kACsideFac;
+       trCovarY(1,1)+=kACsideFac*(kMisY*kMisY)/(kLArm*kLArm);;
+       trCovarZ(1,1)+=kACsideFac*(kMisZ*kMisZ)/(kLArm*kLArm);
+       lastVolId=volId;
+      }
+      if (volId!=lastVolId){
+       // volumeID change
+       trCovarY(0,0)+=kMisY*kMisY;
+       trCovarZ(0,0)+=kMisZ*kMisZ;
+       trCovarY(1,1)+=(kMisY*kMisY)/(kLArm*kLArm);;
+       trCovarZ(1,1)+=(kMisZ*kMisZ)/(kLArm*kLArm);
+       lastVolId=volId;
+      }
+      //
+      // Propagate
+      //
+      Double_t deltaX=rx-lastX;
+      trParamY(0,0)+=deltaX*trParamY(1,0);
+      trParamZ(0,0)+=deltaX*trParamZ(1,0);
+      matFk(0,0)=1; matFk(0,1)=deltaX;
+      matFk(1,0)=0; matFk(1,1)=1;
+      matFkT=matFk.T(); matFk.T();
+      covXk2=matFk*trCovarY*matFkT;
+      trCovarY=covXk2;
+      covXk2=matFk*trCovarZ*matFkT;
+      trCovarZ=covXk2;
+
+      // multiple scattering
+      trCovarY(1,1)+=TMath::Abs(deltaX)*kMS0*kMS0;
+      trCovarZ(1,1)+=TMath::Abs(deltaX)*kMS0*kMS0;
+      lastX=rx;
+      //
+      // Update
+      //
+      for (Int_t coord=0; coord<2;coord++){
+       TMatrixD* pvecXk = (coord==0)? &trParamY: &trParamZ;
+       TMatrixD* pcovXk = (coord==0)? &trCovarY: &trCovarZ;
+       //
+       TMatrixD& vecXk = *pvecXk;
+       TMatrixD& covXk = *pcovXk;
+       measR(0,0) = (coord==0) ? kResY:kResZ;
+       vecZk(0,0) = (coord==0) ? ry:rz;
+       //
+       vecYk = vecZk-matHk*vecXk;               // Innovation or measurement residual
+       matHkT=matHk.T(); matHk.T();
+       matSk = (matHk*(covXk*matHkT))+measR;    // Innovation (or residual) covariance
+       matSk.Invert();
+       matKk = (covXk*matHkT)*matSk;            //  Optimal Kalman gain
+       //
+       covXk2= (mat1-(matKk*matHk));
+       covXk3 =  covXk2*covXk;          
+       vecXk += matKk*vecYk;                    //  updated vector 
+       covXk = covXk3; 
+      }
+      //
+      // store parameters
+      //
+      (*vecPos[0])[ipoint]=rx;
+      (*vecPos[1])[ipoint]=ry;
+      (*vecPos[2])[ipoint]=rz;
+
+      (*vecPos[4*idir+0+3])[ipoint]=trParamY(0,0);
+      (*vecPos[4*idir+1+3])[ipoint]=trParamY(1,0);
+      //
+      (*vecPos[4*idir+2+3])[ipoint]=trParamZ(0,0);
+      (*vecPos[4*idir+3+3])[ipoint]=trParamZ(1,0);
+    }
+  }
+  //
+  //
+  //
+  TVectorD vec(npoints);
+  TVectorD rms(6);
+  TVectorD rms09(6); // robust RMS - fraction 0.9
+  TVectorD mean09(6); // robust RMS - fraction 0.9
+  Double_t meanR,rmsR;
+  Int_t npoints09 = Int_t(npoints*0.9);
+  //
+  vec=(*(vecPos[3])-*(vecPos[1]));
+  rms[0]=TMath::RMS(npoints, vec.GetMatrixArray());   // rms cluster y
+  AliMathBase::EvaluateUni(npoints, vec.GetMatrixArray(),meanR,rmsR,npoints09);
+  rms09[0]=rmsR;
+  mean09[0]=meanR;
+  vec=(*(vecPos[7])-*(vecPos[3]));
+  rms[1]=TMath::RMS(npoints, vec.GetMatrixArray());   // rms track y
+  AliMathBase::EvaluateUni(npoints, vec.GetMatrixArray(),meanR,rmsR,npoints09);
+  rms09[1]=rmsR;
+  mean09[1]=meanR;
+  vec=(*(vecPos[8])-*(vecPos[4]));
+  rms[2]=TMath::RMS(npoints, vec.GetMatrixArray());   // rms track ky
+  AliMathBase::EvaluateUni(npoints, vec.GetMatrixArray(),meanR,rmsR,npoints09);
+  rms09[2]=rmsR;
+  mean09[2]=meanR;
+  //
+  vec=(*(vecPos[5])-*(vecPos[2]));
+  rms[3]=TMath::RMS(npoints, vec.GetMatrixArray());   // rms cluster z
+  AliMathBase::EvaluateUni(npoints, vec.GetMatrixArray(),meanR,rmsR,npoints09);
+  rms09[3]=rmsR;
+  mean09[3]=meanR;
+  vec=(*(vecPos[9])-*(vecPos[5]));
+  rms[4]=TMath::RMS(npoints, vec.GetMatrixArray());   // rms track z
+  AliMathBase::EvaluateUni(npoints, vec.GetMatrixArray(),meanR,rmsR,npoints09);
+  rms09[4]=rmsR;
+  mean09[4]=meanR;
+  vec=(*(vecPos[10])-*(vecPos[6]));
+  rms[5]=TMath::RMS(npoints, vec.GetMatrixArray());   // rms track kz
+  AliMathBase::EvaluateUni(npoints, vec.GetMatrixArray(),meanR,rmsR,npoints09);
+  rms09[5]=rmsR;
+  mean09[5]=meanR;
+
+
+  (*pcstream)<<"kf"<<
+    "p.="<<&points<<    
+    "p0.="<<&p0<<
+    "p1.="<<&p1<<
+    "rms.="<<&rms<<
+    "rms09.="<<&rms09<<
+    "mean09.="<<&mean09<<
+    "py.="<<&trParamY<<
+    "pz.="<<&trParamZ<<
+    "cy.="<<&trCovarY<<
+    "cz.="<<&trCovarY<<
+    "\n";
+  for (Int_t i=0;i<11;i++){
+    delete vecPos[i];
+  }
+  return new TVectorD(rms09);
+}
+
+
+
+
+
+
+
 
 
 void  AddFitFieldCage(AliTPCkalmanFit *kalmanFit){
@@ -313,77 +918,195 @@ void  AddFitFieldCage(AliTPCkalmanFit *kalmanFit){
 
 void AddPhiScaling(AliTPCkalmanFit *kalmanFit){
   //
-  // Add local phi scaling
+  // Add linear local phi scaling - 
+  // separate IROC/OROC  - A side/C side
+  //    "tscalingLocalPhiIROC"                     
+  //    "tscalingLocalPhiOROC"                     
+
+  TBits maskInner(72);
+  TBits maskOuter(72);
+  for (Int_t i=0;i<72;i++){
+    if (i<36){
+      maskInner[i]=kTRUE;
+    }
+    if (i>=36){
+      maskOuter[i]=kTRUE;
+    }
+  }
+  TVectorD fpar(10);
+  AliTPCTransformation * transformation=0;
+  fpar[0]=1; 
+  transformation = new AliTPCTransformation("tscalingLocalPhiIROC", new TBits(maskInner), 0,"TPCscalingPhiLocal",0,  1);
+  transformation->SetParams(0,0.02,0,&fpar);
+  kalmanFit->AddCalibration(transformation);  
+  transformation = new AliTPCTransformation("tscalingLocalPhiOROC", new TBits(maskOuter), 0,"TPCscalingPhiLocal",0,  1);
+  transformation->SetParams(0,0.02,0,&fpar);
+  kalmanFit->AddCalibration(transformation);  
+  //
+}
+
+void AddDrift(AliTPCkalmanFit *kalmanFit){
+  //
+  // Add drift velocity transformation
   //
   TVectorD fpar(10);
   AliTPCTransformation * transformation=0;
   fpar[0]=1;
-  transformation = new AliTPCTransformation("tscalingLocalPhi", AliTPCTransformation::BitsAll(), 0,"TPCscalingPhiLocal",0,  1);
-  transformation->SetParams(0,0.2,0,&fpar);
+  transformation = new AliTPCTransformation("tTPCscalingZDrift", AliTPCTransformation::BitsAll(), 0,0,"TPCscalingZDr",  0);
+  transformation->SetParams(0,4.,1.,&fpar);
   kalmanFit->AddCalibration(transformation);  
   //
+  transformation = new AliTPCTransformation("tTPCscalingZDriftGy", AliTPCTransformation::BitsAll(), 0,0,"TPCscalingZDrGy",  0);
+  transformation->SetParams(0,0.2,0.0,&fpar);
+  kalmanFit->AddCalibration(transformation);  
 }
 
-void  AddZShift(AliTPCkalmanFit *kalmanFit){
+
+
+
+void  AddZShift(AliTPCkalmanFit *kalmanFit, Int_t ncos, Int_t nsin){
+  //
+  //
+  // 
   TVectorD fpar(10);
+  fpar[0]=0; fpar[1]=0; fpar[2]=0;
+  char tname[1000];
   AliTPCTransformation * transformation=0;
-  TBits maskInnerA(72);
-  TBits maskInnerC(72);
-  TBits maskOuter(72);
-  for (Int_t i=0;i<72;i++){
-    if (i<36){
-      if (i%36<18)  maskInnerA[i]=kTRUE;
-      if (i%36>=18) maskInnerC[i]=kTRUE;
-    }
-    if (i>=36){
-      maskOuter[i]=kTRUE;
-    }
-  }
   //
-  transformation = new AliTPCTransformation("tTPCDeltaZIROCA", new TBits(maskInnerA), 0,0, "TPCDeltaZ",  0);
-  transformation->SetParams(0,0.2,0,&fpar);
-  kalmanFit->AddCalibration(transformation);
-  transformation = new AliTPCTransformation("tTPCDeltaZIROCC", new TBits(maskInnerC), 0,0, "TPCDeltaZ",  0);
-  transformation->SetParams(0,0.2,0,&fpar);
-  kalmanFit->AddCalibration(transformation);
   //
-  transformation = new AliTPCTransformation("tTPCDeltaZOROCML", new TBits(maskOuter), 0,0, "TPCDeltaZMediumLong",  0);
-  transformation->SetParams(0,0.2,0,&fpar);
-  kalmanFit->AddCalibration(transformation);
   //
+  for (Int_t i=0; i<=ncos;i++){
+    fpar[0]=i;  // cos frequency
+    fpar[1]=0;  // no sinus
+    fpar[2]=1;  // relative misalignment
+    //
+    sprintf(tname,"tTPCDeltaZIROCOROCSideA_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), 0,0, "TPCDeltaZ" ,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPCDeltaZIROCOROCSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), 0,0, "TPCDeltaZ" ,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    //
+    fpar[2]=0;  // absolute  misalignment
+    sprintf(tname,"tTPCDeltaZSectorSideA_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), 0,0, "TPCDeltaZ" ,  0);
+    transformation->SetParams(0,0.1,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPCDeltaZSectorSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), 0,0, "TPCDeltaZ" ,  0);
+    transformation->SetParams(0,0.1,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+  }
+
+  for (Int_t i=1; i<=nsin;i++){
+    fpar[0]=0;  // cos frequency
+    fpar[1]=i;  // sinus frequncy
+    fpar[2]=1;  // relative misalignment
+    //
+    sprintf(tname,"tTPCDeltaZIROCOROCSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), 0,0, "TPCDeltaZ" ,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPCDeltaZIROCOROCSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), 0,0, "TPCDeltaZ" ,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    //
+    fpar[2]=0;  // absolute  misalignment
+    sprintf(tname,"tTPCDeltaZSectorSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), 0,0, "TPCDeltaZ" ,  0);
+    transformation->SetParams(0,0.1,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPCDeltaZSectorSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), 0,0, "TPCDeltaZ" ,  0);
+    transformation->SetParams(0,0.1,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+  }
+
 }
 
-void AddZRotation(AliTPCkalmanFit *kalmanFit){
+
+
+
+void AddZTilting(AliTPCkalmanFit *kalmanFit, Int_t ncos, Int_t nsin){
   //
+  // z tilting absolute (sector) and relative (IROC-OROC)
   //
   //
   TVectorD fpar(10);
-  //  AliTPCTransformation::BitsSide(iside)
-  fpar[0]=0; fpar[1]=0;
+  fpar[0]=0; fpar[1]=0; fpar[2]=0;
+  char tname[1000];
   AliTPCTransformation * transformation=0;
-  transformation = new AliTPCTransformation("tTPCTiltingZAside00",AliTPCTransformation::BitsSide(0) , 0,0, "TPCTiltingZ",  0);
-  transformation->SetParams(0,0.4,0,&fpar);
-  kalmanFit->AddCalibration(transformation);
-  transformation = new AliTPCTransformation("tTPCTiltingZCside00",AliTPCTransformation::BitsSide(1) , 0,0, "TPCTiltingZ",  0);
-  transformation->SetParams(0,0.4,0,&fpar);
-  kalmanFit->AddCalibration(transformation);
   //
-  fpar[0]=1; fpar[1]=0;
-  transformation = new AliTPCTransformation("tTPCTiltingZAside10",AliTPCTransformation::BitsSide(0) , 0,0, "TPCTiltingZ",  0);
-  transformation->SetParams(0,0.4,0,&fpar);
-  kalmanFit->AddCalibration(transformation);
-  transformation = new AliTPCTransformation("tTPCTiltingZCside10",AliTPCTransformation::BitsSide(1) , 0,0, "TPCTiltingZ",  0);
-  transformation->SetParams(0,0.4,0,&fpar);
-  kalmanFit->AddCalibration(transformation);
   //
   //
-  fpar[0]=0; fpar[1]=1;
-  transformation = new AliTPCTransformation("tTPCTiltingZAside01",AliTPCTransformation::BitsSide(0) , 0,0, "TPCTiltingZ",  0);
-  transformation->SetParams(0,0.4,0,&fpar);
-  kalmanFit->AddCalibration(transformation);
-  transformation = new AliTPCTransformation("tTPCTiltingZCside01",AliTPCTransformation::BitsSide(1) , 0,0, "TPCTiltingZ",  0);
-  transformation->SetParams(0,0.4,0,&fpar);
-  kalmanFit->AddCalibration(transformation);  
+  for (Int_t i=0; i<=ncos;i++){
+    fpar[0]=i;  // cos frequency
+    fpar[1]=0;  // sinus frequency
+    fpar[2]=1;  // relative misalignment
+    //
+    sprintf(tname,"tTPCTiltingZIROCOROCSideA_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), 0,0, "TPCTiltingZ" ,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPCTiltingZIROCOROCSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), 0,0, "TPCTiltingZ" ,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    //
+    fpar[2]=0;  // absolute  misalignment
+    sprintf(tname,"tTPCTiltingZSectorSideA_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), 0,0, "TPCTiltingZ" ,  0);
+    transformation->SetParams(0,0.1,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPCTiltingZSectorSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), 0,0, "TPCTiltingZ" ,  0);
+    transformation->SetParams(0,0.1,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+  }
+
+  for (Int_t i=1; i<=nsin;i++){
+    fpar[0]=0;  // cos frequency
+    fpar[1]=i;  // sinus frequncy
+    fpar[2]=1;  // relative misalignment
+    //
+    sprintf(tname,"tTPCTiltingZIROCOROCSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), 0,0, "TPCTiltingZ" ,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPCTiltingZIROCOROCSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), 0,0, "TPCTiltingZ" ,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    //
+    fpar[2]=0;  // absolute  misalignment
+    sprintf(tname,"tTPCTiltingZSectorSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), 0,0, "TPCTiltingZ" ,  0);
+    transformation->SetParams(0,0.1,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPCTiltingZSectorSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), 0,0, "TPCTiltingZ" ,  0);
+    transformation->SetParams(0,0.1,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+  }
 }
 
 
@@ -419,6 +1142,390 @@ void  AddLocalXYMisalignment(AliTPCkalmanFit *kalmanFit){
   kalmanFit->AddCalibration(transformation);
 }
 
+void  AddLocalXYMisalignmentSector(AliTPCkalmanFit *kalmanFit){
+  //
+  //
+  //
+  TVectorD fpar(10);
+  AliTPCTransformation * transformation=0;
+  Int_t fixSector =4;
+  //
+  for (Int_t isec=0; isec<36;isec++){
+    TBits mask(72);
+    mask[isec]=kTRUE;
+    char tname[1000];
+    //
+    sprintf(tname,"tTPClocalLxIROC%d",isec);
+    transformation = new AliTPCTransformation(tname, new TBits(mask), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.2,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPClocalLyIROC%d",isec);
+    transformation = new AliTPCTransformation(tname, new TBits(mask), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.2,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    
+    sprintf(tname,"tTPClocalRzIROC%d",isec);
+    transformation = new AliTPCTransformation(tname, new TBits(mask), "TPClocaldLydGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.2,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+
+  }
+  //
+  for (Int_t isec=0; isec<36;isec++){
+    if (isec%18==fixSector) continue;
+    TBits mask(72);
+    mask[isec]   =kTRUE;
+    mask[isec+36]=kTRUE;    
+    char tname[1000];
+    //
+    sprintf(tname,"tTPClocalLxSector%d",isec);
+    transformation = new AliTPCTransformation(tname, new TBits(mask), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.2,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    sprintf(tname,"tTPClocalLySector%d",isec);
+    transformation = new AliTPCTransformation(tname, new TBits(mask), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.2,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    
+    sprintf(tname,"tTPClocalRzSector%d",isec);
+    transformation = new AliTPCTransformation(tname, new TBits(mask), "TPClocaldLydGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.2,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+  }
+  
+
+}
+
+
+void  AddAlignOROCIROCFourier(AliTPCkalmanFit *kalmanFit, Int_t ncos, Int_t nsin){
+  //
+  //
+  //
+  TVectorD fpar(10);
+  AliTPCTransformation * transformation=0;
+
+  for (Int_t i=0; i<=ncos;i++){
+    char tname[1000];
+    fpar[0]=i;  // cos frequency
+    fpar[1]=0;  // no sinus
+    fpar[2]=1;  // relative misalignment
+    //
+    // Local X shift
+    //
+    sprintf(tname,"tTPClocalLxIROCOROCSideA_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldLxdGX","TPClocaldLxdGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalLxIROCOROCSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldLxdGX","TPClocaldLxdGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    // Local Y shift
+    //
+    sprintf(tname,"tTPClocalLyIROCOROCSideA_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalLyIROCOROCSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    //
+    // Z rotation
+    //
+    sprintf(tname,"tTPClocalRzIROCOROCSideA_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldRzdGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.3,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalRzIROCOROCSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldRzdGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.3,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+  }
+  //
+  for (Int_t i=1; i<=nsin;i++){
+    char tname[1000];
+    fpar[0]=0;  // cos frequency
+    fpar[1]=i;  // sinus frequency
+    fpar[2]=1;  // relative misalignment
+    //
+    // Local X shift
+    //
+    sprintf(tname,"tTPClocalLxIROCOROCSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldLxdGX","TPClocaldLxdGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalLxIROCOROCSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldLxdGX","TPClocaldLxdGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    // Local Y shift
+    //
+    sprintf(tname,"tTPClocalLyIROCOROCSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalLyIROCOROCSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    //
+    // Z rotation
+    //
+    sprintf(tname,"tTPClocalRzIROCOROCSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldRzdGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.3,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalRzIROCOROCSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldRzdGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.3,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+  }
+}
+
+void  AddAlignSectorFourier(AliTPCkalmanFit *kalmanFit, Int_t ncos, Int_t nsin){
+  //
+  //
+  //
+  TVectorD fpar(10);
+  AliTPCTransformation * transformation=0;
+
+  for (Int_t i=0; i<=ncos;i++){
+    char tname[1000];
+    fpar[0]=i;  // cos frequency
+    fpar[1]=0;  // no sinus
+    fpar[2]=0;  // absolute misalignment
+    if (i>0){
+      //
+      // A side is reference
+      // local x 
+      sprintf(tname,"tTPClocalLxSectorSideA_Cos%d",i);
+      transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldLxdGX","TPClocaldLxdGY",0,  0);
+      transformation->SetParams(0,0.03,0,&fpar);
+      kalmanFit->AddCalibration(transformation);
+      if (i>1){
+       //
+       // Local Y shift
+       //
+       sprintf(tname,"tTPClocalLySectorSideA_Cos%d",i);
+       transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+       transformation->SetParams(0,0.03,0,&fpar);
+       kalmanFit->AddCalibration(transformation);
+      }
+      //
+      //
+    }
+    //
+    // C side to vary
+    // local x 
+    sprintf(tname,"tTPClocalLxSectorSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldLxdGX","TPClocaldLxdGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    // Local Y shift
+    //
+    sprintf(tname,"tTPClocalLySectorSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //    
+    //
+    // Z rotation - independent
+    //
+    sprintf(tname,"tTPClocalRzSectorSideA_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldRzdGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.3,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalRzSectorSideC_Cos%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldRzdGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.3,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+  }
+
+
+
+
+  //
+  //
+  //
+  for (Int_t i=1; i<=nsin;i++){
+    char tname[1000];
+    fpar[0]=0;  // non cos frequency
+    fpar[1]=i;  // sinus frequency
+    fpar[2]=0;  // absolute misalignment
+    //
+    // Local X shift
+    //
+    sprintf(tname,"tTPClocalLxSectorSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldLxdGX","TPClocaldLxdGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalLxSectorSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldLxdGX","TPClocaldLxdGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    // Local Y shift
+    //
+    sprintf(tname,"tTPClocalLySectorSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalLySectorSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldLydGX","TPClocaldLydGY",0,  0);
+    transformation->SetParams(0,0.03,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    //
+    //
+    //
+    // Z rotation
+    //
+    sprintf(tname,"tTPClocalRzSectorSideA_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(0), "TPClocaldRzdGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.3,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+    sprintf(tname,"tTPClocalRzSectorSideC_Sin%d",i);
+    transformation = new AliTPCTransformation(tname, AliTPCTransformation::BitsSide(1), "TPClocaldRzdGX","TPClocaldRzdGY",0,  0);
+    transformation->SetParams(0,0.3,0,&fpar);
+    kalmanFit->AddCalibration(transformation);
+  }
+}
+
+void SelectPixel(){
+  for (Int_t i=0;i<8;i++){
+    kalmanFitNew->fLinearTrackDelta[i]->GetAxis(2)->SetRangeUser(-10,10);
+    kalmanFitOrig->fLinearTrackDelta[i]->GetAxis(2)->SetRangeUser(-10,10);
+    kalmanFitNew->fLinearTrackDelta[i]->GetAxis(3)->SetRangeUser(-15,15);
+    kalmanFitOrig->fLinearTrackDelta[i]->GetAxis(3)->SetRangeUser(-15,15);
+  }
+}
+
+void SelectNonPixelA(){
+  for (Int_t i=0;i<8;i++){
+    kalmanFitNew->fLinearTrackDelta[i]->GetAxis(2)->SetRangeUser(10,250);
+    kalmanFitOrig->fLinearTrackDelta[i]->GetAxis(2)->SetRangeUser(10,250);
+    kalmanFitNew->fLinearTrackDelta[i]->GetAxis(3)->SetRangeUser(0,250);
+    kalmanFitOrig->fLinearTrackDelta[i]->GetAxis(3)->SetRangeUser(0,250);
+  }
+}
+
+void SelectNonPixelC(){
+  for (Int_t i=0;i<8;i++){
+    kalmanFitNew->fLinearTrackDelta[i]->GetAxis(2)->SetRangeUser(10,250);
+    kalmanFitOrig->fLinearTrackDelta[i]->GetAxis(2)->SetRangeUser(10,250);
+    kalmanFitNew->fLinearTrackDelta[i]->GetAxis(3)->SetRangeUser(-250,0);
+    kalmanFitOrig->fLinearTrackDelta[i]->GetAxis(3)->SetRangeUser(-250,0);
+  }
+}
+
+
+void DumpQA1D(  TObjArray &arrayOut){
+  //
+  // 
+  // 
+  TF1 fg("fg","gaus");
+  TMatrixD sideARMS(8,2);
+  TMatrixD sideCRMS(8,2);
+  TMatrixD sideACRMS(8,2);
+  TH1 *his=0;
+  //
+  // A side
+  //
+  SelectNonPixelA();
+  for (Int_t i=0; i<8;i++){
+    his = kalmanFitOrig->fLinearTrackDelta[i]->Projection(0);
+    his->Fit(&fg,"","", -0.15,0.15);
+    sideARMS(i,0) = fg.GetParameter(2);
+    his->SetDirectory(0);
+    his->SetName(Form("Original SideA_%s",his->GetName()));
+    his->SetTitle(Form("Original SideA_%s",his->GetTitle()));
+    arrayOut.AddLast(his);
+    his = kalmanFitNew->fLinearTrackDelta[i]->Projection(0);
+    his->Fit(&fg,"","", -0.15,0.15);
+    sideARMS(i,1) = fg.GetParameter(2);
+    his->SetDirectory(0);
+    his->SetName(Form("Aligned SideA_%s",his->GetName()));
+    his->SetTitle(Form("Aligned SideA_%s",his->GetTitle()));
+    arrayOut.AddLast(his);
+  }
+  //
+  // C side
+  //
+  SelectNonPixelC();
+  for (Int_t i=0; i<8;i++){
+    his = kalmanFitOrig->fLinearTrackDelta[i]->Projection(0);
+    his->Fit(&fg,"","", -0.15,0.15);
+    sideCRMS(i,0) = fg.GetParameter(2);
+    his->SetDirectory(0);
+    his->SetName(Form("Original SideC_%s",his->GetName()));
+    his->SetTitle(Form("Original SideC_%s",his->GetTitle()));
+    arrayOut.AddLast(his);
+    his = kalmanFitNew->fLinearTrackDelta[i]->Projection(0);
+    his->Fit(&fg,"","", -0.15,0.15);
+    sideCRMS(i,1) = fg.GetParameter(2);
+    his->SetDirectory(0);
+    his->SetName(Form("Aligned SideC_%s",his->GetName()));
+    his->SetTitle(Form("Aligned SideC_%s",his->GetTitle()));
+    arrayOut.AddLast(his);
+  }
+  //
+  // AC side
+  //
+  SelectPixel();
+  for (Int_t i=0; i<8;i++){
+    his = kalmanFitOrig->fLinearTrackDelta[i]->Projection(0);
+    his->Fit(&fg,"","", -0.15,0.15);
+    sideACRMS(i,0) = fg.GetParameter(2);
+    his->SetDirectory(0);
+    his->SetName(Form("Original SideAC_%s",his->GetName()));
+    his->SetTitle(Form("Original SideAC_%s",his->GetTitle()));
+    arrayOut.AddLast(his);
+    his = kalmanFitNew->fLinearTrackDelta[i]->Projection(0);
+    his->Fit(&fg,"","", -0.15,0.15);
+    sideACRMS(i,1) = fg.GetParameter(2);
+    his->SetDirectory(0);
+    his->SetName(Form("Aligned SideC_%s",his->GetName()));
+    his->SetTitle(Form("Aligned SideC_%s",his->GetTitle()));
+    arrayOut.AddLast(his);
+  }
+  printf("DumQA\n");
+  sideARMS.Print();
+  sideCRMS.Print();
+  sideACRMS.Print();
+}
+
+void MakeFolders(TObjArray * arrayOut){
+  //
+  //
+  //
+  TFolder *folderBase = new TFolder("TPC align","TPC align");
+  //
+  //
+  TString maskDelta[8];
+  TString maskAlign[2]={"Orig","Alig");
+  for (Int_t i=0; i<8;i++){
+    maskDelta[i] = kalmanFitNew->fLinearTrackDelta[i]->GetName();
+  }
+  
+  Int_t entries = arrayOut->GetEntries();
+  //
+}
+
+
+
+
 void MergeKalman(const char * list = "kalmanFit.list"){
   //
   //
@@ -426,33 +1533,104 @@ void MergeKalman(const char * list = "kalmanFit.list"){
   ifstream in;
   in.open(list);
   TString currentFile;
-  kalmanFit0= 0;
+  kalmanFitNew= 0;
   Int_t counter=0;
   while(in.good()) {
-    in >> currentFile;
+    //
+    // calibrated
+    //
+    in >> currentFile;    
     printf("%d\t%d\t%s\n", counter,currentFile.Length(),currentFile.Data());
     if (currentFile.Length()==0) continue;
     TFile * ffit = TFile::Open(currentFile.Data());
+    TEntryList * tlist = (TEntryList*) ffit->Get("eventList");
+    TMatrixD * cMatrix = (TMatrixD*) ffit->Get("cutMarix");
+    if (tlist&&cMatrix){
+      printf("Track entries=%d\n",tlist->GetN());
+      if (cMatrix->Sum()<=0.00000001) {
+       printf("Problem with track selection\n");
+       continue;
+      }
+    }else{
+      printf("Problem with track selection\n");
+      continue;
+    }
+    //
+
     AliTPCkalmanFit * fit = ( AliTPCkalmanFit *)ffit->Get("kalmanFit");
     if (!fit) continue;
-    if (!kalmanFit0) {kalmanFit0= fit; continue;};
-    kalmanFit0->Add(fit);
+    if (!kalmanFitNew) {kalmanFitNew= fit; continue;};
+    kalmanFitNew->Add(fit);
+    printf("Selected entries=%f\n",fit->fLinearTrackDelta[0]->GetEntries());
+    //delete tlist;
+    //delete cMatrix;
+    delete fit;
+    delete ffit;
+    //
+    // original
+    //
+    currentFile.ReplaceAll("TPC","TPCOrig");
+    printf("%d\t%d\t%s\n", counter,currentFile.Length(),currentFile.Data());
+    if (currentFile.Length()==0) continue;
+    ffit = TFile::Open(currentFile.Data());
+    fit = ( AliTPCkalmanFit *)ffit->Get("kalmanFitOrig");
+    if (!fit) continue;
+    if (!kalmanFitOrig) {kalmanFitOrig= fit; continue;};
+    kalmanFitOrig->Add(fit);
     delete fit;
     delete ffit;
     counter++;
   }
+  //
+  // save merged results
+  //
+  TFile f("mergeKalmanFit.root","recreate");
+  kalmanFitNew->Write("kalmanFitNew");
+  kalmanFitOrig->Write("kalmanFitOrig");
+  f.Close();
 }
 
 
+
 /*
-  myvar=0; 
-  ntracks=10000000
+  Example - submit alignment as batch jobs
+  ifile=0; 
+  ntracksSkip=200
+  ntracksSkipOffset=0
+  nclustersSkip=2
+  nclustersSkipOffset=0
+  ntracks=1000000
+  ndump=5
+  isTest=0
   bDir=`pwd`
-  while [ $myvar -ne 190 ] ; do mkdir kalmanDir$myvar; cd kalmanDir$myvar; cp $bDir/align.txt .;  bsub -q proof command aliroot  -q -b  "CalibAlignKalman.C($ntracks,5,$myvar)" ; myvar=$(( $myvar + 5 )) ; echo $myvar ; cd $bDir; echo $bDir; done
+  ver=aaa;
+
+  while [ $ntracksSkipOffset -lt $ntracksSkip ] ; do
+    nclustersSkipOffset=0;
+    while [ $nclustersSkipOffset -lt $nclustersSkip ] ; do
+      echo Tr $ntracksSkipOffset  Cl $nclustersSkipOffset;     
+      ver=kalmanDirTrack$ntracksSkipOffset$nclustersSkipOffset
+      echo New Directory $ver
+      mkdir $ver; 
+      cd $ver; 
+      cp $bDir/align.txt . ;  
+      ln -sf $bDir/kalmanFitApply.root . ;
+      echo  aliroot  -q -b  "$ALICE_ROOT/TPC/CalibMacros/CalibAlignKalman.C($ntracks,10000,0,$ndump,$ntracksSkip,$ntracksSkipOffset, $nclustersSkip,$nclustersSkipOffset,$isTest)" ; 
+      bsub -q alice-t3_8h -o `pwd`/output.log command aliroot  -q -b  "$ALICE_ROOT/TPC/CalibMacros/CalibAlignKalman.C($ntracks,10000,0,$ndump,$ntracksSkip,$ntracksSkipOffset, $nclustersSkip,$nclustersSkipOffset,$isTest)"  ; 
+      nclustersSkipOffset=$(( $nclustersSkipOffset + 1 ))
+      cd $bDir; 
+      echo $bDir; 
+    done;
+    cd $bDir; 
+    echo $bDir; 
+    ntracksSkipOffset=$(( $ntracksSkipOffset + 1 ))
+    echo Tr $ntracksSkipOffset;   
+done
 
-*/
 
 
+*/
+