ROOT logo
/************************************************************************* 
* Copyright(c) 1998-2008, 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.                  * 
**************************************************************************/

// -----------------------------------------------------------------------
//  Tools for drawing/ manipulating histograms. (NEEDS CLEANUP!)
// -----------------------------------------------------------------------
//  Author: Misha Veldhoen (misha.veldhoen@cern.ch)

#include "AliHistToolsDiHadronPID.h"

#include <iostream>
using namespace std;

#include "TLegend.h"
#include "TMath.h"
#include "TF1.h"
#include "THn.h"
#include "TObjArray.h"
#include "TStyle.h"
#include "TArray.h"

// -----------------------------------------------------------------------
TH1F* AliHistToolsDiHadronPID::RebinVariableBinning(
	const TH1F* histIn, const Double_t* binsx, Int_t Nbinsx, Bool_t density) {

	// Rebins a histogram (hin) with a variable binning to a histogram
	// with another variable binning (binsx). If the "density" flag is set,
	// then it is expected that the bins are per unit x-axis, otherwise an
	// absolute count is assumed.
	//
	// TODO: determine over/under-flow bins.

	// Gather info from the original histogram.
	const TArrayD* binsxIn = histIn->GetXaxis()->GetXbins();
	TArrayD* binsxOut = new TArrayD(Nbinsx + 1,binsx);
	Int_t NbinsxIn = binsxIn->GetSize() - 1;
	const char* nameIn = histIn->GetName();
	const char* titleIn = histIn->GetTitle();
	const char* xAxisTitleIn = histIn->GetXaxis()->GetTitle(); 
	const char* yAxisTitleIn = histIn->GetYaxis()->GetTitle();

	// Gather info from the output histogram and create it.
	Int_t NbinsxOut = binsxOut->GetSize() - 1;
	const char* nameOut = Form("%s (rebinned)",nameIn);
	const char* titleOut = Form("%s_rebinned;%s;%s",titleIn,xAxisTitleIn,yAxisTitleIn);
	TH1F* histOut = new TH1F(nameOut,titleOut,NbinsxOut,binsxOut->GetArray());
	//histOut->Sumw2();

	// Filling the bins.
	for (Int_t iBinOut = 0; iBinOut < NbinsxOut; iBinOut++) {

		Double_t binOutLowEdge = binsxOut->At(iBinOut);
		Double_t binOutHighEdge = binsxOut->At(iBinOut+1);
		Double_t binOutWidth = binOutHighEdge - binOutLowEdge;
		//Double_t binOutCenter = binOutHighEdge - binOutWidth/2.;

		// Setting all errors of the outgoing histogram to zero (needed later):
		histOut->SetBinError(iBinOut+1,0.);

		for (Int_t iBinIn = 0; iBinIn < NbinsxIn; iBinIn++) {
			
			Double_t binInLowEdge = binsxIn->At(iBinIn);
			Double_t binInHighEdge = binsxIn->At(iBinIn+1);
			Double_t binInWidth = binInHighEdge - binInLowEdge;
			//Double_t binInCenter = binInHighEdge - binInWidth/2.;
			Double_t binInContent = histIn->GetBinContent(iBinIn+1);
			Double_t binInError2 = histIn->GetBinError(iBinIn+1)*histIn->GetBinError(iBinIn+1);

			/* -- Determining what percentage of the in-bin is included 
			   in the current out-bin -- */
			Double_t PercentageIncluded = 0.;

			// Position of the low edge of the in-bin:
			// In  1   2   3            
			// Out   |   |
			Int_t binInLowEdgePos = 0;
			if (binInLowEdge < binOutLowEdge) binInLowEdgePos = 1;
			else if (binInLowEdge > binOutHighEdge) binInLowEdgePos = 3;
			else binInLowEdgePos = 2;

			// Same for the high edge of the in-bin:
			Int_t binInHighEdgePos = 0;
			if (binInHighEdge < binOutLowEdge) binInHighEdgePos = 1;
			else if (binInHighEdge > binOutHighEdge) binInHighEdgePos = 3;
			else binInHighEdgePos = 2;

			// In-bin not included.
			// In        | |     or     | |
			// Out |   |                    |    |
			if ( binInLowEdgePos == 3 || binInHighEdgePos == 1 ) {
				//cout<<"In-bin not included."<<endl;
				PercentageIncluded = 0.;
			}

			// In-bin partially included (left side).
			// In    |    |
			// Out |  |
			else if ( binInLowEdgePos == 2 && binInHighEdgePos == 3 ) {
				//cout<<"In-bin partially included (left side)."<<endl;
				PercentageIncluded = (binOutHighEdge - binInLowEdge)/(binInHighEdge - binInLowEdge);
			}

			// In-bin partially included (middle).
			// In    |     |
			// Out     |  |
			else if ( binInLowEdgePos == 1 && binInHighEdgePos == 3 ) {
				//cout<<"In-bin partially included (middle)."<<endl;
				PercentageIncluded = (binOutHighEdge - binOutLowEdge)/(binInHighEdge - binInLowEdge);
			}

			// In-bin partially included (right side).
			// In    |     |
			// Out        |  |
			else if ( binInLowEdgePos == 1 && binInHighEdgePos == 2 ) {
				//cout<<"In-bin partially included (right side)."<<endl;
				PercentageIncluded = (binInHighEdge - binOutLowEdge)/(binInHighEdge - binInLowEdge);
			}

			// In-bin completely included.
			// In    |  |
			// Out  |    |
			else if ( binInLowEdgePos == 2 && binInHighEdgePos == 2 ) {
				//cout<<"In-bin completely included."<<endl;
				PercentageIncluded = 1.;
			}

			// Give some status:
			//cout<<"Bin Out: "<<iBinOut+1<<" ("<<binOutLowEdge<<","<<binOutHighEdge<<")  Bin In: "<<iBinIn+1<<" ("<<binInLowEdge<<","<<binInHighEdge<<"), content: "<<binInContent<<" +/- "<<TMath::Sqrt(binInError2)<<". Bin in Pos: "<<binInLowEdgePos<<" "<<binInHighEdgePos<<" pct: "<<PercentageIncluded<<endl; 

			//else cout<<"Something weird just happened."<<endl;

			Double_t binOutAddedError2 = 0.;
			binOutAddedError2 = binInError2 * PercentageIncluded * PercentageIncluded;
			Double_t binOutAddedContent = 0.;
			binOutAddedContent = binInContent * PercentageIncluded;

			if (density) {
				binOutAddedContent*=binInWidth;
			}
			
			//histOut->Fill(binOutCenter,binOutAddedContent);
			histOut->SetBinContent(iBinOut+1,histOut->GetBinContent(iBinOut+1)+binOutAddedContent);

			//cout<<histOut->GetBinError(iBinOut+1)<<endl;
			//cout<<binOutAddedError2<<endl;
			histOut->SetBinError(iBinOut+1,histOut->GetBinError(iBinOut+1)+binOutAddedError2);
			//cout<<histOut->GetBinError(iBinOut+1)<<endl;
		}

		// Once a certain binOut has been filled all the way we have to scale
		// it if the "density" flag is set.

		histOut->SetBinContent(iBinOut + 1,histOut->GetBinContent(iBinOut+1)/binOutWidth);
		histOut->SetBinError(iBinOut + 1,TMath::Sqrt(histOut->GetBinError(iBinOut+1)));
		//cout<<histOut->GetBinError(iBinOut+1)<<endl;
	}

	return histOut;

}

