ROOT logo
#include <TFile.h>
#include <TH1.h>
#include <TF1.h>
#include <TCanvas.h>
#include <TList.h>
#include <TLegend.h>
#include <TStyle.h>
#include <TMath.h>
#include <TSystem.h>
#include <TLatex.h>

#include "my_tools.C"


/*
  Info:
  * Efficiencies are currently set by hand!!!!!
  * Systematic errors needs an update also.
  * Need to accomodate k+p at soem point!

  To run:
  
  gSystem->AddIncludePath("-I../macros")
  gSystem->AddIncludePath("-I../lib")
  gROOT->SetMacroPath(".:../macros")
  .L my_tools.C++
  .L corrected_fraction.C+
  
  
  CorrectedFraction("../ratios_7tevb/fit_yields_results/7tev_b.root", "fraction_7tev_b_pi.root", 1, "PP", 0, 10.0);
  CorrectedFraction("../ratios_7tevb/fit_yields_results/7tev_b.root", "fraction_7tev_b_k.root", 2, "PP", 0, 10.0);
  CorrectedFraction("../ratios_7tevb/fit_yields_results/7tev_b.root", "fraction_7tev_b_p.root", 3, "PP", 0, 10.0);


  And in the shell one can add files like:
  
  hadd fraction_7tev_b_all.root fraction_7tev_b_pi.root fraction_7tev_b_k.root fraction_7tev_b_p.root

 */

void CorrectedFraction(const Char_t* inFileName, const Char_t* outFileName, Int_t pid, 
		       const Char_t* endName="PP", Int_t centBin=0, 
		       Double_t ptMax=20.0, const Char_t* outDir="plots");
TH1D* GetSystErrorHist(TH1D* hRatio, Int_t centBin, TF1* electronFraction);


