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.                  *
**************************************************************************/
//
// Toolkit containing various usefull things
// Usable everywhere in the hfe software package
// For more information see the cxx file
//
// Authors
//   All authors of the HFE group
//
#include <TArrayD.h>
#include <TMath.h>
#include <TParticle.h>
#include <TF1.h>
#include "TH1.h"
#include "TH1D.h"
#include "TH2.h"
#include "TGraph.h"
#include "TGraphErrors.h"
#include "TGraphAsymmErrors.h"
#include "THnSparse.h"
#include "TAxis.h"
#include "TMath.h"
#include "TString.h"
#include "TFile.h"
#include "TKey.h"
#include "TROOT.h"

#include "AliAODMCParticle.h"
#include "AliAODpidUtil.h"
#include "AliESDpid.h"
#include "AliLog.h"
#include "AliTPCPIDResponse.h"
#include "AliTOFPIDResponse.h"

#include "AliHFEtools.h"

ClassImp(AliHFEtools)

AliPIDResponse *AliHFEtools::fgDefaultPID = NULL;
Int_t AliHFEtools::fgLogLevel = 0;

//__________________________________________
AliHFEtools::AliHFEtools():
  TObject()
{
}

//__________________________________________
Double_t *AliHFEtools::MakeLinearBinning(Int_t nBins, Double_t ymin, Double_t ymax){
  //
  // Helper function for linearly binned array
  //
  Double_t *bins = new Double_t[nBins + 1];
  Double_t stepsize = (ymax - ymin) / static_cast<Double_t>(nBins);
  bins[0] = ymin;
  for(Int_t ibin = 1; ibin <= nBins; ibin++)
    bins[ibin] = bins[ibin-1] + stepsize;
  return bins;
}

//__________________________________________
void AliHFEtools::FillLinearBinning(TArrayD &bins, Int_t nBins, Double_t ymin, Double_t ymax){
  //
  // Helper function for linearly binned array
  //
  Double_t stepsize = (ymax - ymin) / static_cast<Double_t>(nBins);
  bins[0] = ymin;
  for(Int_t ibin = 1; ibin <= nBins; ibin++)
    bins[ibin] = bins[ibin-1] + stepsize;
}

//__________________________________________
Double_t *AliHFEtools::MakeLogarithmicBinning(Int_t nBins, Double_t ymin, Double_t ymax){
  //
  // Helper function for logartimically binned array
  //
  Double_t *bins = new Double_t[nBins+1];
  bins[0] = ymin;
  Double_t factor = TMath::Power(ymax/ymin, 1./nBins);
  for(Int_t ibin = 1; ibin <= nBins; ibin++){
    bins[ibin] = factor * bins[ibin-1];
  }
  return bins;
}

//__________________________________________
void AliHFEtools::FillLogarithmicBinning(TArrayD &bins, Int_t nBins, Double_t ymin, Double_t ymax){
  //
  // Helper function for logartimically binned array
  //
  bins[0] = ymin;
  Double_t factor = TMath::Power(ymax/ymin, 1./nBins);
  for(Int_t ibin = 1; ibin <= nBins; ibin++)
    bins[ibin] = factor * bins[ibin-1];
}

//_________________________________________
Bool_t AliHFEtools::BinLogAxis(TObject *o, Int_t dim){

  // 
  // converts the axis (defined by the dimension) of THx or THnSparse
  // object to Log scale. Number of bins and bin min and bin max are preserved
  //


  if(!o){
    AliError("Input histogram is null pointer");
    return kFALSE;    
  }
  
  TAxis *axis = 0x0;
  if(o->InheritsFrom("TH1")){
    TH1 *h1 = dynamic_cast<TH1F*>(o); 
    if(h1) axis = h1->GetXaxis();
  }
  else if(o->InheritsFrom("TH2")){
    TH2 *h2 = dynamic_cast<TH2F*>(o);
    if(h2 && 0 == dim){
      axis = h2->GetXaxis();
    }
    else if(h2 && 1 == dim){
      axis = h2->GetYaxis();
    }
     else{
       AliError("Only dim = 0 or 1 possible for TH2F");
     }
  }
  else if(o->InheritsFrom("THnSparse")){
    THnSparse *hs = dynamic_cast<THnSparse*>(o);
    if(hs) axis = hs->GetAxis(dim);
  }
  else{
    AliError("Type of input object not recognized, please check your code or update this finction");
    return kFALSE;
  }
  if(!axis){
    AliError(Form("Axis '%d' could not be identified in the object \n", dim));
    return kFALSE;
  }
  
  Int_t bins = axis->GetNbins();

  Double_t from = axis->GetXmin();
  if(from <= 0){
    AliError(Form("Log binning not possible for this axis [min = %f]\n", from));
  }
  Double_t to = axis->GetXmax();
  TArrayD newBins(bins+1);
  newBins[0] = from;
  Double_t factor = TMath::Power(to/from, 1./bins);
  for(Int_t i=1; i<=bins; ++i){
    newBins[i] = factor * newBins[i-1];
  }
  axis->Set(bins, newBins.GetArray());

  return kTRUE;
}

