ROOT logo
//*-- Author : Jochen Markert 18.07.2007
#include "hflexfiller.h"
#include "hades.h"
#include "haddef.h"
#include "hruntimedb.h"
#include "hevent.h"
#include "hcategorymanager.h"
#include "htool.h"



#include "TH1.h"
#include "TH1S.h"
#include "TH1I.h"
#include "TH1F.h"
#include "TH1D.h"
#include "TH2S.h"
#include "TH2I.h"
#include "TH2F.h"
#include "TH2D.h"
#include "TH3S.h"
#include "TH3I.h"
#include "TH3F.h"
#include "TH3D.h"
#include "TSystem.h"
#include "TPRegexp.h"
#include "TRegexp.h"
#include "TROOT.h"

#include <iostream>
#include <fstream>
#include <string>
using namespace std;


//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////////
//
//
// HHistMap
// helper class to hold a map of histogram, TCanvas, TCut,
// TF1 and TObject (parameters) pointers.
// The HHistMap is streamed into output file and can be
// read back to obtain all hists/canvas/cuts/fits/parmeters
//
//#include "hhistmap.h"
//#include "harray.h"
//#include "htool.h"
//#include "TH1.h"
//#include "TH1F.h"
//#include "TH2F.h"
//#include "TROOT.h"
//#include "TRandom.h"
//#include "TMath.h"
//#include "TObjArray.h"
//#include "TF1.h"
//#include "TMacro.h"
//
//#include <iostream>
//using namespace std;
//
//Bool_t fillGaus(TH1* h ,TString name,HHistMap* map,TObjArray* params)
//{
//    // fill some random gauss with
//    // randomized mean and sigma
//    // h : hist                                    (set automatically)
//    // array : h is part of this array in HHistMap (set automatically)
//    // map : HHistMap owning this object           (set automatically)
//    // params : user params
//
//    // defaults
//    Double_t meanlow  = 10;
//    Double_t meanup   = 10;
//    Double_t siglow   = 2 ;
//    Double_t sigup    = 2 ;
//
//    if(map){
//        HArrayD* par = (HArrayD*) map->getPar("parsGaus");
//	if(par){
//
//	    TArrayD* pars = par->data;
//
//	    meanlow = pars->At(0);
//	    meanup  = pars->At(1);
//	    siglow  = pars->At(2);
//	    sigup   = pars->At(3);
//	}
//    }
//
//    Double_t mean = meanlow + gRandom->Rndm() * (meanup-meanlow);
//    Double_t sig  = siglow  + gRandom->Rndm() * (sigup -siglow );
//
//    if (h)  for(Int_t i = 0 ; i < 1000; i ++ ) h->Fill(gRandom->Gaus(mean,sig));
//
//    return kTRUE;
//}
//
//Bool_t fillRndm(TH1* h ,TString name,HHistMap* map,TObjArray* params)
//{
//    // fill some random
//    // randomized range
//    // h : hist                                    (set automatically)
//    // array : h is part of this array in HHistMap (set automatically)
//    // map : HHistMap owning this object           (set automatically)
//    // params : user params
//
//    // defaults
//    Double_t meanlow  = 10;
//    Double_t meanup   = 10;
//
//    if(map){
//	HArrayD* par = (HArrayD*) map->getPar("parsGaus");
//	if(par){
//	    TArrayD* pars = par->data;
//
//	    meanlow = pars->At(0);
//	    meanup  = pars->At(1);
//	}
//    }
//
//    if (h)  for(Int_t i = 0 ; i < 10000; i ++ ) h->Fill(meanlow + gRandom->Rndm() * (meanup-meanlow));
//
//    return kTRUE;
//}
//
//Bool_t fillMeanRms(TH1* h ,TString name,HHistMap* map,TObjArray* params)
//{
//    // fill mean and rms to some other histogram
//    // h : hist                                    (set automatically)
//    // array : h is part of this array in HHistMap (set automatically)
//    // map : HHistMap owning this object           (set automatically)
//    // params : user params
//
//    // defaults
//
//    if(map&&h){
//	TH1* mean = map->get("h8_mean");
//	TH1* rms  = map->get("h8_rms");
//
//        Int_t index = map->getIndex(name,h);
//	if(mean) {
//	    mean->SetBinContent(index+1,h->GetMean());
//	    mean->SetBinError  (index+1,h->GetMeanError());
//	}
//	if(rms){
//	    rms ->SetBinContent(index+1,h->GetRMS());
//            rms ->SetBinError  (index+1,h->GetRMSError());
//        }
//    }
//
//    return kTRUE;
//}
//
//Bool_t setColor(TH1* h ,TString name,HHistMap* map,TObjArray* params)
//{
//    // set color of hists in array
//    // h : hist                                   (set automatically)
//    // name : h is part of this array in HHistMap (set automatically)
//    // map : HHistMap owning this hist            (set automatically)
//    // params : user params
//
//    if(map){
//        HArrayI* cols = (HArrayI*) map->getPar("colors");
//	if(cols){
//	    Int_t index   = map->getIndex(name,h);     // linear index of this object in array
//	    h->SetLineColor(cols->data->At(index));
//	}
//    }
//    return kTRUE;
//}
//
//void histmap()
//{
//    gROOT->SetBatch();
//
//    HHistMap hM("test.root");  // all hist will go to test.root
//    hM.setSilentFail(kTRUE);   // (default kFALSE), kTRUE: do not emmit errors when hists do not exist in get(), get2() etc.
//    hM.addHist(new TH1F("h","h",100,0,100),"hists/h");  // single hist, stored in subdir hists/h in output
//
//
//    //------------------------------------------------------------
//    // create hist arrays outside HHistMap and add them to HHistMap
//    TH1F* h1[6];
//    for(Int_t sector=0;sector<6;sector++){
//	h1[sector]=new TH1F(Form("h1_s%i",sector),Form("h1_s%i",sector),100,0,100);
//    }
//
//    // create a linear array for 2dim indexing
//    TH1F* h2[24]; // 6x4 like h2[6][4]
//    for(Int_t sector=0;sector<6;sector++){
//	for(Int_t module=0;module<4;module++){
//	    h2[HTool::getLinearIndex(sector,6,module,4)]= new TH1F(Form("h2_s%i_m%i",sector,module),Form("h2_s%i_m%i",sector,module),100,0,100);
//	}
//    }
//
//
//    hM.addHistArray((TH1**)h1,"h1","h1_s%i"    ,"h1_s%i"    ,"hists/h1",6);    // 1dim array size 6
//    hM.addHistArray((TH1**)h2,"h2","h2_s%i_m%i","h2_s%i_m%i","hists/h2",6,4);  // 2dim array size 6x4
//    //------------------------------------------------------------
//
//
//
//
//    //------------------------------------------------------------
//    // create hist arrays inside HHistMap    ( see hM.addHistN(...) and  hM.addHistArrayN(...) for non const hists
//    hM.addHist     ("TH1F","h3","h3",100,0,100,0,0,0,0,0,0,"time1 [ns]","counts","","hists/h3");
//
//    TString secname= "I,II,III,IV,V,VI";
//    TString modname= "I,II,III,IV";
//
//
//    // create hist array with custom names
//    hM.addHistArray("TH1F","h4","h4t1_s[%i]m[%i]","time1s[%i]m[%i]"
//		    ,100,0.,100.
//		    ,0,0.,0.
//		    ,0,0.,0.
//		    ,"time1 [ns]","counts","","hists/h4",6,4,-1,-1,-1,secname,modname);  // create hists with special names;
//
//    hM.addHistArray("TH2F","h5","h5t1_t12_s[%i]m[%i]","time1_t12s[%i]m[%i]"
//		    ,100,0.,100.
//		    ,100,0.,100.
//		    ,0,0.,0.
//		    ,"time1 [ns]","t2-t1","","hists/h5",6,4);
//
//    hM.addHistArray("TH1F","h6","h6t1_s[%i]m[%i]","time1s[%i]m[%i]"
//		    ,100,0.,100.
//		    ,0,0.,0.
//		    ,0,0.,0.
//		    ,"time1 [ns]","counts","","hists/h6",6,4);
//
//    hM.addHistArray("TH1F","h7","h7t1_s[%i]m[%i]","time1s[%i]m[%i]"
//		    ,100,0.,100.
//		    ,0,0.,0.
//		    ,0,0.,0.
//		    ,"time1 [ns]","counts","","hists/h7",6,4);
//
//    hM.addHist("TH1F","h8_mean","h8_mean",24,0,24,0,0,0,0,0,0,"time1 index [ns]","time1 mean [ns]","","hists/h8");
//    hM.addHist("TH1F","h8_rms" ,"h8_rms" ,24,0,24,0,0,0,0,0,0,"time1 index [ns]","time1 rms [ns]" ,"","hists/h8");
//    //------------------------------------------------------------
//
//
//    //------------------------------------------------------------
//    // get multi dimensional arrays created by HHistMap.
//    // delete of the pointer arrays is done in destructor!
//    TH2F*** h5 = NULL; h5 = hM.getDim2(h5,"h5");
//    for(Int_t sector=0;sector<6;sector++){
//	for(Int_t module=0;module<4;module++){
//	    //cout<<sector<<" "<<module<<" "<<h5[sector][module]->GetName()<<endl;
//	}
//    }
//    //------------------------------------------------------------
//
//
//    //------------------------------------------------------------
//    // create pointer arrays , not managed by HHistMap
//    // take care about delete yourself
//    TH2F*** htest = NULL;
//    htest = HHistMap::newDim2(htest,6,4);
//    // .... put hist pointer to array
//    HHistMap::deleteDim2(htest,6,4,kFALSE); // delete only pointer array, not hists!
//    //------------------------------------------------------------
//
//
//    //########################################################################
//    //########################################################################
//    //########################################################################
//    //########################################################################
//
//
//
//    //------------------------------------------------------------
//    // create canvas arrays outside HHistMap and add them to HHistMap
//    hM.addCanvas(new TCanvas("c","c",500,500),1,0,500,500,"canvas/c");  // canvas outside created
//
//    TCanvas* c1[6];
//    for(Int_t sector=0;sector<6;sector++){
//	c1[sector]=new TCanvas(Form("c1_s%i",sector),Form("c1_s%i",sector),500,500);
//    }
//
//   // create a linear array for 2dim indexing
//    TCanvas* c2[24]; // 6x4 like c2[6][4]
//    for(Int_t sector=0;sector<6;sector++){
//	for(Int_t module=0;module<4;module++){
//	    c2[HTool::getLinearIndex(sector,6,module,4)] = new TCanvas(Form("c2_s%i_m%i",sector,module),Form("c2_s%i_m%i",sector,module),500,500);
//	}
//    }
//
//
//    hM.addCanvasArray((TCanvas**)c1,"c1","c1_s%i"    ,"c1_s%i"    ,1,0,500,500,"canvas/c1",6);    // 1dim array size 6
//    hM.addCanvasArray((TCanvas**)c2,"c2","c2_s%i_m%i","c2_s%i_m%i",1,0,500,500,"canvas/c2",6,4);  // 2dim array size 6x4
//    //------------------------------------------------------------
//
//
//
//
//    //------------------------------------------------------------
//    // create canvas arrays inside HHistMap
//    hM.addCanvas     ("c3","c3",2,1,500,500,"canvas/c3");
//    hM.addCanvasArray("c4","c4t1_s[%i]m[%i]","c4time1s[%i]m[%i]"
//		      ,1,0,500,500
//                      ,"canvas/c4"
//		      ,6,4);
//    //------------------------------------------------------------
//
//
//    //------------------------------------------------------------
//    // get multi dimensional arrays created by HHistMap.
//    // delete of the pointer arrays is done in destructor!
//    TCanvas*** c4 = NULL; c4 = hM.getCanvasDim2(c4,"c4");
//    for(Int_t sector=0;sector<6;sector++){
//	for(Int_t module=0;module<4;module++){
//	    //cout<<sector<<" "<<module<<" "<<c4[sector][module]->GetName()<<endl;
//	}
//    }
//    //------------------------------------------------------------
//
//
//    //------------------------------------------------------------
//    // create pointer arrays , not managed by HHistMap
//    // take care about delete yourself
//    TCanvas*** ctest = NULL;
//    ctest = HHistMap::newDim2(ctest,6,4);
//    // .... put hist pointer to array
//    HHistMap::deleteDim2(ctest,6,4,kFALSE); // delete only pointer array, not hists!
//    //------------------------------------------------------------
//
//
//    //########################################################################
//    //########################################################################
//    //########################################################################
//    //########################################################################
//    // accessing objects
//
//
//    //------------------------------------------------------------
//    // METHOD I:
//    // access the histograms by name : use the lable
//    // retrieve pointer by :
//    // TH1* get()
//    // TH2* get2()  for 2Dim hists  (get will work too, but some funtcion of TH2 can not be used with TH1 pointer)
//    // TH3* get3()  for 3dim hists  (get will work too, but some funtcion of TH3 can not be used with TH1 pointer)
//
//    hM.get("h")     ->FillRandom("gaus",1000);  // single
//    hM.get("h1",1)  ->FillRandom("gaus",1000);  // 1dim index 1
//    hM.get("h2",1,0)->FillRandom("gaus",1000);  // 2dim index [1][0]
//    for(Int_t i=0;i<1000;i++) hM.get ("h5",1,0)->Fill(gRandom->Gaus()*10+50,gRandom->Gaus()*10+50);     // function in TH1
//    for(Int_t i=0;i<1000;i++) hM.get2("h5",1,1)->Fill(gRandom->Gaus()*10+50,gRandom->Gaus()*10+50,2.);  // function in TH2
//
//    //------------------------------------------------------------
//
//    //------------------------------------------------------------
//    // METHOD II:
//    // access the histograms by name : use the lable
//    // retrieve a dynamically created multidim pointer
//
//    TH2F*** h5_access = NULL;
//    h5_access = hM.getDim2(h5,"h5");
//    h5_access[0][0]->Fill( 1000, 100);
//    //------------------------------------------------------------
//
//    //------------------------------------------------------------
//    // METHOD I:
//    // access the canvas by name : use the lable
//    hM.getCanvas("c3")     ->cd(1); // single canvas 2pads
//    hM.get("h5",1,0)->Draw("colz");
//    hM.getCanvas("c3")     ->cd(2); // single
//    hM.get("h5",1,1)->Draw("colz");
//
//    hM.getCanvas("c1",1)  ->cd(); // 1dim index 1
//    hM.getCanvas("c2",1,0)->cd(); // 2dim index [1][0]
//    //------------------------------------------------------------
//
//    //------------------------------------------------------------
//    // METHOD II:
//    // access the histograms by name : use the lable
//    TCanvas*** c4_access = NULL;
//    c4_access = hM.getCanvasDim2(c4_access,"c4");
//    c4_access[0][0]->cd();
//    //------------------------------------------------------------
//
//
//    //------------------------------------------------------------
//    // working with cuts and params
//
//    Double_t xcut[]= {
//	0.191092,
//	0.144397,
//	0.15158,
//	0.318606,
//	0.483836,
//	0.548491,
//	0.51796,
//	0.37967,
//	0.221624,
//	0.201868,
//	0.191092};
//
//    Double_t  ycut[]={
//	83.8983,
//	67.4788,
//	47.3517,
//	32.5212,
//	34.375,
//	55.8263,
//	77.8072,
//	89.4597,
//      87.6059,
//	85.7521,
//	83.8983};
//
//    hM.addCut("myCut",sizeof(xcut)/sizeof(Double_t),xcut,ycut,"cut");
//
//    Double_t vals[4] = {30,50,2,6};
//    HArrayD parsGaus(sizeof(vals)/sizeof(Double_t),vals); // wrapper for TArray
//    parsGaus.print();
//
//    hM.addPar(&parsGaus,"parsGaus","pars");
//
//    Int_t colorsMod[4] = {1,2,4,8};
//    HArrayI colors(24);
//    Int_t* cl = colors.getArray();
//    for(Int_t s = 0; s < 6; s ++) {
//       for(Int_t m = 0; m < 4; m ++) {
//	    cl[HTool::getLinearIndex(s,6,m,4)] = colorsMod[m];
//	}
//    }
//    hM.addPar(&colors,"colors","pars");
//    colors.print();
//
//    //------------------------------------------------------------
//
//    //------------------------------------------------------------
//    // working with functions on arrays
//
//    hM.functionArray("h4", fillGaus   ,NULL); // fill some random  distributions
//    hM.functionArray("h4", fillMeanRms,NULL); // fill hist with means+rms of h4   "h8_mean" "h8_rms"
//    hM.functionArray("h6", fillRndm   ,NULL); // fill some random  distributions
//    hM.functionArray("h4", setColor   ,NULL); // setColors per module
//    hM.functionArray("h6", setColor   ,NULL); // setColors per module
//
//
//    //see also : 2 and 3 operator add,multiply,divide
//    hM.addArray     ("h7","h6",1.,1.);  // make copy of h6 to h7
//    hM.divideArray  ("h6","h4",1.,1., "");
//    //hM.multiplyArray("h6","h4",1.,1., "");
//    // standard actions
//    //hM.resetArray ("h7","");
//    //hM.scaleArray ("h7", 2.);
//    //hM.sumW2Array ("h7");
//    //------------------------------------------------------------
//
//    //------------------------------------------------------------
//    // working with macros
//
//	TF1* fgaus = new TF1("fgaus","gaus",-1,1);
//	fgaus->SetLineColor(2);
//	hM.addFit(fgaus,"fits/gaus");
//
//      hM.addCanvas("c10","c10",1,1,500,500,"canvas/c2");
//
//
//	TMacro* mac = new TMacro("drawHist");
//	//mac->ReadFile("./histmac/hhistmap_drawHist.C");  // read  macro from existing file (file should not be in workdir)
//
//	mac->AddLine("void drawHist(){");
//	mac->AddLine("cout<<\"exec drawHist\"<<endl;");
//	mac->AddLine("gHHistMap->getCanvas(\"c10\")->Draw();");
//	mac->AddLine("gHHistMap->getCanvas(\"c10\")->cd();");
//	mac->AddLine("gHHistMap->get(\"h\")->SetLineColor(4);");
//	mac->AddLine("gHHistMap->get(\"h\")->SetLineStyle(2);");
//	mac->AddLine("gHHistMap->get(\"h\")->SetMarkerStyle(8);");
//	mac->AddLine("gHHistMap->get(\"h\")->SetMarkerColor(8);");
//	mac->AddLine("gHHistMap->getFit(\"fgaus\")->SetRange(-1,1);");
//	mac->AddLine("gHHistMap->get(\"h\")->Fit(gHHistMap->getFit(\"fgaus\"),\"R\");");
//	mac->AddLine("cout<<\"mean =\"<<gHHistMap->getFit(\"fgaus\")->GetParameter(1)<<\" sig =\"<<gHHistMap->getFit(\"fgaus\")->GetParameter(2)<<endl;");
//	mac->AddLine("gHHistMap->get(\"h\")->Draw(\"PL\");");
//	mac->AddLine("gHHistMap->getCanvas(\"c10\")->Update();");
//	mac->AddLine("}");
//      // mac->SaveSource("./histmac/hhistmap_drawHist.C"); // write macro to text file
//
//	hM.addMacro(mac,"drawHist","macros/draw");
//
//      hm->getMacro("drawHist")->Print();  // print source code
//      hm->getMacro("drawHist")->Exec();   // execute the macro
//
//    //------------------------------------------------------------
//
//    // print content of HHistMap
//    hM.print();
//    //hM.printMap();
//    //hM.printCanvasMap();
//    //hM.printCutMap();
//    //hM.printParameterMap();
//    //hM.printMacroMap();
//
//
//    //------------------------------------------------------------
//    // input + output
//    hM.writeHists();                       // write hists + canvas + cuts + fits + params + HHistMap  to root file
//    //------------------------------------------------------------
//
//
//    //------------------------------------------------------------
//    // merging of root files
//    HHistMap::addHistMap("histmap_file_*.root","merge.root"); // merge all HHistMap objects in matching files into merge.root
//    HHistMap::addHistMap("histmap_file_1.root,histmap_file_2.root,histmap_file_3.root","merge.root"); // merge all HHistMap objects in files 1,2,3 into merge.root
//    HHistMap::addHistMap("histmap_file_list.txt,histmap_file_2.root,histmap_file_3.root","merge.root"); // merge all HHistMap objects in files of filelist into merge.root
//    //------------------------------------------------------------
//
//
////////////////////////////////////////////////////////////////////////////////

ClassImp(HHistMap)

HHistMap *gHHistMap=0;

HHistMap::HHistMap(TString outputname) {
    output=NULL;
    if(outputname != "") setOutputFile(outputname);
    gHHistMap = this;
    setSilentFail(kFALSE);
    setDeleteObjects(kFALSE);
}

HHistMap::~HHistMap()
{
    //---------------------------------------------------------------------------
    // hists


    //---------------------------------------------------------------------------
    for(map< TString, TH1**>::iterator iter = hDim1.begin(); iter != hDim1.end(); ++iter ) {
        TArrayI& ar = hD[iter->first];
        deleteDim1(iter->second,ar.At(0),kFALSE);
    }
    hDim1.clear();

    for(map< TString, TH1***>::iterator iter = hDim2.begin(); iter != hDim2.end(); ++iter ) {
        TArrayI& ar = hD[iter->first];
        deleteDim2(iter->second,ar.At(0),ar.At(1),kFALSE);
    }
    hDim2.clear();

    for(map< TString, TH1****>::iterator iter = hDim3.begin(); iter != hDim3.end(); ++iter ) {
        TArrayI& ar = hD[iter->first];
        deleteDim3(iter->second,ar.At(0),ar.At(1),ar.At(2),kFALSE);
    }
    hDim3.clear();

    for(map< TString, TH1*****>::iterator iter = hDim4.begin(); iter != hDim4.end(); ++iter ) {
        TArrayI& ar = hD[iter->first];
        deleteDim4(iter->second,ar.At(0),ar.At(1),ar.At(2),ar.At(3),kFALSE);
    }
    hDim4.clear();

    for(map< TString, TH1******>::iterator iter = hDim5.begin(); iter != hDim5.end(); ++iter ) {
        TArrayI& ar = hD[iter->first];
        deleteDim5(iter->second,ar.At(0),ar.At(1),ar.At(2),ar.At(3),ar.At(4),kFALSE);
    }
    hDim5.clear();
    //---------------------------------------------------------------------------

    if(getDeleteObjects()){
	for(map< TString, TObjArray>::iterator iter = hM.begin(); iter != hM.end(); ++iter ) {
	    TString classname = "unused";
	    classname = (*iter).second.At(0)->ClassName();
	    Int_t size = (*iter).second.GetEntries();

            Int_t type = -1;
	    if(classname.Contains("TH1")){
		type=10;
		if(classname.CompareTo("TH1S")==0)  type = 10 ;
		if(classname.CompareTo("TH1I")==0)  type = 11 ;
		if(classname.CompareTo("TH1F")==0)  type = 12 ;
		if(classname.CompareTo("TH1D")==0)  type = 13 ;
	    } else if(classname.Contains("TH2")){
		type=20;
		if(classname.CompareTo("TH2S")==0)  type = 20 ;
		if(classname.CompareTo("TH2I")==0)  type = 21 ;
		if(classname.CompareTo("TH2F")==0)  type = 22 ;
		if(classname.CompareTo("TH2D")==0)  type = 23 ;

	    } else if(classname.Contains("TH3")){
		type=30;
		if(classname.CompareTo("TH3S")==0)  type = 30 ;
		if(classname.CompareTo("TH3I")==0)  type = 31 ;
		if(classname.CompareTo("TH3F")==0)  type = 32 ;
		if(classname.CompareTo("TH3D")==0)  type = 33 ;
	    }
	    for(Int_t i = 0; i< size; i++){
		switch (type) {
		case 10:  delete (TH1S*)  ((*iter).second.At(i));
		break;
		case 11:  delete (TH1I*)  ((*iter).second.At(i));
		break;
		case 12:  delete (TH1F*)  ((*iter).second.At(i));
		break;
		case 13:  delete (TH1D*)  ((*iter).second.At(i));
		break;
		case 20:  delete (TH2S*)  ((*iter).second.At(i));
		break;
		case 21:  delete (TH2I*)  ((*iter).second.At(i));
		break;
		case 22:  delete (TH2F*)  ((*iter).second.At(i));
		break;
		case 23:  delete (TH2D*)  ((*iter).second.At(i));
		break;
		case 30:  delete (TH2S*)  ((*iter).second.At(i));
		break;
		case 31:  delete (TH2I*)  ((*iter).second.At(i));
		break;
		case 32:  delete (TH2F*)  ((*iter).second.At(i));
		break;
		case 33:  delete (TH2D*)  ((*iter).second.At(i));
		break;
		default:
		    break;

		}
	    }
            (*iter).second.Clear();
	}
    }
    hM.clear();



    hD.clear();
    hTitle.clear();
    hMask.clear();
    hDir.clear();


    //---------------------------------------------------------------------------
    // canvas



    //---------------------------------------------------------------------------
    for(map< TString, TCanvas**>::iterator iter = hDim1C.begin(); iter != hDim1C.end(); ++iter ) {
        TArrayI& ar = hDC[iter->first];
        deleteDim1(iter->second,ar.At(0),kFALSE);
    }
    hDim1C.clear();

    for(map< TString, TCanvas***>::iterator iter = hDim2C.begin(); iter != hDim2C.end(); ++iter ) {
        TArrayI& ar = hDC[iter->first];
        deleteDim2(iter->second,ar.At(0),ar.At(1),kFALSE);
    }
    hDim2C.clear();

    for(map< TString, TCanvas****>::iterator iter = hDim3C.begin(); iter != hDim3C.end(); ++iter ) {
        TArrayI& ar = hDC[iter->first];
        deleteDim3(iter->second,ar.At(0),ar.At(1),ar.At(2),kFALSE);
    }
    hDim3C.clear();

    for(map< TString, TCanvas*****>::iterator iter = hDim4C.begin(); iter != hDim4C.end(); ++iter ) {
        TArrayI& ar = hDC[iter->first];
        deleteDim4(iter->second,ar.At(0),ar.At(1),ar.At(2),ar.At(3),kFALSE);
    }
    hDim4C.clear();

    for(map< TString, TCanvas******>::iterator iter = hDim5C.begin(); iter != hDim5C.end(); ++iter ) {
        TArrayI& ar = hDC[iter->first];
        deleteDim5(iter->second,ar.At(0),ar.At(1),ar.At(2),ar.At(3),ar.At(4),kFALSE);
    }
    hDim5C.clear();
    //---------------------------------------------------------------------------

    if(getDeleteObjects()){
   	for(map< TString, TObjArray>::iterator iter = hMC.begin(); iter != hMC.end(); ++iter ) {
	    Int_t size = (*iter).second.GetEntries();
	    for(Int_t i = 0; i< size; i++){
		if( (*iter).second.At(i) ) delete (TCanvas*)((*iter).second.At(i));
	    }
	    (*iter).second.Clear();
	}
    }
    hMC.clear();
    hDC.clear();
    hNpC.clear();
    hTitleC.clear();
    hMaskC.clear();
    hDirC.clear();

    //---------------------------------------------------------------------------
    // cuts
    if(getDeleteObjects()){
	for(map< TString, TCutG*>::iterator iter = hMCut.begin(); iter != hMCut.end(); ++iter ) {
	    if((*iter).second ) delete (*iter).second;
	}
    }
    hMCut.clear();
    hDirCut.clear();

    //---------------------------------------------------------------------------
    // fits
    if(getDeleteObjects()){
	for(map< TString, TF1*>::iterator iter = hMFit.begin(); iter != hMFit.end(); ++iter ) {
	    if((*iter).second ) delete (*iter).second;
	}
    }
    hMFit.clear();
    hDirFit.clear();

    //---------------------------------------------------------------------------
    // parameters
    if(getDeleteObjects()){
	for(map< TString, TObject*>::iterator iter = hMPar.begin(); iter != hMPar.end(); ++iter ) {
	    if((*iter).second ) delete (*iter).second;
	}
    }
    hMPar.clear();
    hDirPar.clear();

    //---------------------------------------------------------------------------
    // macros
    if(getDeleteObjects()){
	for(map< TString, TMacro*>::iterator iter = hMMacro.begin(); iter != hMMacro.end(); ++iter ) {
	    if((*iter).second ) delete (*iter).second;
	}
    }
    hMMacro.clear();
    hDirMacro.clear();


}

TString HHistMap::getLabels(const TString name,vector<TString>&labels)
{

    labels.clear();
    TRegexp regexp("\\[[a-zA-ZA0-9]+\\]");
    Ssiz_t max = name.Length();

    Ssiz_t start = 0;
    Ssiz_t len   = 0;
    Ssiz_t pos   = 0;
    TString out;
    TString cp;
    while(start<max && pos > -1){
	pos = regexp.Index(name,&len,start);
	if(pos<0)continue;
	cp = name;
	cp.Replace(0,pos+1,"");
        cp.Replace(len-2,cp.Length()-len+2,"");
        labels.push_back(cp);
	out += cp;
	out += ",";
	start = pos+len;

    }

    if(out.EndsWith(",")) out.Remove(out.Length()-1,1);
    return out;
}


Bool_t HHistMap::setOutputFile(TString name)
{
    // set the output file for the histograms
    // already existing file will be overwritten

    if(name!=""){
	if(!output){
	    output = new TFile(name.Data(),"RECREATE");
	} else {
            Error("setOutputFile()","Already other file opened! will be ignored...");
	    return kFALSE;
	}
    } else {
	Warning("setOutputFile()","Name of file not specified! Use setOutputFile() if the histograms should be stored to the out put.");
        return kFALSE;
    }
    return kTRUE;
}
void HHistMap::print()
{
    printMap();
    printCanvasMap();
    printCutMap();
    printFitMap();
    printParameterMap();
    printMacroMap();
}

void HHistMap::printMap()
{
    // print he list of available histograms
    Int_t ct = 0;
    cout<<"------------------------------------------------------"<<endl;
    cout<<"Available histograms :"<<endl;
    for(map< TString, TObjArray>::iterator iter = hM.begin(); iter != hM.end(); ++iter ) {
	ct++;
	TString classname = "unused";
	classname = (*iter).second.At(0)->ClassName();
        Int_t size = (*iter).second.GetEntries();
        Int_t dim = hD[(*iter).first].GetSize();
	cout <<setw(3)<<ct<<" "<<setw(40)<< (*iter).first.Data() << " is a " << classname.Data()<<" , size = "<<setw(5)<<size<<" dim = "<<dim<<" , Dir = "<<hDir[(*iter).first]<<endl;
    }
    cout<<"------------------------------------------------------"<<endl;
}

void HHistMap::printCanvasMap()
{
    // print the list of available canvas
    Int_t ct = 0;
    cout<<"------------------------------------------------------"<<endl;
    cout<<"Available canvas :"<<endl;
    for(map< TString, TObjArray>::iterator iter = hMC.begin(); iter != hMC.end(); ++iter ) {
	ct++;
	TString classname = "unused";
	classname = (*iter).second.At(0)->ClassName();
        Int_t size = (*iter).second.GetEntries();
        Int_t dim = hDC[(*iter).first].GetSize();
	cout <<setw(3)<<ct<<" "<<setw(40)<< (*iter).first.Data() << " is a " << classname.Data()<<" , size = "<<setw(5)<<size<<" dim = "<<dim<<" , Dir = "<<hDirC[(*iter).first]<<endl;
    }
    cout<<"------------------------------------------------------"<<endl;
}

void HHistMap::printCutMap()
{
    // print the list of available cuts
    Int_t ct = 0;
    cout<<"------------------------------------------------------"<<endl;
    cout<<"Available cuts :"<<endl;
    for(map< TString, TCutG*>::iterator iter = hMCut.begin(); iter != hMCut.end(); ++iter ) {
	ct++;
	TString classname = "unused";
	classname = (*iter).second->ClassName();
	cout <<setw(3)<<ct<<" "<<setw(40)<< (*iter).first.Data() << " is a " << classname.Data()<<" , Dir = "<<hDirCut[(*iter).first]<<endl;
    }
    cout<<"------------------------------------------------------"<<endl;
}

void HHistMap::printFitMap()
{
    // print the list of available fits
    Int_t ct = 0;
    cout<<"------------------------------------------------------"<<endl;
    cout<<"Available fits :"<<endl;
    for(map< TString, TF1*>::iterator iter = hMFit.begin(); iter != hMFit.end(); ++iter ) {
	ct++;
	TString classname = "unused";
	classname = (*iter).second->ClassName();
	cout <<setw(3)<<ct<<" "<<setw(40)<< (*iter).first.Data() << " is a " << classname.Data()<<" , Dir = "<<hDirFit[(*iter).first]<<endl;
    }
    cout<<"------------------------------------------------------"<<endl;
}

void HHistMap::printParameterMap()
{
    // print the list of available parameters
    Int_t ct = 0;
    cout<<"------------------------------------------------------"<<endl;
    cout<<"Available parameter :"<<endl;
    for(map< TString, TObject*>::iterator iter = hMPar.begin(); iter != hMPar.end(); ++iter ) {
	ct++;
	TString classname = "unused";
	if((*iter).second ) classname = (*iter).second->ClassName();
	cout <<setw(3)<<ct<<" "<<setw(40)<< (*iter).first.Data() << " is a " << classname.Data()<<" , Dir = "<<hDirPar[(*iter).first]<<endl;
    }
    cout<<"------------------------------------------------------"<<endl;
}

void HHistMap::printMacroMap()
{
    // print the list of available macros
    Int_t ct = 0;
    cout<<"------------------------------------------------------"<<endl;
    cout<<"Available macro :"<<endl;
    for(map< TString, TMacro*>::iterator iter = hMMacro.begin(); iter != hMMacro.end(); ++iter ) {
	ct++;
	TString classname = "unused";
	if((*iter).second ) classname = (*iter).second->ClassName();
	cout <<setw(3)<<ct<<" "<<setw(40)<< (*iter).first.Data() << " is a " << classname.Data()<<" , Dir = "<<hDirMacro[(*iter).first]<<endl;
    }
    cout<<"------------------------------------------------------"<<endl;
}

void HHistMap::addHistContent(HHistMap& hM2)
{
    // add content of all hists of hM2 to this (TH1::Add)
    for(map< TString, TObjArray>::iterator iter = hM.begin(); iter != hM.end(); ++iter ) {

	TObjArray* ar1 = getHistArray((*iter).first);
	TObjArray* ar2 = hM2.getHistArray((*iter).first);

	if(ar1 && ar2) {
	    addArray(ar1,ar2,1,1);
	} else {
	    Error("addHistContent()","Histogram: %s not found! skipped.",(*iter).first.Data());
	}

    }
}


Bool_t HHistMap::addFile (TString infile)
{
    // add HHIstMap from a single root file.

    if(gSystem->AccessPathName(infile.Data()) == 0) {
        Bool_t stat =  TDirectory::AddDirectoryStatus();
        TDirectory::AddDirectory(kFALSE);
	TFile* in = new TFile(infile.Data(),"READ");

	HHistMap* hM2 = (HHistMap*)in->Get("HHistMap");

	if(hM2) {
	    cout<<"add file : "<<infile.Data()<<endl;
	    addHistContent(*hM2);
	} else {
	    Error("addFile()","File = %s : HHistMap objekt not found! Will be skipped .... ",infile.Data());
	    in->Close();
	    delete in;
	    gROOT->cd();
	    return kFALSE;
	}

	hM2->setDeleteObjects(kTRUE);
	delete hM2;

	in->Close();
        delete in;
	TDirectory::AddDirectory(stat);

        return kTRUE;
    } else {
        Error("addFile()","File = %s not found! Will be skipped .... ",infile.Data());
        return kFALSE;
    }

}

Bool_t HHistMap::addFiles(TString expression){

    // add all files matching the expression to the chain

    TObjArray* arr = HTool::glob(expression);
    Int_t n = arr->GetEntries();
    if(n == 0) {
	Warning("addFiles()","No file matching expression '%s' found !",expression.Data());
    } else {
	for(Int_t i = 0; i < n; i ++){
	    TString name = ((TObjString*)arr->At(i))->GetString();
	    addFile(name);
	}
    }
    delete arr;
    return kTRUE;

}

Bool_t HHistMap::addFilesList(TString filelist)
{
    // add all files in list filelist. The list should contain
    // 1 root file per line (including path). Return kFALSE if
    // list files does not exist or and error occured while
    // reading the file

    if(gSystem->AccessPathName(filelist.Data()) == 0 )
    {
	ifstream in;
	in.open(filelist.Data());
        TString name;
	while(!in.eof()){
	    in>>name;
	    if(!in.fail()) {
		addFile(name);
	    }
	    else {
               Error("addFilesList()","Error detected during reading the files list ! Will skipped all other files if any.... ");
	       in.close();
               return kFALSE;
	    }
	}
        in.close();

       return kTRUE;
    } else {
       Error("addFilesList()","File = %s not found! Will be skipped .... ",filelist.Data());
       return kFALSE;
    }
}


Bool_t HHistMap::addMultFiles(TString commaSeparatedList)
{
    // add multiple files as comma separated file list : "file1,file2,file3"

    TObjArray* arr = commaSeparatedList.Tokenize(",");
    Int_t n = arr->GetEntries();
    if(n == 0) {
	Warning("addMultFiles()","No file in input string '%s' found !",commaSeparatedList.Data());
    } else {
	for(Int_t i = 0; i < n; i ++){
	    TString name = ((TObjString*)arr->At(i))->GetString();
	    if(!addFile(name)){
		delete arr;
		return kFALSE;
	    }
	}
    }
    delete arr;
    return kTRUE;
}



Bool_t HHistMap::addHistMap(TString input,TString output)
{
    // static function to add histogram contents of same type
    // HHistMap stored in different root files. The HHistMap
    // object of the first input file is copied, reset all hists
    // and then the histogramm content of all files is added.
    //
    //  input : a.  comma separated filelist  ("file1,root,file2.root")
    //          b.  reg expression matching root files (file_*.root" , has to end .root)
    //          c.  list file with 1 file per line
    //  output: root file name to store the merge HHistMap to

    if(input == "" ) {
        cout<<"addHistMap() : No input defined !"<<endl;
	return kFALSE;
    }
    if(output == "" ){
	cout<<"addHistMap() : No output defined !"<<endl;
	return kFALSE;
    }


    Int_t methode = 0;

    TString   firstname="";

    if(input.Contains(",") == 1)  {
        // comma separated file list
	methode = 3;

	TObjArray* arr = input.Tokenize(",");
	Int_t n = arr->GetEntries();
	if(n == 0) {
	    cout<<"addHistMap() : No file in input string found !"<<endl;
	} else {
		firstname = ((TObjString*)arr->At(0))->GetString();
	}
        delete arr;

    } else if(input.EndsWith(".root")==1){
        // single file or regexp
	methode = 1;

	TObjArray* arr = HTool::glob(input);
	Int_t n = arr->GetEntries();
	if(n == 0) {
	    cout<<"addHistMap() : No file matching expression found !"<<endl;
	} else {
	    firstname = ((TObjString*)arr->At(0))->GetString();
	}
        delete arr;

    } else {
	methode = 2;  // list file
	if(gSystem->AccessPathName(input.Data()) == 0 )
	{
	    ifstream in;
	    in.open(input.Data());
            Int_t ct=0;
	    while(!in.eof() && ct<1){
		in>>firstname;
		if(!in.fail()) {
                    ct++;
		}
		else {
		    cout<<"addHistMap() : Error detected during reading the files list ! Will skipped all other files if any.... "<<endl;
		}
	    }
	    in.close();
	}
    }

    HHistMap* hMOut=0;

    if(firstname != "" &&  gSystem->AccessPathName(firstname.Data()) == 0 ){

	TFile in(firstname.Data(),"READ");
	HHistMap* hM2=(HHistMap*)in.Get("HHistMap");

	if(hM2) {
	    hMOut = hM2;
	    hMOut->resetAllHists();
	    hMOut->setOutputFile(output);
	}
	in.Close();
        gROOT->cd();
    } else {
	cout<<"addHistMap() : Error in input. no merge file will be produce!"<<endl;
        return kFALSE;
    }

    if(hMOut){
	if(methode == 3) hMOut->addMultFiles(input);
	if(methode == 2) hMOut->addFilesList(input);
	if(methode == 1) hMOut->addFiles(input);

        hMOut->writeHists();

    }

    return kTRUE;
}



Bool_t HHistMap::addHist(TH1* h,TString dir)
{
    // add a single histogram
    if(!h) {
	Error("addHist()","hist pointer = NULL!");
	return kFALSE;
    }
    TString name = h->GetName();

    h->SetDirectory(0);

    map<TString,TObjArray>::iterator iter = hM.find(name);
    if( iter == hM.end() ){ // new variable
	TObjArray a;
        a.Add(h);
	TArrayI dim(1);
        dim.Reset(0);  // no array
	hM    [name] = a;
	hMask [name] = name;
	hTitle[name] = h->GetTitle();
	hD    [name] = dim;
        hDir  [name] = dir;

    } else { // exists already
	Error("addHist()","hist with name \"%s\" has been used already!",name.Data());
	return kFALSE;
    }
    return kTRUE;
}

Bool_t HHistMap::removeHist(TString name)
{
    // remove a histogram/histogram array

    map<TString,TObjArray>::iterator iter = hM.find(name);
    if( iter == hM.end() ){ // new variable
	Error("removeHist()","hist with name \"%s\" not found!",name.Data());
        return kFALSE;
    } else { // exists
        // histograms
	iter->second.Delete();
	hM.erase( iter );
        // mask,title,dir
	map<TString,TString>::iterator iter2 = hMask.find(name);
	hMask.erase( iter2 );
        iter2 = hTitle.find(name);
	hTitle.erase( iter2 );
	iter2 = hDir.find(name);
	hDir.erase( iter2 );
        // dim array
	map<TString,TArrayI>::iterator iter3 = hD.find(name);
        Int_t dim = iter3->second.GetSize();
        TArrayI& ar = iter3->second;
        // dynamic pointers
	if(dim == 1){
            map<TString,TH1**>::iterator iter4 = hDim1.find(name);
	    if(iter4 != hDim1.end()) deleteDim1(iter4->second,ar.At(0),kFALSE);
	} else if(dim == 2){
            map<TString,TH1***>::iterator iter4 = hDim2.find(name);
	    if(iter4 != hDim2.end()) deleteDim2(iter4->second,ar.At(0),ar.At(1),kFALSE);
	} else if(dim == 3){
            map<TString,TH1****>::iterator iter4 = hDim3.find(name);
	    if(iter4 != hDim3.end()) deleteDim3(iter4->second,ar.At(0),ar.At(1),ar.At(2),kFALSE);
	} else if(dim == 4){
            map<TString,TH1*****>::iterator iter4 = hDim4.find(name);
	    if(iter4 != hDim4.end()) deleteDim4(iter4->second,ar.At(0),ar.At(1),ar.At(2),ar.At(3),kFALSE);
	} else if(dim == 5){
            map<TString,TH1******>::iterator iter4 = hDim5.find(name);
	    if(iter4 != hDim5.end()) deleteDim5(iter4->second,ar.At(0),ar.At(1),ar.At(2),ar.At(3),ar.At(4),kFALSE);
	}
	hD.erase( iter3 );
    }
    return kTRUE;
}

TH1* HHistMap::createHist(TString Type,
			  TString name,TString title,
			  Int_t nbinx,Double_t x1,Double_t x2,
			  Int_t nbiny,Double_t y1,Double_t y2,
			  Int_t nbinz,Double_t z1,Double_t z2,
			  TString xtitle,TString ytitle,TString ztitle)
{
    // create an histograms (const binning).
    // Type : TH1S,TH1I,TH1F,TH1D,TH2S,TH2I,TH2F,TH2D,TH3S,TH3I,TH3F,TH3D,TProfile,TProfile2D,TProfile3D
    // name : hist name
    // title : hist title
    // hist axis : 1d  Int_t nbinx,Double_t x1,Double_t x2,
    //    	   2d  Int_t nbiny,Double_t y1,Double_t y2,
    //    	   3d  Int_t nbinz,Double_t z1,Double_t z2,
    // axis title  xtitle,ytitle,ztitle
    // dir : output dir

    if(name == "") {
	Error("createHist()","hist name empty!");
	return NULL;
    }

    TH1* h = NULL;
    if(Type == "TH1S" ||
       Type == "TH1I" ||
       Type == "TH1F" ||
       Type == "TH1D"
      ){
	if(Type == "TH1S")  {
	    h = new TH1S(name.Data(),title.Data(),nbinx,x1,x2);
	} else if(Type == "TH1I")  {
	    h = new TH1I(name.Data(),title.Data(),nbinx,x1,x2);
	} else if(Type == "TH1F")  {
	    h = new TH1F(name.Data(),title.Data(),nbinx,x1,x2);
	} else if(Type == "TH1D")  {
	    h = new TH1D(name.Data(),title.Data(),nbinx,x1,x2);
	}
	h->SetXTitle(xtitle.Data());
	h->SetYTitle(ytitle.Data());


    } else if (
	       Type == "TH2S" ||
	       Type == "TH2I" ||
	       Type == "TH2F" ||
	       Type == "TH2D"
	      )
    {
	if(Type == "TH2S")  {
	    h = new TH2S(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2);
	} else if(Type == "TH2I")  {
	    h = new TH2I(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2);
	} else if(Type == "TH2F")  {
	    h = new TH2F(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2);
	} else if(Type == "TH2D")  {
	    h = new TH2D(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2);
	}
	h->SetXTitle(xtitle.Data());
	h->SetYTitle(ytitle.Data());
        h->SetZTitle(ztitle.Data());

    } else if (
	       Type == "TH3S" ||
	       Type == "TH3I" ||
	       Type == "TH3F" ||
	       Type == "TH3D"
	      ){
	if(Type == "TH3S")  {
	    h = new TH3S(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2);
	} else if(Type == "TH3I")  {
	    h = new TH3I(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2);
	} else if(Type == "TH3F")  {
	    h = new TH3F(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2);
	} else if(Type == "TH3D")  {
	    h = new TH3D(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2);
	}
	h->SetXTitle(xtitle.Data());
	h->SetYTitle(ytitle.Data());
	h->SetZTitle(ztitle.Data());

    } else if (
	       Type == "TProfile"   ||
	       Type == "TProfile2D" ||
	       Type == "TProfile3D"
	      ){
	if(Type == "TProfile")  {
	    h = new TProfile(name.Data(),title.Data(),nbinx,x1,x2);
	} else if(Type == "TProfile2D")  {
	    h = new TProfile2D(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2);
	} else if(Type == "TProfile3D")  {
	    h = new TProfile3D(name.Data(),title.Data(),nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2);
	}
	h->SetXTitle(xtitle.Data());
	h->SetYTitle(ytitle.Data());
	h->SetZTitle(ztitle.Data());
    } else {
	Error("createHist()","Unknow hist type %s. Supported are S,I,F,D for 1,2 and 3 dim hists and profiles.",Type.Data());
        return NULL;
    }
    h->SetDirectory(0);
    return h;
}

TH1* HHistMap::createHistN(TString Type,
			  TString name,TString title,
			  Int_t nbinx,Double_t* x,
			  Int_t nbiny,Double_t* y,
			  Int_t nbinz,Double_t* z,
			  TString xtitle,TString ytitle,TString ztitle)
{
    // create an histograms (non const binning).
    // Type : TH1S,TH1I,TH1F,TH1D,TH2S,TH2I,TH2F,TH2D,TH3S,TH3I,TH3F,TH3D,TProfile,TProfile2D,TProfile3D
    // name : hist name
    // title : hist title
    // hist axis : 1d  Int_t nbinx, pointer to Double_t array x for bins,
    //    	   2d  Int_t nbiny, pointer to Double_t array y for bins,
    //    	   3d  Int_t nbinz, pointer to Double_t array z for bins,
    // axis title  xtitle,ytitle,ztitle
    // dir : output dir

    if(name == "") {
	Error("createHistN()","hist name empty!");
	return NULL;
    }

    TH1* h = NULL;
    if(Type == "TH1S" ||
       Type == "TH1I" ||
       Type == "TH1F" ||
       Type == "TH1D"
      ){
	if(Type == "TH1S")  {
	    h = new TH1S(name.Data(),title.Data(),nbinx,x);
	} else if(Type == "TH1I")  {
	    h = new TH1I(name.Data(),title.Data(),nbinx,x);
	} else if(Type == "TH1F")  {
	    h = new TH1F(name.Data(),title.Data(),nbinx,x);
	} else if(Type == "TH1D")  {
	    h = new TH1D(name.Data(),title.Data(),nbinx,x);
	}
	h->SetXTitle(xtitle.Data());
	h->SetYTitle(ytitle.Data());


    } else if (
	       Type == "TH2S" ||
	       Type == "TH2I" ||
	       Type == "TH2F" ||
	       Type == "TH2D"
	      )
    {
	if(Type == "TH2S")  {
	    h = new TH2S(name.Data(),title.Data(),nbinx,x,nbiny,y);
	} else if(Type == "TH2I")  {
	    h = new TH2I(name.Data(),title.Data(),nbinx,x,nbiny,y);
	} else if(Type == "TH2F")  {
	    h = new TH2F(name.Data(),title.Data(),nbinx,x,nbiny,y);
	} else if(Type == "TH2D")  {
	    h = new TH2D(name.Data(),title.Data(),nbinx,x,nbiny,y);
	}
	h->SetXTitle(xtitle.Data());
	h->SetYTitle(ytitle.Data());
        h->SetZTitle(ztitle.Data());

    } else if (
	       Type == "TH3S" ||
	       Type == "TH3I" ||
	       Type == "TH3F" ||
	       Type == "TH3D"
	      ){
	if(Type == "TH3S")  {
	    h = new TH3S(name.Data(),title.Data(),nbinx,x,nbiny,y,nbinz,z);
	} else if(Type == "TH3I")  {
	    h = new TH3I(name.Data(),title.Data(),nbinx,x,nbiny,y,nbinz,z);
	} else if(Type == "TH3F")  {
	    h = new TH3F(name.Data(),title.Data(),nbinx,x,nbiny,y,nbinz,z);
	} else if(Type == "TH3D")  {
	    h = new TH3D(name.Data(),title.Data(),nbinx,x,nbiny,y,nbinz,z);
	}
	h->SetXTitle(xtitle.Data());
	h->SetYTitle(ytitle.Data());
	h->SetZTitle(ztitle.Data());

    } else if (
	       Type == "TProfile" ||
	       Type == "TProfile2D" ||
	       Type == "TProfile3D"
	      ){
	if(Type == "TProfile")  {
	    h = new TProfile(name.Data(),title.Data(),nbinx,x);
	} else if(Type == "TProfile2D")  {
	    h = new TProfile2D(name.Data(),title.Data(),nbinx,x,nbiny,y);
	} else if(Type == "TProfile3D")  {
	    h = new TProfile3D(name.Data(),title.Data(),nbinx,x,nbiny,y,nbinz,z);
	}
	h->SetXTitle(xtitle.Data());
	h->SetYTitle(ytitle.Data());
	h->SetZTitle(ztitle.Data());

    } else {
	Error("createHistN()","Unknow hist type %s. Supported are S,I,F,D for 1,2 and 3 dim hists and profiles.",Type.Data());
        return NULL;
    }
    h->SetDirectory(0);
    return h;
}

Bool_t HHistMap::addHist(TString Type,
			 TString name,TString title,
			 Int_t nbinx,Double_t x1,Double_t x2,
			 Int_t nbiny,Double_t y1,Double_t y2,
			 Int_t nbinz,Double_t z1,Double_t z2,
			 TString xtitle,TString ytitle,TString ztitle,
			 TString dir)
{
    // add an histograms (const binning).
    // Type : TH1S,TH1I,TH1F,TH1D,TH2S,TH2I,TH2F,TH2D,TH3S,TH3I,TH3F,TH3D,TProfile,TProfile2D,TProfile3D
    // name : hist name
    // title : hist title
    // hist axis : 1d  Int_t nbinx,Double_t x1,Double_t x2,
    //    	   2d  Int_t nbiny,Double_t y1,Double_t y2,
    //    	   3d  Int_t nbinz,Double_t z1,Double_t z2,
    // axis title  xtitle,ytitle,ztitle
    // dir : output dir

    TH1* h = createHist(Type,name,title,nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2,xtitle,ytitle,ztitle);

    if(h == NULL) {
	return kFALSE;
    }

    h->SetDirectory(0);

    map<TString,TObjArray>::iterator iter = hM.find(name);
    if( iter == hM.end() ){ // new variable
	TObjArray a;
        a.Add(h);
	TArrayI dim(1);
        dim.Reset(0);  // no array
	hM    [name] = a;
	hMask [name] = name;
	hTitle[name] = title;
	hD    [name] = dim;
        hDir  [name] = dir;

    } else { // exists already
	Error("addHist()","hist with name \"%s\" has been used already!",name.Data());
        delete h;
	return kFALSE;
    }
    return kTRUE;
}

Bool_t HHistMap::addHistN(TString Type,
			 TString name,TString title,
			 Int_t nbinx,Double_t* x,
			 Int_t nbiny,Double_t* y,
			 Int_t nbinz,Double_t* z,
			 TString xtitle,TString ytitle,TString ztitle,
			 TString dir)
{
    // add an histograms (non const binning).
    // Type : TH1S,TH1I,TH1F,TH1D,TH2S,TH2I,TH2F,TH2D,TH3S,TH3I,TH3F,TH3D,TProfile,TProfile2D,TProfile3D
    // name : hist name
    // title : hist title
    // hist axis : 1d  Int_t nbinx, pointer to Double_t array x for bins,
    //    	   2d  Int_t nbiny, pointer to Double_t array y for bins,
    //    	   3d  Int_t nbinz, pointer to Double_t array z for bins,
    // axis title  xtitle,ytitle,ztitle
    // dir : output dir

    TH1* h = createHistN(Type,name,title,nbinx,x,nbiny,y,nbinz,z,xtitle,ytitle,ztitle);

    if(h == NULL) {
	return kFALSE;
    }

    h->SetDirectory(0);

    map<TString,TObjArray>::iterator iter = hM.find(name);
    if( iter == hM.end() ){ // new variable
	TObjArray a;
        a.Add(h);
	TArrayI dim(1);
        dim.Reset(0);  // no array
	hM    [name] = a;
	hMask [name] = name;
	hTitle[name] = title;
	hD    [name] = dim;
        hDir  [name] = dir;

    } else { // exists already
	Error("addHistN()","hist with name \"%s\" has been used already!",name.Data());
        delete h;
	return kFALSE;
    }
    return kTRUE;
}

Bool_t HHistMap::addHistArray(TH1* h[],TString name,
			      TString mask,TString title,TString dir,
			      Int_t i1max,Int_t i2max,Int_t i3max,Int_t i4max,Int_t i5max)
{
    // add and array of histograms. the size of the array and
    // a lable "name" to access the array later has to be specified
    // mask  : printf format string for hist names (needed for config file)
    // title : printf format string for hist titles (needed for config file)
    // dir   : dir in otput file
    // Only 1-dim arrays are supported. For more dimensional histogram
    // arrays (up to 5 indices) one should use linearized versions
    // using index made by HTool::getLinearIndex(....)
    // i1max to i5max give the size in the dimension
    // the histograms can later be retrieved by get("name",i1,i2....)


    if(!h[0]) {
	Error("addHistArray()","hist pointer = NULL!");
	return kFALSE;
    }
    if(i1max < 0) {
	Error("addHistArray()","array size < 0!");
	return kFALSE;
    }
    if(name == "") {
	Error("addHistArray()","name is empty < 0!");
	return kFALSE;
    }

    Int_t dim = -1;

    if     (i1max >= 0 && i2max <  0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 1;
    else if(i1max >= 0 && i2max >= 0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 2;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max <  0 && i5max <  0  ) dim = 3;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max <  0  ) dim = 4;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max >= 0  ) dim = 5;

    if(dim<0) {
	Error("addHistArray()","problem with dimension for hist %s : ind %i %i %i %i %i !",name.Data(),i1max,i2max,i3max,i4max,i5max);
	return kFALSE;
    }

    Int_t size = 0;
    if     (dim == 1) size = i1max;
    else if(dim == 2) size = i1max*i2max;
    else if(dim == 3) size = i1max*i2max*i3max;
    else if(dim == 4) size = i1max*i2max*i3max*i4max;
    else if(dim == 5) size = i1max*i2max*i3max*i4max*i5max;

    map<TString,TObjArray>::iterator iter = hM.find(name);
    if( iter == hM.end() ){ // new variable
	TObjArray a(size);

	for(Int_t i=0;i<size;i++) {
	    if(h[i]) h[i]->SetDirectory(0);
	    else {
		Error("addHistArray()","hist pointer = NULL for index = %i!",i);
	    }
	    a.Add(h[i]);
	}
	TArrayI d(dim);
        if(dim >= 1) d[0] = i1max;
        if(dim >= 2) d[1] = i2max;
        if(dim >= 3) d[2] = i3max;
        if(dim >= 4) d[3] = i4max;
        if(dim >= 5) d[4] = i5max;

	hM    [name] = a;
	hMask [name] = mask;
	hTitle[name] = title;
	hD    [name] = d;
        hDir  [name] = dir;

    } else { // exists already
	Error("addHistArray()","hist with name \"%s\" has been used already!",name.Data());
	return kFALSE;
    }
    return kTRUE;
}

Bool_t HHistMap::addHistArray(TString Type,TString name,TString mask,TString title,
			      Int_t nbinx,Double_t x1,Double_t x2,
			      Int_t nbiny,Double_t y1,Double_t y2,
			      Int_t nbinz,Double_t z1,Double_t z2,
			      TString xtitle,TString ytitle,TString ztitle,
			      TString dir,
			      Int_t i1max,Int_t i2max,Int_t i3max,Int_t i4max,Int_t i5max,
                              TString n1,TString n2,TString n3,TString n4,TString n5
			     )
{


    // add an array of histograms (const binning). the size of the array and
    // a lable "name" to access the array later has to be specified
    // Type : TH1S,TH1I,TH1F,TH1D,TH2S,TH2I,TH2F,TH2D,TH3S,TH3I,TH3F,TH3D
    // name : lable for the histarray
    // mask : histname format like printf for the give numbers of dimensions : "htest[%i][%i]" (2dim array)
    // title : hist title format like printf for the give numbers of dimensions : "htest[%i][%i]" (2dim array)
    //         or same title for all hists (if %i is not contained in format)
    // hist axis : 1d  Int_t nbinx,Double_t x1,Double_t x2,
    //    	   2d  Int_t nbiny,Double_t y1,Double_t y2,
    //    	   3d  Int_t nbinz,Double_t z1,Double_t z2,
    // axis title  xtitle,ytitle,ztitle
    // dir : output dir
    // i1max to i5max give the size in the dimension
    // the histograms can later be retrieved by get("name",i1,i2....)
    // -1 (default) mean not used
    // TString n1,n2,n3,n4,n5 (default empty) can contain a comma separated
    // list of labels for each dimension (example: i1max=4 ,"MDCI,MDCII,MDCIII,MDCIV" )
    // imax and number of labels have to be be equal. The lable
    // will replace the dimension index (example:  htime1_%i => htime1_0 to htime1_3 will
    // become htime1_MDCI to htime1_MDCIV) in the name and title


    if(i1max < 0) {
	Error("addHistArray()","array size < 0!");
	return kFALSE;
    }
    if(name == "") {
	Error("addHistArray()","name is empty < 0!");
	return kFALSE;
    }

    Int_t dim = -1;

    if     (i1max >= 0 && i2max <  0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 1;
    else if(i1max >= 0 && i2max >= 0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 2;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max <  0 && i5max <  0  ) dim = 3;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max <  0  ) dim = 4;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max >= 0  ) dim = 5;

    if(dim<0) {
	Error("addHistArray()","problem with dimension for hist %s : ind %i %i %i %i %i !",name.Data(),i1max,i2max,i3max,i4max,i5max);
	return kFALSE;
    }

    Int_t size = 0;
    if     (dim == 1) size = i1max;
    else if(dim == 2) size = i1max*i2max;
    else if(dim == 3) size = i1max*i2max*i3max;
    else if(dim == 4) size = i1max*i2max*i3max*i4max;
    else if(dim == 5) size = i1max*i2max*i3max*i4max*i5max;


    Int_t is1,is2,is3,is4,is5;
    is1=is2=is3=is4=is5=0;

    if(n1!="" || n2!="" || n3!="" || n4!="" || n5!=""){
	// if the string option for one or more is used
        // we have to create dummy strings for the rest
	if(n1==""){
	    for(Int_t i = 0; i < i1max; i ++){
		if(i < i1max-1) n1 += Form("%i,",i);
                else            n1 += Form("%i" ,i);
	    }
	}
        if(n2=="" && dim > 1){
	    for(Int_t i = 0; i < i2max; i ++){
		if(i < i2max-1) n2 += Form("%i,",i);
                else            n2 += Form("%i" ,i);
	    }
	}
        if(n3=="" && dim > 2){
	    for(Int_t i = 0; i < i3max; i ++){
		if(i < i3max-1) n3 += Form("%i,",i);
                else            n3 += Form("%i" ,i);
	    }
	}
        if(n4=="" && dim > 3){
	    for(Int_t i = 0; i < i4max; i ++){
		if(i < i4max-1) n4 += Form("%i,",i);
                else            n4 += Form("%i" ,i);
	    }
	}
        if(n5=="" && dim > 4){
	    for(Int_t i = 0; i < i5max; i ++){
		if(i < i5max-1) n5 += Form("%i,",i);
                else            n5 += Form("%i" ,i);
	    }
	}
    }



    TString* ns1 = HTool::parseString(n1,is1,",",kFALSE);
    TString* ns2 = HTool::parseString(n2,is2,",",kFALSE);
    TString* ns3 = HTool::parseString(n3,is3,",",kFALSE);
    TString* ns4 = HTool::parseString(n4,is4,",",kFALSE);
    TString* ns5 = HTool::parseString(n5,is5,",",kFALSE);


    Bool_t useNameArray = kFALSE;

    if(n1 != "" && is1 != i1max)             Error("addHistArray()","Named index String =\"%s\" has not the same size as array index 1 = %i ! Named string will be ignored.",n1.Data(),i1max);
    if(dim > 1 && n2 != "" && is2 != i2max)  Error("addHistArray()","Named index String =\"%s\" has not the same size as array index 2 = %i ! Named string will be ignored.",n2.Data(),i2max);
    if(dim > 2 && n3 != "" && is3 != i3max)  Error("addHistArray()","Named index String =\"%s\" has not the same size as array index 3 = %i ! Named string will be ignored.",n3.Data(),i3max);
    if(dim > 3 && n4 != "" && is4 != i4max)  Error("addHistArray()","Named index String =\"%s\" has not the same size as array index 4 = %i ! Named string will be ignored.",n4.Data(),i4max);
    if(dim > 4 && n5 != "" && is5 != i5max)  Error("addHistArray()","Named index String =\"%s\" has not the same size as array index 5 = %i ! Named string will be ignored.",n5.Data(),i5max);


    if(dim == 1 && is1 != 0
       && is1 == i1max
      ) useNameArray = kTRUE;
    if(dim == 2 && is1 != 0 && is2 != 0
       && is1 == i1max
       && is2 == i2max
      ) useNameArray = kTRUE;
    if(dim == 3 && is1 != 0 && is2 != 0 && is3 != 0
       && is1 == i1max
       && is2 == i2max
       && is3 == i3max
      ) useNameArray = kTRUE;
    if(dim == 4 && is1 != 0 && is2 != 0 && is3 != 0 && is4 != 0
       && is1 == i1max
       && is2 == i2max
       && is3 == i3max
       && is4 == i4max
      ) useNameArray = kTRUE;
    if(dim == 5 && is1 != 0 && is2 != 0 && is3 != 0 && is4 != 0 && is5 != 0
       && is1 == i1max
       && is2 == i2max
       && is3 == i3max
       && is4 == i4max
       && is5 == i5max
      ) useNameArray = kTRUE;



    map<TString,TObjArray>::iterator iter = hM.find(name);
    if( iter == hM.end() ){ // new variable
	TObjArray a(size);

	TH1* h;
	TString current ;
        TString titlenew = title;
        Bool_t doTitle = kFALSE;
        if(title.Contains("%i")) doTitle = kTRUE;

	TString maskS = mask;
        maskS.ReplaceAll("%i","%s");
        TString titleS = title;
        titleS.ReplaceAll("%i","%s");

	for(Int_t i1=0; i1<i1max;i1++){
	    if(dim == 1) {

		if(useNameArray){
		    current = Form(maskS.Data(),ns1[i1].Data());
		    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data());
		} else {
		    current = Form(mask.Data(),i1);
		    if(doTitle) titlenew = Form(title.Data(),i1);
		}

		h = createHist(Type,current,titlenew,nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2,xtitle,ytitle,ztitle);

		if(h == NULL){
		    Error("addHistArray()","hist pointer = NULL for index = %i!",i1);
		    a.Delete();
		    return kFALSE;
		}
		a.Add(h);
	    } else {
		for(Int_t i2=0; i2<i2max;i2++){
		    if(dim == 2) {

			if(useNameArray){
			    current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data());
			    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data());
			} else {
			    current = Form(mask.Data(),i1,i2);
			    if(doTitle) titlenew = Form(title.Data(),i1,i2);
			}

			h = createHist(Type,current,titlenew,nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2,xtitle,ytitle,ztitle);
			if(h == NULL){
			    Error("addHistArray()","hist pointer = NULL for index = %i!",i2);
			    a.Delete();
			    return kFALSE;
			}
			a.Add(h);

		    } else {
			for(Int_t i3=0; i3<i3max;i3++){
			    if(dim == 3) {

				if(useNameArray){
				    current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data());
				    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data());
				} else {
				    current = Form(mask.Data(),i1,i2,i3);
				    if(doTitle) titlenew = Form(title.Data(),i1,i2,i3);
				}

				h = createHist(Type,current,titlenew,nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2,xtitle,ytitle,ztitle);
				if(h == NULL){
				    Error("addHistArray()","hist pointer = NULL for index = %i!",i3);
				    a.Delete();
				    return kFALSE;
				}
				a.Add(h);

			    } else {
				for(Int_t i4=0; i4<i4max;i4++){
				    if(dim == 4) {

					if(useNameArray){
					    current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data());
					    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data());
					} else {
					    current = Form(mask.Data(),i1,i2,i3,i4);
					    if(doTitle) titlenew = Form(title.Data(),i1,i2,i3,i4);
					}

					h = createHist(Type,current,titlenew,nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2,xtitle,ytitle,ztitle);
					if(h == NULL){
					    Error("addHistArray()","hist pointer = NULL for index = %i!",i4);
					    a.Delete();
					    return kFALSE;
					}
					a.Add(h);
				    } else {
					for(Int_t i5=0; i5<i5max;i5++){

					    if(useNameArray){
						current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data(),ns5[i5].Data());
						if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data(),ns5[i5].Data());
					    } else {
						current = Form(mask.Data(),i1,i2,i3,i4,i5);
						if(doTitle) titlenew = Form(title.Data(),i1,i2,i3,i4,i5);
					    }

					    h = createHist(Type,current,titlenew,nbinx,x1,x2,nbiny,y1,y2,nbinz,z1,z2,xtitle,ytitle,ztitle);
					    if(h == NULL){
						Error("addHistArray()","hist pointer = NULL for index = %i!",i5);
						a.Delete();
						return kFALSE;
					    }
					    a.Add(h);
					}
				    }
				}
			    }
			}
		    }
		}
	    }
	}

	TArrayI d(dim);
	if(dim >= 1) d[0] = i1max;
	if(dim >= 2) d[1] = i2max;
	if(dim >= 3) d[2] = i3max;
        if(dim >= 4) d[3] = i4max;
        if(dim >= 5) d[4] = i5max;

	hM    [name] = a;
	hMask [name] = mask;
	hTitle[name] = title;
	hD    [name] = d;
        hDir  [name] = dir;


    } else { // exists already
	Error("addHistArray()","hist with name \"%s\" has been used already!",name.Data());

        if(ns1) delete [] ns1;
        if(ns2) delete [] ns2;
	if(ns3) delete [] ns3;
	if(ns4) delete [] ns4;
	if(ns5) delete [] ns5;

	return kFALSE;
    }

    if(ns1) delete [] ns1;
    if(ns2) delete [] ns2;
    if(ns3) delete [] ns3;
    if(ns4) delete [] ns4;
    if(ns5) delete [] ns5;

    return kTRUE;
}

Bool_t HHistMap::addHistArrayN(TString Type,TString name,TString mask,TString title,
			       Int_t nbinx,Double_t* x,
			       Int_t nbiny,Double_t* y,
			       Int_t nbinz,Double_t* z,
			       TString xtitle,TString ytitle,TString ztitle,
			       TString dir,
			       Int_t i1max,Int_t i2max,Int_t i3max,Int_t i4max,Int_t i5max,
			       TString n1,TString n2,TString n3,TString n4,TString n5
			      )
{


    // add an array of histograms (non const binning). the size of the array and
    // a lable "name" to access the array later has to be specified
    // Type : TH1S,TH1I,TH1F,TH1D,TH2S,TH2I,TH2F,TH2D,TH3S,TH3I,TH3F,TH3D
    // name : lable for the histarray
    // mask : histname format like printf for the give numbers of dimensions : "htest[%i][%i]" (2dim array)
    // title : hist title format like printf for the give numbers of dimensions : "htest[%i][%i]" (2dim array)
    //         or same title for all hists (if %i is not contained in format)
    // hist axis : 1d  Int_t nbinx, pointer to Double_t array x for bins,
    //    	   2d  Int_t nbiny, pointer to Double_t array y for bins,
    //    	   3d  Int_t nbinz, pointer to Double_t array z for bins,
    // axis title  xtitle,ytitle,ztitle
    // dir : output dir
    // i1max to i5max give the size in the dimension
    // the histograms can later be retrieved by get("name",i1,i2....)
    // -1 (default) mean not used
    // TString n1,n2,n3,n4,n5 (default empty) can contain a comma separated
    // list of labels for each dimension (example: i1max=4 ,"MDCI,MDCII,MDCIII,MDCIV" )
    // imax and number of labels have to be be equal. The lable
    // will replace the dimension index (example:  htime1_%i => htime1_0 to htime1_3 will
    // become htime1_MDCI to htime1_MDCIV) in the name and title


    if(i1max < 0) {
	Error("addHistArrayN()","array size < 0!");
	return kFALSE;
    }
    if(name == "") {
	Error("addHistArrayN()","name is empty < 0!");
	return kFALSE;
    }

    Int_t dim = -1;

    if     (i1max >= 0 && i2max <  0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 1;
    else if(i1max >= 0 && i2max >= 0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 2;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max <  0 && i5max <  0  ) dim = 3;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max <  0  ) dim = 4;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max >= 0  ) dim = 5;

    if(dim<0) {
	Error("addHistArrayN()","problem with dimension for hist %s : ind %i %i %i %i %i !",name.Data(),i1max,i2max,i3max,i4max,i5max);
	return kFALSE;
    }

    Int_t size = 0;
    if     (dim == 1) size = i1max;
    else if(dim == 2) size = i1max*i2max;
    else if(dim == 3) size = i1max*i2max*i3max;
    else if(dim == 4) size = i1max*i2max*i3max*i4max;
    else if(dim == 5) size = i1max*i2max*i3max*i4max*i5max;


    Int_t is1,is2,is3,is4,is5;
    is1=is2=is3=is4=is5=0;

    if(n1!="" || n2!="" || n3!="" || n4!="" || n5!=""){
	// if the string option for one or more is used
        // we have to create dummy strings for the rest
	if(n1==""){
	    for(Int_t i = 0; i < i1max; i ++){
		if(i < i1max-1) n1 += Form("%i,",i);
                else            n1 += Form("%i" ,i);
	    }
	}
        if(n2=="" && dim > 1){
	    for(Int_t i = 0; i < i2max; i ++){
		if(i < i2max-1) n2 += Form("%i,",i);
                else            n2 += Form("%i" ,i);
	    }
	}
        if(n3=="" && dim > 2){
	    for(Int_t i = 0; i < i3max; i ++){
		if(i < i3max-1) n3 += Form("%i,",i);
                else            n3 += Form("%i" ,i);
	    }
	}
        if(n4=="" && dim > 3){
	    for(Int_t i = 0; i < i4max; i ++){
		if(i < i4max-1) n4 += Form("%i,",i);
                else            n4 += Form("%i" ,i);
	    }
	}
        if(n5=="" && dim > 4){
	    for(Int_t i = 0; i < i5max; i ++){
		if(i < i5max-1) n5 += Form("%i,",i);
                else            n5 += Form("%i" ,i);
	    }
	}
    }



    TString* ns1 = HTool::parseString(n1,is1,",",kFALSE);
    TString* ns2 = HTool::parseString(n2,is2,",",kFALSE);
    TString* ns3 = HTool::parseString(n3,is3,",",kFALSE);
    TString* ns4 = HTool::parseString(n4,is4,",",kFALSE);
    TString* ns5 = HTool::parseString(n5,is5,",",kFALSE);


    Bool_t useNameArray = kFALSE;

    if(n1 != "" && is1 != i1max)             Error("addHistArrayN()","Named index String =\"%s\" has not the same size as array index 1 = %i ! Named string will be ignored.",n1.Data(),i1max);
    if(dim > 1 && n2 != "" && is2 != i2max)  Error("addHistArrayN()","Named index String =\"%s\" has not the same size as array index 2 = %i ! Named string will be ignored.",n2.Data(),i2max);
    if(dim > 2 && n3 != "" && is3 != i3max)  Error("addHistArrayN()","Named index String =\"%s\" has not the same size as array index 3 = %i ! Named string will be ignored.",n3.Data(),i3max);
    if(dim > 3 && n4 != "" && is4 != i4max)  Error("addHistArrayN()","Named index String =\"%s\" has not the same size as array index 4 = %i ! Named string will be ignored.",n4.Data(),i4max);
    if(dim > 4 && n5 != "" && is5 != i5max)  Error("addHistArrayN()","Named index String =\"%s\" has not the same size as array index 5 = %i ! Named string will be ignored.",n5.Data(),i5max);


    if(dim == 1 && is1 != 0
       && is1 == i1max
      ) useNameArray = kTRUE;
    if(dim == 2 && is1 != 0 && is2 != 0
       && is1 == i1max
       && is2 == i2max
      ) useNameArray = kTRUE;
    if(dim == 3 && is1 != 0 && is2 != 0 && is3 != 0
       && is1 == i1max
       && is2 == i2max
       && is3 == i3max
      ) useNameArray = kTRUE;
    if(dim == 4 && is1 != 0 && is2 != 0 && is3 != 0 && is4 != 0
       && is1 == i1max
       && is2 == i2max
       && is3 == i3max
       && is4 == i4max
      ) useNameArray = kTRUE;
    if(dim == 5 && is1 != 0 && is2 != 0 && is3 != 0 && is4 != 0 && is5 != 0
       && is1 == i1max
       && is2 == i2max
       && is3 == i3max
       && is4 == i4max
       && is5 == i5max
      ) useNameArray = kTRUE;

    map<TString,TObjArray>::iterator iter = hM.find(name);
    if( iter == hM.end() ){ // new variable
	TObjArray a(size);

	TH1* h;
	TString current ;
        TString titlenew = title;
        Bool_t doTitle = kFALSE;
        if(title.Contains("%i")) doTitle = kTRUE;

	TString maskS = mask;
        maskS.ReplaceAll("%i","%s");
        TString titleS = title;
        titleS.ReplaceAll("%i","%s");

	for(Int_t i1=0; i1<i1max;i1++){
	    if(dim == 1) {

		if(useNameArray){
		    current = Form(maskS.Data(),ns1[i1].Data());
		    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data());
		} else {
		    current = Form(mask.Data(),i1);
		    if(doTitle) titlenew = Form(title.Data(),i1);
		}

		h = createHistN(Type,current,titlenew,nbinx,x,nbiny,y,nbinz,z,xtitle,ytitle,ztitle);

		if(h == NULL){
		    Error("addHistArrayN()","hist pointer = NULL for index = %i!",i1);
		    a.Delete();
		    return kFALSE;
		}
		a.Add(h);
	    } else {
		for(Int_t i2=0; i2<i2max;i2++){
		    if(dim == 2) {

			if(useNameArray){
			    current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data());
			    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data());
			} else {
			    current = Form(mask.Data(),i1,i2);
			    if(doTitle) titlenew = Form(title.Data(),i1,i2);
			}

			h = createHistN(Type,current,titlenew,nbinx,x,nbiny,y,nbinz,z,xtitle,ytitle,ztitle);
			if(h == NULL){
			    Error("addHistArrayN()","hist pointer = NULL for index = %i!",i2);
			    a.Delete();
			    return kFALSE;
			}
			a.Add(h);

		    } else {
			for(Int_t i3=0; i3<i3max;i3++){
			    if(dim == 3) {
		     
				if(useNameArray){
				    current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data());
				    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data());
				} else {
				    current = Form(mask.Data(),i1,i2,i3);
				    if(doTitle) titlenew = Form(title.Data(),i1,i2,i3);
				}

				h = createHistN(Type,current,titlenew,nbinx,x,nbiny,y,nbinz,z,xtitle,ytitle,ztitle);
				if(h == NULL){
				    Error("addHistArrayN()","hist pointer = NULL for index = %i!",i3);
				    a.Delete();
				    return kFALSE;
				}
				a.Add(h);

			    } else {
				for(Int_t i4=0; i4<i4max;i4++){
				    if(dim == 4) {

					if(useNameArray){
					    current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data());
					    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data());
					} else {
					    current = Form(mask.Data(),i1,i2,i3,i4);
					    if(doTitle) titlenew = Form(title.Data(),i1,i2,i3,i4);
					}

					h = createHistN(Type,current,titlenew,nbinx,x,nbiny,y,nbinz,z,xtitle,ytitle,ztitle);
					if(h == NULL){
					    Error("addHistArrayN()","hist pointer = NULL for index = %i!",i4);
					    a.Delete();
					    return kFALSE;
					}
					a.Add(h);
				    } else {
					for(Int_t i5=0; i5<i5max;i5++){

					    if(useNameArray){
						current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data(),ns5[i5].Data());
						if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data(),ns5[i5].Data());
					    } else {
						current = Form(mask.Data(),i1,i2,i3,i4,i5);
						if(doTitle) titlenew = Form(title.Data(),i1,i2,i3,i4,i5);
					    }

					    h = createHistN(Type,current,titlenew,nbinx,x,nbiny,y,nbinz,z,xtitle,ytitle,ztitle);
					    if(h == NULL){
						Error("addHistArrayN()","hist pointer = NULL for index = %i!",i5);
						a.Delete();
						return kFALSE;
					    }
					    a.Add(h);
					}
				    }
				}
			    }
			}
		    }
		}
	    }
	}

	TArrayI d(dim);
	if(dim >= 1) d[0] = i1max;
	if(dim >= 2) d[1] = i2max;
	if(dim >= 3) d[2] = i3max;
        if(dim >= 4) d[3] = i4max;
        if(dim >= 5) d[4] = i5max;

	hM    [name] = a;
	hMask [name] = mask;
	hTitle[name] = title;
	hD    [name] = d;
        hDir  [name] = dir;

    } else { // exists already
	Error("addHistArrayN()","hist with name \"%s\" has been used already!",name.Data());

        if(ns1) delete [] ns1;
        if(ns2) delete [] ns2;
	if(ns3) delete [] ns3;
	if(ns4) delete [] ns4;
	if(ns5) delete [] ns5;

	return kFALSE;
    }

    if(ns1) delete [] ns1;
    if(ns2) delete [] ns2;
    if(ns3) delete [] ns3;
    if(ns4) delete [] ns4;
    if(ns5) delete [] ns5;

    return kTRUE;
}

TH1* HHistMap::get(TString name,Int_t i1,Int_t i2,Int_t i3,Int_t i4,Int_t i5)
{
    // get histogram from map. print error and map
    // if not existing. the map has to be set before
    // If the requested object is an array of histograms
    // the index has to specified.


    map<TString,TObjArray>::iterator iter = hM.find(name.Data());
    if( iter != hM.end() ) {
	TArrayI& ar = hD[(*iter).first];
	Int_t s = ar.GetSize();
	Int_t index = 0 ;
	if     (s == 1 && ar.At(0) > 0 ) index = i1;
	else if(s == 2 )                 index = HTool::getLinearIndex(i1,ar.At(0),i2,ar.At(1));
        else if(s == 3 )                 index = HTool::getLinearIndex(i1,ar.At(0),i2,ar.At(1),i3,ar.At(2));
        else if(s == 4 )                 index = HTool::getLinearIndex(i1,ar.At(0),i2,ar.At(1),i3,ar.At(2),i4,ar.At(3));
        else if(s == 5 )                 index = HTool::getLinearIndex(i1,ar.At(0),i2,ar.At(1),i3,ar.At(2),i4,ar.At(3),i5,ar.At(4));


	if(index<0) {
	    if(!fSilentFail)Error("get()","Retrieved NULL pointer for %s , index = ind %i %i %i %i %i !",name.Data(),i1,i2,i3,i4,i5);
            return 0;
	}
	return (TH1*)(*iter).second.At(index) ;
    }
    else {
	if(!fSilentFail) {
	    printMap();
	    Error("get()", "No matching histogram found for name = %s",name.Data());
	}
    }
    return 0;
}

TProfile* HHistMap::getP(TString name,Int_t i1,Int_t i2,Int_t i3,Int_t i4,Int_t i5)
{
    // get Tprofile from map. print error and map
    // if not existing. the map has to be set before
    // If the requested object is an array of histograms
    // the index has to specified.
     return (TProfile*)get(name,i1,i2,i3,i4,i5);
}

TH2* HHistMap::get2(TString name,Int_t i1,Int_t i2,Int_t i3,Int_t i4,Int_t i5)
{
    // get TH2 histogram from map (do not call it on other hist types!).
    // print error and map if not existing. the map has to be set before
    // If the requested object is an array of histograms
    // the index has to specified.
    TH1* h = get(name,i1,i2,i3,i4,i5);
    return (TH2*) h;
}

TProfile2D* HHistMap::get2P(TString name,Int_t i1,Int_t i2,Int_t i3,Int_t i4,Int_t i5)
{
    // get TProfile2D from map (do not call it on other hist types!).
    // print error and map if not existing. the map has to be set before
    // If the requested object is an array of histograms
    // the index has to specified.
    TH1* h = get(name,i1,i2,i3,i4,i5);
    return (TProfile2D*) h;
}

TH3* HHistMap::get3(TString name,Int_t i1,Int_t i2,Int_t i3,Int_t i4,Int_t i5)
{
    // get TH3 histogram from map (do not call it on other hist types!).
    // print error and map if not existing. the map has to be set before
    // If the requested object is an array of histograms
    // the index has to specified.
    TH1* h = get(name,i1,i2,i3,i4,i5);
    return (TH3*) h;
}

TProfile3D* HHistMap::get3P(TString name,Int_t i1,Int_t i2,Int_t i3,Int_t i4,Int_t i5)
{
    // get TProfile3D histogram from map (do not call it on other hist types!).
    // print error and map if not existing. the map has to be set before
    // If the requested object is an array of histograms
    // the index has to specified.
    TH1* h = get(name,i1,i2,i3,i4,i5);
    return (TProfile3D*) h;
}

vector < TString> HHistMap::getMatchingHistLabels(TString expression,TString type,Int_t dim)
{
    // return stl vector of label name matching the expression.
    // if type !="" the hist type is evaluated too.
    // if dim  !=-1 the dimension of the array is evalated in addition.

    TPRegexp filter(expression);
    TString label ;
    TString classname;
    vector <TString> out;
    for(map< TString, TObjArray>::iterator iter = hM.begin(); iter != hM.end(); ++iter ) {
         label =  (*iter).first;
	 if(filter.Match(label)){

	     classname = "unused";
	     classname = (*iter).second.At(0)->ClassName();
	     Int_t dim1 = hD[(*iter).first].GetSize();
	     if(type.CompareTo("") != 0 && classname.CompareTo(type.Data())!=0) continue;
             if(dim != -1 && dim1 != dim)                                       continue;
             out.push_back(label);
	 }
    }
    return out;
}

vector < TH1*> HHistMap::getMatchingHists(TString expression,TString type,Int_t dim)
{
    // return stl vector of TH1*  matching the expression (by histname).
    // if type !="" the hist type is evaluated too.
    // if dim  !=-1 the dimension of the array is evalated in addition.

    TPRegexp filter(expression);
    TString label ;
    TString classname;
    vector <TH1*> out;
    for(map< TString, TObjArray>::iterator iter = hM.begin(); iter != hM.end(); ++iter ) {
	classname = "unused";
	classname = (*iter).second.At(0)->ClassName();
	Int_t dim1 = hD[(*iter).first].GetSize();
	if(type.CompareTo("") != 0 && classname.CompareTo(type.Data())!=0) continue;
	if(dim != -1 && dim1 != dim)                                       continue;

	Int_t size = (*iter).second.GetEntries();
	for(Int_t i=0;i<size;i++){
            TH1* h = ((TH1*)((*iter).second.At(i)));
	    label  = h->GetName();
	    if(filter.Match(label)){
		out.push_back(h);
	    }
	}
    }
    return out;
}


void HHistMap::resetAllHists(TString opt)
{
    // reset available histograms
    for(map< TString, TObjArray>::iterator iter = hM.begin(); iter != hM.end(); ++iter ) {
         resetArray(iter->first, opt);
    }
}
void HHistMap::disconnectAllHists()
{
    // set Directory of available histograms  0
    for(map< TString, TObjArray>::iterator iter = hM.begin(); iter != hM.end(); ++iter ) {
	TObjArray* array = getHistArray(iter->first) ;
	if(array){
	    Int_t n = array->GetSize();  // full size, check for NULL in loop!
	    for(Int_t i = 0 ;i < n; i++) {
		TH1* h = (TH1*)array->At(i);
		if(h) {
		    h->SetDirectory(0);
		}
	    }
	}
    }
}
//--------------------------------------------------------------------
// array operations
Bool_t HHistMap::cloneArray (TString source,TString name,TString mask,TString title,TString dir,Bool_t reset)
{
    // clones the source array to new array "name" with histograms following
    // the naming mask "mask" , title and dir (see addHistArray())
    // the procedure used THXX::Copy() . All features of the source hist
    // and the content will be copied (Not the list of functions!).
    // if reset is kTRUE the new hists will be reset.


    TObjArray* src = HHistMap::getHistArray(source);
    if(src){

	TArrayI* dim = getDimArray(source);
        Int_t nArray =dim->GetSize();
	Int_t max  [5] = {-1,-1,-1,-1,-1};
	Int_t nbins[3] = {0,0,0};

	for(Int_t j = 0 ;j < dim->GetSize(); j++){
	    max[j] = dim->At(j);
	}

        TH1* h = (TH1*)src->At(0);
        TString Type = h->ClassName();

        Int_t ndim = h->GetDimension();

	nbins[0] = h->GetNbinsX();
	if(h->GetNbinsY()>1)  nbins[1] = h->GetNbinsY() ;
        if(h->GetNbinsZ()>1)  nbins[2] = h->GetNbinsZ() ;

	TString xtitle = h->GetXaxis()->GetTitle();
	TString ytitle = "";
	TString ztitle = "";
	if(h->GetYaxis()) ytitle = h->GetYaxis()->GetTitle();
	if(h->GetZaxis()) ztitle = h->GetZaxis()->GetTitle();

	Double_t x1 = 0, x2 = 0;
	Double_t y1 = 0, y2 = 0;
	Double_t z1 = 0, z2 = 0;

        x1 = h->GetXaxis()->GetXmin();
        x2 = h->GetXaxis()->GetXmax();
	if(ndim>1){
	    y1 = h->GetYaxis()->GetXmin();
	    y2 = h->GetYaxis()->GetXmax();
	}
	if(ndim>2){
	    z1 = h->GetZaxis()->GetXmin();
	    z2 = h->GetZaxis()->GetXmax();
	}

	vector<TString> labels;
        TString labelsdim[5];

	if(nArray>=1){

            Bool_t isIndex = kTRUE;
	    for(Int_t i1 = 0; i1 < max[0]; i1++){
                TH1* h = (TH1*)src->At(i1);
                const TString name = h->GetName();
		getLabels(name,labels);
                if(!labels[0].IsDigit()  && labels[0].Atoi()!=i1) isIndex = kFALSE;
		labelsdim[0] += labels[0];
                if(i1!=max[0]-1)labelsdim[0] += ",";
	    }

            if(isIndex)  labelsdim[0] = "";
	}

	if(nArray>=2){
            Bool_t isIndex = kTRUE;
	    for(Int_t i2 = 0; i2 < max[1]; i2++){
		TH1* h = (TH1*)src->At(i2);
		const TString name = h->GetName();
		getLabels(name,labels);
		if(!labels[1].IsDigit()  && labels[1].Atoi()!=i2) isIndex = kFALSE;
		labelsdim[1] += labels[1];
		if(i2!=max[1]-1)labelsdim[1] += ",";
	    }
	    if(isIndex)  labelsdim[1] = "";
	}

	if(nArray>=3){
	    Bool_t isIndex = kTRUE;
	    for(Int_t i3 = 0; i3 < max[2]; i3++){
		TH1* h = (TH1*)src->At(i3);
		const TString name = h->GetName();
		getLabels(name,labels);
		if(!labels[2].IsDigit()  && labels[2].Atoi()!=i3) isIndex = kFALSE;
		labelsdim[2] += labels[2];
		if(i3!=max[2]-1)labelsdim[2] += ",";
	    }
	    if(isIndex)  labelsdim[2] = "";
	}

	if(nArray>=4){
	    Bool_t isIndex = kTRUE;
	    for(Int_t i4 = 0; i4 < max[3]; i4++){
		TH1* h = (TH1*)src->At(i4);
		const TString name = h->GetName();
		getLabels(name,labels);
		if(!labels[3].IsDigit()  && labels[3].Atoi()!=i4) isIndex = kFALSE;
		labelsdim[3] += labels[3];
		if(i4!=max[3]-1)labelsdim[3] += ",";
	    }
            if(isIndex)  labelsdim[3] = "";
	}

	if(nArray==5) {
	    Bool_t isIndex = kTRUE;
	    for(Int_t i5 = 0; i5 < max[4]; i5++){
		TH1* h = (TH1*)src->At(i5);
		const TString name = h->GetName();
		getLabels(name,labels);
		if(!labels[4].IsDigit()  && labels[4].Atoi()!=i5) isIndex = kFALSE;
		labelsdim[4] += labels[4];
		if(i5!=max[4]-1)labelsdim[4] += ",";
	    }
            if(isIndex)  labelsdim[4] = "";
	}

	Bool_t isVariable = h->GetXaxis()->IsVariableBinSize();
	if(!isVariable && ndim > 1){
             isVariable = h->GetYaxis()->IsVariableBinSize();
	     if(!isVariable && ndim > 2){
		 isVariable = h->GetZaxis()->IsVariableBinSize();
	     }
	}

	if(!isVariable){
	    addHistArray(Type,name,mask,title,
			 nbins[0], x1,x2,
			 nbins[1], y1,y2,
			 nbins[2], z1,z2,
			 xtitle,ytitle,ztitle,
			 dir,
			 max[0],max[1],max[2],max[3],max[4],
			 labelsdim[0],labelsdim[1],labelsdim[2],labelsdim[3],labelsdim[4]
			);

	} else {

	    TArrayD* xA = (TArrayD*)h->GetXaxis() -> GetXbins();
            TArrayD* yA = 0;
            TArrayD* zA = 0;
	    if(ndim==2){
		yA =(TArrayD*) h->GetYaxis() -> GetXbins();
	    }
	    if(ndim==3){
		yA = (TArrayD*)h->GetYaxis() -> GetXbins();
		zA = (TArrayD*)h->GetZaxis() -> GetXbins();
	    }

	    addHistArrayN(Type,name,mask,title,
			  nbins[0], xA->GetArray(),
			  nbins[1], yA->GetArray(),
			  nbins[2], zA->GetArray(),
			  xtitle,ytitle,ztitle,
			  dir,
			  max[0],max[1],max[2],max[3],max[4],
			  labelsdim[0],labelsdim[1],labelsdim[2],labelsdim[3],labelsdim[4]
			 );
 
	}

        TObjArray* clone = HHistMap::getHistArray(name);

	if(clone&&src && clone->GetEntries()==src->GetEntries()){
	    // exchange clone hist by src hist copy
	    // (content+graphhic features. list of functions is not copied!)

	    for(Int_t i=0;i<src->GetEntries();i++){

                   TH1* hsrc     = (TH1*)src->At(i);
		   TH1* hclone   = (TH1*)clone->At(i);

		   TString name  = hclone->GetName();
		   TString title = hclone->GetTitle();

 		   if     (Type == "TH1S")  ((TH1S*)hsrc)->Copy(*hclone);
		   else if(Type == "TH1I")  ((TH1I*)hsrc)->Copy(*hclone);
		   else if(Type == "TH1F")  ((TH1F*)hsrc)->Copy(*hclone);
		   else if(Type == "TH1D")  ((TH1D*)hsrc)->Copy(*hclone);
		   else if(Type == "TH2S")  ((TH2S*)hsrc)->Copy(*hclone);
		   else if(Type == "TH2I")  ((TH2I*)hsrc)->Copy(*hclone);
		   else if(Type == "TH2F")  ((TH2F*)hsrc)->Copy(*hclone);
		   else if(Type == "TH2D")  ((TH2D*)hsrc)->Copy(*hclone);
		   else if(Type == "TH3S")  ((TH3S*)hsrc)->Copy(*hclone);
		   else if(Type == "TH3I")  ((TH3I*)hsrc)->Copy(*hclone);
		   else if(Type == "TH3F")  ((TH3F*)hsrc)->Copy(*hclone);
		   else if(Type == "TH3D")  ((TH3D*)hsrc)->Copy(*hclone);
		   else {
                      Error("cloneArray()","Unknown type %s!",Type.Data());
		   }

                   hclone->SetName(name.Data());
		   hclone->SetTitle(title.Data());

                   if(reset)hclone->Reset();
	    }

	} else {
           Error("cloneArray()","clone array and source array do not have the same size!");
           return kFALSE;
	}

    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::resetArray(TString name    , TString opt)
{
    // reset array of histograms
    TObjArray* ar = getHistArray(name);
    return resetArray(ar,opt);
}


Bool_t HHistMap::resetArray(TObjArray* array, TString opt)
{
    // reset array of histograms
    if(array){
	Int_t n = array->GetSize();  // full size, check for NULL in loop!
	for(Int_t i = 0 ;i < n; i++) {
	    TH1* h = (TH1*)array->At(i);
	    if(h) {
		h->Reset(opt);
	    }
	}
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::scaleArray(TString name    , Double_t fact)
{
    // scale array of histograms by factor fact
    TObjArray* ar = getHistArray(name);
    return scaleArray(ar,fact);
}


Bool_t HHistMap::scaleArray(TObjArray* array, Double_t fact)
{
    // scale array of histograms by factor fact
    if(array){
	Int_t n = array->GetSize();  // full size, check for NULL in loop!
	for(Int_t i = 0 ;i < n; i++) {
	    TH1* h = (TH1*)array->At(i);
	    if(h) h->Scale(fact);
	}
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::sumW2Array(TString name )
{
    // call sumW2 for an array of histograms
    TObjArray* ar = getHistArray(name);
    return sumW2Array(ar);
}


Bool_t HHistMap::sumW2Array(TObjArray* array)
{
    // call sumW2 for an array of histograms
    if(array){
	Int_t n = array->GetSize();  // full size, check for NULL in loop!
	for(Int_t i = 0 ;i < n; i++) {
	    TH1* h = (TH1*)array->At(i);
	    if(h) h->Sumw2();
	}
    } else {
	return kFALSE;
    }

    return kTRUE;
}


Bool_t HHistMap::divideArray(TString name1,TString name2, Double_t fact1, Double_t fact2,TString opt)
{
    // divide two arrays of histograms (synthax see
    // TH1::Divide(TH1*,TH2* ,Double _t fact1,Double _t fact2,TString opt))
    // hist1 will be modified

    TObjArray* ar1 = getHistArray(name1);
    TObjArray* ar2 = getHistArray(name2);

    if(ar1 && ar2) {
       return  divideArray(ar1,ar2,fact1,fact2,opt);
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::divideArray(TString name0, TString name1,TString name2, Double_t fact1, Double_t fact2,TString opt)
{
    // divide two arrays of histograms (syntax see
    // TH1::Divide(TH1*,TH2* ,Double _t fact1,Double _t fact2,TString opt))
    // and store the result in a new histogram
    // hist0 will be modified

    TObjArray* ar0 = getHistArray(name0);
    TObjArray* ar1 = getHistArray(name1);
    TObjArray* ar2 = getHistArray(name2);

    if(ar0 && ar1 && ar2) {
       return  divideArray(ar0,ar1,ar2,fact1,fact2,opt);
    } else {
	return kFALSE;
    }

    return kTRUE;
}
Bool_t HHistMap::divideArray(TObjArray* array1,TObjArray* array2, Double_t fact1, Double_t fact2,TString opt)
{
    // divide two arrays of histograms (syntax see
    // TH1::Divide(TH1*,TH2* ,Double _t fact1,Double _t fact2,TString opt))

    if(array1 && array2){
	Int_t n1 = array1->GetSize();  // full size, check for NULL in loop!
	Int_t n2 = array2->GetSize();  // full size, check for NULL in loop!

        if(n1 != n2) return kFALSE;

	for(Int_t i = 0 ;i < n1; i++) {
	    TH1* h1 = (TH1*)array1->At(i);
            TH1* h2 = (TH1*)array2->At(i);

	    if(h1 && h2) h1->Divide(h1,h2,fact1,fact2,opt);
	}
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::divideArray(TObjArray* array0,TObjArray* array1,TObjArray* array2, Double_t fact1, Double_t fact2,TString opt)
{
    // divide two arrays of histograms (syntax see
    // TH1::Divide(TH1*,TH2* ,Double _t fact1,Double _t fact2,TString opt))
    // and store the result in a new hist (hist0)
    if(array0 && array1 && array2){

	Int_t n0 = array0->GetSize();  // full size, check for NULL in loop!
	Int_t n1 = array1->GetSize();  // full size, check for NULL in loop!
	Int_t n2 = array2->GetSize();  // full size, check for NULL in loop!

        if(n0 != n1 || n1 != n2) return kFALSE;

	for(Int_t i = 0 ;i < n1; i++) {
	    TH1* h0 = (TH1*)array0->At(i);
 	    TH1* h1 = (TH1*)array1->At(i);
            TH1* h2 = (TH1*)array2->At(i);
	    if(h0 && h1 && h2) h0->Divide(h1,h2,fact1,fact2,opt);
	}
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::multiplyArray(TString name1    ,TString name2    , Double_t fact1, Double_t fact2,TString opt)
{
    // multiply two arrays of histograms (synthax see
    // TH1::Multiply(TH1*,TH2* ,Double _t fact1,Double _t fact2,TString opt))

    TObjArray* ar1 = getHistArray(name1);
    TObjArray* ar2 = getHistArray(name2);

    if(ar1 && ar2) {
       return  multiplyArray(ar1,ar2,fact1,fact2,opt);
    } else {
	return kFALSE;
    }

    return kTRUE;
}
Bool_t HHistMap::multiplyArray(TString name0,TString name1,TString name2, Double_t fact1, Double_t fact2,TString opt)
{
    // multiply two arrays of histograms (synthax see
    // TH1::Multiply(TH1*,TH2* ,Double _t fact1,Double _t fact2,TString opt))
    // and store reult in a new histogram (hist0)
    TObjArray* ar0 = getHistArray(name0);
    TObjArray* ar1 = getHistArray(name1);
    TObjArray* ar2 = getHistArray(name2);

    if(ar0 && ar1 && ar2) {
       return  multiplyArray(ar0,ar1,ar2,fact1,fact2,opt);
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::multiplyArray(TObjArray* array1,TObjArray* array2, Double_t fact1, Double_t fact2,TString opt)
{
    // divide two arrays of histograms (synthax see
    // TH1::Multiply(TH1*,TH2* ,Double _t fact1,Double _t fact2,TString opt))

    if(array1 && array2){
	Int_t n1 = array1->GetSize();  // full size, check for NULL in loop!
	Int_t n2 = array2->GetSize();  // full size, check for NULL in loop!

        if(n1 != n2) return kFALSE;

	for(Int_t i = 0 ;i < n1; i++) {
	    TH1* h1 = (TH1*)array1->At(i);
            TH1* h2 = (TH1*)array2->At(i);

	    if(h1 && h2) h1->Multiply(h1,h2,fact1,fact2,opt);
	}
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::multiplyArray(TObjArray* array0,TObjArray* array1,TObjArray* array2, Double_t fact1, Double_t fact2,TString opt)
{
    // divide two arrays of histograms (synthax see
    // TH1::Multiply(TH1*,TH1* ,Double _t fact1,Double _t fact2,TString opt))
    // and stiore result in a new histogram (hist0)
    if(array0 && array1 && array2){
	Int_t n0 = array0->GetSize();  // full size, check for NULL in loop!
	Int_t n1 = array1->GetSize();  // full size, check for NULL in loop!
	Int_t n2 = array2->GetSize();  // full size, check for NULL in loop!

        if(n0 != n1 || n1 != n2) return kFALSE;

	for(Int_t i = 0 ;i < n1; i++) {
	    TH1* h0 = (TH1*)array0->At(i);
	    TH1* h1 = (TH1*)array1->At(i);
            TH1* h2 = (TH1*)array2->At(i);
	    if(h0 && h1 && h2) h0->Multiply(h1,h2,fact1,fact2,opt);
	}
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::addArray(TString name1,TString name2, Double_t fact1, Double_t fact2,TString opt)
{
    // add two arrays of histograms (syntax see
    // TH1::Add(TH1*,TH1* ,Double _t fact1,Double _t fact2,TString opt))

    TObjArray* ar1 = getHistArray(name1);
    TObjArray* ar2 = getHistArray(name2);

    if(ar1 && ar2) {
       return  addArray(ar1,ar2,fact1,fact2);
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::addArray(TString name0,TString name1,TString name2, Double_t fact1, Double_t fact2,TString opt)
{
    // add two arrays of histograms (syntax see
    // TH1::Add(TH1*,TH1* ,Double _t fact1,Double _t fact2,TString opt))
    // and store the result in a new histogram (hist0)
    TObjArray* ar0 = getHistArray(name0);
    TObjArray* ar1 = getHistArray(name1);
    TObjArray* ar2 = getHistArray(name2);

    if(ar0 && ar1 && ar2) {
       return  addArray(ar0,ar1,ar2,fact1,fact2);
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::addArray(TObjArray* array1,TObjArray* array2, Double_t fact1, Double_t fact2,TString opt)
{
    // add two arrays of histograms (syntax see
    // TH1::Add(TH1*,TH1* ,Double _t fact1,Double _t fact2,TString opt))

    if(array1 && array2){
	Int_t n1 = array1->GetSize();  // full size, check for NULL in loop!
	Int_t n2 = array2->GetSize();  // full size, check for NULL in loop!

        if(n1 != n2) return kFALSE;

	for(Int_t i = 0 ;i < n1; i++) {
	    TH1* h1 = (TH1*)array1->At(i);
            TH1* h2 = (TH1*)array2->At(i);

	    if(h1 && h2) h1->Add(h1,h2,fact1,fact2);
	}
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::addArray(TObjArray* array0,TObjArray* array1,TObjArray* array2, Double_t fact1, Double_t fact2,TString opt)
{
    // add two arrays of histograms (syntax see
    // TH1::Add(TH1*,TH1* ,Double _t fact1,Double _t fact2,TString opt))
    // and store the reult in a new histogram (hist0)
    if(array0 && array1 && array2){
	Int_t n0 = array0->GetSize();  // full size, check for NULL in loop!
	Int_t n1 = array1->GetSize();  // full size, check for NULL in loop!
	Int_t n2 = array2->GetSize();  // full size, check for NULL in loop!

        if(n0 != n1 || n1 != n2) return kFALSE;

	for(Int_t i = 0 ;i < n1; i++) {
	    TH1* h0 = (TH1*)array0->At(i);
	    TH1* h1 = (TH1*)array1->At(i);
            TH1* h2 = (TH1*)array2->At(i);

	    if(h0 && h1 && h2) h0->Add(h1,h2,fact1,fact2);
	}
    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::functionArray(TString name    ,
			       Bool_t (*function)(TH1* ,TString name,HHistMap* map,TObjArray* params),
			       TObjArray* params)
{
    // execute function for each histogram of the array. TObjArray* params can be used
    // to pass parameters to the funcion

    TObjArray* ar = getHistArray(name);

    if(ar) {
	Int_t n = ar->GetSize();  // full size, check for NULL in loop!

	for(Int_t i = 0 ;i < n; i++) {
	    TH1* h = (TH1*)ar->At(i);
	    if(h) {
		function(h,name,this,params);
	    }
	}

    } else {
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HHistMap::functionArray(TObjArray* array,
			       Bool_t (*function)(TH1* ,TObjArray* array,TObjArray* params),
			       TObjArray* params)
{
    // execute function for each histogram of the array. TObjArray* params can be used
    // to pass parameters to the funcion

    if(array){
	Int_t n = array->GetSize();  // full size, check for NULL in loop!

	for(Int_t i = 0 ;i < n; i++) {
	    TH1* h = (TH1*)array->At(i);
	    if(h)  function(h,array,params);
	}

    } else {
      return kFALSE;
    }
    return kTRUE;
}
//--------------------------------------------------------------------




TObjArray* HHistMap::getHistArray(TString name)
{
    // get histogram array from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TObjArray>::iterator iter = hM.find(name.Data());
    if( iter != hM.end() ) {
	return &(*iter).second ;
    }
    else {
	if(!fSilentFail) {
	    printMap();
	    Error("getHistArray()", "No matching histogram found for name = %s",name.Data());
	}
    }
    return 0;
}

TArrayI* HHistMap::getDimArray(TString name)
{
    // get histogram dim array from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TArrayI>::iterator iter = hD.find(name.Data());
    if( iter != hD.end() ) {
	return &(*iter).second ;
    }
    else {
	if(!fSilentFail){
	    printMap();
	    Error("getDimArray()", "No matching histogram found for name = %s",name.Data());
	}
    }
    return 0;
}

TString HHistMap::getDir(TString name)
{
    // get histogram dir from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TString>::iterator iter = hDir.find(name.Data());
    if( iter != hDir.end() ) {
	return (*iter).second ;
    }
    else {
	if(!fSilentFail) {
	    printMap();
	    Error("getDir()", "No matching histogram found for name = %s",name.Data());
	}
    }
    TString dummy="" ;
    return dummy;
}

TString HHistMap::getMask(TString name)
{
    // get histogram mask from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TString>::iterator iter = hMask.find(name.Data());
    if( iter != hMask.end() ) {
	return (*iter).second ;
    }
    else {
	if(!fSilentFail){
	    printMap();
	    Error("getMask()", "No matching histogram found for name = %s",name.Data());
	}
    }

    TString dummy="" ;
    return dummy;
}

TString HHistMap::getTitle(TString name)
{
    // get histogram title from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TString>::iterator iter = hTitle.find(name.Data());
    if( iter != hTitle.end() ) {
	return (*iter).second ;
    }
    else {
	if(!fSilentFail) {
	    printMap();
	    Error("getTitle()", "No matching histogram found for name = %s",name.Data());
	}
    }
    TString dummy="" ;
    return dummy;
}


TArrayI* HHistMap::getDimAddress(TString name,TH1*h)
{
    // return multi dim coordinates for histogram
    // user has to delete the TArrayI

    if(!h) return NULL;

    TObjArray* ar = getHistArray(name);

    if(ar ) {

	TArrayI* dim = getDimArray(name);
	Int_t max[5] = {0,0,0,0,0};

	for(Int_t j = 0 ;j < dim->GetSize(); j++){
	    max[j] = dim->At(j);
	}
	Int_t index = ar->IndexOf((TObject*)h);

	Int_t x[5] = {-1,-1,-1,-1,-1};

	HTool::getDimIndex(index,x[0],x[1],x[2],x[3],x[4],max[0],max[1],max[2],max[3],max[4]);

	return  new TArrayI(dim->GetSize(),&x[0]);

    } else {
	return NULL;
    }
}

TArrayI* HHistMap::getDimAddress(TString name,TString histname)
{
    // return multi dim coordinates for histogram
    // user has to delete the TArrayI

    TObjArray* ar = getHistArray(name);

    if(ar ) {

	TArrayI* dim = getDimArray(name);
	Int_t max[5] = {0,0,0,0,0};

	for(Int_t j = 0 ;j < dim->GetSize(); j++){
	    max[j] = dim->At(j);
	}

	TObject* h = ar->FindObject(name.Data());

	if(h) {
	    Int_t index = ar->IndexOf(h);

	    Int_t x[5] = {-1,-1,-1,-1,-1};

	    HTool::getDimIndex(index,x[0],x[1],x[2],x[3],x[4],max[0],max[1],max[2],max[3],max[4]);

	    return  new TArrayI(dim->GetSize(),&x[0]);
	} else {
	    return NULL;
	}

    } else {
	return NULL;
    }
}

Int_t    HHistMap::getIndex     (TString name,TH1*h)
{
    // return index in linear array for histogram
    // -1 if not found

    TObjArray* ar = getHistArray(name);

    if(ar ) {
	return ar->IndexOf((TObject*)h);
    } else {
	return -1;
    }
}

Int_t    HHistMap::getIndex     (TString name,TString histname)
{
    // return index in linear array for histogram
    // -1 if not found

    TObjArray* ar = getHistArray(name);

    if(ar ) {
        TObject* h = ar->FindObject(name.Data());
	return ar->IndexOf(h);
    } else {
	return -1;
    }
}


//------------------------------------------------------------------------
// canvas
Bool_t HHistMap::addCanvas(TCanvas* c ,
			   Int_t nx,Int_t ny,
			   Int_t xpix,Int_t ypix,
			   TString dir){

    // add a single canvas
    // nx,ny pads in x and y
    if(!c) {
	Error("addCanvas()","canvas pointer = NULL!");
	return kFALSE;
    }
    TString name = c->GetName();

    map<TString,TObjArray>::iterator iter = hMC.find(name);
    if( iter == hMC.end() ){ // new variable
	TObjArray a;
	a.Add(c);
	TArrayI dim(1);

	if ((nx >  1 && ny <= 0) ||
	    (nx < 1) || (ny < 0)
	   ){
	    Error("addCanvas()","canvas npads inconsistent : nx = %i, ny = %i for canvas %s! Will not make subdivisions."
		  ,nx,ny,name.Data());
	}

	TArrayI  np(4);
	np.SetAt(nx  ,0);
        np.SetAt(ny  ,1);
        np.SetAt(xpix,2);
        np.SetAt(ypix,3);

	dim.Reset(0);  // no array
	hMC    [name] = a;
	hMaskC [name] = name;
	hTitleC[name] = c->GetTitle();;
	hDC    [name] = dim;
	hNpC   [name] = np;
	hDirC  [name] = dir;

    } else { // exists already
	Error("addCanvas()","canvas with name \"%s\" has been used already!",name.Data());
	return kFALSE;
    }
    return kTRUE;
}


Bool_t HHistMap::addCanvas(TString name,TString title,
			   Int_t nx,Int_t ny,
			   Int_t xpix,Int_t ypix,
			   TString dir)
{
    // add an canvas.
    // name : canvas name
    // title : canvas title
    // xpix,ypix :x and y size of canvas in pixels (default 500)
    // dir : output dir

    TCanvas* c = new TCanvas(name,title,xpix,ypix);

    if(c == NULL) {
	return kFALSE;
    }

    map<TString,TObjArray>::iterator iter = hMC.find(name);
    if( iter == hMC.end() ){ // new variable
	TObjArray a;
	a.Add(c);
	TArrayI dim(1);
	dim.Reset(0);  // no array

	TArrayI  np(4);
	np.SetAt(nx  ,0);
        np.SetAt(ny  ,1);
        np.SetAt(xpix,2);
        np.SetAt(ypix,3);

        if       (nx >  1 && ny >  0) c->Divide(nx,ny);
	else if ((nx >  1 && ny <= 0) ||
                 (nx < 1) || (ny < 0)
		){
	    Error("addCanvas()","canvas npads inconsistent : nx = %i, ny = %i for canvas %s! Will not make subdivisions."
		  ,nx,ny,name.Data());
	}

	hMC    [name] = a;
	hMaskC [name] = name;
	hTitleC[name] = title;
	hDC    [name] = dim;
	hNpC   [name] = np;
	hDirC  [name] = dir;

    } else { // exists already
	Error("addCanvas()","canvas with name \"%s\" has been used already!",name.Data());
	delete c;
	return kFALSE;
    }
    return kTRUE;
}

Bool_t HHistMap::removeCanvas(TString name)
{
    // remove a canvas/canvas array

    map<TString,TObjArray>::iterator iter = hMC.find(name);
    if( iter == hMC.end() ){ // new variable
	Error("removeCanvas()","canvas with name \"%s\" not found!",name.Data());
        return kFALSE;
    } else { // exists
        // canvas
	iter->second.Delete();
	hMC.erase( iter );
        // mask,title,dir
	map<TString,TString>::iterator iter2 = hMaskC.find(name);
	hMaskC.erase( iter2 );
        iter2 = hTitle.find(name);
	hTitleC.erase( iter2 );
	iter2 = hDirC.find(name);
	hDirC.erase( iter2 );
        // dim array
	map<TString,TArrayI>::iterator iter3 = hDC.find(name);
        Int_t dim = iter3->second.GetSize();
        TArrayI& ar = iter3->second;
        // dynamic pointers
	if(dim == 1){
            map<TString,TCanvas**>::iterator iter4 = hDim1C.find(name);
	    if(iter4 != hDim1C.end()) deleteDim1(iter4->second,ar.At(0),kFALSE);
	} else if(dim == 2){
            map<TString,TCanvas***>::iterator iter4 = hDim2C.find(name);
	    if(iter4 != hDim2C.end()) deleteDim2(iter4->second,ar.At(0),ar.At(1),kFALSE);
	} else if(dim == 3){
            map<TString,TCanvas****>::iterator iter4 = hDim3C.find(name);
	    if(iter4 != hDim3C.end()) deleteDim3(iter4->second,ar.At(0),ar.At(1),ar.At(2),kFALSE);
	} else if(dim == 4){
            map<TString,TCanvas*****>::iterator iter4 = hDim4C.find(name);
	    if(iter4 != hDim4C.end()) deleteDim4(iter4->second,ar.At(0),ar.At(1),ar.At(2),ar.At(3),kFALSE);
	} else if(dim == 5){
            map<TString,TCanvas******>::iterator iter4 = hDim5C.find(name);
	    if(iter4 != hDim5C.end()) deleteDim5(iter4->second,ar.At(0),ar.At(1),ar.At(2),ar.At(3),ar.At(4),kFALSE);
	}
	hDC.erase( iter3 );
    }
    return kTRUE;
}

Bool_t HHistMap::addCanvasArray(TCanvas* c[],TString name,TString mask,TString title,
				Int_t nx,Int_t ny,
				Int_t xpix,Int_t ypix,
				TString dir,
				Int_t i1max,Int_t i2max,Int_t i3max,Int_t i4max,Int_t i5max)
{
    // add an array of canvas. the size of the array and
    // a lable "name" to access the array later has to be specified
    // mask  : printf format string for canvas names (needed for config file)
    // title : printf format string for canvas titles (needed for config file)
    // dir   : dir in otput file
    // Only 1-dim arrays are supported. For more dimensional histogram
    // arrays (up to 5 indices) one should use linearized versions
    // using index made by HTool::getLinearIndex(....)
    // i1max to i5max give the size in the dimension
    // the histograms can later be retrieved by get("name",i1,i2....)


    if(!c[0]) {
	Error("addCanvasArray()","canvas pointer = NULL!");
	return kFALSE;
    }
    if(i1max < 0) {
	Error("addCanvasArray()","array size < 0!");
	return kFALSE;
    }
    if(name == "") {
	Error("addCanvasArray()","name is empty < 0!");
	return kFALSE;
    }

    Int_t dim = -1;

    if     (i1max >= 0 && i2max <  0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 1;
    else if(i1max >= 0 && i2max >= 0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 2;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max <  0 && i5max <  0  ) dim = 3;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max <  0  ) dim = 4;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max >= 0  ) dim = 5;

    if(dim<0) {
	Error("addCanvasArray()","problem with dimension for hist %s : ind %i %i %i %i %i !",name.Data(),i1max,i2max,i3max,i4max,i5max);
	return kFALSE;
    }

    Int_t size = 0;
    if     (dim == 1) size = i1max;
    else if(dim == 2) size = i1max*i2max;
    else if(dim == 3) size = i1max*i2max*i3max;
    else if(dim == 4) size = i1max*i2max*i3max*i4max;
    else if(dim == 5) size = i1max*i2max*i3max*i4max*i5max;

    map<TString,TObjArray>::iterator iter = hMC.find(name);
    if( iter == hMC.end() ){ // new variable
	TObjArray a(size);

	for(Int_t i=0;i<size;i++) {
	    if(!c[i]){
		Error("addCanvasArray()","canvas pointer = NULL for index = %i!",i);
	    }
	    a.Add(c[i]);
	}
	TArrayI d(dim);
        if(dim >= 1) d[0] = i1max;
        if(dim >= 2) d[1] = i2max;
        if(dim >= 3) d[2] = i3max;
        if(dim >= 4) d[3] = i4max;
        if(dim >= 5) d[4] = i5max;

	if ((nx >  1 && ny <= 0) ||
	    (nx < 1) || (ny < 0)
	   ){
	    Error("addCanvasArray()","canvas npads inconsistent : nx = %i, ny = %i for canvas %s! Will not make subdivisions."
		  ,nx,ny,name.Data());
	}

	TArrayI  np(4);
	np.SetAt(nx  ,0);
        np.SetAt(ny  ,1);
        np.SetAt(xpix,2);
        np.SetAt(ypix,3);

	hMC    [name] = a;
	hMaskC [name] = mask;
	hTitleC[name] = title;
	hDC    [name] = d;
	hNpC   [name] = np;
        hDirC  [name] = dir;

    } else { // exists already
	Error("addCanvasArray()","canvas with name \"%s\" has been used already!",name.Data());
	return kFALSE;
    }
    return kTRUE;
}
Bool_t HHistMap::addCanvasArray(TString name,TString mask,TString title,
                                Int_t nx,Int_t ny,
				Int_t xpix,Int_t ypix,
				TString dir,
				Int_t i1max,Int_t i2max,Int_t i3max,Int_t i4max,Int_t i5max,
				TString n1,TString n2,TString n3,TString n4,TString n5
			       )
{
    // add an array of canvas. the size of the array and
    // a lable "name" to access the array later has to be specified
    // name : lable for the canvas array
    // mask : canvas name format like printf for the give numbers of dimensions : "ctest[%i][%i]" (2dim array)
    // title : canvas title format like printf for the give numbers of dimensions : "ctest[%i][%i]" (2dim array)
    //         or same title for all canvas (if %i is not contained in format)
    // xpix,ypix : canvas size in pixels (default 500)
    // dir : output dir
    // i1max to i5max give the size in the dimension
    // the canvases can later be retrieved by getCanvas("name",i1,i2....)
    // -1 (default) mean not used
    // TString n1,n2,n3,n4,n5 (default empty) can contain a comma separated
    // list of labels for each dimension (example: i1max=4 ,"MDCI,MDCII,MDCIII,MDCIV" )
    // imax and number of labels have to be be equal. The lable
    // will replace the dimension index (example:  ctime1_%i => ctime1_0 to ctime1_3 will
    // become ctime1_MDCI to ctime1_MDCIV) in the name and title


    if(i1max < 0) {
	Error("addCanvasArray()","array size < 0!");
	return kFALSE;
    }
    if(name == "") {
	Error("addCanvasArray()","name is empty < 0!");
	return kFALSE;
    }

    Int_t dim = -1;

    if     (i1max >= 0 && i2max <  0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 1;
    else if(i1max >= 0 && i2max >= 0 && i3max <  0 && i4max <  0 && i5max <  0  ) dim = 2;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max <  0 && i5max <  0  ) dim = 3;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max <  0  ) dim = 4;
    else if(i1max >= 0 && i2max >= 0 && i3max >= 0 && i4max >= 0 && i5max >= 0  ) dim = 5;

    if(dim<0) {
	Error("addCanvasArray()","problem with dimension for canvas %s : ind %i %i %i %i %i !",name.Data(),i1max,i2max,i3max,i4max,i5max);
	return kFALSE;
    }

    Int_t size = 0;
    if     (dim == 1) size = i1max;
    else if(dim == 2) size = i1max*i2max;
    else if(dim == 3) size = i1max*i2max*i3max;
    else if(dim == 4) size = i1max*i2max*i3max*i4max;
    else if(dim == 5) size = i1max*i2max*i3max*i4max*i5max;

    Int_t is1,is2,is3,is4,is5;
    is1=is2=is3=is4=is5=0;

    if(n1!="" || n2!="" || n3!="" || n4!="" || n5!=""){
	// if the string option for one or more is used
        // we have to create dummy strings for the rest
	if(n1==""){
	    for(Int_t i = 0; i < i1max; i ++){
		if(i < i1max-1) n1 += Form("%i,",i);
                else            n1 += Form("%i" ,i);
	    }
	}
        if(n2=="" && dim > 1){
	    for(Int_t i = 0; i < i2max; i ++){
		if(i < i2max-1) n2 += Form("%i,",i);
                else            n2 += Form("%i" ,i);
	    }
	}
        if(n3=="" && dim > 2){
	    for(Int_t i = 0; i < i3max; i ++){
		if(i < i3max-1) n3 += Form("%i,",i);
                else            n3 += Form("%i" ,i);
	    }
	}
        if(n4=="" && dim > 3){
	    for(Int_t i = 0; i < i4max; i ++){
		if(i < i4max-1) n4 += Form("%i,",i);
                else            n4 += Form("%i" ,i);
	    }
	}
        if(n5=="" && dim > 4){
	    for(Int_t i = 0; i < i5max; i ++){
		if(i < i5max-1) n5 += Form("%i,",i);
                else            n5 += Form("%i" ,i);
	    }
	}
    }



    TString* ns1 = HTool::parseString(n1,is1,",",kFALSE);
    TString* ns2 = HTool::parseString(n2,is2,",",kFALSE);
    TString* ns3 = HTool::parseString(n3,is3,",",kFALSE);
    TString* ns4 = HTool::parseString(n4,is4,",",kFALSE);
    TString* ns5 = HTool::parseString(n5,is5,",",kFALSE);


    Bool_t useNameArray = kFALSE;

    if(n1 != "" && is1 != i1max)             Error("addCanvasArray()","Named index String =\"%s\" has not the same size as array index 1 = %i ! Named string will be ignored.",n1.Data(),i1max);
    if(dim > 1 && n2 != "" && is2 != i2max)  Error("addCanvasArray()","Named index String =\"%s\" has not the same size as array index 2 = %i ! Named string will be ignored.",n2.Data(),i2max);
    if(dim > 2 && n3 != "" && is3 != i3max)  Error("addCanvasArray()","Named index String =\"%s\" has not the same size as array index 3 = %i ! Named string will be ignored.",n3.Data(),i3max);
    if(dim > 3 && n4 != "" && is4 != i4max)  Error("addCanvasArray()","Named index String =\"%s\" has not the same size as array index 4 = %i ! Named string will be ignored.",n4.Data(),i4max);
    if(dim > 4 && n5 != "" && is5 != i5max)  Error("addCanvasArray()","Named index String =\"%s\" has not the same size as array index 5 = %i ! Named string will be ignored.",n5.Data(),i5max);

    if(dim == 1 && is1 != 0
       && is1 == i1max
      ) useNameArray = kTRUE;
    if(dim == 2 && is1 != 0 && is2 != 0
       && is1 == i1max
       && is2 == i2max
      ) useNameArray = kTRUE;
    if(dim == 3 && is1 != 0 && is2 != 0 && is3 != 0
       && is1 == i1max
       && is2 == i2max
       && is3 == i3max
      ) useNameArray = kTRUE;
    if(dim == 4 && is1 != 0 && is2 != 0 && is3 != 0 && is4 != 0
       && is1 == i1max
       && is2 == i2max
       && is3 == i3max
       && is4 == i4max
      ) useNameArray = kTRUE;
    if(dim == 5 && is1 != 0 && is2 != 0 && is3 != 0 && is4 != 0 && is5 != 0
       && is1 == i1max
       && is2 == i2max
       && is3 == i3max
       && is4 == i4max
       && is5 == i5max
      ) useNameArray = kTRUE;

    map<TString,TObjArray>::iterator iter = hMC.find(name);
    if( iter == hMC.end() ){ // new variable
	TObjArray a(size);

	TCanvas* c;
	TString current ;
	TString titlenew = title;
	Bool_t doTitle = kFALSE;
	if(title.Contains("%i")) doTitle = kTRUE;

	TString maskS = mask;
        maskS.ReplaceAll("%i","%s");
        TString titleS = title;
        titleS.ReplaceAll("%i","%s");

	for(Int_t i1=0; i1<i1max;i1++){
	    if(dim == 1) {

		if(useNameArray){
		    current = Form(maskS.Data(),ns1[i1].Data());
		    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data());
		} else {
		    current = Form(mask.Data(),i1);
		    if(doTitle) titlenew = Form(title.Data(),i1);
		}

		c = new TCanvas(current,titlenew,xpix,ypix);

		if       (nx >  1 && ny >  0) c->Divide(nx,ny);
		else if ((nx >  1 && ny <= 0) ||
			 (nx < 1) || (ny < 0)
			){
		    Error("addCanvasArray()","canvas npads inconsistent : nx = %i, ny = %i for canvas %s! Will not make subdivisions."
			  ,nx,ny,name.Data());
		}

		if(c == NULL){
		    Error("addCanvasArray()","canvas pointer = NULL for index = %i!",i1);
		    a.Delete();
		    return kFALSE;
		}
		a.Add(c);
	    } else {
		for(Int_t i2=0; i2<i2max;i2++){
		    if(dim == 2) {

			if(useNameArray){
			    current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data());
			    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data());
			} else {
			    current = Form(mask.Data(),i1,i2);
			    if(doTitle) titlenew = Form(title.Data(),i1,i2);
			}

			c = new TCanvas(current,titlenew,xpix,ypix);

			if       (nx >  1 && ny >  0) c->Divide(nx,ny);
			else if ((nx >  1 && ny <= 0) ||
				 (nx < 1) || (ny < 0)
				){
			    Error("addCanvasArray()","canvas npads inconsistent : nx = %i, ny = %i for canvas %s! Will not make subdivisions."
				  ,nx,ny,name.Data());
			}

			if(c == NULL){
			    Error("addCanvasArray()","canvas pointer = NULL for index = %i!",i2);
			    a.Delete();
			    return kFALSE;
			}
		       a.Add(c);

		    } else {
			for(Int_t i3=0; i3<i3max;i3++){
			    if(dim == 3) {

				if(useNameArray){
				    current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data());
				    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data());
				} else {
				    current = Form(mask.Data(),i1,i2,i3);
				    if(doTitle) titlenew = Form(title.Data(),i1,i2,i3);
				}

				c = new TCanvas(current,titlenew,xpix,ypix);

				if       (nx >  1 && ny >  0) c->Divide(nx,ny);
				else if ((nx >  1 && ny <= 0) ||
					 (nx < 1) || (ny < 0)
					){
				    Error("addCanvasArray()","canvas npads inconsistent : nx = %i, ny = %i for canvas %s! Will not make subdivisions."
					  ,nx,ny,name.Data());
				}

				if(c == NULL){
				    Error("addCanvasArray()","canvas pointer = NULL for index = %i!",i3);
				    a.Delete();
				    return kFALSE;
				}
				a.Add(c);

			    } else {
				for(Int_t i4=0; i4<i4max;i4++){
				    if(dim == 4) {

					if(useNameArray){
					    current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data());
					    if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data());
					} else {
					    current = Form(mask.Data(),i1,i2,i3,i4);
					    if(doTitle) titlenew = Form(title.Data(),i1,i2,i3,i4);
					}

                                        c = new TCanvas(current,titlenew,xpix,ypix);

					if       (nx >  1 && ny >  0) c->Divide(nx,ny);
					else if ((nx >  1 && ny <= 0) ||
						 (nx < 1) || (ny < 0)
						){
					    Error("addCanvasArray()","canvas npads inconsistent : nx = %i, ny = %i for canvas %s! Will not make subdivisions."
						  ,nx,ny,name.Data());
					}

					if(c == NULL){
					    Error("addCanvasArray()","canvas pointer = NULL for index = %i!",i4);
					    a.Delete();
					    return kFALSE;
					}
					a.Add(c);
				    } else {
					for(Int_t i5=0; i5<i5max;i5++){

					    if(useNameArray){
						current = Form(maskS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data(),ns5[i5].Data());
						if(doTitle) titlenew = Form(titleS.Data(),ns1[i1].Data(),ns2[i2].Data(),ns3[i3].Data(),ns4[i4].Data(),ns5[i5].Data());
					    } else {
						current = Form(mask.Data(),i1,i2,i3,i4,i5);
						if(doTitle) titlenew = Form(title.Data(),i1,i2,i3,i4,i5);
					    }

					    c = new TCanvas(current,titlenew,xpix,ypix);

					    if(c == NULL){
						Error("addCanvasArray()","canvas pointer = NULL for index = %i!",i5);
						a.Delete();
						return kFALSE;
					    }
					    a.Add(c);
					}
				    }
				}
			    }
			}
		    }
		}
	    }
	}

	TArrayI d(dim);
	if(dim >= 1) d[0] = i1max;
	if(dim >= 2) d[1] = i2max;
	if(dim >= 3) d[2] = i3max;
	if(dim >= 4) d[3] = i4max;
	if(dim >= 5) d[4] = i5max;

	TArrayI  np(4);
	np.SetAt(nx  ,0);
        np.SetAt(ny  ,1);
        np.SetAt(xpix,2);
        np.SetAt(ypix,3);

	hMC    [name] = a;
	hMaskC [name] = mask;
	hTitleC[name] = title;
	hDC    [name] = d;
	hNpC   [name] = np;
	hDirC  [name] = dir;

    } else { // exists already
	Error("addCanvasArray()","canvas with name \"%s\" has been used already!",name.Data());

	if(ns1) delete [] ns1;
	if(ns2) delete [] ns2;
	if(ns3) delete [] ns3;
	if(ns4) delete [] ns4;
	if(ns5) delete [] ns5;


	return kFALSE;
    }

    if(ns1) delete [] ns1;
    if(ns2) delete [] ns2;
    if(ns3) delete [] ns3;
    if(ns4) delete [] ns4;
    if(ns5) delete [] ns5;

    return kTRUE;

}

TCanvas*     HHistMap::getCanvas        (TString name,Int_t i1,Int_t i2,Int_t i3,Int_t i4,Int_t i5)
{
    // get canvas from map. print error and map
    // if not existing. the map has to be set before
    // If the requested object is an array of canvas
    // the index has to specified.


    map<TString,TObjArray>::iterator iter = hMC.find(name.Data());
    if( iter != hMC.end() ) {
	TArrayI& ar = hDC[(*iter).first];
	Int_t s = ar.GetSize();
	Int_t index = 0 ;
	if     (s == 1 && ar.At(0) > 0 ) index = i1;
	else if(s == 2 )                 index = HTool::getLinearIndex(i1,ar.At(0),i2,ar.At(1));
        else if(s == 3 )                 index = HTool::getLinearIndex(i1,ar.At(0),i2,ar.At(1),i3,ar.At(2));
        else if(s == 4 )                 index = HTool::getLinearIndex(i1,ar.At(0),i2,ar.At(1),i3,ar.At(2),i4,ar.At(3));
        else if(s == 5 )                 index = HTool::getLinearIndex(i1,ar.At(0),i2,ar.At(1),i3,ar.At(2),i4,ar.At(3),i5,ar.At(4));


	if(index<0) {
	    if(!fSilentFail) Error("getCanvas()","Retrieved NULL pointer for %s , index = ind %i %i %i %i %i !",name.Data(),i1,i2,i3,i4,i5);
            return 0;
	}
	return (TCanvas*)(*iter).second.At(index) ;
    }
    else {
	if(!fSilentFail) {
	    printCanvasMap();
	    Error("getCanvas()", "No matching canvas found for name = %s",name.Data());
	}
    }
    return 0;
}

TObjArray*   HHistMap::getCanvasArray   (TString name)
{
    // get canvas array from map. print error and map
    // if not existing. the map has to be set before

    map<TString,TObjArray>::iterator iter = hMC.find(name.Data());
    if( iter != hMC.end() ) {
	return &(*iter).second ;
    }
    else {
	if(!fSilentFail) {
	    printCanvasMap();
	    Error("getCanvasArray()", "No matching canvas found for name = %s",name.Data());
	}
    }
    return 0;
}

TArrayI*     HHistMap::getCanvasDimArray(TString name)
{
    // get canvas dim array from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TArrayI>::iterator iter = hDC.find(name.Data());
    if( iter != hDC.end() ) {
	return &(*iter).second ;
    }
    else {
	if(!fSilentFail) {
	    printCanvasMap();
	    Error("getCanvasDimArray()", "No matching canvas found for name = %s",name.Data());
	}
    }
    return 0;
}

TString      HHistMap::getCanvasDir     (TString name)
{
    // get canvas dir from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TString>::iterator iter = hDirC.find(name.Data());
    if( iter != hDirC.end() ) {
	return (*iter).second ;
    }
    else {
	if(!fSilentFail) {
	    printCanvasMap();
	    Error("getCanvasDir()", "No matching canvas found for name = %s",name.Data());
	}
    }
    TString dummy="" ;
    return dummy;
}

TString      HHistMap::getCanvasTitle   (TString name)
{
    // get canvas title from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TString>::iterator iter = hTitleC.find(name.Data());
    if( iter != hTitleC.end() ) {
	return (*iter).second ;
    }
    else {
	if(!fSilentFail) {
	    printCanvasMap();
	    Error("getCanvasTitle()", "No matching canvas found for name = %s",name.Data());
	}
    }
    TString dummy="" ;
    return dummy;
}

TString      HHistMap::getCanvasMask    (TString name)
{
    // get canvas mask from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TString>::iterator iter = hMaskC.find(name.Data());
    if( iter != hMaskC.end() ) {
	return (*iter).second ;
    }
    else {
	if(!fSilentFail) {
	    printCanvasMap();
	    Error("getCanvasMask()", "No matching canvas found for name = %s",name.Data());
	}
    }

    TString dummy="" ;
    return dummy;
}

TArrayI*     HHistMap::getCanvasPropertiesArray(TString name)
{
    // get canvas properties array from map. print error and map
    // if not existing. the map has to be set before


    map<TString,TArrayI>::iterator iter = hNpC.find(name.Data());
    if( iter != hNpC.end() ) {
	return &(*iter).second ;
    }
    else {
	if(!fSilentFail) {
	    printCanvasMap();
	    Error("getCanvasPropertiesArray()", "No matching canvas found for name = %s",name.Data());
	}
    }
    return 0;
}

vector < TString> HHistMap::getMatchingCanvasLabels(TString expression,Int_t dim)
{
    // return stl vector of label name matching the expression.
    // if dim  !=-1 the dimension of the array is evalated in addition.

    TPRegexp filter(expression);
    TString label ;
    vector <TString> out;
    for(map< TString, TObjArray>::iterator iter = hMC.begin(); iter != hMC.end(); ++iter ) {
         label =  (*iter).first;
	 if(filter.Match(label)){

	     Int_t dim1 = hDC[(*iter).first].GetSize();
             if(dim != -1 && dim1 != dim) continue;
             out.push_back(label);
	 }
    }
    return out;
}

vector < TCanvas*> HHistMap::getMatchingCanvas(TString expression,Int_t dim)
{
    // return stl vector of TCanvas*  matching the expression (by canvas name).
    // if dim  !=-1 the dimension of the array is evalated in addition.

    TPRegexp filter(expression);
    TString label ;
    vector <TCanvas*> out;
    for(map< TString, TObjArray>::iterator iter = hMC.begin(); iter != hMC.end(); ++iter ) {
	Int_t dim1 = hDC[(*iter).first].GetSize();
	if(dim != -1 && dim1 != dim)  continue;

	Int_t size = (*iter).second.GetEntries();
	for(Int_t i=0;i<size;i++){
            TCanvas* c = ((TCanvas*)((*iter).second.At(i)));
	    label  = c->GetName();
	    if(filter.Match(label)){
		out.push_back(c);
	    }
	}
    }
    return out;
}


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


//------------------------------------------------------------------------
// cuts

Bool_t HHistMap::addCut(TCutG* cut,TString dir)
{

    // add a TCutG

    if(!cut) {
	Error("addCut()","cut pointer = NULL!");
	return kFALSE;
    }

    TString name = cut->GetName();

    map<TString,TCutG*>::iterator iter = hMCut.find(name);
    if( iter == hMCut.end() ){ // new variable
	hMCut  [name] = cut;
        hDirCut[name] = dir;

    } else { // exists already
	Error("addCut()","cut with name \"%s\" has been used already!",name.Data());
	return kFALSE;
    }
    return kTRUE;
}

Bool_t HHistMap::addCut(TString name,Int_t n,Double_t* x,Double_t* y,TString dir)
{
    // add a TCutG

    if(name == "") {
	Error("addCut()","cut name empty!");
	return kFALSE;
    }
    if(n < 3) {
	Error("addCut()","not enough points for cut!");
	return kFALSE;
    }
    if(x==NULL || y==NULL ) {
	Error("addCut()","array pointer of values is NULL !");
	return kFALSE;
    }

    map<TString,TCutG*>::iterator iter = hMCut.find(name);
    if( iter == hMCut.end() ){ // new variable

	hMCut  [name] = new TCutG(name.Data(),n,x,y);
        hDirCut[name] = dir;

    } else { // exists already
	Error("addCut()","cut with name \"%s\" has been used already!",name.Data());
	return kFALSE;
    }
    return kTRUE;
}

Bool_t HHistMap::removeCut(TString name, Bool_t removeObject)
{
    // remove a cut

    map<TString,TCutG*>::iterator iter = hMCut.find(name);
    if( iter == hMCut.end() ){ // new variable
	Error("removeCut()","cut with name \"%s\" not found!",name.Data());
        return kFALSE;
    } else { // exists
        // cut
	if(removeObject)delete iter->second;
	hMCut.erase( iter );
        // mask,title,dir
	map<TString,TString>::iterator iter2 = hDirCut.find(name);
	hDirCut.erase( iter2 );
    }
    return kTRUE;
}

TCutG* HHistMap::getCut(TString name)
{
    // get TCutG by name

    map<TString,TCutG*>::iterator iter = hMCut.find(name);
    if( iter == hMCut.end() ){ // new variable
	if(!fSilentFail) {
	    Error("getCut()","cut with name \"%s\" not found!",name.Data());
	    printCutMap();
	}
    } else { // exists already
	return iter->second;
    }
    return NULL;
}

TString HHistMap::getCutDir(TString name)
{
    // get TCutG by name

    map<TString,TCutG*>::iterator iter = hMCut.find(name);
    if( iter == hMCut.end() ){ // new variable
	if(!fSilentFail){
	    Error("getCutDir()","cut with name \"%s\" not found!",name.Data());
	    printCutMap();
	}
    } else { // exists already
	return hDirCut[name];
    }
    TString dummy = "";
    return dummy;
}

Bool_t HHistMap::isInsideCut(TString name,Double_t x, Double_t y)
{
    // returns kTRUE if point is inside the cut

    TCutG* cut = getCut(name);
    if(cut){
	return cut->IsInside(x,y);
    }
    return kFALSE;
}

vector < TString> HHistMap::getMatchingCutLabels(TString expression)
{
    // return stl vector of label name matching the expression.

    TPRegexp filter(expression);
    TString label ;
    vector <TString> out;
    for(map< TString, TCutG*>::iterator iter = hMCut.begin(); iter != hMCut.end(); ++iter ) {
         label =  (*iter).first;
	 if(filter.Match(label)){
             out.push_back(label);
	 }
    }
    return out;
}

vector < TCutG*> HHistMap::getMatchingCuts(TString expression)
{
    // return stl vector of TCutG*  matching the expression.

    TPRegexp filter(expression);
    TString label ;
    vector <TCutG*> out;
    for(map< TString, TCutG*>::iterator iter = hMCut.begin(); iter != hMCut.end(); ++iter ) {
	label  = iter->first;
	if(filter.Match(label)){
	    out.push_back(iter->second);
	}
    }
    return out;
}


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

//------------------------------------------------------------------------
// fits

Bool_t HHistMap::addFit(TF1* fit,TString dir)
{

    // add a TF1

    if(!fit) {
	Error("addFit()","fit pointer = NULL!");
	return kFALSE;
    }

    TString name = fit->GetName();

    map<TString,TF1*>::iterator iter = hMFit.find(name);
    if( iter == hMFit.end() ){ // new variable
	hMFit  [name] = fit;
        hDirFit[name] = dir;

    } else { // exists already
	Error("addFit()","fit with name \"%s\" has been used already!",name.Data());
	return kFALSE;
    }
    return kTRUE;
}

Bool_t HHistMap::removeFit(TString name, Bool_t removeObject)
{
    // remove a fit

    map<TString,TF1*>::iterator iter = hMFit.find(name);
    if( iter == hMFit.end() ){ // new variable
	Error("removeFit()","fit with name \"%s\" not found!",name.Data());
        return kFALSE;
    } else { // exists
        // fit
	if(removeObject)delete iter->second;
	hMFit.erase( iter );
        // mask,title,dir
	map<TString,TString>::iterator iter2 = hDirFit.find(name);
	hDirFit.erase( iter2 );
    }
    return kTRUE;
}

TF1* HHistMap::getFit(TString name)
{
    // get TF1 by name

    map<TString,TF1*>::iterator iter = hMFit.find(name);
    if( iter == hMFit.end() ){ // new variable

	Error("getFit()","fit with name \"%s\" not found!",name.Data());
        printFitMap();
    } else { // exists already
	return iter->second;
    }
    return NULL;
}

TString HHistMap::getFitDir(TString name)
{
    // get Fit dir by name

    map<TString,TF1*>::iterator iter = hMFit.find(name);
    if( iter == hMFit.end() ){ // new variable
	if(!fSilentFail){
	    Error("getFitDir()","fit with name \"%s\" not found!",name.Data());
	    printFitMap();
	}
    } else { // exists already
	return hDirFit[name];
    }
    TString dummy = "";
    return dummy;
}

vector < TString> HHistMap::getMatchingFitLabels(TString expression)
{
    // return stl vector of label name matching the expression.

    TPRegexp filter(expression);
    TString label ;
    vector <TString> out;
    for(map< TString, TF1*>::iterator iter = hMFit.begin(); iter != hMFit.end(); ++iter ) {
         label =  (*iter).first;
	 if(filter.Match(label)){
             out.push_back(label);
	 }
    }
    return out;
}

vector < TF1*> HHistMap::getMatchingFits(TString expression)
{
    // return stl vector of TF1*  matching the expression.

    TPRegexp filter(expression);
    TString label ;
    vector <TF1*> out;
    for(map< TString, TF1*>::iterator iter = hMFit.begin(); iter != hMFit.end(); ++iter ) {
	label  = iter->first;
	if(filter.Match(label)){
	    out.push_back(iter->second);
	}
    }
    return out;
}

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

//------------------------------------------------------------------------
// parameters
Bool_t HHistMap::addPar(TObject* par,TString name, TString dir)
{

    // add a Parmeter object

    if(!par) {
	Error("addPar()","par pointer = NULL!");
	return kFALSE;
    }

    map<TString,TObject*>::iterator iter = hMPar.find(name);
    if( iter == hMPar.end() ){ // new variable

 	hMPar  [name] = par;
        hDirPar[name] = dir;

    } else { // exists already
	Error("addPar()","par with name \"%s\" has been used already!",name.Data());
	return kFALSE;
    }
    return kTRUE;
}

Bool_t HHistMap::removePar(TString name, Bool_t removeObject)
{
    // remove a parameter

    map<TString,TObject*>::iterator iter = hMPar.find(name);
    if( iter == hMPar.end() ){ // new variable
	Error("removePar()","par with name \"%s\" not found!",name.Data());
        return kFALSE;
    } else { // exists
        // par
	if(removeObject) delete iter->second;
	hMPar.erase( iter );
        // mask,title,dir
	map<TString,TString>::iterator iter2 = hDirPar.find(name);
	hDirPar.erase( iter2 );
    }
    return kTRUE;
}

TObject* HHistMap::getPar(TString name)
{
    // get Parameter by name

    map<TString,TObject*>::iterator iter = hMPar.find(name);
    if( iter == hMPar.end() ){ // new variable
	if(!fSilentFail) {
	    Error("getPar()","par with name \"%s\" not found!",name.Data());
	    printParameterMap();
	}
    } else { // exists already
	return iter->second;
    }
    return NULL;
}

TString HHistMap::getParDir(TString name)
{
    // get TCutG by name

    map<TString,TObject*>::iterator iter = hMPar.find(name);
    if( iter == hMPar.end() ){ // new variable
	if(!fSilentFail){
	    Error("getParDir()","par with name \"%s\" not found!",name.Data());
	    printParameterMap();
	}
    } else { // exists already
	return hDirPar[name];
    }
    TString dummy = "";
    return dummy;
}

vector < TString> HHistMap::getMatchingParLabels(TString expression)
{
    // return stl vector of label name matching the expression.

    TPRegexp filter(expression);
    TString label ;
    vector <TString> out;
    for(map< TString, TObject*>::iterator iter = hMPar.begin(); iter != hMPar.end(); ++iter ) {
         label =  (*iter).first;
	 if(filter.Match(label)){
             out.push_back(label);
	 }
    }
    return out;
}

vector < TObject*> HHistMap::getMatchingPars(TString expression)
{
    // return stl vector of TObject*  matching the expression.

    TPRegexp filter(expression);
    TString label ;
    vector <TObject*> out;
    for(map< TString, TObject*>::iterator iter = hMPar.begin(); iter != hMPar.end(); ++iter ) {
	label  = iter->first;
	if(filter.Match(label)){
	    out.push_back(iter->second);
	}
    }
    return out;
}
//------------------------------------------------------------------------

//------------------------------------------------------------------------
// macros

Bool_t HHistMap::addMacro(TMacro* mac,TString name,TString dir)
{

    // add a TCutG

    if(!mac) {
	Error("addMacro()","macro pointer = NULL!");
	return kFALSE;
    }

    TString name1 = mac->GetName();
    if(name != "") name1 = name;
    map<TString,TMacro*>::iterator iter = hMMacro.find(name1);
    if( iter == hMMacro.end() ){ // new variable
	hMMacro  [name1] = mac;
        hDirMacro[name1] = dir;

    } else { // exists already
	Error("addMacro()","macro with name \"%s\" has been used already!",name.Data());
	return kFALSE;
    }
    return kTRUE;
}


Bool_t HHistMap::removeMacro(TString name, Bool_t removeObject)
{
    // remove a cut

    map<TString,TMacro*>::iterator iter = hMMacro.find(name);
    if( iter == hMMacro.end() ){ // new variable
	Error("removeMacro()","mac with name \"%s\" not found!",name.Data());
        return kFALSE;
    } else { // exists
        // cut
	if(removeObject)delete iter->second;
	hMMacro.erase( iter );
        // mask,title,dir
	map<TString,TString>::iterator iter2 = hDirMacro.find(name);
	hDirMacro.erase( iter2 );
    }
    return kTRUE;
}

TMacro* HHistMap::getMacro(TString name)
{
    // get TMacro by name

    map<TString,TMacro*>::iterator iter = hMMacro.find(name);
    if( iter == hMMacro.end() ){ // new variable
	if(!fSilentFail){
	    Error("getMacro()","macro with name \"%s\" not found!",name.Data());
	    printMacroMap();
	}
    } else { // exists already
	return iter->second;
    }
    return NULL;
}

TString HHistMap::getMacroDir(TString name)
{
    // get TMacro dir by name

    map<TString,TMacro*>::iterator iter = hMMacro.find(name);
    if( iter == hMMacro.end() ){ // new variable
	if(!fSilentFail){
	    Error("getMacroDir()","macro with name \"%s\" not found!",name.Data());
	    printMacroMap();
	}
    } else { // exists already
	return hDirMacro[name];
    }
    TString dummy = "";
    return dummy;
}

vector < TString> HHistMap::getMatchingMacroLabels(TString expression)
{
    // return stl vector of label name matching the expression.

    TPRegexp filter(expression);
    TString label ;
    vector <TString> out;
    for(map< TString, TMacro*>::iterator iter = hMMacro.begin(); iter != hMMacro.end(); ++iter ) {
         label =  (*iter).first;
	 if(filter.Match(label)){
             out.push_back(label);
	 }
    }
    return out;
}

vector < TMacro*> HHistMap::getMatchingMacros(TString expression)
{
    // return stl vector of TMacros*  matching the expression.

    TPRegexp filter(expression);
    TString label ;
    vector <TMacro*> out;
    for(map< TString, TMacro*>::iterator iter = hMMacro.begin(); iter != hMMacro.end(); ++iter ) {
	label  = iter->first;
	if(filter.Match(label)){
	    out.push_back(iter->second);
	}
    }
    return out;
}

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


Bool_t HHistMap::writeHists(TString opt)
{
    // write he histograms and canvas to the output file
    // the histograms will be stored in subdirs as
    // specified in addHist(....) or in the main
    // directory if no dir is specified
    // opt = "nohists" will write only the HHistMap object
    // opt = "nomap"   will write only the hists into subbdirs
    // opt = ""  default will write both

    opt.ToLower();



    if(output) output->cd();
    else      {
	Error("writeHists()","No file opened! will be ignored...");
        return kFALSE;
    }

    if(opt.CompareTo("nohists")!=0)
    {

	for(map< TString, TObjArray>::iterator iter = hM.begin(); iter != hM.end(); ++iter ) {
	    output->cd();
	    TString dir = hDir[(*iter).first];
	    if(hDir[(*iter).first] != "") HTool::changeToDir(dir);
	    (*iter).second.Write();
	}

	for(map< TString, TObjArray>::iterator iter = hMC.begin(); iter != hMC.end(); ++iter ) {
	    output->cd();
	    TString dir = hDirC[(*iter).first];
	    if(hDirC[(*iter).first] != "") HTool::changeToDir(dir);
	    (*iter).second.Write();
	}

	for(map< TString, TCutG*>::iterator iter = hMCut.begin(); iter != hMCut.end(); ++iter ) {
	    output->cd();
	    TString dir = hDirCut[(*iter).first];
	    if(hDirCut[(*iter).first] != "") HTool::changeToDir(dir);
	    TCutG* cut = (*iter).second ;
	    if(strlen(cut->GetName())==0){
		cut->SetName((*iter).first.Data());
	    }
	    (*iter).second->Write();
	}

	for(map< TString, TF1*>::iterator iter = hMFit.begin(); iter != hMFit.end(); ++iter ) {
	    output->cd();
	    TString dir = hDirFit[(*iter).first];
	    if(hDirFit[(*iter).first] != "") HTool::changeToDir(dir);
	    TF1* fit = (*iter).second ;
	    if(strlen(fit->GetName()) == 0){
		fit->SetName((*iter).first.Data());
	    }
	    (*iter).second->Write();
	}

	for(map< TString, TObject*>::iterator iter = hMPar.begin(); iter != hMPar.end(); ++iter ) {
	    output->cd();
	    TString dir = hDirPar[(*iter).first];
	    if(hDirPar[(*iter).first] != "") HTool::changeToDir(dir);

	    if((*iter).second->InheritsFrom("TNamed") ){

		TNamed* par = (TNamed*)(*iter).second;
		TString name = par->GetName();
		if(name == ""){
		    ((TNamed*)(*iter).second)->SetName((*iter).first.Data());
		}
		par->Write();
	    } else (*iter).second->Write();
	}

	for(map< TString, TMacro*>::iterator iter = hMMacro.begin(); iter != hMMacro.end(); ++iter ) {
	    output->cd();
	    TString dir = hDirMacro[(*iter).first];
	    if(hDirMacro[(*iter).first] != "") HTool::changeToDir(dir);
	    TMacro* cut = (*iter).second ;
	    if(strlen(cut->GetName())==0){
		cut->SetName((*iter).first.Data());
	    }
	    (*iter).second->Write();
	}
    }
    output->cd();

    if(opt.CompareTo("nomap")!=0)
    {
	TString name = GetName();
	if(name == "") SetName("HHistMap");
	this ->Write();
    }
    output->Save();
    output->Close();

    return kTRUE;
}
/*
Bool_t HHistMap::writeConfig(TString filename)
{
    // write the histograms config to the output file
    // this file can be read in to create all hists from
    // config file. " " is used as token delimiter,
    // @ separates token from asigned values. " " inside
    // axis titles or title will be replaced by "!".
    // The readConfig() routine takes care to change back.
    // empty titles will be writte as "no" and changed
    // back accordingly in readConfig(). Special graphical
    // options are not supported. parameters and fits
    // are not supported too.


    ofstream output;
    output.open(filename.Data());

    if(output.good())
    {

	//---------------------------------------------------------------------------
        // hist
	for(map< TString, TObjArray>::iterator iter = hM.begin(); iter != hM.end(); ++iter )
	{
	    TString out    = "";
	    TString lable  = (*iter).first;
            TString mask   = hMask [(*iter).first];
            TString title  = hTitle[(*iter).first];
            TString dir    = hDir  [(*iter).first];
            Int_t dim      = getDimArray(lable)->GetSize();
	    TString type   = "";
	    TString xtitle = "no";
            TString ytitle = "no";
	    TString ztitle = "no";

	    Int_t i1max,i2max,i3max,i4max,i5max;
            i1max=i2max=i3max=i4max=i5max=-1;
            Int_t nbinx,nbiny,nbinz;
	    Double_t x1,x2,y1,y2,z1,z2;
            nbinx=nbiny=nbinz=0;
            x1=x2=y1=y2=z1=z2=0.;


	    if  (dim == 1) {
                i1max  = (*getDimArray(lable))[0];
		type   = get(lable,0)->ClassName();
                nbinx  = get(lable,0)->GetNbinsX();
		xtitle = get(lable,0)->GetXaxis()->GetTitle();
                x1     = get(lable,0)->GetXaxis()->GetXmin();
                x2     = get(lable,0)->GetXaxis()->GetXmax();

		if(type.Contains("2")) {
		    nbiny  = get(lable,0)->GetNbinsY();
		    ytitle = get(lable,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0)->GetYaxis()->GetXmax();
 		}
		if(type.Contains("3")) {
		    nbiny  = get(lable,0)->GetNbinsY();
		    nbinz  = get(lable,0)->GetNbinsZ();
		    ytitle = get(lable,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0)->GetYaxis()->GetXmax();
		    z1     = get(lable,0)->GetZaxis()->GetXmin();
		    z2     = get(lable,0)->GetZaxis()->GetXmax();
		}

	    } else if(dim == 2) {
		i1max = (*getDimArray(lable))[0];
		i2max = (*getDimArray(lable))[1];
		type   = get(lable,0,0)->ClassName();
                nbinx  = get(lable,0,0)->GetNbinsX();
		xtitle = get(lable,0,0)->GetXaxis()->GetTitle();
                x1     = get(lable,0,0)->GetXaxis()->GetXmin();
                x2     = get(lable,0,0)->GetXaxis()->GetXmax();
		if(type.Contains("2")){
		    nbiny  = get(lable,0,0)->GetNbinsY();
		    ytitle = get(lable,0,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0,0)->GetYaxis()->GetXmax();
		}
		if(type.Contains("3")){
		    nbiny  = get(lable,0,0)->GetNbinsY();
		    nbinz  = get(lable,0,0)->GetNbinsZ();
		    ytitle = get(lable,0,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0,0)->GetYaxis()->GetXmax();
		    z1     = get(lable,0,0)->GetZaxis()->GetXmin();
		    z2     = get(lable,0,0)->GetZaxis()->GetXmax();
		}
	    } else if(dim == 3) {
		i1max  = (*getDimArray(lable))[0];
		i2max  = (*getDimArray(lable))[1];
		i3max  = (*getDimArray(lable))[2];
		type   = get(lable,0,0,0)->ClassName();
                nbinx  = get(lable,0,0,0)->GetNbinsX();
		xtitle = get(lable,0,0,0)->GetXaxis()->GetTitle();
                x1     = get(lable,0,0,0)->GetXaxis()->GetXmin();
                x2     = get(lable,0,0,0)->GetXaxis()->GetXmax();
		if(type.Contains("2")){
		    nbiny  = get(lable,0,0,0)->GetNbinsY();
		    ytitle = get(lable,0,0,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0,0,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0,0,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0,0,0)->GetYaxis()->GetXmax();
		}
		if(type.Contains("3")){
		    nbiny  = get(lable,0,0,0)->GetNbinsY();
		    nbinz  = get(lable,0,0,0)->GetNbinsZ();
		    ytitle = get(lable,0,0,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0,0,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0,0,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0,0,0)->GetYaxis()->GetXmax();
		    z1     = get(lable,0,0,0)->GetZaxis()->GetXmin();
		    z2     = get(lable,0,0,0)->GetZaxis()->GetXmax();
		}
	    } else if(dim == 4) {
		i1max  = (*getDimArray(lable))[0];
		i2max  = (*getDimArray(lable))[1];
		i3max  = (*getDimArray(lable))[2];
		i4max  = (*getDimArray(lable))[3];
		type   = get(lable,0,0,0,0)->ClassName();
                nbinx  = get(lable,0,0,0,0)->GetNbinsX();
		xtitle = get(lable,0,0,0,0)->GetXaxis()->GetTitle();
                x1     = get(lable,0,0,0,0)->GetXaxis()->GetXmin();
                x2     = get(lable,0,0,0,0)->GetXaxis()->GetXmax();
		if(type.Contains("2")){
		    nbiny  = get(lable,0,0,0,0)->GetNbinsY();
		    ytitle = get(lable,0,0,0,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0,0,0,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0,0,0,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0,0,0,0)->GetYaxis()->GetXmax();
		}
		if(type.Contains("3")){
		    nbiny  = get(lable,0,0,0,0)->GetNbinsY();
		    nbinz  = get(lable,0,0,0,0)->GetNbinsZ();
		    ytitle = get(lable,0,0,0,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0,0,0,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0,0,0,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0,0,0,0)->GetYaxis()->GetXmax();
		    z1     = get(lable,0,0,0,0)->GetZaxis()->GetXmin();
		    z2     = get(lable,0,0,0,0)->GetZaxis()->GetXmax();
		}
	    } else if(dim == 5) {
		i1max  = (*getDimArray(lable))[0];
		i2max  = (*getDimArray(lable))[1];
		i3max  = (*getDimArray(lable))[2];
		i4max  = (*getDimArray(lable))[3];
		i5max  = (*getDimArray(lable))[4];
		type   = get(lable,0,0,0,0,0)->ClassName();
                nbinx  = get(lable,0,0,0,0,0)->GetNbinsX();
		xtitle = get(lable,0,0,0,0,0)->GetXaxis()->GetTitle();
                x1     = get(lable,0,0,0,0,0)->GetXaxis()->GetXmin();
                x2     = get(lable,0,0,0,0,0)->GetXaxis()->GetXmax();
		if(type.Contains("2")){
		    nbiny  = get(lable,0,0,0,0,0)->GetNbinsY();
		    ytitle = get(lable,0,0,0,0,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0,0,0,0,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0,0,0,0,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0,0,0,0,0)->GetYaxis()->GetXmax();
		}
		if(type.Contains("3")){
		    nbiny  = get(lable,0,0,0,0,0)->GetNbinsY();
		    nbinz  = get(lable,0,0,0,0,0)->GetNbinsZ();
		    ytitle = get(lable,0,0,0,0,0)->GetYaxis()->GetTitle();
		    ztitle = get(lable,0,0,0,0,0)->GetZaxis()->GetTitle();
		    y1     = get(lable,0,0,0,0,0)->GetYaxis()->GetXmin();
		    y2     = get(lable,0,0,0,0,0)->GetYaxis()->GetXmax();
		    z1     = get(lable,0,0,0,0,0)->GetZaxis()->GetXmin();
		    z2     = get(lable,0,0,0,0,0)->GetZaxis()->GetXmax();
		}
	    }

	    if(xtitle == "") xtitle = "no";
            if(ytitle == "") ytitle = "no";
            if(ztitle == "") ztitle = "no";
            if(title  == "")  title = "no";
	    xtitle.ReplaceAll(" ","!");
            ytitle.ReplaceAll(" ","!");
            ztitle.ReplaceAll(" ","!");
            title.ReplaceAll(" ","!");

	    out += Form("type@%s dim@%i",type.Data(),dim);
	    out += Form(" maxind@%i:%i:%i:%i:%i",i1max,i2max,i3max,i4max,i5max);
	    out += Form(" lable@%s name@%s title@%s dir@%s",lable.Data(),mask.Data(),title.Data(),dir.Data());
	    out += Form(" x@%i:%f:%f",nbinx,x1,x2);
	    out += Form(" y@%i:%f:%f",nbiny,y1,y2);
	    out += Form(" z@%i:%f:%f",nbinz,z1,z2);
	    out += Form(" axistitle@%s:%s:%s",xtitle.Data(),ytitle.Data(),ztitle.Data());

           
            output<<out.Data()<<endl;
	}


	//---------------------------------------------------------------------------
        // canvas

	for(map< TString, TObjArray>::iterator iter = hMC.begin(); iter != hMC.end(); ++iter )
	{
	    TString out    = "";
	    TString lable  = (*iter).first;
            TString mask   = hMaskC [(*iter).first];
            TString title  = hTitleC[(*iter).first];
            TString dir    = hDirC  [(*iter).first];
            Int_t   dim    = getCanvasDimArray(lable)->GetSize();
	    TString type   = "TCanvas";

	    Int_t i1max,i2max,i3max,i4max,i5max;
            i1max=i2max=i3max=i4max=i5max=-1;
            Int_t nx,ny,xpix,ypix;
            nx=ny=xpix=ypix=0;

	    nx   = getCanvasPropertiesArray(lable)->At(0);
	    ny   = getCanvasPropertiesArray(lable)->At(1);
	    xpix = getCanvasPropertiesArray(lable)->At(2);
	    ypix = getCanvasPropertiesArray(lable)->At(3);

	    if  (dim == 1) {
                i1max = (*getCanvasDimArray(lable))[0];

	    } else if(dim == 2) {
		i1max = (*getCanvasDimArray(lable))[0];
		i2max = (*getCanvasDimArray(lable))[1];
	    } else if(dim == 3) {
		i1max = (*getCanvasDimArray(lable))[0];
		i2max = (*getCanvasDimArray(lable))[1];
		i3max = (*getCanvasDimArray(lable))[2];
	    } else if(dim == 4) {
		i1max = (*getCanvasDimArray(lable))[0];
		i2max = (*getCanvasDimArray(lable))[1];
		i3max = (*getCanvasDimArray(lable))[2];
		i4max = (*getCanvasDimArray(lable))[3];
	    } else if(dim == 5) {
		i1max = (*getCanvasDimArray(lable))[0];
		i2max = (*getCanvasDimArray(lable))[1];
		i3max = (*getCanvasDimArray(lable))[2];
		i4max = (*getCanvasDimArray(lable))[3];
		i5max = (*getCanvasDimArray(lable))[4];
	    }

	    title.ReplaceAll(" ","!");


	    out += Form("type@%s dim@%i",type.Data(),dim);
	    out += Form(" maxind@%i:%i:%i:%i:%i",i1max,i2max,i3max,i4max,i5max);
	    out += Form(" lable@%s name@%s title@%s dir@%s",lable.Data(),mask.Data(),title.Data(),dir.Data());
	    out += Form(" pads@%i:%i",nx,ny);
	    out += Form(" window@%i:%i",xpix,ypix);


            output<<out.Data()<<endl;
	}


	//---------------------------------------------------------------------------
        // cuts

	for(map< TString, TCutG*>::iterator iter = hMCut.begin(); iter != hMCut.end(); ++iter )
	{
	    TString out    = "";
	    TString lable  = (*iter).first;
            TString dir    = hDirCut  [(*iter).first];
	    TString type   = "TCutG";
	    TCutG* cut = (*iter).second ;

	    out += Form("type@%s name@%s dir@%s ",type.Data(),lable.Data(),dir.Data());
	    output<<out.Data();

	    Double_t* x = cut->GetX();
            Double_t* y = cut->GetY();

	    output<<"xcut@";
	    for(Int_t i = 0; i < cut->GetN(); i++ ){
		output<<x[i];
		if(i < cut->GetN() - 1) output<<",";
	    }
            output<<" ycut@";
	    for(Int_t i = 0; i < cut->GetN(); i++ ){
		output<<y[i];
		if(i < cut->GetN() - 1) output<<",";
	    }

	    output<<endl;
	}


    } else {
         Error("writeConfig()","Could not create config file!");
         return kFALSE;
    }
    output.close();
    return kTRUE;
}

Bool_t HHistMap::readConfig(TString filename)
{
    // read the histograms config from the input file
    // the format is defined by writeConfig() with 1 line
    // per histogram definition
    // info's about the file format see in writeConfig()


    ifstream input;
    input.open(filename.Data());


    Char_t line[1000];
    if(input.good())
    {
	while(input.good())
	{
	    input.getline(line,1000);

	    if(!input.fail())
	    {
		TString lable;
		TString mask;
		TString title;
		TString dir;
		Int_t dim=-1;
		TString type;


		Int_t i1max,i2max,i3max,i4max,i5max;
		i1max=i2max=i3max=i4max=i5max=-1;

		// hists
		TString xtitle;
		TString ytitle;
		TString ztitle;

		Int_t nbinx,nbiny,nbinz;
		Double_t x1,x2,y1,y2,z1,z2;
		nbinx=nbiny=nbinz=0;
		x1=x2=y1=y2=z1=z2=0.;

                // canvas
		Int_t nx,ny,xpix,ypix;
                nx=ny=xpix=ypix=0;

		// cuts
                Double_t* xcut = NULL;
                Double_t* ycut = NULL;

		TString l = line;
		TObjArray* ar= l.Tokenize(" ");

		for(Int_t i=0;i<ar->GetEntries();i++){
		    TString token = ((TObjString*)ar->At(i))->GetString();
		    if(token != " " ){
			if(token.BeginsWith("type@")){
			    token.ReplaceAll("type@","");
			    type = token;
			    continue;
			} else if (token.BeginsWith("dim@")){
			    token.ReplaceAll("dim@","");
			    sscanf(token.Data(),"%d",&dim);
			    continue;
			} else if (token.BeginsWith("maxind@")){
			    token.ReplaceAll("maxind@","");
			    token.ReplaceAll(":"," ");
			    sscanf(token.Data(),"%d %d %d %d %d",&i1max,&i2max,&i3max,&i4max,&i5max);
			    continue;
			} else if (token.BeginsWith("lable@")){
			    token.ReplaceAll("lable@","");
			    lable = token;
			    continue;
			} else if (token.BeginsWith("name@")){
			    token.ReplaceAll("name@","");
			    mask = token;
			    continue;
			} else if (token.BeginsWith("title@")){
			    token.ReplaceAll("title@","");
			    title = token;
			    continue;
			} else if (token.BeginsWith("dir@")){
			    token.ReplaceAll("dir@","");
			    dir = token;
			    continue;
			} else if (token.BeginsWith("x@")){
			    token.ReplaceAll("x@","");
			    token.ReplaceAll(":"," ");
			    sscanf(token.Data(),"%d %f %f",&nbinx,&x1,&x2);
			    continue;
			} else if (token.BeginsWith("y@")){
			    token.ReplaceAll("y@","");
			    token.ReplaceAll(":"," ");
			    sscanf(token.Data(),"%d %f %f",&nbiny,&y1,&y2);
			    continue;
			} else if (token.BeginsWith("z@")){
			    token.ReplaceAll("z@","");
			    token.ReplaceAll(":"," ");
			    sscanf(token.Data(),"%d %f %f",&nbinz,&z1,&z2);
			    continue;
			} else if (token.BeginsWith("axistitle@")){
			    token.ReplaceAll("axistitle@","");
			    token.ReplaceAll(":"," ");

			    Char_t xt[1000],yt[1000],zt[1000];
			    sscanf(token.Data(),"%s %s %s",xt,yt,zt);
			    xtitle = xt;
			    ytitle = yt;
			    ztitle = zt;
			    continue;
			} else if (token.BeginsWith("pads@")){ // canvas
			    token.ReplaceAll("pads@","");
			    token.ReplaceAll(":"," ");
			    sscanf(token.Data(),"%d %d ",&nx,&ny);
			    continue;
			} else if (token.BeginsWith("window@")){ // canvas
			    token.ReplaceAll("window@","");
			    token.ReplaceAll(":"," ");
			    sscanf(token.Data(),"%d %d ",&xpix,&ypix);
			    continue;
			} else if (token.BeginsWith("xcut@")){ // cut xvals
			    token.ReplaceAll("xcut@","");

			    TObjArray* values = token.Tokenize(",");
			    TIterator* myiter = values->MakeIterator();
                            TObjString* stemp;
			    if(values && values->GetEntries() >0){
				xcut = new Double_t [values->GetEntries()];
				// iterate over the list of arguments
                                Int_t ct = 0;
				while ((stemp=(TObjString*)myiter->Next())!= 0) {
				    TString valstr=stemp->GetString();
                                    sscanf(valstr.Data(),"%lf",&xcut[ct]);
                                    ct++;
				}
			    }
			    values->Delete();
			    delete values;
			    delete myiter;


			    continue;
			} else if (token.BeginsWith("ycut@")){ // cut yvals
			    token.ReplaceAll("ycut@","");

			    TObjArray* values = token.Tokenize(",");
			    TIterator* myiter = values->MakeIterator();
                            TObjString* stemp;
			    if(values && values->GetEntries() >0){
				ycut = new Double_t [values->GetEntries()];
				// iterate over the list of arguments
                                Int_t ct = 0;
				while ((stemp=(TObjString*)myiter->Next())!= 0) {
				    TString valstr=stemp->GetString();
                                    sscanf(valstr.Data(),"%lf",&ycut[ct]);
                                    ct++;
				}
			    }
			    values->Delete();
			    delete values;
			    delete myiter;


			    continue;
			} else {
			    Error("readConfig()","Unknown token = %s!",token.Data());
			}
		    }
		}

		if(xtitle == "no") xtitle="";
		if(ytitle == "no") ytitle="";
		if(ztitle == "no") ztitle="";
		if(title  == "no") title ="";
		xtitle.ReplaceAll("!"," ");
		ytitle.ReplaceAll("!"," ");
		ztitle.ReplaceAll("!"," ");
		title.ReplaceAll("!"," ");

		if(type == "TCanvas"){
		    if(i1max > 0) {

			addCanvasArray(lable,mask,title,nx,ny,xpix,ypix,dir,
				       i1max,i2max,i3max,i4max,i5max);
		    } else {
			addCanvas(mask,title,nx,ny,xpix,ypix,dir);
		    }

		} else {
		    if(i1max > 0) {
			addHistArray(type,lable,mask,title,
				     nbinx,x1,x2,
				     nbiny,y1,y2,
				     nbinz,z1,z2,
				     xtitle,ytitle,ztitle,dir,
				     i1max,i2max,i3max,i4max,i5max);
		    } else {
			addHist(type,mask,title,
				nbinx,x1,x2,
				nbiny,y1,y2,
				nbinz,z1,z2,
				xtitle,ytitle,ztitle,dir);
		    }
		}

		if(type == "TCutG"){
		    if(xcut && ycut){
                        addCut(lable.Data(),sizeof(xcut),xcut,ycut,dir);

		    } else {
			Error("readConfig()","x- or y-valus of cut = %s could not be read correctly!",lable.Data());
		    }
                    if(xcut) delete [] xcut;
		    if(ycut) delete [] ycut;
                    xcut = NULL;
                    ycut = NULL;

		}
		ar->Delete();
		delete ar;
	    }
	}
    } else {
	Error("readConfig()","Could not create config file!");
	return kFALSE;
    }
    input.close();
    return kTRUE;
}
*/


 hhistmap.cc:1
 hhistmap.cc:2
 hhistmap.cc:3
 hhistmap.cc:4
 hhistmap.cc:5
 hhistmap.cc:6
 hhistmap.cc:7
 hhistmap.cc:8
 hhistmap.cc:9
 hhistmap.cc:10
 hhistmap.cc:11
 hhistmap.cc:12
 hhistmap.cc:13
 hhistmap.cc:14
 hhistmap.cc:15
 hhistmap.cc:16
 hhistmap.cc:17
 hhistmap.cc:18
 hhistmap.cc:19
 hhistmap.cc:20
 hhistmap.cc:21
 hhistmap.cc:22
 hhistmap.cc:23
 hhistmap.cc:24
 hhistmap.cc:25
 hhistmap.cc:26
 hhistmap.cc:27
 hhistmap.cc:28
 hhistmap.cc:29
 hhistmap.cc:30
 hhistmap.cc:31
 hhistmap.cc:32
 hhistmap.cc:33
 hhistmap.cc:34
 hhistmap.cc:35
 hhistmap.cc:36
 hhistmap.cc:37
 hhistmap.cc:38
 hhistmap.cc:39
 hhistmap.cc:40
 hhistmap.cc:41
 hhistmap.cc:42
 hhistmap.cc:43
 hhistmap.cc:44
 hhistmap.cc:45
 hhistmap.cc:46
 hhistmap.cc:47
 hhistmap.cc:48
 hhistmap.cc:49
 hhistmap.cc:50
 hhistmap.cc:51
 hhistmap.cc:52
 hhistmap.cc:53
 hhistmap.cc:54
 hhistmap.cc:55
 hhistmap.cc:56
 hhistmap.cc:57
 hhistmap.cc:58
 hhistmap.cc:59
 hhistmap.cc:60
 hhistmap.cc:61
 hhistmap.cc:62
 hhistmap.cc:63
 hhistmap.cc:64
 hhistmap.cc:65
 hhistmap.cc:66
 hhistmap.cc:67
 hhistmap.cc:68
 hhistmap.cc:69
 hhistmap.cc:70
 hhistmap.cc:71
 hhistmap.cc:72
 hhistmap.cc:73
 hhistmap.cc:74
 hhistmap.cc:75
 hhistmap.cc:76
 hhistmap.cc:77
 hhistmap.cc:78
 hhistmap.cc:79
 hhistmap.cc:80
 hhistmap.cc:81
 hhistmap.cc:82
 hhistmap.cc:83
 hhistmap.cc:84
 hhistmap.cc:85
 hhistmap.cc:86
 hhistmap.cc:87
 hhistmap.cc:88
 hhistmap.cc:89
 hhistmap.cc:90
 hhistmap.cc:91
 hhistmap.cc:92
 hhistmap.cc:93
 hhistmap.cc:94
 hhistmap.cc:95
 hhistmap.cc:96
 hhistmap.cc:97
 hhistmap.cc:98
 hhistmap.cc:99
 hhistmap.cc:100
 hhistmap.cc:101
 hhistmap.cc:102
 hhistmap.cc:103
 hhistmap.cc:104
 hhistmap.cc:105
 hhistmap.cc:106
 hhistmap.cc:107
 hhistmap.cc:108
 hhistmap.cc:109
 hhistmap.cc:110
 hhistmap.cc:111
 hhistmap.cc:112
 hhistmap.cc:113
 hhistmap.cc:114
 hhistmap.cc:115
 hhistmap.cc:116
 hhistmap.cc:117
 hhistmap.cc:118
 hhistmap.cc:119
 hhistmap.cc:120
 hhistmap.cc:121
 hhistmap.cc:122
 hhistmap.cc:123
 hhistmap.cc:124
 hhistmap.cc:125
 hhistmap.cc:126
 hhistmap.cc:127
 hhistmap.cc:128
 hhistmap.cc:129
 hhistmap.cc:130
 hhistmap.cc:131
 hhistmap.cc:132
 hhistmap.cc:133
 hhistmap.cc:134
 hhistmap.cc:135
 hhistmap.cc:136
 hhistmap.cc:137
 hhistmap.cc:138
 hhistmap.cc:139
 hhistmap.cc:140
 hhistmap.cc:141
 hhistmap.cc:142
 hhistmap.cc:143
 hhistmap.cc:144
 hhistmap.cc:145
 hhistmap.cc:146
 hhistmap.cc:147
 hhistmap.cc:148
 hhistmap.cc:149
 hhistmap.cc:150
 hhistmap.cc:151
 hhistmap.cc:152
 hhistmap.cc:153
 hhistmap.cc:154
 hhistmap.cc:155
 hhistmap.cc:156
 hhistmap.cc:157
 hhistmap.cc:158
 hhistmap.cc:159
 hhistmap.cc:160
 hhistmap.cc:161
 hhistmap.cc:162
 hhistmap.cc:163
 hhistmap.cc:164
 hhistmap.cc:165
 hhistmap.cc:166
 hhistmap.cc:167
 hhistmap.cc:168
 hhistmap.cc:169
 hhistmap.cc:170
 hhistmap.cc:171
 hhistmap.cc:172
 hhistmap.cc:173
 hhistmap.cc:174
 hhistmap.cc:175
 hhistmap.cc:176
 hhistmap.cc:177
 hhistmap.cc:178
 hhistmap.cc:179
 hhistmap.cc:180
 hhistmap.cc:181
 hhistmap.cc:182
 hhistmap.cc:183
 hhistmap.cc:184
 hhistmap.cc:185
 hhistmap.cc:186
 hhistmap.cc:187
 hhistmap.cc:188
 hhistmap.cc:189
 hhistmap.cc:190
 hhistmap.cc:191
 hhistmap.cc:192
 hhistmap.cc:193
 hhistmap.cc:194
 hhistmap.cc:195
 hhistmap.cc:196
 hhistmap.cc:197
 hhistmap.cc:198
 hhistmap.cc:199
 hhistmap.cc:200
 hhistmap.cc:201
 hhistmap.cc:202
 hhistmap.cc:203
 hhistmap.cc:204
 hhistmap.cc:205
 hhistmap.cc:206
 hhistmap.cc:207
 hhistmap.cc:208
 hhistmap.cc:209
 hhistmap.cc:210
 hhistmap.cc:211
 hhistmap.cc:212
 hhistmap.cc:213
 hhistmap.cc:214
 hhistmap.cc:215
 hhistmap.cc:216
 hhistmap.cc:217
 hhistmap.cc:218
 hhistmap.cc:219
 hhistmap.cc:220
 hhistmap.cc:221
 hhistmap.cc:222
 hhistmap.cc:223
 hhistmap.cc:224
 hhistmap.cc:225
 hhistmap.cc:226
 hhistmap.cc:227
 hhistmap.cc:228
 hhistmap.cc:229
 hhistmap.cc:230
 hhistmap.cc:231
 hhistmap.cc:232
 hhistmap.cc:233
 hhistmap.cc:234
 hhistmap.cc:235
 hhistmap.cc:236
 hhistmap.cc:237
 hhistmap.cc:238
 hhistmap.cc:239
 hhistmap.cc:240
 hhistmap.cc:241
 hhistmap.cc:242
 hhistmap.cc:243
 hhistmap.cc:244
 hhistmap.cc:245
 hhistmap.cc:246
 hhistmap.cc:247
 hhistmap.cc:248
 hhistmap.cc:249
 hhistmap.cc:250
 hhistmap.cc:251
 hhistmap.cc:252
 hhistmap.cc:253
 hhistmap.cc:254
 hhistmap.cc:255
 hhistmap.cc:256
 hhistmap.cc:257
 hhistmap.cc:258
 hhistmap.cc:259
 hhistmap.cc:260
 hhistmap.cc:261
 hhistmap.cc:262
 hhistmap.cc:263
 hhistmap.cc:264
 hhistmap.cc:265
 hhistmap.cc:266
 hhistmap.cc:267
 hhistmap.cc:268
 hhistmap.cc:269
 hhistmap.cc:270
 hhistmap.cc:271
 hhistmap.cc:272
 hhistmap.cc:273
 hhistmap.cc:274
 hhistmap.cc:275
 hhistmap.cc:276
 hhistmap.cc:277
 hhistmap.cc:278
 hhistmap.cc:279
 hhistmap.cc:280
 hhistmap.cc:281
 hhistmap.cc:282
 hhistmap.cc:283
 hhistmap.cc:284
 hhistmap.cc:285
 hhistmap.cc:286
 hhistmap.cc:287
 hhistmap.cc:288
 hhistmap.cc:289
 hhistmap.cc:290
 hhistmap.cc:291
 hhistmap.cc:292
 hhistmap.cc:293
 hhistmap.cc:294
 hhistmap.cc:295
 hhistmap.cc:296
 hhistmap.cc:297
 hhistmap.cc:298
 hhistmap.cc:299
 hhistmap.cc:300
 hhistmap.cc:301
 hhistmap.cc:302
 hhistmap.cc:303
 hhistmap.cc:304
 hhistmap.cc:305
 hhistmap.cc:306
 hhistmap.cc:307
 hhistmap.cc:308
 hhistmap.cc:309
 hhistmap.cc:310
 hhistmap.cc:311
 hhistmap.cc:312
 hhistmap.cc:313
 hhistmap.cc:314
 hhistmap.cc:315
 hhistmap.cc:316
 hhistmap.cc:317
 hhistmap.cc:318
 hhistmap.cc:319
 hhistmap.cc:320
 hhistmap.cc:321
 hhistmap.cc:322
 hhistmap.cc:323
 hhistmap.cc:324
 hhistmap.cc:325
 hhistmap.cc:326
 hhistmap.cc:327
 hhistmap.cc:328
 hhistmap.cc:329
 hhistmap.cc:330
 hhistmap.cc:331
 hhistmap.cc:332
 hhistmap.cc:333
 hhistmap.cc:334
 hhistmap.cc:335
 hhistmap.cc:336
 hhistmap.cc:337
 hhistmap.cc:338
 hhistmap.cc:339
 hhistmap.cc:340
 hhistmap.cc:341
 hhistmap.cc:342
 hhistmap.cc:343
 hhistmap.cc:344
 hhistmap.cc:345
 hhistmap.cc:346
 hhistmap.cc:347
 hhistmap.cc:348
 hhistmap.cc:349
 hhistmap.cc:350
 hhistmap.cc:351
 hhistmap.cc:352
 hhistmap.cc:353
 hhistmap.cc:354
 hhistmap.cc:355
 hhistmap.cc:356
 hhistmap.cc:357
 hhistmap.cc:358
 hhistmap.cc:359
 hhistmap.cc:360
 hhistmap.cc:361
 hhistmap.cc:362
 hhistmap.cc:363
 hhistmap.cc:364
 hhistmap.cc:365
 hhistmap.cc:366
 hhistmap.cc:367
 hhistmap.cc:368
 hhistmap.cc:369
 hhistmap.cc:370
 hhistmap.cc:371
 hhistmap.cc:372
 hhistmap.cc:373
 hhistmap.cc:374
 hhistmap.cc:375
 hhistmap.cc:376
 hhistmap.cc:377
 hhistmap.cc:378
 hhistmap.cc:379
 hhistmap.cc:380
 hhistmap.cc:381
 hhistmap.cc:382
 hhistmap.cc:383
 hhistmap.cc:384
 hhistmap.cc:385
 hhistmap.cc:386
 hhistmap.cc:387
 hhistmap.cc:388
 hhistmap.cc:389
 hhistmap.cc:390
 hhistmap.cc:391
 hhistmap.cc:392
 hhistmap.cc:393
 hhistmap.cc:394
 hhistmap.cc:395
 hhistmap.cc:396
 hhistmap.cc:397
 hhistmap.cc:398
 hhistmap.cc:399
 hhistmap.cc:400
 hhistmap.cc:401
 hhistmap.cc:402
 hhistmap.cc:403
 hhistmap.cc:404
 hhistmap.cc:405
 hhistmap.cc:406
 hhistmap.cc:407
 hhistmap.cc:408
 hhistmap.cc:409
 hhistmap.cc:410
 hhistmap.cc:411
 hhistmap.cc:412
 hhistmap.cc:413
 hhistmap.cc:414
 hhistmap.cc:415
 hhistmap.cc:416
 hhistmap.cc:417
 hhistmap.cc:418
 hhistmap.cc:419
 hhistmap.cc:420
 hhistmap.cc:421
 hhistmap.cc:422
 hhistmap.cc:423
 hhistmap.cc:424
 hhistmap.cc:425
 hhistmap.cc:426
 hhistmap.cc:427
 hhistmap.cc:428
 hhistmap.cc:429
 hhistmap.cc:430
 hhistmap.cc:431
 hhistmap.cc:432
 hhistmap.cc:433
 hhistmap.cc:434
 hhistmap.cc:435
 hhistmap.cc:436
 hhistmap.cc:437
 hhistmap.cc:438
 hhistmap.cc:439
 hhistmap.cc:440
 hhistmap.cc:441
 hhistmap.cc:442
 hhistmap.cc:443
 hhistmap.cc:444
 hhistmap.cc:445
 hhistmap.cc:446
 hhistmap.cc:447
 hhistmap.cc:448
 hhistmap.cc:449
 hhistmap.cc:450
 hhistmap.cc:451
 hhistmap.cc:452
 hhistmap.cc:453
 hhistmap.cc:454
 hhistmap.cc:455
 hhistmap.cc:456
 hhistmap.cc:457
 hhistmap.cc:458
 hhistmap.cc:459
 hhistmap.cc:460
 hhistmap.cc:461
 hhistmap.cc:462
 hhistmap.cc:463
 hhistmap.cc:464
 hhistmap.cc:465
 hhistmap.cc:466
 hhistmap.cc:467
 hhistmap.cc:468
 hhistmap.cc:469
 hhistmap.cc:470
 hhistmap.cc:471
 hhistmap.cc:472
 hhistmap.cc:473
 hhistmap.cc:474
 hhistmap.cc:475
 hhistmap.cc:476
 hhistmap.cc:477
 hhistmap.cc:478
 hhistmap.cc:479
 hhistmap.cc:480
 hhistmap.cc:481
 hhistmap.cc:482
 hhistmap.cc:483
 hhistmap.cc:484
 hhistmap.cc:485
 hhistmap.cc:486
 hhistmap.cc:487
 hhistmap.cc:488
 hhistmap.cc:489
 hhistmap.cc:490
 hhistmap.cc:491
 hhistmap.cc:492
 hhistmap.cc:493
 hhistmap.cc:494
 hhistmap.cc:495
 hhistmap.cc:496
 hhistmap.cc:497
 hhistmap.cc:498
 hhistmap.cc:499
 hhistmap.cc:500
 hhistmap.cc:501
 hhistmap.cc:502
 hhistmap.cc:503
 hhistmap.cc:504
 hhistmap.cc:505
 hhistmap.cc:506
 hhistmap.cc:507
 hhistmap.cc:508
 hhistmap.cc:509
 hhistmap.cc:510
 hhistmap.cc:511
 hhistmap.cc:512
 hhistmap.cc:513
 hhistmap.cc:514
 hhistmap.cc:515
 hhistmap.cc:516
 hhistmap.cc:517
 hhistmap.cc:518
 hhistmap.cc:519
 hhistmap.cc:520
 hhistmap.cc:521
 hhistmap.cc:522
 hhistmap.cc:523
 hhistmap.cc:524
 hhistmap.cc:525
 hhistmap.cc:526
 hhistmap.cc:527
 hhistmap.cc:528
 hhistmap.cc:529
 hhistmap.cc:530
 hhistmap.cc:531
 hhistmap.cc:532
 hhistmap.cc:533
 hhistmap.cc:534
 hhistmap.cc:535
 hhistmap.cc:536
 hhistmap.cc:537
 hhistmap.cc:538
 hhistmap.cc:539
 hhistmap.cc:540
 hhistmap.cc:541
 hhistmap.cc:542
 hhistmap.cc:543
 hhistmap.cc:544
 hhistmap.cc:545
 hhistmap.cc:546
 hhistmap.cc:547
 hhistmap.cc:548
 hhistmap.cc:549
 hhistmap.cc:550
 hhistmap.cc:551
 hhistmap.cc:552
 hhistmap.cc:553
 hhistmap.cc:554
 hhistmap.cc:555
 hhistmap.cc:556
 hhistmap.cc:557
 hhistmap.cc:558
 hhistmap.cc:559
 hhistmap.cc:560
 hhistmap.cc:561
 hhistmap.cc:562
 hhistmap.cc:563
 hhistmap.cc:564
 hhistmap.cc:565
 hhistmap.cc:566
 hhistmap.cc:567
 hhistmap.cc:568
 hhistmap.cc:569
 hhistmap.cc:570
 hhistmap.cc:571
 hhistmap.cc:572
 hhistmap.cc:573
 hhistmap.cc:574
 hhistmap.cc:575
 hhistmap.cc:576
 hhistmap.cc:577
 hhistmap.cc:578
 hhistmap.cc:579
 hhistmap.cc:580
 hhistmap.cc:581
 hhistmap.cc:582
 hhistmap.cc:583
 hhistmap.cc:584
 hhistmap.cc:585
 hhistmap.cc:586
 hhistmap.cc:587
 hhistmap.cc:588
 hhistmap.cc:589
 hhistmap.cc:590
 hhistmap.cc:591
 hhistmap.cc:592
 hhistmap.cc:593
 hhistmap.cc:594
 hhistmap.cc:595
 hhistmap.cc:596
 hhistmap.cc:597
 hhistmap.cc:598
 hhistmap.cc:599
 hhistmap.cc:600
 hhistmap.cc:601
 hhistmap.cc:602
 hhistmap.cc:603
 hhistmap.cc:604
 hhistmap.cc:605
 hhistmap.cc:606
 hhistmap.cc:607
 hhistmap.cc:608
 hhistmap.cc:609
 hhistmap.cc:610
 hhistmap.cc:611
 hhistmap.cc:612
 hhistmap.cc:613
 hhistmap.cc:614
 hhistmap.cc:615
 hhistmap.cc:616
 hhistmap.cc:617
 hhistmap.cc:618
 hhistmap.cc:619
 hhistmap.cc:620
 hhistmap.cc:621
 hhistmap.cc:622
 hhistmap.cc:623
 hhistmap.cc:624
 hhistmap.cc:625
 hhistmap.cc:626
 hhistmap.cc:627
 hhistmap.cc:628
 hhistmap.cc:629
 hhistmap.cc:630
 hhistmap.cc:631
 hhistmap.cc:632
 hhistmap.cc:633
 hhistmap.cc:634
 hhistmap.cc:635
 hhistmap.cc:636
 hhistmap.cc:637
 hhistmap.cc:638
 hhistmap.cc:639
 hhistmap.cc:640
 hhistmap.cc:641
 hhistmap.cc:642
 hhistmap.cc:643
 hhistmap.cc:644
 hhistmap.cc:645
 hhistmap.cc:646
 hhistmap.cc:647
 hhistmap.cc:648
 hhistmap.cc:649
 hhistmap.cc:650
 hhistmap.cc:651
 hhistmap.cc:652
 hhistmap.cc:653
 hhistmap.cc:654
 hhistmap.cc:655
 hhistmap.cc:656
 hhistmap.cc:657
 hhistmap.cc:658
 hhistmap.cc:659
 hhistmap.cc:660
 hhistmap.cc:661
 hhistmap.cc:662
 hhistmap.cc:663
 hhistmap.cc:664
 hhistmap.cc:665
 hhistmap.cc:666
 hhistmap.cc:667
 hhistmap.cc:668
 hhistmap.cc:669
 hhistmap.cc:670
 hhistmap.cc:671
 hhistmap.cc:672
 hhistmap.cc:673
 hhistmap.cc:674
 hhistmap.cc:675
 hhistmap.cc:676
 hhistmap.cc:677
 hhistmap.cc:678
 hhistmap.cc:679
 hhistmap.cc:680
 hhistmap.cc:681
 hhistmap.cc:682
 hhistmap.cc:683
 hhistmap.cc:684
 hhistmap.cc:685
 hhistmap.cc:686
 hhistmap.cc:687
 hhistmap.cc:688
 hhistmap.cc:689
 hhistmap.cc:690
 hhistmap.cc:691
 hhistmap.cc:692
 hhistmap.cc:693
 hhistmap.cc:694
 hhistmap.cc:695
 hhistmap.cc:696
 hhistmap.cc:697
 hhistmap.cc:698
 hhistmap.cc:699
 hhistmap.cc:700
 hhistmap.cc:701
 hhistmap.cc:702
 hhistmap.cc:703
 hhistmap.cc:704
 hhistmap.cc:705
 hhistmap.cc:706
 hhistmap.cc:707
 hhistmap.cc:708
 hhistmap.cc:709
 hhistmap.cc:710
 hhistmap.cc:711
 hhistmap.cc:712
 hhistmap.cc:713
 hhistmap.cc:714
 hhistmap.cc:715
 hhistmap.cc:716
 hhistmap.cc:717
 hhistmap.cc:718
 hhistmap.cc:719
 hhistmap.cc:720
 hhistmap.cc:721
 hhistmap.cc:722
 hhistmap.cc:723
 hhistmap.cc:724
 hhistmap.cc:725
 hhistmap.cc:726
 hhistmap.cc:727
 hhistmap.cc:728
 hhistmap.cc:729
 hhistmap.cc:730
 hhistmap.cc:731
 hhistmap.cc:732
 hhistmap.cc:733
 hhistmap.cc:734
 hhistmap.cc:735
 hhistmap.cc:736
 hhistmap.cc:737
 hhistmap.cc:738
 hhistmap.cc:739
 hhistmap.cc:740
 hhistmap.cc:741
 hhistmap.cc:742
 hhistmap.cc:743
 hhistmap.cc:744
 hhistmap.cc:745
 hhistmap.cc:746
 hhistmap.cc:747
 hhistmap.cc:748
 hhistmap.cc:749
 hhistmap.cc:750
 hhistmap.cc:751
 hhistmap.cc:752
 hhistmap.cc:753
 hhistmap.cc:754
 hhistmap.cc:755
 hhistmap.cc:756
 hhistmap.cc:757
 hhistmap.cc:758
 hhistmap.cc:759
 hhistmap.cc:760
 hhistmap.cc:761
 hhistmap.cc:762
 hhistmap.cc:763
 hhistmap.cc:764
 hhistmap.cc:765
 hhistmap.cc:766
 hhistmap.cc:767
 hhistmap.cc:768
 hhistmap.cc:769
 hhistmap.cc:770
 hhistmap.cc:771
 hhistmap.cc:772
 hhistmap.cc:773
 hhistmap.cc:774
 hhistmap.cc:775
 hhistmap.cc:776
 hhistmap.cc:777
 hhistmap.cc:778
 hhistmap.cc:779
 hhistmap.cc:780
 hhistmap.cc:781
 hhistmap.cc:782
 hhistmap.cc:783
 hhistmap.cc:784
 hhistmap.cc:785
 hhistmap.cc:786
 hhistmap.cc:787
 hhistmap.cc:788
 hhistmap.cc:789
 hhistmap.cc:790
 hhistmap.cc:791
 hhistmap.cc:792
 hhistmap.cc:793
 hhistmap.cc:794
 hhistmap.cc:795
 hhistmap.cc:796
 hhistmap.cc:797
 hhistmap.cc:798
 hhistmap.cc:799
 hhistmap.cc:800
 hhistmap.cc:801
 hhistmap.cc:802
 hhistmap.cc:803
 hhistmap.cc:804
 hhistmap.cc:805
 hhistmap.cc:806
 hhistmap.cc:807
 hhistmap.cc:808
 hhistmap.cc:809
 hhistmap.cc:810
 hhistmap.cc:811
 hhistmap.cc:812
 hhistmap.cc:813
 hhistmap.cc:814
 hhistmap.cc:815
 hhistmap.cc:816
 hhistmap.cc:817
 hhistmap.cc:818
 hhistmap.cc:819
 hhistmap.cc:820
 hhistmap.cc:821
 hhistmap.cc:822
 hhistmap.cc:823
 hhistmap.cc:824
 hhistmap.cc:825
 hhistmap.cc:826
 hhistmap.cc:827
 hhistmap.cc:828
 hhistmap.cc:829
 hhistmap.cc:830
 hhistmap.cc:831
 hhistmap.cc:832
 hhistmap.cc:833
 hhistmap.cc:834
 hhistmap.cc:835
 hhistmap.cc:836
 hhistmap.cc:837
 hhistmap.cc:838
 hhistmap.cc:839
 hhistmap.cc:840
 hhistmap.cc:841
 hhistmap.cc:842
 hhistmap.cc:843
 hhistmap.cc:844
 hhistmap.cc:845
 hhistmap.cc:846
 hhistmap.cc:847
 hhistmap.cc:848
 hhistmap.cc:849
 hhistmap.cc:850
 hhistmap.cc:851
 hhistmap.cc:852
 hhistmap.cc:853
 hhistmap.cc:854
 hhistmap.cc:855
 hhistmap.cc:856
 hhistmap.cc:857
 hhistmap.cc:858
 hhistmap.cc:859
 hhistmap.cc:860
 hhistmap.cc:861
 hhistmap.cc:862
 hhistmap.cc:863
 hhistmap.cc:864
 hhistmap.cc:865
 hhistmap.cc:866
 hhistmap.cc:867
 hhistmap.cc:868
 hhistmap.cc:869
 hhistmap.cc:870
 hhistmap.cc:871
 hhistmap.cc:872
 hhistmap.cc:873
 hhistmap.cc:874
 hhistmap.cc:875
 hhistmap.cc:876
 hhistmap.cc:877
 hhistmap.cc:878
 hhistmap.cc:879
 hhistmap.cc:880
 hhistmap.cc:881
 hhistmap.cc:882
 hhistmap.cc:883
 hhistmap.cc:884
 hhistmap.cc:885
 hhistmap.cc:886
 hhistmap.cc:887
 hhistmap.cc:888
 hhistmap.cc:889
 hhistmap.cc:890
 hhistmap.cc:891
 hhistmap.cc:892
 hhistmap.cc:893
 hhistmap.cc:894
 hhistmap.cc:895
 hhistmap.cc:896
 hhistmap.cc:897
 hhistmap.cc:898
 hhistmap.cc:899
 hhistmap.cc:900
 hhistmap.cc:901
 hhistmap.cc:902
 hhistmap.cc:903
 hhistmap.cc:904
 hhistmap.cc:905
 hhistmap.cc:906
 hhistmap.cc:907
 hhistmap.cc:908
 hhistmap.cc:909
 hhistmap.cc:910
 hhistmap.cc:911
 hhistmap.cc:912
 hhistmap.cc:913
 hhistmap.cc:914
 hhistmap.cc:915
 hhistmap.cc:916
 hhistmap.cc:917
 hhistmap.cc:918
 hhistmap.cc:919
 hhistmap.cc:920
 hhistmap.cc:921
 hhistmap.cc:922
 hhistmap.cc:923
 hhistmap.cc:924
 hhistmap.cc:925
 hhistmap.cc:926
 hhistmap.cc:927
 hhistmap.cc:928
 hhistmap.cc:929
 hhistmap.cc:930
 hhistmap.cc:931
 hhistmap.cc:932
 hhistmap.cc:933
 hhistmap.cc:934
 hhistmap.cc:935
 hhistmap.cc:936
 hhistmap.cc:937
 hhistmap.cc:938
 hhistmap.cc:939
 hhistmap.cc:940
 hhistmap.cc:941
 hhistmap.cc:942
 hhistmap.cc:943
 hhistmap.cc:944
 hhistmap.cc:945
 hhistmap.cc:946
 hhistmap.cc:947
 hhistmap.cc:948
 hhistmap.cc:949
 hhistmap.cc:950
 hhistmap.cc:951
 hhistmap.cc:952
 hhistmap.cc:953
 hhistmap.cc:954
 hhistmap.cc:955
 hhistmap.cc:956
 hhistmap.cc:957
 hhistmap.cc:958
 hhistmap.cc:959
 hhistmap.cc:960
 hhistmap.cc:961
 hhistmap.cc:962
 hhistmap.cc:963
 hhistmap.cc:964
 hhistmap.cc:965
 hhistmap.cc:966
 hhistmap.cc:967
 hhistmap.cc:968
 hhistmap.cc:969
 hhistmap.cc:970
 hhistmap.cc:971
 hhistmap.cc:972
 hhistmap.cc:973
 hhistmap.cc:974
 hhistmap.cc:975
 hhistmap.cc:976
 hhistmap.cc:977
 hhistmap.cc:978
 hhistmap.cc:979
 hhistmap.cc:980
 hhistmap.cc:981
 hhistmap.cc:982
 hhistmap.cc:983
 hhistmap.cc:984
 hhistmap.cc:985
 hhistmap.cc:986
 hhistmap.cc:987
 hhistmap.cc:988
 hhistmap.cc:989
 hhistmap.cc:990
 hhistmap.cc:991
 hhistmap.cc:992
 hhistmap.cc:993
 hhistmap.cc:994
 hhistmap.cc:995
 hhistmap.cc:996
 hhistmap.cc:997
 hhistmap.cc:998
 hhistmap.cc:999
 hhistmap.cc:1000
 hhistmap.cc:1001
 hhistmap.cc:1002
 hhistmap.cc:1003
 hhistmap.cc:1004
 hhistmap.cc:1005
 hhistmap.cc:1006
 hhistmap.cc:1007
 hhistmap.cc:1008
 hhistmap.cc:1009
 hhistmap.cc:1010
 hhistmap.cc:1011
 hhistmap.cc:1012
 hhistmap.cc:1013
 hhistmap.cc:1014
 hhistmap.cc:1015
 hhistmap.cc:1016
 hhistmap.cc:1017
 hhistmap.cc:1018
 hhistmap.cc:1019
 hhistmap.cc:1020
 hhistmap.cc:1021
 hhistmap.cc:1022
 hhistmap.cc:1023
 hhistmap.cc:1024
 hhistmap.cc:1025
 hhistmap.cc:1026
 hhistmap.cc:1027
 hhistmap.cc:1028
 hhistmap.cc:1029
 hhistmap.cc:1030
 hhistmap.cc:1031
 hhistmap.cc:1032
 hhistmap.cc:1033
 hhistmap.cc:1034
 hhistmap.cc:1035
 hhistmap.cc:1036
 hhistmap.cc:1037
 hhistmap.cc:1038
 hhistmap.cc:1039
 hhistmap.cc:1040
 hhistmap.cc:1041
 hhistmap.cc:1042
 hhistmap.cc:1043
 hhistmap.cc:1044
 hhistmap.cc:1045
 hhistmap.cc:1046
 hhistmap.cc:1047
 hhistmap.cc:1048
 hhistmap.cc:1049
 hhistmap.cc:1050
 hhistmap.cc:1051
 hhistmap.cc:1052
 hhistmap.cc:1053
 hhistmap.cc:1054
 hhistmap.cc:1055
 hhistmap.cc:1056
 hhistmap.cc:1057
 hhistmap.cc:1058
 hhistmap.cc:1059
 hhistmap.cc:1060
 hhistmap.cc:1061
 hhistmap.cc:1062
 hhistmap.cc:1063
 hhistmap.cc:1064
 hhistmap.cc:1065
 hhistmap.cc:1066
 hhistmap.cc:1067
 hhistmap.cc:1068
 hhistmap.cc:1069
 hhistmap.cc:1070
 hhistmap.cc:1071
 hhistmap.cc:1072
 hhistmap.cc:1073
 hhistmap.cc:1074
 hhistmap.cc:1075
 hhistmap.cc:1076
 hhistmap.cc:1077
 hhistmap.cc:1078
 hhistmap.cc:1079
 hhistmap.cc:1080
 hhistmap.cc:1081
 hhistmap.cc:1082
 hhistmap.cc:1083
 hhistmap.cc:1084
 hhistmap.cc:1085
 hhistmap.cc:1086
 hhistmap.cc:1087
 hhistmap.cc:1088
 hhistmap.cc:1089
 hhistmap.cc:1090
 hhistmap.cc:1091
 hhistmap.cc:1092
 hhistmap.cc:1093
 hhistmap.cc:1094
 hhistmap.cc:1095
 hhistmap.cc:1096
 hhistmap.cc:1097
 hhistmap.cc:1098
 hhistmap.cc:1099
 hhistmap.cc:1100
 hhistmap.cc:1101
 hhistmap.cc:1102
 hhistmap.cc:1103
 hhistmap.cc:1104
 hhistmap.cc:1105
 hhistmap.cc:1106
 hhistmap.cc:1107
 hhistmap.cc:1108
 hhistmap.cc:1109
 hhistmap.cc:1110
 hhistmap.cc:1111
 hhistmap.cc:1112
 hhistmap.cc:1113
 hhistmap.cc:1114
 hhistmap.cc:1115
 hhistmap.cc:1116
 hhistmap.cc:1117
 hhistmap.cc:1118
 hhistmap.cc:1119
 hhistmap.cc:1120
 hhistmap.cc:1121
 hhistmap.cc:1122
 hhistmap.cc:1123
 hhistmap.cc:1124
 hhistmap.cc:1125
 hhistmap.cc:1126
 hhistmap.cc:1127
 hhistmap.cc:1128
 hhistmap.cc:1129
 hhistmap.cc:1130
 hhistmap.cc:1131
 hhistmap.cc:1132
 hhistmap.cc:1133
 hhistmap.cc:1134
 hhistmap.cc:1135
 hhistmap.cc:1136
 hhistmap.cc:1137
 hhistmap.cc:1138
 hhistmap.cc:1139
 hhistmap.cc:1140
 hhistmap.cc:1141
 hhistmap.cc:1142
 hhistmap.cc:1143
 hhistmap.cc:1144
 hhistmap.cc:1145
 hhistmap.cc:1146
 hhistmap.cc:1147
 hhistmap.cc:1148
 hhistmap.cc:1149
 hhistmap.cc:1150
 hhistmap.cc:1151
 hhistmap.cc:1152
 hhistmap.cc:1153
 hhistmap.cc:1154
 hhistmap.cc:1155
 hhistmap.cc:1156
 hhistmap.cc:1157
 hhistmap.cc:1158
 hhistmap.cc:1159
 hhistmap.cc:1160
 hhistmap.cc:1161
 hhistmap.cc:1162
 hhistmap.cc:1163
 hhistmap.cc:1164
 hhistmap.cc:1165
 hhistmap.cc:1166
 hhistmap.cc:1167
 hhistmap.cc:1168
 hhistmap.cc:1169
 hhistmap.cc:1170
 hhistmap.cc:1171
 hhistmap.cc:1172
 hhistmap.cc:1173
 hhistmap.cc:1174
 hhistmap.cc:1175
 hhistmap.cc:1176
 hhistmap.cc:1177
 hhistmap.cc:1178
 hhistmap.cc:1179
 hhistmap.cc:1180
 hhistmap.cc:1181
 hhistmap.cc:1182
 hhistmap.cc:1183
 hhistmap.cc:1184
 hhistmap.cc:1185
 hhistmap.cc:1186
 hhistmap.cc:1187
 hhistmap.cc:1188
 hhistmap.cc:1189
 hhistmap.cc:1190
 hhistmap.cc:1191
 hhistmap.cc:1192
 hhistmap.cc:1193
 hhistmap.cc:1194
 hhistmap.cc:1195
 hhistmap.cc:1196
 hhistmap.cc:1197
 hhistmap.cc:1198
 hhistmap.cc:1199
 hhistmap.cc:1200
 hhistmap.cc:1201
 hhistmap.cc:1202
 hhistmap.cc:1203
 hhistmap.cc:1204
 hhistmap.cc:1205
 hhistmap.cc:1206
 hhistmap.cc:1207
 hhistmap.cc:1208
 hhistmap.cc:1209
 hhistmap.cc:1210
 hhistmap.cc:1211
 hhistmap.cc:1212
 hhistmap.cc:1213
 hhistmap.cc:1214
 hhistmap.cc:1215
 hhistmap.cc:1216
 hhistmap.cc:1217
 hhistmap.cc:1218
 hhistmap.cc:1219
 hhistmap.cc:1220
 hhistmap.cc:1221
 hhistmap.cc:1222
 hhistmap.cc:1223
 hhistmap.cc:1224
 hhistmap.cc:1225
 hhistmap.cc:1226
 hhistmap.cc:1227
 hhistmap.cc:1228
 hhistmap.cc:1229
 hhistmap.cc:1230
 hhistmap.cc:1231
 hhistmap.cc:1232
 hhistmap.cc:1233
 hhistmap.cc:1234
 hhistmap.cc:1235
 hhistmap.cc:1236
 hhistmap.cc:1237
 hhistmap.cc:1238
 hhistmap.cc:1239
 hhistmap.cc:1240
 hhistmap.cc:1241
 hhistmap.cc:1242
 hhistmap.cc:1243
 hhistmap.cc:1244
 hhistmap.cc:1245
 hhistmap.cc:1246
 hhistmap.cc:1247
 hhistmap.cc:1248
 hhistmap.cc:1249
 hhistmap.cc:1250
 hhistmap.cc:1251
 hhistmap.cc:1252
 hhistmap.cc:1253
 hhistmap.cc:1254
 hhistmap.cc:1255
 hhistmap.cc:1256
 hhistmap.cc:1257
 hhistmap.cc:1258
 hhistmap.cc:1259
 hhistmap.cc:1260
 hhistmap.cc:1261
 hhistmap.cc:1262
 hhistmap.cc:1263
 hhistmap.cc:1264
 hhistmap.cc:1265
 hhistmap.cc:1266
 hhistmap.cc:1267
 hhistmap.cc:1268
 hhistmap.cc:1269
 hhistmap.cc:1270
 hhistmap.cc:1271
 hhistmap.cc:1272
 hhistmap.cc:1273
 hhistmap.cc:1274
 hhistmap.cc:1275
 hhistmap.cc:1276
 hhistmap.cc:1277
 hhistmap.cc:1278
 hhistmap.cc:1279
 hhistmap.cc:1280
 hhistmap.cc:1281
 hhistmap.cc:1282
 hhistmap.cc:1283
 hhistmap.cc:1284
 hhistmap.cc:1285
 hhistmap.cc:1286
 hhistmap.cc:1287
 hhistmap.cc:1288
 hhistmap.cc:1289
 hhistmap.cc:1290
 hhistmap.cc:1291
 hhistmap.cc:1292
 hhistmap.cc:1293
 hhistmap.cc:1294
 hhistmap.cc:1295
 hhistmap.cc:1296
 hhistmap.cc:1297
 hhistmap.cc:1298
 hhistmap.cc:1299
 hhistmap.cc:1300
 hhistmap.cc:1301
 hhistmap.cc:1302
 hhistmap.cc:1303
 hhistmap.cc:1304
 hhistmap.cc:1305
 hhistmap.cc:1306
 hhistmap.cc:1307
 hhistmap.cc:1308
 hhistmap.cc:1309
 hhistmap.cc:1310
 hhistmap.cc:1311
 hhistmap.cc:1312
 hhistmap.cc:1313
 hhistmap.cc:1314
 hhistmap.cc:1315
 hhistmap.cc:1316
 hhistmap.cc:1317
 hhistmap.cc:1318
 hhistmap.cc:1319
 hhistmap.cc:1320
 hhistmap.cc:1321
 hhistmap.cc:1322
 hhistmap.cc:1323
 hhistmap.cc:1324
 hhistmap.cc:1325
 hhistmap.cc:1326
 hhistmap.cc:1327
 hhistmap.cc:1328
 hhistmap.cc:1329
 hhistmap.cc:1330
 hhistmap.cc:1331
 hhistmap.cc:1332
 hhistmap.cc:1333
 hhistmap.cc:1334
 hhistmap.cc:1335
 hhistmap.cc:1336
 hhistmap.cc:1337
 hhistmap.cc:1338
 hhistmap.cc:1339
 hhistmap.cc:1340
 hhistmap.cc:1341
 hhistmap.cc:1342
 hhistmap.cc:1343
 hhistmap.cc:1344
 hhistmap.cc:1345
 hhistmap.cc:1346
 hhistmap.cc:1347
 hhistmap.cc:1348
 hhistmap.cc:1349
 hhistmap.cc:1350
 hhistmap.cc:1351
 hhistmap.cc:1352
 hhistmap.cc:1353
 hhistmap.cc:1354
 hhistmap.cc:1355
 hhistmap.cc:1356
 hhistmap.cc:1357
 hhistmap.cc:1358
 hhistmap.cc:1359
 hhistmap.cc:1360
 hhistmap.cc:1361
 hhistmap.cc:1362
 hhistmap.cc:1363
 hhistmap.cc:1364
 hhistmap.cc:1365
 hhistmap.cc:1366
 hhistmap.cc:1367
 hhistmap.cc:1368
 hhistmap.cc:1369
 hhistmap.cc:1370
 hhistmap.cc:1371
 hhistmap.cc:1372
 hhistmap.cc:1373
 hhistmap.cc:1374
 hhistmap.cc:1375
 hhistmap.cc:1376
 hhistmap.cc:1377
 hhistmap.cc:1378
 hhistmap.cc:1379
 hhistmap.cc:1380
 hhistmap.cc:1381
 hhistmap.cc:1382
 hhistmap.cc:1383
 hhistmap.cc:1384
 hhistmap.cc:1385
 hhistmap.cc:1386
 hhistmap.cc:1387
 hhistmap.cc:1388
 hhistmap.cc:1389
 hhistmap.cc:1390
 hhistmap.cc:1391
 hhistmap.cc:1392
 hhistmap.cc:1393
 hhistmap.cc:1394
 hhistmap.cc:1395
 hhistmap.cc:1396
 hhistmap.cc:1397
 hhistmap.cc:1398
 hhistmap.cc:1399
 hhistmap.cc:1400
 hhistmap.cc:1401
 hhistmap.cc:1402
 hhistmap.cc:1403
 hhistmap.cc:1404
 hhistmap.cc:1405
 hhistmap.cc:1406
 hhistmap.cc:1407
 hhistmap.cc:1408
 hhistmap.cc:1409
 hhistmap.cc:1410
 hhistmap.cc:1411
 hhistmap.cc:1412
 hhistmap.cc:1413
 hhistmap.cc:1414
 hhistmap.cc:1415
 hhistmap.cc:1416
 hhistmap.cc:1417
 hhistmap.cc:1418
 hhistmap.cc:1419
 hhistmap.cc:1420
 hhistmap.cc:1421
 hhistmap.cc:1422
 hhistmap.cc:1423
 hhistmap.cc:1424
 hhistmap.cc:1425
 hhistmap.cc:1426
 hhistmap.cc:1427
 hhistmap.cc:1428
 hhistmap.cc:1429
 hhistmap.cc:1430
 hhistmap.cc:1431
 hhistmap.cc:1432
 hhistmap.cc:1433
 hhistmap.cc:1434
 hhistmap.cc:1435
 hhistmap.cc:1436
 hhistmap.cc:1437
 hhistmap.cc:1438
 hhistmap.cc:1439
 hhistmap.cc:1440
 hhistmap.cc:1441
 hhistmap.cc:1442
 hhistmap.cc:1443
 hhistmap.cc:1444
 hhistmap.cc:1445
 hhistmap.cc:1446
 hhistmap.cc:1447
 hhistmap.cc:1448
 hhistmap.cc:1449
 hhistmap.cc:1450
 hhistmap.cc:1451
 hhistmap.cc:1452
 hhistmap.cc:1453
 hhistmap.cc:1454
 hhistmap.cc:1455
 hhistmap.cc:1456
 hhistmap.cc:1457
 hhistmap.cc:1458
 hhistmap.cc:1459
 hhistmap.cc:1460
 hhistmap.cc:1461
 hhistmap.cc:1462
 hhistmap.cc:1463
 hhistmap.cc:1464
 hhistmap.cc:1465
 hhistmap.cc:1466
 hhistmap.cc:1467
 hhistmap.cc:1468
 hhistmap.cc:1469
 hhistmap.cc:1470
 hhistmap.cc:1471
 hhistmap.cc:1472
 hhistmap.cc:1473
 hhistmap.cc:1474
 hhistmap.cc:1475
 hhistmap.cc:1476
 hhistmap.cc:1477
 hhistmap.cc:1478
 hhistmap.cc:1479
 hhistmap.cc:1480
 hhistmap.cc:1481
 hhistmap.cc:1482
 hhistmap.cc:1483
 hhistmap.cc:1484
 hhistmap.cc:1485
 hhistmap.cc:1486
 hhistmap.cc:1487
 hhistmap.cc:1488
 hhistmap.cc:1489
 hhistmap.cc:1490
 hhistmap.cc:1491
 hhistmap.cc:1492
 hhistmap.cc:1493
 hhistmap.cc:1494
 hhistmap.cc:1495
 hhistmap.cc:1496
 hhistmap.cc:1497
 hhistmap.cc:1498
 hhistmap.cc:1499
 hhistmap.cc:1500
 hhistmap.cc:1501
 hhistmap.cc:1502
 hhistmap.cc:1503
 hhistmap.cc:1504
 hhistmap.cc:1505
 hhistmap.cc:1506
 hhistmap.cc:1507
 hhistmap.cc:1508
 hhistmap.cc:1509
 hhistmap.cc:1510
 hhistmap.cc:1511
 hhistmap.cc:1512
 hhistmap.cc:1513
 hhistmap.cc:1514
 hhistmap.cc:1515
 hhistmap.cc:1516
 hhistmap.cc:1517
 hhistmap.cc:1518
 hhistmap.cc:1519
 hhistmap.cc:1520
 hhistmap.cc:1521
 hhistmap.cc:1522
 hhistmap.cc:1523
 hhistmap.cc:1524
 hhistmap.cc:1525
 hhistmap.cc:1526
 hhistmap.cc:1527
 hhistmap.cc:1528
 hhistmap.cc:1529
 hhistmap.cc:1530
 hhistmap.cc:1531
 hhistmap.cc:1532
 hhistmap.cc:1533
 hhistmap.cc:1534
 hhistmap.cc:1535
 hhistmap.cc:1536
 hhistmap.cc:1537
 hhistmap.cc:1538
 hhistmap.cc:1539
 hhistmap.cc:1540
 hhistmap.cc:1541
 hhistmap.cc:1542
 hhistmap.cc:1543
 hhistmap.cc:1544
 hhistmap.cc:1545
 hhistmap.cc:1546
 hhistmap.cc:1547
 hhistmap.cc:1548
 hhistmap.cc:1549
 hhistmap.cc:1550
 hhistmap.cc:1551
 hhistmap.cc:1552
 hhistmap.cc:1553
 hhistmap.cc:1554
 hhistmap.cc:1555
 hhistmap.cc:1556
 hhistmap.cc:1557
 hhistmap.cc:1558
 hhistmap.cc:1559
 hhistmap.cc:1560
 hhistmap.cc:1561
 hhistmap.cc:1562
 hhistmap.cc:1563
 hhistmap.cc:1564
 hhistmap.cc:1565
 hhistmap.cc:1566
 hhistmap.cc:1567
 hhistmap.cc:1568
 hhistmap.cc:1569
 hhistmap.cc:1570
 hhistmap.cc:1571
 hhistmap.cc:1572
 hhistmap.cc:1573
 hhistmap.cc:1574
 hhistmap.cc:1575
 hhistmap.cc:1576
 hhistmap.cc:1577
 hhistmap.cc:1578
 hhistmap.cc:1579
 hhistmap.cc:1580
 hhistmap.cc:1581
 hhistmap.cc:1582
 hhistmap.cc:1583
 hhistmap.cc:1584
 hhistmap.cc:1585
 hhistmap.cc:1586
 hhistmap.cc:1587
 hhistmap.cc:1588
 hhistmap.cc:1589
 hhistmap.cc:1590
 hhistmap.cc:1591
 hhistmap.cc:1592
 hhistmap.cc:1593
 hhistmap.cc:1594
 hhistmap.cc:1595
 hhistmap.cc:1596
 hhistmap.cc:1597
 hhistmap.cc:1598
 hhistmap.cc:1599
 hhistmap.cc:1600
 hhistmap.cc:1601
 hhistmap.cc:1602
 hhistmap.cc:1603
 hhistmap.cc:1604
 hhistmap.cc:1605
 hhistmap.cc:1606
 hhistmap.cc:1607
 hhistmap.cc:1608
 hhistmap.cc:1609
 hhistmap.cc:1610
 hhistmap.cc:1611
 hhistmap.cc:1612
 hhistmap.cc:1613
 hhistmap.cc:1614
 hhistmap.cc:1615
 hhistmap.cc:1616
 hhistmap.cc:1617
 hhistmap.cc:1618
 hhistmap.cc:1619
 hhistmap.cc:1620
 hhistmap.cc:1621
 hhistmap.cc:1622
 hhistmap.cc:1623
 hhistmap.cc:1624
 hhistmap.cc:1625
 hhistmap.cc:1626
 hhistmap.cc:1627
 hhistmap.cc:1628
 hhistmap.cc:1629
 hhistmap.cc:1630
 hhistmap.cc:1631
 hhistmap.cc:1632
 hhistmap.cc:1633
 hhistmap.cc:1634
 hhistmap.cc:1635
 hhistmap.cc:1636
 hhistmap.cc:1637
 hhistmap.cc:1638
 hhistmap.cc:1639
 hhistmap.cc:1640
 hhistmap.cc:1641
 hhistmap.cc:1642
 hhistmap.cc:1643
 hhistmap.cc:1644
 hhistmap.cc:1645
 hhistmap.cc:1646
 hhistmap.cc:1647
 hhistmap.cc:1648
 hhistmap.cc:1649
 hhistmap.cc:1650
 hhistmap.cc:1651
 hhistmap.cc:1652
 hhistmap.cc:1653
 hhistmap.cc:1654
 hhistmap.cc:1655
 hhistmap.cc:1656
 hhistmap.cc:1657
 hhistmap.cc:1658
 hhistmap.cc:1659
 hhistmap.cc:1660
 hhistmap.cc:1661
 hhistmap.cc:1662
 hhistmap.cc:1663
 hhistmap.cc:1664
 hhistmap.cc:1665
 hhistmap.cc:1666
 hhistmap.cc:1667
 hhistmap.cc:1668
 hhistmap.cc:1669
 hhistmap.cc:1670
 hhistmap.cc:1671
 hhistmap.cc:1672
 hhistmap.cc:1673
 hhistmap.cc:1674
 hhistmap.cc:1675
 hhistmap.cc:1676
 hhistmap.cc:1677
 hhistmap.cc:1678
 hhistmap.cc:1679
 hhistmap.cc:1680
 hhistmap.cc:1681
 hhistmap.cc:1682
 hhistmap.cc:1683
 hhistmap.cc:1684
 hhistmap.cc:1685
 hhistmap.cc:1686
 hhistmap.cc:1687
 hhistmap.cc:1688
 hhistmap.cc:1689
 hhistmap.cc:1690
 hhistmap.cc:1691
 hhistmap.cc:1692
 hhistmap.cc:1693
 hhistmap.cc:1694
 hhistmap.cc:1695
 hhistmap.cc:1696
 hhistmap.cc:1697
 hhistmap.cc:1698
 hhistmap.cc:1699
 hhistmap.cc:1700
 hhistmap.cc:1701
 hhistmap.cc:1702
 hhistmap.cc:1703
 hhistmap.cc:1704
 hhistmap.cc:1705
 hhistmap.cc:1706
 hhistmap.cc:1707
 hhistmap.cc:1708
 hhistmap.cc:1709
 hhistmap.cc:1710
 hhistmap.cc:1711
 hhistmap.cc:1712
 hhistmap.cc:1713
 hhistmap.cc:1714
 hhistmap.cc:1715
 hhistmap.cc:1716
 hhistmap.cc:1717
 hhistmap.cc:1718
 hhistmap.cc:1719
 hhistmap.cc:1720
 hhistmap.cc:1721
 hhistmap.cc:1722
 hhistmap.cc:1723
 hhistmap.cc:1724
 hhistmap.cc:1725
 hhistmap.cc:1726
 hhistmap.cc:1727
 hhistmap.cc:1728
 hhistmap.cc:1729
 hhistmap.cc:1730
 hhistmap.cc:1731
 hhistmap.cc:1732
 hhistmap.cc:1733
 hhistmap.cc:1734
 hhistmap.cc:1735
 hhistmap.cc:1736
 hhistmap.cc:1737
 hhistmap.cc:1738
 hhistmap.cc:1739
 hhistmap.cc:1740
 hhistmap.cc:1741
 hhistmap.cc:1742
 hhistmap.cc:1743
 hhistmap.cc:1744
 hhistmap.cc:1745
 hhistmap.cc:1746
 hhistmap.cc:1747
 hhistmap.cc:1748
 hhistmap.cc:1749
 hhistmap.cc:1750
 hhistmap.cc:1751
 hhistmap.cc:1752
 hhistmap.cc:1753
 hhistmap.cc:1754
 hhistmap.cc:1755
 hhistmap.cc:1756
 hhistmap.cc:1757
 hhistmap.cc:1758
 hhistmap.cc:1759
 hhistmap.cc:1760
 hhistmap.cc:1761
 hhistmap.cc:1762
 hhistmap.cc:1763
 hhistmap.cc:1764
 hhistmap.cc:1765
 hhistmap.cc:1766
 hhistmap.cc:1767
 hhistmap.cc:1768
 hhistmap.cc:1769
 hhistmap.cc:1770
 hhistmap.cc:1771
 hhistmap.cc:1772
 hhistmap.cc:1773
 hhistmap.cc:1774
 hhistmap.cc:1775
 hhistmap.cc:1776
 hhistmap.cc:1777
 hhistmap.cc:1778
 hhistmap.cc:1779
 hhistmap.cc:1780
 hhistmap.cc:1781
 hhistmap.cc:1782
 hhistmap.cc:1783
 hhistmap.cc:1784
 hhistmap.cc:1785
 hhistmap.cc:1786
 hhistmap.cc:1787
 hhistmap.cc:1788
 hhistmap.cc:1789
 hhistmap.cc:1790
 hhistmap.cc:1791
 hhistmap.cc:1792
 hhistmap.cc:1793
 hhistmap.cc:1794
 hhistmap.cc:1795
 hhistmap.cc:1796
 hhistmap.cc:1797
 hhistmap.cc:1798
 hhistmap.cc:1799
 hhistmap.cc:1800
 hhistmap.cc:1801
 hhistmap.cc:1802
 hhistmap.cc:1803
 hhistmap.cc:1804
 hhistmap.cc:1805
 hhistmap.cc:1806
 hhistmap.cc:1807
 hhistmap.cc:1808
 hhistmap.cc:1809
 hhistmap.cc:1810
 hhistmap.cc:1811
 hhistmap.cc:1812
 hhistmap.cc:1813
 hhistmap.cc:1814
 hhistmap.cc:1815
 hhistmap.cc:1816
 hhistmap.cc:1817
 hhistmap.cc:1818
 hhistmap.cc:1819
 hhistmap.cc:1820
 hhistmap.cc:1821
 hhistmap.cc:1822
 hhistmap.cc:1823
 hhistmap.cc:1824
 hhistmap.cc:1825
 hhistmap.cc:1826
 hhistmap.cc:1827
 hhistmap.cc:1828
 hhistmap.cc:1829
 hhistmap.cc:1830
 hhistmap.cc:1831
 hhistmap.cc:1832
 hhistmap.cc:1833
 hhistmap.cc:1834
 hhistmap.cc:1835
 hhistmap.cc:1836
 hhistmap.cc:1837
 hhistmap.cc:1838
 hhistmap.cc:1839
 hhistmap.cc:1840
 hhistmap.cc:1841
 hhistmap.cc:1842
 hhistmap.cc:1843
 hhistmap.cc:1844
 hhistmap.cc:1845
 hhistmap.cc:1846
 hhistmap.cc:1847
 hhistmap.cc:1848
 hhistmap.cc:1849
 hhistmap.cc:1850
 hhistmap.cc:1851
 hhistmap.cc:1852
 hhistmap.cc:1853
 hhistmap.cc:1854
 hhistmap.cc:1855
 hhistmap.cc:1856
 hhistmap.cc:1857
 hhistmap.cc:1858
 hhistmap.cc:1859
 hhistmap.cc:1860
 hhistmap.cc:1861
 hhistmap.cc:1862
 hhistmap.cc:1863
 hhistmap.cc:1864
 hhistmap.cc:1865
 hhistmap.cc:1866
 hhistmap.cc:1867
 hhistmap.cc:1868
 hhistmap.cc:1869
 hhistmap.cc:1870
 hhistmap.cc:1871
 hhistmap.cc:1872
 hhistmap.cc:1873
 hhistmap.cc:1874
 hhistmap.cc:1875
 hhistmap.cc:1876
 hhistmap.cc:1877
 hhistmap.cc:1878
 hhistmap.cc:1879
 hhistmap.cc:1880
 hhistmap.cc:1881
 hhistmap.cc:1882
 hhistmap.cc:1883
 hhistmap.cc:1884
 hhistmap.cc:1885
 hhistmap.cc:1886
 hhistmap.cc:1887
 hhistmap.cc:1888
 hhistmap.cc:1889
 hhistmap.cc:1890
 hhistmap.cc:1891
 hhistmap.cc:1892
 hhistmap.cc:1893
 hhistmap.cc:1894
 hhistmap.cc:1895
 hhistmap.cc:1896
 hhistmap.cc:1897
 hhistmap.cc:1898
 hhistmap.cc:1899
 hhistmap.cc:1900
 hhistmap.cc:1901
 hhistmap.cc:1902
 hhistmap.cc:1903
 hhistmap.cc:1904
 hhistmap.cc:1905
 hhistmap.cc:1906
 hhistmap.cc:1907
 hhistmap.cc:1908
 hhistmap.cc:1909
 hhistmap.cc:1910
 hhistmap.cc:1911
 hhistmap.cc:1912
 hhistmap.cc:1913
 hhistmap.cc:1914
 hhistmap.cc:1915
 hhistmap.cc:1916
 hhistmap.cc:1917
 hhistmap.cc:1918
 hhistmap.cc:1919
 hhistmap.cc:1920
 hhistmap.cc:1921
 hhistmap.cc:1922
 hhistmap.cc:1923
 hhistmap.cc:1924
 hhistmap.cc:1925
 hhistmap.cc:1926
 hhistmap.cc:1927
 hhistmap.cc:1928
 hhistmap.cc:1929
 hhistmap.cc:1930
 hhistmap.cc:1931
 hhistmap.cc:1932
 hhistmap.cc:1933
 hhistmap.cc:1934
 hhistmap.cc:1935
 hhistmap.cc:1936
 hhistmap.cc:1937
 hhistmap.cc:1938
 hhistmap.cc:1939
 hhistmap.cc:1940
 hhistmap.cc:1941
 hhistmap.cc:1942
 hhistmap.cc:1943
 hhistmap.cc:1944
 hhistmap.cc:1945
 hhistmap.cc:1946
 hhistmap.cc:1947
 hhistmap.cc:1948
 hhistmap.cc:1949
 hhistmap.cc:1950
 hhistmap.cc:1951
 hhistmap.cc:1952
 hhistmap.cc:1953
 hhistmap.cc:1954
 hhistmap.cc:1955
 hhistmap.cc:1956
 hhistmap.cc:1957
 hhistmap.cc:1958
 hhistmap.cc:1959
 hhistmap.cc:1960
 hhistmap.cc:1961
 hhistmap.cc:1962
 hhistmap.cc:1963
 hhistmap.cc:1964
 hhistmap.cc:1965
 hhistmap.cc:1966
 hhistmap.cc:1967
 hhistmap.cc:1968
 hhistmap.cc:1969
 hhistmap.cc:1970
 hhistmap.cc:1971
 hhistmap.cc:1972
 hhistmap.cc:1973
 hhistmap.cc:1974
 hhistmap.cc:1975
 hhistmap.cc:1976
 hhistmap.cc:1977
 hhistmap.cc:1978
 hhistmap.cc:1979
 hhistmap.cc:1980
 hhistmap.cc:1981
 hhistmap.cc:1982
 hhistmap.cc:1983
 hhistmap.cc:1984
 hhistmap.cc:1985
 hhistmap.cc:1986
 hhistmap.cc:1987
 hhistmap.cc:1988
 hhistmap.cc:1989
 hhistmap.cc:1990
 hhistmap.cc:1991
 hhistmap.cc:1992
 hhistmap.cc:1993
 hhistmap.cc:1994
 hhistmap.cc:1995
 hhistmap.cc:1996
 hhistmap.cc:1997
 hhistmap.cc:1998
 hhistmap.cc:1999
 hhistmap.cc:2000
 hhistmap.cc:2001
 hhistmap.cc:2002
 hhistmap.cc:2003
 hhistmap.cc:2004
 hhistmap.cc:2005
 hhistmap.cc:2006
 hhistmap.cc:2007
 hhistmap.cc:2008
 hhistmap.cc:2009
 hhistmap.cc:2010
 hhistmap.cc:2011
 hhistmap.cc:2012
 hhistmap.cc:2013
 hhistmap.cc:2014
 hhistmap.cc:2015
 hhistmap.cc:2016
 hhistmap.cc:2017
 hhistmap.cc:2018
 hhistmap.cc:2019
 hhistmap.cc:2020
 hhistmap.cc:2021
 hhistmap.cc:2022
 hhistmap.cc:2023
 hhistmap.cc:2024
 hhistmap.cc:2025
 hhistmap.cc:2026
 hhistmap.cc:2027
 hhistmap.cc:2028
 hhistmap.cc:2029
 hhistmap.cc:2030
 hhistmap.cc:2031
 hhistmap.cc:2032
 hhistmap.cc:2033
 hhistmap.cc:2034
 hhistmap.cc:2035
 hhistmap.cc:2036
 hhistmap.cc:2037
 hhistmap.cc:2038
 hhistmap.cc:2039
 hhistmap.cc:2040
 hhistmap.cc:2041
 hhistmap.cc:2042
 hhistmap.cc:2043
 hhistmap.cc:2044
 hhistmap.cc:2045
 hhistmap.cc:2046
 hhistmap.cc:2047
 hhistmap.cc:2048
 hhistmap.cc:2049
 hhistmap.cc:2050
 hhistmap.cc:2051
 hhistmap.cc:2052
 hhistmap.cc:2053
 hhistmap.cc:2054
 hhistmap.cc:2055
 hhistmap.cc:2056
 hhistmap.cc:2057
 hhistmap.cc:2058
 hhistmap.cc:2059
 hhistmap.cc:2060
 hhistmap.cc:2061
 hhistmap.cc:2062
 hhistmap.cc:2063
 hhistmap.cc:2064
 hhistmap.cc:2065
 hhistmap.cc:2066
 hhistmap.cc:2067
 hhistmap.cc:2068
 hhistmap.cc:2069
 hhistmap.cc:2070
 hhistmap.cc:2071
 hhistmap.cc:2072
 hhistmap.cc:2073
 hhistmap.cc:2074
 hhistmap.cc:2075
 hhistmap.cc:2076
 hhistmap.cc:2077
 hhistmap.cc:2078
 hhistmap.cc:2079
 hhistmap.cc:2080
 hhistmap.cc:2081
 hhistmap.cc:2082
 hhistmap.cc:2083
 hhistmap.cc:2084
 hhistmap.cc:2085
 hhistmap.cc:2086
 hhistmap.cc:2087
 hhistmap.cc:2088
 hhistmap.cc:2089
 hhistmap.cc:2090
 hhistmap.cc:2091
 hhistmap.cc:2092
 hhistmap.cc:2093
 hhistmap.cc:2094
 hhistmap.cc:2095
 hhistmap.cc:2096
 hhistmap.cc:2097
 hhistmap.cc:2098
 hhistmap.cc:2099
 hhistmap.cc:2100
 hhistmap.cc:2101
 hhistmap.cc:2102
 hhistmap.cc:2103
 hhistmap.cc:2104
 hhistmap.cc:2105
 hhistmap.cc:2106
 hhistmap.cc:2107
 hhistmap.cc:2108
 hhistmap.cc:2109
 hhistmap.cc:2110
 hhistmap.cc:2111
 hhistmap.cc:2112
 hhistmap.cc:2113
 hhistmap.cc:2114
 hhistmap.cc:2115
 hhistmap.cc:2116
 hhistmap.cc:2117
 hhistmap.cc:2118
 hhistmap.cc:2119
 hhistmap.cc:2120
 hhistmap.cc:2121
 hhistmap.cc:2122
 hhistmap.cc:2123
 hhistmap.cc:2124
 hhistmap.cc:2125
 hhistmap.cc:2126
 hhistmap.cc:2127
 hhistmap.cc:2128
 hhistmap.cc:2129
 hhistmap.cc:2130
 hhistmap.cc:2131
 hhistmap.cc:2132
 hhistmap.cc:2133
 hhistmap.cc:2134
 hhistmap.cc:2135
 hhistmap.cc:2136
 hhistmap.cc:2137
 hhistmap.cc:2138
 hhistmap.cc:2139
 hhistmap.cc:2140
 hhistmap.cc:2141
 hhistmap.cc:2142
 hhistmap.cc:2143
 hhistmap.cc:2144
 hhistmap.cc:2145
 hhistmap.cc:2146
 hhistmap.cc:2147
 hhistmap.cc:2148
 hhistmap.cc:2149
 hhistmap.cc:2150
 hhistmap.cc:2151
 hhistmap.cc:2152
 hhistmap.cc:2153
 hhistmap.cc:2154
 hhistmap.cc:2155
 hhistmap.cc:2156
 hhistmap.cc:2157
 hhistmap.cc:2158
 hhistmap.cc:2159
 hhistmap.cc:2160
 hhistmap.cc:2161
 hhistmap.cc:2162
 hhistmap.cc:2163
 hhistmap.cc:2164
 hhistmap.cc:2165
 hhistmap.cc:2166
 hhistmap.cc:2167
 hhistmap.cc:2168
 hhistmap.cc:2169
 hhistmap.cc:2170
 hhistmap.cc:2171
 hhistmap.cc:2172
 hhistmap.cc:2173
 hhistmap.cc:2174
 hhistmap.cc:2175
 hhistmap.cc:2176
 hhistmap.cc:2177
 hhistmap.cc:2178
 hhistmap.cc:2179
 hhistmap.cc:2180
 hhistmap.cc:2181
 hhistmap.cc:2182
 hhistmap.cc:2183
 hhistmap.cc:2184
 hhistmap.cc:2185
 hhistmap.cc:2186
 hhistmap.cc:2187
 hhistmap.cc:2188
 hhistmap.cc:2189
 hhistmap.cc:2190
 hhistmap.cc:2191
 hhistmap.cc:2192
 hhistmap.cc:2193
 hhistmap.cc:2194
 hhistmap.cc:2195
 hhistmap.cc:2196
 hhistmap.cc:2197
 hhistmap.cc:2198
 hhistmap.cc:2199
 hhistmap.cc:2200
 hhistmap.cc:2201
 hhistmap.cc:2202
 hhistmap.cc:2203
 hhistmap.cc:2204
 hhistmap.cc:2205
 hhistmap.cc:2206
 hhistmap.cc:2207
 hhistmap.cc:2208
 hhistmap.cc:2209
 hhistmap.cc:2210
 hhistmap.cc:2211
 hhistmap.cc:2212
 hhistmap.cc:2213
 hhistmap.cc:2214
 hhistmap.cc:2215
 hhistmap.cc:2216
 hhistmap.cc:2217
 hhistmap.cc:2218
 hhistmap.cc:2219
 hhistmap.cc:2220
 hhistmap.cc:2221
 hhistmap.cc:2222
 hhistmap.cc:2223
 hhistmap.cc:2224
 hhistmap.cc:2225
 hhistmap.cc:2226
 hhistmap.cc:2227
 hhistmap.cc:2228
 hhistmap.cc:2229
 hhistmap.cc:2230
 hhistmap.cc:2231
 hhistmap.cc:2232
 hhistmap.cc:2233
 hhistmap.cc:2234
 hhistmap.cc:2235
 hhistmap.cc:2236
 hhistmap.cc:2237
 hhistmap.cc:2238
 hhistmap.cc:2239
 hhistmap.cc:2240
 hhistmap.cc:2241
 hhistmap.cc:2242
 hhistmap.cc:2243
 hhistmap.cc:2244
 hhistmap.cc:2245
 hhistmap.cc:2246
 hhistmap.cc:2247
 hhistmap.cc:2248
 hhistmap.cc:2249
 hhistmap.cc:2250
 hhistmap.cc:2251
 hhistmap.cc:2252
 hhistmap.cc:2253
 hhistmap.cc:2254
 hhistmap.cc:2255
 hhistmap.cc:2256
 hhistmap.cc:2257
 hhistmap.cc:2258
 hhistmap.cc:2259
 hhistmap.cc:2260
 hhistmap.cc:2261
 hhistmap.cc:2262
 hhistmap.cc:2263
 hhistmap.cc:2264
 hhistmap.cc:2265
 hhistmap.cc:2266
 hhistmap.cc:2267
 hhistmap.cc:2268
 hhistmap.cc:2269
 hhistmap.cc:2270
 hhistmap.cc:2271
 hhistmap.cc:2272
 hhistmap.cc:2273
 hhistmap.cc:2274
 hhistmap.cc:2275
 hhistmap.cc:2276
 hhistmap.cc:2277
 hhistmap.cc:2278
 hhistmap.cc:2279
 hhistmap.cc:2280
 hhistmap.cc:2281
 hhistmap.cc:2282
 hhistmap.cc:2283
 hhistmap.cc:2284
 hhistmap.cc:2285
 hhistmap.cc:2286
 hhistmap.cc:2287
 hhistmap.cc:2288
 hhistmap.cc:2289
 hhistmap.cc:2290
 hhistmap.cc:2291
 hhistmap.cc:2292
 hhistmap.cc:2293
 hhistmap.cc:2294
 hhistmap.cc:2295
 hhistmap.cc:2296
 hhistmap.cc:2297
 hhistmap.cc:2298
 hhistmap.cc:2299
 hhistmap.cc:2300
 hhistmap.cc:2301
 hhistmap.cc:2302
 hhistmap.cc:2303
 hhistmap.cc:2304
 hhistmap.cc:2305
 hhistmap.cc:2306
 hhistmap.cc:2307
 hhistmap.cc:2308
 hhistmap.cc:2309
 hhistmap.cc:2310
 hhistmap.cc:2311
 hhistmap.cc:2312
 hhistmap.cc:2313
 hhistmap.cc:2314
 hhistmap.cc:2315
 hhistmap.cc:2316
 hhistmap.cc:2317
 hhistmap.cc:2318
 hhistmap.cc:2319
 hhistmap.cc:2320
 hhistmap.cc:2321
 hhistmap.cc:2322
 hhistmap.cc:2323
 hhistmap.cc:2324
 hhistmap.cc:2325
 hhistmap.cc:2326
 hhistmap.cc:2327
 hhistmap.cc:2328
 hhistmap.cc:2329
 hhistmap.cc:2330
 hhistmap.cc:2331
 hhistmap.cc:2332
 hhistmap.cc:2333
 hhistmap.cc:2334
 hhistmap.cc:2335
 hhistmap.cc:2336
 hhistmap.cc:2337
 hhistmap.cc:2338
 hhistmap.cc:2339
 hhistmap.cc:2340
 hhistmap.cc:2341
 hhistmap.cc:2342
 hhistmap.cc:2343
 hhistmap.cc:2344
 hhistmap.cc:2345
 hhistmap.cc:2346
 hhistmap.cc:2347
 hhistmap.cc:2348
 hhistmap.cc:2349
 hhistmap.cc:2350
 hhistmap.cc:2351
 hhistmap.cc:2352
 hhistmap.cc:2353
 hhistmap.cc:2354
 hhistmap.cc:2355
 hhistmap.cc:2356
 hhistmap.cc:2357
 hhistmap.cc:2358
 hhistmap.cc:2359
 hhistmap.cc:2360
 hhistmap.cc:2361
 hhistmap.cc:2362
 hhistmap.cc:2363
 hhistmap.cc:2364
 hhistmap.cc:2365
 hhistmap.cc:2366
 hhistmap.cc:2367
 hhistmap.cc:2368
 hhistmap.cc:2369
 hhistmap.cc:2370
 hhistmap.cc:2371
 hhistmap.cc:2372
 hhistmap.cc:2373
 hhistmap.cc:2374
 hhistmap.cc:2375
 hhistmap.cc:2376
 hhistmap.cc:2377
 hhistmap.cc:2378
 hhistmap.cc:2379
 hhistmap.cc:2380
 hhistmap.cc:2381
 hhistmap.cc:2382
 hhistmap.cc:2383
 hhistmap.cc:2384
 hhistmap.cc:2385
 hhistmap.cc:2386
 hhistmap.cc:2387
 hhistmap.cc:2388
 hhistmap.cc:2389
 hhistmap.cc:2390
 hhistmap.cc:2391
 hhistmap.cc:2392
 hhistmap.cc:2393
 hhistmap.cc:2394
 hhistmap.cc:2395
 hhistmap.cc:2396
 hhistmap.cc:2397
 hhistmap.cc:2398
 hhistmap.cc:2399
 hhistmap.cc:2400
 hhistmap.cc:2401
 hhistmap.cc:2402
 hhistmap.cc:2403
 hhistmap.cc:2404
 hhistmap.cc:2405
 hhistmap.cc:2406
 hhistmap.cc:2407
 hhistmap.cc:2408
 hhistmap.cc:2409
 hhistmap.cc:2410
 hhistmap.cc:2411
 hhistmap.cc:2412
 hhistmap.cc:2413
 hhistmap.cc:2414
 hhistmap.cc:2415
 hhistmap.cc:2416
 hhistmap.cc:2417
 hhistmap.cc:2418
 hhistmap.cc:2419
 hhistmap.cc:2420
 hhistmap.cc:2421
 hhistmap.cc:2422
 hhistmap.cc:2423
 hhistmap.cc:2424
 hhistmap.cc:2425
 hhistmap.cc:2426
 hhistmap.cc:2427
 hhistmap.cc:2428
 hhistmap.cc:2429
 hhistmap.cc:2430
 hhistmap.cc:2431
 hhistmap.cc:2432
 hhistmap.cc:2433
 hhistmap.cc:2434
 hhistmap.cc:2435
 hhistmap.cc:2436
 hhistmap.cc:2437
 hhistmap.cc:2438
 hhistmap.cc:2439
 hhistmap.cc:2440
 hhistmap.cc:2441
 hhistmap.cc:2442
 hhistmap.cc:2443
 hhistmap.cc:2444
 hhistmap.cc:2445
 hhistmap.cc:2446
 hhistmap.cc:2447
 hhistmap.cc:2448
 hhistmap.cc:2449
 hhistmap.cc:2450
 hhistmap.cc:2451
 hhistmap.cc:2452
 hhistmap.cc:2453
 hhistmap.cc:2454
 hhistmap.cc:2455
 hhistmap.cc:2456
 hhistmap.cc:2457
 hhistmap.cc:2458
 hhistmap.cc:2459
 hhistmap.cc:2460
 hhistmap.cc:2461
 hhistmap.cc:2462
 hhistmap.cc:2463
 hhistmap.cc:2464
 hhistmap.cc:2465
 hhistmap.cc:2466
 hhistmap.cc:2467
 hhistmap.cc:2468
 hhistmap.cc:2469
 hhistmap.cc:2470
 hhistmap.cc:2471
 hhistmap.cc:2472
 hhistmap.cc:2473
 hhistmap.cc:2474
 hhistmap.cc:2475
 hhistmap.cc:2476
 hhistmap.cc:2477
 hhistmap.cc:2478
 hhistmap.cc:2479
 hhistmap.cc:2480
 hhistmap.cc:2481
 hhistmap.cc:2482
 hhistmap.cc:2483
 hhistmap.cc:2484
 hhistmap.cc:2485
 hhistmap.cc:2486
 hhistmap.cc:2487
 hhistmap.cc:2488
 hhistmap.cc:2489
 hhistmap.cc:2490
 hhistmap.cc:2491
 hhistmap.cc:2492
 hhistmap.cc:2493
 hhistmap.cc:2494
 hhistmap.cc:2495
 hhistmap.cc:2496
 hhistmap.cc:2497
 hhistmap.cc:2498
 hhistmap.cc:2499
 hhistmap.cc:2500
 hhistmap.cc:2501
 hhistmap.cc:2502
 hhistmap.cc:2503
 hhistmap.cc:2504
 hhistmap.cc:2505
 hhistmap.cc:2506
 hhistmap.cc:2507
 hhistmap.cc:2508
 hhistmap.cc:2509
 hhistmap.cc:2510
 hhistmap.cc:2511
 hhistmap.cc:2512
 hhistmap.cc:2513
 hhistmap.cc:2514
 hhistmap.cc:2515
 hhistmap.cc:2516
 hhistmap.cc:2517
 hhistmap.cc:2518
 hhistmap.cc:2519
 hhistmap.cc:2520
 hhistmap.cc:2521
 hhistmap.cc:2522
 hhistmap.cc:2523
 hhistmap.cc:2524
 hhistmap.cc:2525
 hhistmap.cc:2526
 hhistmap.cc:2527
 hhistmap.cc:2528
 hhistmap.cc:2529
 hhistmap.cc:2530
 hhistmap.cc:2531
 hhistmap.cc:2532
 hhistmap.cc:2533
 hhistmap.cc:2534
 hhistmap.cc:2535
 hhistmap.cc:2536
 hhistmap.cc:2537
 hhistmap.cc:2538
 hhistmap.cc:2539
 hhistmap.cc:2540
 hhistmap.cc:2541
 hhistmap.cc:2542
 hhistmap.cc:2543
 hhistmap.cc:2544
 hhistmap.cc:2545
 hhistmap.cc:2546
 hhistmap.cc:2547
 hhistmap.cc:2548
 hhistmap.cc:2549
 hhistmap.cc:2550
 hhistmap.cc:2551
 hhistmap.cc:2552
 hhistmap.cc:2553
 hhistmap.cc:2554
 hhistmap.cc:2555
 hhistmap.cc:2556
 hhistmap.cc:2557
 hhistmap.cc:2558
 hhistmap.cc:2559
 hhistmap.cc:2560
 hhistmap.cc:2561
 hhistmap.cc:2562
 hhistmap.cc:2563
 hhistmap.cc:2564
 hhistmap.cc:2565
 hhistmap.cc:2566
 hhistmap.cc:2567
 hhistmap.cc:2568
 hhistmap.cc:2569
 hhistmap.cc:2570
 hhistmap.cc:2571
 hhistmap.cc:2572
 hhistmap.cc:2573
 hhistmap.cc:2574
 hhistmap.cc:2575
 hhistmap.cc:2576
 hhistmap.cc:2577
 hhistmap.cc:2578
 hhistmap.cc:2579
 hhistmap.cc:2580
 hhistmap.cc:2581
 hhistmap.cc:2582
 hhistmap.cc:2583
 hhistmap.cc:2584
 hhistmap.cc:2585
 hhistmap.cc:2586
 hhistmap.cc:2587
 hhistmap.cc:2588
 hhistmap.cc:2589
 hhistmap.cc:2590
 hhistmap.cc:2591
 hhistmap.cc:2592
 hhistmap.cc:2593
 hhistmap.cc:2594
 hhistmap.cc:2595
 hhistmap.cc:2596
 hhistmap.cc:2597
 hhistmap.cc:2598
 hhistmap.cc:2599
 hhistmap.cc:2600
 hhistmap.cc:2601
 hhistmap.cc:2602
 hhistmap.cc:2603
 hhistmap.cc:2604
 hhistmap.cc:2605
 hhistmap.cc:2606
 hhistmap.cc:2607
 hhistmap.cc:2608
 hhistmap.cc:2609
 hhistmap.cc:2610
 hhistmap.cc:2611
 hhistmap.cc:2612
 hhistmap.cc:2613
 hhistmap.cc:2614
 hhistmap.cc:2615
 hhistmap.cc:2616
 hhistmap.cc:2617
 hhistmap.cc:2618
 hhistmap.cc:2619
 hhistmap.cc:2620
 hhistmap.cc:2621
 hhistmap.cc:2622
 hhistmap.cc:2623
 hhistmap.cc:2624
 hhistmap.cc:2625
 hhistmap.cc:2626
 hhistmap.cc:2627
 hhistmap.cc:2628
 hhistmap.cc:2629
 hhistmap.cc:2630
 hhistmap.cc:2631
 hhistmap.cc:2632
 hhistmap.cc:2633
 hhistmap.cc:2634
 hhistmap.cc:2635
 hhistmap.cc:2636
 hhistmap.cc:2637
 hhistmap.cc:2638
 hhistmap.cc:2639
 hhistmap.cc:2640
 hhistmap.cc:2641
 hhistmap.cc:2642
 hhistmap.cc:2643
 hhistmap.cc:2644
 hhistmap.cc:2645
 hhistmap.cc:2646
 hhistmap.cc:2647
 hhistmap.cc:2648
 hhistmap.cc:2649
 hhistmap.cc:2650
 hhistmap.cc:2651
 hhistmap.cc:2652
 hhistmap.cc:2653
 hhistmap.cc:2654
 hhistmap.cc:2655
 hhistmap.cc:2656
 hhistmap.cc:2657
 hhistmap.cc:2658
 hhistmap.cc:2659
 hhistmap.cc:2660
 hhistmap.cc:2661
 hhistmap.cc:2662
 hhistmap.cc:2663
 hhistmap.cc:2664
 hhistmap.cc:2665
 hhistmap.cc:2666
 hhistmap.cc:2667
 hhistmap.cc:2668
 hhistmap.cc:2669
 hhistmap.cc:2670
 hhistmap.cc:2671
 hhistmap.cc:2672
 hhistmap.cc:2673
 hhistmap.cc:2674
 hhistmap.cc:2675
 hhistmap.cc:2676
 hhistmap.cc:2677
 hhistmap.cc:2678
 hhistmap.cc:2679
 hhistmap.cc:2680
 hhistmap.cc:2681
 hhistmap.cc:2682
 hhistmap.cc:2683
 hhistmap.cc:2684
 hhistmap.cc:2685
 hhistmap.cc:2686
 hhistmap.cc:2687
 hhistmap.cc:2688
 hhistmap.cc:2689
 hhistmap.cc:2690
 hhistmap.cc:2691
 hhistmap.cc:2692
 hhistmap.cc:2693
 hhistmap.cc:2694
 hhistmap.cc:2695
 hhistmap.cc:2696
 hhistmap.cc:2697
 hhistmap.cc:2698
 hhistmap.cc:2699
 hhistmap.cc:2700
 hhistmap.cc:2701
 hhistmap.cc:2702
 hhistmap.cc:2703
 hhistmap.cc:2704
 hhistmap.cc:2705
 hhistmap.cc:2706
 hhistmap.cc:2707
 hhistmap.cc:2708
 hhistmap.cc:2709
 hhistmap.cc:2710
 hhistmap.cc:2711
 hhistmap.cc:2712
 hhistmap.cc:2713
 hhistmap.cc:2714
 hhistmap.cc:2715
 hhistmap.cc:2716
 hhistmap.cc:2717
 hhistmap.cc:2718
 hhistmap.cc:2719
 hhistmap.cc:2720
 hhistmap.cc:2721
 hhistmap.cc:2722
 hhistmap.cc:2723
 hhistmap.cc:2724
 hhistmap.cc:2725
 hhistmap.cc:2726
 hhistmap.cc:2727
 hhistmap.cc:2728
 hhistmap.cc:2729
 hhistmap.cc:2730
 hhistmap.cc:2731
 hhistmap.cc:2732
 hhistmap.cc:2733
 hhistmap.cc:2734
 hhistmap.cc:2735
 hhistmap.cc:2736
 hhistmap.cc:2737
 hhistmap.cc:2738
 hhistmap.cc:2739
 hhistmap.cc:2740
 hhistmap.cc:2741
 hhistmap.cc:2742
 hhistmap.cc:2743
 hhistmap.cc:2744
 hhistmap.cc:2745
 hhistmap.cc:2746
 hhistmap.cc:2747
 hhistmap.cc:2748
 hhistmap.cc:2749
 hhistmap.cc:2750
 hhistmap.cc:2751
 hhistmap.cc:2752
 hhistmap.cc:2753
 hhistmap.cc:2754
 hhistmap.cc:2755
 hhistmap.cc:2756
 hhistmap.cc:2757
 hhistmap.cc:2758
 hhistmap.cc:2759
 hhistmap.cc:2760
 hhistmap.cc:2761
 hhistmap.cc:2762
 hhistmap.cc:2763
 hhistmap.cc:2764
 hhistmap.cc:2765
 hhistmap.cc:2766
 hhistmap.cc:2767
 hhistmap.cc:2768
 hhistmap.cc:2769
 hhistmap.cc:2770
 hhistmap.cc:2771
 hhistmap.cc:2772
 hhistmap.cc:2773
 hhistmap.cc:2774
 hhistmap.cc:2775
 hhistmap.cc:2776
 hhistmap.cc:2777
 hhistmap.cc:2778
 hhistmap.cc:2779
 hhistmap.cc:2780
 hhistmap.cc:2781
 hhistmap.cc:2782
 hhistmap.cc:2783
 hhistmap.cc:2784
 hhistmap.cc:2785
 hhistmap.cc:2786
 hhistmap.cc:2787
 hhistmap.cc:2788
 hhistmap.cc:2789
 hhistmap.cc:2790
 hhistmap.cc:2791
 hhistmap.cc:2792
 hhistmap.cc:2793
 hhistmap.cc:2794
 hhistmap.cc:2795
 hhistmap.cc:2796
 hhistmap.cc:2797
 hhistmap.cc:2798
 hhistmap.cc:2799
 hhistmap.cc:2800
 hhistmap.cc:2801
 hhistmap.cc:2802
 hhistmap.cc:2803
 hhistmap.cc:2804
 hhistmap.cc:2805
 hhistmap.cc:2806
 hhistmap.cc:2807
 hhistmap.cc:2808
 hhistmap.cc:2809
 hhistmap.cc:2810
 hhistmap.cc:2811
 hhistmap.cc:2812
 hhistmap.cc:2813
 hhistmap.cc:2814
 hhistmap.cc:2815
 hhistmap.cc:2816
 hhistmap.cc:2817
 hhistmap.cc:2818
 hhistmap.cc:2819
 hhistmap.cc:2820
 hhistmap.cc:2821
 hhistmap.cc:2822
 hhistmap.cc:2823
 hhistmap.cc:2824
 hhistmap.cc:2825
 hhistmap.cc:2826
 hhistmap.cc:2827
 hhistmap.cc:2828
 hhistmap.cc:2829
 hhistmap.cc:2830
 hhistmap.cc:2831
 hhistmap.cc:2832
 hhistmap.cc:2833
 hhistmap.cc:2834
 hhistmap.cc:2835
 hhistmap.cc:2836
 hhistmap.cc:2837
 hhistmap.cc:2838
 hhistmap.cc:2839
 hhistmap.cc:2840
 hhistmap.cc:2841
 hhistmap.cc:2842
 hhistmap.cc:2843
 hhistmap.cc:2844
 hhistmap.cc:2845
 hhistmap.cc:2846
 hhistmap.cc:2847
 hhistmap.cc:2848
 hhistmap.cc:2849
 hhistmap.cc:2850
 hhistmap.cc:2851
 hhistmap.cc:2852
 hhistmap.cc:2853
 hhistmap.cc:2854
 hhistmap.cc:2855
 hhistmap.cc:2856
 hhistmap.cc:2857
 hhistmap.cc:2858
 hhistmap.cc:2859
 hhistmap.cc:2860
 hhistmap.cc:2861
 hhistmap.cc:2862
 hhistmap.cc:2863
 hhistmap.cc:2864
 hhistmap.cc:2865
 hhistmap.cc:2866
 hhistmap.cc:2867
 hhistmap.cc:2868
 hhistmap.cc:2869
 hhistmap.cc:2870
 hhistmap.cc:2871
 hhistmap.cc:2872
 hhistmap.cc:2873
 hhistmap.cc:2874
 hhistmap.cc:2875
 hhistmap.cc:2876
 hhistmap.cc:2877
 hhistmap.cc:2878
 hhistmap.cc:2879
 hhistmap.cc:2880
 hhistmap.cc:2881
 hhistmap.cc:2882
 hhistmap.cc:2883
 hhistmap.cc:2884
 hhistmap.cc:2885
 hhistmap.cc:2886
 hhistmap.cc:2887
 hhistmap.cc:2888
 hhistmap.cc:2889
 hhistmap.cc:2890
 hhistmap.cc:2891
 hhistmap.cc:2892
 hhistmap.cc:2893
 hhistmap.cc:2894
 hhistmap.cc:2895
 hhistmap.cc:2896
 hhistmap.cc:2897
 hhistmap.cc:2898
 hhistmap.cc:2899
 hhistmap.cc:2900
 hhistmap.cc:2901
 hhistmap.cc:2902
 hhistmap.cc:2903
 hhistmap.cc:2904
 hhistmap.cc:2905
 hhistmap.cc:2906
 hhistmap.cc:2907
 hhistmap.cc:2908
 hhistmap.cc:2909
 hhistmap.cc:2910
 hhistmap.cc:2911
 hhistmap.cc:2912
 hhistmap.cc:2913
 hhistmap.cc:2914
 hhistmap.cc:2915
 hhistmap.cc:2916
 hhistmap.cc:2917
 hhistmap.cc:2918
 hhistmap.cc:2919
 hhistmap.cc:2920
 hhistmap.cc:2921
 hhistmap.cc:2922
 hhistmap.cc:2923
 hhistmap.cc:2924
 hhistmap.cc:2925
 hhistmap.cc:2926
 hhistmap.cc:2927
 hhistmap.cc:2928
 hhistmap.cc:2929
 hhistmap.cc:2930
 hhistmap.cc:2931
 hhistmap.cc:2932
 hhistmap.cc:2933
 hhistmap.cc:2934
 hhistmap.cc:2935
 hhistmap.cc:2936
 hhistmap.cc:2937
 hhistmap.cc:2938
 hhistmap.cc:2939
 hhistmap.cc:2940
 hhistmap.cc:2941
 hhistmap.cc:2942
 hhistmap.cc:2943
 hhistmap.cc:2944
 hhistmap.cc:2945
 hhistmap.cc:2946
 hhistmap.cc:2947
 hhistmap.cc:2948
 hhistmap.cc:2949
 hhistmap.cc:2950
 hhistmap.cc:2951
 hhistmap.cc:2952
 hhistmap.cc:2953
 hhistmap.cc:2954
 hhistmap.cc:2955
 hhistmap.cc:2956
 hhistmap.cc:2957
 hhistmap.cc:2958
 hhistmap.cc:2959
 hhistmap.cc:2960
 hhistmap.cc:2961
 hhistmap.cc:2962
 hhistmap.cc:2963
 hhistmap.cc:2964
 hhistmap.cc:2965
 hhistmap.cc:2966
 hhistmap.cc:2967
 hhistmap.cc:2968
 hhistmap.cc:2969
 hhistmap.cc:2970
 hhistmap.cc:2971
 hhistmap.cc:2972
 hhistmap.cc:2973
 hhistmap.cc:2974
 hhistmap.cc:2975
 hhistmap.cc:2976
 hhistmap.cc:2977
 hhistmap.cc:2978
 hhistmap.cc:2979
 hhistmap.cc:2980
 hhistmap.cc:2981
 hhistmap.cc:2982
 hhistmap.cc:2983
 hhistmap.cc:2984
 hhistmap.cc:2985
 hhistmap.cc:2986
 hhistmap.cc:2987
 hhistmap.cc:2988
 hhistmap.cc:2989
 hhistmap.cc:2990
 hhistmap.cc:2991
 hhistmap.cc:2992
 hhistmap.cc:2993
 hhistmap.cc:2994
 hhistmap.cc:2995
 hhistmap.cc:2996
 hhistmap.cc:2997
 hhistmap.cc:2998
 hhistmap.cc:2999
 hhistmap.cc:3000
 hhistmap.cc:3001
 hhistmap.cc:3002
 hhistmap.cc:3003
 hhistmap.cc:3004
 hhistmap.cc:3005
 hhistmap.cc:3006
 hhistmap.cc:3007
 hhistmap.cc:3008
 hhistmap.cc:3009
 hhistmap.cc:3010
 hhistmap.cc:3011
 hhistmap.cc:3012
 hhistmap.cc:3013
 hhistmap.cc:3014
 hhistmap.cc:3015
 hhistmap.cc:3016
 hhistmap.cc:3017
 hhistmap.cc:3018
 hhistmap.cc:3019
 hhistmap.cc:3020
 hhistmap.cc:3021
 hhistmap.cc:3022
 hhistmap.cc:3023
 hhistmap.cc:3024
 hhistmap.cc:3025
 hhistmap.cc:3026
 hhistmap.cc:3027
 hhistmap.cc:3028
 hhistmap.cc:3029
 hhistmap.cc:3030
 hhistmap.cc:3031
 hhistmap.cc:3032
 hhistmap.cc:3033
 hhistmap.cc:3034
 hhistmap.cc:3035
 hhistmap.cc:3036
 hhistmap.cc:3037
 hhistmap.cc:3038
 hhistmap.cc:3039
 hhistmap.cc:3040
 hhistmap.cc:3041
 hhistmap.cc:3042
 hhistmap.cc:3043
 hhistmap.cc:3044
 hhistmap.cc:3045
 hhistmap.cc:3046
 hhistmap.cc:3047
 hhistmap.cc:3048
 hhistmap.cc:3049
 hhistmap.cc:3050
 hhistmap.cc:3051
 hhistmap.cc:3052
 hhistmap.cc:3053
 hhistmap.cc:3054
 hhistmap.cc:3055
 hhistmap.cc:3056
 hhistmap.cc:3057
 hhistmap.cc:3058
 hhistmap.cc:3059
 hhistmap.cc:3060
 hhistmap.cc:3061
 hhistmap.cc:3062
 hhistmap.cc:3063
 hhistmap.cc:3064
 hhistmap.cc:3065
 hhistmap.cc:3066
 hhistmap.cc:3067
 hhistmap.cc:3068
 hhistmap.cc:3069
 hhistmap.cc:3070
 hhistmap.cc:3071
 hhistmap.cc:3072
 hhistmap.cc:3073
 hhistmap.cc:3074
 hhistmap.cc:3075
 hhistmap.cc:3076
 hhistmap.cc:3077
 hhistmap.cc:3078
 hhistmap.cc:3079
 hhistmap.cc:3080
 hhistmap.cc:3081
 hhistmap.cc:3082
 hhistmap.cc:3083
 hhistmap.cc:3084
 hhistmap.cc:3085
 hhistmap.cc:3086
 hhistmap.cc:3087
 hhistmap.cc:3088
 hhistmap.cc:3089
 hhistmap.cc:3090
 hhistmap.cc:3091
 hhistmap.cc:3092
 hhistmap.cc:3093
 hhistmap.cc:3094
 hhistmap.cc:3095
 hhistmap.cc:3096
 hhistmap.cc:3097
 hhistmap.cc:3098
 hhistmap.cc:3099
 hhistmap.cc:3100
 hhistmap.cc:3101
 hhistmap.cc:3102
 hhistmap.cc:3103
 hhistmap.cc:3104
 hhistmap.cc:3105
 hhistmap.cc:3106
 hhistmap.cc:3107
 hhistmap.cc:3108
 hhistmap.cc:3109
 hhistmap.cc:3110
 hhistmap.cc:3111
 hhistmap.cc:3112
 hhistmap.cc:3113
 hhistmap.cc:3114
 hhistmap.cc:3115
 hhistmap.cc:3116
 hhistmap.cc:3117
 hhistmap.cc:3118
 hhistmap.cc:3119
 hhistmap.cc:3120
 hhistmap.cc:3121
 hhistmap.cc:3122
 hhistmap.cc:3123
 hhistmap.cc:3124
 hhistmap.cc:3125
 hhistmap.cc:3126
 hhistmap.cc:3127
 hhistmap.cc:3128
 hhistmap.cc:3129
 hhistmap.cc:3130
 hhistmap.cc:3131
 hhistmap.cc:3132
 hhistmap.cc:3133
 hhistmap.cc:3134
 hhistmap.cc:3135
 hhistmap.cc:3136
 hhistmap.cc:3137
 hhistmap.cc:3138
 hhistmap.cc:3139
 hhistmap.cc:3140
 hhistmap.cc:3141
 hhistmap.cc:3142
 hhistmap.cc:3143
 hhistmap.cc:3144
 hhistmap.cc:3145
 hhistmap.cc:3146
 hhistmap.cc:3147
 hhistmap.cc:3148
 hhistmap.cc:3149
 hhistmap.cc:3150
 hhistmap.cc:3151
 hhistmap.cc:3152
 hhistmap.cc:3153
 hhistmap.cc:3154
 hhistmap.cc:3155
 hhistmap.cc:3156
 hhistmap.cc:3157
 hhistmap.cc:3158
 hhistmap.cc:3159
 hhistmap.cc:3160
 hhistmap.cc:3161
 hhistmap.cc:3162
 hhistmap.cc:3163
 hhistmap.cc:3164
 hhistmap.cc:3165
 hhistmap.cc:3166
 hhistmap.cc:3167
 hhistmap.cc:3168
 hhistmap.cc:3169
 hhistmap.cc:3170
 hhistmap.cc:3171
 hhistmap.cc:3172
 hhistmap.cc:3173
 hhistmap.cc:3174
 hhistmap.cc:3175
 hhistmap.cc:3176
 hhistmap.cc:3177
 hhistmap.cc:3178
 hhistmap.cc:3179
 hhistmap.cc:3180
 hhistmap.cc:3181
 hhistmap.cc:3182
 hhistmap.cc:3183
 hhistmap.cc:3184
 hhistmap.cc:3185
 hhistmap.cc:3186
 hhistmap.cc:3187
 hhistmap.cc:3188
 hhistmap.cc:3189
 hhistmap.cc:3190
 hhistmap.cc:3191
 hhistmap.cc:3192
 hhistmap.cc:3193
 hhistmap.cc:3194
 hhistmap.cc:3195
 hhistmap.cc:3196
 hhistmap.cc:3197
 hhistmap.cc:3198
 hhistmap.cc:3199
 hhistmap.cc:3200
 hhistmap.cc:3201
 hhistmap.cc:3202
 hhistmap.cc:3203
 hhistmap.cc:3204
 hhistmap.cc:3205
 hhistmap.cc:3206
 hhistmap.cc:3207
 hhistmap.cc:3208
 hhistmap.cc:3209
 hhistmap.cc:3210
 hhistmap.cc:3211
 hhistmap.cc:3212
 hhistmap.cc:3213
 hhistmap.cc:3214
 hhistmap.cc:3215
 hhistmap.cc:3216
 hhistmap.cc:3217
 hhistmap.cc:3218
 hhistmap.cc:3219
 hhistmap.cc:3220
 hhistmap.cc:3221
 hhistmap.cc:3222
 hhistmap.cc:3223
 hhistmap.cc:3224
 hhistmap.cc:3225
 hhistmap.cc:3226
 hhistmap.cc:3227
 hhistmap.cc:3228
 hhistmap.cc:3229
 hhistmap.cc:3230
 hhistmap.cc:3231
 hhistmap.cc:3232
 hhistmap.cc:3233
 hhistmap.cc:3234
 hhistmap.cc:3235
 hhistmap.cc:3236
 hhistmap.cc:3237
 hhistmap.cc:3238
 hhistmap.cc:3239
 hhistmap.cc:3240
 hhistmap.cc:3241
 hhistmap.cc:3242
 hhistmap.cc:3243
 hhistmap.cc:3244
 hhistmap.cc:3245
 hhistmap.cc:3246
 hhistmap.cc:3247
 hhistmap.cc:3248
 hhistmap.cc:3249
 hhistmap.cc:3250
 hhistmap.cc:3251
 hhistmap.cc:3252
 hhistmap.cc:3253
 hhistmap.cc:3254
 hhistmap.cc:3255
 hhistmap.cc:3256
 hhistmap.cc:3257
 hhistmap.cc:3258
 hhistmap.cc:3259
 hhistmap.cc:3260
 hhistmap.cc:3261
 hhistmap.cc:3262
 hhistmap.cc:3263
 hhistmap.cc:3264
 hhistmap.cc:3265
 hhistmap.cc:3266
 hhistmap.cc:3267
 hhistmap.cc:3268
 hhistmap.cc:3269
 hhistmap.cc:3270
 hhistmap.cc:3271
 hhistmap.cc:3272
 hhistmap.cc:3273
 hhistmap.cc:3274
 hhistmap.cc:3275
 hhistmap.cc:3276
 hhistmap.cc:3277
 hhistmap.cc:3278
 hhistmap.cc:3279
 hhistmap.cc:3280
 hhistmap.cc:3281
 hhistmap.cc:3282
 hhistmap.cc:3283
 hhistmap.cc:3284
 hhistmap.cc:3285
 hhistmap.cc:3286
 hhistmap.cc:3287
 hhistmap.cc:3288
 hhistmap.cc:3289
 hhistmap.cc:3290
 hhistmap.cc:3291
 hhistmap.cc:3292
 hhistmap.cc:3293
 hhistmap.cc:3294
 hhistmap.cc:3295
 hhistmap.cc:3296
 hhistmap.cc:3297
 hhistmap.cc:3298
 hhistmap.cc:3299
 hhistmap.cc:3300
 hhistmap.cc:3301
 hhistmap.cc:3302
 hhistmap.cc:3303
 hhistmap.cc:3304
 hhistmap.cc:3305
 hhistmap.cc:3306
 hhistmap.cc:3307
 hhistmap.cc:3308
 hhistmap.cc:3309
 hhistmap.cc:3310
 hhistmap.cc:3311
 hhistmap.cc:3312
 hhistmap.cc:3313
 hhistmap.cc:3314
 hhistmap.cc:3315
 hhistmap.cc:3316
 hhistmap.cc:3317
 hhistmap.cc:3318
 hhistmap.cc:3319
 hhistmap.cc:3320
 hhistmap.cc:3321
 hhistmap.cc:3322
 hhistmap.cc:3323
 hhistmap.cc:3324
 hhistmap.cc:3325
 hhistmap.cc:3326
 hhistmap.cc:3327
 hhistmap.cc:3328
 hhistmap.cc:3329
 hhistmap.cc:3330
 hhistmap.cc:3331
 hhistmap.cc:3332
 hhistmap.cc:3333
 hhistmap.cc:3334
 hhistmap.cc:3335
 hhistmap.cc:3336
 hhistmap.cc:3337
 hhistmap.cc:3338
 hhistmap.cc:3339
 hhistmap.cc:3340
 hhistmap.cc:3341
 hhistmap.cc:3342
 hhistmap.cc:3343
 hhistmap.cc:3344
 hhistmap.cc:3345
 hhistmap.cc:3346
 hhistmap.cc:3347
 hhistmap.cc:3348
 hhistmap.cc:3349
 hhistmap.cc:3350
 hhistmap.cc:3351
 hhistmap.cc:3352
 hhistmap.cc:3353
 hhistmap.cc:3354
 hhistmap.cc:3355
 hhistmap.cc:3356
 hhistmap.cc:3357
 hhistmap.cc:3358
 hhistmap.cc:3359
 hhistmap.cc:3360
 hhistmap.cc:3361
 hhistmap.cc:3362
 hhistmap.cc:3363
 hhistmap.cc:3364
 hhistmap.cc:3365
 hhistmap.cc:3366
 hhistmap.cc:3367
 hhistmap.cc:3368
 hhistmap.cc:3369
 hhistmap.cc:3370
 hhistmap.cc:3371
 hhistmap.cc:3372
 hhistmap.cc:3373
 hhistmap.cc:3374
 hhistmap.cc:3375
 hhistmap.cc:3376
 hhistmap.cc:3377
 hhistmap.cc:3378
 hhistmap.cc:3379
 hhistmap.cc:3380
 hhistmap.cc:3381
 hhistmap.cc:3382
 hhistmap.cc:3383
 hhistmap.cc:3384
 hhistmap.cc:3385
 hhistmap.cc:3386
 hhistmap.cc:3387
 hhistmap.cc:3388
 hhistmap.cc:3389
 hhistmap.cc:3390
 hhistmap.cc:3391
 hhistmap.cc:3392
 hhistmap.cc:3393
 hhistmap.cc:3394
 hhistmap.cc:3395
 hhistmap.cc:3396
 hhistmap.cc:3397
 hhistmap.cc:3398
 hhistmap.cc:3399
 hhistmap.cc:3400
 hhistmap.cc:3401
 hhistmap.cc:3402
 hhistmap.cc:3403
 hhistmap.cc:3404
 hhistmap.cc:3405
 hhistmap.cc:3406
 hhistmap.cc:3407
 hhistmap.cc:3408
 hhistmap.cc:3409
 hhistmap.cc:3410
 hhistmap.cc:3411
 hhistmap.cc:3412
 hhistmap.cc:3413
 hhistmap.cc:3414
 hhistmap.cc:3415
 hhistmap.cc:3416
 hhistmap.cc:3417
 hhistmap.cc:3418
 hhistmap.cc:3419
 hhistmap.cc:3420
 hhistmap.cc:3421
 hhistmap.cc:3422
 hhistmap.cc:3423
 hhistmap.cc:3424
 hhistmap.cc:3425
 hhistmap.cc:3426
 hhistmap.cc:3427
 hhistmap.cc:3428
 hhistmap.cc:3429
 hhistmap.cc:3430
 hhistmap.cc:3431
 hhistmap.cc:3432
 hhistmap.cc:3433
 hhistmap.cc:3434
 hhistmap.cc:3435
 hhistmap.cc:3436
 hhistmap.cc:3437
 hhistmap.cc:3438
 hhistmap.cc:3439
 hhistmap.cc:3440
 hhistmap.cc:3441
 hhistmap.cc:3442
 hhistmap.cc:3443
 hhistmap.cc:3444
 hhistmap.cc:3445
 hhistmap.cc:3446
 hhistmap.cc:3447
 hhistmap.cc:3448
 hhistmap.cc:3449
 hhistmap.cc:3450
 hhistmap.cc:3451
 hhistmap.cc:3452
 hhistmap.cc:3453
 hhistmap.cc:3454
 hhistmap.cc:3455
 hhistmap.cc:3456
 hhistmap.cc:3457
 hhistmap.cc:3458
 hhistmap.cc:3459
 hhistmap.cc:3460
 hhistmap.cc:3461
 hhistmap.cc:3462
 hhistmap.cc:3463
 hhistmap.cc:3464
 hhistmap.cc:3465
 hhistmap.cc:3466
 hhistmap.cc:3467
 hhistmap.cc:3468
 hhistmap.cc:3469
 hhistmap.cc:3470
 hhistmap.cc:3471
 hhistmap.cc:3472
 hhistmap.cc:3473
 hhistmap.cc:3474
 hhistmap.cc:3475
 hhistmap.cc:3476
 hhistmap.cc:3477
 hhistmap.cc:3478
 hhistmap.cc:3479
 hhistmap.cc:3480
 hhistmap.cc:3481
 hhistmap.cc:3482
 hhistmap.cc:3483
 hhistmap.cc:3484
 hhistmap.cc:3485
 hhistmap.cc:3486
 hhistmap.cc:3487
 hhistmap.cc:3488
 hhistmap.cc:3489
 hhistmap.cc:3490
 hhistmap.cc:3491
 hhistmap.cc:3492
 hhistmap.cc:3493
 hhistmap.cc:3494
 hhistmap.cc:3495
 hhistmap.cc:3496
 hhistmap.cc:3497
 hhistmap.cc:3498
 hhistmap.cc:3499
 hhistmap.cc:3500
 hhistmap.cc:3501
 hhistmap.cc:3502
 hhistmap.cc:3503
 hhistmap.cc:3504
 hhistmap.cc:3505
 hhistmap.cc:3506
 hhistmap.cc:3507
 hhistmap.cc:3508
 hhistmap.cc:3509
 hhistmap.cc:3510
 hhistmap.cc:3511
 hhistmap.cc:3512
 hhistmap.cc:3513
 hhistmap.cc:3514
 hhistmap.cc:3515
 hhistmap.cc:3516
 hhistmap.cc:3517
 hhistmap.cc:3518
 hhistmap.cc:3519
 hhistmap.cc:3520
 hhistmap.cc:3521
 hhistmap.cc:3522
 hhistmap.cc:3523
 hhistmap.cc:3524
 hhistmap.cc:3525
 hhistmap.cc:3526
 hhistmap.cc:3527
 hhistmap.cc:3528
 hhistmap.cc:3529
 hhistmap.cc:3530
 hhistmap.cc:3531
 hhistmap.cc:3532
 hhistmap.cc:3533
 hhistmap.cc:3534
 hhistmap.cc:3535
 hhistmap.cc:3536
 hhistmap.cc:3537
 hhistmap.cc:3538
 hhistmap.cc:3539
 hhistmap.cc:3540
 hhistmap.cc:3541
 hhistmap.cc:3542
 hhistmap.cc:3543
 hhistmap.cc:3544
 hhistmap.cc:3545
 hhistmap.cc:3546
 hhistmap.cc:3547
 hhistmap.cc:3548
 hhistmap.cc:3549
 hhistmap.cc:3550
 hhistmap.cc:3551
 hhistmap.cc:3552
 hhistmap.cc:3553
 hhistmap.cc:3554
 hhistmap.cc:3555
 hhistmap.cc:3556
 hhistmap.cc:3557
 hhistmap.cc:3558
 hhistmap.cc:3559
 hhistmap.cc:3560
 hhistmap.cc:3561
 hhistmap.cc:3562
 hhistmap.cc:3563
 hhistmap.cc:3564
 hhistmap.cc:3565
 hhistmap.cc:3566
 hhistmap.cc:3567
 hhistmap.cc:3568
 hhistmap.cc:3569
 hhistmap.cc:3570
 hhistmap.cc:3571
 hhistmap.cc:3572
 hhistmap.cc:3573
 hhistmap.cc:3574
 hhistmap.cc:3575
 hhistmap.cc:3576
 hhistmap.cc:3577
 hhistmap.cc:3578
 hhistmap.cc:3579
 hhistmap.cc:3580
 hhistmap.cc:3581
 hhistmap.cc:3582
 hhistmap.cc:3583
 hhistmap.cc:3584
 hhistmap.cc:3585
 hhistmap.cc:3586
 hhistmap.cc:3587
 hhistmap.cc:3588
 hhistmap.cc:3589
 hhistmap.cc:3590
 hhistmap.cc:3591
 hhistmap.cc:3592
 hhistmap.cc:3593
 hhistmap.cc:3594
 hhistmap.cc:3595
 hhistmap.cc:3596
 hhistmap.cc:3597
 hhistmap.cc:3598
 hhistmap.cc:3599
 hhistmap.cc:3600
 hhistmap.cc:3601
 hhistmap.cc:3602
 hhistmap.cc:3603
 hhistmap.cc:3604
 hhistmap.cc:3605
 hhistmap.cc:3606
 hhistmap.cc:3607
 hhistmap.cc:3608
 hhistmap.cc:3609
 hhistmap.cc:3610
 hhistmap.cc:3611
 hhistmap.cc:3612
 hhistmap.cc:3613
 hhistmap.cc:3614
 hhistmap.cc:3615
 hhistmap.cc:3616
 hhistmap.cc:3617
 hhistmap.cc:3618
 hhistmap.cc:3619
 hhistmap.cc:3620
 hhistmap.cc:3621
 hhistmap.cc:3622
 hhistmap.cc:3623
 hhistmap.cc:3624
 hhistmap.cc:3625
 hhistmap.cc:3626
 hhistmap.cc:3627
 hhistmap.cc:3628
 hhistmap.cc:3629
 hhistmap.cc:3630
 hhistmap.cc:3631
 hhistmap.cc:3632
 hhistmap.cc:3633
 hhistmap.cc:3634
 hhistmap.cc:3635
 hhistmap.cc:3636
 hhistmap.cc:3637
 hhistmap.cc:3638
 hhistmap.cc:3639
 hhistmap.cc:3640
 hhistmap.cc:3641
 hhistmap.cc:3642
 hhistmap.cc:3643
 hhistmap.cc:3644
 hhistmap.cc:3645
 hhistmap.cc:3646
 hhistmap.cc:3647
 hhistmap.cc:3648
 hhistmap.cc:3649
 hhistmap.cc:3650
 hhistmap.cc:3651
 hhistmap.cc:3652
 hhistmap.cc:3653
 hhistmap.cc:3654
 hhistmap.cc:3655
 hhistmap.cc:3656
 hhistmap.cc:3657
 hhistmap.cc:3658
 hhistmap.cc:3659
 hhistmap.cc:3660
 hhistmap.cc:3661
 hhistmap.cc:3662
 hhistmap.cc:3663
 hhistmap.cc:3664
 hhistmap.cc:3665
 hhistmap.cc:3666
 hhistmap.cc:3667
 hhistmap.cc:3668
 hhistmap.cc:3669
 hhistmap.cc:3670
 hhistmap.cc:3671
 hhistmap.cc:3672
 hhistmap.cc:3673
 hhistmap.cc:3674
 hhistmap.cc:3675
 hhistmap.cc:3676
 hhistmap.cc:3677
 hhistmap.cc:3678
 hhistmap.cc:3679
 hhistmap.cc:3680
 hhistmap.cc:3681
 hhistmap.cc:3682
 hhistmap.cc:3683
 hhistmap.cc:3684
 hhistmap.cc:3685
 hhistmap.cc:3686
 hhistmap.cc:3687
 hhistmap.cc:3688
 hhistmap.cc:3689
 hhistmap.cc:3690
 hhistmap.cc:3691
 hhistmap.cc:3692
 hhistmap.cc:3693
 hhistmap.cc:3694
 hhistmap.cc:3695
 hhistmap.cc:3696
 hhistmap.cc:3697
 hhistmap.cc:3698
 hhistmap.cc:3699
 hhistmap.cc:3700
 hhistmap.cc:3701
 hhistmap.cc:3702
 hhistmap.cc:3703
 hhistmap.cc:3704
 hhistmap.cc:3705
 hhistmap.cc:3706
 hhistmap.cc:3707
 hhistmap.cc:3708
 hhistmap.cc:3709
 hhistmap.cc:3710
 hhistmap.cc:3711
 hhistmap.cc:3712
 hhistmap.cc:3713
 hhistmap.cc:3714
 hhistmap.cc:3715
 hhistmap.cc:3716
 hhistmap.cc:3717
 hhistmap.cc:3718
 hhistmap.cc:3719
 hhistmap.cc:3720
 hhistmap.cc:3721
 hhistmap.cc:3722
 hhistmap.cc:3723
 hhistmap.cc:3724
 hhistmap.cc:3725
 hhistmap.cc:3726
 hhistmap.cc:3727
 hhistmap.cc:3728
 hhistmap.cc:3729
 hhistmap.cc:3730
 hhistmap.cc:3731
 hhistmap.cc:3732
 hhistmap.cc:3733
 hhistmap.cc:3734
 hhistmap.cc:3735
 hhistmap.cc:3736
 hhistmap.cc:3737
 hhistmap.cc:3738
 hhistmap.cc:3739
 hhistmap.cc:3740
 hhistmap.cc:3741
 hhistmap.cc:3742
 hhistmap.cc:3743
 hhistmap.cc:3744
 hhistmap.cc:3745
 hhistmap.cc:3746
 hhistmap.cc:3747
 hhistmap.cc:3748
 hhistmap.cc:3749
 hhistmap.cc:3750
 hhistmap.cc:3751
 hhistmap.cc:3752
 hhistmap.cc:3753
 hhistmap.cc:3754
 hhistmap.cc:3755
 hhistmap.cc:3756
 hhistmap.cc:3757
 hhistmap.cc:3758
 hhistmap.cc:3759
 hhistmap.cc:3760
 hhistmap.cc:3761
 hhistmap.cc:3762
 hhistmap.cc:3763
 hhistmap.cc:3764
 hhistmap.cc:3765
 hhistmap.cc:3766
 hhistmap.cc:3767
 hhistmap.cc:3768
 hhistmap.cc:3769
 hhistmap.cc:3770
 hhistmap.cc:3771
 hhistmap.cc:3772
 hhistmap.cc:3773
 hhistmap.cc:3774
 hhistmap.cc:3775
 hhistmap.cc:3776
 hhistmap.cc:3777
 hhistmap.cc:3778
 hhistmap.cc:3779
 hhistmap.cc:3780
 hhistmap.cc:3781
 hhistmap.cc:3782
 hhistmap.cc:3783
 hhistmap.cc:3784
 hhistmap.cc:3785
 hhistmap.cc:3786
 hhistmap.cc:3787
 hhistmap.cc:3788
 hhistmap.cc:3789
 hhistmap.cc:3790
 hhistmap.cc:3791
 hhistmap.cc:3792
 hhistmap.cc:3793
 hhistmap.cc:3794
 hhistmap.cc:3795
 hhistmap.cc:3796
 hhistmap.cc:3797
 hhistmap.cc:3798
 hhistmap.cc:3799
 hhistmap.cc:3800
 hhistmap.cc:3801
 hhistmap.cc:3802
 hhistmap.cc:3803
 hhistmap.cc:3804
 hhistmap.cc:3805
 hhistmap.cc:3806
 hhistmap.cc:3807
 hhistmap.cc:3808
 hhistmap.cc:3809
 hhistmap.cc:3810
 hhistmap.cc:3811
 hhistmap.cc:3812
 hhistmap.cc:3813
 hhistmap.cc:3814
 hhistmap.cc:3815
 hhistmap.cc:3816
 hhistmap.cc:3817
 hhistmap.cc:3818
 hhistmap.cc:3819
 hhistmap.cc:3820
 hhistmap.cc:3821
 hhistmap.cc:3822
 hhistmap.cc:3823
 hhistmap.cc:3824
 hhistmap.cc:3825
 hhistmap.cc:3826
 hhistmap.cc:3827
 hhistmap.cc:3828
 hhistmap.cc:3829
 hhistmap.cc:3830
 hhistmap.cc:3831
 hhistmap.cc:3832
 hhistmap.cc:3833
 hhistmap.cc:3834
 hhistmap.cc:3835
 hhistmap.cc:3836
 hhistmap.cc:3837
 hhistmap.cc:3838
 hhistmap.cc:3839
 hhistmap.cc:3840
 hhistmap.cc:3841
 hhistmap.cc:3842
 hhistmap.cc:3843
 hhistmap.cc:3844
 hhistmap.cc:3845
 hhistmap.cc:3846
 hhistmap.cc:3847
 hhistmap.cc:3848
 hhistmap.cc:3849
 hhistmap.cc:3850
 hhistmap.cc:3851
 hhistmap.cc:3852
 hhistmap.cc:3853
 hhistmap.cc:3854
 hhistmap.cc:3855
 hhistmap.cc:3856
 hhistmap.cc:3857
 hhistmap.cc:3858
 hhistmap.cc:3859
 hhistmap.cc:3860
 hhistmap.cc:3861
 hhistmap.cc:3862
 hhistmap.cc:3863
 hhistmap.cc:3864
 hhistmap.cc:3865
 hhistmap.cc:3866
 hhistmap.cc:3867
 hhistmap.cc:3868
 hhistmap.cc:3869
 hhistmap.cc:3870
 hhistmap.cc:3871
 hhistmap.cc:3872
 hhistmap.cc:3873
 hhistmap.cc:3874
 hhistmap.cc:3875
 hhistmap.cc:3876
 hhistmap.cc:3877
 hhistmap.cc:3878
 hhistmap.cc:3879
 hhistmap.cc:3880
 hhistmap.cc:3881
 hhistmap.cc:3882
 hhistmap.cc:3883
 hhistmap.cc:3884
 hhistmap.cc:3885
 hhistmap.cc:3886
 hhistmap.cc:3887
 hhistmap.cc:3888
 hhistmap.cc:3889
 hhistmap.cc:3890
 hhistmap.cc:3891
 hhistmap.cc:3892
 hhistmap.cc:3893
 hhistmap.cc:3894
 hhistmap.cc:3895
 hhistmap.cc:3896
 hhistmap.cc:3897
 hhistmap.cc:3898
 hhistmap.cc:3899
 hhistmap.cc:3900
 hhistmap.cc:3901
 hhistmap.cc:3902
 hhistmap.cc:3903
 hhistmap.cc:3904
 hhistmap.cc:3905
 hhistmap.cc:3906
 hhistmap.cc:3907
 hhistmap.cc:3908
 hhistmap.cc:3909
 hhistmap.cc:3910
 hhistmap.cc:3911
 hhistmap.cc:3912
 hhistmap.cc:3913
 hhistmap.cc:3914
 hhistmap.cc:3915
 hhistmap.cc:3916
 hhistmap.cc:3917
 hhistmap.cc:3918
 hhistmap.cc:3919
 hhistmap.cc:3920
 hhistmap.cc:3921
 hhistmap.cc:3922
 hhistmap.cc:3923
 hhistmap.cc:3924
 hhistmap.cc:3925
 hhistmap.cc:3926
 hhistmap.cc:3927
 hhistmap.cc:3928
 hhistmap.cc:3929
 hhistmap.cc:3930
 hhistmap.cc:3931
 hhistmap.cc:3932
 hhistmap.cc:3933
 hhistmap.cc:3934
 hhistmap.cc:3935
 hhistmap.cc:3936
 hhistmap.cc:3937
 hhistmap.cc:3938
 hhistmap.cc:3939
 hhistmap.cc:3940
 hhistmap.cc:3941
 hhistmap.cc:3942
 hhistmap.cc:3943
 hhistmap.cc:3944
 hhistmap.cc:3945
 hhistmap.cc:3946
 hhistmap.cc:3947
 hhistmap.cc:3948
 hhistmap.cc:3949
 hhistmap.cc:3950
 hhistmap.cc:3951
 hhistmap.cc:3952
 hhistmap.cc:3953
 hhistmap.cc:3954
 hhistmap.cc:3955
 hhistmap.cc:3956
 hhistmap.cc:3957
 hhistmap.cc:3958
 hhistmap.cc:3959
 hhistmap.cc:3960
 hhistmap.cc:3961
 hhistmap.cc:3962
 hhistmap.cc:3963
 hhistmap.cc:3964
 hhistmap.cc:3965
 hhistmap.cc:3966
 hhistmap.cc:3967
 hhistmap.cc:3968
 hhistmap.cc:3969
 hhistmap.cc:3970
 hhistmap.cc:3971
 hhistmap.cc:3972
 hhistmap.cc:3973
 hhistmap.cc:3974
 hhistmap.cc:3975
 hhistmap.cc:3976
 hhistmap.cc:3977
 hhistmap.cc:3978
 hhistmap.cc:3979
 hhistmap.cc:3980
 hhistmap.cc:3981
 hhistmap.cc:3982
 hhistmap.cc:3983
 hhistmap.cc:3984
 hhistmap.cc:3985
 hhistmap.cc:3986
 hhistmap.cc:3987
 hhistmap.cc:3988
 hhistmap.cc:3989
 hhistmap.cc:3990
 hhistmap.cc:3991
 hhistmap.cc:3992
 hhistmap.cc:3993
 hhistmap.cc:3994
 hhistmap.cc:3995
 hhistmap.cc:3996
 hhistmap.cc:3997
 hhistmap.cc:3998
 hhistmap.cc:3999
 hhistmap.cc:4000
 hhistmap.cc:4001
 hhistmap.cc:4002
 hhistmap.cc:4003
 hhistmap.cc:4004
 hhistmap.cc:4005
 hhistmap.cc:4006
 hhistmap.cc:4007
 hhistmap.cc:4008
 hhistmap.cc:4009
 hhistmap.cc:4010
 hhistmap.cc:4011
 hhistmap.cc:4012
 hhistmap.cc:4013
 hhistmap.cc:4014
 hhistmap.cc:4015
 hhistmap.cc:4016
 hhistmap.cc:4017
 hhistmap.cc:4018
 hhistmap.cc:4019
 hhistmap.cc:4020
 hhistmap.cc:4021
 hhistmap.cc:4022
 hhistmap.cc:4023
 hhistmap.cc:4024
 hhistmap.cc:4025
 hhistmap.cc:4026
 hhistmap.cc:4027
 hhistmap.cc:4028
 hhistmap.cc:4029
 hhistmap.cc:4030
 hhistmap.cc:4031
 hhistmap.cc:4032
 hhistmap.cc:4033
 hhistmap.cc:4034
 hhistmap.cc:4035
 hhistmap.cc:4036
 hhistmap.cc:4037
 hhistmap.cc:4038
 hhistmap.cc:4039
 hhistmap.cc:4040
 hhistmap.cc:4041
 hhistmap.cc:4042
 hhistmap.cc:4043
 hhistmap.cc:4044
 hhistmap.cc:4045
 hhistmap.cc:4046
 hhistmap.cc:4047
 hhistmap.cc:4048
 hhistmap.cc:4049
 hhistmap.cc:4050
 hhistmap.cc:4051
 hhistmap.cc:4052
 hhistmap.cc:4053
 hhistmap.cc:4054
 hhistmap.cc:4055
 hhistmap.cc:4056
 hhistmap.cc:4057
 hhistmap.cc:4058
 hhistmap.cc:4059
 hhistmap.cc:4060
 hhistmap.cc:4061
 hhistmap.cc:4062
 hhistmap.cc:4063
 hhistmap.cc:4064
 hhistmap.cc:4065
 hhistmap.cc:4066
 hhistmap.cc:4067
 hhistmap.cc:4068
 hhistmap.cc:4069
 hhistmap.cc:4070
 hhistmap.cc:4071
 hhistmap.cc:4072
 hhistmap.cc:4073
 hhistmap.cc:4074
 hhistmap.cc:4075
 hhistmap.cc:4076
 hhistmap.cc:4077
 hhistmap.cc:4078
 hhistmap.cc:4079
 hhistmap.cc:4080
 hhistmap.cc:4081
 hhistmap.cc:4082
 hhistmap.cc:4083
 hhistmap.cc:4084
 hhistmap.cc:4085
 hhistmap.cc:4086
 hhistmap.cc:4087
 hhistmap.cc:4088
 hhistmap.cc:4089
 hhistmap.cc:4090
 hhistmap.cc:4091
 hhistmap.cc:4092
 hhistmap.cc:4093
 hhistmap.cc:4094
 hhistmap.cc:4095
 hhistmap.cc:4096
 hhistmap.cc:4097
 hhistmap.cc:4098
 hhistmap.cc:4099
 hhistmap.cc:4100
 hhistmap.cc:4101
 hhistmap.cc:4102
 hhistmap.cc:4103
 hhistmap.cc:4104
 hhistmap.cc:4105
 hhistmap.cc:4106
 hhistmap.cc:4107
 hhistmap.cc:4108
 hhistmap.cc:4109
 hhistmap.cc:4110
 hhistmap.cc:4111
 hhistmap.cc:4112
 hhistmap.cc:4113
 hhistmap.cc:4114
 hhistmap.cc:4115
 hhistmap.cc:4116
 hhistmap.cc:4117
 hhistmap.cc:4118
 hhistmap.cc:4119
 hhistmap.cc:4120
 hhistmap.cc:4121
 hhistmap.cc:4122
 hhistmap.cc:4123
 hhistmap.cc:4124
 hhistmap.cc:4125
 hhistmap.cc:4126
 hhistmap.cc:4127
 hhistmap.cc:4128
 hhistmap.cc:4129
 hhistmap.cc:4130
 hhistmap.cc:4131
 hhistmap.cc:4132
 hhistmap.cc:4133
 hhistmap.cc:4134
 hhistmap.cc:4135
 hhistmap.cc:4136
 hhistmap.cc:4137
 hhistmap.cc:4138
 hhistmap.cc:4139
 hhistmap.cc:4140
 hhistmap.cc:4141
 hhistmap.cc:4142
 hhistmap.cc:4143
 hhistmap.cc:4144
 hhistmap.cc:4145
 hhistmap.cc:4146
 hhistmap.cc:4147
 hhistmap.cc:4148
 hhistmap.cc:4149
 hhistmap.cc:4150
 hhistmap.cc:4151
 hhistmap.cc:4152
 hhistmap.cc:4153
 hhistmap.cc:4154
 hhistmap.cc:4155
 hhistmap.cc:4156
 hhistmap.cc:4157
 hhistmap.cc:4158
 hhistmap.cc:4159
 hhistmap.cc:4160
 hhistmap.cc:4161
 hhistmap.cc:4162
 hhistmap.cc:4163
 hhistmap.cc:4164
 hhistmap.cc:4165
 hhistmap.cc:4166
 hhistmap.cc:4167
 hhistmap.cc:4168
 hhistmap.cc:4169
 hhistmap.cc:4170
 hhistmap.cc:4171
 hhistmap.cc:4172
 hhistmap.cc:4173
 hhistmap.cc:4174
 hhistmap.cc:4175
 hhistmap.cc:4176
 hhistmap.cc:4177
 hhistmap.cc:4178
 hhistmap.cc:4179
 hhistmap.cc:4180
 hhistmap.cc:4181
 hhistmap.cc:4182
 hhistmap.cc:4183
 hhistmap.cc:4184
 hhistmap.cc:4185
 hhistmap.cc:4186
 hhistmap.cc:4187
 hhistmap.cc:4188
 hhistmap.cc:4189
 hhistmap.cc:4190
 hhistmap.cc:4191
 hhistmap.cc:4192
 hhistmap.cc:4193
 hhistmap.cc:4194
 hhistmap.cc:4195
 hhistmap.cc:4196
 hhistmap.cc:4197
 hhistmap.cc:4198
 hhistmap.cc:4199
 hhistmap.cc:4200
 hhistmap.cc:4201
 hhistmap.cc:4202
 hhistmap.cc:4203
 hhistmap.cc:4204
 hhistmap.cc:4205
 hhistmap.cc:4206
 hhistmap.cc:4207
 hhistmap.cc:4208
 hhistmap.cc:4209
 hhistmap.cc:4210
 hhistmap.cc:4211
 hhistmap.cc:4212
 hhistmap.cc:4213
 hhistmap.cc:4214
 hhistmap.cc:4215
 hhistmap.cc:4216
 hhistmap.cc:4217
 hhistmap.cc:4218
 hhistmap.cc:4219
 hhistmap.cc:4220
 hhistmap.cc:4221
 hhistmap.cc:4222
 hhistmap.cc:4223
 hhistmap.cc:4224
 hhistmap.cc:4225
 hhistmap.cc:4226
 hhistmap.cc:4227
 hhistmap.cc:4228
 hhistmap.cc:4229
 hhistmap.cc:4230
 hhistmap.cc:4231
 hhistmap.cc:4232
 hhistmap.cc:4233
 hhistmap.cc:4234
 hhistmap.cc:4235
 hhistmap.cc:4236
 hhistmap.cc:4237
 hhistmap.cc:4238
 hhistmap.cc:4239
 hhistmap.cc:4240
 hhistmap.cc:4241
 hhistmap.cc:4242
 hhistmap.cc:4243
 hhistmap.cc:4244
 hhistmap.cc:4245
 hhistmap.cc:4246
 hhistmap.cc:4247
 hhistmap.cc:4248
 hhistmap.cc:4249
 hhistmap.cc:4250
 hhistmap.cc:4251
 hhistmap.cc:4252
 hhistmap.cc:4253
 hhistmap.cc:4254
 hhistmap.cc:4255
 hhistmap.cc:4256
 hhistmap.cc:4257
 hhistmap.cc:4258
 hhistmap.cc:4259
 hhistmap.cc:4260
 hhistmap.cc:4261
 hhistmap.cc:4262
 hhistmap.cc:4263
 hhistmap.cc:4264
 hhistmap.cc:4265
 hhistmap.cc:4266
 hhistmap.cc:4267
 hhistmap.cc:4268
 hhistmap.cc:4269
 hhistmap.cc:4270
 hhistmap.cc:4271
 hhistmap.cc:4272
 hhistmap.cc:4273
 hhistmap.cc:4274
 hhistmap.cc:4275
 hhistmap.cc:4276
 hhistmap.cc:4277
 hhistmap.cc:4278
 hhistmap.cc:4279
 hhistmap.cc:4280
 hhistmap.cc:4281
 hhistmap.cc:4282
 hhistmap.cc:4283
 hhistmap.cc:4284
 hhistmap.cc:4285
 hhistmap.cc:4286
 hhistmap.cc:4287
 hhistmap.cc:4288
 hhistmap.cc:4289
 hhistmap.cc:4290
 hhistmap.cc:4291
 hhistmap.cc:4292
 hhistmap.cc:4293
 hhistmap.cc:4294
 hhistmap.cc:4295
 hhistmap.cc:4296
 hhistmap.cc:4297
 hhistmap.cc:4298
 hhistmap.cc:4299
 hhistmap.cc:4300
 hhistmap.cc:4301
 hhistmap.cc:4302
 hhistmap.cc:4303
 hhistmap.cc:4304
 hhistmap.cc:4305
 hhistmap.cc:4306
 hhistmap.cc:4307
 hhistmap.cc:4308
 hhistmap.cc:4309
 hhistmap.cc:4310
 hhistmap.cc:4311
 hhistmap.cc:4312
 hhistmap.cc:4313
 hhistmap.cc:4314
 hhistmap.cc:4315
 hhistmap.cc:4316
 hhistmap.cc:4317
 hhistmap.cc:4318
 hhistmap.cc:4319
 hhistmap.cc:4320
 hhistmap.cc:4321
 hhistmap.cc:4322
 hhistmap.cc:4323
 hhistmap.cc:4324
 hhistmap.cc:4325
 hhistmap.cc:4326
 hhistmap.cc:4327
 hhistmap.cc:4328
 hhistmap.cc:4329
 hhistmap.cc:4330
 hhistmap.cc:4331
 hhistmap.cc:4332
 hhistmap.cc:4333
 hhistmap.cc:4334
 hhistmap.cc:4335
 hhistmap.cc:4336
 hhistmap.cc:4337
 hhistmap.cc:4338
 hhistmap.cc:4339
 hhistmap.cc:4340
 hhistmap.cc:4341
 hhistmap.cc:4342
 hhistmap.cc:4343
 hhistmap.cc:4344
 hhistmap.cc:4345
 hhistmap.cc:4346
 hhistmap.cc:4347
 hhistmap.cc:4348
 hhistmap.cc:4349
 hhistmap.cc:4350
 hhistmap.cc:4351
 hhistmap.cc:4352
 hhistmap.cc:4353
 hhistmap.cc:4354
 hhistmap.cc:4355
 hhistmap.cc:4356
 hhistmap.cc:4357
 hhistmap.cc:4358
 hhistmap.cc:4359
 hhistmap.cc:4360
 hhistmap.cc:4361
 hhistmap.cc:4362
 hhistmap.cc:4363
 hhistmap.cc:4364
 hhistmap.cc:4365
 hhistmap.cc:4366
 hhistmap.cc:4367
 hhistmap.cc:4368
 hhistmap.cc:4369
 hhistmap.cc:4370
 hhistmap.cc:4371
 hhistmap.cc:4372
 hhistmap.cc:4373
 hhistmap.cc:4374
 hhistmap.cc:4375
 hhistmap.cc:4376
 hhistmap.cc:4377
 hhistmap.cc:4378
 hhistmap.cc:4379
 hhistmap.cc:4380
 hhistmap.cc:4381
 hhistmap.cc:4382
 hhistmap.cc:4383
 hhistmap.cc:4384
 hhistmap.cc:4385
 hhistmap.cc:4386
 hhistmap.cc:4387
 hhistmap.cc:4388
 hhistmap.cc:4389
 hhistmap.cc:4390
 hhistmap.cc:4391
 hhistmap.cc:4392
 hhistmap.cc:4393
 hhistmap.cc:4394
 hhistmap.cc:4395
 hhistmap.cc:4396
 hhistmap.cc:4397
 hhistmap.cc:4398
 hhistmap.cc:4399
 hhistmap.cc:4400
 hhistmap.cc:4401
 hhistmap.cc:4402
 hhistmap.cc:4403
 hhistmap.cc:4404
 hhistmap.cc:4405
 hhistmap.cc:4406
 hhistmap.cc:4407
 hhistmap.cc:4408
 hhistmap.cc:4409
 hhistmap.cc:4410
 hhistmap.cc:4411
 hhistmap.cc:4412
 hhistmap.cc:4413
 hhistmap.cc:4414
 hhistmap.cc:4415
 hhistmap.cc:4416
 hhistmap.cc:4417
 hhistmap.cc:4418
 hhistmap.cc:4419
 hhistmap.cc:4420
 hhistmap.cc:4421
 hhistmap.cc:4422
 hhistmap.cc:4423
 hhistmap.cc:4424
 hhistmap.cc:4425
 hhistmap.cc:4426
 hhistmap.cc:4427
 hhistmap.cc:4428
 hhistmap.cc:4429
 hhistmap.cc:4430
 hhistmap.cc:4431
 hhistmap.cc:4432
 hhistmap.cc:4433
 hhistmap.cc:4434
 hhistmap.cc:4435
 hhistmap.cc:4436
 hhistmap.cc:4437
 hhistmap.cc:4438
 hhistmap.cc:4439
 hhistmap.cc:4440
 hhistmap.cc:4441
 hhistmap.cc:4442
 hhistmap.cc:4443
 hhistmap.cc:4444
 hhistmap.cc:4445
 hhistmap.cc:4446
 hhistmap.cc:4447
 hhistmap.cc:4448
 hhistmap.cc:4449
 hhistmap.cc:4450
 hhistmap.cc:4451
 hhistmap.cc:4452
 hhistmap.cc:4453
 hhistmap.cc:4454
 hhistmap.cc:4455
 hhistmap.cc:4456
 hhistmap.cc:4457
 hhistmap.cc:4458
 hhistmap.cc:4459
 hhistmap.cc:4460
 hhistmap.cc:4461
 hhistmap.cc:4462
 hhistmap.cc:4463
 hhistmap.cc:4464
 hhistmap.cc:4465
 hhistmap.cc:4466
 hhistmap.cc:4467
 hhistmap.cc:4468
 hhistmap.cc:4469
 hhistmap.cc:4470
 hhistmap.cc:4471
 hhistmap.cc:4472
 hhistmap.cc:4473
 hhistmap.cc:4474
 hhistmap.cc:4475
 hhistmap.cc:4476
 hhistmap.cc:4477
 hhistmap.cc:4478
 hhistmap.cc:4479
 hhistmap.cc:4480
 hhistmap.cc:4481
 hhistmap.cc:4482
 hhistmap.cc:4483
 hhistmap.cc:4484
 hhistmap.cc:4485
 hhistmap.cc:4486
 hhistmap.cc:4487
 hhistmap.cc:4488
 hhistmap.cc:4489
 hhistmap.cc:4490
 hhistmap.cc:4491
 hhistmap.cc:4492
 hhistmap.cc:4493
 hhistmap.cc:4494
 hhistmap.cc:4495
 hhistmap.cc:4496
 hhistmap.cc:4497
 hhistmap.cc:4498
 hhistmap.cc:4499
 hhistmap.cc:4500
 hhistmap.cc:4501
 hhistmap.cc:4502
 hhistmap.cc:4503
 hhistmap.cc:4504
 hhistmap.cc:4505
 hhistmap.cc:4506
 hhistmap.cc:4507
 hhistmap.cc:4508
 hhistmap.cc:4509
 hhistmap.cc:4510
 hhistmap.cc:4511
 hhistmap.cc:4512
 hhistmap.cc:4513
 hhistmap.cc:4514
 hhistmap.cc:4515
 hhistmap.cc:4516
 hhistmap.cc:4517
 hhistmap.cc:4518
 hhistmap.cc:4519
 hhistmap.cc:4520
 hhistmap.cc:4521
 hhistmap.cc:4522
 hhistmap.cc:4523
 hhistmap.cc:4524
 hhistmap.cc:4525
 hhistmap.cc:4526
 hhistmap.cc:4527
 hhistmap.cc:4528
 hhistmap.cc:4529
 hhistmap.cc:4530
 hhistmap.cc:4531
 hhistmap.cc:4532
 hhistmap.cc:4533
 hhistmap.cc:4534
 hhistmap.cc:4535
 hhistmap.cc:4536
 hhistmap.cc:4537
 hhistmap.cc:4538
 hhistmap.cc:4539
 hhistmap.cc:4540
 hhistmap.cc:4541
 hhistmap.cc:4542
 hhistmap.cc:4543
 hhistmap.cc:4544
 hhistmap.cc:4545
 hhistmap.cc:4546
 hhistmap.cc:4547
 hhistmap.cc:4548
 hhistmap.cc:4549
 hhistmap.cc:4550
 hhistmap.cc:4551
 hhistmap.cc:4552
 hhistmap.cc:4553
 hhistmap.cc:4554
 hhistmap.cc:4555
 hhistmap.cc:4556
 hhistmap.cc:4557
 hhistmap.cc:4558
 hhistmap.cc:4559
 hhistmap.cc:4560
 hhistmap.cc:4561
 hhistmap.cc:4562
 hhistmap.cc:4563
 hhistmap.cc:4564
 hhistmap.cc:4565
 hhistmap.cc:4566
 hhistmap.cc:4567
 hhistmap.cc:4568
 hhistmap.cc:4569
 hhistmap.cc:4570
 hhistmap.cc:4571
 hhistmap.cc:4572
 hhistmap.cc:4573
 hhistmap.cc:4574
 hhistmap.cc:4575
 hhistmap.cc:4576
 hhistmap.cc:4577
 hhistmap.cc:4578
 hhistmap.cc:4579
 hhistmap.cc:4580
 hhistmap.cc:4581
 hhistmap.cc:4582
 hhistmap.cc:4583
 hhistmap.cc:4584
 hhistmap.cc:4585
 hhistmap.cc:4586
 hhistmap.cc:4587
 hhistmap.cc:4588
 hhistmap.cc:4589
 hhistmap.cc:4590
 hhistmap.cc:4591
 hhistmap.cc:4592
 hhistmap.cc:4593
 hhistmap.cc:4594
 hhistmap.cc:4595
 hhistmap.cc:4596
 hhistmap.cc:4597
 hhistmap.cc:4598
 hhistmap.cc:4599
 hhistmap.cc:4600
 hhistmap.cc:4601
 hhistmap.cc:4602
 hhistmap.cc:4603
 hhistmap.cc:4604
 hhistmap.cc:4605
 hhistmap.cc:4606
 hhistmap.cc:4607
 hhistmap.cc:4608
 hhistmap.cc:4609
 hhistmap.cc:4610
 hhistmap.cc:4611
 hhistmap.cc:4612
 hhistmap.cc:4613
 hhistmap.cc:4614
 hhistmap.cc:4615
 hhistmap.cc:4616
 hhistmap.cc:4617
 hhistmap.cc:4618
 hhistmap.cc:4619
 hhistmap.cc:4620
 hhistmap.cc:4621
 hhistmap.cc:4622
 hhistmap.cc:4623
 hhistmap.cc:4624
 hhistmap.cc:4625
 hhistmap.cc:4626
 hhistmap.cc:4627
 hhistmap.cc:4628
 hhistmap.cc:4629
 hhistmap.cc:4630
 hhistmap.cc:4631
 hhistmap.cc:4632
 hhistmap.cc:4633
 hhistmap.cc:4634
 hhistmap.cc:4635
 hhistmap.cc:4636
 hhistmap.cc:4637
 hhistmap.cc:4638
 hhistmap.cc:4639
 hhistmap.cc:4640
 hhistmap.cc:4641
 hhistmap.cc:4642
 hhistmap.cc:4643
 hhistmap.cc:4644
 hhistmap.cc:4645
 hhistmap.cc:4646
 hhistmap.cc:4647
 hhistmap.cc:4648
 hhistmap.cc:4649
 hhistmap.cc:4650
 hhistmap.cc:4651
 hhistmap.cc:4652
 hhistmap.cc:4653
 hhistmap.cc:4654
 hhistmap.cc:4655
 hhistmap.cc:4656
 hhistmap.cc:4657
 hhistmap.cc:4658
 hhistmap.cc:4659
 hhistmap.cc:4660
 hhistmap.cc:4661
 hhistmap.cc:4662
 hhistmap.cc:4663
 hhistmap.cc:4664
 hhistmap.cc:4665
 hhistmap.cc:4666
 hhistmap.cc:4667
 hhistmap.cc:4668
 hhistmap.cc:4669
 hhistmap.cc:4670
 hhistmap.cc:4671
 hhistmap.cc:4672
 hhistmap.cc:4673
 hhistmap.cc:4674
 hhistmap.cc:4675
 hhistmap.cc:4676
 hhistmap.cc:4677
 hhistmap.cc:4678
 hhistmap.cc:4679
 hhistmap.cc:4680
 hhistmap.cc:4681
 hhistmap.cc:4682
 hhistmap.cc:4683
 hhistmap.cc:4684
 hhistmap.cc:4685
 hhistmap.cc:4686
 hhistmap.cc:4687
 hhistmap.cc:4688
 hhistmap.cc:4689
 hhistmap.cc:4690
 hhistmap.cc:4691
 hhistmap.cc:4692
 hhistmap.cc:4693
 hhistmap.cc:4694
 hhistmap.cc:4695
 hhistmap.cc:4696
 hhistmap.cc:4697
 hhistmap.cc:4698
 hhistmap.cc:4699
 hhistmap.cc:4700
 hhistmap.cc:4701
 hhistmap.cc:4702
 hhistmap.cc:4703
 hhistmap.cc:4704
 hhistmap.cc:4705
 hhistmap.cc:4706
 hhistmap.cc:4707
 hhistmap.cc:4708
 hhistmap.cc:4709
 hhistmap.cc:4710
 hhistmap.cc:4711
 hhistmap.cc:4712
 hhistmap.cc:4713
 hhistmap.cc:4714
 hhistmap.cc:4715
 hhistmap.cc:4716
 hhistmap.cc:4717
 hhistmap.cc:4718
 hhistmap.cc:4719
 hhistmap.cc:4720
 hhistmap.cc:4721
 hhistmap.cc:4722
 hhistmap.cc:4723
 hhistmap.cc:4724
 hhistmap.cc:4725
 hhistmap.cc:4726
 hhistmap.cc:4727
 hhistmap.cc:4728
 hhistmap.cc:4729
 hhistmap.cc:4730
 hhistmap.cc:4731
 hhistmap.cc:4732
 hhistmap.cc:4733
 hhistmap.cc:4734
 hhistmap.cc:4735
 hhistmap.cc:4736
 hhistmap.cc:4737
 hhistmap.cc:4738
 hhistmap.cc:4739
 hhistmap.cc:4740
 hhistmap.cc:4741
 hhistmap.cc:4742
 hhistmap.cc:4743
 hhistmap.cc:4744
 hhistmap.cc:4745
 hhistmap.cc:4746
 hhistmap.cc:4747
 hhistmap.cc:4748
 hhistmap.cc:4749
 hhistmap.cc:4750
 hhistmap.cc:4751
 hhistmap.cc:4752
 hhistmap.cc:4753
 hhistmap.cc:4754
 hhistmap.cc:4755
 hhistmap.cc:4756
 hhistmap.cc:4757
 hhistmap.cc:4758
 hhistmap.cc:4759
 hhistmap.cc:4760
 hhistmap.cc:4761
 hhistmap.cc:4762
 hhistmap.cc:4763
 hhistmap.cc:4764
 hhistmap.cc:4765
 hhistmap.cc:4766
 hhistmap.cc:4767
 hhistmap.cc:4768
 hhistmap.cc:4769
 hhistmap.cc:4770
 hhistmap.cc:4771
 hhistmap.cc:4772
 hhistmap.cc:4773
 hhistmap.cc:4774
 hhistmap.cc:4775
 hhistmap.cc:4776
 hhistmap.cc:4777
 hhistmap.cc:4778
 hhistmap.cc:4779
 hhistmap.cc:4780
 hhistmap.cc:4781
 hhistmap.cc:4782
 hhistmap.cc:4783
 hhistmap.cc:4784
 hhistmap.cc:4785
 hhistmap.cc:4786
 hhistmap.cc:4787
 hhistmap.cc:4788
 hhistmap.cc:4789
 hhistmap.cc:4790
 hhistmap.cc:4791
 hhistmap.cc:4792
 hhistmap.cc:4793
 hhistmap.cc:4794
 hhistmap.cc:4795
 hhistmap.cc:4796
 hhistmap.cc:4797
 hhistmap.cc:4798
 hhistmap.cc:4799
 hhistmap.cc:4800
 hhistmap.cc:4801
 hhistmap.cc:4802
 hhistmap.cc:4803
 hhistmap.cc:4804
 hhistmap.cc:4805
 hhistmap.cc:4806
 hhistmap.cc:4807
 hhistmap.cc:4808
 hhistmap.cc:4809
 hhistmap.cc:4810
 hhistmap.cc:4811
 hhistmap.cc:4812
 hhistmap.cc:4813
 hhistmap.cc:4814
 hhistmap.cc:4815
 hhistmap.cc:4816
 hhistmap.cc:4817
 hhistmap.cc:4818
 hhistmap.cc:4819
 hhistmap.cc:4820
 hhistmap.cc:4821
 hhistmap.cc:4822
 hhistmap.cc:4823
 hhistmap.cc:4824
 hhistmap.cc:4825
 hhistmap.cc:4826
 hhistmap.cc:4827
 hhistmap.cc:4828
 hhistmap.cc:4829
 hhistmap.cc:4830
 hhistmap.cc:4831
 hhistmap.cc:4832
 hhistmap.cc:4833
 hhistmap.cc:4834
 hhistmap.cc:4835
 hhistmap.cc:4836
 hhistmap.cc:4837
 hhistmap.cc:4838
 hhistmap.cc:4839
 hhistmap.cc:4840
 hhistmap.cc:4841
 hhistmap.cc:4842
 hhistmap.cc:4843
 hhistmap.cc:4844
 hhistmap.cc:4845
 hhistmap.cc:4846
 hhistmap.cc:4847
 hhistmap.cc:4848
 hhistmap.cc:4849
 hhistmap.cc:4850
 hhistmap.cc:4851
 hhistmap.cc:4852
 hhistmap.cc:4853
 hhistmap.cc:4854
 hhistmap.cc:4855
 hhistmap.cc:4856
 hhistmap.cc:4857
 hhistmap.cc:4858
 hhistmap.cc:4859
 hhistmap.cc:4860
 hhistmap.cc:4861
 hhistmap.cc:4862
 hhistmap.cc:4863
 hhistmap.cc:4864
 hhistmap.cc:4865
 hhistmap.cc:4866
 hhistmap.cc:4867
 hhistmap.cc:4868
 hhistmap.cc:4869
 hhistmap.cc:4870
 hhistmap.cc:4871
 hhistmap.cc:4872
 hhistmap.cc:4873
 hhistmap.cc:4874
 hhistmap.cc:4875
 hhistmap.cc:4876
 hhistmap.cc:4877
 hhistmap.cc:4878
 hhistmap.cc:4879
 hhistmap.cc:4880
 hhistmap.cc:4881
 hhistmap.cc:4882
 hhistmap.cc:4883
 hhistmap.cc:4884
 hhistmap.cc:4885
 hhistmap.cc:4886
 hhistmap.cc:4887
 hhistmap.cc:4888
 hhistmap.cc:4889
 hhistmap.cc:4890
 hhistmap.cc:4891
 hhistmap.cc:4892
 hhistmap.cc:4893
 hhistmap.cc:4894
 hhistmap.cc:4895
 hhistmap.cc:4896
 hhistmap.cc:4897
 hhistmap.cc:4898
 hhistmap.cc:4899
 hhistmap.cc:4900
 hhistmap.cc:4901
 hhistmap.cc:4902
 hhistmap.cc:4903
 hhistmap.cc:4904
 hhistmap.cc:4905
 hhistmap.cc:4906
 hhistmap.cc:4907
 hhistmap.cc:4908
 hhistmap.cc:4909
 hhistmap.cc:4910
 hhistmap.cc:4911
 hhistmap.cc:4912
 hhistmap.cc:4913
 hhistmap.cc:4914
 hhistmap.cc:4915
 hhistmap.cc:4916
 hhistmap.cc:4917
 hhistmap.cc:4918
 hhistmap.cc:4919
 hhistmap.cc:4920
 hhistmap.cc:4921
 hhistmap.cc:4922
 hhistmap.cc:4923
 hhistmap.cc:4924
 hhistmap.cc:4925
 hhistmap.cc:4926
 hhistmap.cc:4927
 hhistmap.cc:4928
 hhistmap.cc:4929
 hhistmap.cc:4930
 hhistmap.cc:4931
 hhistmap.cc:4932
 hhistmap.cc:4933
 hhistmap.cc:4934
 hhistmap.cc:4935
 hhistmap.cc:4936
 hhistmap.cc:4937
 hhistmap.cc:4938
 hhistmap.cc:4939
 hhistmap.cc:4940
 hhistmap.cc:4941
 hhistmap.cc:4942
 hhistmap.cc:4943
 hhistmap.cc:4944
 hhistmap.cc:4945
 hhistmap.cc:4946
 hhistmap.cc:4947
 hhistmap.cc:4948
 hhistmap.cc:4949
 hhistmap.cc:4950
 hhistmap.cc:4951
 hhistmap.cc:4952
 hhistmap.cc:4953
 hhistmap.cc:4954
 hhistmap.cc:4955
 hhistmap.cc:4956
 hhistmap.cc:4957
 hhistmap.cc:4958
 hhistmap.cc:4959
 hhistmap.cc:4960
 hhistmap.cc:4961
 hhistmap.cc:4962
 hhistmap.cc:4963
 hhistmap.cc:4964
 hhistmap.cc:4965
 hhistmap.cc:4966
 hhistmap.cc:4967
 hhistmap.cc:4968
 hhistmap.cc:4969
 hhistmap.cc:4970
 hhistmap.cc:4971
 hhistmap.cc:4972
 hhistmap.cc:4973
 hhistmap.cc:4974
 hhistmap.cc:4975
 hhistmap.cc:4976
 hhistmap.cc:4977
 hhistmap.cc:4978
 hhistmap.cc:4979
 hhistmap.cc:4980
 hhistmap.cc:4981
 hhistmap.cc:4982
 hhistmap.cc:4983
 hhistmap.cc:4984
 hhistmap.cc:4985
 hhistmap.cc:4986
 hhistmap.cc:4987
 hhistmap.cc:4988
 hhistmap.cc:4989
 hhistmap.cc:4990
 hhistmap.cc:4991
 hhistmap.cc:4992
 hhistmap.cc:4993
 hhistmap.cc:4994
 hhistmap.cc:4995
 hhistmap.cc:4996
 hhistmap.cc:4997
 hhistmap.cc:4998
 hhistmap.cc:4999
 hhistmap.cc:5000
 hhistmap.cc:5001
 hhistmap.cc:5002
 hhistmap.cc:5003
 hhistmap.cc:5004
 hhistmap.cc:5005
 hhistmap.cc:5006
 hhistmap.cc:5007
 hhistmap.cc:5008
 hhistmap.cc:5009
 hhistmap.cc:5010
 hhistmap.cc:5011
 hhistmap.cc:5012
 hhistmap.cc:5013
 hhistmap.cc:5014
 hhistmap.cc:5015
 hhistmap.cc:5016
 hhistmap.cc:5017
 hhistmap.cc:5018
 hhistmap.cc:5019
 hhistmap.cc:5020
 hhistmap.cc:5021
 hhistmap.cc:5022
 hhistmap.cc:5023
 hhistmap.cc:5024
 hhistmap.cc:5025
 hhistmap.cc:5026
 hhistmap.cc:5027
 hhistmap.cc:5028
 hhistmap.cc:5029