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 <TASImage.h>
#include <TLine.h>
#include <TBox.h>

#include "my_tools.C"


/*
  Info:
  Multiplies the fraction with the charged spectrum. 
  Applies a rapidity correction in case of K and p.

  To run:

  gSystem->AddIncludePath("-I../macros")
  gSystem->AddIncludePath("-I../lib")
  gROOT->SetMacroPath(".:../macros")
  .L my_tools.C+
  .L makeSpectra.C+

  MakeSpectra("../corrected_fraction/fraction_7tev_b_all.root", "NOPID_pp_7TeV.root", "final_spectra_7tev_b.root");


 */

Double_t rap_correction(Double_t* x, Double_t* par);

void MakeSpectra(const Char_t* fileName,
		 const Char_t* fileNameCharged,
		 const Char_t* outFileName,
		 const Char_t* endName="PP")
{
  TFile* fileData = FindFileFresh(fileName);

  if(!fileData)
    return;

  TFile* fileDataCharged = FindFileFresh(fileNameCharged);
  
  if(!fileDataCharged)
    return;
  
  const Int_t nPid = 3;
  const Char_t* pidNames[nPid] = {"Pion", "Kaon", "Proton"}; 
  const Char_t* titleNames[nPid] = {"#pi^{+} + #pi^{-}", "K^{+} + K^{-}", "p + #bar{p}"}; 
  const Double_t mass[nPid] = {0.140, 0.494, 0.938};

  TH1D* hPtSpectrum[nPid] = {0, 0, 0};
  TH1D* hPtSpectrumSyst[nPid] = {0, 0, 0};

  TH1D* hPtCharged = (TH1D*)fileDataCharged->Get(Form("hDnDptCharged_%s", endName));
  TH1D* hPtChargedSyst = (TH1D*)fileDataCharged->Get(Form("hDnDptChargedSyst_%s", endName));

  TF1* fRap = new TF1("fRap", rap_correction, 0.0, 50.0, 2);

  for(Int_t pid = 0; pid < nPid; pid++) {
    
    // Pions
    TH1D* hFraction     = (TH1D*)fileData->Get(Form("h%sFraction_%s", pidNames[pid], endName));
    TH1D* hFractionSyst = (TH1D*)fileData->Get(Form("h%sFractionSyst_%s", pidNames[pid], endName));
    
    hPtSpectrum[pid] = (TH1D*)hFraction->Clone(Form("h%sSpectrum_%s", pidNames[pid], endName));
    hPtSpectrum[pid]->GetYaxis()->SetTitle(Form("1/N_{evt} 1/(2#pi p_{T}) (d^{2}N_{%s})/(dy dp_{T}) (GeV/c)^{-2}", titleNames[pid]));
    hPtSpectrum[pid]->Multiply(hPtCharged);

    hPtSpectrumSyst[pid] = (TH1D*)hFractionSyst->Clone(Form("h%sSpectrumSyst_%s", pidNames[pid], endName));
    hPtSpectrumSyst[pid]->SetMarkerStyle(1);
    hPtSpectrum[pid]->GetYaxis()->SetTitle(Form("1/N_{evt} 1/(2#pi p_{T}) (d^{2}N_{%s})/(dy dp_{T}) (GeV/c)^{-2}", titleNames[pid]));
    hPtSpectrumSyst[pid]->Multiply(hPtChargedSyst);
    hPtSpectrumSyst[pid]->SetFillStyle(1001);
    hPtSpectrumSyst[pid]->SetFillColor(kGray);

    //
    // Rapidity correction
    //
    fRap->SetParameters(0.8, mass[pid]);
    hPtSpectrum[pid]->Divide(fRap);
    hPtSpectrumSyst[pid]->Divide(fRap);
  }

  TFile* fileOut = new TFile(outFileName, "RECREATE");
  for(Int_t pid = 0; pid < nPid; pid++) {
    hPtSpectrumSyst[pid]->Write();
    hPtSpectrum[pid]->Write();
  }
  fileOut->Close();
}