//__________________________________________
Float_t AliHFEtools::GetRapidity(const TParticle *part){
  //
  // return rapidity
  //
  Float_t rapidity;
  if(!((part->Energy() - part->Pz())*(part->Energy() + part->Pz())>0)) rapidity=-999;
  else rapidity = 0.5*(TMath::Log((part->Energy()+part->Pz()) / (part->Energy()-part->Pz())));
  return rapidity;
}

//__________________________________________
Float_t AliHFEtools::GetRapidity(const AliAODMCParticle *part){
  // return rapidity

  Float_t rapidity;        
  if(!((part->E() - part->Pz())*(part->E() + part->Pz())>0)) rapidity=-999; 
  else rapidity = 0.5*(TMath::Log((part->E()+part->Pz()) / (part->E()-part->Pz()))); 
  return rapidity;
}

//__________________________________________
AliPIDResponse* AliHFEtools::GetDefaultPID(Bool_t isMC, Bool_t isESD){
  //
  // Get the default PID as singleton instance
  //
  if(!fgDefaultPID){

    if(isESD) fgDefaultPID = new AliESDpid;
    else fgDefaultPID = new AliAODpidUtil;
    Double_t tres = isMC ? 80. : 130.;
    fgDefaultPID->GetTOFResponse().SetTimeResolution(tres);

    // TPC Bethe Bloch parameters
    Double_t alephParameters[5];
    if(isMC){
      // simulation
      alephParameters[0] = 2.15898e+00/50.;
      alephParameters[1] = 1.75295e+01;
      alephParameters[2] = 3.40030e-09;
      alephParameters[3] = 1.96178e+00;
      alephParameters[4] = 3.91720e+00;
    } else {
      alephParameters[0] = 0.0283086/0.97;
      //alephParameters[0] = 0.0283086;
      alephParameters[1] = 2.63394e+01;
      alephParameters[2] = 5.04114e-11;
      alephParameters[3] = 2.12543e+00;
      alephParameters[4] = 4.88663e+00;
    }
    fgDefaultPID->GetTPCResponse().SetBetheBlochParameters(alephParameters[0],alephParameters[1],alephParameters[2], alephParameters[3],alephParameters[4]);
    fgDefaultPID->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);

  }
  if(fgLogLevel){
    printf("Error - You are using the default PID: You should use the PID coming from the tender\n");
    printf("Error - Arrrrrrrrr...\n");
    printf("Error - Please rethink your program logic. Using default PID is really dangerous\n");
    printf("Error - TOF PID is adapted to Monte Carlo\n");
  }
  return fgDefaultPID;
}


//__________________________________________
void AliHFEtools::DestroyDefaultPID(){
  //
  // Destroy default PID object if existing
  //
  if(fgDefaultPID) delete fgDefaultPID;
  fgDefaultPID = NULL;
}

//__________________________________________
Int_t AliHFEtools::GetPdg(const AliVParticle *track){
  // 
  // Get MC PDG code (only MC particles supported)
  //
  Int_t pdg = 0;
  if(!TString(track->IsA()->GetName()).CompareTo("AliMCParticle")){
    const AliMCParticle *mctrack = dynamic_cast<const AliMCParticle *>(track);
    pdg = mctrack ? mctrack->Particle()->GetPdgCode() : 0;
  } else if(!TString(track->IsA()->GetName()).CompareTo("AliAODMCParticle")){
    const AliAODMCParticle *aodmctrack = dynamic_cast<const AliAODMCParticle *>(track);
    pdg = aodmctrack ? aodmctrack->GetPdgCode() : 0;
  }
  return pdg;
}

//__________________________________________
Int_t AliHFEtools::PDG2AliPID(Int_t pdg){
  // 
  // Helper function to convert MC PID codes into AliPID codes
  //
  Int_t pid = -1;
  switch(TMath::Abs(pdg)){
    case 11: pid = AliPID::kElectron; break;
    case 13: pid = AliPID::kMuon; break;
    case 211: pid = AliPID::kPion; break;
    case 321: pid = AliPID::kKaon; break;
    case 2212: pid = AliPID::kProton; break;
    default: pid = -1; break;
  };
  return pid;
}

//__________________________________________
TH1D* AliHFEtools::GraphErrorsToHist(TGraphErrors* g, Double_t firstBinWidth, Bool_t exchange, Int_t markerstyle,Int_t markercolor,Float_t markersize)
{
    // Creates a TH1D from TGraph g. The binwidth of the first bin has to
    // specified. The others bins are calculated automatically. Supports also Graphs
    // with non constant x steps. The axis of the Graph can be exchanged if
    // exchange=kTRUE (modifies the Graph).

    TH1D* result = GraphToHist(g,firstBinWidth,exchange, markerstyle,markercolor,markersize);
    if( result == 0) return result;

    //------------------------------------------
    // setup the final hist
    Int_t nBinX = g->GetN();
    Double_t* err = g->GetEY();           // error y is still ok even if exchanged
    for(Int_t i = 0; i < nBinX; i ++){
	result->SetBinError(i + 1, err[i]);
    }
    if(exchange){
        AliHFEtools::ExchangeXYGraph(g);        // undo  what has been done in GraphToHist
	AliHFEtools::ExchangeXYGraphErrors(g);  // now exchange including errors
    }

    return result;
}

