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.                  *
 **************************************************************************/

/*   Origin: Alberica Toia, CERN, Alberica.Toia@cern.ch                   */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  class to determine centrality percentiles from 2D distributions          // 
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include <TNamed.h>
#include <TH1D.h>
#include <TString.h>
#include <TFile.h>
#include <TMath.h>
#include <TROOT.h>
#include <TH2F.h>
#include <TProfile.h>
#include <TF1.h>
#include <TStyle.h>
#include <TGraphErrors.h>
#include <vector>
#include <TMap.h>
#include <map>
#include "AliCentralityByFunction.h"


ClassImp(AliCentralityByFunction)  
 
//______________________________________________________________________________
AliCentralityByFunction::AliCentralityByFunction() :
  finrootfile(0),
  foutrootfilename(0),
  foutrootfile(0),
  fhistnames(),
  fpercentXsec(0),
  fitfunc(),
  fitter()
{
  // standard constructor
  fitter["fitf_pol2"] = new TF1("pol2",0,1,3);
  fitter["fitf_pol2"]->SetLineColor(kRed); 

  fitter["fitf_pol3"] = new TF1("pol3",0,1,4);
  fitter["fitf_pol3"]->SetLineColor(kRed); 

  fitter["fitf_pol4"] = new TF1("pol4",0,1,5);
  fitter["fitf_pol4"]->SetLineColor(kRed); 

  fitter["fitf_pol6"] = new TF1("pol6",0,1,6);
  fitter["fitf_pol6"]->SetLineColor(kRed); 
}

void AliCentralityByFunction::SetFitFunction(TString distribution, TString func, Double_t xmin, Double_t xmax) 
{
  // Set fit function
  fitfunc[distribution] = func;
  fitter[fitfunc[distribution]]->SetRange(xmin,xmax);
}

void AliCentralityByFunction::MakePercentiles(TString infilename) 
{
  // Make percentile bins

  TH1D *hpercentile;
  
  // open inrootfile, outrootfile
  finrootfile  = new TFile(infilename);
  foutrootfile = new TFile(foutrootfilename,"RECREATE");
  
  // loop over all distribution names  
  std::vector<TString>::const_iterator hni;
  for(hni=fhistnames.begin(); hni!=fhistnames.end(); hni++) {
    hpercentile = FitHisto(*hni);
    foutrootfile->cd();
    hpercentile->Write();
  }
  // close inrootfile, outrootfile
  finrootfile->Close();
  foutrootfile->Close();
}

TH1D *AliCentralityByFunction::FitHisto(TString hdistributionName) 
{
  // Fit histogram
  TH2D *hdist  = (TH2D*) (finrootfile->Get(hdistributionName)); 
  TProfile *profile =hdist->ProfileX(); 
  //  fitter[fitfunc[hdistributionName]]->SetRange(0,profile->GetBinCenter(profile->GetNbinsX()));
  profile->Fit(fitter[fitfunc[hdistributionName]], "RNM");

  foutrootfile->cd();
  profile->Write();
  fitter[fitfunc[hdistributionName]]->Write(hdistributionName.Append("_fit"));

  return MakePercentHisto(hdist);
}

