**************************************************************************/
//--------------------------------------------------------------------//
// //
-// AliCFContainer Class //
-// Class to accumulate data on an N-dimensional grids, at different //
+// AliCFContainer Class //
+// Class to accumulate data on an N-dimensional grids, at different //
// selection stages. To be used as an input to get corrections for //
// Reconstruction & Trigger efficiency //
// //
#include "AliCFGrid.h"
#include "AliCFGridSparse.h"
#include "AliCFContainer.h"
-
+#include "TAxis.h"
//____________________________________________________________________
ClassImp(AliCFContainer)
AliCFContainer::AliCFContainer() :
AliCFFrame(),
fNStep(0),
- fExclOffEntriesInProj(kTRUE),
fGrid(0x0)
{
//
AliCFContainer::AliCFContainer(const Char_t* name, const Char_t* title) :
AliCFFrame(name,title),
fNStep(0),
- fExclOffEntriesInProj(kTRUE),
fGrid(0x0)
{
// default constructor
AliCFContainer::AliCFContainer(const Char_t* name, const Char_t* title,const Int_t nSelSteps, const Int_t nVarIn, const Int_t * nBinIn, const Double_t *binLimitsIn, const Bool_t useSparse) :
AliCFFrame(name,title,nVarIn,nBinIn,binLimitsIn),
fNStep(0),
- fExclOffEntriesInProj(kTRUE),
fGrid(0x0)
{
//
AliCFContainer::AliCFContainer(const AliCFContainer& c) :
AliCFFrame(),
fNStep(c.fNStep),
- fExclOffEntriesInProj(c.fExclOffEntriesInProj),
fGrid(c.fGrid)
{
//
//
AliCFContainer& target = (AliCFContainer &) c;
target.fNStep=fNStep;
- target.fExclOffEntriesInProj=fExclOffEntriesInProj;
target.fNVar=fNVar;
target.fNDim=fNDim;
target.fNVarBinLimits=fNVarBinLimits;
AliError("Non-existent selection step, return NULL");
return 0x0;
}
- fGrid[istep]->SetExcludeOffEntriesInProj(fExclOffEntriesInProj);
+ if(ivar >= fNVar || ivar < 0){
+ AliError("Non-existent selection step, return NULL");
+ return 0x0;
+ }
+
return fGrid[istep]->Project(ivar);
}
//___________________________________________________________________
AliError("Non-existent selection step, return NULL");
return 0x0;
}
- fGrid[istep]->SetExcludeOffEntriesInProj(fExclOffEntriesInProj);
+ if(ivar1 >= fNVar || ivar1 < 0 || ivar2 >= fNVar || ivar2 < 0){
+ AliError("Non-existent selection step, return NULL");
+ return 0x0;
+ }
+
return fGrid[istep]->Project(ivar1,ivar2);
}
//___________________________________________________________________
AliError("Non-existent selection step, return NULL");
return 0x0;
}
- fGrid[istep]->SetExcludeOffEntriesInProj(fExclOffEntriesInProj);
+ if(ivar1 >= fNVar || ivar1 < 0 ||
+ ivar2 >= fNVar || ivar2 < 0 ||
+ ivar3 >= fNVar || ivar3 < 0 ) {
+ AliError("Non-existent selection step, return NULL");
+ return 0x0;
+ }
+
return fGrid[istep]->Project(ivar1,ivar2,ivar3);
}
//___________________________________________________________________
AliError("Non-existent selection step, return NULL");
return 0x0;
}
+ if (ivar >= fNVar || ivar < 0) {
+ AliError("Non-existent variable, return NULL");
+ return 0x0;
+ }
return (TH1D*)fGrid[istep]->Slice(ivar,varMin,varMax);
}
+//___________________________________________________________________
+TH2D *AliCFContainer::ShowSlice(Int_t ivar1, Int_t ivar2, Double_t *varMin, Double_t* varMax, Int_t istep) const
+{
+ //
+ // Make a slice along variables ivar1 and ivar2 at selection level istep in range [varMin,varMax]
+ //
+ if(istep >= fNStep || istep < 0){
+ AliError("Non-existent selection step, return NULL");
+ return 0x0;
+ }
+ if (ivar1 >= fNVar || ivar1 < 0 || ivar2 >= fNVar || ivar2 < 0) {
+ AliError("Non-existent variable, return NULL");
+ return 0x0;
+ }
+ return (TH2D*)fGrid[istep]->Slice(ivar1,ivar2,varMin,varMax);
+}
+//___________________________________________________________________
+TH3D *AliCFContainer::ShowSlice(Int_t ivar1, Int_t ivar2, Int_t ivar3, Double_t *varMin, Double_t* varMax, Int_t istep) const
+{
+ //
+ // Make a slice along variables ivar1, ivar2and ivar3 at selection level istep in range [varMin,varMax]
+ //
+ if(istep >= fNStep || istep < 0){
+ AliError("Non-existent selection step, return NULL");
+ return 0x0;
+ }
+ if (ivar1 >= fNVar || ivar1 < 0 || ivar2 >= fNVar || ivar2 < 0 || ivar3 >= fNVar || ivar3 < 0) {
+ AliError("Non-existent variable, return NULL");
+ return 0x0;
+ }
+ return (TH3D*)fGrid[istep]->Slice(ivar1,ivar2,ivar3,varMin,varMax);
+}
+//____________________________________________________________________
+AliCFContainer* AliCFContainer::MakeSlice(Int_t nVars, Int_t* vars, Double_t* varMin, Double_t* varMax) const
+{
+ //
+ // Makes a slice along the "nVars" variables defined in the array "vars[nVars]" for all the container steps.
+ // The ranges of ALL the container variables must be defined in the array varMin[fNVar] and varMax[fNVar]
+ // The function returns a new container of nVars variables.
+ //
+ Int_t* steps = new Int_t[fNStep];
+ for (Int_t iStep=0;iStep<fNStep;iStep++) steps[iStep]=iStep;
+ return MakeSlice(nVars,vars,varMin,varMax,fNStep,steps);
+}
+
+//____________________________________________________________________
+AliCFContainer* AliCFContainer::MakeSlice(Int_t nVars, Int_t* vars, Double_t* varMin, Double_t* varMax, Int_t nSteps, Int_t* steps) const
+{
+ //
+ // Makes a slice along the "nVars" variables defined in the array "vars[nVars]" for the given "nSteps" defined in "steps[nSteps]".
+ // The ranges of ALL the container variables must be defined in the array varMin[fNVar] and varMax[fNVar]
+ // The function returns a new container of nVars variables.
+ //
+
+ if (nVars < 1 || nVars > fNVar) AliError("Bad number of dimensions required for the slice");
+ if (nSteps< 1 || nSteps> fNStep) AliError("Bad number of steps required for the slice");
+
+ //define new binning for new container
+ Int_t* bins=new Int_t[nVars];
+ for (Int_t iVar=0; iVar<nVars; iVar++) bins[iVar] = fNVarBins[vars[iVar]];
+ AliCFContainer* out = new AliCFContainer(fName,fTitle,nSteps,nVars,bins);
+
+ //set the bin limits
+ for (Int_t iVar=0; iVar<nVars; iVar++) {
+ Double_t *array = new Double_t[fNVarBins[vars[iVar]]+1];
+ GetBinLimits(vars[iVar],array);
+ out->SetBinLimits(iVar,array);
+ delete array;
+ }
+
+ //set grid for the given steps
+ AliInfo(Form("Making a slice in %d dimension(s)",nVars));
+ for (Int_t iStep=0; iStep<nSteps; iStep++) out->SetGrid(iStep,fGrid[steps[iStep]]->Project(nVars,vars,varMin,varMax));
+
+ delete bins;
+ return out;
+}
+
//____________________________________________________________________
Long64_t AliCFContainer::Merge(TCollection* list)
{
}
return fGrid[istep]->GetIntegral(varMin,varMax);
}
+//_____________________________________________________________________
+void AliCFContainer::SetRangeUser(Int_t ivar, Double_t varMin, Double_t varMax, Int_t istep)
+{
+ //
+ // set axis range at step istep
+ //
+ if ( strcmp(fGrid[istep]->ClassName(),"AliCFGrid") ==0 ) {
+ AliWarning("Could not AliCFGrid::SetRangeUser(), function not implemented");
+ return;
+ }
+ if (istep >= fNStep || istep < 0){
+ AliError("Non-existent selection step");
+ return ;
+ }
+ if (ivar >= fNVar || ivar < 0){
+ AliError("Non-existent selection var");
+ return ;
+ }
+ ((AliCFGridSparse*)fGrid[istep])->SetRangeUser(ivar,varMin,varMax);
+}
+
+//_____________________________________________________________________
+void AliCFContainer::SetRangeUser(Double_t* varMin, Double_t* varMax, Int_t istep)
+{
+ //
+ // set all axis ranges at step istep according to varMin and varMax values
+ //
+ if ( strcmp(fGrid[istep]->ClassName(),"AliCFGrid") ==0 ) {
+ AliWarning("Could not AliCFGrid::SetRangeUser(), function not implemented");
+ return;
+ }
+ if (istep >= fNStep || istep < 0){
+ AliError("Non-existent selection step");
+ return ;
+ }
+ ((AliCFGridSparse*)fGrid[istep])->SetRangeUser(varMin,varMax);
+}