#ifndef HMONHIST_H
#define HMONHIST_H
using namespace std;
#include "TNamed.h"
#include "TString.h"
#include "TArrayI.h"
#include "TCanvas.h"
#include "TH1.h"
#include "TH2.h"
#include "TLegend.h"
#include <iostream> 
#include <iomanip>
class HOnlineMonHistAddon: public TNamed {
protected:
    
    Int_t fIsActive;    
    Int_t fisResetable; 
    Int_t refreshrate;  
    Int_t send;         
    Int_t nBinsX;       
    Float_t Xlo;        
    Float_t Xup;        
    Int_t nBinsY;       
    Float_t Ylo;        
    Float_t Yup;        
    Int_t arraySize1;   
    Int_t arraySize2;   
    TString XTitle;     
    TString YTitle;     
    TString ZTitle;     
    TString Option;     
    TString directory;  
    TString HistType;   
    TString format;     
    Int_t stat;         
    Int_t max;          
    Int_t min;          
    Int_t linecol;      
    Int_t linestyle;    
    Int_t fillcol;      
    Int_t fillstyle;    
    Int_t markercol;    
    Int_t markerstyle;  
    Float_t markersize; 
    
    Int_t logX;         
    Int_t logY;         
    Int_t logZ;         
    Int_t gridX;        
    Int_t gridY;        
    Bool_t drawSame;    
    TLegend*  legend;   
    Float_t legxmin;    
    Float_t legymin;    
    Float_t legxmax;    
    Float_t legymax;    
    TString legform;    
public:
    HOnlineMonHistAddon (const Char_t* name   ="",
		   const Char_t* title  ="",
		   Int_t active=0,Int_t resetable=0,
		   Int_t nbinsX=0,Float_t xlo=0,Float_t xup=0,
		   Int_t nbinsY=0,Float_t ylo=0,Float_t yup=0);
    
    HOnlineMonHistAddon (Text_t*);
    virtual  ~HOnlineMonHistAddon(void);
    void     setActive   (Int_t active)  {fIsActive=active;}
    Int_t    getActive   ()              {return fIsActive;}
    void     setResetable(Int_t reset)   {fisResetable=reset;}
    Int_t    getResetable()              {return fisResetable;}
    void     setRefreshRate(Int_t fresh) {refreshrate=fresh;}
    Int_t    getRefreshRate()            {return refreshrate;}
    void     setSend(Int_t i)            {send=i;}
    Int_t    getSend()                   {return send;}
    void     setNBinsX(Int_t i)          {nBinsX=i;}
    Int_t    getNBinsX()                 {return nBinsX;}
    void     setXLo(Float_t i)           {Xlo=i;}
    Float_t  getXLo()                    {return Xlo;}
    void     setXUp(Float_t i)           {Xup=i;}
    Float_t  getXUp()                    {return Xup;}
    void     setNBinsY(Int_t i)          {nBinsY=i;}
    Int_t    getNBinsY()                 {return nBinsY;}
    void     setYLo(Float_t i)           {Ylo=i;}
    Float_t  getYLo()                    {return Ylo;}
    void     setYUp(Float_t i)           {Yup=i;}
    Float_t  getYUp()                    {return Yup;}
    void     setSize1(Int_t i)           {arraySize1=i;}
    Int_t    getSize1()                  {return arraySize1;}
    void     setSize2(Int_t i)           {arraySize2=i;}
    Int_t    getSize2()                  {return arraySize2;}
    void     setStat(Int_t i)            {stat=i;}
    Int_t    getStat()                   {return stat;}
    void     setMax(Int_t i)             {max=i;}
    Int_t    getMax()                    {return max;}
    void     setMin(Int_t i)             {min=i;}
    Int_t    getMin()                    {return min;}
    void     setLineCol(Int_t i)         {linecol=i;}
    Int_t    getLineCol()                {return linecol;}
    void     setLineStyle(Int_t i)       {linestyle=i;}
    Int_t    getLineStyle()              {return linestyle;}
    void     setFillCol(Int_t i)         {fillcol=i;}
    Int_t    getFillCol()                {return fillcol;}
    void     setFillStyle(Int_t i)       {fillstyle=i;}
    Int_t    getFillStyle()              {return fillstyle;}
    void     setMarkerCol(Int_t i)       {markercol=i;}
    Int_t    getMarkerCol()              {return markercol;}
    void     setMarkerStyle(Int_t i)     {markerstyle=i;}
    Int_t    getMarkerStyle()            {return markerstyle;}
    void     setMarkerSize(Float_t i)    {markersize=i;}
    Float_t  getMarkerSize()             {return markersize;}
    void     setLogX(Int_t i)            {logX=i;}
    Int_t    getLogX()                   {return logX;}
    void     setLogY(Int_t i)            {logY=i;}
    Int_t    getLogY()                   {return logY;}
    void     setLogZ(Int_t i)            {logZ=i;}
    Int_t    getLogZ()                   {return logZ;}
    void     setGridX(Int_t i)           {gridX=i;}
    Int_t    getGridX()                  {return gridX;}
    void     setGridY(Int_t i)           {gridY=i;}
    Int_t    getGridY()                  {return gridY;}
    void     setDirectory(TString dir)   {directory=dir;}
    TString  getDirectory()              {return directory;}
    void     setXTitle(TString title)    {XTitle=title;}
    TString  getXTitle()                 {return XTitle;}
    void     setYTitle(TString title)    {YTitle=title;}
    TString  getYTitle()                 {return YTitle;}
    void     setZTitle(TString title)    {ZTitle=title;}
    TString  getZTitle()                 {return ZTitle;}
    void     setOption(TString opt)      {Option=opt;}
    TString  getOption()                 {return Option;}
    void     setHistType(TString type)   {HistType=type;}
    TString  getHistType()               {return HistType;}
    void     setFormat(TString form)     {format=form;}
    TString  getFormat()                 {return format;}
    void     setDrawSame(Bool_t drawS)   { drawSame = drawS;}
    Bool_t   getDrawSame()               {return drawSame;}
    TLegend* getLegend()                 {return legend;}
    void     setLegend(TLegend* leg)     {legend = leg;}
    void     getLegDim(Float_t& xmin,Float_t& ymin,Float_t& xmax,Float_t& ymax,TString& form) {form = legform; xmin=legxmin;xmax=legxmax;ymin=legymin;ymax=legymax;}
    void     setLegDim(Float_t xmin,Float_t ymin,Float_t xmax,Float_t ymax,TString form)      {legform = form;legxmin=xmin;legxmax=xmax;legymin=ymin;legymax=ymax;}
    
