#include <Riostream.h>
#include <TString.h>
#include <TMap.h>
#include <TH1.h>
#include <TAxis.h>
#include <TH1D.h>
#include <TH2D.h>
#include <TObjString.h>
#include <TMath.h>
#include "AliLnHistoMap.h"
ClassImp(AliLnHistoMap)
AliLnHistoMap::AliLnHistoMap()
: TObject()
, fHistoMap(0)
{
fHistoMap = new TMap();
fHistoMap->SetOwner(kFALSE);
}
AliLnHistoMap::~AliLnHistoMap()
{
delete fHistoMap;
}
TObject* AliLnHistoMap::Add(const TString& keyname, TObject* value)
{
if(fHistoMap->Contains(keyname.Data()))
{
fHistoMap->Warning("Add", "object %s already exists", keyname.Data());
return 0;
}
TObjString* key = new TObjString(keyname.Data());
fHistoMap->Add((TObject*)key, value);
return value;
}
TH1D* AliLnHistoMap::Add(const TString& name, Int_t nbins, Double_t xmin, Double_t xmax, const TString& title, const TString& xlabel, const TString& ylabel, Bool_t logx)
{
TH1D* value = 0;
if(fHistoMap->Contains(name.Data()))
{
fHistoMap->Warning("Add", "histogram %s already exists", name.Data());
}
else
{
TObjString* key = new TObjString(name.Data());
value = new TH1D(name.Data(),title.Data(),nbins,xmin,xmax);
value->SetXTitle(xlabel.Data());
value->SetYTitle(ylabel.Data());
if(logx) this->SetLogXaxis(value);
fHistoMap->Add((TObject*)key, (TObject*)value);
}
return value;
}
TH1D* AliLnHistoMap::Add(const TString& name, Int_t nbins, Double_t* xbins, const TString& title, const TString& xlabel, const TString& ylabel)
{
TH1D* h = this->Add(name,nbins,xbins[0],xbins[nbins],title,xlabel,ylabel);
h->GetXaxis()->Set(nbins, xbins);
return h;
}
TH2D* AliLnHistoMap::Add(const TString& name, Int_t xbins, Double_t xmin, Double_t xmax, Int_t ybins, Double_t ymin, Double_t ymax, const TString& title, const TString& xlabel, const TString& ylabel, Bool_t logx, Bool_t logy)
{
TH2D* value = 0;
if(fHistoMap->Contains(name.Data()))
{
fHistoMap->Warning("Add", "histogram %s already exists", name.Data());
}
else
{
TObjString* key = new TObjString(name.Data());
value = new TH2D(name.Data(),title.Data(),xbins,xmin,xmax,ybins,ymin,ymax);
value->SetXTitle(xlabel.Data());
value->SetYTitle(ylabel.Data());
if(logx) this->SetLogXaxis(value);
if(logy) this->SetLogYaxis(value);
fHistoMap->Add((TObject*)key, (TObject*)value);
}
return value;
}
TH2D* AliLnHistoMap::Add(const TString& name, Int_t nbinsx, Double_t* xbins, Int_t nbinsy, Double_t* ybins, const TString& title, const TString& xlabel, const TString& ylabel)
{
TH2D* h = this->Add(name, nbinsx, xbins[0], xbins[nbinsx], nbinsy, ybins[0], ybins[nbinsy], title, xlabel, ylabel);
h->GetXaxis()->Set(nbinsx, xbins);
h->GetYaxis()->Set(nbinsy, ybins);
return h;
}
TH2D* AliLnHistoMap::Add(const TString& name, Int_t nbins, Double_t* xbins, Int_t ybins, Double_t ymin, Double_t ymax, const TString& title, const TString& xlabel, const TString& ylabel)
{
TH2D* h = this->Add(name, nbins, xbins[0], xbins[nbins], ybins, ymin, ymax, title, xlabel, ylabel);
h->GetXaxis()->Set(nbins, xbins);
return h;
}
TH2D* AliLnHistoMap::Add(const TString& name, Int_t xbins, Double_t xmin, Double_t xmax, Int_t nbins, Double_t* ybins, const TString& title, const TString& xlabel, const TString& ylabel)
{
TH2D* h = this->Add(name, xbins, xmin, xmax, nbins, ybins[0], ybins[nbins], title, xlabel, ylabel);
h->GetYaxis()->Set(nbins, ybins);
return h;
}
Bool_t AliLnHistoMap::SetLogXaxis(TH1* h)
{
return this->SetLogBins(h->GetXaxis());
}
Bool_t AliLnHistoMap::SetLogYaxis(TH1* h)
{
return this->SetLogBins(h->GetYaxis());
}
Bool_t AliLnHistoMap::SetLogBins(TAxis* axis)
{
if(axis == 0) return kFALSE;
Double_t xmin = axis->GetXmin();
Double_t xmax = axis->GetXmax();
if(xmin <= 0)
{
fHistoMap->Warning("SetLogBins", "no log bins, xmin=%f is <= 0", xmin);
return kFALSE;
}
Int_t nbins = axis->GetNbins();
Double_t xminl = TMath::Log(xmin);
Double_t xmaxl = TMath::Log(xmax);
Double_t dx = (xmaxl-xminl)/nbins;
Double_t* xbins = new Double_t[nbins+1];
xbins[0] = xmin;
for (Int_t i=1; i<=nbins; ++i)
{
xbins[i] = TMath::Exp(xminl+i*dx);
}
axis->Set(nbins, xbins);
delete[] xbins;
return kTRUE;
}