]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/hfe/AliHFEcontainer.cxx
Coverity fix
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEcontainer.cxx
index 4afd1d9309e5a39cb7b6fa76228b6360cbaffcf7..12449974b05f054abfc51d00f2da5669cf5134f3 100644 (file)
@@ -25,6 +25,7 @@
 #include <TClass.h>
 #include <TCollection.h>
 #include <THashList.h>
+#include <THnSparse.h>
 #include <TList.h>
 #include <TObjArray.h>
 #include <TObjString.h>
@@ -41,6 +42,7 @@ ClassImp(AliHFEcontainer::AliHFEvarInfo)
 AliHFEcontainer::AliHFEcontainer():
   TNamed("HFEcontainer", ""),
   fContainers(NULL),
+  fCorrelationMatrices(NULL),
   fVariables(NULL),
   fNVars(0),
   fNEvents(0)
@@ -48,13 +50,13 @@ AliHFEcontainer::AliHFEcontainer():
   //
   // Default constructor
   //
-  fContainers = new THashList();
 }
 
 //__________________________________________________________________
 AliHFEcontainer::AliHFEcontainer(const Char_t *name):
   TNamed(name, ""),
   fContainers(NULL),
+  fCorrelationMatrices(NULL),
   fVariables(NULL),
   fNVars(0),
   fNEvents(0)
@@ -63,12 +65,14 @@ AliHFEcontainer::AliHFEcontainer(const Char_t *name):
   // Default constructor
   //
   fContainers = new THashList();
+  fContainers->SetOwner();
 }
 
 //__________________________________________________________________
 AliHFEcontainer::AliHFEcontainer(const Char_t *name, UInt_t nVar):
   TNamed(name, ""),
   fContainers(NULL),
+  fCorrelationMatrices(NULL),
   fVariables(NULL),
   fNVars(0),
   fNEvents(0)
@@ -78,6 +82,7 @@ AliHFEcontainer::AliHFEcontainer(const Char_t *name, UInt_t nVar):
   // Setting Number of Variables too
   //
   fContainers = new THashList();
+  fContainers->SetOwner();
   SetNumberOfVariables(nVar);
 }
 
@@ -85,21 +90,39 @@ AliHFEcontainer::AliHFEcontainer(const Char_t *name, UInt_t nVar):
 AliHFEcontainer::AliHFEcontainer(const AliHFEcontainer &ref):
   TNamed(ref),
   fContainers(NULL),
+  fCorrelationMatrices(NULL),
   fVariables(NULL),
   fNVars(ref.fNVars),
   fNEvents(ref.fNEvents)
 {
   //
   // Copy constructor
-  // creates a new object with new containers
+  // creates a new object with new (empty) containers
   //
-  fContainers = new THashList;
-  for(Int_t ien = 0; ien < ref.fContainers->GetEntries(); ien++)
-    fContainers->Add(new AliCFContainer(*dynamic_cast<AliCFContainer *>(ref.fContainers->At(ien))));
   if(fNVars){
     fVariables = new TObjArray(fNVars);
-    for(UInt_t ivar = 0; ivar < fNVars; ivar++)
-      fVariables->AddAt(new AliHFEvarInfo(*dynamic_cast<AliHFEvarInfo *>(ref.fVariables->UncheckedAt(ivar))), ivar);
+    AliHFEvarInfo *vtmp = NULL;
+    for(UInt_t ivar = 0; ivar < fNVars; ivar++){
+      vtmp = static_cast<AliHFEvarInfo *>(ref.fVariables->UncheckedAt(ivar));
+      fVariables->AddAt(new AliHFEvarInfo(*vtmp), ivar);
+    }
+  }
+  fContainers = new THashList;
+  fContainers->SetOwner();
+  AliCFContainer *ctmp = NULL;
+  for(Int_t ien = 0; ien < ref.fContainers->GetEntries(); ien++){
+    ctmp = static_cast<AliCFContainer *>(ref.fContainers->At(ien));
+    CreateContainer(ctmp->GetName(), ctmp->GetTitle(), ctmp->GetNStep());
+  }
+  // Copy also correlation matrices
+  if(ref.fCorrelationMatrices){
+    THnSparseF *htmp = NULL;
+    fCorrelationMatrices = new THashList;
+    fCorrelationMatrices->SetOwner();
+    for(Int_t ien = 0; ien < ref.fCorrelationMatrices->GetEntries(); ien++){
+      htmp = static_cast<THnSparseF *>(ref.fCorrelationMatrices->At(ien));
+      CreateCorrelationMatrix(htmp->GetName(), htmp->GetTitle());
+    }
   }
 }
 
