* The calib hist binning is changed to log binning
authorcblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 17 May 2012 13:38:39 +0000 (13:38 +0000)
committercblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 17 May 2012 13:38:39 +0000 (13:38 +0000)
so that the precision is preserved and the memory consumption is reduced.

* one bug in FillCalibHist is fixed.

TRD/AliTRDdEdxBaseUtils.cxx
TRD/AliTRDdEdxBaseUtils.h
TRD/AliTRDdEdxCalibHistArray.cxx
TRD/AliTRDdEdxCalibUtils.cxx

index 085fedf..8021a0f 100644 (file)
@@ -66,6 +66,29 @@ Double_t AliTRDdEdxBaseUtils::fgQScale = 45;
 //===================================================================================
 //                                   Math and Histogram
 //===================================================================================
+void AliTRDdEdxBaseUtils::BinLogX(TAxis *axis) 
+{
+  //
+  // Method for the correct logarithmic binning of histograms
+  // copied and modified from AliTPCcalibBase
+
+  const Int_t bins = axis->GetNbins();
+
+  const Double_t from = axis->GetXmin();
+  const Double_t to = axis->GetXmax();
+  if (from<EPSILON) return;
+  Double_t *new_bins = new Double_t[bins + 1];
+
+  new_bins[0] = from;
+  const Double_t factor = pow(to/from, 1./bins);
+
+  for (int i = 1; i <= bins; i++) {
+   new_bins[i] = factor * new_bins[i-1];
+  }
+  axis->Set(bins, new_bins);
+  delete [] new_bins;
+}
+
 void AliTRDdEdxBaseUtils::GetCDFCuts(const TH1D *hh, const Int_t ncut, Double_t cuts[], const Double_t cdfs[], const Double_t thres)
 {
   //
index 4d39b03..b4aab1f 100644 (file)
@@ -56,6 +56,7 @@ class AliTRDdEdxBaseUtils
   //===================================================================================
   //                                   Math and Histogram
   //===================================================================================
+  static void BinLogX(TAxis *axis);
   static void GetCDFCuts(const TH1D *hh, const Int_t ncut, Double_t cuts[], const Double_t cdfs[], const Double_t thres);
   static Double_t GetMeanRMS(const Double_t nn, const Double_t sum, const Double_t w2s, Double_t * grms=0x0, Double_t * gerr=0x0);
   static Double_t TruncatedMean(const Int_t nx, const Double_t xdata[], const Double_t lowfrac, const Double_t highfrac, Double_t * grms=0x0, Double_t * gerr=0x0, Double_t *wws=0x0);
index 91a24fb..310d534 100644 (file)
@@ -26,7 +26,7 @@
 //  
 //
 #include "THnBase.h"
-#include "THnSparse.h"
+#include "THn.h"
 #include "TCollection.h"
 
 #include "AliTRDdEdxBaseUtils.h"
@@ -43,12 +43,20 @@ AliTRDdEdxCalibHistArray::AliTRDdEdxCalibHistArray(const Bool_t kNoInv):
   SetName(GetArrayName());
   SetOwner(kTRUE);
 
-  const Int_t    nbin[2]={AliTRDdEdxBaseUtils::NTRDtimebin(), 11250};
-  const Double_t xmin[2]={0,       0};
+  const Int_t    nbin[2]={AliTRDdEdxBaseUtils::NTRDtimebin(), 100};
+  const Double_t xmin[2]={0,       0.1};
   const Double_t xmax[2]={nbin[0], 20};
+  const TString aname[2]={"globalTimeBin", "trdqovertpc"};
+  const TString atitle[2]={"det * AliTRDseedV1::kNtb + itb", "TRD-Cluster-Q / TPC-Signal"};
 
   for(Int_t iter=0; iter<GetSize(); iter++){
-    THnBase *hi = new THnSparseF(GetNameAt(iter), "", 2, nbin, xmin, xmax);
+    THnBase *hi = new THnF(GetNameAt(iter), "", 2, nbin, xmin, xmax);
+    for(Int_t iaxis=0; iaxis<2; iaxis++){
+      TAxis *xi = hi->GetAxis(iaxis);
+      xi->SetName(aname[iaxis]);
+      xi->SetTitle(atitle[iaxis]);
+      AliTRDdEdxBaseUtils::BinLogX(xi);
+    }
     AddAt(hi, iter);
   }
 }
index f8574c1..790bb0e 100644 (file)
@@ -218,10 +218,16 @@ void AliTRDdEdxCalibUtils::FillHist(const Int_t ncls, const TVectorD *arrayQ, co
   if(!hcalib){printf("AliTRDdEdxCalibUtils::FillCalibHist errro hcalib null!!\n"); exit(1);}
 
   for(Int_t ii=0; ii<ncls; ii++){
-    const Double_t dq = (*arrayQ)[ii];
-    const Double_t xx = (*arrayX)[ii];
-
+    Double_t dq = (*arrayQ)[ii]/scale;
+    const Double_t qmin = hcalib->GetAxis(1)->GetXmin() +0.5 * hcalib->GetAxis(1)->GetBinWidth(1);
     const Double_t qmax = hcalib->GetAxis(1)->GetXmax() -0.5 * hcalib->GetAxis(1)->GetBinWidth(1);
+
+    if(dq<qmin)
+      dq = qmin;
+    if(dq>qmax)
+      dq = qmax;
+
+    const Double_t xx = (*arrayX)[ii];
     const Double_t xmin = hcalib->GetAxis(0)->GetXmin();
     const Double_t xmax = hcalib->GetAxis(0)->GetXmax();
 
@@ -229,7 +235,7 @@ void AliTRDdEdxCalibUtils::FillHist(const Int_t ncls, const TVectorD *arrayQ, co
       printf("AliTRDdEdxCalibUtils::FillCalibHist error x overflow or underflow! %s %15f %15f %15f\n", hcalib->GetName(),  xx, xmin, xmax); exit(1);
     }
 
-    const Double_t var[]={xx, TMath::Min(dq, qmax)/scale};
+    const Double_t var[]={xx, dq};
     hcalib->Fill(var);
   }
 }