]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCcalibTracks.cxx
Bug fix - Extrapolation as constant
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibTracks.cxx
index b2a9a47f6b2cfb8ce45247ba2398f7b22ddb5543..06b5a4eff8ad97d991c28dc285d55679d19ffaf7 100644 (file)
@@ -116,6 +116,7 @@ using namespace std;
 #include "TSystem.h"
 #include "TStatToolkit.h"
 #include "TCut.h"
+#include "THnSparse.h"
 
 
 
@@ -126,6 +127,12 @@ AliTPCcalibTracks::AliTPCcalibTracks():
   AliTPCcalibBase(),
   fClusterParam(0),
   fROC(0),
+  fHisDeltaY(0),    // THnSparse - delta Y 
+  fHisDeltaZ(0),    // THnSparse - delta Z 
+  fHisRMSY(0),      // THnSparse - rms Y 
+  fHisRMSZ(0),      // THnSparse - rms Z 
+  fHisQmax(0),      // THnSparse - qmax 
+  fHisQtot(0),      // THnSparse - qtot 
   fArrayAmpRow(0),
   fArrayAmp(0), 
   fArrayQDY(0), 
@@ -152,7 +159,6 @@ AliTPCcalibTracks::AliTPCcalibTracks():
    // 
    // AliTPCcalibTracks default constructor
    //    
-  SetDebugLevel(1);
   if (GetDebugLevel() > 0) cout << "AliTPCcalibTracks' default constructor called" << endl;  
 }   
 
@@ -162,6 +168,12 @@ AliTPCcalibTracks::AliTPCcalibTracks(const AliTPCcalibTracks& calibTracks):
   AliTPCcalibBase(calibTracks),
   fClusterParam(0),
   fROC(0),
+  fHisDeltaY(0),    // THnSparse - delta Y 
+  fHisDeltaZ(0),    // THnSparse - delta Z 
+  fHisRMSY(0),      // THnSparse - rms Y 
+  fHisRMSZ(0),      // THnSparse - rms Z 
+  fHisQmax(0),      // THnSparse - qmax 
+  fHisQtot(0),      // THnSparse - qtot 
   fArrayAmpRow(0),
   fArrayAmp(0), 
   fArrayQDY(0), 
@@ -268,6 +280,12 @@ AliTPCcalibTracks::AliTPCcalibTracks(const Text_t *name, const Text_t *title, Al
   AliTPCcalibBase(),
   fClusterParam(0),
   fROC(0),
+  fHisDeltaY(0),    // THnSparse - delta Y 
+  fHisDeltaZ(0),    // THnSparse - delta Z 
+  fHisRMSY(0),      // THnSparse - rms Y 
+  fHisRMSZ(0),      // THnSparse - rms Z 
+  fHisQmax(0),      // THnSparse - qmax 
+  fHisQtot(0),      // THnSparse - qtot 
   fArrayAmpRow(0),
   fArrayAmp(0), 
   fArrayQDY(0), 
@@ -317,6 +335,7 @@ AliTPCcalibTracks::AliTPCcalibTracks(const Text_t *name, const Text_t *title, Al
    } 
    fCuts = cuts;
    SetDebugLevel(logLevel);
+   MakeHistos();
    
    TH1::AddDirectory(kFALSE);
    
@@ -350,22 +369,22 @@ AliTPCcalibTracks::AliTPCcalibTracks(const Text_t *name, const Text_t *title, Al
       
       // amplitude
       sprintf(chname,"Amp_Sector%d",i);
-      his1 = new TH1F(chname,chname,250,0,500);         // valgrind 
+      his1 = new TH1F(chname,chname,100,0,32);         // valgrind 
       his1->SetXTitle("Max Amplitude (ADC)");
       fArrayAmp->AddAt(his1,i);
       sprintf(chname,"Amp_Sector%d",i+36);
-      his1 = new TH1F(chname,chname,200,0,600);         // valgrind 3   13,408,208 bytes in 229 blocks are still reachable
+      his1 = new TH1F(chname,chname,100,0,32);         // valgrind 3   13,408,208 bytes in 229 blocks are still reachable
       his1->SetXTitle("Max Amplitude (ADC)");
       fArrayAmp->AddAt(his1,i+36);
       
       // driftlength
       sprintf(chname, "driftlengt vs. charge, ROC %i", i);
-      prof1 = new TProfile(chname, chname, 500, 0, 250);
+      prof1 = new TProfile(chname, chname, 25, 0, 250);
       prof1->SetYTitle("Charge");
       prof1->SetXTitle("Driftlength");
       fArrayChargeVsDriftlength->AddAt(prof1,i);
       sprintf(chname, "driftlengt vs. charge, ROC %i", i+36);
-      prof1 = new TProfile(chname, chname, 500, 0, 250);
+      prof1 = new TProfile(chname, chname, 25, 0, 250);
       prof1->SetYTitle("Charge");
       prof1->SetXTitle("Driftlength");
       fArrayChargeVsDriftlength->AddAt(prof1,i+36);
@@ -423,16 +442,16 @@ AliTPCcalibTracks::AliTPCcalibTracks(const Text_t *name, const Text_t *title, Al
          Float_t qmean = GetQ(bin);
          char hname[200];
          sprintf(hname,"ResolY Pad%d Qmiddle%f",ipad, qmean);
-         his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 50, -1,1);
+         his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 100, -1,1);
          fArrayQDY->AddAt(his3D, bin);
          sprintf(hname,"ResolZ Pad%d Qmiddle%f",ipad, qmean);
-         his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 50, -1,1);
+         his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 100, -1,1);
          fArrayQDZ->AddAt(his3D, bin);
          sprintf(hname,"RMSY Pad%d Qmiddle%f",ipad, qmean);