@@ -112,17 +135,38 @@ AliHFEcontainer &AliHFEcontainer::operator=(const AliHFEcontainer &ref){
   this->~AliHFEcontainer(); // cleanup old object before creating the new onwe
   TNamed::operator=(ref);
   fContainers = new THashList();
+  fCorrelationMatrices = NULL;
   fNVars = ref.fNVars;
-  for(Int_t ien = 0; ien < ref.fContainers->GetEntries(); ien++)
-    fContainers->Add(new AliCFContainer(*dynamic_cast<AliCFContainer *>(ref.fContainers->At(ien))));
   if(fNVars){
     fVariables = new TObjArray(fNVars);
-    for(UInt_t ivar = 0; ivar < fNVars; ivar++)
-      fVariables->AddAt(new AliHFEvarInfo(*dynamic_cast<AliHFEvarInfo *>(ref.fVariables->UncheckedAt(ivar))), ivar);
+    AliHFEvarInfo *vtmp = NULL;
+    for(UInt_t ivar = 0; ivar < fNVars; ivar++){
+      vtmp = static_cast<AliHFEvarInfo *>(ref.fVariables->UncheckedAt(ivar));
+      fVariables->AddAt(new AliHFEvarInfo(*vtmp), ivar);
+    }
   } else {
+    // No varible defined, do not try to copy anything
     fVariables = NULL;
+    return *this;
   }
 
+  // Reference contains content, try copying also the containers and the correlation matrices
+  fContainers = new THashList();
+  AliCFContainer *ctmp = NULL;
+  for(Int_t ien = 0; ien < ref.fContainers->GetEntries(); ien++){
+    ctmp = static_cast<AliCFContainer *>(ref.fContainers->At(ien));
+    fContainers->Add(new AliCFContainer(*ctmp));
+  }
+  // Copy also correlation matrices
+  if(ref.fCorrelationMatrices){
+    THnSparseF *htmp = NULL;
+    fCorrelationMatrices = new THashList;
+    fCorrelationMatrices->SetOwner();
+    for(Int_t ien = 0; ien < ref.fCorrelationMatrices->GetEntries(); ien++){
+      htmp = static_cast<THnSparseF *>(ref.fCorrelationMatrices->At(ien));
+      CreateCorrelationMatrix(htmp->GetName(), htmp->GetTitle());
+    }
+  }
   return *this;
 }
 