// -----------------------------------------------------------------------
TH1F* AliHistToolsDiHadronPID::RebinVariableBinning(const TH1F* histIn, const TH1F* histAxis, Bool_t density) {

	// Rebins histogram histIn to the x-axis of histAxis
	const TAxis* xaxis = histAxis->GetXaxis();
	Int_t nbinsx = xaxis->GetNbins();
	const Double_t* binsx = (xaxis->GetXbins())->GetArray();
	return RebinVariableBinning(histIn, const_cast<Double_t*>(binsx), nbinsx, density);

}

// -----------------------------------------------------------------------
TH1F* AliHistToolsDiHadronPID::RebinVariableBinning(const TH1F* histIn, const TAxis* xaxis, Bool_t density) {

	// Rebins histogram histIn to the x-axis of histAxis
	Int_t nbinsx = xaxis->GetNbins();
	const Double_t* binsx = (xaxis->GetXbins())->GetArray();
	return RebinVariableBinning(histIn, const_cast<Double_t*>(binsx), nbinsx, density);

}

// -----------------------------------------------------------------------
TH1F* AliHistToolsDiHadronPID::TrimHisto(const TH1F* histo, Int_t firstbin, Int_t lastbin) {

	const char* name = histo->GetName();
	const char* title = histo->GetTitle();
	if (firstbin < 0) return 0x0;
	if (lastbin > histo->GetNbinsX()) return 0x0;
	if (firstbin > lastbin) return 0x0;

	Int_t Nbins = lastbin - firstbin + 1;
	cout<<firstbin<<" "<<lastbin<<" "<<Nbins<<endl;
	//const Int_t NbinsC = Nbins;
	Double_t newaxis[41];

	for (Int_t ii = firstbin; ii < lastbin+1; ii++) {
		newaxis[ii - firstbin] = histo->GetBinLowEdge(ii); 
		//cout<<ii-firstbin<<" "<<newaxis[ii - firstbin]<<endl;
	}
	newaxis[Nbins] = histo->GetBinLowEdge(lastbin+1);

	TH1F* hout = new TH1F("hout","hout",Nbins,newaxis);
	hout->SetDirectory(0);
	hout->SetTitle(title);
	hout->SetName(name);

	for (Int_t ii = 0; ii < Nbins+1; ii++) {
		hout->SetBinContent(ii,histo->GetBinContent(firstbin+ii));
		hout->SetBinError(ii,histo->GetBinError(firstbin+ii));
	} 

	return hout;

}

// -----------------------------------------------------------------------
void AliHistToolsDiHadronPID::ConstMinusHist(TH1F* histo, Float_t cc) {

	// h -> (c-h)
	Int_t nbins = histo->GetNbinsX();
	for (Int_t iBin = 0; iBin < (nbins + 1); iBin++) {
		Float_t bincontent = histo->GetBinContent(iBin);
		histo->SetBinContent(iBin,(cc - bincontent));
	}

}

