#include <AliLog.h>
#include "AliCFGridSparse.h"
#include "AliCFContainer.h"
#include "TAxis.h"
ClassImp(AliCFContainer)
AliCFContainer::AliCFContainer() :
AliCFFrame(),
fNStep(0),
fGrid(0x0)
{
}
AliCFContainer::AliCFContainer(const Char_t* name, const Char_t* title, const Int_t nSelSteps, const Int_t nVarIn, const Int_t* nBinIn) :
AliCFFrame(name,title),
fNStep(nSelSteps),
fGrid(0x0)
{
fGrid = new AliCFGridSparse*[fNStep];
for (Int_t istep=0; istep<fNStep; istep++) {
fGrid[istep] = new AliCFGridSparse(Form("%s_SelStep%d",name,istep),Form("step%d",istep),nVarIn,nBinIn);
fGrid[istep]->SumW2();
}
for (Int_t iVar=0; iVar<nVarIn; iVar++) SetVarTitle(iVar,Form("var%d",iVar));
AliInfo(Form("Grids created for %d steps required \n => Don't forget to set the bin limits !!",fNStep));
}
AliCFContainer::AliCFContainer(const AliCFContainer& c) :
AliCFFrame(c.fName,c.fTitle),
fNStep(0),
fGrid(0x0)
{
c.Copy(*this);
}
AliCFContainer::~AliCFContainer()
{
if (fGrid) {
for ( Int_t istep=0; istep<fNStep; istep++ )
delete fGrid[istep];
}
delete [] fGrid;
}
AliCFContainer &AliCFContainer::operator=(const AliCFContainer &c)
{
if (this != &c) c.Copy(*this);
return *this;
}
void AliCFContainer::Copy(TObject& c) const
{
AliCFFrame::Copy(c);
AliCFContainer& target = (AliCFContainer &) c;
target.fNStep = fNStep;
target.fGrid = new AliCFGridSparse*[fNStep];
for (Int_t iStep=0; iStep<fNStep; iStep++) {
if (fGrid[iStep]) target.fGrid[iStep] = new AliCFGridSparse(*(fGrid[iStep]));
}
}
void AliCFContainer::Fill(const Double_t *var, Int_t istep, Double_t weight)
{
if(istep >= fNStep || istep < 0){
AliError("Non-existent selection step, grid was not filled");
return;
}
fGrid[istep]->Fill(var,weight);
}
TH1* AliCFContainer::Project(Int_t istep, Int_t ivar1, Int_t ivar2, Int_t ivar3) const
{
if (istep >= fNStep || istep < 0){
AliError("Non-existent selection step, return NULL");
return 0x0;
}
return fGrid[istep]->Project(ivar1,ivar2,ivar3);
}
AliCFContainer* AliCFContainer::MakeSlice(Int_t nVars, const Int_t* vars, const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const
{
Int_t* steps = new Int_t[fNStep];
for (Int_t iStep=0;iStep<fNStep;iStep++) steps[iStep]=iStep;
AliCFContainer* out = MakeSlice(fNStep,steps,nVars,vars,varMin,varMax,useBins);
delete [] steps ;
return out;
}
AliCFContainer* AliCFContainer::MakeSlice(Int_t nSteps, const Int_t* steps,
Int_t nVars, const Int_t* vars,
const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const
{
if (nVars < 1 || nVars > GetNVar()) AliError("Bad number of dimensions required for the slice");
if (nSteps< 1 || nSteps> fNStep) AliError("Bad number of steps required for the slice");
AliInfo(Form("Making a slice in %d dimension(s)",nVars));
AliCFGridSparse** grids = new AliCFGridSparse*[nSteps] ;
for (Int_t iStep=0; iStep<nSteps; iStep++) grids[iStep] = fGrid[steps[iStep]]->MakeSlice(nVars,vars,varMin,varMax,useBins);
TAxis ** axis = new TAxis*[nVars];
for (Int_t iVar=0; iVar<nVars; iVar++) axis[iVar] = ((AliCFGridSparse*)grids[0])->GetGrid()->GetAxis(iVar);
Int_t* bins=new Int_t[nVars];
for (Int_t iVar=0; iVar<nVars; iVar++) bins[iVar] = axis[iVar]->GetNbins();
AliCFContainer* out = new AliCFContainer(fName,fTitle,nSteps,nVars,bins);
for (Int_t iVar=0; iVar<nVars; iVar++) {
Int_t nBins = bins[iVar];
Double_t *array = new Double_t[nBins+1];
for (Int_t iBin=1; iBin<=nBins+1; iBin++) {
array[iBin-1] = axis[iVar]->GetBinLowEdge(iBin);
}
out->SetBinLimits(iVar,array);
delete [] array;
}
for (Int_t iStep=0; iStep<nSteps; iStep++) out->SetGrid(iStep,grids[iStep]);
delete [] bins;
delete [] axis ;
delete [] grids;
return out;
}
Long64_t AliCFContainer::Merge(TCollection* list)
{
if (!list)
return 0;
if (list->IsEmpty())
return 1;
TIter iter(list);
TObject* obj;
Int_t count = 0;
while ((obj = iter())) {
AliCFContainer* entry = dynamic_cast<AliCFContainer*> (obj);
if (entry == 0)
continue;
this->Add(entry);
count++;
}
return count+1;
}
void AliCFContainer::Add(const AliCFContainer* aContainerToAdd, Double_t c)
{
if ((aContainerToAdd->GetNStep() != fNStep) ||
(aContainerToAdd->GetNVar() != GetNVar()) ||
(aContainerToAdd->GetNBinsTotal() != GetNBinsTotal()))
{
AliError("Different number of steps/sensitive variables/grid elements: cannot add the containers");
return;
}
for (Int_t istep=0; istep<fNStep; istep++) {
fGrid[istep]->Add(aContainerToAdd->GetGrid(istep),c);
}
}
Float_t AliCFContainer::GetOverFlows( Int_t ivar, Int_t istep, Bool_t exclusive) const {
if(istep >= fNStep || istep < 0){
AliError("Non-existent selection step, return -1");
return -1.;
}
return fGrid[istep]->GetOverFlows(ivar,exclusive);
}
Float_t AliCFContainer::GetUnderFlows( Int_t ivar, Int_t istep, Bool_t exclusive) const {
if(istep >= fNStep || istep < 0){
AliError("Non-existent selection step, return -1");
return -1.;
}
return fGrid[istep]->GetUnderFlows(ivar,exclusive);
}
Float_t AliCFContainer::GetEntries(Int_t istep) const {
if(istep >= fNStep || istep < 0){
AliError("Non-existent selection step, return -1");
return -1.;
}
return fGrid[istep]->GetEntries();
}
Double_t AliCFContainer::GetIntegral( Int_t istep) const
{
if(istep >= fNStep || istep < 0){
AliError("Non-existent selection step, return -1");
return -1.;
}
return fGrid[istep]->GetIntegral();
}
void AliCFContainer::SetRangeUser(Int_t ivar, Double_t varMin, Double_t varMax, Bool_t useBins) const
{
if (ivar >= GetNVar() || ivar < 0){
AliError("Non-existent selection var");
return ;
}
for (Int_t iStep=0; iStep<GetNStep(); iStep++) fGrid[iStep]->SetRangeUser(ivar,varMin,varMax,useBins);
}
void AliCFContainer::SetRangeUser(const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const
{
for (Int_t iStep=0; iStep<GetNStep(); iStep++) fGrid[iStep]->SetRangeUser(varMin,varMax,useBins);
}
void AliCFContainer::Print(const Option_t*) const {
AliInfo("====================================================================================");
AliInfo(Form("AliCFContainer : name = %s title = %s",GetName(),GetTitle()));
AliInfo(Form("number of steps \t %d",GetNStep()));
for (Int_t iStep=0;iStep<GetNStep();iStep++) AliInfo(Form("step %d \t -> %s",iStep,GetStepTitle(iStep)));
AliInfo(Form("number of variables \t %d",GetNVar()));
for (Int_t iVar=0;iVar<GetNVar();iVar++) {
Double_t *binLimits = new Double_t[GetNBins(iVar)+1];
GetBinLimits(iVar,binLimits);
AliInfo(Form("variable %d \t -> %s : %d bins in [%f,%f]",iVar,GetVarTitle(iVar),GetNBins(iVar),binLimits[0],binLimits[GetNBins(iVar)]));
delete[] binLimits;
}
AliInfo("====================================================================================");
}