@@ -131,8 +175,8 @@ AliHFEcontainer::~AliHFEcontainer(){
   //
   // Destructor
   //
-  fContainers->Delete();
   delete fContainers;
+  if(fCorrelationMatrices) delete fCorrelationMatrices;
   if(fVariables){
     fVariables->Delete();
     delete fVariables;
@@ -149,10 +193,10 @@ Long64_t AliHFEcontainer::Merge(TCollection *coll){
   if(coll->IsEmpty())
     return 1;
 
-  TIterator *iter = coll->MakeIterator();
+  TIter iter(coll);
   TObject *o = NULL;
   Long64_t count = 0;
-  while((o = iter->Next())){
+  while((o = iter())){
     AliHFEcontainer *cont = dynamic_cast<AliHFEcontainer *>(o);
     if(!cont) continue;
 
@@ -161,6 +205,12 @@ Long64_t AliHFEcontainer::Merge(TCollection *coll){
     containers.Add(cont->fContainers);
     fContainers->Merge(&containers);
 
+    if(fCorrelationMatrices && cont->fCorrelationMatrices){
+      containers.Clear();
+      containers.Add(cont->fCorrelationMatrices);
+      fCorrelationMatrices->Merge(&containers);
+    }
+
     fNEvents += cont->GetNumberOfEvents();
     count++;
   }
@@ -192,13 +242,18 @@ void AliHFEcontainer::CreateContainer(const Char_t *name, const Char_t *title, U
   }
   
   Int_t *nBins = new Int_t[fNVars];
-  for(UInt_t ivar = 0; ivar < fNVars; ivar++) nBins[ivar] = (dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar)))->GetNumberOfBins();
   AliHFEvarInfo *var = NULL;
+  for(UInt_t ivar = 0; ivar < fNVars; ivar++){ 
+    var = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar));
+    nBins[ivar] = var ? var->GetNumberOfBins() : 0;
+  }
   AliCFContainer *cont = new AliCFContainer(name, title, nStep, fNVars, nBins);
   for(UInt_t ivar = 0; ivar < fNVars; ivar++){
     var = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar));
-    cont->SetBinLimits(ivar, var->GetBinning());
-    cont->SetVarTitle(ivar, var->GetVarName()->Data());
+    if(var){
+      cont->SetBinLimits(ivar, var->GetBinning());
+      cont->SetVarTitle(ivar, var->GetVarName()->Data());
+    }
   }
   delete[] nBins;
   fContainers->Add(cont);
@@ -206,7 +261,44 @@ void AliHFEcontainer::CreateContainer(const Char_t *name, const Char_t *title, U
 }
 
 //__________________________________________________________________
