ROOT logo
#include "TH2D.h"
#include "THnSparse.h"
#include "TCanvas.h"
#include "TList.h"
#include "TString.h"
#include "TFile.h"
#include "TGraph.h"
#include "TMath.h"
#include "TObjArray.h"
#include "THnSparse.h"
#include "TSpline.h"

#include <iostream>
#include <iomanip>

//__________________________________________________________________________________________
TSpline3* loadSplines(TFile* file, TObjArray* arr, TString name, Bool_t useOADB)
{
  if (useOADB) {
    if (!arr)
      return 0x0;
    
    return (TSpline3*)arr->FindObject(name.Data());
  }
  
  if (!file)
    return 0x0;
  
  return (TSpline3*)file->Get(name.Data());
}



//__________________________________________________________________________________________
Int_t compareSplines(TString pathNameSplines1, TString pathNameSplines2,
                     TString period = "LHC10D_PASS2", TString dataType1 = "DATA", TString beamType1 = "PP",
                     TString period2 = "", TString dataType2 = "", TString beamType2 = "",
                     Bool_t useOADBforFirstSplines = kFALSE, Bool_t useOADBforSecondSplines = kFALSE,
                     TString displayNameSplines1 = "", TString displayNameSplines2 = "")
{ 
  if (period2.IsNull())
    period2 = period;
  
  if (dataType2.IsNull())
    dataType2 = dataType1;
  
  if (beamType2.IsNull())
    beamType2 = beamType1;
  
  if (displayNameSplines1.IsNull())
    displayNameSplines1 = "Spline 1";
  
  if (displayNameSplines2.IsNull())
    displayNameSplines2 = "Spline 2";
  
  TFile* f1 = 0x0;
  f1 = TFile::Open(pathNameSplines1.Data());
  if (!f1)  {
    std::cout << "Failed to open file \"" << pathNameSplines1.Data() << "\"!" << std::endl;
    return -1;
  }
  
  TFile* f2 = 0x0;
  f2 = TFile::Open(pathNameSplines2.Data());
  if (!f2)  {
    std::cout << "Failed to open file \"" << pathNameSplines2.Data() << "\"!" << std::endl;
    return -1;
  }

  TCanvas* c = new TCanvas("c", "",  100,10,1380,800);
  c->SetLogx(kTRUE);
  
  TH2D* hDummy = new TH2D("hDummy", Form("; p_{TPC} (GeV/c); %s / %s", displayNameSplines1.Data(), displayNameSplines2.Data()),
                          1000, 0.15, 60, 1000, 0.9, 1.1);
  hDummy->GetYaxis()->SetLabelSize(0.03);
  hDummy->GetYaxis()->SetTitleSize(0.05);
  hDummy->GetYaxis()->SetTitleOffset(1.);
  hDummy->GetXaxis()->SetNoExponent(kTRUE);
  hDummy->GetXaxis()->SetMoreLogLabels(kTRUE);
  hDummy->GetXaxis()->SetTitleSize(0.05);
  hDummy->GetXaxis()->SetLabelSize(0.04);
  hDummy->GetXaxis()->SetTitleOffset(1.1);
  hDummy->SetStats(kFALSE);
  hDummy->Draw("colz");
  
  const Int_t nPoints = 20000;
  const Float_t stepSize = 0.02;
  const Float_t stepSizeEl = stepSize * 100.;
  const Int_t nPointsEl = nPoints * 10.;
  
  
  
  TSpline3* splPion2 = 0x0;
  TSpline3* splKaon2 = 0x0;
  TSpline3* splElectron2 = 0x0;
  TSpline3* splProton2 = 0x0;
  
  
  TObjArray* arr = 0x0;
  TObjArray* arr2 = 0x0;
  
  if (useOADBforFirstSplines) {
    arr = (TObjArray*)f1->Get("TPCPIDResponse");
    
    if (!arr)  {
      std::cout << "Failed to load first array \"TPCPIDResponse\"!" << std::endl;
      return -1;
    }
  }
  
  if (useOADBforSecondSplines) {
    arr2 = (TObjArray*)f2->Get("TPCPIDResponse");
    
    if (!arr2)  {
      std::cout << "Failed to second array \"TPCPIDResponse\"!" << std::endl;
      return -1;
    }
  }
  
  TSpline3* splPion = loadSplines(f1, arr, Form("TSPLINE3_%s_PION_%s_%s_MEAN", dataType1.Data(), period.Data(), beamType1.Data()), useOADBforFirstSplines);
  splPion2 = loadSplines(f2, arr2, Form("TSPLINE3_%s_PION_%s_%s_MEAN", dataType2.Data(), period2.Data(), beamType2.Data()), useOADBforSecondSplines);
  TGraph* gPion = new TGraph(nPoints);
  gPion->SetTitle("#pi");
  gPion->SetFillStyle(0);
  gPion->SetFillColor(kWhite);
  for (Int_t i = 0; i < nPoints; i++) {
    gPion->SetPoint(i, (0. + i * stepSize) * 0.1396, (splPion->Eval((0. + i * stepSize)) / splPion2->Eval((0. + i * stepSize))));
  }
  gPion->SetLineColor(kRed);
  gPion->SetMarkerColor(kRed);
  gPion->Draw("same");

  TSpline3* splProton = loadSplines(f1, arr, Form("TSPLINE3_%s_PROTON_%s_%s_MEAN", dataType1.Data(), period.Data(), beamType1.Data()), 
                                    useOADBforFirstSplines);
  splProton2 = loadSplines(f2, arr2, Form("TSPLINE3_%s_PROTON_%s_%s_MEAN", dataType2.Data(), period2.Data(), beamType2.Data()), useOADBforSecondSplines);
  TGraph* gProton = new TGraph(nPoints);
  gProton->SetTitle("p");
  gProton->SetFillStyle(0);
  gProton->SetFillColor(kWhite);
  for (Int_t i = 0; i < nPoints; i++) {
    gProton->SetPoint(i, (0. + i * stepSize) * 0.938, (splProton->Eval((0. + i * stepSize)) / splProton2->Eval((0. + i * stepSize))));
  }
  gProton->SetLineColor(kBlue);
  gProton->SetMarkerColor(kBlue);
  gProton->Draw("same");

  TSpline3* splKaon = loadSplines(f1, arr, Form("TSPLINE3_%s_KAON_%s_%s_MEAN", dataType1.Data(), period.Data(), beamType1.Data()), useOADBforFirstSplines);
  splKaon2 = loadSplines(f2, arr2, Form("TSPLINE3_%s_KAON_%s_%s_MEAN", dataType2.Data(), period2.Data(), beamType2.Data()), useOADBforSecondSplines);
  TGraph* gKaon = new TGraph(nPoints);
  gKaon->SetTitle("K");
  gKaon->SetFillStyle(0);
  gKaon->SetFillColor(kWhite);
  for (Int_t i = 0; i < nPoints; i++) {
    gKaon->SetPoint(i, (0. + i * stepSize) * 0.49368, (splKaon->Eval((0. + i * stepSize)) / splKaon2->Eval((0. + i * stepSize))));
  }
  gKaon->SetLineColor(kGreen);
  gKaon->SetMarkerColor(kGreen);
  gKaon->Draw("same");

  TSpline3* splElectron = loadSplines(f1, arr, Form("TSPLINE3_%s_ELECTRON_%s_%s_MEAN", dataType1.Data(), period.Data(), beamType1.Data()), 
                                      useOADBforFirstSplines);
  splElectron2 = loadSplines(f2, arr2, Form("TSPLINE3_%s_ELECTRON_%s_%s_MEAN", dataType2.Data(), period2.Data(), beamType2.Data()),
                             useOADBforSecondSplines);
  TGraph* gElectron = new TGraph(nPoints);
  gElectron->SetTitle("e");
  gElectron->SetFillStyle(0);
  gElectron->SetFillColor(kWhite);
  for (Int_t i = 0; i < nPointsEl; i++) {
    gElectron->SetPoint(i, (0. + i * stepSizeEl) * 0.000511, 
                        (splElectron->Eval((0. + i * stepSizeEl)) / splElectron2->Eval((0. + i * stepSizeEl))));
  }
  gElectron->SetLineColor(kMagenta);
  gElectron->SetMarkerColor(kMagenta);
  gElectron->Draw("same");
  
  TLegend* leg = c->BuildLegend();
  leg->GetListOfPrimitives()->RemoveAt(0);
  leg->SetFillColor(kWhite);
  c->SetGridx(kTRUE);
  c->SetGridy(kTRUE);
  
  c->Update();
  
  return 0;
 compareSplines.C:1
 compareSplines.C:2
 compareSplines.C:3
 compareSplines.C:4
 compareSplines.C:5
 compareSplines.C:6
 compareSplines.C:7
 compareSplines.C:8
 compareSplines.C:9
 compareSplines.C:10
 compareSplines.C:11
 compareSplines.C:12
 compareSplines.C:13
 compareSplines.C:14
 compareSplines.C:15
 compareSplines.C:16
 compareSplines.C:17
 compareSplines.C:18
 compareSplines.C:19
 compareSplines.C:20
 compareSplines.C:21
 compareSplines.C:22
 compareSplines.C:23
 compareSplines.C:24
 compareSplines.C:25
 compareSplines.C:26
 compareSplines.C:27
 compareSplines.C:28
 compareSplines.C:29
 compareSplines.C:30
 compareSplines.C:31
 compareSplines.C:32
 compareSplines.C:33
 compareSplines.C:34
 compareSplines.C:35
 compareSplines.C:36
 compareSplines.C:37
 compareSplines.C:38
 compareSplines.C:39
 compareSplines.C:40
 compareSplines.C:41
 compareSplines.C:42
 compareSplines.C:43
 compareSplines.C:44
 compareSplines.C:45
 compareSplines.C:46
 compareSplines.C:47
 compareSplines.C:48
 compareSplines.C:49
 compareSplines.C:50
 compareSplines.C:51
 compareSplines.C:52
 compareSplines.C:53
 compareSplines.C:54
 compareSplines.C:55
 compareSplines.C:56
 compareSplines.C:57
 compareSplines.C:58
 compareSplines.C:59
 compareSplines.C:60
 compareSplines.C:61
 compareSplines.C:62
 compareSplines.C:63
 compareSplines.C:64
 compareSplines.C:65
 compareSplines.C:66
 compareSplines.C:67
 compareSplines.C:68
 compareSplines.C:69
 compareSplines.C:70
 compareSplines.C:71
 compareSplines.C:72
 compareSplines.C:73
 compareSplines.C:74
 compareSplines.C:75
 compareSplines.C:76
 compareSplines.C:77
 compareSplines.C:78
 compareSplines.C:79
 compareSplines.C:80
 compareSplines.C:81
 compareSplines.C:82
 compareSplines.C:83
 compareSplines.C:84
 compareSplines.C:85
 compareSplines.C:86
 compareSplines.C:87
 compareSplines.C:88
 compareSplines.C:89
 compareSplines.C:90
 compareSplines.C:91
 compareSplines.C:92
 compareSplines.C:93
 compareSplines.C:94
 compareSplines.C:95
 compareSplines.C:96
 compareSplines.C:97
 compareSplines.C:98
 compareSplines.C:99
 compareSplines.C:100
 compareSplines.C:101
 compareSplines.C:102
 compareSplines.C:103
 compareSplines.C:104
 compareSplines.C:105
 compareSplines.C:106
 compareSplines.C:107
 compareSplines.C:108
 compareSplines.C:109
 compareSplines.C:110
 compareSplines.C:111
 compareSplines.C:112
 compareSplines.C:113
 compareSplines.C:114
 compareSplines.C:115
 compareSplines.C:116
 compareSplines.C:117
 compareSplines.C:118
 compareSplines.C:119
 compareSplines.C:120
 compareSplines.C:121
 compareSplines.C:122
 compareSplines.C:123
 compareSplines.C:124
 compareSplines.C:125
 compareSplines.C:126
 compareSplines.C:127
 compareSplines.C:128
 compareSplines.C:129
 compareSplines.C:130
 compareSplines.C:131
 compareSplines.C:132
 compareSplines.C:133
 compareSplines.C:134
 compareSplines.C:135
 compareSplines.C:136
 compareSplines.C:137
 compareSplines.C:138
 compareSplines.C:139
 compareSplines.C:140
 compareSplines.C:141
 compareSplines.C:142
 compareSplines.C:143
 compareSplines.C:144
 compareSplines.C:145
 compareSplines.C:146
 compareSplines.C:147
 compareSplines.C:148
 compareSplines.C:149
 compareSplines.C:150
 compareSplines.C:151
 compareSplines.C:152
 compareSplines.C:153
 compareSplines.C:154
 compareSplines.C:155
 compareSplines.C:156
 compareSplines.C:157
 compareSplines.C:158
 compareSplines.C:159
 compareSplines.C:160
 compareSplines.C:161
 compareSplines.C:162
 compareSplines.C:163
 compareSplines.C:164
 compareSplines.C:165
 compareSplines.C:166
 compareSplines.C:167
 compareSplines.C:168
 compareSplines.C:169
 compareSplines.C:170
 compareSplines.C:171
 compareSplines.C:172
 compareSplines.C:173
 compareSplines.C:174
 compareSplines.C:175
 compareSplines.C:176
 compareSplines.C:177
 compareSplines.C:178
 compareSplines.C:179
 compareSplines.C:180
 compareSplines.C:181
 compareSplines.C:182
 compareSplines.C:183
 compareSplines.C:184
 compareSplines.C:185