#include <TClass.h>
#include <TCollection.h>
#include <THashList.h>
+#include <THnSparse.h>
#include <TList.h>
#include <TObjArray.h>
#include <TObjString.h>
AliHFEcontainer::AliHFEcontainer():
TNamed("HFEcontainer", ""),
fContainers(NULL),
+ fCorrelationMatrices(NULL),
fVariables(NULL),
fNVars(0),
fNEvents(0)
//
// Default constructor
//
- fContainers = new THashList();
}
//__________________________________________________________________
AliHFEcontainer::AliHFEcontainer(const Char_t *name):
TNamed(name, ""),
fContainers(NULL),
+ fCorrelationMatrices(NULL),
fVariables(NULL),
fNVars(0),
fNEvents(0)
// 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)
// Setting Number of Variables too
//
fContainers = new THashList();
+ fContainers->SetOwner();
SetNumberOfVariables(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());
+ }
}
}
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;
}
//
// Destructor
//
- fContainers->Delete();
delete fContainers;
+ if(fCorrelationMatrices) delete fCorrelationMatrices;
if(fVariables){
fVariables->Delete();
delete fVariables;
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;
containers.Add(cont->fContainers);
fContainers->Merge(&containers);
+ if(fCorrelationMatrices && cont->fCorrelationMatrices){
+ containers.Clear();
+ containers.Add(cont->fCorrelationMatrices);
+ fCorrelationMatrices->Merge(&containers);
+ }
+
fNEvents += cont->GetNumberOfEvents();
count++;
}
}
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);
}
//__________________________________________________________________
-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
//
}
//__________________________________________________________________
-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 :
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;
}
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));
}
//__________________________________________________________________
//
// 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);
}
//__________________________________________________________________
//
// Variable name
//
- (dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var)))->SetVarName(varname);
+ AliHFEvarInfo *myvar = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var));
+ if(myvar) myvar->SetVarName(varname);
}
//__________________________________________________________________
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;
}
}
//__________________________________________________________________
-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);