]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCcalibAlign.cxx
Error changed to info
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibAlign.cxx
index 249247f05b7452a9cf1add22819381f52fe8cd4b..5c7962a9686a2bc0a9de1ea7dd574ac05c2d9644 100644 (file)
 #include "AliTPCTracklet.h"
 #include "TH1D.h"
 #include "TH2F.h"
+#include "THnSparse.h"
 #include "TVectorD.h"
 #include "TTreeStream.h"
 #include "TFile.h"
 #include "AliTPCseed.h"
 #include "AliTracker.h"
 #include "TClonesArray.h"
-#include "AliExternalComparison.h"
 #include "AliLog.h"
 #include "TFile.h"
 #include "TProfile.h"
 #include "TCanvas.h"
-#include "TLegend.h"
-
+#include "TDatabasePDG.h"
 
 #include "TTreeStream.h"
-#include <iostream>
+#include "Riostream.h"
 #include <sstream>
 using namespace std;
 
@@ -181,7 +180,6 @@ AliTPCcalibAlign::AliTPCcalibAlign()
      fMatrixArray9(72*72),
      fMatrixArray6(72*72),
      fCombinedMatrixArray6(72),
-     fCompTracklet(0),             // tracklet comparison
      fNoField(kFALSE),
      fXIO(0),
      fXmiddle(0),
@@ -207,6 +205,14 @@ AliTPCcalibAlign::AliTPCcalibAlign()
   fXquadrant = roc->GetPadRowRadii(36,53);
   fXmiddle   = ( roc->GetPadRowRadii(0,0)+roc->GetPadRowRadii(36,roc->GetNRows(36)-1))*0.5;
   fXIO       = ( roc->GetPadRowRadii(0,roc->GetNRows(0)-1)+roc->GetPadRowRadii(36,0))*0.5;
+  fClusterDelta[0]=0;   // cluster residuals -  Y
+  fClusterDelta[1]=0;   // cluster residuals -  Z
+  
+  
+  fTrackletDelta[0]=0;   // tracklet residuals
+  fTrackletDelta[1]=0;   // tracklet residuals
+  fTrackletDelta[2]=0;   // tracklet residuals 
+  fTrackletDelta[3]=0;   // tracklet residuals
 }
 
 AliTPCcalibAlign::AliTPCcalibAlign(const Text_t *name, const Text_t *title)
@@ -228,7 +234,6 @@ AliTPCcalibAlign::AliTPCcalibAlign(const Text_t *name, const Text_t *title)
    fMatrixArray9(72*72),
    fMatrixArray6(72*72),
    fCombinedMatrixArray6(72),
-   fCompTracklet(0),             // tracklet comparison
    fNoField(kFALSE),
    fXIO(0),
    fXmiddle(0),
@@ -257,8 +262,13 @@ AliTPCcalibAlign::AliTPCcalibAlign(const Text_t *name, const Text_t *title)
   fXquadrant = roc->GetPadRowRadii(36,53);
   fXmiddle   = ( roc->GetPadRowRadii(0,0)+roc->GetPadRowRadii(36,roc->GetNRows(36)-1))*0.5;
   fXIO       = ( roc->GetPadRowRadii(0,roc->GetNRows(0)-1)+roc->GetPadRowRadii(36,0))*0.5;
+  fClusterDelta[0]=0;   // cluster residuals
+  fClusterDelta[1]=0;   // cluster residuals
 
-
+  fTrackletDelta[0]=0;   // tracklet residuals
+  fTrackletDelta[1]=0;   // tracklet residuals
+  fTrackletDelta[2]=0;   // tracklet residuals 
+  fTrackletDelta[3]=0;   // tracklet residuals
 }
 
 
@@ -283,7 +293,6 @@ AliTPCcalibAlign::AliTPCcalibAlign(const AliTPCcalibAlign &align)
    fMatrixArray9(align.fMatrixArray9),
    fMatrixArray6(align.fMatrixArray6),
    fCombinedMatrixArray6(align.fCombinedMatrixArray6),
-   fCompTracklet(align.fCompTracklet),             // tracklet comparison
    fNoField(align.fNoField),
    fXIO(align.fXIO),   
    fXmiddle(align.fXmiddle),   
@@ -363,6 +372,13 @@ AliTPCcalibAlign::AliTPCcalibAlign(const AliTPCcalibAlign &align)
     fSectorParamC = (TMatrixD*)align.fSectorParamA->Clone();
     fSectorParamC = (TMatrixD*)align.fSectorCovarA->Clone();
   }
+  fClusterDelta[0]=0;   // cluster residuals
+  fClusterDelta[1]=0;   // cluster residuals
+
+  fTrackletDelta[0]=0;   // tracklet residuals
+  fTrackletDelta[1]=0;   // tracklet residuals
+  fTrackletDelta[2]=0;   // tracklet residuals 
+  fTrackletDelta[3]=0;   // tracklet residuals
 }
 
 
@@ -412,12 +428,19 @@ AliTPCcalibAlign::~AliTPCcalibAlign() {
   fMatrixArray9.Delete();     // array of transnformtation matrix
   fMatrixArray6.Delete();     // array of transnformtation matrix 
 
-  if (fCompTracklet) delete fCompTracklet;
 
   fArraySectorIntParam.SetOwner(kTRUE); // array of sector alignment parameters
   fArraySectorIntCovar.SetOwner(kTRUE); // array of sector alignment covariances 
   fArraySectorIntParam.Delete(); // array of sector alignment parameters
   fArraySectorIntCovar.Delete(); // array of sector alignment covariances 
+  for (Int_t i=0; i<2; i++){
+    delete fClusterDelta[i];   // cluster residuals
+  }
+
+  for (Int_t i=0; i<4; i++){
+    delete fTrackletDelta[i];   // tracklet residuals
+  }
+
 
 }
 
@@ -425,17 +448,42 @@ void AliTPCcalibAlign::Process(AliESDEvent *event) {
   //
   // Process pairs of cosmic tracks
   //
+  if (!fClusterDelta[0])  MakeResidualHistos();
+  if (!fTrackletDelta[0])  MakeResidualHistosTracklet();
+  //
+  fCurrentEvent=event;
   ExportTrackPoints(event);  // export track points for external calibration 
-  const Int_t kMaxTracks =50;
+  const Int_t kMaxTracks =6;
   const Int_t kminCl = 40;
-  AliESDfriend *ESDfriend=static_cast<AliESDfriend*>(event->FindListObject("AliESDfriend"));
-  if (!ESDfriend) return;
+  AliESDfriend *eESDfriend=static_cast<AliESDfriend*>(event->FindListObject("AliESDfriend"));
+  if (!eESDfriend) return;
   Int_t ntracks=event->GetNumberOfTracks(); 
   Float_t dca0[2];
   Float_t dca1[2];
   //
   //
+  // process seeds
   //
+  for (Int_t i0=0;i0<ntracks;++i0) {
+    AliESDtrack *track0 = event->GetTrack(i0);
+    AliESDfriendTrack *friendTrack = 0;
+    TObject *calibObject=0;
+    AliTPCseed *seed0 = 0;
+    //
+    friendTrack = (AliESDfriendTrack *)eESDfriend->GetTrack(i0);;
+    if (!friendTrack) continue;
+    for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) {
+      if ((seed0=dynamic_cast<AliTPCseed*>(calibObject))) break;
+    }
+    if (!seed0) continue;
+    fCurrentTrack=track0;
+    fCurrentFriendTrack=friendTrack;
+    fCurrentSeed=seed0;
+    fCurrentEvent=event;
+    ProcessSeed(seed0);
+  }
+  //
+  // process cosmic pairs
   //
   if (ntracks>kMaxTracks) return;  
   //
@@ -454,22 +502,25 @@ void AliTPCcalibAlign::Process(AliESDEvent *event) {
       // fast cuts on dca and theta
       //      if (TMath::Abs(dca1[0]+dca0[0])>15) continue;
       //      if (TMath::Abs(dca1[1]-dca0[1])>15) continue;
-      //      if (TMath::Abs(track0->GetParameter()[3]+track1->GetParameter()[3])>0.1) continue;
+      if (TMath::Abs(track0->GetParameter()[3]+track1->GetParameter()[3])>0.1) continue;
       //
       AliESDfriendTrack *friendTrack = 0;
       TObject *calibObject=0;
       AliTPCseed *seed0 = 0,*seed1=0;
       //
-      friendTrack = (AliESDfriendTrack *)ESDfriend->GetTrack(i0);;
+      friendTrack = (AliESDfriendTrack *)eESDfriend->GetTrack(i0);;
+      if (!friendTrack) continue;
       for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) {
        if ((seed0=dynamic_cast<AliTPCseed*>(calibObject))) break;
       }
-      friendTrack = (AliESDfriendTrack *)ESDfriend->GetTrack(i1);;
+      friendTrack = (AliESDfriendTrack *)eESDfriend->GetTrack(i1);;
+      if (!friendTrack) continue;
       for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) {
        if ((seed1=dynamic_cast<AliTPCseed*>(calibObject))) break;
       }
-
       if (!seed0) continue;
