ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// class for handling histograms
// author: Eulogio Serradilla <eulogio.serradilla@cern.ch>

#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)
{
//
// Default constructor
//
	fHistoMap = new TMap();
	fHistoMap->SetOwner(kFALSE);
}

AliLnHistoMap::~AliLnHistoMap()
{
//
// Default destructor
//
	delete fHistoMap;
	
}

/*
Int_t AliLnHistoMap::Write(const char *name, Int_t option, Int_t bsize) const
{
//
// write only the histograms
//
	Int_t nbytes = 0;
	
	TObjString* key;
	TIter hIter(fHistoMap);
	while( (key = (TObjString*)hIter.Next()) )
	{
		if(fHistoMap->GetValue(key)->InheritsFrom("TH1"))
		{
			nbytes += ((TH1*)fHistoMap->GetValue(key))->Write(name,option,bsize);
		}
	}
	
	return nbytes;
}

Int_t AliLnHistoMap::Write(const char *name, Int_t option, Int_t bsize)
{
// write only the histograms
//
	return ((const AliLnHistoMap*)this)->Write(name,option,bsize);
}
*/

TObject* AliLnHistoMap::Add(const TString& keyname, TObject* value)
{
//
// Add a TObject to the histogram map
//
	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)
{
//
// Add a TH1D histogram to the histogram map
//
	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)
{
//
// Add a TH1D histogram with variable bin size
//
	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)
{
//
// Add a TH2D histogram to the output map
//
	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)
{
//
// Add a TH2D histogram with variable bin size
//
	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)
{
//
// Add a TH2D histogram with variable bin size
//
	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)
{
//
// Add a TH2D histogram with variable bin size
//
	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)
{
//
// transform linear X-axis bins to logarithmic bins
//
	return this->SetLogBins(h->GetXaxis());
}

Bool_t AliLnHistoMap::SetLogYaxis(TH1* h)
{
//
// transform linear Y-axis bins to logarithmic bins
//
	return this->SetLogBins(h->GetYaxis());
}

