ROOT logo
//*-- Author : Jochen Markert 18.07.2007

#ifndef  __HHISTMAP_H__
#define  __HHISTMAP_H__

#include "htool.h"

#include "TString.h"
#include "TObjArray.h"
#include "TH1.h"
#include "TH2.h"
#include "TH3.h"
#include "TProfile.h"
#include "TProfile2D.h"
#include "TProfile3D.h"
#include "TCutG.h"
#include "TF1.h"
#include "TCanvas.h"
#include "TObject.h"
#include "TArrayI.h"
#include "TFile.h"
#include "TMacro.h"

#include <map>
#include <iostream>
#include <iomanip>

using namespace std;

class HHistMap;

R__EXTERN HHistMap *gHHistMap;

class HHistMap : public TNamed {

private:

    map < TString , TString    > hDir;   // directories per histogram
    map < TString , TObjArray  > hM;     // TObjArray for histogram pointers
    map < TString , TString    > hMask;  // mask string for names
    map < TString , TString    > hTitle; // mask string for titles
    map < TString , TArrayI    > hD;     // Array for dimensions
    map < TString , TH1**      > hDim1;  //! dynamically created Array of hist pointers dimension = 1
    map < TString , TH1***     > hDim2;  //! dynamically created Array of hist pointers dimension = 2
    map < TString , TH1****    > hDim3;  //! dynamically created Array of hist pointers dimension = 3
    map < TString , TH1*****   > hDim4;  //! dynamically created Array of hist pointers dimension = 4
    map < TString , TH1******  > hDim5;  //! dynamically created Array of hist pointers dimension = 5

    map < TString , TString    >  hDirC;   // directories per canvas
    map < TString , TObjArray  >  hMC;     // TObjArray for canvas pointers
    map < TString , TString    >  hMaskC;  // mask string for names canvas
    map < TString , TString    >  hTitleC; // mask string for titles canvas
    map < TString , TArrayI    >  hDC;     // Array for dimensions canvas
    map < TString , TArrayI    >  hNpC;    // canvas properties : number of pads x,y xpix,ypix canvas
    map < TString , TCanvas**      > hDim1C;  //! dynamically created Array of canvas pointers dimension = 1
    map < TString , TCanvas***     > hDim2C;  //! dynamically created Array of canvas pointers dimension = 2
    map < TString , TCanvas****    > hDim3C;  //! dynamically created Array of canvas pointers dimension = 3
    map < TString , TCanvas*****   > hDim4C;  //! dynamically created Array of canvas pointers dimension = 4
    map < TString , TCanvas******  > hDim5C;  //! dynamically created Array of canvas pointers dimension = 5


    map < TString , TString    >  hDirCut;  // directories per TCutG
    map < TString , TCutG*     >  hMCut;    // TCutG pointers

    map < TString , TString    >  hDirFit;  // directories per TF1
    map < TString , TF1*       >  hMFit;    // TF1 pointers

    map < TString , TString    >  hDirPar;  //  map of parameter objects  (not streamed to root file)
    map < TString , TObject*   >  hMPar;    //  map of parameter objects  (not streamed to root file)

    map < TString , TString    >  hDirMacro;  //  map of macro objects
    map < TString , TMacro*   >  hMMacro;    //  map of macro objects



    TFile* output;                         //! store hists later
    Bool_t  fDeleteObjects;                //! delete hists+canvas etc in destructor
    Bool_t  fSilentFail;                   //! switch off error+warnings in get() etc (own risk, default is kFALSE)

    TString getLabels(const TString name,vector<TString>&labels);


public:
    HHistMap(TString outputname="") ;
    ~HHistMap();
    void   setDeleteObjects(Bool_t del) { fDeleteObjects = del;}
    Bool_t getDeleteObjects()           { return fDeleteObjects;}

    void setCurrentMap() { gHHistMap=this;}
    void setSilentFail(Bool_t doit)             {fSilentFail = doit;}


    const map < TString , TObjArray >* getMap() { return &hM;   }
    TFile*                             getFile(){ return output;}
    void   print();
    void   printMap();
    void   printCanvasMap();
    void   printCutMap();
    void   printFitMap();
    void   printParameterMap();
    void   printMacroMap();



    void   addHistContent(HHistMap& hM2);
    Bool_t addFile     (TString infile);
    Bool_t addFiles    (TString expression);
    Bool_t addFilesList(TString filelist);
    Bool_t addMultFiles(TString commaSeparatedList);

    static Bool_t addHistMap(TString input="",TString output="");
    //------------------------------------------------------------------------
    // hists
    Bool_t addHist(TH1* h ,TString dir="");
    Bool_t addHist(TString Type = "",TString name="",TString title="",
		   Int_t nbinx=0,Double_t x1=0,Double_t x2=0,
		   Int_t nbiny=0,Double_t y1=0,Double_t y2=0,
		   Int_t nbinz=0,Double_t z1=0,Double_t z2=0,
		   TString xtitle="",TString ytitle="",TString ztitle="",
		   TString dir="");
    Bool_t addHistN(TString Type = "",TString name="",TString title="",
		   Int_t nbinx=0,Double_t* x=0,
		   Int_t nbiny=0,Double_t* y=0,
		   Int_t nbinz=0,Double_t* z=0,
		   TString xtitle="",TString ytitle="",TString ztitle="",
		   TString dir="");
    Bool_t removeHist(TString name);

    TH1* createHist(TString Type="",TString name="",TString title="",
		    Int_t nbinx=0,Double_t x1=0.,Double_t x2=0.,
		    Int_t nbiny=0,Double_t y1=0.,Double_t y2=0.,
		    Int_t nbinz=0,Double_t z1=0.,Double_t z2=0.,
		    TString xtitle="",TString ytitle="",TString ztitle="");
    TH1* createHistN(TString Type="",TString name="",TString title="",
		    Int_t nbinx=0,Double_t* x=0,
		    Int_t nbiny=0,Double_t* y=0,
		    Int_t nbinz=0,Double_t* z=0,
		    TString xtitle="",TString ytitle="",TString ztitle="");

    Bool_t addHistArray(TH1* h[],TString name,TString mask="",TString title="",TString dir="",Int_t i1max=-1,Int_t i2max=-1,Int_t i3max=-1,Int_t i4max=-1,Int_t i5max=-1);
    Bool_t addHistArray(TString Type="",TString name="",TString mask="",TString title="",
			Int_t nbinx=0,Double_t x1=0.,Double_t x2=0.,
			Int_t nbiny=0,Double_t y1=0.,Double_t y2=0.,
			Int_t nbinz=0,Double_t z1=0.,Double_t z2=0.,
			TString xtitle="",TString ytitle="",TString ztitle="",
			TString dir="",
			Int_t i1max=-1,Int_t i2max=-1,Int_t i3max=-1,Int_t i4max=-1,Int_t i5max=-1,
                        TString n1="",TString n2="",TString n3="",TString n4="",TString n5=""
		       );