//__________________________________________
Bool_t AliHFEtools::ExchangeXYGraph(TGraph* g)
{
    // exchanges x-values and y-values.
    if(g==0) return kFALSE;
    Int_t nbin=g->GetN();
    Double_t x,y;
    for(Int_t i = 0; i < nbin; i ++)
    {
        g->GetPoint(i,x,y);
        g->SetPoint(i,y,x);
    }

    return kTRUE;
}

//__________________________________________
Bool_t AliHFEtools::ExchangeXYGraphErrors(TGraphErrors* g)
{
    // exchanges x-values and y-values and
    // corresponding errors.
    if(g==0) return kFALSE;
    Int_t nbin=g->GetN();
    Double_t x,y;
    Double_t ex,ey;
    for(Int_t i = 0; i < nbin; i ++)
    {
        g->GetPoint(i,x,y);
        ex = g->GetErrorX(i);
        ey = g->GetErrorY(i);
        g->SetPoint(i,y,x);
        g->SetPointError(i,ey,ex);
    }

    return kTRUE;

}

//__________________________________________
TH1D* AliHFEtools::GraphToHist(TGraph* g, Double_t firstBinWidth, Bool_t exchange, Int_t markerstyle,Int_t markercolor,Float_t markersize)
{
    // Creates a TH1D from TGraph g. The binwidth of the first bin has to
    // specified. The others bins are calculated automatically. Supports also Graphs
    // with non constant x steps. The axis of the Graph can be exchanged if
    // exchange=kTRUE (modifies the Graph).


    TH1D* result = 0;
    if(g == 0)              return result;
    if(firstBinWidth == -1) return result;
    TString myname="";
    myname = g->GetName();
    myname += "_graph";
    if(exchange) AliHFEtools::ExchangeXYGraph(g);

    Int_t nBinX = g->GetN();
    Double_t* x = g->GetX();
    Double_t* y = g->GetY();

    if(nBinX < 1) return result;

    //------------------------------------------
    // create the Matrix for the equation system
    // and init the values

    Int_t nDim = nBinX - 1;
    TMatrixD a(nDim,nDim);
    TMatrixD b(nDim,1);

    Double_t* aA = a.GetMatrixArray();
    Double_t* aB = b.GetMatrixArray();
    memset(aA,0,nDim * nDim * sizeof(Double_t));
    memset(aB,0,nDim * sizeof(Double_t));
    //------------------------------------------

    //------------------------------------------
    // setup equation system
    // width for 1st bin is given therefore
    // we shift bin parameter (column) by one to the left
    // to reduce the matrix size

    Double_t* xAxis = new Double_t [nBinX + 1];
    Double_t* binW  = new Double_t [nBinX ];
    binW[0] = firstBinWidth;

    aB[0] = x[1] - x[0]  - 0.5 * binW[0];
    aA[0] = 0.5;

    for(Int_t col = 1; col < nDim ; col ++)
    {
	Int_t row = col;
	aB[col] = x[col + 1] - x[ col ];
	aA[row * nDim + col - 1 ] = 0.5;
	aA[row * nDim + col     ] = 0.5;
    }
    //------------------------------------------

    //------------------------------------------
    // solve the equations
    a.Invert();
    TMatrixD c = a * b;
    //------------------------------------------

    //------------------------------------------
    // calculate the bin boundaries
    xAxis[0] = x[0] - 0.5 * binW[0];
    memcpy(&binW[1],c.GetMatrixArray(),nDim * sizeof(Double_t));
    for(Int_t col = 0; col < nBinX ; col ++) {
	xAxis[col + 1] = x[col] + 0.5 * binW[col];
    }
    //------------------------------------------

    //------------------------------------------
    // setup the final hist
    result = new TH1D(myname.Data(),myname.Data(),nBinX, xAxis);
    for(Int_t i = 0; i < nBinX; i ++){
	result->SetBinContent(i + 1, y[i]);
    }
    result->SetMarkerColor(markercolor);
    result->SetMarkerStyle(markerstyle);
    result->SetMarkerSize(markersize);
    //------------------------------------------

    delete [] xAxis;
    delete [] binW;


    return result;
}

//__________________________________________
void AliHFEtools::BinParameterisation(const TF1 &fun, const TArrayD &xbins, TArrayD &bincontent){
    //
    // Calculate binned version of a function defined as the integral of x*f(x) in
    // the integration range xmin,xmax, where xmin and xmax are the bin limits, divided
    // by the binwidth. The function is important in case of steeply falling functions
    //
    // Parameters
    //   fun:           the function to be binned
    //   xbins:         the bin limits
    //   bincontent:    the binned parameterisation
    //
    TString expression(Form("x*%s", fun.GetName()));
    Double_t xmin(0), xmax(0);
    fun.GetRange(xmin,xmax);
    // check range
    xmin = TMath::Min(xmin, xbins[0]);
    xmax = TMath::Max(xmax, xbins[xbins.GetSize()-1]);
    TF1 helper("helper",expression.Data(),xmin,xmax);   // make function x*f(x)
    if(bincontent.GetSize() != xbins.GetSize()-1)
        bincontent.Set(xbins.GetSize()-1); // Adapt array to number of bins
    //Caclulate Binned
    for(Int_t ib = 0; ib < xbins.GetSize()-1; ib++){
        xmin = xbins[ib];
        xmax = xbins[ib+1];
        bincontent[ib] = (helper.Integral(xmin, xmax))/(xmax - xmin);
    }
}