//________________________________________________________________________________________
void CorrectedFraction(const Char_t* inFileName, const Char_t* outFileName, Int_t pid, 
		   const Char_t* endName, Int_t centBin, 
		   Double_t ptMax, const Char_t* outDir)
{
  gStyle->SetOptStat(0);
  
  
  TFile* fileData = FindFileFresh(inFileName);

  if(!fileData)
    return;
  
  TF1*  fElectronFraction   = (TF1*)fileData->Get("fElectronFraction");
  cout << "Electron fraction found!" << endl;
  TH1D* hPionRatio   = 0;
  if(pid==1) {
    hPionRatio = (TH1D*)fileData->Get("hPionRatio");
    CutHistogram(hPionRatio, 2.0, ptMax);
    hPionRatio->SetMarkerStyle(24);
  } else if(pid==2) {
    hPionRatio = (TH1D*)fileData->Get("hKaonRatio");
    CutHistogram(hPionRatio, 3.0, ptMax);
    hPionRatio->SetMarkerStyle(25);
  } else if(pid==3) {
    hPionRatio = (TH1D*)fileData->Get("hProtonRatio");
    CutHistogram(hPionRatio, 3.0, ptMax);
    hPionRatio->SetMarkerStyle(25);
  }

  // Global variable
  TH1D* hSystFraction = 0;
  if(pid==1)
    hSystFraction =  GetSystErrorHist(hPionRatio, centBin, fElectronFraction);
  else
    hSystFraction =  GetSystErrorHist(hPionRatio, centBin, 0);
  hSystFraction->SetLineColor(1);
  hSystFraction->SetMarkerStyle(1);
  hSystFraction->SetFillStyle(1001);
  hSystFraction->SetFillColor(kGray);

  TH1D* hPionFraction = (TH1D*)hPionRatio->Clone("hPionFraction");
  if(pid==1 && !fElectronFraction) {
    TF1 f1("f1", "1.0", 0.0, 50.0);
    cout << "NO ELECTRON FRACTION!!!" << endl;
    hPionFraction->Add(&f1, -0.01); // correct for muons and electrons
    CutHistogram(hPionFraction, 3.0, ptMax);
    hSystFraction->Add(&f1, -0.01); // correct for muons and electrons
    CutHistogram(hSystFraction, 3.0, ptMax);
  }

  if(pid==1 || pid ==3) {

    hPionFraction->Scale(0.94); // correct for efficiency ratio
    hSystFraction->Scale(0.94); // correct for efficiency ratio
  } else {

    TF1* effRatioK = new TF1("effRatioK", "exp(-[1]*x)+[0]", 0.0, 50.0);
    effRatioK->SetParameters(9.82065e-01, 1.28157e+00);
    hPionFraction->Multiply(effRatioK); // correct for efficiency ratio
    hSystFraction->Multiply(effRatioK); // correct for efficiency ratio
  }

  if(pid==1)
    hPionFraction->SetMarkerStyle(20);
  else
    hPionFraction->SetMarkerStyle(20);
  TLatex latex;
  latex.SetNDC();
  latex.SetTextSize(0.05);

  TCanvas* cRatios = new TCanvas("cRatios", "Particle fractions");
  cRatios->Clear();
  hSystFraction->GetXaxis()->SetRangeUser(0, ptMax);
  hSystFraction->GetYaxis()->SetRangeUser(0, 1);
  hSystFraction->Draw("E5");
  hPionRatio->Draw("SAME");
  hPionFraction->Draw("SAME");
  latex.DrawLatex(0.6, 0.95, Form("%s", endName));
  
  CreateDir(outDir);
  if(pid==1) {
    hPionFraction->SetName(Form("hPionFraction_%s", endName));
    hSystFraction->SetName(Form("hPionFractionSyst_%s", endName));
    cRatios->SaveAs(Form("%s/fractions_%s_pions.gif", outDir, endName));
  } else if (pid==2) {
    hPionFraction->SetName(Form("hKaonFraction_%s", endName));
    hSystFraction->SetName(Form("hKaonFractionSyst_%s", endName));
    cRatios->SaveAs(Form("%s/fractions_%s_kaons.gif", outDir, endName));
  } else if (pid==3) {
    hPionFraction->SetName(Form("hProtonFraction_%s", endName));
    hSystFraction->SetName(Form("hProtonFractionSyst_%s", endName));
    cRatios->SaveAs(Form("%s/fractions_%s_protons.gif", outDir, endName));
  }

  TFile* outFile = new TFile(outFileName, "RECREATE");
  hPionFraction->Write();
  hSystFraction->Write();
  outFile->Close();
}

//__________________________________________________________________________________
TH1D* GetSystErrorHist(TH1D* hRatio, Int_t centBin, TF1* electronFraction)
{
  TFile* fileSyst = FindFile("syst_vs_pt.root");
  
  TF1* fSyst = (TF1*)fileSyst->Get(Form("systHigh%d", centBin));
  fSyst->SetRange(2.0, 20.0);
  fSyst->Print();
  
  Double_t syst_error_mc = 0.03; // pp
  if (centBin>0)
    syst_error_mc = 0.05; // Pb+Pb
  
  Double_t syst_error_correction = 0.01; // pp
  if (centBin>0)
    syst_error_correction = 0.03; // Pb+Pb

  TH1D* hSystError = (TH1D*)hRatio->Clone("hPionFractionSyst");
  hSystError->Multiply(fSyst);

  const Int_t nBins = hSystError->GetNbinsX();
  for(Int_t bin = 1; bin <= nBins; bin++) {
  
    Double_t value      = hRatio->GetBinContent(bin);
    Double_t stat_error = hSystError->GetBinContent(bin);

    if(value==0)
      continue;

    Double_t syst_error = stat_error*stat_error;
    syst_error += value*value*syst_error_mc*syst_error_mc;
    syst_error += value*value*syst_error_correction*syst_error_correction;
    
    
    if (electronFraction) {
      
      Double_t systEandMu = electronFraction->Eval(hRatio->GetXaxis()->GetBinCenter(bin));
      syst_error += systEandMu*systEandMu;
    }

    syst_error = TMath::Sqrt(syst_error);
    hSystError->SetBinContent(bin, value);
    hSystError->SetBinError(bin, syst_error);
  }

  return hSystError;
}

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