-AliCFContainer *AliHFEcontainer::GetCFContainer(const Char_t *name){
+void AliHFEcontainer::CreateCorrelationMatrix(const Char_t *name, const Char_t *title){
+  //
+  // Create Correlation Matrix
+  //
+  if(!fCorrelationMatrices){
+    fCorrelationMatrices = new THashList;
+    fCorrelationMatrices->SetName("fCorrelationMatrices");
+    fCorrelationMatrices->SetOwner();
+  }
+
+  Int_t *nBins = new Int_t[2*fNVars];
+  AliHFEvarInfo *var = NULL;
+  for(UInt_t ivar = 0; ivar < fNVars; ivar++){
+    var = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar));
+    if(var){
+      nBins[ivar] = var->GetNumberOfBins();
+      nBins[ivar+fNVars] = var->GetNumberOfBins();
+    }
+  }
+
+  THnSparseF * hTmp = new THnSparseF(name, title, 2*fNVars, nBins);
+  for(UInt_t ivar = 0; ivar < fNVars; ivar++){
+    var = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar));
+    if(var){
+      hTmp->SetBinEdges(ivar,var->GetBinning());
+      //hTmp->GetAxis(ivar)->Set(var->GetNumberOfBins(), var->GetBinning());
+      hTmp->GetAxis(ivar)->SetTitle(var->GetVarName()->Data());
+      //hTmp->GetAxis(ivar + fNVars)->Set(var->GetNumberOfBins(), var->GetBinning());
+      hTmp->GetAxis(ivar + fNVars)->SetTitle(Form("%s_{MC}", var->GetVarName()->Data()));
+      hTmp->SetBinEdges(ivar+fNVars,var->GetBinning());
+    }
+  }
+  hTmp->Sumw2();
+  fCorrelationMatrices->AddLast(hTmp);
+}
+
+//__________________________________________________________________
+AliCFContainer *AliHFEcontainer::GetCFContainer(const Char_t *name) const{
   //
   // Find a given container 
   //
@@ -214,17 +306,52 @@ AliCFContainer *AliHFEcontainer::GetCFContainer(const Char_t *name){
 }
 
 //__________________________________________________________________
-void AliHFEcontainer::FillCFContainer(const Char_t *name, UInt_t step, Double_t *content){
+THnSparseF *AliHFEcontainer::GetCorrelationMatrix(const Char_t *name) const{
+  //
+  // Find Correlation Matrix
+  //
+  if(fCorrelationMatrices) return dynamic_cast<THnSparseF *>(fCorrelationMatrices->FindObject(name));
+  else return 0x0;
+
+}
+
+//__________________________________________________________________
+void AliHFEcontainer::FillCFContainer(const Char_t *name, UInt_t step, const Double_t * const content, Double_t weight) const {
   //
   // Fill container
   //
   AliCFContainer *cont = GetCFContainer(name);
   if(!cont) return;
-  cont->Fill(content, step);
+  cont->Fill(content, step, weight);
+}
+
+//__________________________________________________________________
+void AliHFEcontainer::FillCFContainerStepname(const Char_t *name, const Char_t *steptitle, const Double_t * const content, Double_t weight)const{
+  //
+  // Fill container
+  //
+  AliCFContainer *cont = GetCFContainer(name);
+  if(!cont) return;
+  // find the matching step title
+  Int_t mystep = -1;
+  for(Int_t istep = 0; istep < cont->GetNStep(); istep++){
+    TString tstept = cont->GetStepTitle(istep);
+    if(!tstept.CompareTo(steptitle)){
+      mystep = istep;
+      break;
+    }
+  }
+  if(mystep < 0){
+    // step not found
+    AliDebug(1, Form("Step %s not found in container %s", steptitle, name));
+    return;
+  }
+  AliDebug(1, Form("Filling step %s(%d) for container %s", steptitle, mystep, name));
+  cont->Fill(content, mystep, weight);
 }
 
 //__________________________________________________________________
-AliCFContainer *AliHFEcontainer::MakeMergedCFContainer(const Char_t *name, const Char_t *title, const Char_t* contnames){
+AliCFContainer *AliHFEcontainer::MakeMergedCFContainer(const Char_t *name, const Char_t *title, const Char_t* contnames) const {
   //
   // Merge CF Container out of several containers 
   // Container names are separated by :
@@ -249,7 +376,7 @@ AliCFContainer *AliHFEcontainer::MakeMergedCFContainer(const Char_t *name, const
   Int_t *dummyBinning = new Int_t[fNVars];
   for(UInt_t ibin = 0; ibin < fNVars; ibin++) dummyBinning[ibin] = 1;
   AliCFContainer *cmerged = new AliCFContainer(name, title, nStepMerged, fNVars, dummyBinning);
-  delete dummyBinning;
+  delete[] dummyBinning;
   // Fill container with content
   AliInfo("Filling new container");
   Int_t cstep = 0;
@@ -262,12 +389,25 @@ AliCFContainer *AliHFEcontainer::MakeMergedCFContainer(const Char_t *name, const
   }
   return cmerged;
 }
+
+//__________________________________________________________________
+void AliHFEcontainer::SetStepTitle(const Char_t *contname, const Char_t *steptitle, UInt_t step){
+  //
+  // Set title for given analysis step in container with name contname
+  //
+  AliCFContainer *cont = GetCFContainer(contname);
+  if(!cont) return;
+  if(step >= static_cast<UInt_t>(cont->GetNStep())) return;
+  cont->SetStepTitle(step, steptitle);
+}
+
 //__________________________________________________________________
 void AliHFEcontainer::MakeLinearBinning(UInt_t var, UInt_t nBins, Double_t begin, Double_t end){
   //
   // Set Linear binning for the given container
   //
-  (dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var)))->SetBinning(nBins, AliHFEtools::MakeLinearBinning(nBins, begin, end));
+  AliHFEvarInfo *myvar = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var));
+  if(myvar) myvar->SetBinning(nBins, AliHFEtools::MakeLinearBinning(nBins, begin, end));
 }
 
 //__________________________________________________________________