-         his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 50, 0,1);
+         his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 100, 0,0.6);
          fArrayQRMSY->AddAt(his3D, bin);
          sprintf(hname,"RMSZ Pad%d Qmiddle%f",ipad, qmean);
-         his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 50, 0,1);
+         his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 100, 0,0.6);
          fArrayQRMSZ->AddAt(his3D, bin);
       }
    }
@@ -518,6 +537,13 @@ AliTPCcalibTracks::~AliTPCcalibTracks() {
      fcalPadRegionChargeVsDriftlength->Delete();
      delete fcalPadRegionChargeVsDriftlength;
   }
+  delete fHisDeltaY;    // THnSparse - delta Y 
+  delete fHisDeltaZ;    // THnSparse - delta Z 
+  delete fHisRMSY;      // THnSparse - rms Y 
+  delete fHisRMSZ;      // THnSparse - rms Z 
+  delete fHisQmax;      // THnSparse - qmax 
+  delete fHisQtot;      // THnSparse - qtot 
+
 }
    
   
@@ -527,13 +553,12 @@ void AliTPCcalibTracks::Process(AliTPCseed *track){
    // To be called in the selector
    // first AcceptTrack is evaluated, then calls all the following analyse functions: 
    // FillResolutionHistoLocal(track)
-   // AlignUpDown(track, esd)
+
    // 
   if (GetDebugLevel() > 5) Info("Process","Starting to process the track...");
    Int_t accpetStatus = AcceptTrack(track);
    if (accpetStatus == 0) {
       FillResolutionHistoLocal(track);
-      // AlignUpDown(track, esd);
    }
    else fRejectedTracksHisto->Fill(accpetStatus);
 }