TH1D * AliCentralityByFunction::MakePercentHisto(TH2D *histo) 
{
  TH2D *htemp = (TH2D*)histo->Clone("htemp");
  TString hdistributionName = htemp->GetTitle();

  const int num_DIVISION=500;
  
  TH1D *hpercent  = new TH1D("","",num_DIVISION,0,htemp->GetXaxis()->GetBinCenter(htemp->GetNbinsX()));
  hpercent->Reset();
  
  double xpoint, ypoint, xcomp, ycomp, count;
  
  double xmax = htemp->GetXaxis()->GetBinCenter(htemp->GetNbinsX());
  double xmin = 0;
  
  double delta = (xmax - xmin) / num_DIVISION;
  double slopePerp;   // slope of the perpendicular line
  double slopeFunction;

  std::cout << "Start Percentile Histo for distribution " << hdistributionName << " with fit function " << fitfunc[hdistributionName] << std::endl;

  // move perpendicular line along fitting curve
  // and count number of points on the right
  for (int i = 0; i <= num_DIVISION; i++) {
    xcomp = xmin + i * delta;
    ycomp = fitter[fitfunc[hdistributionName]]->Eval(xcomp);
    count = 0.0;
    slopeFunction = fitter[fitfunc[hdistributionName]]->Derivative(xcomp,NULL,0.0001);
    slopePerp = -1.0 /slopeFunction;
    //
    // equation of perpendicular line
    // (y-Ycomp)/(x-Xcomp) = slopePerp
    //
    for (int ibiny = 1; ibiny < htemp->GetNbinsY(); ibiny++) {
      ypoint = htemp->GetYaxis()->GetBinCenter(ibiny);

      double xonLine =(ypoint - ycomp)/slopePerp + xcomp;
      //      double YonLine = slopePerp*(XonLine - Xcomp) +Ycomp;
      
      for (int ibinx = 1; ibinx < htemp->GetNbinsX(); ibinx++) {
	xpoint = htemp->GetXaxis()->GetBinCenter(ibinx);
	//
	// (XonLine,Ypoint) lies on the perpendicular
	//
	 if ((xpoint > xonLine && xpoint > xcomp - 0.5)||
	     (xpoint > xcomp + 0.2)) {
		  
	  count  += htemp->GetBinContent(ibinx,ibiny);
	}
      }
    }
    count = count/htemp->Integral() * 100.0;   // change to percentage
    hpercent->SetBinContent(i, count);
  }

  hpercent->SetName(hdistributionName.Append("_percentile"));

  return hpercent;
}
 AliCentralityByFunction.cxx:1
 AliCentralityByFunction.cxx:2
 AliCentralityByFunction.cxx:3
 AliCentralityByFunction.cxx:4
 AliCentralityByFunction.cxx:5
 AliCentralityByFunction.cxx:6
 AliCentralityByFunction.cxx:7
 AliCentralityByFunction.cxx:8
 AliCentralityByFunction.cxx:9
 AliCentralityByFunction.cxx:10
 AliCentralityByFunction.cxx:11
 AliCentralityByFunction.cxx:12
 AliCentralityByFunction.cxx:13
 AliCentralityByFunction.cxx:14
 AliCentralityByFunction.cxx:15
 AliCentralityByFunction.cxx:16
 AliCentralityByFunction.cxx:17
 AliCentralityByFunction.cxx:18
 AliCentralityByFunction.cxx:19
 AliCentralityByFunction.cxx:20
 AliCentralityByFunction.cxx:21
 AliCentralityByFunction.cxx:22
 AliCentralityByFunction.cxx:23
 AliCentralityByFunction.cxx:24
 AliCentralityByFunction.cxx:25
 AliCentralityByFunction.cxx:26
 AliCentralityByFunction.cxx:27
 AliCentralityByFunction.cxx:28
 AliCentralityByFunction.cxx:29
 AliCentralityByFunction.cxx:30
 AliCentralityByFunction.cxx:31
 AliCentralityByFunction.cxx:32
 AliCentralityByFunction.cxx:33
 AliCentralityByFunction.cxx:34
 AliCentralityByFunction.cxx:35
 AliCentralityByFunction.cxx:36
 AliCentralityByFunction.cxx:37
 AliCentralityByFunction.cxx:38
 AliCentralityByFunction.cxx:39
 AliCentralityByFunction.cxx:40
 AliCentralityByFunction.cxx:41
 AliCentralityByFunction.cxx:42
 AliCentralityByFunction.cxx:43
 AliCentralityByFunction.cxx:44
 AliCentralityByFunction.cxx:45
 AliCentralityByFunction.cxx:46
 AliCentralityByFunction.cxx:47
 AliCentralityByFunction.cxx:48
 AliCentralityByFunction.cxx:49
 AliCentralityByFunction.cxx:50
 AliCentralityByFunction.cxx:51
 AliCentralityByFunction.cxx:52
 AliCentralityByFunction.cxx:53
 AliCentralityByFunction.cxx:54
 AliCentralityByFunction.cxx:55
 AliCentralityByFunction.cxx:56
 AliCentralityByFunction.cxx:57
 AliCentralityByFunction.cxx:58
 AliCentralityByFunction.cxx:59
 AliCentralityByFunction.cxx:60
 AliCentralityByFunction.cxx:61
 AliCentralityByFunction.cxx:62
 AliCentralityByFunction.cxx:63
 AliCentralityByFunction.cxx:64
 AliCentralityByFunction.cxx:65
 AliCentralityByFunction.cxx:66
 AliCentralityByFunction.cxx:67
 AliCentralityByFunction.cxx:68
 AliCentralityByFunction.cxx:69
 AliCentralityByFunction.cxx:70
 AliCentralityByFunction.cxx:71
 AliCentralityByFunction.cxx:72
 AliCentralityByFunction.cxx:73
 AliCentralityByFunction.cxx:74
 AliCentralityByFunction.cxx:75
 AliCentralityByFunction.cxx:76
 AliCentralityByFunction.cxx:77
 AliCentralityByFunction.cxx:78
 AliCentralityByFunction.cxx:79
 AliCentralityByFunction.cxx:80
 AliCentralityByFunction.cxx:81
 AliCentralityByFunction.cxx:82
 AliCentralityByFunction.cxx:83
 AliCentralityByFunction.cxx:84
 AliCentralityByFunction.cxx:85
 AliCentralityByFunction.cxx:86
 AliCentralityByFunction.cxx:87
 AliCentralityByFunction.cxx:88
 AliCentralityByFunction.cxx:89
 AliCentralityByFunction.cxx:90
 AliCentralityByFunction.cxx:91
 AliCentralityByFunction.cxx:92
 AliCentralityByFunction.cxx:93
 AliCentralityByFunction.cxx:94
 AliCentralityByFunction.cxx:95
 AliCentralityByFunction.cxx:96
 AliCentralityByFunction.cxx:97
 AliCentralityByFunction.cxx:98
 AliCentralityByFunction.cxx:99
 AliCentralityByFunction.cxx:100
 AliCentralityByFunction.cxx:101
 AliCentralityByFunction.cxx:102
 AliCentralityByFunction.cxx:103
 AliCentralityByFunction.cxx:104
 AliCentralityByFunction.cxx:105
 AliCentralityByFunction.cxx:106
 AliCentralityByFunction.cxx:107
 AliCentralityByFunction.cxx:108
 AliCentralityByFunction.cxx:109
 AliCentralityByFunction.cxx:110
 AliCentralityByFunction.cxx:111
 AliCentralityByFunction.cxx:112
 AliCentralityByFunction.cxx:113
 AliCentralityByFunction.cxx:114
 AliCentralityByFunction.cxx:115
 AliCentralityByFunction.cxx:116
 AliCentralityByFunction.cxx:117
 AliCentralityByFunction.cxx:118
 AliCentralityByFunction.cxx:119
 AliCentralityByFunction.cxx:120
 AliCentralityByFunction.cxx:121
 AliCentralityByFunction.cxx:122
 AliCentralityByFunction.cxx:123
 AliCentralityByFunction.cxx:124
 AliCentralityByFunction.cxx:125
 AliCentralityByFunction.cxx:126
 AliCentralityByFunction.cxx:127
 AliCentralityByFunction.cxx:128
 AliCentralityByFunction.cxx:129
 AliCentralityByFunction.cxx:130
 AliCentralityByFunction.cxx:131
 AliCentralityByFunction.cxx:132
 AliCentralityByFunction.cxx:133
 AliCentralityByFunction.cxx:134
 AliCentralityByFunction.cxx:135
 AliCentralityByFunction.cxx:136
 AliCentralityByFunction.cxx:137
 AliCentralityByFunction.cxx:138
 AliCentralityByFunction.cxx:139
 AliCentralityByFunction.cxx:140
 AliCentralityByFunction.cxx:141
 AliCentralityByFunction.cxx:142
 AliCentralityByFunction.cxx:143
 AliCentralityByFunction.cxx:144
 AliCentralityByFunction.cxx:145
 AliCentralityByFunction.cxx:146
 AliCentralityByFunction.cxx:147
 AliCentralityByFunction.cxx:148
 AliCentralityByFunction.cxx:149
 AliCentralityByFunction.cxx:150
 AliCentralityByFunction.cxx:151
 AliCentralityByFunction.cxx:152
 AliCentralityByFunction.cxx:153
 AliCentralityByFunction.cxx:154
 AliCentralityByFunction.cxx:155
 AliCentralityByFunction.cxx:156
 AliCentralityByFunction.cxx:157
 AliCentralityByFunction.cxx:158
 AliCentralityByFunction.cxx:159
 AliCentralityByFunction.cxx:160
 AliCentralityByFunction.cxx:161
 AliCentralityByFunction.cxx:162
 AliCentralityByFunction.cxx:163
 AliCentralityByFunction.cxx:164
 AliCentralityByFunction.cxx:165
 AliCentralityByFunction.cxx:166
 AliCentralityByFunction.cxx:167
 AliCentralityByFunction.cxx:168
 AliCentralityByFunction.cxx:169