//______________________________________________________________________________
Double_t rap_correction(Double_t* x, Double_t* par)
{
  Double_t pt = x[0];  

  Double_t eta  = par[0];
  Double_t mass = par[1];

  const Double_t mt = TMath::Sqrt(pt*pt + mass*mass);
  
  const Double_t rap = TMath::ASinH(pt/mt*TMath::SinH(eta));
  
  return rap/eta;
}
 makeSpectra.C:1
 makeSpectra.C:2
 makeSpectra.C:3
 makeSpectra.C:4
 makeSpectra.C:5
 makeSpectra.C:6
 makeSpectra.C:7
 makeSpectra.C:8
 makeSpectra.C:9
 makeSpectra.C:10
 makeSpectra.C:11
 makeSpectra.C:12
 makeSpectra.C:13
 makeSpectra.C:14
 makeSpectra.C:15
 makeSpectra.C:16
 makeSpectra.C:17
 makeSpectra.C:18
 makeSpectra.C:19
 makeSpectra.C:20
 makeSpectra.C:21
 makeSpectra.C:22
 makeSpectra.C:23
 makeSpectra.C:24
 makeSpectra.C:25
 makeSpectra.C:26
 makeSpectra.C:27
 makeSpectra.C:28
 makeSpectra.C:29
 makeSpectra.C:30
 makeSpectra.C:31
 makeSpectra.C:32
 makeSpectra.C:33
 makeSpectra.C:34
 makeSpectra.C:35
 makeSpectra.C:36
 makeSpectra.C:37
 makeSpectra.C:38
 makeSpectra.C:39
 makeSpectra.C:40
 makeSpectra.C:41
 makeSpectra.C:42
 makeSpectra.C:43
 makeSpectra.C:44
 makeSpectra.C:45
 makeSpectra.C:46
 makeSpectra.C:47
 makeSpectra.C:48
 makeSpectra.C:49
 makeSpectra.C:50
 makeSpectra.C:51
 makeSpectra.C:52
 makeSpectra.C:53
 makeSpectra.C:54
 makeSpectra.C:55
 makeSpectra.C:56
 makeSpectra.C:57
 makeSpectra.C:58
 makeSpectra.C:59
 makeSpectra.C:60
 makeSpectra.C:61
 makeSpectra.C:62
 makeSpectra.C:63
 makeSpectra.C:64
 makeSpectra.C:65
 makeSpectra.C:66
 makeSpectra.C:67
 makeSpectra.C:68
 makeSpectra.C:69
 makeSpectra.C:70
 makeSpectra.C:71
 makeSpectra.C:72
 makeSpectra.C:73
 makeSpectra.C:74
 makeSpectra.C:75
 makeSpectra.C:76
 makeSpectra.C:77
 makeSpectra.C:78
 makeSpectra.C:79
 makeSpectra.C:80
 makeSpectra.C:81
 makeSpectra.C:82
 makeSpectra.C:83
 makeSpectra.C:84
 makeSpectra.C:85
 makeSpectra.C:86
 makeSpectra.C:87
 makeSpectra.C:88
 makeSpectra.C:89
 makeSpectra.C:90
 makeSpectra.C:91
 makeSpectra.C:92
 makeSpectra.C:93
 makeSpectra.C:94
 makeSpectra.C:95
 makeSpectra.C:96
 makeSpectra.C:97
 makeSpectra.C:98
 makeSpectra.C:99
 makeSpectra.C:100
 makeSpectra.C:101
 makeSpectra.C:102
 makeSpectra.C:103
 makeSpectra.C:104
 makeSpectra.C:105
 makeSpectra.C:106
 makeSpectra.C:107
 makeSpectra.C:108
 makeSpectra.C:109
 makeSpectra.C:110
 makeSpectra.C:111
 makeSpectra.C:112
 makeSpectra.C:113