@@ -791,9 +816,6 @@ void  AliTPCcalibTracks::FillResolutionHistoLocal(AliTPCseed * track){
       fFitterParY.Eval();
       fFitterParZ.Eval();
       Double_t chi2 = (fFitterParY.GetChisquare() + fFitterParZ.GetChisquare()) / (2. * nclFound - 6.);
-      //if (chi2 > kCutChi2) fRejectedTracksHisto->Fill(9);
-      //if (chi2 > kCutChi2) fClusterCutHisto->Fill(2, irow);
-      //if (chi2 > kCutChi2) continue;   // if chi^2 is too big goto next padrow
       TTreeSRedirector *cstream = GetDebugStreamer();
       if (cstream){
        (*cstream)<<"Cut9"<<
@@ -840,17 +862,6 @@ void  AliTPCcalibTracks::FillResolutionHistoLocal(AliTPCseed * track){
          TMatrixD chi2Z(difZT, TMatrixD::kMult, mulZ);
          cchi2 += chi2Z(0, 0);      
          
-         // REMOVE KINK - TO be fixed - proper chi2 calculation for curved track to be implemented
-         //if (chi2 * 0.25 > kCutChi2) fRejectedTracksHisto->Fill(8);
-         //if (chi2 * 0.25 > kCutChi2) fClusterCutHisto->Fill(3, irow);
-         //if (chi2 * 0.25 > kCutChi2) continue;   // if chi2 is too big goto next padrow
-         // fit tracklet with polynom of 2nd order and two polynoms of 1st order
-         // take both polynoms of 1st order, calculate difference of their parameters
-         // add covariance matrixes and calculate chi2 of this difference
-         // if this chi2 is bigger than a given threshold, assume that the current cluster is
-         // a kink an goto next padrow
-
-        TTreeSRedirector *cstream = GetDebugStreamer();
         if (cstream){
           (*cstream)<<"Cut8"<<
             "chi2="<<cchi2<<
@@ -890,16 +901,17 @@ void  AliTPCcalibTracks::FillResolutionHistoLocal(AliTPCseed * track){
       
       TProfile *profAmpRow =  (TProfile*)fArrayAmpRow->At(sector);
       if ( irow >= kFirstLargePad) max /= kLargePadSize;
-      profAmpRow->Fill( (Double_t)cluster0->GetRow(), max );
+      Double_t smax = TMath::Sqrt(max);
+      profAmpRow->Fill( (Double_t)cluster0->GetRow(), smax );
       TH1F *hisAmp =  (TH1F*)fArrayAmp->At(sector);
-      hisAmp->Fill(max);
+      hisAmp->Fill(smax);
       
       // remove the following two lines one day:
       TProfile *profDriftLength = (TProfile*)fArrayChargeVsDriftlength->At(sector);
-      profDriftLength->Fill( 250.-(Double_t)TMath::Abs(cluster0->GetZ()), max );
+      profDriftLength->Fill( 250.-(Double_t)TMath::Abs(cluster0->GetZ()), smax );
       
       TProfile *profDriftLengthTmp = (TProfile*)(fcalPadRegionChargeVsDriftlength->GetObject(isegment, padSize));
-      profDriftLengthTmp->Fill( 250.-(Double_t)TMath::Abs(cluster0->GetZ()), max );
+      profDriftLengthTmp->Fill( 250.-(Double_t)TMath::Abs(cluster0->GetZ()), smax );
       
       fHclusterPerPadrow->Fill(irow);   // fill histogram showing clusters per padrow
       Int_t ipad = TMath::Nint(cluster0->GetPad());
@@ -964,6 +976,27 @@ void  AliTPCcalibTracks::FillResolutionHistoLocal(AliTPCseed * track){
        if (GetDebugLevel() > 20) Info("FillResolutionHistoLocal","Filling 'TPCSelectorDebug.root', irow = %i", irow);
          FillResolutionHistoLocalDebugPart(track, cluster0, irow, angley, anglez, nclFound, kDelta);
       }  // if (useForResol && nclFound > 2 * kMinRatio * kDelta)
+      //
+      // Fill THN histograms
+      //
+      Double_t xvar[9];
+      xvar[1]=padSize;
+      xvar[2]=1.-TMath::Abs(cluster0->GetZ())/250.;
+      xvar[3]=cluster0->GetMax();
+      xvar[5]=angley;
+      xvar[6]=anglez;
+
+      xvar[4]=cluster0->GetPad()-TMath::Nint(cluster0->GetPad());      
+      xvar[0]=deltay;
+      fHisDeltaY->Fill(xvar);
+      xvar[0]=TMath::Sqrt(cluster0->GetSigmaY2());
+      fHisRMSY->Fill(xvar);
+
+      xvar[4]=cluster0->GetTimeBin()-TMath::Nint(cluster0->GetTimeBin());
+      xvar[0]=deltaz;
+      fHisDeltaZ->Fill(xvar);
+      xvar[0]=TMath::Sqrt(cluster0->GetSigmaZ2());
+      fHisRMSZ->Fill(xvar);
    
    }    // loop over all padrows along the track: for (Int_t irow = 0; irow < 159; irow++)
 }  // FillResolutionHistoLocal(...)
@@ -1363,7 +1396,7 @@ void AliTPCcalibTracks::Draw(Option_t* opt){
 }
 
 
-void AliTPCcalibTracks::MakeReport(Int_t stat, char* pathName){ 
+void AliTPCcalibTracks::MakeReport(Int_t stat, const char* pathName){ 
    // 
    // all functions are called, that produce pictures
    // the histograms are written to the directory 'pathName'
@@ -1382,7 +1415,7 @@ void AliTPCcalibTracks::MakeReport(Int_t stat, char* pathName){
 }
    
 
-void AliTPCcalibTracks::MakeAmpPlots(Int_t stat, char* pathName){ 
+void AliTPCcalibTracks::MakeAmpPlots(Int_t stat, const char* pathName){ 
    // 
    // creates several plots:
    // fArrayAmp.ps, fArrayAmpRow.ps and DeltaYZ.ps
@@ -1452,7 +1485,7 @@ void AliTPCcalibTracks::MakeAmpPlots(Int_t stat, char* pathName){
 }
 
 
-void AliTPCcalibTracks::MakeDeltaPlots(char* pathName){
+void AliTPCcalibTracks::MakeDeltaPlots(const char* pathName){
    // 
    // creates several plots:
    // DeltaYZ.ps: DeltaY and DeltaZ histogram with gaus fit
@@ -1489,7 +1522,7 @@ void AliTPCcalibTracks::MakeDeltaPlots(char* pathName){
 }
 
 
-void AliTPCcalibTracks::MakeChargeVsDriftLengthPlotsOld(char* pathName){
+void AliTPCcalibTracks::MakeChargeVsDriftLengthPlotsOld(const char* pathName){
    // 
    // creates charge vs. driftlength plots, one TProfile for each ROC
    // is not correct like this, should be one TProfile for each sector and padsize
@@ -1531,7 +1564,7 @@ void AliTPCcalibTracks::MakeChargeVsDriftLengthPlotsOld(char* pathName){
 }   
 
 
-void AliTPCcalibTracks::MakeChargeVsDriftLengthPlots(char* pathName){
+void AliTPCcalibTracks::MakeChargeVsDriftLengthPlots(const char* pathName){
    // 
    // creates charge vs. driftlength plots, one TProfile for each ROC
    // under development....
@@ -1593,7 +1626,7 @@ void AliTPCcalibTracks::MakeChargeVsDriftLengthPlots(char* pathName){
 
 
 
-void AliTPCcalibTracks::FitResolutionNew(char* pathName){
+void AliTPCcalibTracks::FitResolutionNew(const char* pathName){
    // 
    // calculates different resulution fits in Y and Z direction
    // the histograms are written to 'ResolutionYZ.ps'
@@ -1716,7 +1749,7 @@ void AliTPCcalibTracks::FitResolutionNew(char* pathName){
 }
 
 
-void AliTPCcalibTracks::FitRMSNew(char* pathName){
+void AliTPCcalibTracks::FitRMSNew(const char* pathName){
    // 
    // calculates different resulution-rms fits in Y and Z direction
    // the histograms are written to 'RMS_YZ.ps'
@@ -1839,7 +1872,7 @@ void AliTPCcalibTracks::FitRMSNew(char* pathName){
 }
 
 
-void AliTPCcalibTracks::MakeResPlotsQTree(Int_t minEntries, char* pathName){
+void AliTPCcalibTracks::MakeResPlotsQTree(Int_t minEntries, const char* pathName){
    //
    // Make tree with resolution parameters
    // the result is written to 'resol.root' in directory 'pathname'
@@ -2192,7 +2225,7 @@ Long64_t AliTPCcalibTracks::Merge(TCollection *collectionList) {
    AliTPCcalibTracks *calibTracks = 0;
    if (GetDebugLevel() > 1) cout << "start to iterate, filling lists" << endl;    
    Int_t counter = 0;
-   while ( (calibTracks = (AliTPCcalibTracks*)listIterator->Next()) ){
+   while ( (calibTracks = dynamic_cast<AliTPCcalibTracks*> (listIterator->Next())) ){
       // loop over all entries in the collectionList and get dataMembers into lists
       if (!calibTracks) continue;
       
@@ -2215,10 +2248,13 @@ Long64_t AliTPCcalibTracks::Merge(TCollection *collectionList) {
       clusterCutHistoList->Add(calibTracks->GetfClusterCutHisto());
       hclusterPerPadrowList->Add(calibTracks->GetfHclusterPerPadrow());
       hclusterPerPadrowRawList->Add(calibTracks->GetfHclusterPerPadrowRaw());
-      fCalPadClusterPerPad->Add(calibTracks->GetfCalPadClusterPerPad());
-      fCalPadClusterPerPadRaw->Add(calibTracks->GetfCalPadClusterPerPadRaw());
+      //
+      if (fCalPadClusterPerPad && calibTracks->GetfCalPadClusterPerPad())
+       fCalPadClusterPerPad->Add(calibTracks->GetfCalPadClusterPerPad());      
+      //      fCalPadClusterPerPadRaw->Add(calibTracks->GetfCalPadClusterPerPadRaw());
       counter++;
       if (GetDebugLevel() > 5) cout << "filling lists, object " << counter << " added." << endl;
+      AddHistos(calibTracks);
    }
    
    
@@ -2546,7 +2582,7 @@ void  AliTPCcalibTracks::MakeQPosNormAll(TTree * chainres, AliTPCClusterParam *
     //1. Load Parameters to be modified:
     //e.g:
     
-    AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT");
+    AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
     AliCDBManager::Instance()->SetRun(0) 
     AliTPCClusterParam * param = AliTPCcalibDB::Instance()->GetClusterParam();
 
@@ -2608,26 +2644,26 @@ void  AliTPCcalibTracks::MakeQPosNormAll(TTree * chainres, AliTPCClusterParam *
   //
   TString *strZ0 = toolkit.FitPlane(chainres,"(Cl.fZ-PZ0.fElements[0]):CSigmaZ0",fstringZ.Data(), "Cl.fDetector<36"+cutA, chi2,npoints,fitParamZ0,covMatrix,-1,0,maxPoints);
   printf("Z0 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
-  param->fPosZcor[0] = (TVectorD*) fitParamZ0.Clone();
+  param->PosZcor(0) = (TVectorD*) fitParamZ0.Clone();
   //
   TString *strZ1 = toolkit.FitPlane(chainres,"(Cl.fZ-PZ0.fElements[0]):CSigmaZ0",fstringZ.Data(), "Cl.fDetector>36"+cutA, chi2,npoints,fitParamZ1,covMatrix,-1,0,maxPoints);
   //
   printf("Z1 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
-  param->fPosZcor[1] = (TVectorD*) fitParamZ1.Clone();
-  param->fPosZcor[2] = (TVectorD*) fitParamZ1.Clone();
+  param->PosZcor(1) = (TVectorD*) fitParamZ1.Clone();
+  param->PosZcor(2) = (TVectorD*) fitParamZ1.Clone();
   //
   // Y corrections
   //   
   TString *strY0 = toolkit.FitPlane(chainres,"(Cl.fY-PY0.fElements[0]):CSigmaY0",fstringY.Data(), "Cl.fDetector<36"+cutA, chi2,npoints,fitParamY0,covMatrix,-1,0,maxPoints);
   printf("Y0 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
-  param->fPosYcor[0] = (TVectorD*) fitParamY0.Clone();
+  param->PosYcor(0) = (TVectorD*) fitParamY0.Clone();
   
 
   TString *strY1 = toolkit.FitPlane(chainres,"(Cl.fY-PY0.fElements[0]):CSigmaY0",fstringY.Data(), "Cl.fDetector>36"+cutA, chi2,npoints,fitParamY1,covMatrix,-1,0,maxPoints);
   //
   printf("Y1 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
-  param->fPosYcor[1] = (TVectorD*) fitParamY1.Clone();
-  param->fPosYcor[2] = (TVectorD*) fitParamY1.Clone();
+  param->PosYcor(1) = (TVectorD*) fitParamY1.Clone();
+  param->PosYcor(2) = (TVectorD*) fitParamY1.Clone();
   //
   //
   //
@@ -2640,3 +2676,85 @@ void  AliTPCcalibTracks::MakeQPosNormAll(TTree * chainres, AliTPCClusterParam *
 
 
 
+void AliTPCcalibTracks::MakeHistos(){
+  //
+  ////make THnSparse
+  //
+  //THnSparse  *fHisDeltaY;    // THnSparse - delta Y 
+  //THnSparse  *fHisDeltaZ;    // THnSparse - delta Z 
+  //THnSparse  *fHisRMSY;      // THnSparse - rms Y 
+  //THnSparse  *fHisRMSZ;      // THnSparse - rms Z 
+  //THnSparse  *fHisQmax;      // THnSparse - qmax 
+  //THnSparse  *fHisQtot;      // THnSparse - qtot 
+  // cluster  performance bins
+  // 0 - variable of interest
+  // 1 - pad type   - 0- short 1-medium 2-long pads
+  // 2 - drift length - drift length -0-1
+  // 3 - Qmax         - Qmax  - 2- 400
+  // 4 - cog          - COG position - 0-1
+  // 5 - tan(phi)     - local y angle
+  // 6 - tan(theta)   - local z angle
+  // 7 - sector       - sector number
+  Double_t xminTrack[8], xmaxTrack[8];
+  Int_t binsTrack[8];
+  TString axisName[8];
+  
+  //
+  binsTrack[0]=100;
+  axisName[0]  ="var";
+
+  binsTrack[1] =3;
+  xminTrack[1] =0; xmaxTrack[1]=3;
+  axisName[1]  ="pad type";
+  //
+  binsTrack[2] =10;
+  xminTrack[2] =0; xmaxTrack[2]=1;
+  axisName[2]  ="drift length";
+  //
+  binsTrack[3] =10;
+  xminTrack[3] =1; xmaxTrack[3]=400;
+  axisName[3]  ="Qmax";
+  //
+  binsTrack[4] =10;
+  xminTrack[4] =0; xmaxTrack[4]=1;
+  axisName[4]  ="cog";
+  //
+  binsTrack[5] =10;
+  xminTrack[5] =0; xmaxTrack[5]=2;
+  axisName[5]  ="tan(phi)";
+  //
+  binsTrack[6] =10;
+  xminTrack[6] =0; xmaxTrack[6]=2;
+  axisName[6]  ="tan(theta)";
+  //
+  xminTrack[0] =-0.5; xmaxTrack[0]=0.5;
+  fHisDeltaY=new THnSparseS("#Delta_{y} (cm)","#Delta_{y} (cm)", 7, binsTrack,xminTrack, xmaxTrack);
+  xminTrack[0] =-0.5; xmaxTrack[0]=0.5;
+  fHisDeltaZ=new THnSparseS("#Delta_{z} (cm)","#Delta_{z} (cm)", 7, binsTrack,xminTrack, xmaxTrack);
+  xminTrack[0] =0.; xmaxTrack[0]=0.5;
+  fHisRMSY=new THnSparseS("#RMS_{y} (cm)","#RMS_{y} (cm)", 7, binsTrack,xminTrack, xmaxTrack);
+  xminTrack[0] =0.; xmaxTrack[0]=0.5;
+  fHisRMSZ=new THnSparseS("#RMS_{z} (cm)","#RMS_{z} (cm)", 7, binsTrack,xminTrack, xmaxTrack);
+  xminTrack[0] =0.; xmaxTrack[0]=100;
+  fHisQmax=new THnSparseS("Qmax (ADC)","Qmax (ADC)", 7, binsTrack,xminTrack, xmaxTrack);
+
+  xminTrack[0] =0.; xmaxTrack[0]=250;
+  fHisQtot=new THnSparseS("Qtot (ADC)","Qtot (ADC)", 7, binsTrack,xminTrack, xmaxTrack);
+  BinLogX(fHisDeltaY,3);
+  BinLogX(fHisDeltaZ,3);
+  BinLogX(fHisRMSY,3);
+  BinLogX(fHisRMSZ,3);
+  BinLogX(fHisQmax,3);
+  BinLogX(fHisQtot,3);
+
+}  
+
+void    AliTPCcalibTracks::AddHistos(AliTPCcalibTracks* calib){
+  //
+  // Add histograms
+  //
+  if (calib->fHisDeltaY) fHisDeltaY->Add(calib->fHisDeltaY);
+  if (calib->fHisDeltaZ) fHisDeltaZ->Add(calib->fHisDeltaZ);
+  if (calib->fHisRMSY)   fHisRMSY->Add(calib->fHisRMSY);
+  if (calib->fHisRMSZ)   fHisRMSZ->Add(calib->fHisRMSZ);
+}