//_________________________________________________________________________
//Function  AliHFEtools::GetHFEResultList() - opens file from argument and returns TList Object containing String "Results"
//_________________________________________________________________________
TList *AliHFEtools::GetHFEResultList(const TString str){

    TFile *f = TFile::Open(str.Data());
    if(!f || f->IsZombie()){
        printf("Could not read file %s\n",str.Data()); 
        return NULL ;
    }
    gROOT->cd();
    TKey *k;
    TIter next(f->GetListOfKeys());
    while ((k = dynamic_cast<TKey *>(next()))){
        TString s(k->GetName());
        if(s.Contains("Results")) break;
    }
    if(!k){
        printf("Output container not found\n");
        f->Close(); delete f;
        return NULL;
    } 
    TList *returnlist = dynamic_cast<TList *>(k->ReadObj());
    f->Close(); delete f;
    return returnlist;
}


//_________________________________________________________________________
//Function  AliHFEtools::GetHFEQAList() - opens file from argument and returns TList Object containing String "QA"
//_________________________________________________________________________
TList *AliHFEtools::GetHFEQAList(const TString str){

    TFile *f = TFile::Open(str.Data());
    if(!f || f->IsZombie()){
        printf("Could not read file %s\n",str.Data()); 
        return NULL ;
    }
    gROOT->cd();
    TKey *k;
    TIter next(f->GetListOfKeys());
    while ((k = dynamic_cast<TKey *>(next()))){
        TString s(k->GetName());
        if(s.Contains("QA")) break;
    }
    if(!k){
        printf("Output container not found\n");
        f->Close(); delete f;
        return NULL;
    } 
    TList *returnlist = dynamic_cast<TList *>(k->ReadObj());
    f->Close(); delete f;
    return returnlist;
}

//__________________________________________
void AliHFEtools::NormaliseBinWidth(TH1 *histo){
  //
  // Helper function to correct histograms for the bin width
  //
  Double_t binwidth(0.);
  for(Int_t ipt = 1; ipt <= histo->GetNbinsX(); ipt++){
    binwidth = histo->GetBinWidth(ipt);
    histo->SetBinContent(ipt, histo->GetBinContent(ipt)/binwidth);
    histo->SetBinError(ipt, histo->GetBinError(ipt)/binwidth);
  }
}

//__________________________________________
void AliHFEtools::NormaliseBinWdith(TGraphErrors *graph){
  //
  // Helper function to correct graphs with symmetric errors 
  // for the bin width
  //
  Double_t binwidth(0.);
  Double_t *ypoints = graph->GetY(),
           *yerrors = graph->GetEY();
  for(int ipt = 0; ipt < graph->GetN(); ipt++){
    binwidth = 2*graph->GetEX()[ipt];
    ypoints[ipt] /= binwidth;
    yerrors[ipt] /= binwidth;
  }
}