    Bool_t addHistArrayN(TString Type="",TString name="",TString mask="",TString title="",
			 Int_t nbinx=0,Double_t* x=0,
			 Int_t nbiny=0,Double_t* y=0,
			 Int_t nbinz=0,Double_t* z=0,
			 TString xtitle="",TString ytitle="",TString ztitle="",
			 TString dir="",
			 Int_t i1max=-1,Int_t i2max=-1,Int_t i3max=-1,Int_t i4max=-1,Int_t i5max=-1,
			 TString n1="",TString n2="",TString n3="",TString n4="",TString n5=""
			);

    TH1*         get   (TString name,Int_t i1=0,Int_t i2=-1,Int_t i3=-1,Int_t i4=-1,Int_t i5=-1);
    TH2*         get2  (TString name,Int_t i1=0,Int_t i2=-1,Int_t i3=-1,Int_t i4=-1,Int_t i5=-1);
    TH3*         get3  (TString name,Int_t i1=0,Int_t i2=-1,Int_t i3=-1,Int_t i4=-1,Int_t i5=-1);
    TProfile*    getP  (TString name,Int_t i1=0,Int_t i2=-1,Int_t i3=-1,Int_t i4=-1,Int_t i5=-1);
    TProfile2D*  get2P (TString name,Int_t i1=0,Int_t i2=-1,Int_t i3=-1,Int_t i4=-1,Int_t i5=-1);
    TProfile3D*  get3P (TString name,Int_t i1=0,Int_t i2=-1,Int_t i3=-1,Int_t i4=-1,Int_t i5=-1);

    vector<TString> getMatchingHistLabels(TString expression,TString type="",Int_t dim=-1);
    vector<TH1*   > getMatchingHists     (TString expression,TString type="",Int_t dim=-1);

    void resetAllHists(TString opt="ICES");
    void disconnectAllHists();