// -----------------------------------------------------------------------
TH3F* AliHistToolsDiHadronPID::MakeHist3D(const char* name, const char* title, 
	Int_t nbinsX, Double_t minX, Double_t maxX,
	Int_t nbinsY, Double_t minY, Double_t maxY,
	Int_t nbinsZ, const Double_t* zaxis) {

	const Double_t* xaxis = const_cast<Double_t*>(CreateAxis(nbinsX,minX,maxX));
	const Double_t* yaxis = const_cast<Double_t*>(CreateAxis(nbinsY,minY,maxY));

	TH3F* hout = new TH3F(name,title,nbinsX,xaxis,nbinsY,yaxis,nbinsZ,zaxis);

	return hout;

}

// -----------------------------------------------------------------------
TH2F* AliHistToolsDiHadronPID::Function2DToHist2D(const TF2* function, const TH2* grid) {

	// Creates a 2D histogram of "function" using the binning of 
	// the histogram "grid". 
	//  - We assume "grid" to have fixed binwidth.
	//  - Bins are only filled if they are within the domain of the function.
	//  - Histogram takes over the color of the function.

	// Gathering info about the axes.
	const TAxis* Xaxis = grid->GetXaxis();
	Int_t NbinsX = Xaxis->GetNbins();
	const TAxis* Yaxis = grid->GetYaxis();
	Int_t NbinsY = Yaxis->GetNbins();

	// Determining function range.
	Double_t Xmin = 0.; 
	Double_t Xmax = 0.; 
	Double_t Ymin = 0.; 
	Double_t Ymax = 0.;
	function->GetRange(Xmin, Ymin, Xmax, Ymax);

	// Creating the histogram.
	TH2F* hout = new TH2F(Form("%s_hist", function->GetName()),
		Form("%s (Hist);%s;%s", function->GetTitle(), Xaxis->GetTitle(), Yaxis->GetTitle()),
		NbinsX, Xaxis->GetBinLowEdge(1), Xaxis->GetBinUpEdge(NbinsX),
		NbinsY, Yaxis->GetBinLowEdge(1), Yaxis->GetBinUpEdge(NbinsY));
	hout->SetLineColor(function->GetLineColor());
	hout->SetMarkerColor(function->GetLineColor());
	hout->SetDirectory(0);

	// Filling the histogram.
	for (Int_t iBinX = 1; iBinX < (NbinsX + 1); iBinX++) {
		for (Int_t iBinY = 1; iBinY < (NbinsY + 1); iBinY++) {
			Double_t CoordX = Xaxis->GetBinCenter(iBinX);
			Double_t CoordY = Yaxis->GetBinCenter(iBinY);

			if ( (CoordX < Xmin) || (CoordX > Xmax) || (CoordY < Ymin) || (CoordY > Ymax) ) {continue;}

			hout->SetBinContent(iBinX, iBinY, function->Eval(CoordX, CoordY));
		}		
	}

	return hout;

}

// -----------------------------------------------------------------------
TCanvas* AliHistToolsDiHadronPID::CreateSpectraComparison(const char* name, 
	const char* title, const TH1F* h1, const TH1F* h2, Int_t markerstyle, Bool_t logy) {

	// - Creates a window comparing two histograms h1, and h2.
	// - Returns an array of pointers to the objects created
	//   in this function.

	//Int_t optstat = gStyle->GetOptStat();
	gStyle->SetOptStat(0);
	//c->UseCurrentStyle();
	//gStyle->SetOptStat(optstat);

	TH1F* spectra[2];
	TH1F* division;
	Int_t spectracolor[2] = {1,2};
	Int_t divisioncolor = 4;

	// Cloning and configuring spectra.
	spectra[0] = (TH1F*)h1->Clone();
	//spectra[0]->SetDirectory(0);
	spectra[1] = (TH1F*)h2->Clone();
	//spactra[1]->SetDirectory(0);	
	for (Int_t iSpectra = 0; iSpectra < 2; iSpectra++) {
		spectra[iSpectra]->Sumw2();
		spectra[iSpectra]->SetMarkerStyle(markerstyle);
		spectra[iSpectra]->SetLineColor(spectracolor[iSpectra]);
		spectra[iSpectra]->SetMarkerColor(spectracolor[iSpectra]);
	}

	// Creating the division.
	division = (TH1F*)spectra[0]->Clone("hDivision");
	division->Divide(spectra[1]);
	division->SetLineColor(divisioncolor);
	division->SetMarkerColor(divisioncolor);
	division->GetYaxis()->SetTitle("Ratio");

	// Creating window
	//TCanvas* c = new TCanvas(name,title,0,0,400,400);
	TCanvas* c = TCanvas::MakeDefCanvas();
	c->SetName(name);
	c->SetTitle(title);
	TPad* p1 = new TPad("p1","pad1",0,0.25,1,1);
	p1->SetRightMargin(0.05);
	p1->SetBottomMargin(0.);
	TPad* p2 = new TPad("p2","pad2",0,0,1,0.25);
	p2->SetTopMargin(0.);
	p2->SetRightMargin(0.05);
	p2->SetBottomMargin(0.3);
	p2->SetFillStyle(4000);
	p1->Draw();
	p2->Draw();

	// Determining plotting range.
	Double_t max = TMath::Max(spectra[0]->GetMaximum(),spectra[1]->GetMaximum());
	Double_t min = TMath::Min(spectra[0]->GetMinimum(),spectra[1]->GetMinimum());
	Double_t range = max-min;
	spectra[0]->SetMinimum(min-0.05*range);
	spectra[0]->SetMaximum(max+0.05*range);

	// Drawing
	p1->cd();
	if (logy) {p1->SetLogy();}
	spectra[0]->Draw("e");
	spectra[0]->GetXaxis()->SetLabelSize(0);
	spectra[0]->GetYaxis()->SetLabelSize(0.05);
	spectra[0]->GetYaxis()->SetTitleSize(0.05);
	spectra[0]->GetYaxis()->SetTitleOffset(0.8);
	//Double_t labelsize = spectra[0]->GetYaxis()->GetLabelSize();
	spectra[1]->Draw("same e");
	p2->cd();
	division->SetTitle("");
	division->GetXaxis()->SetLabelSize(0.1);
	division->GetXaxis()->SetTitleSize(0.15);
	division->GetXaxis()->SetTitleOffset(0.6);
	division->GetYaxis()->SetLabelSize(0.1);
	division->GetYaxis()->SetTitleSize(0.12);
	division->GetYaxis()->SetTitleOffset(0.25);
	division->Draw("e");

	//c->UseCurrentStyle();

	//gStyle->SetOptStat(optstat);

	TLegend* legend = new TLegend(0.75,0.8,0.95,0.95);
	legend->AddEntry(spectra[0],h1->GetTitle(),"lpe");
	legend->AddEntry(spectra[1],h2->GetTitle(),"lpe");
	p1->cd();
	legend->Draw("same");

/*
	// returning the created objects.
	TObjArray* returnobjects = new TObjArray(6);
	returnobjects->AddLast(c);
	returnobjects->AddLast(p1);
	returnobjects->AddLast(p2);
	returnobjects->AddLast(spectra[0]);
	returnobjects->AddLast(spectra[1]);
	returnobjects->AddLast(division);
*/

	return c;

}