//__________________________________________
void AliHFEtools::NormaliseBinWdithAsymm(TGraphAsymmErrors *graph){
  //
  // Helper function to correct graphs with asymmetric errors 
  // for the bin width
  //
  Double_t binwidth(0.);
  Double_t *ypoints = graph->GetY(),
           *yerrorslow = graph->GetEYlow(),
           *yerrorshigh = graph->GetEYhigh();
  for(int ipt = 0; ipt < graph->GetN(); ipt++){
    binwidth = graph->GetEXlow()[ipt] + graph->GetEXhigh()[ipt];
    ypoints[ipt] /= binwidth;
    yerrorslow[ipt] /= binwidth;
    yerrorshigh[ipt] /= binwidth;
  }
}
 AliHFEtools.cxx:1
 AliHFEtools.cxx:2
 AliHFEtools.cxx:3
 AliHFEtools.cxx:4
 AliHFEtools.cxx:5
 AliHFEtools.cxx:6
 AliHFEtools.cxx:7
 AliHFEtools.cxx:8
 AliHFEtools.cxx:9
 AliHFEtools.cxx:10
 AliHFEtools.cxx:11
 AliHFEtools.cxx:12
 AliHFEtools.cxx:13
 AliHFEtools.cxx:14
 AliHFEtools.cxx:15
 AliHFEtools.cxx:16
 AliHFEtools.cxx:17
 AliHFEtools.cxx:18
 AliHFEtools.cxx:19
 AliHFEtools.cxx:20
 AliHFEtools.cxx:21
 AliHFEtools.cxx:22
 AliHFEtools.cxx:23
 AliHFEtools.cxx:24
 AliHFEtools.cxx:25
 AliHFEtools.cxx:26
 AliHFEtools.cxx:27
 AliHFEtools.cxx:28
 AliHFEtools.cxx:29
 AliHFEtools.cxx:30
 AliHFEtools.cxx:31
 AliHFEtools.cxx:32
 AliHFEtools.cxx:33
 AliHFEtools.cxx:34
 AliHFEtools.cxx:35
 AliHFEtools.cxx:36
 AliHFEtools.cxx:37
 AliHFEtools.cxx:38
 AliHFEtools.cxx:39
 AliHFEtools.cxx:40
 AliHFEtools.cxx:41
 AliHFEtools.cxx:42
 AliHFEtools.cxx:43
 AliHFEtools.cxx:44
 AliHFEtools.cxx:45
 AliHFEtools.cxx:46
 AliHFEtools.cxx:47
 AliHFEtools.cxx:48
 AliHFEtools.cxx:49
 AliHFEtools.cxx:50
 AliHFEtools.cxx:51
 AliHFEtools.cxx:52
 AliHFEtools.cxx:53
 AliHFEtools.cxx:54
 AliHFEtools.cxx:55
 AliHFEtools.cxx:56
 AliHFEtools.cxx:57
 AliHFEtools.cxx:58
 AliHFEtools.cxx:59
 AliHFEtools.cxx:60
 AliHFEtools.cxx:61
 AliHFEtools.cxx:62
 AliHFEtools.cxx:63
 AliHFEtools.cxx:64
 AliHFEtools.cxx:65
 AliHFEtools.cxx:66
 AliHFEtools.cxx:67
 AliHFEtools.cxx:68
 AliHFEtools.cxx:69
 AliHFEtools.cxx:70
 AliHFEtools.cxx:71
 AliHFEtools.cxx:72
 AliHFEtools.cxx:73
 AliHFEtools.cxx:74
 AliHFEtools.cxx:75
 AliHFEtools.cxx:76
 AliHFEtools.cxx:77
 AliHFEtools.cxx:78
 AliHFEtools.cxx:79
 AliHFEtools.cxx:80
 AliHFEtools.cxx:81
 AliHFEtools.cxx:82
 AliHFEtools.cxx:83
 AliHFEtools.cxx:84
 AliHFEtools.cxx:85
 AliHFEtools.cxx:86
 AliHFEtools.cxx:87
 AliHFEtools.cxx:88
 AliHFEtools.cxx:89
 AliHFEtools.cxx:90
 AliHFEtools.cxx:91
 AliHFEtools.cxx:92
 AliHFEtools.cxx:93
 AliHFEtools.cxx:94
 AliHFEtools.cxx:95
 AliHFEtools.cxx:96
 AliHFEtools.cxx:97
 AliHFEtools.cxx:98
 AliHFEtools.cxx:99
 AliHFEtools.cxx:100
 AliHFEtools.cxx:101
 AliHFEtools.cxx:102
 AliHFEtools.cxx:103
 AliHFEtools.cxx:104
 AliHFEtools.cxx:105
 AliHFEtools.cxx:106
 AliHFEtools.cxx:107
 AliHFEtools.cxx:108
 AliHFEtools.cxx:109
 AliHFEtools.cxx:110
 AliHFEtools.cxx:111
 AliHFEtools.cxx:112
 AliHFEtools.cxx:113
 AliHFEtools.cxx:114
 AliHFEtools.cxx:115
 AliHFEtools.cxx:116
 AliHFEtools.cxx:117
 AliHFEtools.cxx:118
 AliHFEtools.cxx:119
 AliHFEtools.cxx:120
 AliHFEtools.cxx:121
 AliHFEtools.cxx:122
 AliHFEtools.cxx:123
 AliHFEtools.cxx:124
 AliHFEtools.cxx:125
 AliHFEtools.cxx:126
 AliHFEtools.cxx:127
 AliHFEtools.cxx:128
 AliHFEtools.cxx:129
 AliHFEtools.cxx:130
 AliHFEtools.cxx:131
 AliHFEtools.cxx:132
 AliHFEtools.cxx:133
 AliHFEtools.cxx:134
 AliHFEtools.cxx:135
 AliHFEtools.cxx:136
 AliHFEtools.cxx:137
 AliHFEtools.cxx:138
 AliHFEtools.cxx:139
 AliHFEtools.cxx:140
 AliHFEtools.cxx:141
 AliHFEtools.cxx:142
 AliHFEtools.cxx:143
 AliHFEtools.cxx:144
 AliHFEtools.cxx:145
 AliHFEtools.cxx:146
 AliHFEtools.cxx:147
 AliHFEtools.cxx:148
 AliHFEtools.cxx:149
 AliHFEtools.cxx:150
 AliHFEtools.cxx:151
 AliHFEtools.cxx:152
 AliHFEtools.cxx:153
 AliHFEtools.cxx:154
 AliHFEtools.cxx:155
 AliHFEtools.cxx:156
 AliHFEtools.cxx:157
 AliHFEtools.cxx:158
 AliHFEtools.cxx:159
 AliHFEtools.cxx:160
 AliHFEtools.cxx:161
 AliHFEtools.cxx:162
 AliHFEtools.cxx:163
 AliHFEtools.cxx:164
 AliHFEtools.cxx:165
 AliHFEtools.cxx:166
 AliHFEtools.cxx:167
 AliHFEtools.cxx:168
 AliHFEtools.cxx:169
 AliHFEtools.cxx:170
 AliHFEtools.cxx:171
 AliHFEtools.cxx:172
 AliHFEtools.cxx:173
 AliHFEtools.cxx:174
 AliHFEtools.cxx:175
 AliHFEtools.cxx:176
 AliHFEtools.cxx:177
 AliHFEtools.cxx:178
 AliHFEtools.cxx:179
 AliHFEtools.cxx:180
 AliHFEtools.cxx:181
 AliHFEtools.cxx:182
 AliHFEtools.cxx:183
 AliHFEtools.cxx:184
 AliHFEtools.cxx:185
 AliHFEtools.cxx:186
 AliHFEtools.cxx:187
 AliHFEtools.cxx:188
 AliHFEtools.cxx:189
 AliHFEtools.cxx:190
 AliHFEtools.cxx:191
 AliHFEtools.cxx:192
 AliHFEtools.cxx:193
 AliHFEtools.cxx:194
 AliHFEtools.cxx:195
 AliHFEtools.cxx:196
 AliHFEtools.cxx:197
 AliHFEtools.cxx:198
 AliHFEtools.cxx:199
 AliHFEtools.cxx:200
 AliHFEtools.cxx:201
 AliHFEtools.cxx:202
 AliHFEtools.cxx:203
 AliHFEtools.cxx:204
 AliHFEtools.cxx:205
 AliHFEtools.cxx:206
 AliHFEtools.cxx:207
 AliHFEtools.cxx:208
 AliHFEtools.cxx:209
 AliHFEtools.cxx:210
 AliHFEtools.cxx:211
 AliHFEtools.cxx:212
 AliHFEtools.cxx:213
 AliHFEtools.cxx:214
 AliHFEtools.cxx:215
 AliHFEtools.cxx:216
 AliHFEtools.cxx:217
 AliHFEtools.cxx:218
 AliHFEtools.cxx:219
 AliHFEtools.cxx:220
 AliHFEtools.cxx:221
 AliHFEtools.cxx:222
 AliHFEtools.cxx:223
 AliHFEtools.cxx:224
 AliHFEtools.cxx:225
 AliHFEtools.cxx:226
 AliHFEtools.cxx:227
 AliHFEtools.cxx:228
 AliHFEtools.cxx:229
 AliHFEtools.cxx:230
 AliHFEtools.cxx:231
 AliHFEtools.cxx:232
 AliHFEtools.cxx:233
 AliHFEtools.cxx:234
 AliHFEtools.cxx:235
 AliHFEtools.cxx:236
 AliHFEtools.cxx:237
 AliHFEtools.cxx:238
 AliHFEtools.cxx:239
 AliHFEtools.cxx:240
 AliHFEtools.cxx:241
 AliHFEtools.cxx:242
 AliHFEtools.cxx:243
 AliHFEtools.cxx:244
 AliHFEtools.cxx:245
 AliHFEtools.cxx:246
 AliHFEtools.cxx:247
 AliHFEtools.cxx:248
 AliHFEtools.cxx:249
 AliHFEtools.cxx:250
 AliHFEtools.cxx:251
 AliHFEtools.cxx:252
 AliHFEtools.cxx:253
 AliHFEtools.cxx:254
 AliHFEtools.cxx:255
 AliHFEtools.cxx:256
 AliHFEtools.cxx:257
 AliHFEtools.cxx:258
 AliHFEtools.cxx:259
 AliHFEtools.cxx:260
 AliHFEtools.cxx:261
 AliHFEtools.cxx:262
 AliHFEtools.cxx:263
 AliHFEtools.cxx:264
 AliHFEtools.cxx:265
 AliHFEtools.cxx:266
 AliHFEtools.cxx:267
 AliHFEtools.cxx:268
 AliHFEtools.cxx:269
 AliHFEtools.cxx:270
 AliHFEtools.cxx:271
 AliHFEtools.cxx:272
 AliHFEtools.cxx:273
 AliHFEtools.cxx:274
 AliHFEtools.cxx:275
 AliHFEtools.cxx:276
 AliHFEtools.cxx:277
 AliHFEtools.cxx:278
 AliHFEtools.cxx:279
 AliHFEtools.cxx:280
 AliHFEtools.cxx:281
 AliHFEtools.cxx:282
 AliHFEtools.cxx:283
 AliHFEtools.cxx:284
 AliHFEtools.cxx:285
 AliHFEtools.cxx:286
 AliHFEtools.cxx:287
 AliHFEtools.cxx:288
 AliHFEtools.cxx:289
 AliHFEtools.cxx:290
 AliHFEtools.cxx:291
 AliHFEtools.cxx:292
 AliHFEtools.cxx:293
 AliHFEtools.cxx:294
 AliHFEtools.cxx:295
 AliHFEtools.cxx:296
 AliHFEtools.cxx:297
 AliHFEtools.cxx:298
 AliHFEtools.cxx:299
 AliHFEtools.cxx:300
 AliHFEtools.cxx:301
 AliHFEtools.cxx:302
 AliHFEtools.cxx:303
 AliHFEtools.cxx:304
 AliHFEtools.cxx:305
 AliHFEtools.cxx:306
 AliHFEtools.cxx:307
 AliHFEtools.cxx:308
 AliHFEtools.cxx:309
 AliHFEtools.cxx:310
 AliHFEtools.cxx:311
 AliHFEtools.cxx:312
 AliHFEtools.cxx:313
 AliHFEtools.cxx:314
 AliHFEtools.cxx:315
 AliHFEtools.cxx:316
 AliHFEtools.cxx:317
 AliHFEtools.cxx:318
 AliHFEtools.cxx:319
 AliHFEtools.cxx:320
 AliHFEtools.cxx:321
 AliHFEtools.cxx:322
 AliHFEtools.cxx:323
 AliHFEtools.cxx:324
 AliHFEtools.cxx:325
 AliHFEtools.cxx:326
 AliHFEtools.cxx:327
 AliHFEtools.cxx:328
 AliHFEtools.cxx:329
 AliHFEtools.cxx:330
 AliHFEtools.cxx:331
 AliHFEtools.cxx:332
 AliHFEtools.cxx:333
 AliHFEtools.cxx:334
 AliHFEtools.cxx:335
 AliHFEtools.cxx:336
 AliHFEtools.cxx:337
 AliHFEtools.cxx:338
 AliHFEtools.cxx:339
 AliHFEtools.cxx:340
 AliHFEtools.cxx:341
 AliHFEtools.cxx:342
 AliHFEtools.cxx:343
 AliHFEtools.cxx:344
 AliHFEtools.cxx:345
 AliHFEtools.cxx:346
 AliHFEtools.cxx:347
 AliHFEtools.cxx:348
 AliHFEtools.cxx:349
 AliHFEtools.cxx:350
 AliHFEtools.cxx:351
 AliHFEtools.cxx:352
 AliHFEtools.cxx:353
 AliHFEtools.cxx:354
 AliHFEtools.cxx:355
 AliHFEtools.cxx:356
 AliHFEtools.cxx:357
 AliHFEtools.cxx:358
 AliHFEtools.cxx:359
 AliHFEtools.cxx:360
 AliHFEtools.cxx:361
 AliHFEtools.cxx:362
 AliHFEtools.cxx:363
 AliHFEtools.cxx:364
 AliHFEtools.cxx:365
 AliHFEtools.cxx:366
 AliHFEtools.cxx:367
 AliHFEtools.cxx:368
 AliHFEtools.cxx:369
 AliHFEtools.cxx:370
 AliHFEtools.cxx:371
 AliHFEtools.cxx:372
 AliHFEtools.cxx:373
 AliHFEtools.cxx:374
 AliHFEtools.cxx:375
 AliHFEtools.cxx:376
 AliHFEtools.cxx:377
 AliHFEtools.cxx:378
 AliHFEtools.cxx:379
 AliHFEtools.cxx:380
 AliHFEtools.cxx:381
 AliHFEtools.cxx:382
 AliHFEtools.cxx:383
 AliHFEtools.cxx:384
 AliHFEtools.cxx:385
 AliHFEtools.cxx:386
 AliHFEtools.cxx:387
 AliHFEtools.cxx:388
 AliHFEtools.cxx:389
 AliHFEtools.cxx:390
 AliHFEtools.cxx:391
 AliHFEtools.cxx:392
 AliHFEtools.cxx:393
 AliHFEtools.cxx:394
 AliHFEtools.cxx:395
 AliHFEtools.cxx:396
 AliHFEtools.cxx:397
 AliHFEtools.cxx:398
 AliHFEtools.cxx:399
 AliHFEtools.cxx:400
 AliHFEtools.cxx:401
 AliHFEtools.cxx:402
 AliHFEtools.cxx:403
 AliHFEtools.cxx:404
 AliHFEtools.cxx:405
 AliHFEtools.cxx:406
 AliHFEtools.cxx:407
 AliHFEtools.cxx:408
 AliHFEtools.cxx:409
 AliHFEtools.cxx:410
 AliHFEtools.cxx:411
 AliHFEtools.cxx:412
 AliHFEtools.cxx:413
 AliHFEtools.cxx:414
 AliHFEtools.cxx:415
 AliHFEtools.cxx:416
 AliHFEtools.cxx:417
 AliHFEtools.cxx:418
 AliHFEtools.cxx:419
 AliHFEtools.cxx:420
 AliHFEtools.cxx:421
 AliHFEtools.cxx:422
 AliHFEtools.cxx:423
 AliHFEtools.cxx:424
 AliHFEtools.cxx:425
 AliHFEtools.cxx:426
 AliHFEtools.cxx:427
 AliHFEtools.cxx:428
 AliHFEtools.cxx:429
 AliHFEtools.cxx:430
 AliHFEtools.cxx:431
 AliHFEtools.cxx:432
 AliHFEtools.cxx:433
 AliHFEtools.cxx:434
 AliHFEtools.cxx:435
 AliHFEtools.cxx:436
 AliHFEtools.cxx:437
 AliHFEtools.cxx:438
 AliHFEtools.cxx:439
 AliHFEtools.cxx:440
 AliHFEtools.cxx:441
 AliHFEtools.cxx:442
 AliHFEtools.cxx:443
 AliHFEtools.cxx:444
 AliHFEtools.cxx:445
 AliHFEtools.cxx:446
 AliHFEtools.cxx:447
 AliHFEtools.cxx:448
 AliHFEtools.cxx:449
 AliHFEtools.cxx:450
 AliHFEtools.cxx:451
 AliHFEtools.cxx:452
 AliHFEtools.cxx:453
 AliHFEtools.cxx:454
 AliHFEtools.cxx:455
 AliHFEtools.cxx:456
 AliHFEtools.cxx:457
 AliHFEtools.cxx:458
 AliHFEtools.cxx:459
 AliHFEtools.cxx:460
 AliHFEtools.cxx:461
 AliHFEtools.cxx:462
 AliHFEtools.cxx:463
 AliHFEtools.cxx:464
 AliHFEtools.cxx:465
 AliHFEtools.cxx:466
 AliHFEtools.cxx:467
 AliHFEtools.cxx:468
 AliHFEtools.cxx:469
 AliHFEtools.cxx:470
 AliHFEtools.cxx:471
 AliHFEtools.cxx:472
 AliHFEtools.cxx:473
 AliHFEtools.cxx:474
 AliHFEtools.cxx:475
 AliHFEtools.cxx:476
 AliHFEtools.cxx:477
 AliHFEtools.cxx:478
 AliHFEtools.cxx:479
 AliHFEtools.cxx:480
 AliHFEtools.cxx:481
 AliHFEtools.cxx:482
 AliHFEtools.cxx:483
 AliHFEtools.cxx:484
 AliHFEtools.cxx:485
 AliHFEtools.cxx:486
 AliHFEtools.cxx:487
 AliHFEtools.cxx:488
 AliHFEtools.cxx:489
 AliHFEtools.cxx:490
 AliHFEtools.cxx:491
 AliHFEtools.cxx:492
 AliHFEtools.cxx:493
 AliHFEtools.cxx:494
 AliHFEtools.cxx:495
 AliHFEtools.cxx:496
 AliHFEtools.cxx:497
 AliHFEtools.cxx:498
 AliHFEtools.cxx:499
 AliHFEtools.cxx:500
 AliHFEtools.cxx:501
 AliHFEtools.cxx:502
 AliHFEtools.cxx:503
 AliHFEtools.cxx:504
 AliHFEtools.cxx:505
 AliHFEtools.cxx:506
 AliHFEtools.cxx:507
 AliHFEtools.cxx:508
 AliHFEtools.cxx:509
 AliHFEtools.cxx:510
 AliHFEtools.cxx:511
 AliHFEtools.cxx:512
 AliHFEtools.cxx:513
 AliHFEtools.cxx:514
 AliHFEtools.cxx:515
 AliHFEtools.cxx:516
 AliHFEtools.cxx:517
 AliHFEtools.cxx:518
 AliHFEtools.cxx:519
 AliHFEtools.cxx:520
 AliHFEtools.cxx:521
 AliHFEtools.cxx:522
 AliHFEtools.cxx:523
 AliHFEtools.cxx:524
 AliHFEtools.cxx:525
 AliHFEtools.cxx:526
 AliHFEtools.cxx:527
 AliHFEtools.cxx:528
 AliHFEtools.cxx:529
 AliHFEtools.cxx:530
 AliHFEtools.cxx:531
 AliHFEtools.cxx:532
 AliHFEtools.cxx:533
 AliHFEtools.cxx:534
 AliHFEtools.cxx:535
 AliHFEtools.cxx:536
 AliHFEtools.cxx:537
 AliHFEtools.cxx:538
 AliHFEtools.cxx:539
 AliHFEtools.cxx:540
 AliHFEtools.cxx:541
 AliHFEtools.cxx:542
 AliHFEtools.cxx:543
 AliHFEtools.cxx:544
 AliHFEtools.cxx:545
 AliHFEtools.cxx:546
 AliHFEtools.cxx:547
 AliHFEtools.cxx:548
 AliHFEtools.cxx:549
 AliHFEtools.cxx:550
 AliHFEtools.cxx:551
 AliHFEtools.cxx:552
 AliHFEtools.cxx:553
 AliHFEtools.cxx:554
 AliHFEtools.cxx:555
 AliHFEtools.cxx:556
 AliHFEtools.cxx:557
 AliHFEtools.cxx:558
 AliHFEtools.cxx:559
 AliHFEtools.cxx:560
 AliHFEtools.cxx:561
 AliHFEtools.cxx:562
 AliHFEtools.cxx:563
 AliHFEtools.cxx:564
 AliHFEtools.cxx:565
 AliHFEtools.cxx:566