@@ -275,7 +415,17 @@ void AliHFEcontainer::MakeLogarithmicBinning(UInt_t var, UInt_t nBins, Double_t
   //
   // Set Logarithmic binning for the given container
   //
-  (dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var)))->SetBinning(nBins, AliHFEtools::MakeLogarithmicBinning(nBins, begin, end));
+  AliHFEvarInfo *myvar = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var));
+  if(myvar) myvar->SetBinning(nBins, AliHFEtools::MakeLogarithmicBinning(nBins, begin, end));
+}
+
+//__________________________________________________________________
+void AliHFEcontainer::MakeUserDefinedBinning(UInt_t var, UInt_t nBins, const Double_t *binning){
+  //
+  // Set User defined binning
+  //
+  AliHFEvarInfo *myvar = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var));
+  if(myvar) myvar->SetBinning(nBins, binning);
 }
 
 //__________________________________________________________________
@@ -283,7 +433,8 @@ void AliHFEcontainer::SetVariableName(UInt_t var, const Char_t *varname){
   //
   // Variable name
   // 
-  (dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var)))->SetVarName(varname);
+  AliHFEvarInfo *myvar = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var));
+  if(myvar) myvar->SetVarName(varname);
 }
 
 //__________________________________________________________________
@@ -307,22 +458,29 @@ void AliHFEcontainer::Print(const Option_t *)const{
     if(nVars != fNVars)
       std::cout << "Inconsistency in number of Variables [" << fNVars << "|" << nVars << "]" << std::endl;
     AliHFEvarInfo *var = NULL;
-    for(UInt_t ivar = 0; ivar < fNVars; ivar++){
-      var = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar));
-      std::cout << "Variable " << ivar << ": Name: " << var->GetVarName()->Data() << ", Number of Bins: " << var->GetNumberOfBins() << std::endl;
+    if(fVariables){
+      for(UInt_t ivar = 0; ivar < fNVars; ivar++){
+        var = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar));
+        if(var)
+          std::cout << "Variable " << ivar << ": Name: " << var->GetVarName()->Data() << ", Number of Bins: " << var->GetNumberOfBins() << std::endl;
+      }
     }
   }
   std::cout << std::endl;
 
   // Print CF Containers:
-  std::cout << "Containers[" << fContainers->GetEntries() << "]: "<< std::endl;
-  std::cout << "=====================================================\n";
-  for(Int_t icont = 0; icont < fContainers->GetEntries(); icont++){
-    AliCFContainer *c = dynamic_cast<AliCFContainer *>(fContainers->At(icont));
-    std::cout << "Name: " << c->GetName() << ", Title: "  << c->GetTitle() << std::endl;
-    for(Int_t istep = 0; istep < c->GetNStep(); istep++)
-      std::cout << "Step " << istep << ": Title " << c->GetStepTitle(istep) << std::endl;
-    std::cout << "------------------------------------------------------\n";
+  if(fContainers){
+    std::cout << "Containers[" << fContainers->GetEntries() << "]: "<< std::endl;
+    std::cout << "=====================================================\n";
+    for(Int_t icont = 0; icont < fContainers->GetEntries(); icont++){
+      AliCFContainer *c = dynamic_cast<AliCFContainer *>(fContainers->At(icont));
+      if(c){
+        std::cout << "Name: " << c->GetName() << ", Title: "  << c->GetTitle() << std::endl;
+        for(Int_t istep = 0; istep < c->GetNStep(); istep++)
+          std::cout << "Step " << istep << ": Title " << c->GetStepTitle(istep) << std::endl;
+      }
+      std::cout << "------------------------------------------------------\n";
+    }
   }
   std::cout << "Number of Events: " << fNEvents << std::endl;
 }
@@ -391,7 +549,7 @@ void AliHFEcontainer::AliHFEvarInfo::SetVarName(const Char_t *name){
 }
 
 //__________________________________________________________________
-void AliHFEcontainer::AliHFEvarInfo::SetBinning(UInt_t nBins, Double_t *content){
+void AliHFEcontainer::AliHFEvarInfo::SetBinning(UInt_t nBins, const Double_t *content){
   // Setter for binning
   //
   fBinning->Set(nBins + 1, content);