]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
AliTPCcalibDButil.cxx - make function public -possibility to debug from command...
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 15 Jul 2010 07:23:09 +0000 (07:23 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 15 Jul 2010 07:23:09 +0000 (07:23 +0000)
AliTPCcalibSummary.h    - adding trend info of relative change of pulser and CE timing - in respect with reference run
AliTPCcalibTracks.h  AliTPCcalibTracks.cxx - adding tracklet residual histograms
AliTPCCalPad.h AliTPCCalPad.cxx  - make calib pad from the histogram

Marian

TPC/AliTPCCalPad.cxx
TPC/AliTPCCalPad.h
TPC/AliTPCcalibSummary.cxx
TPC/AliTPCcalibSummary.h
TPC/AliTPCcalibTracks.cxx
TPC/AliTPCcalibTracks.h

index c330bacd5a4a70a9dd6913da5ed0764b105206e5..65c27125088dbee8a504e4caab0a30fba5679a1b 100644 (file)
@@ -858,3 +858,31 @@ void  AliTPCCalPad::Draw(Option_t* option){
 
 
 }
+
+
+AliTPCCalPad * AliTPCCalPad::MakeCalPadFromHistoRPHI(TH2 * hisA, TH2* hisC){
+  //
+  // Make cal pad from r-phi histograms
+  //
+  AliTPCROC *proc= AliTPCROC::Instance();
+  AliTPCCalPad *calPad = new AliTPCCalPad("his","his");
+  Float_t globalPos[3];
+  for (Int_t isec=0; isec<72; isec++){
+    AliTPCCalROC* calRoc  = calPad->GetCalROC(isec);
+    TH2 * his = ((isec%36<18) ? hisA:hisC);
+    for (UInt_t irow=0; irow<calRoc->GetNrows(); irow+=1){
+      Int_t jrow=irow;
+      if (isec>=36) jrow+=63;
+      Float_t xrow=proc->GetPadRowRadii(isec, irow);
+      for (UInt_t ipad=0;ipad<proc->GetNPads(isec,irow);ipad+=1){
+        proc->GetPositionGlobal(isec,irow,ipad, globalPos);
+        Double_t phi=TMath::ATan2(globalPos[1],globalPos[0]);
+        //if (phi<0) phi+=TMath::Pi()*2;
+        Int_t bin=his->FindBin(phi,jrow);
+        Float_t value= his->GetBinContent(bin);
+       calRoc->SetValue(irow,ipad,value);
+      }
+    }
+  }
+  return calPad;
+}
index 412e236c1c81ff360aa78c20570d1e80b91d4b9c..3fe540763f3003b27cc2798a83d6953689501662 100644 (file)
@@ -28,6 +28,7 @@ class TH2F;
 class TH1F;
 class TCanvas;
 class TTree;
+class TH2;
 
 class AliTPCCalPad : public TNamed {
  public:
@@ -74,7 +75,7 @@ class AliTPCCalPad : public TNamed {
   //
   static TCanvas * MakeReportPadSector(TTree *chain, const char* varName, const char*varTitle, const char *axisTitle, Float_t min, Float_t max, const char * cutUser="");
   static TCanvas * MakeReportPadSector2D(TTree *chain, const char* varName, const char*varTitle, const char *axisTitle, Float_t min, Float_t max, const char *cutUser="");
-
+  static AliTPCCalPad *MakeCalPadFromHistoRPHI(TH2 * hisA, TH2* hisC);
  protected:
   AliTPCCalROC *fROC[kNsec];                    //  Array of ROC objects which contain the values per pad
   ClassDef(AliTPCCalPad,1)                      //  TPC calibration class for parameters which are saved per pad
index 6827f2b2ca9cb4febd0a7f94278120fa2198f9fc..5f3b7f81a93a074508177159296d651ce71891e4 100644 (file)
@@ -56,6 +56,8 @@ delete calibSummary;
 #include "TGraphErrors.h"
 #include <AliCTPTimeParams.h>
 #include <AliTPCcalibSummary.h>
+#include <TStatToolkit.h>
+#include <TCut.h>
 //
 //
 //
@@ -122,6 +124,8 @@ void AliTPCcalibSummary::Process(const char * runList, Int_t first, Int_t last){
     fDButil->UpdateFromCalibDB();
     fDButil->SetReferenceRun(irun);
     fDButil->UpdateRefDataFromOCDB();
+    fCalibDB->CreateGUITree("calPads.root");
+    fDButil->CreateGUIRefTree("calPadsRef.root");
     //
     AliDCSSensorArray *arrHV=fCalibDB->GetVoltageSensors(irun);
     if (!arrHV) continue;
@@ -151,6 +155,9 @@ void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){
   fDButil->UpdateFromCalibDB();
   fDButil->SetReferenceRun(irun);
   fDButil->UpdateRefDataFromOCDB();
+  fCalibDB->CreateGUITree("calPads.root");
+  fDButil->CreateGUIRefTree("calPadsRef.root");
+
   //
   AliSplineFit *fitVdrift=0x0;
   Int_t startTimeGRP=0, stopTimeGRP=0;
@@ -369,6 +376,8 @@ void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){
     ProcessCTP(irun,itime);
     ProcessAlign(irun,itime);
     ProcessGain(irun,itime);
+    ProcessDriftCERef();
+    ProcessPulserRef();
 
 
     (*fPcstream)<<"dcs"<<      
@@ -738,4 +747,170 @@ void AliTPCcalibSummary::ProcessAlign(Int_t run, Int_t timeStamp){
 }
 
 
+void AliTPCcalibSummary::ProcessDriftCERef(){
+  //
+  // Get fit of residuals if CE in respect with reference
+  // data
+  //
+  static TVectorD  sec(72);
+  static TVectorD vec0(72);
+  static TVectorD vecLy(72);
+  static TVectorD vecLx(72);
+  static TVectorD vecChi2(72);
+  static TVectorD vecN(72);
+  //
+  static TVectorD vecA0(72);
+  static TVectorD vecALy(72);
+  static TVectorD vecALx(72);
+  static TVectorD vecAChi2(72);
+  //
+  static TVectorD vecQ(72);
+  static TVectorD vecQRef(72);
+  static Bool_t isCalc=kFALSE;
+  
+  TFile f("calPads.root");
+  TFile fref("calPadsRef.root");
+  TTree * tree = (TTree*)f.Get("calPads");
+  TTree * treeRef = (TTree*)fref.Get("calPads");
+  tree->AddFriend(treeRef,"R");
+  tree->SetAlias("inCE","((CEQmean.fElements>35)&&abs(CETmean.fElements)<1.5&&abs(CETrms.fElements/1.2-1)<0.2)");  // outlyerTrms
+  tree->SetAlias("inCER","((R.CEQmean.fElements>35)&&abs(R.CETmean.fElements)<1.5&&abs(R.CETrms.fElements/1.2-1)<0.2)");  // outlyerTrms
+  //
+  if (!isCalc){
+    // make fits only once
+    TStatToolkit toolkit;
+    Double_t chi2=0;
+    Int_t    npoints=0;
+    TVectorD param;
+    TMatrixD covar;
+    tree->SetAlias("dt","CETmean.fElements-R.CETmean.fElements");
+    TCut cutAll ="inCE&&inCER&&abs(CETmean.fElements-R.CETmean.fElements)<0.5"; 
+    TString  fstringG="";              // global part
+    fstringG+="ly.fElements++";
+    fstringG+="(lx.fElements-134.)++";  
+    for (Int_t isec=0; isec<72; isec++){
+      TStatToolkit::FitPlane(tree,"2.64*dt", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
+      if (npoints<3) continue;
+      printf("Sector=%d\n",isec);
+      vec0[isec]=param[0];
+      vecLy[isec]=param[1];
+      vecLx[isec]=param[2];
+      sec[isec]=isec;
+      vecN[isec]=npoints;
+
+      TStatToolkit::FitPlane(tree,"2.64*CETmean.fElements", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
+      if (npoints<3) continue;
+      printf("Sector=%d\n",isec);
+      vecA0[isec]=param[0];
+      vecALy[isec]=param[1];
+      vecALx[isec]=param[2];
+      vecAChi2[isec]=TMath::Sqrt(chi2/npoints);
+      tree->Draw("CETmean.fElements",Form("sector==%d",isec)+cutAll);
+      tree->Draw("CETmean.fElements/R.CETmean.fElements",Form("sector==%d",isec)+cutAll);
+    }
+    isCalc=kTRUE;
+  }
+  (*fPcstream)<<"dcs"<<     // CE information
+    "CETSector.="<<&sec<<    // sector numbers
+    //                      // fit in respect to reference
+    "CETRef0.="<<&vec0<<    // offset change
+    "CETRefY.="<<&vecLy<<   // slope y change - rad
+    "CETRefX.="<<&vecLx<<   // slope x change - rad
+    "CETRefChi2.="<<&vecChi2<<    // chi2 (rms in cm)
+    "CETRefN.="<<&vecN<<     //number of accepted points
+    //                       // fit in respect per mean per side
+    "CET0.="<<&vecA0<<       // offset change
+    "CETY.="<<&vecALy<<      // slope y change - rad
+    "CETX.="<<&vecALx<<      // slope x change - rad
+    "CETChi2.="<<&vecAChi2;  // chi2 (rms in cm)
+}
 
+void AliTPCcalibSummary::ProcessPulserRef(){
+  //
+  // Get fit of residuals if Pulser in respect with reference
+  // data
+  //
+  static TVectorD  sec(72);
+  static TVectorD vec0(72);
+  static TVectorD vecLy(72);
+  static TVectorD vecLx(72);
+  static TVectorD vecChi2(72);
+  static TVectorD vecN(72);
+  //
+  static TVectorD vecA0(72);
+  static TVectorD vecALy(72);
+  static TVectorD vecALx(72);
+  static TVectorD vecAChi2(72);
+  static Bool_t isCalc=kFALSE;
+  
+  TFile f("calPads.root");
+  TFile fref("calPadsRef.root");
+  TTree * tree = (TTree*)f.Get("calPads");
+  TTree * treeRef = (TTree*)fref.Get("calPads");
+  tree->AddFriend(treeRef,"R");
+  
+  tree->SetAlias("inPulser","(abs(PulserTmean.fElements-PulserTmean_Median)<1.5&&abs(PulserTrms.fElements-PulserTrms_Median)<0.2)");  // outlyerTrms
+  tree->SetAlias("inPulserR","(abs(R.PulserTmean.fElements-R.PulserTmean_Median)<1.5&&abs(R.PulserTrms.fElements-R.PulserTrms_Median)<0.2)");  // outlyerTrms
+  //
+  if (!isCalc){
+    // make fits only once
+    TStatToolkit toolkit;
+    Double_t chi2=0;
+    Int_t    npoints=0;
+    TVectorD param;
+    TMatrixD covar;
+    tree->SetAlias("dt","PulserTmean.fElements-R.PulserTmean.fElements");
+    TCut cutAll ="inPulser&&inPulserR"; 
+    TString  fstringG="";              // global part
+    fstringG+="ly.fElements++";
+    fstringG+="(lx.fElements-134.)++";  
+    for (Int_t isec=0; isec<72; isec++){
+      TStatToolkit::FitPlane(tree,"dt", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
+      if (npoints<3) continue;
+      printf("Setor=%d\n",isec);
+      vec0[isec]=param[0];
+      vecLy[isec]=param[1];
+      vecLx[isec]=param[2];
+      sec[isec]=isec;
+      vecN[isec]=npoints;
+
+      TStatToolkit::FitPlane(tree,"PulserTmean.fElements", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
+      if (npoints<3) continue;
+      printf("Setor=%d\n",isec);
+      vecA0[isec]=param[0];
+      vecALy[isec]=param[1];
+      vecALx[isec]=param[2];
+      vecAChi2[isec]=TMath::Sqrt(chi2/npoints);
+    }
+    isCalc=kTRUE;
+  }
+  (*fPcstream)<<"dcs"<<     // Pulser information
+    "PulserTSector.="<<&sec<<    // sector numbers
+    //                      // fit in respect to reference
+    "PulserTRef0.="<<&vec0<<    // offset change
+    "PulserTRefY.="<<&vecLy<<   // slope y change - rad
+    "PulserTRefX.="<<&vecLx<<   // slope x change - rad
+    "PulserTRefChi2.="<<&vecChi2<<    // chi2 (rms in cm)
+    "PulserTRefN.="<<&vecN<<     //number of accepted points
+    //                       // fit in respect per mean per side
+    "PulserT0.="<<&vecA0<<       // offset change
+    "PulserTY.="<<&vecALy<<      // slope y change - rad
+    "PulserTX.="<<&vecALx<<      // slope x change - rad
+    "PulserTChi2.="<<&vecAChi2;  // chi2 (rms in cm)
+}
+
+
+
+
+
+// TCanvas * DrawCEDiff(TTree * tree){
+  
+//   TCanvas *canvasIO = new TCanvas("canvasCEIO","canvasCEIO");
+//   canvasIO->Divide(6,6);
+//   for (Int_t isec=0; isec<36; isec++){
+//     canvasIO->cd(isec+1);
+//     dcs->Draw(Form("CET0.fElements[%d]-CET0.fElements[%d]",isec+36,isec),Form("abs(CETRef0.fElements[%d])<0.3",isec),"");
+//     printf("%d\t%f\t%f\n",isec,dcs->GetHistogram()->GetMean(),dcs->GetHistogram()->GetRMS());
+//   }
+
+// }
index 0c6edd73975442796d0165678369b64709a49ad4..acc2ddd806b40f2e92a35734e485de86bf0bfb39 100644 (file)
@@ -31,6 +31,8 @@ public:
   void ProcessAlign(Int_t run, Int_t timeStamp);
   void ProcessGain(Int_t run, Int_t timeStamp);
 
+  void ProcessDriftCERef();
+  void ProcessPulserRef();
 protected:
   AliTPCcalibDB     *fCalibDB;      //! pointer to the TPC calib manager
   AliTPCcalibDButil *fDButil;       //! pointer to the TPC calib db utils
index d89e22632bf622dfcd00071712f4a824bf437b96..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);
    
@@ -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,16 +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
-
         if (cstream){
           (*cstream)<<"Cut8"<<
             "chi2="<<cchi2<<
@@ -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(...)
@@ -2221,6 +2254,7 @@ Long64_t AliTPCcalibTracks::Merge(TCollection *collectionList) {
       //      fCalPadClusterPerPadRaw->Add(calibTracks->GetfCalPadClusterPerPadRaw());
       counter++;
       if (GetDebugLevel() > 5) cout << "filling lists, object " << counter << " added." << endl;
+      AddHistos(calibTracks);
    }
    
    
@@ -2642,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);
+}
index 49d8e15d4e0fa2819052a2ddc81256be0627c7ed..7c7cab4a8ee4b10f59c1174f7a9241382cc35ce2 100644 (file)
@@ -58,6 +58,7 @@ public :
   void     Process(AliESDEvent *event) {AliTPCcalibBase::Process(event);};
   void     Process(AliESDtrack *track, Int_t runNo=-1){AliTPCcalibBase::Process(track,runNo);};
   virtual Long64_t Merge(TCollection *li);
+  void    AddHistos(AliTPCcalibTracks* calib);
   void     MakeResPlotsQTree(Int_t minEntries = 100, const char* pathName = "plots");
   static void MakeQPosNormAll(TTree * chain, AliTPCClusterParam * param, Int_t maxPoints=1000000);
    void     MakeReport(Int_t stat, const char* pathName = "plots");     // calls all functions that procude pictures, results are written to pathName, stat is the minimal statistic threshold
@@ -101,6 +102,7 @@ public :
   AliTPCCalPad*          GetfCalPadClusterPerPadRaw() const {return fCalPadClusterPerPadRaw;}
   AliTPCCalPadRegion*    GetCalPadRegionchargeVsDriftlength() const {return fcalPadRegionChargeVsDriftlength;}
   AliTPCcalibTracksCuts* GetCuts() {return fCuts;}
+  void MakeHistos();  //make THnSparse
 protected:         
   
 private:
@@ -112,6 +114,14 @@ private:
    void FillResolutionHistoLocalDebugPart(AliTPCseed *track, AliTPCclusterMI *cluster0, Int_t irow, Float_t  angley, Float_t  anglez, Int_t nclFound, Int_t kDelta);
    AliTPCClusterParam *fClusterParam; // pointer to cluster parameterization
    AliTPCROC *fROC;          //!
+  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 
+
+
    TObjArray *fArrayAmpRow; // array with amplitudes versus row for given sector 
    TObjArray *fArrayAmp;    // array with amplitude for sectors
    TObjArray *fArrayQDY;    // q binned delta Y histograms
@@ -120,6 +130,7 @@ private:
    TObjArray *fArrayQRMSZ;  // q binned delta Z histograms 
    TObjArray *fArrayChargeVsDriftlength; // array of arrays of TProfiles with charge vs. driftlength for each padsize and sector
    AliTPCCalPadRegion *fcalPadRegionChargeVsDriftlength;  // CalPadRegion, one TProfile for charge vs. driftlength for each padsize and sector
+
    TH1F      *fDeltaY;      // integrated delta y histo
    TH1F      *fDeltaZ;      // integrated delta z histo
    TObjArray *fResolY;      // array of resolution histograms Y