    //------------------------------------------------------------------------
    // array Operations
    Bool_t        cloneArray (TString source,TString name="",TString mask="",TString title="",TString dir="",Bool_t reset=kFALSE);
    Bool_t        resetArray (TString name    , TString opt="");
    static Bool_t resetArray (TObjArray* array, TString opt="");
    Bool_t        scaleArray (TString name    , Double_t fact);
    static Bool_t scaleArray (TObjArray* array, Double_t fact);
    Bool_t        sumW2Array (TString name    );
    static Bool_t sumW2Array (TObjArray* array);
    Bool_t        divideArray  (TString name1    ,TString name2    , Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    static Bool_t divideArray  (TObjArray* array1,TObjArray* array2, Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    Bool_t        divideArray  (TString name0    ,TString name1    ,TString name2    , Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    static Bool_t divideArray  (TObjArray* array0,TObjArray* array1,TObjArray* array2, Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    Bool_t        multiplyArray(TString name1    ,TString name2    , Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    static Bool_t multiplyArray(TObjArray* array1,TObjArray* array2, Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    Bool_t        multiplyArray(TString name0    ,TString name1    ,TString name2    , Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    static Bool_t multiplyArray(TObjArray* array0,TObjArray* array1,TObjArray* array2, Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    Bool_t        addArray     (TString name1    ,TString name2    , Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    static Bool_t addArray     (TObjArray* array1,TObjArray* array2, Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    Bool_t        addArray     (TString name0    ,TString name1    ,TString name2    , Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    static Bool_t addArray     (TObjArray* array0,TObjArray* array1,TObjArray* array2, Double_t fact1= 1., Double_t fact2=1.,TString opt="");
    Bool_t        functionArray(TString name    , Bool_t (*function)(TH1* ,TString name,HHistMap* map, TObjArray* params),TObjArray* params);
    static Bool_t functionArray(TObjArray* array, Bool_t (*function)(TH1* ,TObjArray* array,TObjArray* params),TObjArray* params);
    //------------------------------------------------------------------------




    TObjArray*   getHistArray (TString name);
    TArrayI*     getDimArray  (TString name);
    TArrayI*     getDimAddress(TString name,TH1*h);
    TArrayI*     getDimAddress(TString name,TString histname);
    Int_t        getIndex     (TString name,TH1*h);
    Int_t        getIndex     (TString name,TString histname);
    TString      getDir       (TString name);
    TString      getTitle     (TString name);
    TString      getMask      (TString name);


    //------------------------------------------------------------------------
    // canvas
    Bool_t addCanvas(TCanvas* h ,
		     Int_t nx=1,Int_t ny=0,
		     Int_t xpix=500,Int_t ypix=500,TString dir="");
    Bool_t addCanvas(TString name="",TString title="",
		     Int_t nx=1,Int_t ny=0,
		     Int_t xpix=500,Int_t ypix=500,
		     TString dir="");
    Bool_t removeCanvas(TString name);

    Bool_t addCanvasArray(TCanvas* c[],TString name,TString mask="",TString title="",
			  Int_t nx=1,Int_t ny=0,
			  Int_t xpix=500,Int_t ypix=500,
			  TString dir="",
			  Int_t i1max=-1,Int_t i2max=-1,Int_t i3max=-1,Int_t i4max=-1,Int_t i5max=-1);
    Bool_t addCanvasArray(TString name="",TString mask="",TString title="",
                          Int_t nx=1,Int_t ny=0,
			  Int_t xpix=500,Int_t ypix=500,TString dir="",
			  Int_t i1max=-1,Int_t i2max=-1,Int_t i3max=-1,Int_t i4max=-1,Int_t i5max=-1,
			  TString n1="",TString n2="",TString n3="",TString n4="",TString n5=""
			 );

    TCanvas*     getCanvas        (TString name,Int_t i1=0,Int_t i2=-1,Int_t i3=-1,Int_t i4=-1,Int_t i5=-1);
    TObjArray*   getCanvasArray   (TString name);
    TArrayI*     getCanvasDimArray(TString name);
    TString      getCanvasDir     (TString name);
    TString      getCanvasTitle   (TString name);
    TString      getCanvasMask    (TString name);
    TArrayI*     getCanvasPropertiesArray(TString name);

    vector<TString>   getMatchingCanvasLabels(TString expression,Int_t dim=-1);
    vector<TCanvas* > getMatchingCanvas      (TString expression,Int_t dim=-1);

    //------------------------------------------------------------------------

    //------------------------------------------------------------------------
    // cuts
    Bool_t  addCut     (TString name,Int_t n=0,Double_t* x=NULL,Double_t* y=NULL,TString dir = "");
    Bool_t  addCut     (TCutG* cut,TString dir = "");
    Bool_t  removeCut  (TString name,Bool_t removeObject=kTRUE);
    TCutG*  getCut     (TString name);
    TString getCutDir  (TString name);
    Bool_t  isInsideCut(TString name,Double_t x, Double_t y);

    vector<TString>   getMatchingCutLabels(TString expression);
    vector<TCutG* >   getMatchingCuts     (TString expression);

    //------------------------------------------------------------------------

    //------------------------------------------------------------------------
    // fits
    Bool_t  addFit     (TF1* cut,TString dir = "");
    Bool_t  removeFit  (TString name,Bool_t removeObject=kTRUE);
    TF1*    getFit     (TString name);
    TString getFitDir  (TString name);
    vector<TString>   getMatchingFitLabels(TString expression);
    vector<TF1* >     getMatchingFits     (TString expression);

    //------------------------------------------------------------------------

    //------------------------------------------------------------------------
    // params
    Bool_t    addPar     (TObject* par,TString name,TString dir="");
    Bool_t    removePar  (TString name,Bool_t removeObject=kTRUE);
    TObject*  getPar     (TString name);
    TString   getParDir  (TString name);
    vector<TString>   getMatchingParLabels(TString expression);
    vector<TObject* > getMatchingPars     (TString expression);
    //------------------------------------------------------------------------

    //------------------------------------------------------------------------
    // macros
    Bool_t    addMacro   (TMacro* par,TString name,TString dir="");
    Bool_t    removeMacro(TString name,Bool_t removeObject=kTRUE);
    TMacro*   getMacro   (TString name);
    TString   getMacroDir(TString name);
    vector<TString>   getMatchingMacroLabels(TString expression);
    vector<TMacro* >  getMatchingMacros     (TString expression);
    //------------------------------------------------------------------------


    Bool_t setOutputFile(TString name="");
    Bool_t writeHists(TString opt="");
    //Bool_t writeConfig(TString name="histmap_config.txt");
    //Bool_t readConfig (TString name="histmap_config.txt");


    //------------------------------------------------------------------------
    // hists
    template<class T> T**     getDim1(T**   h,TString name){
	//  use :  T** h = hM->getDim1(h, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for hist arrays managed by HHistMap, they will
        //  be deleted in the destructor!
	h = NULL;
	map<TString,TObjArray>::iterator iter = hM.find(name.Data());
	if( iter != hM.end() ) {
	    TArrayI& ar = hD[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 1) {
		Error("getDim1()","dimension of array does not match!");
                return h;
	    }

	    map<TString,TH1**>::iterator iter1 = hDim1.find(name.Data());
	    if (iter1 == hDim1.end()){
		h = newDim1(h,ar.At(0));
                hDim1[name] = (TH1**) h;
	    } else {
		h = (T**) iter1->second;
	    }

	    TObjArray& a = iter->second;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
                   h[i1] = (T*)a.At(i1);
	    }
	}
	return h;
    }

    template<class T> T***    getDim2(T***   h,TString name){
	//  use :  T*** h = hM->getDim2(h, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for hist arrays managed by HHistMap, they will
        //  be deleted in the destructor!

	h = NULL;
	map<TString,TObjArray>::iterator iter = hM.find(name.Data());
	if( iter != hM.end() ) {
	    TArrayI& ar = hD[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 2) {
		Error("getDim2()","dimension of array does not match!");
                return h;
	    }

	    map<TString,TH1***>::iterator iter1 = hDim2.find(name.Data());
	    if (iter1 == hDim2.end()){
		h = newDim2(h,ar.At(0),ar.At(1));
                hDim2[name] = (TH1***) h;
	    } else {
		h = (T***) iter1->second;
	    }

	    TObjArray& a = iter->second;
            Int_t ind = 0;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
		for(Int_t i2 = 0; i2 < ar.At(1); i2 ++) {
		    h[i1][i2] = (T*)a.At(ind);
                    ind++;
		}
	    }
	}
	return h;
    }

    template<class T> T****   getDim3(T****  h,TString name){
	//  use :  T**** h = hM->getDim3(h, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for hist arrays managed by HHistMap, they will
        //  be deleted in the destructor!

	h = NULL;
	map<TString,TObjArray>::iterator iter = hM.find(name.Data());
	if( iter != hM.end() ) {
	    TArrayI& ar = hD[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 3) {
		Error("getDim3()","dimension of array does not match!");
		return h;
	    }

	    map<TString,TH1****>::iterator iter1 = hDim3.find(name.Data());
	    if (iter1 == hDim3.end()){
		h = newDim3(h,ar.At(0),ar.At(1),ar.At(2));
                hDim3[name] = (TH1****) h;
	    } else {
		h = (T****) iter1->second;
	    }

	    TObjArray& a = iter->second;
	    Int_t ind = 0;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
		for(Int_t i2 = 0; i2 < ar.At(1); i2 ++) {
		    for(Int_t i3 = 0; i3 < ar.At(2); i3 ++) {
			h[i1][i2][i3] = (T*)a.At(ind);
			ind++;
		    }
		}
	    }
	}
	return h;
    }

    template<class T> T*****  getDim4(T***** h,TString name){
	//  use :  T***** h = hM->getDim4(h, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for hist arrays managed by HHistMap, they will
        //  be deleted in the destructor!
	h = NULL;
	map<TString,TObjArray>::iterator iter = hM.find(name.Data());
	if( iter != hM.end() ) {
	    TArrayI& ar = hD[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 4) {
		Error("getDim4()","dimension of array does not match!");
		return h;
	    }

	    map<TString,TH1*****>::iterator iter1 = hDim4.find(name.Data());
	    if (iter1 == hDim4.end()){
		h = newDim4(h,ar.At(0),ar.At(1),ar.At(2),ar.At(3));
                hDim4[name] = (TH1*****) h;
	    } else {
		h = (T*****) iter1->second;
	    }

	    TObjArray& a = iter->second;
	    Int_t ind = 0;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
		for(Int_t i2 = 0; i2 < ar.At(1); i2 ++) {
		    for(Int_t i3 = 0; i3 < ar.At(2); i3 ++) {
			for(Int_t i4 = 0; i4 < ar.At(3); i4 ++) {
			    h[i1][i2][i3][i4] = (T*)a.At(ind);
			    ind++;
			}
		    }
		}
	    }
	}
	return h;
    }

    template<class T> T****** getDim5(T******h,TString name){
	//  use :  T****** h = hM->getDim5(h, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for hist arrays managed by HHistMap, they will
        //  be deleted in the destructor!
	h = NULL;
	map<TString,TObjArray>::iterator iter = hM.find(name.Data());
	if( iter != hM.end() ) {
	    TArrayI& ar = hD[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 5) {
		Error("getDim5()","dimension of array does not match!");
		return h;
	    }

	    map<TString,TH1******>::iterator iter1 = hDim5.find(name.Data());
	    if (iter1 == hDim5.end()){
		h = newDim5(h,ar.At(0),ar.At(1),ar.At(2),ar.At(3),ar.At(4));
                hDim5[name] = (TH1******) h;
	    } else {
		h = (T******) iter1->second;
	    }

	    TObjArray& a = iter->second;
	    Int_t ind = 0;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
		for(Int_t i2 = 0; i2 < ar.At(1); i2 ++) {
		    for(Int_t i3 = 0; i3 < ar.At(2); i3 ++) {
			for(Int_t i4 = 0; i4 < ar.At(3); i4 ++) {
			    for(Int_t i5 = 0; i5 < ar.At(4); i5 ++) {
			    h[i1][i2][i3][i4][i5] = (T*)a.At(ind);
			    ind++;
			    }
			}
		    }
		}
	    }
	}
	return h;
    }

    //------------------------------------------------------------------------
    // canvas
    template<class T> T**     getCanvasDim1(T**   c,TString name){
	//  use :  T** c = hM->getCanvasDim1(c, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for canvas arrays managed by HHistMap, they will
        //  be deleted in the destructor!
	c = NULL;
	map<TString,TObjArray>::iterator iter = hMC.find(name.Data());
	if( iter != hMC.end() ) {
	    TArrayI& ar = hDC[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 1) {
		Error("getCanvasDim1()","dimension of array does not match!");
                return c;
	    }

	    map<TString,TCanvas**>::iterator iter1 = hDim1C.find(name.Data());
	    if (iter1 == hDim1C.end()){
		c = newDim1(c,ar.At(0));
                hDim1C[name] = (TCanvas**) c;
	    } else {
		c = (T**) iter1->second;
	    }

	    TObjArray& a = iter->second;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
                   c[i1] = (T*)a.At(i1);
	    }
	}
	return c;
    }

    template<class T> T***    getCanvasDim2(T***   c,TString name){
	//  use :  T*** c = hM->getCanvasDim2(c, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for canvas arrays managed by HHistMap, they will
        //  be deleted in the destructor!

	c = NULL;
	map<TString,TObjArray>::iterator iter = hMC.find(name.Data());
	if( iter != hMC.end() ) {
	    TArrayI& ar = hDC[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 2) {
		Error("getCanvasDim2()","dimension of array does not match!");
                return c;
	    }

	    map<TString,TCanvas***>::iterator iter1 = hDim2C.find(name.Data());
	    if (iter1 == hDim2C.end()){
		c = newDim2(c,ar.At(0),ar.At(1));
                hDim2C[name] = (TCanvas***) c;
	    } else {
		c = (T***) iter1->second;
	    }

	    TObjArray& a = iter->second;
            Int_t ind = 0;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
		for(Int_t i2 = 0; i2 < ar.At(1); i2 ++) {
		    c[i1][i2] = (T*)a.At(ind);
                    ind++;
		}
	    }
	}
	return c;
    }

    template<class T> T****   getCanvasDim3(T****  c,TString name){
	//  use :  T**** c = hM->getCanvasDim3(c, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for canvas arrays managed by HHistMap, they will
        //  be deleted in the destructor!

	c = NULL;
	map<TString,TObjArray>::iterator iter = hMC.find(name.Data());
	if( iter != hMC.end() ) {
	    TArrayI& ar = hDC[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 3) {
		Error("getCanvasDim3()","dimension of array does not match!");
		return c;
	    }

	    map<TString,TCanvas****>::iterator iter1 = hDim3C.find(name.Data());
	    if (iter1 == hDim3C.end()){
		c = newDim3(c,ar.At(0),ar.At(1),ar.At(2));
                hDim3C[name] = (TCanvas****) c;
	    } else {
		c = (T****) iter1->second;
	    }

	    TObjArray& a = iter->second;
	    Int_t ind = 0;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
		for(Int_t i2 = 0; i2 < ar.At(1); i2 ++) {
		    for(Int_t i3 = 0; i3 < ar.At(2); i3 ++) {
			c[i1][i2][i3] = (T*)a.At(ind);
			ind++;
		    }
		}
	    }
	}
	return c;
    }

    template<class T> T*****  getCanvasDim4(T***** c,TString name){
	//  use :  T***** c = hM->getCanvasDim4(c, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for canvas arrays managed by HHistMap, they will
        //  be deleted in the destructor!
	c = NULL;
	map<TString,TObjArray>::iterator iter = hMC.find(name.Data());
	if( iter != hMC.end() ) {
	    TArrayI& ar = hDC[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 4) {
		Error("getCanvasDim4()","dimension of array does not match!");
		return c;
	    }

	    map<TString,TCanvas*****>::iterator iter1 = hDim4C.find(name.Data());
	    if (iter1 == hDim4C.end()){
		c = newDim4(c,ar.At(0),ar.At(1),ar.At(2),ar.At(3));
                hDim4C[name] = (TCanvas*****) c;
	    } else {
		c = (T*****) iter1->second;
	    }

	    TObjArray& a = iter->second;
	    Int_t ind = 0;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
		for(Int_t i2 = 0; i2 < ar.At(1); i2 ++) {
		    for(Int_t i3 = 0; i3 < ar.At(2); i3 ++) {
			for(Int_t i4 = 0; i4 < ar.At(3); i4 ++) {
			    c[i1][i2][i3][i4] = (T*)a.At(ind);
			    ind++;
			}
		    }
		}
	    }
	}
	return c;
    }

    template<class T> T****** getCanvasDim5(T******c,TString name){
	//  use :  T****** c = hM->getCanvasDim5(c, "name")
	//  Do not delete the created array of pointers when retrieving
	//  them for canvas arrays managed by HHistMap, they will
        //  be deleted in the destructor!
	c = NULL;
	map<TString,TObjArray>::iterator iter = hMC.find(name.Data());
	if( iter != hMC.end() ) {
	    TArrayI& ar = hDC[(*iter).first];
	    Int_t s = ar.GetSize();
	    if(s != 5) {
		Error("getCanvasDim5()","dimension of array does not match!");
		return c;
	    }

	    map<TString,TCanvas******>::iterator iter1 = hDim5C.find(name.Data());
	    if (iter1 == hDim5C.end()){
		c = newDim5(c,ar.At(0),ar.At(1),ar.At(2),ar.At(3),ar.At(4));
                hDim5C[name] = (TCanvas******) c;
	    } else {
		c = (T******) iter1->second;
	    }

	    TObjArray& a = iter->second;
	    Int_t ind = 0;
	    for(Int_t i1 = 0; i1 < ar.At(0); i1 ++) {
		for(Int_t i2 = 0; i2 < ar.At(1); i2 ++) {
		    for(Int_t i3 = 0; i3 < ar.At(2); i3 ++) {
			for(Int_t i4 = 0; i4 < ar.At(3); i4 ++) {
			    for(Int_t i5 = 0; i5 < ar.At(4); i5 ++) {
				c[i1][i2][i3][i4][i5] = (T*)a.At(ind);
				ind++;
			    }
			}
		    }
		}
	    }
	}
	return c;
    }

    //------------------------------------------------------------------------
    // generic

    template<class T> static T**     newDim1(T** h,Int_t imax1){
	//  User has to take care of deleting pointer arrays (see deleteDim1() )!

	h = NULL;
	h = new  T* [imax1];
	return h;
    };

    template<class T> static T***    newDim2(T*** h,Int_t imax1,Int_t imax2){
	//  User has to take care of deleting pointer arrays (see deleteDim2() )!
	h = NULL;
	h = new  T** [imax1];
	for(Int_t i1 = 0; i1 < imax1; i1 ++){
	    h[i1] = new T* [imax2];
	}
	return h;
    };

    template<class T> static T****   newDim3(T****h ,Int_t imax1,Int_t imax2,Int_t imax3){
	//  User has to take care of deleting pointer arrays (see deleteDim3() )!
	h = NULL;
	h = new  T*** [imax1];
	for(Int_t i1 = 0; i1 < imax1; i1 ++){
	    h[i1] = new T** [imax2];
	    for(Int_t i2 = 0; i2 < imax2; i2 ++){
		h[i1][i2] = new T* [imax3];
	    }
	}
	return h;
    }

    template<class T> static T*****  newDim4(T*****h,Int_t imax1,Int_t imax2,Int_t imax3,Int_t imax4){
	//  User has to take care of deleting pointer arrays (see deleteDim4() )!
	h = NULL;
	h = new T**** [imax1];
	for(Int_t i1 = 0; i1 < imax1; i1 ++){
	    h[i1] = new T*** [imax2];
	    for(Int_t i2 = 0; i2 < imax2; i2 ++){
		h[i1][i2] = new T** [imax3];
		for(Int_t i3 = 0; i3 < imax3; i3 ++){
		    h[i1][i2][i3] = new T* [imax4];
		}
	    }
	}
	return h;
    }

    template<class T> static T****** newDim5(T******h,Int_t imax1,Int_t imax2,Int_t imax3,Int_t imax4,Int_t imax5){
	//  User has to take care of deleting pointer arrays (see deleteDim5() )!
	h = NULL;
	h = new T***** [imax1];
	for(Int_t i1 = 0; i1 < imax1; i1 ++){
	    h[i1] = new T**** [imax2];
	    for(Int_t i2 = 0; i2 < imax2; i2 ++){
		h[i1][i2] = new T*** [imax3];
		for(Int_t i3 = 0; i3 < imax3; i3 ++){
		    h[i1][i2][i3] = new T** [imax4];
		    for(Int_t i4 = 0; i4 < imax4; i4 ++){
			h[i1][i2][i3][i4] = new T* [imax5];
		    }
		}
	    }
	}
	return h;
    }

    template<class T> static void deleteDim1(T**    h,Int_t imax1,Bool_t deleteObjects = kFALSE){
	// use this function to dlete dynamically created arrays of hist pointers
	// Do not apply this to histograms managed by HHistMap, this pointer arrays
        // will be deleleted in the destructor
	for(Int_t i1 = 0; i1 < imax1; i1 ++){
	    if (deleteObjects) delete h[i1];
	}
	delete [] h;
	h = NULL;
    }

    template<class T> static void deleteDim2(T***    h,Int_t imax1,Int_t imax2,Bool_t deleteObjects = kFALSE){
	// use this function to dlete dynamically created arrays of hist pointers
	// Do not apply this to histograms managed by HHistMap, this pointer arrays
        // will be deleleted in the destructor
	for(Int_t i1 = 0; i1 < imax1; i1 ++){
	    for(Int_t i2 = 0; i2 < imax2; i2 ++){
		if (deleteObjects) delete h[i1][i2];
	    }
	    delete [] h[i1];
	}
	delete [] h;
	h = NULL;
    }

    template<class T> static void deleteDim3(T****   h,Int_t imax1,Int_t imax2,Int_t imax3,Bool_t deleteObjects = kFALSE){
	// use this function to dlete dynamically created arrays of hist pointers
	// Do not apply this to histograms managed by HHistMap, this pointer arrays
        // will be deleleted in the destructor
	for(Int_t i1 = 0; i1 < imax1; i1 ++){
	    for(Int_t i2 = 0; i2 < imax2; i2 ++){
		for(Int_t i3 = 0; i3 < imax3; i3 ++){
		    if (deleteObjects) delete h[i1][i2][i3];
		}
		delete [] h[i1][i2];
	    }
	    delete [] h[i1];
	}
	delete [] h;
	h = NULL;
    }

    template<class T> static void deleteDim4(T*****  h,Int_t imax1,Int_t imax2,Int_t imax3,Int_t imax4,Bool_t deleteObjects = kFALSE){
	// use this function to dlete dynamically created arrays of hist pointers
	// Do not apply this to histograms managed by HHistMap, this pointer arrays
        // will be deleleted in the destructor
	for(Int_t i1 = 0; i1 < imax1; i1 ++){
	    for(Int_t i2 = 0; i2 < imax2; i2 ++){
		for(Int_t i3 = 0; i3 < imax3; i3 ++){
		    for(Int_t i4 = 0; i4 < imax4; i4 ++){
			if (deleteObjects) delete h[i1][i2][i3][i4];
		    }
		    delete [] h[i1][i2][i3];
		}
		delete [] h[i1][i2];
	    }
	    delete [] h[i1];
	}
	delete [] h;
	h = NULL;
    }

    template<class T> static void deleteDim5(T****** h,Int_t imax1,Int_t imax2,Int_t imax3,Int_t imax4,Int_t imax5,Bool_t deleteObjects = kFALSE){
	// use this function to dlete dynamically created arrays of hist pointers
	// Do not apply this to histograms managed by HHistMap, this pointer arrays
        // will be deleleted in the destructor
	for(Int_t i1 = 0; i1 < imax1; i1 ++){
	    for(Int_t i2 = 0; i2 < imax2; i2 ++){
		for(Int_t i3 = 0; i3 < imax3; i3 ++){
		    for(Int_t i4 = 0; i4 < imax4; i4 ++){
			for(Int_t i5 = 0; i5 < imax5; i5 ++){
			    if (deleteObjects) delete h[i1][i2][i3][i4][i5];
			}
			delete [] h[i1][i2][i3][i4];
		    }
		    delete [] h[i1][i2][i3];
		}
		delete [] h[i1][i2];
	    }
	    delete [] h[i1];
	}
	delete [] h;
	h = NULL;
    }
    //------------------------------------------------------------------------


    ClassDef(HHistMap,1)
};

#endif /* !__HHISTMAP_H__ */




 hhistmap.h:1
 hhistmap.h:2
 hhistmap.h:3
 hhistmap.h:4
 hhistmap.h:5
 hhistmap.h:6
 hhistmap.h:7
 hhistmap.h:8
 hhistmap.h:9
 hhistmap.h:10
 hhistmap.h:11
 hhistmap.h:12
 hhistmap.h:13
 hhistmap.h:14
 hhistmap.h:15
 hhistmap.h:16
 hhistmap.h:17
 hhistmap.h:18
 hhistmap.h:19
 hhistmap.h:20
 hhistmap.h:21
 hhistmap.h:22
 hhistmap.h:23
 hhistmap.h:24
 hhistmap.h:25
 hhistmap.h:26
 hhistmap.h:27
 hhistmap.h:28
 hhistmap.h:29
 hhistmap.h:30
 hhistmap.h:31
 hhistmap.h:32
 hhistmap.h:33
 hhistmap.h:34
 hhistmap.h:35
 hhistmap.h:36
 hhistmap.h:37
 hhistmap.h:38
 hhistmap.h:39
 hhistmap.h:40
 hhistmap.h:41
 hhistmap.h:42
 hhistmap.h:43
 hhistmap.h:44
 hhistmap.h:45
 hhistmap.h:46
 hhistmap.h:47
 hhistmap.h:48
 hhistmap.h:49
 hhistmap.h:50
 hhistmap.h:51
 hhistmap.h:52
 hhistmap.h:53
 hhistmap.h:54
 hhistmap.h:55
 hhistmap.h:56
 hhistmap.h:57
 hhistmap.h:58
 hhistmap.h:59
 hhistmap.h:60
 hhistmap.h:61
 hhistmap.h:62
 hhistmap.h:63
 hhistmap.h:64
 hhistmap.h:65
 hhistmap.h:66
 hhistmap.h:67
 hhistmap.h:68
 hhistmap.h:69
 hhistmap.h:70
 hhistmap.h:71
 hhistmap.h:72
 hhistmap.h:73
 hhistmap.h:74
 hhistmap.h:75
 hhistmap.h:76
 hhistmap.h:77
 hhistmap.h:78
 hhistmap.h:79
 hhistmap.h:80
 hhistmap.h:81
 hhistmap.h:82
 hhistmap.h:83
 hhistmap.h:84
 hhistmap.h:85
 hhistmap.h:86
 hhistmap.h:87
 hhistmap.h:88
 hhistmap.h:89
 hhistmap.h:90
 hhistmap.h:91
 hhistmap.h:92
 hhistmap.h:93
 hhistmap.h:94
 hhistmap.h:95
 hhistmap.h:96
 hhistmap.h:97
 hhistmap.h:98
 hhistmap.h:99
 hhistmap.h:100
 hhistmap.h:101
 hhistmap.h:102
 hhistmap.h:103
 hhistmap.h:104
 hhistmap.h:105
 hhistmap.h:106
 hhistmap.h:107
 hhistmap.h:108
 hhistmap.h:109
 hhistmap.h:110
 hhistmap.h:111
 hhistmap.h:112
 hhistmap.h:113
 hhistmap.h:114
 hhistmap.h:115
 hhistmap.h:116
 hhistmap.h:117
 hhistmap.h:118
 hhistmap.h:119
 hhistmap.h:120
 hhistmap.h:121
 hhistmap.h:122
 hhistmap.h:123
 hhistmap.h:124
 hhistmap.h:125
 hhistmap.h:126
 hhistmap.h:127
 hhistmap.h:128
 hhistmap.h:129
 hhistmap.h:130
 hhistmap.h:131
 hhistmap.h:132
 hhistmap.h:133
 hhistmap.h:134
 hhistmap.h:135
 hhistmap.h:136
 hhistmap.h:137
 hhistmap.h:138
 hhistmap.h:139
 hhistmap.h:140
 hhistmap.h:141
 hhistmap.h:142
 hhistmap.h:143
 hhistmap.h:144
 hhistmap.h:145
 hhistmap.h:146
 hhistmap.h:147
 hhistmap.h:148
 hhistmap.h:149
 hhistmap.h:150
 hhistmap.h:151
 hhistmap.h:152
 hhistmap.h:153
 hhistmap.h:154
 hhistmap.h:155
 hhistmap.h:156
 hhistmap.h:157
 hhistmap.h:158
 hhistmap.h:159
 hhistmap.h:160
 hhistmap.h:161
 hhistmap.h:162
 hhistmap.h:163
 hhistmap.h:164
 hhistmap.h:165
 hhistmap.h:166
 hhistmap.h:167
 hhistmap.h:168
 hhistmap.h:169
 hhistmap.h:170
 hhistmap.h:171
 hhistmap.h:172
 hhistmap.h:173
 hhistmap.h:174
 hhistmap.h:175
 hhistmap.h:176
 hhistmap.h:177
 hhistmap.h:178
 hhistmap.h:179
 hhistmap.h:180
 hhistmap.h:181
 hhistmap.h:182
 hhistmap.h:183
 hhistmap.h:184
 hhistmap.h:185
 hhistmap.h:186
 hhistmap.h:187
 hhistmap.h:188
 hhistmap.h:189
 hhistmap.h:190
 hhistmap.h:191
 hhistmap.h:192
 hhistmap.h:193
 hhistmap.h:194
 hhistmap.h:195
 hhistmap.h:196
 hhistmap.h:197
 hhistmap.h:198
 hhistmap.h:199
 hhistmap.h:200
 hhistmap.h:201
 hhistmap.h:202
 hhistmap.h:203
 hhistmap.h:204
 hhistmap.h:205
 hhistmap.h:206
 hhistmap.h:207
 hhistmap.h:208
 hhistmap.h:209
 hhistmap.h:210
 hhistmap.h:211
 hhistmap.h:212
 hhistmap.h:213
 hhistmap.h:214
 hhistmap.h:215
 hhistmap.h:216
 hhistmap.h:217
 hhistmap.h:218
 hhistmap.h:219
 hhistmap.h:220
 hhistmap.h:221
 hhistmap.h:222
 hhistmap.h:223
 hhistmap.h:224
 hhistmap.h:225
 hhistmap.h:226
 hhistmap.h:227
 hhistmap.h:228
 hhistmap.h:229
 hhistmap.h:230
 hhistmap.h:231
 hhistmap.h:232
 hhistmap.h:233
 hhistmap.h:234
 hhistmap.h:235
 hhistmap.h:236
 hhistmap.h:237
 hhistmap.h:238
 hhistmap.h:239
 hhistmap.h:240
 hhistmap.h:241
 hhistmap.h:242
 hhistmap.h:243
 hhistmap.h:244
 hhistmap.h:245
 hhistmap.h:246
 hhistmap.h:247
 hhistmap.h:248
 hhistmap.h:249
 hhistmap.h:250
 hhistmap.h:251
 hhistmap.h:252
 hhistmap.h:253
 hhistmap.h:254
 hhistmap.h:255
 hhistmap.h:256
 hhistmap.h:257
 hhistmap.h:258
 hhistmap.h:259
 hhistmap.h:260
 hhistmap.h:261
 hhistmap.h:262
 hhistmap.h:263
 hhistmap.h:264
 hhistmap.h:265
 hhistmap.h:266
 hhistmap.h:267
 hhistmap.h:268
 hhistmap.h:269
 hhistmap.h:270
 hhistmap.h:271
 hhistmap.h:272
 hhistmap.h:273
 hhistmap.h:274
 hhistmap.h:275
 hhistmap.h:276
 hhistmap.h:277
 hhistmap.h:278
 hhistmap.h:279
 hhistmap.h:280
 hhistmap.h:281
 hhistmap.h:282
 hhistmap.h:283
 hhistmap.h:284
 hhistmap.h:285
 hhistmap.h:286
 hhistmap.h:287
 hhistmap.h:288
 hhistmap.h:289
 hhistmap.h:290
 hhistmap.h:291
 hhistmap.h:292
 hhistmap.h:293
 hhistmap.h:294
 hhistmap.h:295
 hhistmap.h:296
 hhistmap.h:297
 hhistmap.h:298
 hhistmap.h:299
 hhistmap.h:300
 hhistmap.h:301
 hhistmap.h:302
 hhistmap.h:303
 hhistmap.h:304
 hhistmap.h:305
 hhistmap.h:306
 hhistmap.h:307
 hhistmap.h:308
 hhistmap.h:309
 hhistmap.h:310
 hhistmap.h:311
 hhistmap.h:312
 hhistmap.h:313
 hhistmap.h:314
 hhistmap.h:315
 hhistmap.h:316
 hhistmap.h:317
 hhistmap.h:318
 hhistmap.h:319
 hhistmap.h:320
 hhistmap.h:321
 hhistmap.h:322
 hhistmap.h:323
 hhistmap.h:324
 hhistmap.h:325
 hhistmap.h:326
 hhistmap.h:327
 hhistmap.h:328
 hhistmap.h:329
 hhistmap.h:330
 hhistmap.h:331
 hhistmap.h:332
 hhistmap.h:333
 hhistmap.h:334
 hhistmap.h:335
 hhistmap.h:336
 hhistmap.h:337
 hhistmap.h:338
 hhistmap.h:339
 hhistmap.h:340
 hhistmap.h:341
 hhistmap.h:342
 hhistmap.h:343
 hhistmap.h:344
 hhistmap.h:345
 hhistmap.h:346
 hhistmap.h:347
 hhistmap.h:348
 hhistmap.h:349
 hhistmap.h:350
 hhistmap.h:351
 hhistmap.h:352
 hhistmap.h:353
 hhistmap.h:354
 hhistmap.h:355
 hhistmap.h:356
 hhistmap.h:357
 hhistmap.h:358
 hhistmap.h:359
 hhistmap.h:360
 hhistmap.h:361
 hhistmap.h:362
 hhistmap.h:363
 hhistmap.h:364
 hhistmap.h:365
 hhistmap.h:366
 hhistmap.h:367
 hhistmap.h:368
 hhistmap.h:369
 hhistmap.h:370
 hhistmap.h:371
 hhistmap.h:372
 hhistmap.h:373
 hhistmap.h:374
 hhistmap.h:375
 hhistmap.h:376
 hhistmap.h:377
 hhistmap.h:378
 hhistmap.h:379
 hhistmap.h:380
 hhistmap.h:381
 hhistmap.h:382
 hhistmap.h:383
 hhistmap.h:384
 hhistmap.h:385
 hhistmap.h:386
 hhistmap.h:387
 hhistmap.h:388
 hhistmap.h:389
 hhistmap.h:390
 hhistmap.h:391
 hhistmap.h:392
 hhistmap.h:393
 hhistmap.h:394
 hhistmap.h:395
 hhistmap.h:396
 hhistmap.h:397
 hhistmap.h:398
 hhistmap.h:399
 hhistmap.h:400
 hhistmap.h:401
 hhistmap.h:402
 hhistmap.h:403
 hhistmap.h:404
 hhistmap.h:405
 hhistmap.h:406
 hhistmap.h:407
 hhistmap.h:408
 hhistmap.h:409
 hhistmap.h:410
 hhistmap.h:411
 hhistmap.h:412
 hhistmap.h:413
 hhistmap.h:414
 hhistmap.h:415
 hhistmap.h:416
 hhistmap.h:417
 hhistmap.h:418
 hhistmap.h:419
 hhistmap.h:420
 hhistmap.h:421
 hhistmap.h:422
 hhistmap.h:423
 hhistmap.h:424
 hhistmap.h:425
 hhistmap.h:426
 hhistmap.h:427
 hhistmap.h:428
 hhistmap.h:429
 hhistmap.h:430
 hhistmap.h:431
 hhistmap.h:432
 hhistmap.h:433
 hhistmap.h:434
 hhistmap.h:435
 hhistmap.h:436
 hhistmap.h:437
 hhistmap.h:438
 hhistmap.h:439
 hhistmap.h:440
 hhistmap.h:441
 hhistmap.h:442
 hhistmap.h:443
 hhistmap.h:444
 hhistmap.h:445
 hhistmap.h:446
 hhistmap.h:447
 hhistmap.h:448
 hhistmap.h:449
 hhistmap.h:450
 hhistmap.h:451
 hhistmap.h:452
 hhistmap.h:453
 hhistmap.h:454
 hhistmap.h:455
 hhistmap.h:456
 hhistmap.h:457
 hhistmap.h:458
 hhistmap.h:459
 hhistmap.h:460
 hhistmap.h:461
 hhistmap.h:462
 hhistmap.h:463
 hhistmap.h:464
 hhistmap.h:465
 hhistmap.h:466
 hhistmap.h:467
 hhistmap.h:468
 hhistmap.h:469
 hhistmap.h:470
 hhistmap.h:471
 hhistmap.h:472
 hhistmap.h:473
 hhistmap.h:474
 hhistmap.h:475
 hhistmap.h:476
 hhistmap.h:477
 hhistmap.h:478
 hhistmap.h:479
 hhistmap.h:480
 hhistmap.h:481
 hhistmap.h:482
 hhistmap.h:483
 hhistmap.h:484
 hhistmap.h:485
 hhistmap.h:486
 hhistmap.h:487
 hhistmap.h:488
 hhistmap.h:489
 hhistmap.h:490
 hhistmap.h:491
 hhistmap.h:492
 hhistmap.h:493
 hhistmap.h:494
 hhistmap.h:495
 hhistmap.h:496
 hhistmap.h:497
 hhistmap.h:498
 hhistmap.h:499
 hhistmap.h:500
 hhistmap.h:501
 hhistmap.h:502
 hhistmap.h:503
 hhistmap.h:504
 hhistmap.h:505
 hhistmap.h:506
 hhistmap.h:507
 hhistmap.h:508
 hhistmap.h:509
 hhistmap.h:510
 hhistmap.h:511
 hhistmap.h:512
 hhistmap.h:513
 hhistmap.h:514
 hhistmap.h:515
 hhistmap.h:516
 hhistmap.h:517
 hhistmap.h:518
 hhistmap.h:519
 hhistmap.h:520
 hhistmap.h:521
 hhistmap.h:522
 hhistmap.h:523
 hhistmap.h:524
 hhistmap.h:525
 hhistmap.h:526
 hhistmap.h:527
 hhistmap.h:528
 hhistmap.h:529
 hhistmap.h:530
 hhistmap.h:531
 hhistmap.h:532
 hhistmap.h:533
 hhistmap.h:534
 hhistmap.h:535
 hhistmap.h:536
 hhistmap.h:537
 hhistmap.h:538
 hhistmap.h:539
 hhistmap.h:540
 hhistmap.h:541
 hhistmap.h:542
 hhistmap.h:543
 hhistmap.h:544
 hhistmap.h:545
 hhistmap.h:546
 hhistmap.h:547
 hhistmap.h:548
 hhistmap.h:549
 hhistmap.h:550
 hhistmap.h:551
 hhistmap.h:552
 hhistmap.h:553
 hhistmap.h:554
 hhistmap.h:555
 hhistmap.h:556
 hhistmap.h:557
 hhistmap.h:558
 hhistmap.h:559
 hhistmap.h:560
 hhistmap.h:561
 hhistmap.h:562
 hhistmap.h:563
 hhistmap.h:564
 hhistmap.h:565
 hhistmap.h:566
 hhistmap.h:567
 hhistmap.h:568
 hhistmap.h:569
 hhistmap.h:570
 hhistmap.h:571
 hhistmap.h:572
 hhistmap.h:573
 hhistmap.h:574
 hhistmap.h:575
 hhistmap.h:576
 hhistmap.h:577
 hhistmap.h:578
 hhistmap.h:579
 hhistmap.h:580
 hhistmap.h:581
 hhistmap.h:582
 hhistmap.h:583
 hhistmap.h:584
 hhistmap.h:585
 hhistmap.h:586
 hhistmap.h:587
 hhistmap.h:588
 hhistmap.h:589
 hhistmap.h:590
 hhistmap.h:591
 hhistmap.h:592
 hhistmap.h:593
 hhistmap.h:594
 hhistmap.h:595
 hhistmap.h:596
 hhistmap.h:597
 hhistmap.h:598
 hhistmap.h:599
 hhistmap.h:600
 hhistmap.h:601
 hhistmap.h:602
 hhistmap.h:603
 hhistmap.h:604
 hhistmap.h:605
 hhistmap.h:606
 hhistmap.h:607
 hhistmap.h:608
 hhistmap.h:609
 hhistmap.h:610
 hhistmap.h:611
 hhistmap.h:612
 hhistmap.h:613
 hhistmap.h:614
 hhistmap.h:615
 hhistmap.h:616
 hhistmap.h:617
 hhistmap.h:618
 hhistmap.h:619
 hhistmap.h:620
 hhistmap.h:621
 hhistmap.h:622
 hhistmap.h:623
 hhistmap.h:624
 hhistmap.h:625
 hhistmap.h:626
 hhistmap.h:627
 hhistmap.h:628
 hhistmap.h:629
 hhistmap.h:630
 hhistmap.h:631
 hhistmap.h:632
 hhistmap.h:633
 hhistmap.h:634
 hhistmap.h:635
 hhistmap.h:636
 hhistmap.h:637
 hhistmap.h:638
 hhistmap.h:639
 hhistmap.h:640
 hhistmap.h:641
 hhistmap.h:642
 hhistmap.h:643
 hhistmap.h:644
 hhistmap.h:645
 hhistmap.h:646
 hhistmap.h:647
 hhistmap.h:648
 hhistmap.h:649
 hhistmap.h:650
 hhistmap.h:651
 hhistmap.h:652
 hhistmap.h:653
 hhistmap.h:654
 hhistmap.h:655
 hhistmap.h:656
 hhistmap.h:657
 hhistmap.h:658
 hhistmap.h:659
 hhistmap.h:660
 hhistmap.h:661
 hhistmap.h:662
 hhistmap.h:663
 hhistmap.h:664
 hhistmap.h:665
 hhistmap.h:666
 hhistmap.h:667
 hhistmap.h:668
 hhistmap.h:669
 hhistmap.h:670
 hhistmap.h:671
 hhistmap.h:672
 hhistmap.h:673
 hhistmap.h:674
 hhistmap.h:675
 hhistmap.h:676
 hhistmap.h:677
 hhistmap.h:678
 hhistmap.h:679
 hhistmap.h:680
 hhistmap.h:681
 hhistmap.h:682
 hhistmap.h:683
 hhistmap.h:684
 hhistmap.h:685
 hhistmap.h:686
 hhistmap.h:687
 hhistmap.h:688
 hhistmap.h:689
 hhistmap.h:690
 hhistmap.h:691
 hhistmap.h:692
 hhistmap.h:693
 hhistmap.h:694
 hhistmap.h:695
 hhistmap.h:696
 hhistmap.h:697
 hhistmap.h:698
 hhistmap.h:699
 hhistmap.h:700
 hhistmap.h:701
 hhistmap.h:702
 hhistmap.h:703
 hhistmap.h:704
 hhistmap.h:705
 hhistmap.h:706
 hhistmap.h:707
 hhistmap.h:708
 hhistmap.h:709
 hhistmap.h:710
 hhistmap.h:711
 hhistmap.h:712
 hhistmap.h:713
 hhistmap.h:714
 hhistmap.h:715
 hhistmap.h:716
 hhistmap.h:717
 hhistmap.h:718
 hhistmap.h:719
 hhistmap.h:720
 hhistmap.h:721
 hhistmap.h:722
 hhistmap.h:723
 hhistmap.h:724
 hhistmap.h:725
 hhistmap.h:726
 hhistmap.h:727
 hhistmap.h:728
 hhistmap.h:729
 hhistmap.h:730
 hhistmap.h:731
 hhistmap.h:732
 hhistmap.h:733
 hhistmap.h:734
 hhistmap.h:735
 hhistmap.h:736
 hhistmap.h:737
 hhistmap.h:738
 hhistmap.h:739
 hhistmap.h:740
 hhistmap.h:741
 hhistmap.h:742
 hhistmap.h:743
 hhistmap.h:744
 hhistmap.h:745
 hhistmap.h:746
 hhistmap.h:747
 hhistmap.h:748
 hhistmap.h:749
 hhistmap.h:750
 hhistmap.h:751
 hhistmap.h:752
 hhistmap.h:753
 hhistmap.h:754
 hhistmap.h:755
 hhistmap.h:756
 hhistmap.h:757
 hhistmap.h:758
 hhistmap.h:759
 hhistmap.h:760
 hhistmap.h:761
 hhistmap.h:762
 hhistmap.h:763
 hhistmap.h:764
 hhistmap.h:765
 hhistmap.h:766
 hhistmap.h:767
 hhistmap.h:768
 hhistmap.h:769
 hhistmap.h:770
 hhistmap.h:771
 hhistmap.h:772
 hhistmap.h:773
 hhistmap.h:774
 hhistmap.h:775
 hhistmap.h:776
 hhistmap.h:777
 hhistmap.h:778
 hhistmap.h:779
 hhistmap.h:780
 hhistmap.h:781
 hhistmap.h:782
 hhistmap.h:783
 hhistmap.h:784
 hhistmap.h:785
 hhistmap.h:786
 hhistmap.h:787
 hhistmap.h:788
 hhistmap.h:789
 hhistmap.h:790
 hhistmap.h:791
 hhistmap.h:792
 hhistmap.h:793
 hhistmap.h:794
 hhistmap.h:795
 hhistmap.h:796
 hhistmap.h:797
 hhistmap.h:798
 hhistmap.h:799
 hhistmap.h:800
 hhistmap.h:801
 hhistmap.h:802
 hhistmap.h:803
 hhistmap.h:804
 hhistmap.h:805
 hhistmap.h:806
 hhistmap.h:807
 hhistmap.h:808
 hhistmap.h:809
 hhistmap.h:810
 hhistmap.h:811
 hhistmap.h:812
 hhistmap.h:813
 hhistmap.h:814
 hhistmap.h:815
 hhistmap.h:816
 hhistmap.h:817
 hhistmap.h:818
 hhistmap.h:819
 hhistmap.h:820
 hhistmap.h:821
 hhistmap.h:822
 hhistmap.h:823
 hhistmap.h:824
 hhistmap.h:825
 hhistmap.h:826
 hhistmap.h:827
 hhistmap.h:828
 hhistmap.h:829
 hhistmap.h:830
 hhistmap.h:831
 hhistmap.h:832
 hhistmap.h:833
 hhistmap.h:834
 hhistmap.h:835
 hhistmap.h:836
 hhistmap.h:837
 hhistmap.h:838