]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGLF/FORWARD/analysis2/AliFMDCorrELossFit.cxx
Merge branch 'master' into TPCdev
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / AliFMDCorrELossFit.cxx
index 312fa6c42292b9f40d5499c7b036695a8c8db078..602be8b87e5cd591bfcd059ce4490247855d3a22 100644 (file)
@@ -4,6 +4,7 @@
 //
 #include "AliFMDCorrELossFit.h"
 #include "AliForwardUtil.h"
+#include "AliLandauGaus.h"
 #include <TF1.h>
 #include <TGraph.h>
 #include <TBrowser.h>
@@ -11,6 +12,7 @@
 #include <THStack.h>
 #include <TLatex.h>
 #include <TLegend.h>
+#include <TLine.h>
 #include <TH1D.h>
 #include <AliLog.h>
 #include <TMath.h>
@@ -55,22 +57,22 @@ AliFMDCorrELossFit::ELossFit::ELossFit()
 }
 //____________________________________________________________________
 AliFMDCorrELossFit::ELossFit::ELossFit(Int_t quality, const TF1& f)
-  : fN(f.GetNpar() > AliForwardUtil::ELossFitter::kN ? 
-       Int_t(f.GetParameter(AliForwardUtil::ELossFitter::kN)) : 
+  : fN(f.GetNpar() > AliLandauGaus::kN ? 
+       Int_t(f.GetParameter(AliLandauGaus::kN)) : 
        1),
     fNu(f.GetNDF()),
     fChi2(f.GetChisquare()),
-    fC(f.GetParameter(AliForwardUtil::ELossFitter::kC)),
-    fDelta(f.GetParameter(AliForwardUtil::ELossFitter::kDelta)),
-    fXi(f.GetParameter(AliForwardUtil::ELossFitter::kXi)),
-    fSigma(f.GetParameter(AliForwardUtil::ELossFitter::kSigma)),
-    fSigmaN(f.GetParameter(AliForwardUtil::ELossFitter::kSigmaN)),
+    fC(f.GetParameter(AliLandauGaus::kC)),
+    fDelta(f.GetParameter(AliLandauGaus::kDelta)),
+    fXi(f.GetParameter(AliLandauGaus::kXi)),
+    fSigma(f.GetParameter(AliLandauGaus::kSigma)),
+    fSigmaN(f.GetParameter(AliLandauGaus::kSigmaN)),
     fA(0),
-    fEC(f.GetParError(AliForwardUtil::ELossFitter::kC)),
-    fEDelta(f.GetParError(AliForwardUtil::ELossFitter::kDelta)),
-    fEXi(f.GetParError(AliForwardUtil::ELossFitter::kXi)),
-    fESigma(f.GetParError(AliForwardUtil::ELossFitter::kSigma)),
-    fESigmaN(f.GetParError(AliForwardUtil::ELossFitter::kSigmaN)),
+    fEC(f.GetParError(AliLandauGaus::kC)),
+    fEDelta(f.GetParError(AliLandauGaus::kDelta)),
+    fEXi(f.GetParError(AliLandauGaus::kXi)),
+    fESigma(f.GetParError(AliLandauGaus::kSigma)),
+    fESigmaN(f.GetParError(AliLandauGaus::kSigmaN)),
     fEA(0),
     fQuality(quality),
     fDet(0), 
@@ -89,8 +91,8 @@ AliFMDCorrELossFit::ELossFit::ELossFit(Int_t quality, const TF1& f)
   fA  = new Double_t[fN];
   fEA = new Double_t[fN];
   for (Int_t i = 0; i < fN-1; i++) { 
-    fA[i]  = f.GetParameter(AliForwardUtil::ELossFitter::kA+i);
-    fEA[i] = f.GetParError(AliForwardUtil::ELossFitter::kA+i);
+    fA[i]  = f.GetParameter(AliLandauGaus::kA+i);
+    fEA[i] = f.GetParError(AliLandauGaus::kA+i);
   }
   fA[fN-1]  = -9999;
   fEA[fN-1] = -9999;
@@ -302,7 +304,7 @@ AliFMDCorrELossFit::ELossFit::Evaluate(Double_t x,
   //     \sum_{i=1}^{n} a_i f(x;\Delta_i,\xi_i,\sigma_i')
   // @f] 
   //
-  // (see AliForwardUtil::NLandauGaus) for the maximum @f$ N @f$
+  // (see AliLandauGaus::NLandauGaus) for the maximum @f$ N @f$
   // that fulfills the requirements 
   // 
   // Parameters:
@@ -312,8 +314,8 @@ AliFMDCorrELossFit::ELossFit::Evaluate(Double_t x,
   // Return:
   //    @f$ f_N(x;\Delta,\xi,\sigma')@f$ 
   //
-  return AliForwardUtil::NLandauGaus(x, fDelta, fXi, fSigma, fSigmaN, 
-                                    TMath::Min(maxN, UShort_t(fN)), fA);
+  return AliLandauGaus::Fn(x, fDelta, fXi, fSigma, fSigmaN, 
+                          TMath::Min(maxN, UShort_t(fN)), fA);
 }
 
 //____________________________________________________________________
@@ -334,7 +336,7 @@ AliFMDCorrELossFit::ELossFit::EvaluateWeighted(Double_t x,
   //
   // If the denominator is zero, then 1 is returned. 
   //
-  // See also AliForwardUtil::ILandauGaus and AliForwardUtil::NLandauGaus
+  // See also AliLandauGaus::Fi and AliLandauGaus::NLandauGaus
   // for more information on the evaluated functions. 
   // 
   // Parameters:
@@ -350,7 +352,7 @@ AliFMDCorrELossFit::ELossFit::EvaluateWeighted(Double_t x,
   for (Int_t i = 1; i <= n; i++) {
     Double_t a = (i == 1 ? 1 : fA[i-1]);
     if (fA[i-1] < 0) break;
-    Double_t f = AliForwardUtil::ILandauGaus(x,fDelta,fXi,fSigma,fSigmaN,i);
+    Double_t f = AliLandauGaus::Fi(x,fDelta,fXi,fSigma,fSigmaN,i);
     num += i * a * f;
     den += a * f;
   }
@@ -416,9 +418,9 @@ AliFMDCorrELossFit::ELossFit::Print(Option_t* option) const
            << (fNu == 0 ? 999 : fChi2 / fNu) << "\n"
            << "     Quality:   " << fQuality << "\n" 
            << "  NParticles:   " << fN << "  (" << FindMaxWeight() << ")\n"
-           << OUTPAR("Delta", fDelta, fEDelta) 
-           << OUTPAR("xi", fXi, fEXi)
-           << OUTPAR("sigma", fSigma, fESigma)
+           << OUTPAR("Delta",   fDelta,  fEDelta) 
+           << OUTPAR("xi",      fXi,     fEXi)
+           << OUTPAR("sigma",   fSigma,  fESigma)
            << OUTPAR("sigma_n", fSigmaN, fESigmaN);
   for (Int_t i = 0; i < fN-1; i++) 
     std::cout << OUTPAR(Form("a%d", i+2), fA[i], fEA[i]);
@@ -434,14 +436,14 @@ AliFMDCorrELossFit::ELossFit::GetF1(Int_t i, Double_t max) const
   TF1*           ret  = 0;
   
   if (i <= 0)
-    ret = AliForwardUtil::MakeNLandauGaus(fC * 1, fDelta, fXi, 
-                                         fSigma, fSigmaN, maxW/*fN*/,
-                                         fA,  lowX, upX);
+    ret = AliLandauGaus::MakeFn(fC * 1, fDelta, fXi, 
+                               fSigma, fSigmaN, maxW/*fN*/, fA,  lowX, upX);
+  else if (i == 1) 
+    ret = AliLandauGaus::MakeF1(fC, fDelta, fXi, fSigma, fSigmaN, lowX, upX);
   else if (i <= maxW) 
-    ret = AliForwardUtil::MakeILandauGaus(fC*(i == 1 ? 1 : fA[i-2]), 
-                                         fDelta, fXi, 
-                                         fSigma, fSigmaN, i, lowX, upX);
-
+    ret = AliLandauGaus::MakeFi(fC*(i == 1 ? 1 : fA[i-2]), 
+                               fDelta, fXi, fSigma, fSigmaN, i, lowX, upX);
+  
   return ret;
 }
 //____________________________________________________________________
@@ -452,7 +454,7 @@ AliFMDCorrELossFit::ELossFit::FindProbabilityCut(Double_t low) const
   TF1*     f   = 0;
   TGraph*  g   = 0;
   try {
-    if (!(f = GetF1())) 
+    if (!(f = GetF1(1,5))) // First landau up to Delta/Delta_{mip}=5
       throw TString("Didn't TF1 object");
     if (!(g = new TGraph(f, "i")))
       throw TString("Failed to integrate function");
@@ -527,6 +529,7 @@ AliFMDCorrELossFit::ELossFit::Draw(Option_t* option)
   bool good = false;
   bool vals = false;
   bool legd = false;
+  bool peak = false;
   if (opt.Contains("COMP")) { 
     opt.ReplaceAll("COMP","");
     comp = true;
@@ -546,7 +549,9 @@ AliFMDCorrELossFit::ELossFit::Draw(Option_t* option)
   if (!opt.Contains("SAME")) { 
     gPad->Clear();
   }
-
+  if (opt.Contains("PEAK")) { 
+    peak = true;
+  }
   TLegend* l = 0;
   if (legd) { 
     l = new TLegend(.3, .5, .59, .94);
@@ -556,11 +561,8 @@ AliFMDCorrELossFit::ELossFit::Draw(Option_t* option)
   }
   TObjArray cleanup;
   Int_t maxW = FindMaxWeight();
-  TF1* tot = AliForwardUtil::MakeNLandauGaus(fC * 1, 
-                                            fDelta, fXi, 
-                                            fSigma, fSigmaN, 
-                                            maxW/*fN*/,     fA, 
-                                            0.01,   10);
+  TF1* tot = AliLandauGaus::MakeFn(fC * 1, fDelta, fXi, fSigma, fSigmaN, 
+                                  maxW/*fN*/,     fA,  0.01,   10);
   tot->SetLineColor(kBlack);
   tot->SetLineWidth(2);
   tot->SetLineStyle(1);
@@ -626,6 +628,12 @@ AliFMDCorrELossFit::ELossFit::Draw(Option_t* option)
 
   }
 
+  if (peak) { 
+    TLine* pl = new TLine(fDelta, 0.01*max, fDelta, 1.5*max);
+    pl->SetLineStyle(2);
+    pl->SetLineColor(kBlack);
+    pl->Draw();
+  }
   if (!comp) { 
     gPad->cd();
     return;
@@ -635,7 +643,7 @@ AliFMDCorrELossFit::ELossFit::Draw(Option_t* option)
   opt.Append(" same");
   for (Int_t i=1; i <= fN; i++) { 
     if (good && i > maxW) break;
-    TF1* f = AliForwardUtil::MakeILandauGaus(fC*(i == 1 ? 1 : fA[i-2]), 
+    TF1* f = AliLandauGaus::MakeFi(fC*(i == 1 ? 1 : fA[i-2]), 
                                             fDelta, fXi, 
                                             fSigma, fSigmaN, 
                                             i,      0.01, 10);
@@ -779,11 +787,14 @@ AliFMDCorrELossFit::operator=(const AliFMDCorrELossFit& o)
   return *this;
 }
 #define CACHE(BIN,IDX,OFFSET) fCache[IDX*OFFSET+BIN-1]
+#define CACHEDR(BIN,D,R,OFFSET) \
+  CACHE(BIN,(D == 1 ? 0 : (D - 2) * 2 + 1 + (R=='I' || R=='i' ? 0 : 1)),OFFSET)
 
 //____________________________________________________________________
 void
 AliFMDCorrELossFit::CacheBins(UShort_t minQuality) const
 {
+  AliLandauGaus::EnableSigmaShift(TestBit(kHasShift));
   if (fCache.GetSize() > 0) return;
 
   Int_t nRings = fRings.GetEntriesFast();
@@ -1071,9 +1082,11 @@ AliFMDCorrELossFit::FindFit(UShort_t  d, Char_t r, Int_t etabin,
   }
   DMSG(fDebug, 10, "Got ringArray %s for FMD%d%c", ringArray->GetName(), d, r);
   if (fCache.GetSize() <= 0) CacheBins(minQ);
+#if 0
   Int_t idx = (d == 1 ? 0 : 
               (d - 2) * 2 + 1 + (r=='I' || r=='i' ? 0 : 1));
-  Int_t bin = CACHE(etabin, idx, fEtaAxis.GetNbins());
+#endif
+  Int_t bin = CACHEDR(etabin, d, r, fEtaAxis.GetNbins());
   
   if (bin < 0 || bin > ringArray->GetEntriesFast()) return 0;
   
@@ -1249,7 +1262,7 @@ namespace {
 TList*
 AliFMDCorrELossFit::GetStacks(Bool_t   err, 
                              Bool_t   rel, 
-                             Bool_t   /*good*/
+                             Bool_t   good
                              UShort_t maxN) const
 {
   // Get a list of THStacks 
@@ -1299,16 +1312,18 @@ AliFMDCorrELossFit::GetStacks(Bool_t   err,
     if (!fRings.At(i)) continue;
     TObjArray* a     = static_cast<TObjArray*>(fRings.At(i));
     Int_t      nFits = a->GetEntriesFast();
-    Int_t      color = AliForwardUtil::RingColor(IDX2DET(i), IDX2RING(i));
-
-    TH1D* hChi    = MakeHist(fEtaAxis,a->GetName(), "chi2",   color);
-    TH1D* hC      = MakeHist(fEtaAxis,a->GetName(), "c",      color);
-    TH1D* hDelta  = MakeHist(fEtaAxis,a->GetName(), "delta",  color);
-    TH1D* hXi     = MakeHist(fEtaAxis,a->GetName(), "xi",     color);
-    TH1D* hSigma  = MakeHist(fEtaAxis,a->GetName(), "sigma",  color);
+    UShort_t   d     = IDX2DET(i);
+    Char_t     r     = IDX2RING(i);
+    Int_t      color = AliForwardUtil::RingColor(d, r);
+
+    TH1* hChi    = MakeHist(fEtaAxis,a->GetName(), "chi2",   color);
+    TH1* hC      = MakeHist(fEtaAxis,a->GetName(), "c",      color);
+    TH1* hDelta  = MakeHist(fEtaAxis,a->GetName(), "delta",  color);
+    TH1* hXi     = MakeHist(fEtaAxis,a->GetName(), "xi",     color);
+    TH1* hSigma  = MakeHist(fEtaAxis,a->GetName(), "sigma",  color);
     // TH1D* hSigmaN = MakeHist(fEtaAxis,a->GetName(), "sigman", color);
-    TH1D* hN      = MakeHist(fEtaAxis,a->GetName(), "n",      color);
-    TH1D* hA[maxN];
+    TH1* hN      = MakeHist(fEtaAxis,a->GetName(), "n",      color);
+    TH1* hA[maxN];
     const char* ho = (rel || !err ? "hist" : "e");
     sChi2nu->Add(hChi,   "hist"); // 0
     sC     ->Add(hC,     ho);     // 1
@@ -1326,78 +1341,65 @@ AliFMDCorrELossFit::GetStacks(Bool_t   err,
       hA[k-1] = MakeHist(fEtaAxis,a->GetName(), Form("a%02d",k+1), color);
       static_cast<THStack*>(stacks->At(kN+k))->Add(hA[k-1], ho);
     }
-                         
-    for (Int_t j = 0; j < nFits; j++) {
-      ELossFit* f = static_cast<ELossFit*>(a->At(j));
-      if (!f) continue;
-
-      Int_t     b       = f->fBin;
-      Double_t  vChi2nu = (rel ? f->fQuality 
-                          : (f->fNu <= 0 ? 0 : f->fChi2 / f->fNu));
-      Double_t  vC      = (rel ? (f->fC     >0 ?f->fEC     /f->fC      :0) 
-                          : f->fC);
-      Double_t  vDelta  = (rel ? (f->fDelta >0 ?f->fEDelta /f->fDelta  :0) 
-                          : f->fDelta);
-      Double_t  vXi     = (rel ? (f->fXi    >0 ?f->fEXi    /f->fXi     :0) 
-                          : f->fXi);
-      Double_t  vSigma  = (rel ? (f->fSigma >0 ?f->fESigma /f->fSigma  :0) 
-                          : f->fSigma);
-      Int_t     nW      = (rel ? CACHE(j,i,fEtaAxis.GetNbins()) : 
-                          f->FindMaxWeight());
-      // Double_t  sigman = (rel ? (f->fSigmaN>0 ?f->fESigmaN/f->fSigmaN :0) 
-      //                     : f->SigmaN); 
-      hChi   ->SetBinContent(b, vChi2nu);
-      hN     ->SetBinContent(b, nW);
-      hC     ->SetBinContent(b, vC);
-      hDelta ->SetBinContent(b, vDelta);
-      hXi    ->SetBinContent(b, vXi);
-      hSigma ->SetBinContent(b, vSigma);
-      // if (vChi2nu > 1e-12) {
-      //       min[kChi2nu] = TMath::Min(min[kChi2nu], vChi2nu);
-      //       max[kChi2nu] = TMath::Max(max[kChi2nu], vChi2nu);
-      // }
-      // if (vC > 1e-12) {
-      //       min[kC] = TMath::Min(min[kC], vC);
-      //       max[kC] = TMath::Max(max[kC], vC);
-      // }
-      // if (vDelta > 1e-12) {
-      //       min[kDelta] = TMath::Min(min[kDelta], vDelta);
-      //       max[kDelta] = TMath::Max(max[kDelta], vDelta);
-      // }
-      // if (vXi > 1e-12) {
-      //       min[kXi] = TMath::Min(min[kXi], vXi);
-      //       max[kXi] = TMath::Max(max[kXi], vXi);
-      // }
-      // if (vSigma > 1e-12) {
-      //       min[kSigma] = TMath::Min(min[kSigma], vSigma);
-      //       max[kSigma] = TMath::Max(max[kSigma], vSigma);
-      // }
-      // if (nW > 1e-12) { 
-      //       min[kN] = TMath::Min(min[kN], Double_t(nW));
-      //       max[kN] = TMath::Max(max[kN], Double_t(nW));
-      // }
-      // hSigmaN->SetBinContent(b,  sigman);
-      if (!rel) {
-       hC     ->SetBinError(b, f->fEC);
-       hDelta ->SetBinError(b, f->fEDelta);
-       hXi    ->SetBinError(b, f->fEXi);
-       hSigma ->SetBinError(b, f->fESigma);
-       // hSigmaN->SetBinError(b, f->fESigmaN);
+    
+    if (good) {
+      for (Int_t j = 1; j <= fEtaAxis.GetNbins(); j++) {
+       ELossFit* f = FindFit(d, r, j, 20);
+       if (!f) continue;
+       
+       UpdateStackHist(f, rel, j, hChi, hN, hC, hDelta, hXi, hSigma, maxN, hA);
       }
-      for (Int_t k = 0; k < f->fN-1 && k < maxN; k++) { 
-       Double_t vA = (rel ? (f->fA[k] > 0 ? f->fEA[k] / f->fA[k] : 0) 
-                      : f->fA[k]);
-       hA[k]->SetBinContent(b, vA);
-       if (!rel) hA[k]->SetBinError(b, f->fEA[k]);
-       // if (vA > 1e-12) {
-       //   min[kN+1+k] = TMath::Min(min[kN+1+k], vA);
-       //   max[kN+1+k] = TMath::Max(max[kN+1+k], vA);
-       // }
+    }
+    else {
+      for (Int_t j = 0; j < nFits; j++) {
+       ELossFit* f = static_cast<ELossFit*>(a->At(j));
+       if (!f) continue;
+       
+       UpdateStackHist(f, rel, CACHE(j,i,fEtaAxis.GetNbins()), 
+                       hChi, hN, hC, hDelta, hXi, hSigma, maxN, hA);
       }
     }
   }
   return stacks;
 }
+//____________________________________________________________________
+void
+AliFMDCorrELossFit::UpdateStackHist(ELossFit* f,    Bool_t rel, 
+                                   Int_t     used, 
+                                   TH1*      hChi, TH1*   hN, 
+                                   TH1*      hC,   TH1*   hDelta, 
+                                   TH1*      hXi,  TH1*   hSigma, 
+                                   Int_t     maxN, TH1**  hA) const
+{
+  Int_t    b      =f->fBin;
+  Double_t chi2nu =(rel ? f->fQuality : (f->fNu <= 0 ? 0 : f->fChi2 / f->fNu));
+  Double_t c      =(rel ? (f->fC     >0 ?f->fEC     /f->fC     :0) : f->fC);
+  Double_t delta  =(rel ? (f->fDelta >0 ?f->fEDelta /f->fDelta :0) : f->fDelta);
+  Double_t xi     =(rel ? (f->fXi    >0 ?f->fEXi    /f->fXi    :0) : f->fXi);
+  Double_t sigma  =(rel ? (f->fSigma >0 ?f->fESigma /f->fSigma :0) : f->fSigma);
+  Int_t    w      =(rel ? used : f->FindMaxWeight());
+  // Double_t  sigman = (rel ? (f->fSigmaN>0 ?f->fESigmaN/f->fSigmaN :0) 
+  //                     : f->SigmaN); 
+  hChi   ->SetBinContent(b, chi2nu);
+  hN     ->SetBinContent(b, w);
+  hC     ->SetBinContent(b, c);
+  hDelta ->SetBinContent(b, delta);
+  hXi    ->SetBinContent(b, xi);
+  hSigma ->SetBinContent(b, sigma);
+
+  if (!rel) {
+    hC     ->SetBinError(b, f->fEC);
+    hDelta ->SetBinError(b, f->fEDelta);
+    hXi    ->SetBinError(b, f->fEXi);
+    hSigma ->SetBinError(b, f->fESigma);
+    // hSigmaN->SetBinError(b, f->fESigmaN);
+  }
+  for (Int_t k = 0; k < f->fN-1 && k < maxN; k++) { 
+    Double_t a = (rel ? (f->fA[k] > 0 ? f->fEA[k] / f->fA[k] : 0) : f->fA[k]);
+    hA[k]->SetBinContent(b, a);
+    if (!rel) hA[k]->SetBinError(b, f->fEA[k]);
+  }
+}
 
 //____________________________________________________________________
 void
@@ -1461,7 +1463,10 @@ AliFMDCorrELossFit::Draw(Option_t* option)
 
 
     THStack* stack = static_cast<THStack*>(stacks->At(i));
-
+    if (!stack->GetHists() || stack->GetHists()->GetEntries() <= 0) { 
+      AliWarningF("No histograms in %s", stack->GetName());
+      continue;
+    }
     // Double_t powMax = TMath::Log10(max[i]);
     // Double_t powMin = min[i] <= 0 ? powMax : TMath::Log10(min[i]);
     // if (powMax-powMin > 2. && min[i] != 0) p->SetLogy();