+      //
+      //
       if (!seed1) continue;
       Int_t nclsectors0[72], nclsectors1[72];
       for (Int_t isec=0;isec<72;isec++){
@@ -553,19 +604,31 @@ void  AliTPCcalibAlign::ExportTrackPoints(AliESDEvent *event){
   // Export track points for alignment - calibration
   // export space points for pairs of tracks if possible
   //
-  AliESDfriend *ESDfriend=static_cast<AliESDfriend*>(event->FindListObject("AliESDfriend"));
-  if (!ESDfriend) return;
+  AliESDfriend *eESDfriend=static_cast<AliESDfriend*>(event->FindListObject("AliESDfriend"));
+  if (!eESDfriend) return;
   Int_t ntracks=event->GetNumberOfTracks();
+  Int_t kMaxTracks=4;   // maximal number of tracks for cosmic pairs
+  Int_t kMinVertexTracks=5;   // maximal number of tracks for vertex mesurement
+
   //cuts
   const Int_t kminCl     = 60;
   const Int_t kminClSum  = 120;
-  //  const Double_t kDistY  = 5;
+  //const Double_t kDistY  = 5;
   // const Double_t kDistZ  = 40;
   const Double_t kDistTh = 0.05;
+  const Double_t kDistThS = 0.002;
   const Double_t kDist1Pt = 0.1;
+  const Double_t kMaxD0 =3;  // max distance to the primary vertex
+  const Double_t kMaxD1 =5;  // max distance to the primary vertex
+  const AliESDVertex *tpcVertex = 0;
+  // get the primary vertex TPC
+  if (ntracks>kMinVertexTracks) {
+    tpcVertex = event->GetPrimaryVertexSPD();
+    if (tpcVertex->GetNContributors()<kMinVertexTracks) tpcVertex=0;
+  }
   //
   Float_t dca0[2];
-  Float_t dca1[2];
+  //  Float_t dca1[2];
   Int_t index0=0,index1=0;
   //
   for (Int_t i0=0;i0<ntracks;++i0) {
@@ -573,20 +636,28 @@ void  AliTPCcalibAlign::ExportTrackPoints(AliESDEvent *event){
     if (!track0) continue;
     if ((track0->GetStatus() & AliESDtrack::kTPCrefit)==0) continue;
     if (track0->GetOuterParam()==0) continue;
+    if (track0->GetInnerParam()==0) continue;
+    if (TMath::Abs(track0->GetInnerParam()->GetSigned1Pt()-track0->GetOuterParam()->GetSigned1Pt())>kDist1Pt) continue;
+    if (TMath::Abs(track0->GetInnerParam()->GetSigned1Pt())>kDist1Pt) continue;
+    if (TMath::Abs(track0->GetInnerParam()->GetTgl()-track0->GetOuterParam()->GetTgl())>kDistThS) continue;
     AliESDtrack *track1P = 0;
     if (track0->GetTPCNcls()<kminCl) continue;
     track0->GetImpactParameters(dca0[0],dca0[1]);
     index0=i0;
     index1=-1;
     //
-    for (Int_t i1=0;i1<ntracks;++i1) {
+    if (ntracks<kMaxTracks) for (Int_t i1=i0+1;i1<ntracks;++i1) {
       if (i0==i1) continue;
       AliESDtrack *track1 = event->GetTrack(i1);
       if (!track1) continue;
       if ((track1->GetStatus() & AliESDtrack::kTPCrefit)==0) continue;
       if (track1->GetOuterParam()==0) continue;
+      if (track1->GetInnerParam()==0) continue;
       if (track1->GetTPCNcls()<kminCl) continue;
-      track1->GetImpactParameters(dca1[0],dca1[1]);
+      if (TMath::Abs(track1->GetInnerParam()->GetSigned1Pt()-track1->GetOuterParam()->GetSigned1Pt())>kDist1Pt) continue;
+      if (TMath::Abs(track1->GetInnerParam()->GetTgl()-track1->GetOuterParam()->GetTgl())>kDistThS) continue;
+      if (TMath::Abs(track1->GetInnerParam()->GetSigned1Pt())>kDist1Pt) continue;
+      //track1->GetImpactParameters(dca1[0],dca1[1]);
       //if (TMath::Abs(dca1[0]-dca0[0])>kDistY) continue;
       //if (TMath::Abs(dca1[1]-dca0[1])>kDistZ) continue;
       if (TMath::Abs(track0->GetTgl()+track1->GetTgl())>kDistTh) continue;
@@ -598,12 +669,14 @@ void  AliTPCcalibAlign::ExportTrackPoints(AliESDEvent *event){
     TObject *calibObject=0;
     AliTPCseed *seed0 = 0,*seed1=0;
     //
-    friendTrack = (AliESDfriendTrack *)ESDfriend->GetTrack(index0);;
+    friendTrack = (AliESDfriendTrack *)eESDfriend->GetTrack(index0);;
+    if (!friendTrack) continue;
     for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) {
       if ((seed0=dynamic_cast<AliTPCseed*>(calibObject))) break;
     }
     if (index1>0){
-      friendTrack = (AliESDfriendTrack *)ESDfriend->GetTrack(index1);;
+      friendTrack = (AliESDfriendTrack *)eESDfriend->GetTrack(index1);;
+      if (!friendTrack) continue;
       for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) {
        if ((seed1=dynamic_cast<AliTPCseed*>(calibObject))) break;
       }
@@ -615,6 +688,20 @@ void  AliTPCcalibAlign::ExportTrackPoints(AliESDEvent *event){
     if (npoints<kminClSum) continue;    
     Int_t cpoint=0;
     AliTrackPointArray array(npoints);    
+    if (tpcVertex){
+      Double_t dxyz[3]={0,0,0};
+      Double_t dc[6]={0,0,0};
+      tpcVertex->GetXYZ(dxyz);
+      tpcVertex->GetCovarianceMatrix(dc);
+      Float_t xyz[3]={dxyz[0],dxyz[1],dxyz[2]};
+      Float_t cov[6]={dc[0]+1,dc[1],dc[2]+1,dc[3],dc[4],dc[5]+100.}; 
+      AliTrackPoint point(xyz,cov,73);  // add point to not existing volume
+      Float_t dtpc[2],dcov[3];
+      track0->GetImpactParametersTPC(dtpc,dcov);
+      if (TMath::Abs(dtpc[0])>kMaxD0) continue;
+      if (TMath::Abs(dtpc[1])>kMaxD1) continue;
+    }
+
     if (seed0) for (Int_t icl = 0; icl<160; icl++){
       AliTPCclusterMI *cluster=seed0->GetClusterPointer(icl);
       if (!cluster) continue;
@@ -623,7 +710,7 @@ void  AliTPCcalibAlign::ExportTrackPoints(AliESDEvent *event){
       cluster->GetGlobalXYZ(xyz);
       cluster->GetGlobalCov(cov);
       AliTrackPoint point(xyz,cov,cluster->GetDetector());
-      array.AddPoint(npoints, &point);
+      array.AddPoint(npoints, &point); 
       if (cpoint>=npoints) continue;  //shoul not happen
       array.AddPoint(cpoint, &point);
       cpoint++;
@@ -646,11 +733,16 @@ void  AliTPCcalibAlign::ExportTrackPoints(AliESDEvent *event){
     //
     TTreeSRedirector *cstream = GetDebugStreamer();
     if (cstream){
+      Bool_t isVertex=(tpcVertex)? kTRUE:kFALSE;
+      Double_t tof0=track0->GetTOFsignal();
+      Double_t tof1=(track1P) ?  track1P->GetTOFsignal(): 0;
       static AliExternalTrackParam dummy;
       AliExternalTrackParam *p0In  = &dummy;
       AliExternalTrackParam *p1In  = &dummy;
       AliExternalTrackParam *p0Out = &dummy;
       AliExternalTrackParam *p1Out = &dummy;
+      AliESDVertex vdummy;
+      AliESDVertex *pvertex= (tpcVertex)? (AliESDVertex *)tpcVertex: &vdummy;
       if (track0) {
        p0In= new AliExternalTrackParam(*track0);
        p0Out=new AliExternalTrackParam(*(track0->GetOuterParam()));
@@ -667,7 +759,12 @@ void  AliTPCcalibAlign::ExportTrackPoints(AliESDEvent *event){
        "trigger="<<fTrigger<<      //  trigger
        "triggerClass="<<&fTriggerClass<<      //  trigger
        "mag="<<fMagF<<             //  magnetic field
+       "pvertex.="<<pvertex<<      // vertex
        //
+       "isVertex="<<isVertex<<     // flag is with prim vertex
+       "tof0="<<tof0<<             // tof signal 0
+       "tof1="<<tof1<<             // tof signal 1
+       "seed0.="<<seed0<<          // track info
        "ntracks="<<ntracks<<       // number of tracks
        "ncont="<<ncont<<           // number of contributors
        "p0In.="<<p0In<<              // track parameters0 
@@ -683,12 +780,13 @@ void  AliTPCcalibAlign::ExportTrackPoints(AliESDEvent *event){
 
 
 
-void AliTPCcalibAlign::Process(AliTPCseed *seed) {
+void AliTPCcalibAlign::ProcessSeed(AliTPCseed *seed) {
   //
   // 
   //
   // make a kalman tracklets out of seed
   //
+  UpdateClusterDeltaField(seed);
   TObjArray tracklets=
     AliTPCTracklet::CreateTracklets(seed,AliTPCTracklet::kKalman,
                                    kFALSE,20,4);
@@ -704,7 +802,7 @@ void AliTPCcalibAlign::Process(AliTPCseed *seed) {
       AliTPCTracklet *t2=static_cast<AliTPCTracklet*>(tracklets[i2]);
       AliExternalTrackParam *common1=0,*common2=0;
       if (AliTPCTracklet::PropagateToMeanX(*t1,*t2,common1,common2)){
-       ProcessTracklets(*common1,*common2,seed, t1->GetSector(),t2->GetSector());
+       ProcessTracklets(*common1,*common2,seed, t1->GetSector(),t2->GetSector());      
        UpdateAlignSector(seed,t1->GetSector());
       }
       delete common1;
@@ -760,6 +858,7 @@ void AliTPCcalibAlign::ProcessTracklets(const AliExternalTrackParam &tp1,
   //
   // Process function to fill fitters
   //
+  if (!seed) return;
   Double_t t1[10],t2[10];
   Double_t &x1=t1[0], &y1=t1[1], &z1=t1[3], &dydx1=t1[2], &dzdx1=t1[4];
   Double_t &x2=t2[0], &y2=t2[1], &z2=t2[3], &dydx2=t2[2], &dzdx2=t2[4];
@@ -812,8 +911,9 @@ void AliTPCcalibAlign::ProcessTracklets(const AliExternalTrackParam &tp1,
   //
   Int_t accept       =   AcceptTracklet(tp1,tp2);  
   Int_t acceptLinear =   AcceptTracklet(parLine1,parLine2);
-  if (fStreamLevel>1 && seed){
+
+
+  if (fStreamLevel>1){
     TTreeSRedirector *cstream = GetDebugStreamer();
     if (cstream){
       static TVectorD vec1(5);
@@ -854,11 +954,13 @@ void AliTPCcalibAlign::ProcessTracklets(const AliExternalTrackParam &tp1,
     // use Linear fit
     //
     if (nl1>10 && nl2>10 &&(acceptLinear==0)){
-      if (seed) ProcessDiff(tp1,tp2, seed,s1,s2);
+      ProcessDiff(tp1,tp2, seed,s1,s2);
       if (TMath::Abs(parLine1[2])<0.8 &&TMath::Abs(parLine1[2])<0.8 ){ //angular cut
        FillHisto(parLine1,parLine2,s1,s2);  
        ProcessAlign(parLine1,parLine2,s1,s2);
-       UpdateKalman(s1,s2,par1, cov1, par2, cov2);
+       FillHisto((AliExternalTrackParam*)&tp1,(AliExternalTrackParam*)&tp2,s1,s2);
+       FillHisto((AliExternalTrackParam*)&tp2,(AliExternalTrackParam*)&tp1,s2,s1);
+       //UpdateKalman(s1,s2,par1, cov1, par2, cov2); - OBSOLETE to be removed - 50 % of time here
       }
     }
   }
@@ -869,7 +971,9 @@ void AliTPCcalibAlign::ProcessTracklets(const AliExternalTrackParam &tp1,
     //
     // use Kalman if mag field
     //
-    if (seed) ProcessDiff(tp1,tp2, seed,s1,s2);
+    ProcessDiff(tp1,tp2, seed,s1,s2);
+    FillHisto((AliExternalTrackParam*)&tp1,(AliExternalTrackParam*)&tp2,s1,s2);
+    FillHisto((AliExternalTrackParam*)&tp2,(AliExternalTrackParam*)&tp1,s2,s1);
     FillHisto(t1,t2,s1,s2);  
     ProcessAlign(t1,t2,s1,s2);
   }
@@ -881,98 +985,17 @@ void AliTPCcalibAlign::ProcessAlign(Double_t * t1,
   //
   // Do intersector alignment
   //
-  Process12(t1,t2,GetOrMakeFitter12(s1,s2));
-  Process9(t1,t2,GetOrMakeFitter9(s1,s2));
+  //Process12(t1,t2,GetOrMakeFitter12(s1,s2));
+  //Process9(t1,t2,GetOrMakeFitter9(s1,s2));
   Process6(t1,t2,GetOrMakeFitter6(s1,s2));
   ++fPoints[GetIndex(s1,s2)];
 }
 
-void AliTPCcalibAlign::ProcessTree(TTree * chainTracklet, AliExternalComparison *comp){
-  //
-  // Process the debug streamer tree
-  // Possible to modify selection criteria
-  // Used with entry list
-  //
-  TTreeSRedirector * cstream = new TTreeSRedirector("aligndump.root");
-
-  AliTPCcalibAlign *align = this;
-  //
-  TVectorD * vec1 = 0;
-  TVectorD * vec2 = 0;
-  AliExternalTrackParam * tp1 = 0;
-  AliExternalTrackParam * tp2 = 0;  
-  Int_t      s1 = 0;
-  Int_t      s2 = 0;                           
-  Int_t npoints =0;
-  {
-    Int_t entries=chainTracklet->GetEntries();
-    for (Int_t i=0; i< entries; i++){
-      chainTracklet->GetBranch("tp1.")->SetAddress(&tp1);
-      chainTracklet->GetBranch("tp2.")->SetAddress(&tp2);
-      chainTracklet->GetBranch("v1.")->SetAddress(&vec1);
-      chainTracklet->GetBranch("v2.")->SetAddress(&vec2);
-      chainTracklet->GetBranch("s1")->SetAddress(&s1);
-      chainTracklet->GetBranch("s2")->SetAddress(&s2);      
-      chainTracklet->GetEntry(i);
-      if (!vec1) continue;
-      if (!vec2) continue;
-      if (!tp1) continue;
-      if (!tp2) continue;
-      if (!vec1->GetMatrixArray()) continue;
-      if (!vec2->GetMatrixArray()) continue;
-      // make a local copy
-      AliExternalTrackParam par1(*tp1);
-      AliExternalTrackParam par2(*tp2);
-      TVectorD svec1(*vec1);
-      TVectorD svec2(*vec2);
-      //
-      if (s1==s2) continue;
-      if (i%100==0) printf("%d\t%d\t%d\t%d\t\n",i, npoints,s1,s2);
-      AliExternalTrackParam  cpar1(par1);
-      AliExternalTrackParam  cpar2(par2);      
-      Constrain1Pt(cpar1,par2,fNoField);
-      Constrain1Pt(cpar2,par1,fNoField);
-      Bool_t acceptComp = kFALSE;
-      if (comp) acceptComp=comp->AcceptPair(&par1,&par2);
-      if (comp) acceptComp&=comp->AcceptPair(&cpar1,&cpar2);
-      //
-      Int_t reject =   align->AcceptTracklet(par1,par2);
-      Int_t rejectC =align->AcceptTracklet(cpar1,cpar2); 
-
-      if (1||fStreamLevel>0){
-       (*cstream)<<"Tracklet"<<
-         "s1="<<s1<<
-         "s2="<<s2<<
-         "reject="<<reject<<
-         "rejectC="<<rejectC<<
-         "acceptComp="<<acceptComp<<
-         "tp1.="<<&par1<<
-         "tp2.="<<&par2<<      
-         "ctp1.="<<&cpar1<<
-         "ctp2.="<<&cpar2<<
-         "v1.="<<&svec1<<
-         "v2.="<<&svec2<<
-         "\n";
-      }
-      //
-      if (fNoField){
-       //
-       //
-      }
-      if (acceptComp) comp->Process(&cpar1,&cpar2);
-      //
-      if (reject>0 || rejectC>0) continue;
-      npoints++;
-      align->ProcessTracklets(cpar1,cpar2,0,s1,s2);
-      align->ProcessTracklets(cpar2,cpar1,0,s2,s1); 
-    }
-  }
-  delete cstream;
-}
 
 
 Int_t AliTPCcalibAlign::AcceptTracklet(const AliExternalTrackParam &p1,
-                                      const AliExternalTrackParam &p2){
+                                      const AliExternalTrackParam &p2) const
+{
 
   //
   // Accept pair of tracklets?
@@ -1027,7 +1050,8 @@ Int_t AliTPCcalibAlign::AcceptTracklet(const AliExternalTrackParam &p1,
 }
 
 
-Int_t  AliTPCcalibAlign::AcceptTracklet(const Double_t *t1, const Double_t *t2){
+Int_t  AliTPCcalibAlign::AcceptTracklet(const Double_t *t1, const Double_t *t2) const
+{
   //
   // accept tracklet  - 
   //  dist cut + 6 sigma cut 
@@ -1142,7 +1166,8 @@ void  AliTPCcalibAlign::ProcessDiff(const AliExternalTrackParam &t1,
 
 void AliTPCcalibAlign::Process12(const Double_t *t1,
                                 const Double_t *t2,
-                                TLinearFitter *fitter) {
+                                TLinearFitter *fitter) const
+{
   // x2    =  a00*x1 + a01*y1 + a02*z1 + a03
   // y2    =  a10*x1 + a11*y1 + a12*z1 + a13
   // z2    =  a20*x1 + a21*y1 + a22*z1 + a23
@@ -1220,9 +1245,10 @@ void AliTPCcalibAlign::Process12(const Double_t *t1,
   fitter->AddPoint(p,value,sdzdx);
 }
 
-void AliTPCcalibAlign::Process9(Double_t *t1,
-                               Double_t *t2,
-                               TLinearFitter *fitter) {
+void AliTPCcalibAlign::Process9(const Double_t * const t1,
+                               const Double_t * const t2,
+                               TLinearFitter *fitter) const
+{
   // x2    =  a00*x1 + a01*y1 + a02*z1 + a03
   // y2    =  a10*x1 + a11*y1 + a12*z1 + a13
   // z2    =  a20*x1 + a21*y1 + a22*z1 + a23
@@ -1234,8 +1260,8 @@ void AliTPCcalibAlign::Process9(Double_t *t1,
   //                     a20  a21  a21 a23     p[4]   p[5]  1      p[8] 
 
 
-  Double_t &x1=t1[0], &y1=t1[1], &z1=t1[3], &dydx1=t1[2], &dzdx1=t1[4];
-  Double_t /*&x2=t2[0],*/ &y2=t2[1], &z2=t2[3], &dydx2=t2[2], &dzdx2=t2[4];
+  const Double_t &x1=t1[0], &y1=t1[1], &z1=t1[3], &dydx1=t1[2], &dzdx1=t1[4];
+  const Double_t /*&x2=t2[0],*/ &y2=t2[1], &z2=t2[3], &dydx2=t2[2], &dzdx2=t2[4];
   //
   Double_t sy       = TMath::Sqrt(t1[6]*t1[6]+t2[6]*t2[6]);
   Double_t sdydx    = TMath::Sqrt(t1[7]*t1[7]+t2[7]*t2[7]);
@@ -1299,9 +1325,10 @@ void AliTPCcalibAlign::Process9(Double_t *t1,
   fitter->AddPoint(p,value,sdzdx);
 }
 
-void AliTPCcalibAlign::Process6(Double_t *t1,
-                               Double_t *t2,
-                               TLinearFitter *fitter) {
+void AliTPCcalibAlign::Process6(const Double_t *const t1,
+                               const Double_t *const t2,
+                               TLinearFitter *fitter) const
+{
   // x2    =  1  *x1 +-a01*y1 + 0      +a03
   // y2    =  a01*x1 + 1  *y1 + 0      +a13
   // z2    =  a20*x1 + a21*y1 + 1  *z1 +a23
@@ -1312,8 +1339,8 @@ void AliTPCcalibAlign::Process6(Double_t *t1,
   //                     a10  a11  a12 a13 ==> p[0]   1     0     p[4]
   //                     a20  a21  a21 a23     p[1]   p[2]  1     p[5] 
 
-  Double_t &x1=t1[0], &y1=t1[1], &z1=t1[3], &dydx1=t1[2], &dzdx1=t1[4];
-  Double_t /*&x2=t2[0],*/ &y2=t2[1], &z2=t2[3], &dydx2=t2[2], &dzdx2=t2[4];
+  const Double_t &x1=t1[0], &y1=t1[1], &z1=t1[3], &dydx1=t1[2], &dzdx1=t1[4];
+  const Double_t /*&x2=t2[0],*/ &y2=t2[1], &z2=t2[3], &dydx2=t2[2], &dzdx2=t2[4];
 
   //
   Double_t sy       = TMath::Sqrt(t1[6]*t1[6]+t2[6]*t2[6]);
@@ -1446,7 +1473,7 @@ TLinearFitter* AliTPCcalibAlign::GetOrMakeFitter12(Int_t s1,Int_t s2) {
   fitter->StoreData(kFALSE);
   fFitterArray12.AddAt(fitter,GetIndex(s1,s2));        
   counter12++;
-  if (GetDebugLevel()>0) cerr<<"Creating fitter12 "<<s1<<","<<s2<<"  :  "<<counter12<<endl;
+  //  if (GetDebugLevel()>0) cerr<<"Creating fitter12 "<<s1<<","<<s2<<"  :  "<<counter12<<endl;
   return fitter;
 }
 
@@ -1463,7 +1490,7 @@ TLinearFitter* AliTPCcalibAlign::GetOrMakeFitter9(Int_t s1,Int_t s2) {
   fitter->StoreData(kFALSE);
   fFitterArray9.AddAt(fitter,GetIndex(s1,s2));
   counter9++;
-  if (GetDebugLevel()>0) cerr<<"Creating fitter12 "<<s1<<","<<s2<<"  :  "<<counter9<<endl;
+  //  if (GetDebugLevel()>0) cerr<<"Creating fitter12 "<<s1<<","<<s2<<"  :  "<<counter9<<endl;
   return fitter;
 }
 
@@ -1482,7 +1509,7 @@ TLinearFitter* AliTPCcalibAlign::GetOrMakeFitter6(Int_t s1,Int_t s2) {
   fitter->StoreData(kFALSE);
   fFitterArray6.AddAt(fitter,GetIndex(s1,s2));
   counter6++;
-  if (GetDebugLevel()>0) cerr<<"Creating fitter6 "<<s1<<","<<s2<<"  :  "<<counter6<<endl;
+  //  if (GetDebugLevel()>0) cerr<<"Creating fitter6 "<<s1<<","<<s2<<"  :  "<<counter6<<endl;
   return fitter;
 }
 
@@ -1547,6 +1574,119 @@ Bool_t AliTPCcalibAlign::GetTransformation6(Int_t s1,Int_t s2,TMatrixD &a) {
   } 
 }
 
+void AliTPCcalibAlign::MakeResidualHistos(){
+  //
+  // Make cluster residual histograms
+  //
+  Double_t xminTrack[9], xmaxTrack[9];
+  Int_t    binsTrack[9];
+  TString  axisName[9],axisTitle[9];
+  //
+  // 0 - delta   of interest
+  // 1 - global  phi in sector number  as float
+  // 2 - local   x
+  // 3 - local   ky
+  // 4 - local   kz
+  // 
+  axisName[0]="delta";   axisTitle[0]="#Delta (cm)"; 
+  if (TMath::Abs(AliTracker::GetBz())<0.01){
+    binsTrack[0]=60;       xminTrack[0]=-1.2;        xmaxTrack[0]=1.2; 
+  }else{
+    binsTrack[0]=60;       xminTrack[0]=-0.6;        xmaxTrack[0]=0.6; 
+  }
+  //
+  axisName[1]="sector";   axisTitle[1]="Sector Number"; 
+  binsTrack[1]=180;       xminTrack[1]=0;        xmaxTrack[1]=18; 
+  //
+  axisName[2]="R";   axisTitle[2]="r (cm)"; 
+  binsTrack[2]=53;       xminTrack[2]=85.;        xmaxTrack[2]=245.; 
+  //
+  //
+  axisName[3]="kZ";      axisTitle[3]="dz/dx"; 
+  binsTrack[3]=36;       xminTrack[3]=-1.8;        xmaxTrack[3]=1.8; 
+  //
+  fClusterDelta[0] = new THnSparseS("#Delta_{Y} (cm)","#Delta_{Y} (cm)", 4, binsTrack,xminTrack, xmaxTrack);
+  fClusterDelta[1] = new THnSparseS("#Delta_{Z} (cm)","#Delta_{Z} (cm)", 4, binsTrack,xminTrack, xmaxTrack);
+  //
+  //
+  //
+  for (Int_t ivar=0;ivar<2;ivar++){
+    for (Int_t ivar2=0;ivar2<4;ivar2++){
+      fClusterDelta[ivar]->GetAxis(ivar2)->SetName(axisName[ivar2].Data());
+      fClusterDelta[ivar]->GetAxis(ivar2)->SetTitle(axisName[ivar2].Data());
+    }
+  }
+
+}
+
+
+void AliTPCcalibAlign::MakeResidualHistosTracklet(){
+  //
+  // Make tracklet residual histograms
+  //
+  Double_t xminTrack[9], xmaxTrack[9];
+  Int_t    binsTrack[9];
+  TString  axisName[9],axisTitle[9];
+  //
+  // 0 - delta   of interest
+  // 1 - global  phi in sector number  as float
+  // 2 - local   x
+  // 3 - local   ky
+  // 4 - local   kz
+  // 5 - sector  1
+  // 6 - sector  0
+  // 7 - z position  0
+
+  axisName[0]="delta";   axisTitle[0]="#Delta (cm)"; 
+  binsTrack[0]=60;       xminTrack[0]=-0.6;        xmaxTrack[0]=0.6; 
+  //
+  axisName[1]="phi";   axisTitle[1]="#phi"; 
+  binsTrack[1]=180;       xminTrack[1]=-TMath::Pi();        xmaxTrack[1]=TMath::Pi(); 
+  //
+  axisName[2]="localX";   axisTitle[2]="x (cm)"; 
+  binsTrack[2]=10;       xminTrack[2]=120.;        xmaxTrack[2]=200.; 
+  //
+  axisName[3]="kY";      axisTitle[3]="dy/dx"; 
+  binsTrack[3]=10;       xminTrack[3]=-0.5;        xmaxTrack[3]=0.5; 
+  //
+  axisName[4]="kZ";      axisTitle[4]="dz/dx"; 
+  binsTrack[4]=22;       xminTrack[4]=-1.1;        xmaxTrack[4]=1.1; 
+  //
+  axisName[5]="is1";      axisTitle[5]="is1"; 
+  binsTrack[5]=72;       xminTrack[5]=0;        xmaxTrack[5]=72;
+  //
+  axisName[6]="is0";      axisTitle[6]="is0"; 
+  binsTrack[6]=72;       xminTrack[6]=0;        xmaxTrack[6]=72;
+  //
+  axisName[7]="z";        axisTitle[7]="z(cm)"; 
+  binsTrack[7]=12;        xminTrack[7]=-240;        xmaxTrack[7]=240;
+  //
+  axisName[8]="IsPrimary";        axisTitle[8]="Is Primary"; 
+  binsTrack[8]=2;        xminTrack[8]=-0.1;        xmaxTrack[8]=1.1;
+  //
+  xminTrack[0]=-0.25;        xmaxTrack[0]=0.25; 
+  fTrackletDelta[0] = new THnSparseF("#Delta_{Y} (cm)","#Delta_{Y} (cm)", 9, binsTrack,xminTrack, xmaxTrack);
+  xminTrack[0]=-0.5;        xmaxTrack[0]=0.5; 
+  fTrackletDelta[1] = new THnSparseF("#Delta_{Z} (cm)","#Delta_{Z} (cm)", 9, binsTrack,xminTrack, xmaxTrack);
+  xminTrack[0]=-0.005;        xmaxTrack[0]=0.005; 
+  fTrackletDelta[2] = new THnSparseF("#Delta_{kY}","#Delta_{kY}", 9, binsTrack,xminTrack, xmaxTrack);
+  xminTrack[0]=-0.008;        xmaxTrack[0]=0.008; 
+  fTrackletDelta[3] = new THnSparseF("#Delta_{kZ}","#Delta_{kZ}", 9, binsTrack,xminTrack, xmaxTrack);
+  //
+  //
+  //
+  for (Int_t ivar=0;ivar<4;ivar++){
+    for (Int_t ivar2=0;ivar2<9;ivar2++){
+      fTrackletDelta[ivar]->GetAxis(ivar2)->SetName(axisName[ivar2].Data());
+      fTrackletDelta[ivar]->GetAxis(ivar2)->SetTitle(axisName[ivar2].Data());
+    }
+  }
+
+}
+
+
+
 void AliTPCcalibAlign::FillHisto(const Double_t *t1,
                                 const Double_t *t2,
                                 Int_t s1,Int_t s2) {
@@ -1579,6 +1719,60 @@ void AliTPCcalibAlign::FillHisto(const Double_t *t1,
 }
 
 
+void AliTPCcalibAlign::FillHisto(AliExternalTrackParam *tp1,
+                                AliExternalTrackParam *tp2,
+                                Int_t s1,Int_t s2) {
+  //
+  // Fill residual histograms
+  // Track2-Track1
+  if (s2<s1) return;//
+  const Double_t kEpsilon=0.001;
+  Double_t x[9]={0,0,0,0,0,0,0,0,0};
+  AliExternalTrackParam p1(*tp1);
+  AliExternalTrackParam p2(*tp2);
+  if (s1%18==s2%18) {
+    // inner outer - match at the IROC-OROC boundary
+    if (!p1.PropagateTo(fXIO, AliTrackerBase::GetBz())) return;
+  }
+  if (!p2.Rotate(p1.GetAlpha())) return;
+  if (!p2.PropagateTo(p1.GetX(),AliTrackerBase::GetBz())) return;
+  if (TMath::Abs(p1.GetX()-p2.GetX())>kEpsilon) return;
+  Double_t xyz[3];
+  p1.GetXYZ(xyz);
+  x[1]=TMath::ATan2(xyz[1],xyz[0]);
+  x[2]=p1.GetX();
+  x[3]=0.5*(p1.GetSnp()+p2.GetSnp());  // mean snp
+  x[4]=0.5*(p1.GetTgl()+p2.GetTgl());  // mean tgl
+  x[5]=s2;
+  x[6]=s1;
+  x[7]=0.5*(p1.GetZ()+p2.GetZ());
+  // is primary ?
+  Int_t  isPrimary = (TMath::Abs(p1.GetTgl()-p1.GetZ()/p1.GetX())<0.1) ? 1:0;
+  x[8]= isPrimary;
+  //
+  x[0]=p2.GetY()-p1.GetY();
+  fTrackletDelta[0]->Fill(x);
+  x[0]=p2.GetZ()-p1.GetZ();
+  fTrackletDelta[1]->Fill(x);
+  x[0]=p2.GetSnp()-p1.GetSnp();
+  fTrackletDelta[2]->Fill(x);
+  x[0]=p2.GetTgl()-p1.GetTgl();
+  fTrackletDelta[3]->Fill(x);
+  TTreeSRedirector *cstream = GetDebugStreamer();    
+  if (cstream){
+    (*cstream)<<"trackletMatch"<<
+      "tp1.="<<tp1<<   // input tracklet
+      "tp2.="<<tp2<<
+      "p1.="<<&p1<<    // tracklet in the ref frame
+      "p2.="<<&p2<<
+      "s1="<<s1<<
+      "s2="<<s2<<
+      "\n";
+  }      
+  
+}
+
+
 
 TH1 * AliTPCcalibAlign::GetHisto(HistoType type, Int_t s1, Int_t s2, Bool_t force)
 {
@@ -1708,7 +1902,7 @@ TGraphErrors * AliTPCcalibAlign::MakeGraph(Int_t sec0, Int_t sec1, Int_t dsec,
   }
   TGraphErrors *gr = new TGraphErrors(npoints,xsec,ysec,0,0);
   Char_t name[1000];
-  sprintf(name,"Mat[%d,%d]  Type=%d",i0,i1,type);
+  snprintf(name,100,"Mat[%d,%d]  Type=%d",i0,i1,type);
   gr->SetName(name);
   return gr;
 }
@@ -1740,54 +1934,55 @@ void  AliTPCcalibAlign::MakeTree(const char *fname, Int_t minPoints){
 
       //
       //
-      TMatrixD * kpar = fSectorParamA;
-      TMatrixD * kcov = fSectorCovarA;
-      if (s1%36>=18){
-       kpar = fSectorParamC;
-       kcov = fSectorCovarC;
-      }
-      for (Int_t ipar=0;ipar<6;ipar++){
-       Int_t isec1 = s1%18;
-       Int_t isec2 = s2%18;
-       if (s1>35) isec1+=18;
-       if (s2>35) isec2+=18;   
-       param6s1(ipar)=(*kpar)(6*isec1+ipar,0);
-       param6s2(ipar)=(*kpar)(6*isec2+ipar,0);
+      if (fSectorParamA){
+       TMatrixD * kpar = fSectorParamA;
+       TMatrixD * kcov = fSectorCovarA;
+       if (s1%36>=18){
+         kpar = fSectorParamC;
+         kcov = fSectorCovarC;
+       }
+       for (Int_t ipar=0;ipar<6;ipar++){
+         Int_t isec1 = s1%18;
+         Int_t isec2 = s2%18;
+         if (s1>35) isec1+=18;
+         if (s2>35) isec2+=18; 
+         param6s1(ipar)=(*kpar)(6*isec1+ipar,0);
+         param6s2(ipar)=(*kpar)(6*isec2+ipar,0);
+       }
       }
-
-
+       
       Double_t dy=0, dz=0, dphi=0,dtheta=0;
       Double_t sy=0, sz=0, sphi=0,stheta=0;
       Double_t ny=0, nz=0, nphi=0,ntheta=0;
       Double_t chi2v12=0, chi2v9=0, chi2v6=0;
-      Int_t npoints=0;
-      TLinearFitter * fitter = 0;      
+      //      Int_t npoints=0;
+      // TLinearFitter * fitter = 0;      
       if (fPoints[GetIndex(s1,s2)]>minPoints){
        //
        //
        //
-       fitter = GetFitter12(s1,s2);
-       npoints = fitter->GetNpoints();
-       chi2v12 = TMath::Sqrt(fitter->GetChisquare()/npoints);
+//     fitter = GetFitter12(s1,s2);
+//     npoints = fitter->GetNpoints();
+//     chi2v12 = TMath::Sqrt(fitter->GetChisquare()/npoints);
        
-       //
-       fitter = GetFitter9(s1,s2);
-       npoints = fitter->GetNpoints();
-       chi2v9 = TMath::Sqrt(fitter->GetChisquare()/npoints);
-       //
-       fitter = GetFitter6(s1,s2);
-       npoints = fitter->GetNpoints();
-       chi2v6 = TMath::Sqrt(fitter->GetChisquare()/npoints);
-       fitter->GetParameters(param6Diff);
-       //
-       GetTransformation6(s1,s2,m6);
-       GetTransformation9(s1,s2,m9);
-       GetTransformation12(s1,s2,m12);
-       //
-       fitter = GetFitter6(s1,s2);
-       //fitter->FixParameter(3,0);
-       //fitter->Eval();
-       GetTransformation6(s1,s2,m6FX);
+//     //
+//     fitter = GetFitter9(s1,s2);
+//     npoints = fitter->GetNpoints();
+//     chi2v9 = TMath::Sqrt(fitter->GetChisquare()/npoints);
+//     //
+//     fitter = GetFitter6(s1,s2);
+//     npoints = fitter->GetNpoints();
+//     chi2v6 = TMath::Sqrt(fitter->GetChisquare()/npoints);
+//     fitter->GetParameters(param6Diff);
+//     //
+//     GetTransformation6(s1,s2,m6);
+//     GetTransformation9(s1,s2,m9);
+//     GetTransformation12(s1,s2,m12);
+//     //
+//     fitter = GetFitter6(s1,s2);
+//     //fitter->FixParameter(3,0);
+//     //fitter->Eval();
+//     GetTransformation6(s1,s2,m6FX);
        //
        TH1 * his=0;
        his = GetHisto(kY,s1,s2);
@@ -1801,28 +1996,13 @@ void  AliTPCcalibAlign::MakeTree(const char *fname, Int_t minPoints){
        //
 
       }
+      AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
+      if (!magF) AliError("Magneticd field - not initialized");
+      Double_t bz = magF->SolenoidField()/10.; //field in T
 
-      // x2    =  a00*x1 + a01*y1 + a02*z1 + a03
-      // y2    =  a10*x1 + a11*y1 + a12*z1 + a13
-      // z2    =  a20*x1 + a21*y1 + a22*z1 + a23
-      // dydx2 = (a10    + a11*dydx1 + a12*dzdx1)/(a00    + a01*dydx1 + a02*dzdx1)
-      // dzdx2 = (a20    + a21*dydx1 + a22*dzdx1)/(a00    + a01*dydx1 + a02*dzdx1)
-      //
-      //                     a00  a01 a02  a03     p[0]   p[1]  p[2]  p[9]
-      //                     a10  a11 a12  a13 ==> p[3]   p[4]  p[5]  p[10]
-      //                     a20  a21 a22  a23     p[6]   p[7]  p[8]  p[11] 
-      
-      //
-      // 
-      // dy:-(fXIO*m6.fElements[4]+m6.fElements[7])
-      // 
-      // dphi:-(m6.fElements[4])
-      //
-      // dz:fXIO*m6.fElements[8]+m6.fElements[11]
-      //
-      // dtheta:m6.fElements[8]
-      //
       cstream<<"Align"<<
+       "run="<<fRun<<  // run
+       "bz="<<bz<<
        "s1="<<s1<<     // reference sector
        "s2="<<s2<<     // sector to align
        "m6FX.="<<&m6FX<<   // tranformation matrix
@@ -1856,7 +2036,7 @@ void  AliTPCcalibAlign::MakeTree(const char *fname, Int_t minPoints){
 
 
 //_____________________________________________________________________
-Long64_t AliTPCcalibAlign::Merge(TCollection* list) {
+Long64_t AliTPCcalibAlign::Merge(TCollection* const list) {
   //
   // merge function 
   //
@@ -1968,6 +2148,48 @@ void AliTPCcalibAlign::Add(AliTPCcalibAlign * align){
     UpdateKalman(*fSectorParamA,*fSectorCovarA,*align->fSectorParamA,*align->fSectorCovarA);
     UpdateKalman(*fSectorParamC,*fSectorCovarC,*align->fSectorParamC,*align->fSectorCovarC);
   }
+  if (!fClusterDelta[0]) MakeResidualHistos();
+
+  for (Int_t i=0; i<2; i++){
+    if (align->fClusterDelta[i]){
+      fClusterDelta[i]->Add(align->fClusterDelta[i]);
+  //     align->fClusterDelta[i]->GetAxis(0)->SetRangeUser(-0.87,0.87);
+//       align->fClusterDelta[i]->GetAxis(3)->SetRangeUser(-0.87,0.87);
+//       fClusterDelta[i]->GetAxis(0)->SetRangeUser(-0.87,0.87);
+//       fClusterDelta[i]->GetAxis(3)->SetRangeUser(-0.87,0.87);
+//       Int_t idim[4]={0,1,2,3};
+//       THnSparse *htemp=align->fClusterDelta[i]->Projection(4,idim);
+//       THnSparse *htemp1=fClusterDelta[i]->Projection(4,idim);      
+//       htemp1->Add(htemp);
+//       delete fClusterDelta[i];
+//       fClusterDelta[i]=htemp1;      
+//       delete htemp;
+    }
+  }
+  
+  for (Int_t i=0; i<4; i++){
+    if (!fTrackletDelta[i] && align->fTrackletDelta[i]) {
+      fTrackletDelta[i]= (THnSparse*)(align->fTrackletDelta[i]->Clone());
+      continue;
+    }
+    if (align->fTrackletDelta[i]) {
+      fTrackletDelta[i]->Add(align->fTrackletDelta[i]);
+      //
+   //    align->fTrackletDelta[i]->GetAxis(3)->SetRangeUser(-0.36,0.36);
+//       align->fTrackletDelta[i]->GetAxis(4)->SetRangeUser(-0.87,0.87);
+//       fTrackletDelta[i]->GetAxis(3)->SetRangeUser(-0.36,0.36);
+//       fTrackletDelta[i]->GetAxis(4)->SetRangeUser(-0.87,0.87);
+//       //
+//       Int_t idim[9]={0,1,2,3,4,5,6,7,8};
+//       THnSparse *htemp=align->fTrackletDelta[i]->Projection(9,idim);
+//       THnSparse *htemp1=fTrackletDelta[i]->Projection(9,idim);
+//       htemp1->Add(htemp);
+//       delete fTrackletDelta[i];
+//       fTrackletDelta[i]=htemp1;
+//       delete htemp;
+    }
+  }
+
 }
 
 Double_t AliTPCcalibAlign::Correct(Int_t type, Int_t value, Int_t s1, Int_t s2, Double_t x1, Double_t y1, Double_t z1, Double_t dydx1,Double_t dzdx1){
@@ -2261,8 +2483,8 @@ void AliTPCcalibAlign::GlobalAlign6(Int_t minPoints, Float_t sysError, Int_t nit
   //
   // full track fit parameters
   // 
-  TLinearFitter fyf(2,"pol1");
-  TLinearFitter fzf(2,"pol1");
+  static TLinearFitter fyf(2,"pol1");   // change to static - suggestion of calgrind - 30 % of time
+  static TLinearFitter fzf(2,"pol1");   // relative to time of given class
   TVectorD pyf(2), peyf(2),pzf(2), pezf(2);
   TMatrixD covY(4,4),covZ(4,4);
   Double_t chi2FacY =1;
@@ -2370,19 +2592,205 @@ void AliTPCcalibAlign::GlobalAlign6(Int_t minPoints, Float_t sysError, Int_t nit
   return nf;
 }
 
+void AliTPCcalibAlign::UpdateClusterDeltaField(const AliTPCseed * seed){
+  //
+  // Update the cluster residula histograms for setup with field
+  // Kalman track fitting is used
+  //  Only high momenta primary tracks used
+  //
+  // 1. Apply selection
+  // 2. Refit the track - in-out
+  // 3. Refit the track - out-in
+  // 4. Combine In and Out track - - fil cluster residuals
+  //
+  const Double_t kPtCut=1.0;    // pt
+  const Double_t kSnpCut=0.2; // snp cut
+  const Double_t kNclCut=120; //
+  const Double_t kVertexCut=1;
+  const Double_t kMaxDist=0.5; // max distance between tracks and cluster
+  const Double_t kEdgeCut = 2.5;
+  const Double_t kDelta2=0.2*0.2;  // initial increase in covar matrix
+  const Double_t kSigma=0.3;       // error increase towards edges of TPC 
+  const Double_t kSkipBoundary=7.5;  // skip track updates in the boundary IFC,OFC, IO
+  //
+  if (!fCurrentTrack) return;
+  if (!fCurrentFriendTrack) return;
+  Float_t vertexXY=0,vertexZ=0;
+  fCurrentTrack->GetImpactParameters(vertexXY,vertexZ);
+  if (TMath::Abs(vertexXY)>kVertexCut) return;
+  if (TMath::Abs(vertexZ)>kVertexCut) return;
+  if (TMath::Abs(seed->Pt())<kPtCut) return;
+  if (seed->GetNumberOfClusters()<kNclCut) return;
+  if (TMath::Abs(seed->GetSnp())>kSnpCut) return; 
+  if (!fClusterDelta[0])  MakeResidualHistos();
+  //
+  AliExternalTrackParam fitIn[160];
+  AliExternalTrackParam fitOut[160];
+  AliTPCROC * roc = AliTPCROC::Instance();
+  Double_t xmiddle   = ( roc->GetPadRowRadii(0,0)+roc->GetPadRowRadii(36,roc->GetNRows(36)-1))*0.5;
+  Double_t xDiff     = ( -roc->GetPadRowRadii(0,0)+roc->GetPadRowRadii(36,roc->GetNRows(36)-1))*0.5;
+  Double_t xIFC      = ( roc->GetPadRowRadii(0,0));
+  Double_t xOFC      = ( roc->GetPadRowRadii(36,roc->GetNRows(36)-1));
+  //
+  Int_t detector=-1;
+  //
+  //
+  AliExternalTrackParam trackIn  = *(fCurrentTrack->GetInnerParam());
+  AliExternalTrackParam trackOut = *(fCurrentFriendTrack->GetTPCOut());
+  trackIn.ResetCovariance(10);
+  trackOut.ResetCovariance(10);
+  Double_t *covarIn = (Double_t*)trackIn.GetCovariance();
+  Double_t *covarOut = (Double_t*)trackOut.GetCovariance();
+  covarIn[0]+=kDelta2; covarIn[2]+=kDelta2; 
+  covarIn[5]+=kDelta2/(100.*100.); covarIn[9]=kDelta2/(100.*100.);
+  covarIn[14]+=kDelta2/(5.*5.);
+  covarOut[0]+=kDelta2; covarOut[2]+=kDelta2; 
+  covarOut[5]+=kDelta2/(100.*100.); covarOut[9]=kDelta2/(100.*100.);
+  covarOut[14]+=kDelta2/(5.*5.);
+  //
+  static Double_t mass =    TDatabasePDG::Instance()->GetParticle("pi+")->Mass();
+  //  
+  Int_t ncl=0;
+  for (Int_t irow=0; irow<160; irow++){
+    AliTPCclusterMI *cl=seed->GetClusterPointer(irow);
+    if (!cl) continue;
+    if (cl->GetX()<80) continue;
+    if (detector<0) detector=cl->GetDetector()%36;
+    if (detector!=cl->GetDetector()%36) return; // cluster from different sectors
+    // skip such tracks
+    ncl++;
+  }
+  if (ncl<kNclCut) return;
+  Int_t nclIn=0,nclOut=0;
+  Double_t xyz[3];
+  //
+  // Refit out - store residual maps
+  //
+  for (Int_t irow=0; irow<160; irow++){
+    AliTPCclusterMI *cl=seed->GetClusterPointer(irow);
+    if (!cl) continue;
+    if (cl->GetX()<80) continue;
+    if (detector<0) detector=cl->GetDetector()%36;
+    Int_t sector = cl->GetDetector();
+    Float_t dalpha = TMath::DegToRad()*(sector%18*20.+10.)-trackOut.GetAlpha();    
+    if (cl->GetDetector()%36!=detector) continue;
+    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.1,0.,0.1}; 
+    Double_t dedge =  cl->GetX()*TMath::Tan(TMath::Pi()/18.)-TMath::Abs(trackOut.GetY());
+    Double_t dmiddle = TMath::Abs(cl->GetX()-xmiddle)/xDiff;
+    dmiddle*=dmiddle;
+    //
+    cov[0]+=kSigma*dmiddle;     // bigger error at boundary
+    cov[0]+=kSigma*dmiddle;     // bigger error at boundary
+    cov[2]+=kSigma*dmiddle;     // bigger error at boundary
+    cov[2]+=kSigma*dmiddle;     // bigger error at boundary
+    cov[0]+=kSigma/dedge;      // bigger error close to the boundary
+    cov[2]+=kSigma/dedge;      // bigger error close to the boundary
+    cov[0]*=cov[0];
+    cov[2]*=cov[2];
+    if (!AliTracker::PropagateTrackToBxByBz(&trackOut, r[0],mass,1.,kFALSE)) continue;    
+    if (TMath::Abs(dedge)<kEdgeCut) continue;
+    //
+    Bool_t doUpdate=kTRUE;
+    if (TMath::Abs(cl->GetX()-xIFC)<kSkipBoundary) doUpdate=kFALSE;
+    if (TMath::Abs(cl->GetX()-xOFC)<kSkipBoundary) doUpdate=kFALSE;
+    if (TMath::Abs(cl->GetX()-fXIO)<kSkipBoundary) doUpdate=kFALSE;
+    //
+    if (TMath::Abs(cl->GetY()-trackOut.GetY())<kMaxDist){
+      nclOut++;
+      if (doUpdate) trackOut.Update(&r[1],cov);
+    }
+    fitOut[irow]=trackOut;
+  }
+  
+  //
+  // Refit In - store residual maps
+  //
+  for (Int_t irow=159; irow>=0; irow--){
+    AliTPCclusterMI *cl=seed->GetClusterPointer(irow);
+    if (!cl) continue;
+    if (cl->GetX()<80) continue;
+    if (detector<0) detector=cl->GetDetector()%36;
+    Int_t sector = cl->GetDetector();
+    Float_t dalpha = TMath::DegToRad()*(sector%18*20.+10.)-trackIn.GetAlpha();    
+    if (cl->GetDetector()%36!=detector) continue;
+    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.1,0.,0.1}; 
+    Double_t dedge =  cl->GetX()*TMath::Tan(TMath::Pi()/18.)-TMath::Abs(trackIn.GetY());
+    Double_t dmiddle = TMath::Abs(cl->GetX()-xmiddle)/xDiff;
+    dmiddle*=dmiddle;
+    //
+    cov[0]+=kSigma*dmiddle;     // bigger error at boundary
+    cov[0]+=kSigma*dmiddle;     // bigger error at boundary
+    cov[2]+=kSigma*dmiddle;     // bigger error at boundary
+    cov[2]+=kSigma*dmiddle;     // bigger error at boundary
+    cov[0]+=kSigma/dedge;      // bigger error close to the boundary
+    cov[2]+=kSigma/dedge;      // bigger error close to the boundary
+    cov[0]*=cov[0];
+    cov[2]*=cov[2];
+    if (!AliTracker::PropagateTrackToBxByBz(&trackIn, r[0],mass,1.,kFALSE)) continue;    
+    if (TMath::Abs(dedge)<kEdgeCut) continue;
+    Bool_t doUpdate=kTRUE;
+    if (TMath::Abs(cl->GetX()-xIFC)<kSkipBoundary) doUpdate=kFALSE;
+    if (TMath::Abs(cl->GetX()-xOFC)<kSkipBoundary) doUpdate=kFALSE;
+    if (TMath::Abs(cl->GetX()-fXIO)<kSkipBoundary) doUpdate=kFALSE;
+    if (TMath::Abs(cl->GetY()-trackIn.GetY())<kMaxDist){
+      nclIn++;
+      if (doUpdate) trackIn.Update(&r[1],cov);
+    }
+    fitIn[irow]=trackIn;
+  }
+  //
+  //
+  for (Int_t irow=159; irow>=0; irow--){
+    //
+    // Update kalman - +- direction
+    // Store cluster residuals
+    AliTPCclusterMI *cl=seed->GetClusterPointer(irow);
+    if (!cl) continue;
+    if (cl->GetX()<80) continue;
+    if (detector<0) detector=cl->GetDetector()%36;
+    if (cl->GetDetector()%36!=detector) continue;
+    AliExternalTrackParam trackSmooth = fitIn[irow];
+    AliTrackerBase::UpdateTrack(trackSmooth, fitOut[irow]);
+    //
+    Double_t resVector[5]; 
+    trackSmooth.GetXYZ(xyz);
+    resVector[1]= 9.*TMath::ATan2(xyz[1],xyz[0])/TMath::Pi();
+    if (resVector[1]<0) resVector[1]+=18;
+    resVector[2]= TMath::Sqrt(cl->GetX()*cl->GetX()+cl->GetY()*cl->GetY());
+    resVector[3]= cl->GetZ()/resVector[2];
+    //
+    resVector[0]= cl->GetY()-trackSmooth.GetY();
+    fClusterDelta[0]->Fill(resVector);
+    resVector[0]= cl->GetZ()-trackSmooth.GetZ();
+    fClusterDelta[1]->Fill(resVector);
+  }
+
+}
+
+
 void  AliTPCcalibAlign::UpdateAlignSector(const AliTPCseed * track,Int_t isec){
   //
-  // Update Kalman filter of Alignment 
+  // Update Kalman filter of Alignment - only setup without filed
   //       IROC - OROC quadrants
   //
-  
-  const Int_t kMinClusterF=40;
+  if (TMath::Abs(AliTracker::GetBz())>0.5) return;
+  if (!fClusterDelta[0])  MakeResidualHistos();
+  //  const Int_t kMinClusterF=40;
+  const Int_t kMinClusterFit=10;
   const Int_t kMinClusterQ=10;
   //
-  const  Int_t     kdrow1 =8;       // rows to skip at the end      
-  const  Int_t     kdrow0 =2;        // rows to skip at beginning  
+  const  Int_t     kdrow1Fit =5;         // rows to skip from fit at the end      
+  const  Int_t     kdrow0Fit =10;        // rows to skip from fit at beginning  
   const  Float_t   kedgey=3.0;
-  const  Float_t   kMaxDist=0.5;
+  const  Float_t   kMaxDist=1;
   const  Float_t   kMaxCorrY=0.05;
   const  Float_t   kPRFWidth = 0.6;   //cut 2 sigma of PRF
   isec = isec%36;     // use the hardware numbering
@@ -2392,38 +2800,45 @@ void  AliTPCcalibAlign::UpdateAlignSector(const AliTPCseed * track,Int_t isec){
   //
   // full track fit parameters
   // 
-  TLinearFitter fyf(2,"pol1");
-  TLinearFitter fzf(2,"pol1");
+  static TLinearFitter fyf(2,"pol1");   // make it static - too much time for comiling of formula
+  static TLinearFitter fzf(2,"pol1");   // calgrind recomendation
   TVectorD pyf(2), peyf(2),pzf(2), pezf(2);
+  TVectorD pyfc(2),pzfc(2);
   Int_t nf=0;
   //
   // make full fit as reference
   //
   for (Int_t iter=0; iter<2; iter++){
     fyf.ClearPoints();
-    for (Int_t irow=kdrow0;irow<159-kdrow1;irow++) {
+    fzf.ClearPoints();
+    for (Int_t irow=kdrow0Fit;irow<159-kdrow1Fit;irow++) {
       AliTPCclusterMI *c=track->GetClusterPointer(irow);
       if (!c) continue;
       if ((c->GetDetector()%36)!=isec) continue;
-      if (c->GetRow()<kdrow0) continue;
+      if (c->GetRow()<kdrow0Fit) continue;
       Double_t dx = c->GetX()-fXmiddle;
       Double_t x[2]={dx, dx*dx};
       if (iter==0 &&c->GetType()<0) continue;
       if (iter==1){    
        Double_t yfit  =  pyf[0]+pyf[1]*dx;
+       Double_t zfit  =  pzf[0]+pzf[1]*dx;
        Double_t dedge =  c->GetX()*TMath::Tan(TMath::Pi()/18.)-TMath::Abs(yfit);
        if (TMath::Abs(c->GetY()-yfit)>kMaxDist) continue;
+       if (TMath::Abs(c->GetZ()-zfit)>kMaxDist) continue;
        if (dedge<kedgey) continue;
        Double_t corrtrY =  
          corr->RPhiCOGCorrection(c->GetDetector(),c->GetRow(), c->GetPad(),
                                  c->GetY(),yfit, c->GetZ(), pyf[1], c->GetMax(),2.5);
        if (TMath::Abs(corrtrY)>kMaxCorrY) continue;
       }
-      fyf.AddPoint(x,c->GetY(),0.1);
-      fzf.AddPoint(x,c->GetZ(),0.1);
+      if (TMath::Abs(x[0])<10){
+       fyf.AddPoint(x,c->GetY(),0.1); //use only middle rows+-10cm
+       fzf.AddPoint(x,c->GetZ(),0.1);            
+      }
     }
     nf = fyf.GetNpoints();
-    if (nf<kMinClusterF) return;   // not enough points - skip 
+    if (fyf.GetNpoints()<kMinClusterFit) return;   // not enough points - skip 
+    if (fzf.GetNpoints()<kMinClusterFit) return;   // not enough points - skip 
     fyf.Eval(); 
     fyf.GetParameters(pyf); 
     fyf.GetErrors(peyf);
@@ -2432,12 +2847,60 @@ void  AliTPCcalibAlign::UpdateAlignSector(const AliTPCseed * track,Int_t isec){
     fzf.GetErrors(pezf);
   }
   //
+  //
+  //
+  TVectorD vecX(160);          // x         vector
+  TVectorD vecY(160);          // residuals vector
+  TVectorD vecZ(160);                              // residuals vector
+  TVectorD vPosG(3);                  //vertex position
+  TVectorD vPosL(3);                 // vertex position in the TPC local system
+  TVectorF vImpact(2);               //track impact parameter
+  //  Double_t tofSignal= fCurrentTrack->GetTOFsignal();      // tof signal
+  TVectorF tpcPosG(3);                                    // global position of track at the middle of fXmiddle
+  Double_t lphi = TMath::ATan2(pyf[0],fXmiddle);          // expected local phi angle - if vertex at 0
+  Double_t gphi = 2.*TMath::Pi()*(isec%18+0.5)/18.+lphi;  // expected global phi if vertex at 0
+  Double_t ky   = pyf[0]/fXmiddle;
+  Double_t kyE  =0, kzE=0;    // ky and kz expected
+  Double_t alpha =2.*TMath::Pi()*(isec%18+0.5)/18.;
+  Double_t scos=TMath::Cos(alpha);
+  Double_t ssin=TMath::Sin(alpha);
+  const AliESDVertex* vertex = fCurrentEvent->GetPrimaryVertexTracks();
+  vertex->GetXYZ(vPosG.GetMatrixArray());
+  fCurrentTrack->GetImpactParameters(vImpact[0],vImpact[1]);  // track impact parameters
+  //
+  tpcPosG[0]= scos*fXmiddle-ssin*pyf[0];
+  tpcPosG[1]=+ssin*fXmiddle+scos*pyf[0];
+  tpcPosG[2]=pzf[0];
+  vPosL[0]= scos*vPosG[0]+ssin*vPosG[1];
+  vPosL[1]=-ssin*vPosG[0]+scos*vPosG[1];
+  vPosL[2]= vPosG[2];
+  kyE = (pyf[0]-vPosL[1])/(fXmiddle-vPosL[0]);
+  kzE = (pzf[0]-vPosL[2])/(fXmiddle-vPosL[0]);
+  //
+  // get constrained parameters
+  //
+  Double_t xvertex=vPosL[0]-fXmiddle;
+  fyf.AddPoint(&xvertex,vPosL[1], 0.00001);
+  fzf.AddPoint(&xvertex,vPosL[2], 2.);
+  fyf.Eval(); 
+  fyf.GetParameters(pyfc); 
+  fzf.Eval(); 
+  fzf.GetParameters(pzfc); 
+  //
+  //
   // Make Fitters and params for 5 fitters
   // 1-4 OROC quadrants 
   //   0 IROC
   //
-  TLinearFitter *fittersY[5];
-  TLinearFitter *fittersZ[5];
+  static TLinearFitter *fittersY[5]={0,0,0,0,0};   // calgrind recomendation - fater to clear points
+  static TLinearFitter *fittersZ[5]={0,0,0,0,0};   // than create the fitter
+  if (fittersY[0]==0){
+    for (Int_t i=0;i<5;i++) {
+      fittersY[i] = new TLinearFitter(2,"pol1");
+      fittersZ[i] = new TLinearFitter(2,"pol1");
+    }
+  }
+  //
   Int_t npoints[5];
   TVectorD paramsY[5];
   TVectorD errorsY[5];
@@ -2449,34 +2912,61 @@ void  AliTPCcalibAlign::UpdateAlignSector(const AliTPCseed * track,Int_t isec){
   Double_t chi2CZ[5];
   for (Int_t i=0;i<5;i++) {
     npoints[i]=0;
-    fittersY[i] = new TLinearFitter(2,"pol1");
     paramsY[i].ResizeTo(2);
     errorsY[i].ResizeTo(2);
     covY[i].ResizeTo(2,2);
-    fittersZ[i] = new TLinearFitter(2,"pol1");
     paramsZ[i].ResizeTo(2);
     errorsZ[i].ResizeTo(2);
     covZ[i].ResizeTo(2,2);
+    fittersY[i]->ClearPoints();
+    fittersZ[i]->ClearPoints();
   }
   //
   // Update fitters
   //
-  for (Int_t irow=kdrow0;irow<159-kdrow1;irow++) {
+  Int_t countRes=0;
+  for (Int_t irow=0;irow<159;irow++) {
     AliTPCclusterMI *c=track->GetClusterPointer(irow);
     if (!c) continue;
     if ((c->GetDetector()%36)!=isec) continue;
-    if (c->GetRow()<kdrow0) continue;      
     Double_t dx = c->GetX()-fXmiddle;
     Double_t x[2]={dx, dx*dx};
     Double_t yfit  =  pyf[0]+pyf[1]*dx;
+    Double_t zfit  =  pzf[0]+pzf[1]*dx;
+    Double_t yfitC  =  pyfc[0]+pyfc[1]*dx;
+    Double_t zfitC  =  pzfc[0]+pzfc[1]*dx;
     Double_t dedge =  c->GetX()*TMath::Tan(TMath::Pi()/18.)-TMath::Abs(yfit);
     if (TMath::Abs(c->GetY()-yfit)>kMaxDist) continue;
+    if (TMath::Abs(c->GetZ()-zfit)>kMaxDist) continue;
     if (dedge<kedgey) continue;
     Double_t corrtrY =  
       corr->RPhiCOGCorrection(c->GetDetector(),c->GetRow(), c->GetPad(),
                              c->GetY(),yfit, c->GetZ(), pyf[1], c->GetMax(),2.5);
     if (TMath::Abs(corrtrY)>kMaxCorrY) continue;  
-    
+    //
+    vecX[countRes]=c->GetX();
+    vecY[countRes]=c->GetY()-yfit;
+    vecZ[countRes]=c->GetZ()-zfit;
+    countRes++;
+    //
+    // Fill THnSparse cluster residuals
+    // use only primary candidates with ITS signal
+    if (fCurrentTrack->IsOn(0x4)&&TMath::Abs(vImpact[0])<1&&TMath::Abs(vImpact[1])<1){    
+      Double_t resVector[5];
+      resVector[1]= 9.*gphi/TMath::Pi();
+      resVector[2]= TMath::Sqrt(c->GetX()*c->GetX()+c->GetY()*c->GetY());
+      resVector[3]= c->GetZ()/resVector[2];
+      //
+      //
+      resVector[0]= c->GetY()-yfitC;
+      fClusterDelta[0]->Fill(resVector);
+      resVector[0]= c->GetZ()-zfitC;
+      fClusterDelta[1]->Fill(resVector);
+    }
+    if (c->GetRow()<kdrow0Fit) continue;      
+    if (c->GetRow()>159-kdrow1Fit) continue;      
+    //
+
     if (c->GetDetector()>35){      
       if (c->GetX()<fXquadrant){
        if (yfit<-kPRFWidth) fittersY[1]->AddPoint(x,c->GetY(),0.1);
@@ -2532,11 +3022,6 @@ void  AliTPCcalibAlign::UpdateAlignSector(const AliTPCseed * track,Int_t isec){
       covZ[i](1,1)*=chi2FacZ*chi2FacZ;      
     }
   }
-  for (Int_t i=0;i<5;i++){
-    delete fittersY[i];
-    delete fittersZ[i];
-  }
-
   //
   // void UpdateSectorKalman
   //
@@ -2581,8 +3066,12 @@ void  AliTPCcalibAlign::UpdateAlignSector(const AliTPCseed * track,Int_t isec){
   //
   // Dump debug information
   //
-  if (fStreamLevel>0){    
-    TTreeSRedirector *cstream = GetDebugStreamer();      
+  if (fStreamLevel>0){
+    // get vertex position
+     //
+    TTreeSRedirector *cstream = GetDebugStreamer();  
+
+    
     if (cstream){      
       for (Int_t i0=0;i0<5;i0++){
        for (Int_t i1=i0;i1<5;i1++){
@@ -2597,10 +3086,30 @@ void  AliTPCcalibAlign::UpdateAlignSector(const AliTPCseed * track,Int_t isec){
            "triggerClass="<<&fTriggerClass<<      //  trigger
            "mag="<<fMagF<<             //  magnetic field        
            "isec="<<isec<<             //  current sector 
+           //
+           "xref="<<fXmiddle<<         // reference X
+           "vPosG.="<<&vPosG<<        // vertex position in global system
+           "vPosL.="<<&vPosL<<        // vertex position in local  system
+           "vImpact.="<<&vImpact<<   // track impact parameter
+           //"tofSignal="<<tofSignal<<   // tof signal
+           "tpcPosG.="<<&tpcPosG<<   // global position of track at the middle of fXmiddle
+           "lphi="<<lphi<<             // expected local phi angle - if vertex at 0
+           "gphi="<<gphi<<             // expected global phi if vertex at 0
+           "ky="<<ky<<
+           "kyE="<<kyE<<               // expect ky - assiming pirmary track
+           "kzE="<<kzE<<               // expected kz - assuming primary tracks
+           "salpha="<<alpha<<          // sector alpha
+           "scos="<<scos<<              // tracking cosinus
+           "ssin="<<ssin<<              // tracking sinus
+           //
            // full fit
+           //
            "nf="<<nf<<                 //  total number of points
            "pyf.="<<&pyf<<             //  full OROC fit y
            "pzf.="<<&pzf<<             //  full OROC fit z
+           "vX.="<<&vecX<<              //  x cluster
+           "vY.="<<&vecY<<              //  y residual cluster
+           "vZ.="<<&vecZ<<              //  z residual cluster
            // quadrant and IROC fit
            "i0="<<i0<<                 // quadrant number
            "i1="<<i1<<                 
@@ -2627,7 +3136,7 @@ void  AliTPCcalibAlign::UpdateAlignSector(const AliTPCseed * track,Int_t isec){
   }
 }
 
-void AliTPCcalibAlign::UpdateSectorKalman(Int_t sector, Int_t quadrant0, Int_t quadrant1,  TMatrixD *p0, TMatrixD *c0, TMatrixD *p1, TMatrixD *c1 ){
+void AliTPCcalibAlign::UpdateSectorKalman(Int_t sector, Int_t quadrant0, Int_t quadrant1,  TMatrixD *const p0, TMatrixD *const c0, TMatrixD *const p1, TMatrixD *const c1 ){
   //
   //
   // tracks are refitted at sector middle