]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG0/AliCorrectionMatrix.cxx
updated multiplicity analysis for the INEL>0 case
[u/mrichter/AliRoot.git] / PWG0 / AliCorrectionMatrix.cxx
index 85070ddecb330944f1261cdad5b206672249ffd1..7cf9901d7cb201ccc8e769196928805ced3072f2 100644 (file)
@@ -27,6 +27,7 @@ AliCorrectionMatrix::AliCorrectionMatrix() : TNamed(),
   // default constructor
 }
 
+//____________________________________________________________________
 AliCorrectionMatrix::AliCorrectionMatrix(const Char_t* name, const Char_t* title) : TNamed(name, title),
   fhMeas(0),
   fhGene(0),
@@ -36,8 +37,10 @@ AliCorrectionMatrix::AliCorrectionMatrix(const Char_t* name, const Char_t* title
 }
 
 //____________________________________________________________________
-AliCorrectionMatrix::AliCorrectionMatrix(const AliCorrectionMatrix& c)
-  : TNamed(c)
+AliCorrectionMatrix::AliCorrectionMatrix(const AliCorrectionMatrix& c) : TNamed(c),
+  fhMeas(0),
+  fhGene(0),
+  fhCorr(0)
 {
   // copy constructor
   ((AliCorrectionMatrix &)c).Copy(*this);
@@ -74,7 +77,7 @@ AliCorrectionMatrix &AliCorrectionMatrix::operator=(const AliCorrectionMatrix &c
 {
   // assigment operator
 
-  if (this != &c) 
+  if (this != &c)
     ((AliCorrectionMatrix &) c).Copy(*this);
 
   return *this;
@@ -99,7 +102,7 @@ void AliCorrectionMatrix::Copy(TObject& c) const
 
 //________________________________________________________________________
 void AliCorrectionMatrix::SetAxisTitles(const Char_t* titleX, const Char_t* titleY, const Char_t* titleZ)
-{ 
+{
   //
   // method for setting the axis titles of the histograms
   //
@@ -154,48 +157,104 @@ Long64_t AliCorrectionMatrix::Merge(TCollection* list)
 void AliCorrectionMatrix::Divide()
 {
   //
-  // divide the histograms to get the correction
-  // 
+  // divides generated by measured to get the correction
+  //
 
-  if (!fhMeas || !fhGene)
+  if (!fhMeas || !fhGene || !fhCorr) {
+    AliDebug(AliLog::kError, "measured or generated histograms not available");
     return;
+  }
 
   fhCorr->Divide(fhGene, fhMeas, 1, 1, "B");
 
+  Int_t emptyBins = 0;
+  for (Int_t x=1; x<=fhCorr->GetNbinsX(); ++x)
+    for (Int_t y=1; y<=fhCorr->GetNbinsY(); ++y)
+      for (Int_t z=1; z<=fhCorr->GetNbinsZ(); ++z)
+        if (fhCorr->GetBinContent(x, y, z) == 0)
+          ++emptyBins;
+
+  if (emptyBins > 0)
+    printf("INFO: In %s we have %d empty bins (of %d) in the correction map\n", GetTitle(), emptyBins, fhCorr->GetNbinsX() * fhCorr->GetNbinsY() * fhCorr->GetNbinsZ());
 }
 
 //____________________________________________________________________
-Bool_t AliCorrectionMatrix::LoadHistograms(Char_t* fileName, Char_t* dir)
+void AliCorrectionMatrix::Multiply()
 {
   //
-  // loads the histograms from a file
+  // multiplies measured with correction to get the generated
   //
+
+  if (!fhMeas || !fhGene || !fhCorr)
+    return;
+
+  fhGene->Multiply(fhMeas, fhCorr, 1, 1, "B");
+}
+
+//____________________________________________________________________
+void AliCorrectionMatrix::Add(AliCorrectionMatrix* aMatrixToAdd, Float_t c) {
+  //
+  // adds the measured and generated of aMatrixToAdd to measured and generated of this
+  // 
+  // NB: the correction will naturally stay the same
   
-  TFile* fin = TFile::Open(fileName);  
-  
-  if(!fin) {
-    //Info("LoadHistograms",Form(" %s file does not exist",fileName));
+  fhMeas->Add(aMatrixToAdd->GetMeasuredHistogram(), c);
+  fhGene->Add(aMatrixToAdd->GetGeneratedHistogram(), c);
+}
+
+
+//____________________________________________________________________
+Bool_t AliCorrectionMatrix::LoadHistograms(const Char_t* dir)
+{
+  //
+  // loads the histograms from a file
+  // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
+  //
+
+  if (!dir)
+    dir = GetName();
+
+  if (!gDirectory->cd(dir))
     return kFALSE;
+
+  if (fhGene)
+  {
+    delete fhGene;
+    fhGene=0;
   }
-  
-  if(fhGene)  {delete fhGene;  fhGene=0;}
-  if(fhCorr)  {delete fhCorr;  fhCorr=0;}
-  if(fhMeas)  {delete fhMeas;  fhMeas=0;}
-  
-  fhMeas  = (TH2F*)fin->Get(Form("%s/meas_%s", dir,GetName()));
-  if(!fhMeas)  Info("LoadHistograms","No meas  hist available");
-  
-  fhGene  = (TH2F*)fin->Get(Form("%s/gene_%s",dir, GetName()));
-  if(!fhGene)  Info("LoadHistograms","No gene  hist available");
-  
-  fhCorr  = (TH2F*)fin->Get(Form("%s/corr_%s",dir, GetName()));
-  if(!fhCorr) 
+
+  if (fhCorr)
   {
-    Info("LoadHistograms","No corr  hist available");
-    return kFALSE;
+    delete fhCorr;
+    fhCorr=0;
   }
-      
-  return kTRUE;
+
+  if (fhMeas)
+  {
+    delete fhMeas;
+    fhMeas=0;
+  }
+
+  fhMeas  = dynamic_cast<TH1*> (gDirectory->Get("measured"));
+  if (!fhMeas)
+    Info("LoadHistograms", "No measured hist available");
+
+  fhGene  = dynamic_cast<TH1*> (gDirectory->Get("generated"));
+  if (!fhGene)
+    Info("LoadHistograms", "No generated hist available");
+
+  fhCorr  = dynamic_cast<TH1*> (gDirectory->Get("correction"));
+
+  Bool_t success = kTRUE;
+  if (!fhCorr)
+  {
+    Info("LoadHistograms", "No correction hist available");
+    success = kFALSE;
+  }
+
+  gDirectory->cd("..");
+
+  return success;
 }
 
 //____________________________________________________________________
@@ -205,37 +264,125 @@ void AliCorrectionMatrix::SaveHistograms()
   // saves the histograms
   //
 
-  fhMeas ->Write();
-  fhGene ->Write();
+  gDirectory->mkdir(GetName());
+  gDirectory->cd(GetName());
+
+  if (fhMeas)
+    fhMeas ->Write();
+
+  if (fhGene)
+    fhGene ->Write();
 
   if (fhCorr)
     fhCorr->Write();
+
+  gDirectory->cd("..");
 }
 
 //____________________________________________________________________
-void AliCorrectionMatrix::DrawHistograms()
+void AliCorrectionMatrix::DrawHistograms(const Char_t* canvasName)
 {
   //
-  // draws all the four histograms on one TCanvas
+  // draws all histograms on one TCanvas
+  // if canvasName is 0 the name of this object is taken
   //
 
-  TCanvas* canvas = new TCanvas(Form("correction_%s",fName.Data()), 
-                               Form("correction_%s",fName.Data()), 800, 800);
-  canvas->Divide(2, 2);
+  if (!canvasName)
+    canvasName = Form("%s_canvas", GetName());
+
+  TCanvas* canvas = new TCanvas(canvasName, GetTitle(), 1200, 400);
+  canvas->Divide(3, 1);
 
   canvas->cd(1);
   if (fhMeas)
     fhMeas->Draw("COLZ");
-  
+
   canvas->cd(2);
   if (fhGene)
+  {
+    // work around ROOT bug #22011
+    if (fhGene->GetEntries() == 0)
+      fhGene->SetEntries(1);
     fhGene->Draw("COLZ");
+  }
 
   canvas->cd(3);
   if (fhCorr)
     fhCorr->Draw("COLZ");
+}
+
+//____________________________________________________________________
+void AliCorrectionMatrix::ReduceInformation()
+{
+  // this function deletes the measured and generated histograms to reduce the amount of data
+  // in memory
+
+  if (fhMeas)
+  {
+    delete fhMeas;
+    fhMeas = 0;
+  }
+
+  if (fhGene)
+  {
+    delete fhGene;
+    fhGene = 0;
+  }
+}
 
-  canvas->cd(4);
+//____________________________________________________________________
+void AliCorrectionMatrix::Reset(Option_t* option)
+{
+  // resets the histograms
+
+  if (fhGene)
+    fhGene->Reset(option);
+
+  if (fhMeas)
+    fhMeas->Reset(option);
+
+  if (fhCorr)
+    fhCorr->Reset(option);
+}
+
+//____________________________________________________________________
+void AliCorrectionMatrix::SetCorrectionToUnity()
+{
+  // sets the correction matrix to unity
+
+  if (!fhCorr)
+    return;
+
+  for (Int_t x=0; x<=fhCorr->GetNbinsX()+1; ++x)
+    for (Int_t y=0; y<=fhCorr->GetNbinsY()+1; ++y)
+      for (Int_t z=0; z<=fhCorr->GetNbinsZ()+1; ++z)
+      {
+        fhCorr->SetBinContent(x, y, z, 1);
+        fhCorr->SetBinError(x, y, z, 0);
+      }
+}
+
+//____________________________________________________________________
+void AliCorrectionMatrix::Scale(Double_t factor)
+{
+  // scales the generated and measured histogram with the given factor
+
+  Printf("Scaling histograms with %f", factor);
+
+  fhMeas->Scale(factor);
+  fhGene->Scale(factor);
+}
+
+//____________________________________________________________________
+void AliCorrectionMatrix::ResetErrorsOnCorrections()
+{
+  // set the errors on the correction matrix to 0
+
+  if (!fhCorr)
+    return;
 
-  // add: draw here the stat. errors of the correction histogram
+  for (Int_t x=0; x<=fhCorr->GetNbinsX()+1; ++x)
+    for (Int_t y=0; y<=fhCorr->GetNbinsY()+1; ++y)
+      for (Int_t z=0; z<=fhCorr->GetNbinsZ()+1; ++z)
+        fhCorr->SetBinError(x, y, z, 0);
 }