    void     copySet(HOnlineMonHistAddon&);
    
    void     getSet(HOnlineMonHistAddon& add);
    
    void     read(const Text_t*);
    
    void     getText(Text_t* txt);
    
    void     setHist(TH1*);
    
    void     setHist(TH2*);
    
    void     setCanvas(TCanvas* c);
    HOnlineMonHistAddon* createHist();
    
    
    virtual  void draw(Bool_t allowHiddenZero=1);
    
    
    virtual  void reset(Int_t level,Int_t count);
    
    
    virtual  void add(HOnlineMonHistAddon*);
    
    virtual  TH1* getP(Int_t s=0,Int_t m=0);
    virtual void  fill(Stat_t i,Stat_t j = 0);
    virtual void  fill(Int_t,Int_t,Stat_t,Stat_t = 0);
    virtual void  getMinMax(Double_t& min,Double_t& max) { min=max=0; }
    ClassDef(HOnlineMonHistAddon,1) 
};
class HOnlineMonHist: public HOnlineMonHistAddon {
protected:
    TH1* h;
public:
    HOnlineMonHist(const Char_t* name   ="",
		const Char_t* title  ="",
		Int_t active=0,Int_t resetable=0,
		Int_t nbinsX=0,Float_t xlo=0,Float_t xup=0);
    
    HOnlineMonHist(HOnlineMonHistAddon&);
    virtual ~HOnlineMonHist();
    
    TH1*    getP(Int_t s=0,Int_t m=0)         {return h;}
    
    void    reset(Int_t level,Int_t count);
    
    void    create();
    
    void    draw(Bool_t allowHiddenZero=1);
    
    void    add(HOnlineMonHistAddon* h2);
    void    getMinMax(Double_t& min,Double_t& max);
    ClassDef(HOnlineMonHist,1) 
};
class HOnlineMonHist2: public HOnlineMonHistAddon {
protected:
    TH2* h;
public:
    HOnlineMonHist2(const Char_t* name   ="",
		 const Char_t* title  ="",
		 Int_t active=0,Int_t resetable=0,
		 Int_t nbinsX=0,Float_t xlo=0,Float_t xup=0,
		 Int_t nbinsY=0,Float_t ylo=0,Float_t yup=0);
    
    HOnlineMonHist2(HOnlineMonHistAddon&);
    ~HOnlineMonHist2();
    
    TH2*    getP(Int_t s=0,Int_t m=0)         {return h;}
    
    void    reset(Int_t level,Int_t count);
    
    void    create();
    
    void    draw(Bool_t allowHiddenZero=1);
    
    void    add(HOnlineMonHistAddon* h2);
    void    getMinMax(Double_t& min,Double_t& max);
    ClassDef(HOnlineMonHist2,1) 
};
#endif  /*!HMONHIST_H*/