Bool_t AliLnHistoMap::SetLogBins(TAxis* axis)
{
//
// transform linear bins to logarithmic bins
// (adapted from TPad)
//
	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;
}
 AliLnHistoMap.cxx:1
 AliLnHistoMap.cxx:2
 AliLnHistoMap.cxx:3
 AliLnHistoMap.cxx:4
 AliLnHistoMap.cxx:5
 AliLnHistoMap.cxx:6
 AliLnHistoMap.cxx:7
 AliLnHistoMap.cxx:8
 AliLnHistoMap.cxx:9
 AliLnHistoMap.cxx:10
 AliLnHistoMap.cxx:11
 AliLnHistoMap.cxx:12
 AliLnHistoMap.cxx:13
 AliLnHistoMap.cxx:14
 AliLnHistoMap.cxx:15
 AliLnHistoMap.cxx:16
 AliLnHistoMap.cxx:17
 AliLnHistoMap.cxx:18
 AliLnHistoMap.cxx:19
 AliLnHistoMap.cxx:20
 AliLnHistoMap.cxx:21
 AliLnHistoMap.cxx:22
 AliLnHistoMap.cxx:23
 AliLnHistoMap.cxx:24
 AliLnHistoMap.cxx:25
 AliLnHistoMap.cxx:26
 AliLnHistoMap.cxx:27
 AliLnHistoMap.cxx:28
 AliLnHistoMap.cxx:29
 AliLnHistoMap.cxx:30
 AliLnHistoMap.cxx:31
 AliLnHistoMap.cxx:32
 AliLnHistoMap.cxx:33
 AliLnHistoMap.cxx:34
 AliLnHistoMap.cxx:35
 AliLnHistoMap.cxx:36
 AliLnHistoMap.cxx:37
 AliLnHistoMap.cxx:38
 AliLnHistoMap.cxx:39
 AliLnHistoMap.cxx:40
 AliLnHistoMap.cxx:41
 AliLnHistoMap.cxx:42
 AliLnHistoMap.cxx:43
 AliLnHistoMap.cxx:44
 AliLnHistoMap.cxx:45
 AliLnHistoMap.cxx:46
 AliLnHistoMap.cxx:47
 AliLnHistoMap.cxx:48
 AliLnHistoMap.cxx:49
 AliLnHistoMap.cxx:50
 AliLnHistoMap.cxx:51
 AliLnHistoMap.cxx:52
 AliLnHistoMap.cxx:53
 AliLnHistoMap.cxx:54
 AliLnHistoMap.cxx:55
 AliLnHistoMap.cxx:56
 AliLnHistoMap.cxx:57
 AliLnHistoMap.cxx:58
 AliLnHistoMap.cxx:59
 AliLnHistoMap.cxx:60
 AliLnHistoMap.cxx:61
 AliLnHistoMap.cxx:62
 AliLnHistoMap.cxx:63
 AliLnHistoMap.cxx:64
 AliLnHistoMap.cxx:65
 AliLnHistoMap.cxx:66
 AliLnHistoMap.cxx:67
 AliLnHistoMap.cxx:68
 AliLnHistoMap.cxx:69
 AliLnHistoMap.cxx:70
 AliLnHistoMap.cxx:71
 AliLnHistoMap.cxx:72
 AliLnHistoMap.cxx:73
 AliLnHistoMap.cxx:74
 AliLnHistoMap.cxx:75
 AliLnHistoMap.cxx:76
 AliLnHistoMap.cxx:77
 AliLnHistoMap.cxx:78
 AliLnHistoMap.cxx:79
 AliLnHistoMap.cxx:80
 AliLnHistoMap.cxx:81
 AliLnHistoMap.cxx:82
 AliLnHistoMap.cxx:83
 AliLnHistoMap.cxx:84
 AliLnHistoMap.cxx:85
 AliLnHistoMap.cxx:86
 AliLnHistoMap.cxx:87
 AliLnHistoMap.cxx:88
 AliLnHistoMap.cxx:89
 AliLnHistoMap.cxx:90
 AliLnHistoMap.cxx:91
 AliLnHistoMap.cxx:92
 AliLnHistoMap.cxx:93
 AliLnHistoMap.cxx:94
 AliLnHistoMap.cxx:95
 AliLnHistoMap.cxx:96
 AliLnHistoMap.cxx:97
 AliLnHistoMap.cxx:98
 AliLnHistoMap.cxx:99
 AliLnHistoMap.cxx:100
 AliLnHistoMap.cxx:101
 AliLnHistoMap.cxx:102
 AliLnHistoMap.cxx:103
 AliLnHistoMap.cxx:104
 AliLnHistoMap.cxx:105
 AliLnHistoMap.cxx:106
 AliLnHistoMap.cxx:107
 AliLnHistoMap.cxx:108
 AliLnHistoMap.cxx:109
 AliLnHistoMap.cxx:110
 AliLnHistoMap.cxx:111
 AliLnHistoMap.cxx:112
 AliLnHistoMap.cxx:113
 AliLnHistoMap.cxx:114
 AliLnHistoMap.cxx:115
 AliLnHistoMap.cxx:116
 AliLnHistoMap.cxx:117
 AliLnHistoMap.cxx:118
 AliLnHistoMap.cxx:119
 AliLnHistoMap.cxx:120
 AliLnHistoMap.cxx:121
 AliLnHistoMap.cxx:122
 AliLnHistoMap.cxx:123
 AliLnHistoMap.cxx:124
 AliLnHistoMap.cxx:125
 AliLnHistoMap.cxx:126
 AliLnHistoMap.cxx:127
 AliLnHistoMap.cxx:128
 AliLnHistoMap.cxx:129
 AliLnHistoMap.cxx:130
 AliLnHistoMap.cxx:131
 AliLnHistoMap.cxx:132
 AliLnHistoMap.cxx:133
 AliLnHistoMap.cxx:134
 AliLnHistoMap.cxx:135
 AliLnHistoMap.cxx:136
 AliLnHistoMap.cxx:137
 AliLnHistoMap.cxx:138
 AliLnHistoMap.cxx:139
 AliLnHistoMap.cxx:140
 AliLnHistoMap.cxx:141
 AliLnHistoMap.cxx:142
 AliLnHistoMap.cxx:143
 AliLnHistoMap.cxx:144
 AliLnHistoMap.cxx:145
 AliLnHistoMap.cxx:146
 AliLnHistoMap.cxx:147
 AliLnHistoMap.cxx:148
 AliLnHistoMap.cxx:149
 AliLnHistoMap.cxx:150
 AliLnHistoMap.cxx:151
 AliLnHistoMap.cxx:152
 AliLnHistoMap.cxx:153
 AliLnHistoMap.cxx:154
 AliLnHistoMap.cxx:155
 AliLnHistoMap.cxx:156
 AliLnHistoMap.cxx:157
 AliLnHistoMap.cxx:158
 AliLnHistoMap.cxx:159
 AliLnHistoMap.cxx:160
 AliLnHistoMap.cxx:161
 AliLnHistoMap.cxx:162
 AliLnHistoMap.cxx:163
 AliLnHistoMap.cxx:164
 AliLnHistoMap.cxx:165
 AliLnHistoMap.cxx:166
 AliLnHistoMap.cxx:167
 AliLnHistoMap.cxx:168
 AliLnHistoMap.cxx:169
 AliLnHistoMap.cxx:170
 AliLnHistoMap.cxx:171
 AliLnHistoMap.cxx:172
 AliLnHistoMap.cxx:173
 AliLnHistoMap.cxx:174
 AliLnHistoMap.cxx:175
 AliLnHistoMap.cxx:176
 AliLnHistoMap.cxx:177
 AliLnHistoMap.cxx:178
 AliLnHistoMap.cxx:179
 AliLnHistoMap.cxx:180
 AliLnHistoMap.cxx:181
 AliLnHistoMap.cxx:182
 AliLnHistoMap.cxx:183
 AliLnHistoMap.cxx:184
 AliLnHistoMap.cxx:185
 AliLnHistoMap.cxx:186
 AliLnHistoMap.cxx:187
 AliLnHistoMap.cxx:188
 AliLnHistoMap.cxx:189
 AliLnHistoMap.cxx:190
 AliLnHistoMap.cxx:191
 AliLnHistoMap.cxx:192
 AliLnHistoMap.cxx:193
 AliLnHistoMap.cxx:194
 AliLnHistoMap.cxx:195
 AliLnHistoMap.cxx:196
 AliLnHistoMap.cxx:197
 AliLnHistoMap.cxx:198
 AliLnHistoMap.cxx:199
 AliLnHistoMap.cxx:200
 AliLnHistoMap.cxx:201
 AliLnHistoMap.cxx:202
 AliLnHistoMap.cxx:203
 AliLnHistoMap.cxx:204
 AliLnHistoMap.cxx:205
 AliLnHistoMap.cxx:206
 AliLnHistoMap.cxx:207
 AliLnHistoMap.cxx:208
 AliLnHistoMap.cxx:209
 AliLnHistoMap.cxx:210
 AliLnHistoMap.cxx:211
 AliLnHistoMap.cxx:212
 AliLnHistoMap.cxx:213
 AliLnHistoMap.cxx:214
 AliLnHistoMap.cxx:215
 AliLnHistoMap.cxx:216
 AliLnHistoMap.cxx:217
 AliLnHistoMap.cxx:218
 AliLnHistoMap.cxx:219
 AliLnHistoMap.cxx:220
 AliLnHistoMap.cxx:221
 AliLnHistoMap.cxx:222
 AliLnHistoMap.cxx:223
 AliLnHistoMap.cxx:224
 AliLnHistoMap.cxx:225
 AliLnHistoMap.cxx:226
 AliLnHistoMap.cxx:227
 AliLnHistoMap.cxx:228
 AliLnHistoMap.cxx:229
 AliLnHistoMap.cxx:230
 AliLnHistoMap.cxx:231
 AliLnHistoMap.cxx:232
 AliLnHistoMap.cxx:233
 AliLnHistoMap.cxx:234
 AliLnHistoMap.cxx:235
 AliLnHistoMap.cxx:236
 AliLnHistoMap.cxx:237
 AliLnHistoMap.cxx:238
 AliLnHistoMap.cxx:239
 AliLnHistoMap.cxx:240
 AliLnHistoMap.cxx:241
 AliLnHistoMap.cxx:242
 AliLnHistoMap.cxx:243
 AliLnHistoMap.cxx:244
 AliLnHistoMap.cxx:245