#ifndef ALIUNICORHN_H
#define ALIUNICORHN_H
#include <TH1.h>
class TH2D;
class TAxis;
class AliUnicorHN : public TH1D {
public:
AliUnicorHN(const char *nam="muhi", Int_t ndim=0, TAxis **ax=0);
AliUnicorHN(TRootIOCtor *) : TH1D(), fNdim(0) {for (int i=0; i<fgkMaxNdim; i++) fNbins[i]=fMbins[i]=0;}
virtual ~AliUnicorHN() {}
static AliUnicorHN* Retrieve(const char *filnam, const char *nam);
Int_t GetNdim() const {return fNdim;}
TAxis *GetAxis(Int_t i) const {return (TAxis*) &fAxis[i];}
Int_t Fill(Double_t *xx, Double_t y=1);
Int_t Fill(Double_t) {return -1;}
Int_t Fill(Double_t x0, Double_t w) {Double_t x[1]={x0}; return Fill(x,w);}
Int_t Fill(Double_t x0, Double_t x1, ...);
Int_t Fill(const char*, Double_t) {return -1;}
Int_t Save() const;
AliUnicorHN *ProjectAlong(const char *nam, Int_t dim, Int_t first=0, Int_t last=0);
TH1D *ProjectOn(const char *nam, Int_t dim, const Int_t * const first=0, const Int_t * const last=0) const;
TH1D *ProjectOn(const char *nam, Int_t dim, const Double_t * const first, const Double_t * const last) const;
TH2D *ProjectOn(const char *nam, Int_t dim0, Int_t dim1, const Int_t * const first=0, const Int_t * const last=0) const;
TH2D *ProjectOn(const char *nam, Int_t dim0, Int_t dim1, const Double_t * const first, const Double_t * const last) const;
void OneToMul(Int_t n, Int_t *k) const;
protected:
static const Int_t fgkMaxNdim=10;
Int_t fNdim;
TAxis fAxis[fgkMaxNdim];
Int_t fNbins[fgkMaxNdim];
Int_t fMbins[fgkMaxNdim];
static Int_t Albins(Int_t n, TAxis **ax);
Int_t MulToOne(const Int_t * const k) const;
Int_t MulToOne(Double_t *x);
ClassDef(AliUnicorHN,1)
};
#endif