// -----------------------------------------------------------------------
Double_t* AliHistToolsDiHadronPID::CreateAxis(Int_t nbins, Double_t min, Double_t max) {

	if (nbins <= 0) return 0x0;
	if (max < min) return 0x0;

	Double_t* axis = new Double_t[nbins + 1];
	Double_t binsize = (max - min)/((Double_t)nbins);
	for (Int_t iBin = 0; iBin < nbins + 1; iBin++) {
		axis[iBin] = min + ((Double_t)iBin) * binsize;
	}

	return axis;
}






 AliHistToolsDiHadronPID.cxx:1
 AliHistToolsDiHadronPID.cxx:2
 AliHistToolsDiHadronPID.cxx:3
 AliHistToolsDiHadronPID.cxx:4
 AliHistToolsDiHadronPID.cxx:5
 AliHistToolsDiHadronPID.cxx:6
 AliHistToolsDiHadronPID.cxx:7
 AliHistToolsDiHadronPID.cxx:8
 AliHistToolsDiHadronPID.cxx:9
 AliHistToolsDiHadronPID.cxx:10
 AliHistToolsDiHadronPID.cxx:11
 AliHistToolsDiHadronPID.cxx:12
 AliHistToolsDiHadronPID.cxx:13
 AliHistToolsDiHadronPID.cxx:14
 AliHistToolsDiHadronPID.cxx:15
 AliHistToolsDiHadronPID.cxx:16
 AliHistToolsDiHadronPID.cxx:17
 AliHistToolsDiHadronPID.cxx:18
 AliHistToolsDiHadronPID.cxx:19
 AliHistToolsDiHadronPID.cxx:20
 AliHistToolsDiHadronPID.cxx:21
 AliHistToolsDiHadronPID.cxx:22
 AliHistToolsDiHadronPID.cxx:23
 AliHistToolsDiHadronPID.cxx:24
 AliHistToolsDiHadronPID.cxx:25
 AliHistToolsDiHadronPID.cxx:26
 AliHistToolsDiHadronPID.cxx:27
 AliHistToolsDiHadronPID.cxx:28
 AliHistToolsDiHadronPID.cxx:29
 AliHistToolsDiHadronPID.cxx:30
 AliHistToolsDiHadronPID.cxx:31
 AliHistToolsDiHadronPID.cxx:32
 AliHistToolsDiHadronPID.cxx:33
 AliHistToolsDiHadronPID.cxx:34
 AliHistToolsDiHadronPID.cxx:35
 AliHistToolsDiHadronPID.cxx:36
 AliHistToolsDiHadronPID.cxx:37
 AliHistToolsDiHadronPID.cxx:38
 AliHistToolsDiHadronPID.cxx:39
 AliHistToolsDiHadronPID.cxx:40
 AliHistToolsDiHadronPID.cxx:41
 AliHistToolsDiHadronPID.cxx:42
 AliHistToolsDiHadronPID.cxx:43
 AliHistToolsDiHadronPID.cxx:44
 AliHistToolsDiHadronPID.cxx:45
 AliHistToolsDiHadronPID.cxx:46
 AliHistToolsDiHadronPID.cxx:47
 AliHistToolsDiHadronPID.cxx:48
 AliHistToolsDiHadronPID.cxx:49
 AliHistToolsDiHadronPID.cxx:50
 AliHistToolsDiHadronPID.cxx:51
 AliHistToolsDiHadronPID.cxx:52
 AliHistToolsDiHadronPID.cxx:53
 AliHistToolsDiHadronPID.cxx:54
 AliHistToolsDiHadronPID.cxx:55
 AliHistToolsDiHadronPID.cxx:56
 AliHistToolsDiHadronPID.cxx:57
 AliHistToolsDiHadronPID.cxx:58
 AliHistToolsDiHadronPID.cxx:59
 AliHistToolsDiHadronPID.cxx:60
 AliHistToolsDiHadronPID.cxx:61
 AliHistToolsDiHadronPID.cxx:62
 AliHistToolsDiHadronPID.cxx:63
 AliHistToolsDiHadronPID.cxx:64
 AliHistToolsDiHadronPID.cxx:65
 AliHistToolsDiHadronPID.cxx:66
 AliHistToolsDiHadronPID.cxx:67
 AliHistToolsDiHadronPID.cxx:68
 AliHistToolsDiHadronPID.cxx:69
 AliHistToolsDiHadronPID.cxx:70
 AliHistToolsDiHadronPID.cxx:71
 AliHistToolsDiHadronPID.cxx:72
 AliHistToolsDiHadronPID.cxx:73
 AliHistToolsDiHadronPID.cxx:74
 AliHistToolsDiHadronPID.cxx:75
 AliHistToolsDiHadronPID.cxx:76
 AliHistToolsDiHadronPID.cxx:77
 AliHistToolsDiHadronPID.cxx:78
 AliHistToolsDiHadronPID.cxx:79
 AliHistToolsDiHadronPID.cxx:80
 AliHistToolsDiHadronPID.cxx:81
 AliHistToolsDiHadronPID.cxx:82
 AliHistToolsDiHadronPID.cxx:83
 AliHistToolsDiHadronPID.cxx:84
 AliHistToolsDiHadronPID.cxx:85
 AliHistToolsDiHadronPID.cxx:86
 AliHistToolsDiHadronPID.cxx:87
 AliHistToolsDiHadronPID.cxx:88
 AliHistToolsDiHadronPID.cxx:89
 AliHistToolsDiHadronPID.cxx:90
 AliHistToolsDiHadronPID.cxx:91
 AliHistToolsDiHadronPID.cxx:92
 AliHistToolsDiHadronPID.cxx:93
 AliHistToolsDiHadronPID.cxx:94
 AliHistToolsDiHadronPID.cxx:95
 AliHistToolsDiHadronPID.cxx:96
 AliHistToolsDiHadronPID.cxx:97
 AliHistToolsDiHadronPID.cxx:98
 AliHistToolsDiHadronPID.cxx:99
 AliHistToolsDiHadronPID.cxx:100
 AliHistToolsDiHadronPID.cxx:101
 AliHistToolsDiHadronPID.cxx:102
 AliHistToolsDiHadronPID.cxx:103
 AliHistToolsDiHadronPID.cxx:104
 AliHistToolsDiHadronPID.cxx:105
 AliHistToolsDiHadronPID.cxx:106
 AliHistToolsDiHadronPID.cxx:107
 AliHistToolsDiHadronPID.cxx:108
 AliHistToolsDiHadronPID.cxx:109
 AliHistToolsDiHadronPID.cxx:110
 AliHistToolsDiHadronPID.cxx:111
 AliHistToolsDiHadronPID.cxx:112
 AliHistToolsDiHadronPID.cxx:113
 AliHistToolsDiHadronPID.cxx:114
 AliHistToolsDiHadronPID.cxx:115
 AliHistToolsDiHadronPID.cxx:116
 AliHistToolsDiHadronPID.cxx:117
 AliHistToolsDiHadronPID.cxx:118
 AliHistToolsDiHadronPID.cxx:119
 AliHistToolsDiHadronPID.cxx:120
 AliHistToolsDiHadronPID.cxx:121
 AliHistToolsDiHadronPID.cxx:122
 AliHistToolsDiHadronPID.cxx:123
 AliHistToolsDiHadronPID.cxx:124
 AliHistToolsDiHadronPID.cxx:125
 AliHistToolsDiHadronPID.cxx:126
 AliHistToolsDiHadronPID.cxx:127
 AliHistToolsDiHadronPID.cxx:128
 AliHistToolsDiHadronPID.cxx:129
 AliHistToolsDiHadronPID.cxx:130
 AliHistToolsDiHadronPID.cxx:131
 AliHistToolsDiHadronPID.cxx:132
 AliHistToolsDiHadronPID.cxx:133
 AliHistToolsDiHadronPID.cxx:134
 AliHistToolsDiHadronPID.cxx:135
 AliHistToolsDiHadronPID.cxx:136
 AliHistToolsDiHadronPID.cxx:137
 AliHistToolsDiHadronPID.cxx:138
 AliHistToolsDiHadronPID.cxx:139
 AliHistToolsDiHadronPID.cxx:140
 AliHistToolsDiHadronPID.cxx:141
 AliHistToolsDiHadronPID.cxx:142
 AliHistToolsDiHadronPID.cxx:143
 AliHistToolsDiHadronPID.cxx:144
 AliHistToolsDiHadronPID.cxx:145
 AliHistToolsDiHadronPID.cxx:146
 AliHistToolsDiHadronPID.cxx:147
 AliHistToolsDiHadronPID.cxx:148
 AliHistToolsDiHadronPID.cxx:149
 AliHistToolsDiHadronPID.cxx:150
 AliHistToolsDiHadronPID.cxx:151
 AliHistToolsDiHadronPID.cxx:152
 AliHistToolsDiHadronPID.cxx:153
 AliHistToolsDiHadronPID.cxx:154
 AliHistToolsDiHadronPID.cxx:155
 AliHistToolsDiHadronPID.cxx:156
 AliHistToolsDiHadronPID.cxx:157
 AliHistToolsDiHadronPID.cxx:158
 AliHistToolsDiHadronPID.cxx:159
 AliHistToolsDiHadronPID.cxx:160
 AliHistToolsDiHadronPID.cxx:161
 AliHistToolsDiHadronPID.cxx:162
 AliHistToolsDiHadronPID.cxx:163
 AliHistToolsDiHadronPID.cxx:164
 AliHistToolsDiHadronPID.cxx:165
 AliHistToolsDiHadronPID.cxx:166
 AliHistToolsDiHadronPID.cxx:167
 AliHistToolsDiHadronPID.cxx:168
 AliHistToolsDiHadronPID.cxx:169
 AliHistToolsDiHadronPID.cxx:170
 AliHistToolsDiHadronPID.cxx:171
 AliHistToolsDiHadronPID.cxx:172
 AliHistToolsDiHadronPID.cxx:173
 AliHistToolsDiHadronPID.cxx:174
 AliHistToolsDiHadronPID.cxx:175
 AliHistToolsDiHadronPID.cxx:176
 AliHistToolsDiHadronPID.cxx:177
 AliHistToolsDiHadronPID.cxx:178
 AliHistToolsDiHadronPID.cxx:179
 AliHistToolsDiHadronPID.cxx:180
 AliHistToolsDiHadronPID.cxx:181
 AliHistToolsDiHadronPID.cxx:182
 AliHistToolsDiHadronPID.cxx:183
 AliHistToolsDiHadronPID.cxx:184
 AliHistToolsDiHadronPID.cxx:185
 AliHistToolsDiHadronPID.cxx:186
 AliHistToolsDiHadronPID.cxx:187
 AliHistToolsDiHadronPID.cxx:188
 AliHistToolsDiHadronPID.cxx:189
 AliHistToolsDiHadronPID.cxx:190
 AliHistToolsDiHadronPID.cxx:191
 AliHistToolsDiHadronPID.cxx:192
 AliHistToolsDiHadronPID.cxx:193
 AliHistToolsDiHadronPID.cxx:194
 AliHistToolsDiHadronPID.cxx:195
 AliHistToolsDiHadronPID.cxx:196
 AliHistToolsDiHadronPID.cxx:197
 AliHistToolsDiHadronPID.cxx:198
 AliHistToolsDiHadronPID.cxx:199
 AliHistToolsDiHadronPID.cxx:200
 AliHistToolsDiHadronPID.cxx:201
 AliHistToolsDiHadronPID.cxx:202
 AliHistToolsDiHadronPID.cxx:203
 AliHistToolsDiHadronPID.cxx:204
 AliHistToolsDiHadronPID.cxx:205
 AliHistToolsDiHadronPID.cxx:206
 AliHistToolsDiHadronPID.cxx:207
 AliHistToolsDiHadronPID.cxx:208
 AliHistToolsDiHadronPID.cxx:209
 AliHistToolsDiHadronPID.cxx:210
 AliHistToolsDiHadronPID.cxx:211
 AliHistToolsDiHadronPID.cxx:212
 AliHistToolsDiHadronPID.cxx:213
 AliHistToolsDiHadronPID.cxx:214
 AliHistToolsDiHadronPID.cxx:215
 AliHistToolsDiHadronPID.cxx:216
 AliHistToolsDiHadronPID.cxx:217
 AliHistToolsDiHadronPID.cxx:218
 AliHistToolsDiHadronPID.cxx:219
 AliHistToolsDiHadronPID.cxx:220
 AliHistToolsDiHadronPID.cxx:221
 AliHistToolsDiHadronPID.cxx:222
 AliHistToolsDiHadronPID.cxx:223
 AliHistToolsDiHadronPID.cxx:224
 AliHistToolsDiHadronPID.cxx:225
 AliHistToolsDiHadronPID.cxx:226
 AliHistToolsDiHadronPID.cxx:227
 AliHistToolsDiHadronPID.cxx:228
 AliHistToolsDiHadronPID.cxx:229
 AliHistToolsDiHadronPID.cxx:230
 AliHistToolsDiHadronPID.cxx:231
 AliHistToolsDiHadronPID.cxx:232
 AliHistToolsDiHadronPID.cxx:233
 AliHistToolsDiHadronPID.cxx:234
 AliHistToolsDiHadronPID.cxx:235
 AliHistToolsDiHadronPID.cxx:236
 AliHistToolsDiHadronPID.cxx:237
 AliHistToolsDiHadronPID.cxx:238
 AliHistToolsDiHadronPID.cxx:239
 AliHistToolsDiHadronPID.cxx:240
 AliHistToolsDiHadronPID.cxx:241
 AliHistToolsDiHadronPID.cxx:242
 AliHistToolsDiHadronPID.cxx:243
 AliHistToolsDiHadronPID.cxx:244
 AliHistToolsDiHadronPID.cxx:245
 AliHistToolsDiHadronPID.cxx:246
 AliHistToolsDiHadronPID.cxx:247
 AliHistToolsDiHadronPID.cxx:248
 AliHistToolsDiHadronPID.cxx:249
 AliHistToolsDiHadronPID.cxx:250
 AliHistToolsDiHadronPID.cxx:251
 AliHistToolsDiHadronPID.cxx:252
 AliHistToolsDiHadronPID.cxx:253
 AliHistToolsDiHadronPID.cxx:254
 AliHistToolsDiHadronPID.cxx:255
 AliHistToolsDiHadronPID.cxx:256
 AliHistToolsDiHadronPID.cxx:257
 AliHistToolsDiHadronPID.cxx:258
 AliHistToolsDiHadronPID.cxx:259
 AliHistToolsDiHadronPID.cxx:260
 AliHistToolsDiHadronPID.cxx:261
 AliHistToolsDiHadronPID.cxx:262
 AliHistToolsDiHadronPID.cxx:263
 AliHistToolsDiHadronPID.cxx:264
 AliHistToolsDiHadronPID.cxx:265
 AliHistToolsDiHadronPID.cxx:266
 AliHistToolsDiHadronPID.cxx:267
 AliHistToolsDiHadronPID.cxx:268
 AliHistToolsDiHadronPID.cxx:269
 AliHistToolsDiHadronPID.cxx:270
 AliHistToolsDiHadronPID.cxx:271
 AliHistToolsDiHadronPID.cxx:272
 AliHistToolsDiHadronPID.cxx:273
 AliHistToolsDiHadronPID.cxx:274
 AliHistToolsDiHadronPID.cxx:275
 AliHistToolsDiHadronPID.cxx:276
 AliHistToolsDiHadronPID.cxx:277
 AliHistToolsDiHadronPID.cxx:278
 AliHistToolsDiHadronPID.cxx:279
 AliHistToolsDiHadronPID.cxx:280
 AliHistToolsDiHadronPID.cxx:281
 AliHistToolsDiHadronPID.cxx:282
 AliHistToolsDiHadronPID.cxx:283
 AliHistToolsDiHadronPID.cxx:284
 AliHistToolsDiHadronPID.cxx:285
 AliHistToolsDiHadronPID.cxx:286
 AliHistToolsDiHadronPID.cxx:287
 AliHistToolsDiHadronPID.cxx:288
 AliHistToolsDiHadronPID.cxx:289
 AliHistToolsDiHadronPID.cxx:290
 AliHistToolsDiHadronPID.cxx:291
 AliHistToolsDiHadronPID.cxx:292
 AliHistToolsDiHadronPID.cxx:293
 AliHistToolsDiHadronPID.cxx:294
 AliHistToolsDiHadronPID.cxx:295
 AliHistToolsDiHadronPID.cxx:296
 AliHistToolsDiHadronPID.cxx:297
 AliHistToolsDiHadronPID.cxx:298
 AliHistToolsDiHadronPID.cxx:299
 AliHistToolsDiHadronPID.cxx:300
 AliHistToolsDiHadronPID.cxx:301
 AliHistToolsDiHadronPID.cxx:302
 AliHistToolsDiHadronPID.cxx:303
 AliHistToolsDiHadronPID.cxx:304
 AliHistToolsDiHadronPID.cxx:305
 AliHistToolsDiHadronPID.cxx:306
 AliHistToolsDiHadronPID.cxx:307
 AliHistToolsDiHadronPID.cxx:308
 AliHistToolsDiHadronPID.cxx:309
 AliHistToolsDiHadronPID.cxx:310
 AliHistToolsDiHadronPID.cxx:311
 AliHistToolsDiHadronPID.cxx:312
 AliHistToolsDiHadronPID.cxx:313
 AliHistToolsDiHadronPID.cxx:314
 AliHistToolsDiHadronPID.cxx:315
 AliHistToolsDiHadronPID.cxx:316
 AliHistToolsDiHadronPID.cxx:317
 AliHistToolsDiHadronPID.cxx:318
 AliHistToolsDiHadronPID.cxx:319
 AliHistToolsDiHadronPID.cxx:320
 AliHistToolsDiHadronPID.cxx:321
 AliHistToolsDiHadronPID.cxx:322
 AliHistToolsDiHadronPID.cxx:323
 AliHistToolsDiHadronPID.cxx:324
 AliHistToolsDiHadronPID.cxx:325
 AliHistToolsDiHadronPID.cxx:326
 AliHistToolsDiHadronPID.cxx:327
 AliHistToolsDiHadronPID.cxx:328
 AliHistToolsDiHadronPID.cxx:329
 AliHistToolsDiHadronPID.cxx:330
 AliHistToolsDiHadronPID.cxx:331
 AliHistToolsDiHadronPID.cxx:332
 AliHistToolsDiHadronPID.cxx:333
 AliHistToolsDiHadronPID.cxx:334
 AliHistToolsDiHadronPID.cxx:335
 AliHistToolsDiHadronPID.cxx:336
 AliHistToolsDiHadronPID.cxx:337
 AliHistToolsDiHadronPID.cxx:338
 AliHistToolsDiHadronPID.cxx:339
 AliHistToolsDiHadronPID.cxx:340
 AliHistToolsDiHadronPID.cxx:341
 AliHistToolsDiHadronPID.cxx:342
 AliHistToolsDiHadronPID.cxx:343
 AliHistToolsDiHadronPID.cxx:344
 AliHistToolsDiHadronPID.cxx:345
 AliHistToolsDiHadronPID.cxx:346
 AliHistToolsDiHadronPID.cxx:347
 AliHistToolsDiHadronPID.cxx:348
 AliHistToolsDiHadronPID.cxx:349
 AliHistToolsDiHadronPID.cxx:350
 AliHistToolsDiHadronPID.cxx:351
 AliHistToolsDiHadronPID.cxx:352
 AliHistToolsDiHadronPID.cxx:353
 AliHistToolsDiHadronPID.cxx:354
 AliHistToolsDiHadronPID.cxx:355
 AliHistToolsDiHadronPID.cxx:356
 AliHistToolsDiHadronPID.cxx:357
 AliHistToolsDiHadronPID.cxx:358
 AliHistToolsDiHadronPID.cxx:359
 AliHistToolsDiHadronPID.cxx:360
 AliHistToolsDiHadronPID.cxx:361
 AliHistToolsDiHadronPID.cxx:362
 AliHistToolsDiHadronPID.cxx:363
 AliHistToolsDiHadronPID.cxx:364
 AliHistToolsDiHadronPID.cxx:365
 AliHistToolsDiHadronPID.cxx:366
 AliHistToolsDiHadronPID.cxx:367
 AliHistToolsDiHadronPID.cxx:368
 AliHistToolsDiHadronPID.cxx:369
 AliHistToolsDiHadronPID.cxx:370
 AliHistToolsDiHadronPID.cxx:371
 AliHistToolsDiHadronPID.cxx:372
 AliHistToolsDiHadronPID.cxx:373
 AliHistToolsDiHadronPID.cxx:374
 AliHistToolsDiHadronPID.cxx:375
 AliHistToolsDiHadronPID.cxx:376
 AliHistToolsDiHadronPID.cxx:377
 AliHistToolsDiHadronPID.cxx:378
 AliHistToolsDiHadronPID.cxx:379
 AliHistToolsDiHadronPID.cxx:380
 AliHistToolsDiHadronPID.cxx:381
 AliHistToolsDiHadronPID.cxx:382
 AliHistToolsDiHadronPID.cxx:383
 AliHistToolsDiHadronPID.cxx:384
 AliHistToolsDiHadronPID.cxx:385
 AliHistToolsDiHadronPID.cxx:386
 AliHistToolsDiHadronPID.cxx:387
 AliHistToolsDiHadronPID.cxx:388
 AliHistToolsDiHadronPID.cxx:389
 AliHistToolsDiHadronPID.cxx:390
 AliHistToolsDiHadronPID.cxx:391
 AliHistToolsDiHadronPID.cxx:392
 AliHistToolsDiHadronPID.cxx:393
 AliHistToolsDiHadronPID.cxx:394
 AliHistToolsDiHadronPID.cxx:395
 AliHistToolsDiHadronPID.cxx:396
 AliHistToolsDiHadronPID.cxx:397
 AliHistToolsDiHadronPID.cxx:398
 AliHistToolsDiHadronPID.cxx:399
 AliHistToolsDiHadronPID.cxx:400
 AliHistToolsDiHadronPID.cxx:401
 AliHistToolsDiHadronPID.cxx:402
 AliHistToolsDiHadronPID.cxx:403
 AliHistToolsDiHadronPID.cxx:404
 AliHistToolsDiHadronPID.cxx:405
 AliHistToolsDiHadronPID.cxx:406
 AliHistToolsDiHadronPID.cxx:407
 AliHistToolsDiHadronPID.cxx:408
 AliHistToolsDiHadronPID.cxx:409
 AliHistToolsDiHadronPID.cxx:410
 AliHistToolsDiHadronPID.cxx:411
 AliHistToolsDiHadronPID.cxx:412
 AliHistToolsDiHadronPID.cxx:413
 AliHistToolsDiHadronPID.cxx:414
 AliHistToolsDiHadronPID.cxx:415
 AliHistToolsDiHadronPID.cxx:416
 AliHistToolsDiHadronPID.cxx:417
 AliHistToolsDiHadronPID.cxx:418
 AliHistToolsDiHadronPID.cxx:419
 AliHistToolsDiHadronPID.cxx:420
 AliHistToolsDiHadronPID.cxx:421
 AliHistToolsDiHadronPID.cxx:422
 AliHistToolsDiHadronPID.cxx:423
 AliHistToolsDiHadronPID.cxx:424
 AliHistToolsDiHadronPID.cxx:425
 AliHistToolsDiHadronPID.cxx:426
 AliHistToolsDiHadronPID.cxx:427