ROOT logo
#include "TH1D.h"
#include "TCanvas.h"
#include "TStyle.h"
#include "TString.h"
#include "TLegend.h"
#include "TFile.h"
#include "TGraphErrors.h"
#include "TGraphAsymmErrors.h"
#include "TGraph.h"
#include "TMath.h"

#include "AliPID.h"

#include "THnSparseDefinitions.h"

#include <iostream>
#include <iomanip>

const Int_t numSpecies = 5;

//________________________________________________________
TCanvas* DrawFractionHistos(TString canvName, TString canvTitle, Double_t pLow, Double_t pHigh, TGraphAsymmErrors** gr,  TH1F** histRef)
{
  TCanvas* canv = new TCanvas(canvName.Data(), canvTitle.Data(),100,10,1200,800);
  canv->SetGridx(1);
  canv->SetGridy(1);
  canv->SetLogx(1);
  
  for (Int_t i = 0; i < numSpecies; i++) {
    histRef[i]->GetYaxis()->SetRangeUser(0.0, 1.0);
    histRef[i]->GetYaxis()->SetTitle(canvTitle.Data());
    histRef[i]->GetXaxis()->SetRangeUser(pLow, pHigh);
    //histRef[i]->SetFillStyle(3004 + i);
    //histRef[i]->SetFillColor(kGray);
    histRef[i]->SetFillStyle(0);
    histRef[i]->SetFillColor(histRef[i]->GetMarkerColor());
    histRef[i]->SetLineColor(histRef[i]->GetMarkerColor());
  }
  histRef[2]->SetMarkerStyle(20);
  histRef[2]->Draw("e p");
  histRef[0]->SetMarkerStyle(21);
  histRef[0]->Draw("e p same");
  histRef[1]->SetMarkerStyle(22);
  histRef[1]->Draw("e p same");
  histRef[3]->SetMarkerStyle(29);
  histRef[3]->Draw("e p same");
  histRef[4]->SetMarkerStyle(30);
  histRef[4]->Draw("e p same");
  
  gr[0]->GetHistogram()->GetXaxis()->SetRangeUser(pLow, pHigh);
  gr[0]->GetHistogram()->GetYaxis()->SetRangeUser(0., 1.0);
  gr[0]->Draw("2 same");
  gr[1]->Draw("2 same");
  gr[2]->Draw("2 same");
  gr[3]->Draw("2 same");
  gr[4]->Draw("2 same");
  
  TLegend* legend = new TLegend(0.622126, 0.605932, 0.862069, 0.855932);    
  legend->SetBorderSize(0);
  legend->SetFillColor(0);
  legend->AddEntry(histRef[2], "#pi", "flp");
  legend->AddEntry(histRef[0], "e", "flp");
  legend->AddEntry(histRef[1], "K", "flp");
  legend->AddEntry(histRef[3], "p", "flp");
  legend->AddEntry(histRef[4], "#mu", "flp");
  legend->Draw();
  
  ClearTitleFromHistoInCanvas(canv);
  
  return canv;
}


//________________________________________________________
TGraphAsymmErrors* loadGraph(const TString graphName, TFile* f)
{
  if (!f) {
    std::cout << "No file. Cannot load graph \"" << graphName.Data() << "\n!" << std::endl;
    return 0x0;
  }
  
  TGraphAsymmErrors* grTemp = dynamic_cast<TGraphAsymmErrors*>(f->Get(graphName.Data()));
  if (!grTemp) {
    std::cout << "Failed to load histo \"" << graphName.Data() << "\"!" << std::endl;
    return 0x0;
  } 
  
  return grTemp;
}


//________________________________________________________
TH1F* loadHisto(const TString histName, TFile* f)
{
  if (!f) {
    std::cout << "No file. Cannot load hist \"" << histName.Data() << "\n!" << std::endl;
    return 0x0;
  }
  
  TH1F* hTemp = dynamic_cast<TH1F*>(f->Get(histName.Data()));
  if (!hTemp) {
    std::cout << "Failed to load histo \"" << histName.Data() << "\"!" << std::endl;
    return 0x0;
  } 
  
  return hTemp;
}


//________________________________________________________
Int_t AddUpSystematicErrors(const TString path, const TString outFileTitle, const TString* fileNames, const Int_t numFiles,
                            const TString fileNameReference) 
{ 
  if (!fileNames || numFiles < 1)
    return -1;
  
  TFile* f[numFiles];
  TGraphAsymmErrors** grSysError[numSpecies];
  TString grNames[numSpecies] = {"systematicError_electron", "systematicError_kaon", "systematicError_pion", "systematicError_proton",
                                 "systematicError_muon" };
  
  const TString histNames[numSpecies] = {"hFractionElectrons", "hFractionKaons", "hFractionPions", "hFractionProtons", "hFractionMuons" };
  
  
  TGraphAsymmErrors** grSysErrorYields[numSpecies];
  TString grNamesYields[numSpecies] = {"systematicErrorYields_electron", "systematicErrorYields_kaon", "systematicErrorYields_pion",
                                       "systematicErrorYields_proton", "systematicErrorYields_muon" };
                                 
  const TString histNamesYields[numSpecies] = {"hYieldElectrons", "hYieldKaons", "hYieldPions", "hYieldProtons", "hYieldMuons" };
  
  for (Int_t i = 0; i < numSpecies; i++) {
    grSysError[i] = new TGraphAsymmErrors*[numFiles];
    grSysErrorYields[i] = new TGraphAsymmErrors*[numFiles];
  }
    
  for (Int_t iFile = 0; iFile < numFiles; iFile++) {
    f[iFile] = TFile::Open(fileNames[iFile].Data());
    if (!f[iFile])  {
      std::cout << "Failed to open file \"" << fileNames[iFile].Data() << "\"!" << std::endl;
      return -1;
    }
        
    // Extract the data graphs
    for (Int_t i = 0; i < numSpecies; i++) {
      grSysError[i][iFile] = loadGraph(grNames[i], f[iFile]);
      if (!grSysError[i][iFile])
        return -1;
      
      grSysError[i][iFile]->SetName(Form("%s_fileID%d", grSysError[i][iFile]->GetName(), iFile));
      
      
      grSysErrorYields[i][iFile] = loadGraph(grNamesYields[i], f[iFile]);
      if (!grSysErrorYields[i][iFile])
        return -1;
      
      grSysErrorYields[i][iFile]->SetName(Form("%s_fileID%d", grSysErrorYields[i][iFile]->GetName(), iFile));
    }
  }
  
  // Load data points with statistical errors
  TFile* fReferenceData = TFile::Open(fileNameReference.Data());
  if (!fReferenceData) {
    std::cout << "Failed to open file \"" << fileNameReference.Data() << "\"!" << std::endl;
    return -1;
  }
    
  TH1F* hReferenceFractions[numSpecies];
  TH1F* hReferenceYields[numSpecies];
  
  for (Int_t i = 0; i < numSpecies; i++) {
    hReferenceFractions[i] = loadHisto(histNames[i], fReferenceData);
    if (!hReferenceFractions[i])
      return -1;
    
    hReferenceYields[i] = loadHisto(histNamesYields[i], fReferenceData);
    if (!hReferenceYields[i])
      return -1;
  }
  
  const Int_t reference = 0;
  
  // The x,y coordinates should be those of the reference graph. Then, all corresponding sys. errors are added in quadrature.
  TGraphAsymmErrors* grTotSysError[numSpecies];
  TGraphAsymmErrors* grTotSysErrorYields[numSpecies];
  Double_t sysErrorTotalSquared = 0;
  Double_t temp = 0;
  
  for (Int_t i = 0; i < numSpecies; i++) {
    grTotSysError[i] = new TGraphAsymmErrors(*grSysError[i][reference]);
    grTotSysError[i]->SetName(grNames[i]);
    
    for (Int_t iPoint = 0; iPoint < grTotSysError[i]->GetN(); iPoint++) {
      sysErrorTotalSquared = 0;
      for (Int_t iFile = 0; iFile < numFiles; iFile++) {
        // Already averages high and low value -> Since they are by now the same, this is ok.
        temp = grSysError[i][iFile]->GetErrorY(iPoint); 
        if (temp > 0) {
          sysErrorTotalSquared += temp * temp;
        }
      }
      
      grTotSysError[i]->SetPointEYlow(iPoint, TMath::Sqrt(sysErrorTotalSquared));
      grTotSysError[i]->SetPointEYhigh(iPoint, TMath::Sqrt(sysErrorTotalSquared));
    }
    
    // Same for the yields
    grTotSysErrorYields[i] = new TGraphAsymmErrors(*grSysErrorYields[i][reference]);
    grTotSysErrorYields[i]->SetName(grNamesYields[i]);
    
    for (Int_t iPoint = 0; iPoint < grTotSysErrorYields[i]->GetN(); iPoint++) {
      sysErrorTotalSquared = 0;
      for (Int_t iFile = 0; iFile < numFiles; iFile++) {
        // Already averages high and low value -> Since they are by now the same, this is ok.
        temp = grSysErrorYields[i][iFile]->GetErrorY(iPoint); 
        if (temp > 0) {
          sysErrorTotalSquared += temp * temp;
        }
      }
      
      grTotSysErrorYields[i]->SetPointEYlow(iPoint, TMath::Sqrt(sysErrorTotalSquared));
      grTotSysErrorYields[i]->SetPointEYhigh(iPoint, TMath::Sqrt(sysErrorTotalSquared));
    }
  }
  
  const Double_t pLow = 0.15;
  const Double_t pHigh = 50.;
  TCanvas* cFractionsWithTotalSystematicError = DrawFractionHistos("cFractionsWithTotalSystematicError", "Particle fractions", pLow, pHigh,
                                                                   grTotSysError, hReferenceFractions);
  
    
  // Output file
  TFile* fSave = 0x0;
  TDatime daTime;
  TString saveFileName;
    
  saveFileName = Form("outputSystematicsTotal_%s__%04d_%02d_%02d.root", outFileTitle.Data(), daTime.GetYear(),
                      daTime.GetMonth(), daTime.GetDay());
    
  fSave = TFile::Open(Form("%s/%s", path.Data(), saveFileName.Data()), "recreate");
  if (!fSave) {
    std::cout << "Failed to open save file \"" << Form("%s/%s", path.Data(), saveFileName.Data()) << "\"!" << std::endl;
    return -1;
  }
  
  // Save final results
  fSave->cd();
  
  if (cFractionsWithTotalSystematicError)
      cFractionsWithTotalSystematicError->Write();
    
    for (Int_t i = 0; i < numSpecies; i++) {
      if (grTotSysError[i])
        grTotSysError[i]->Write();
      if (hReferenceFractions[i])
        hReferenceFractions[i]->Write();
      
      if (grTotSysErrorYields[i])
        grTotSysErrorYields[i]->Write();
      if (hReferenceYields[i])
        hReferenceYields[i]->Write();
  }
  
  // Save list of file names in output file
  TString listOfFileNames = "";
  for (Int_t i = 0; i < numFiles; i++) {
    listOfFileNames.Append(Form("%s%d: %s", i == 0 ? "" : ", ", i, fileNames[i].Data()));
  }
  
  TNamed* settings = new TNamed(Form("Used files for systematics: %s\n", listOfFileNames.Data()),
                                Form("Used files for systematics: %s\n", listOfFileNames.Data()));
  settings->Write();
  
  delete cFractionsWithTotalSystematicError;
    
  fSave->Close();
     
  return 0;
}
 AddUpSystematicErrors.C:1
 AddUpSystematicErrors.C:2
 AddUpSystematicErrors.C:3
 AddUpSystematicErrors.C:4
 AddUpSystematicErrors.C:5
 AddUpSystematicErrors.C:6
 AddUpSystematicErrors.C:7
 AddUpSystematicErrors.C:8
 AddUpSystematicErrors.C:9
 AddUpSystematicErrors.C:10
 AddUpSystematicErrors.C:11
 AddUpSystematicErrors.C:12
 AddUpSystematicErrors.C:13
 AddUpSystematicErrors.C:14
 AddUpSystematicErrors.C:15
 AddUpSystematicErrors.C:16
 AddUpSystematicErrors.C:17
 AddUpSystematicErrors.C:18
 AddUpSystematicErrors.C:19
 AddUpSystematicErrors.C:20
 AddUpSystematicErrors.C:21
 AddUpSystematicErrors.C:22
 AddUpSystematicErrors.C:23
 AddUpSystematicErrors.C:24
 AddUpSystematicErrors.C:25
 AddUpSystematicErrors.C:26
 AddUpSystematicErrors.C:27
 AddUpSystematicErrors.C:28
 AddUpSystematicErrors.C:29
 AddUpSystematicErrors.C:30
 AddUpSystematicErrors.C:31
 AddUpSystematicErrors.C:32
 AddUpSystematicErrors.C:33
 AddUpSystematicErrors.C:34
 AddUpSystematicErrors.C:35
 AddUpSystematicErrors.C:36
 AddUpSystematicErrors.C:37
 AddUpSystematicErrors.C:38
 AddUpSystematicErrors.C:39
 AddUpSystematicErrors.C:40
 AddUpSystematicErrors.C:41
 AddUpSystematicErrors.C:42
 AddUpSystematicErrors.C:43
 AddUpSystematicErrors.C:44
 AddUpSystematicErrors.C:45
 AddUpSystematicErrors.C:46
 AddUpSystematicErrors.C:47
 AddUpSystematicErrors.C:48
 AddUpSystematicErrors.C:49
 AddUpSystematicErrors.C:50
 AddUpSystematicErrors.C:51
 AddUpSystematicErrors.C:52
 AddUpSystematicErrors.C:53
 AddUpSystematicErrors.C:54
 AddUpSystematicErrors.C:55
 AddUpSystematicErrors.C:56
 AddUpSystematicErrors.C:57
 AddUpSystematicErrors.C:58
 AddUpSystematicErrors.C:59
 AddUpSystematicErrors.C:60
 AddUpSystematicErrors.C:61
 AddUpSystematicErrors.C:62
 AddUpSystematicErrors.C:63
 AddUpSystematicErrors.C:64
 AddUpSystematicErrors.C:65
 AddUpSystematicErrors.C:66
 AddUpSystematicErrors.C:67
 AddUpSystematicErrors.C:68
 AddUpSystematicErrors.C:69
 AddUpSystematicErrors.C:70
 AddUpSystematicErrors.C:71
 AddUpSystematicErrors.C:72
 AddUpSystematicErrors.C:73
 AddUpSystematicErrors.C:74
 AddUpSystematicErrors.C:75
 AddUpSystematicErrors.C:76
 AddUpSystematicErrors.C:77
 AddUpSystematicErrors.C:78
 AddUpSystematicErrors.C:79
 AddUpSystematicErrors.C:80
 AddUpSystematicErrors.C:81
 AddUpSystematicErrors.C:82
 AddUpSystematicErrors.C:83
 AddUpSystematicErrors.C:84
 AddUpSystematicErrors.C:85
 AddUpSystematicErrors.C:86
 AddUpSystematicErrors.C:87
 AddUpSystematicErrors.C:88
 AddUpSystematicErrors.C:89
 AddUpSystematicErrors.C:90
 AddUpSystematicErrors.C:91
 AddUpSystematicErrors.C:92
 AddUpSystematicErrors.C:93
 AddUpSystematicErrors.C:94
 AddUpSystematicErrors.C:95
 AddUpSystematicErrors.C:96
 AddUpSystematicErrors.C:97
 AddUpSystematicErrors.C:98
 AddUpSystematicErrors.C:99
 AddUpSystematicErrors.C:100
 AddUpSystematicErrors.C:101
 AddUpSystematicErrors.C:102
 AddUpSystematicErrors.C:103
 AddUpSystematicErrors.C:104
 AddUpSystematicErrors.C:105
 AddUpSystematicErrors.C:106
 AddUpSystematicErrors.C:107
 AddUpSystematicErrors.C:108
 AddUpSystematicErrors.C:109
 AddUpSystematicErrors.C:110
 AddUpSystematicErrors.C:111
 AddUpSystematicErrors.C:112
 AddUpSystematicErrors.C:113
 AddUpSystematicErrors.C:114
 AddUpSystematicErrors.C:115
 AddUpSystematicErrors.C:116
 AddUpSystematicErrors.C:117
 AddUpSystematicErrors.C:118
 AddUpSystematicErrors.C:119
 AddUpSystematicErrors.C:120
 AddUpSystematicErrors.C:121
 AddUpSystematicErrors.C:122
 AddUpSystematicErrors.C:123
 AddUpSystematicErrors.C:124
 AddUpSystematicErrors.C:125
 AddUpSystematicErrors.C:126
 AddUpSystematicErrors.C:127
 AddUpSystematicErrors.C:128
 AddUpSystematicErrors.C:129
 AddUpSystematicErrors.C:130
 AddUpSystematicErrors.C:131
 AddUpSystematicErrors.C:132
 AddUpSystematicErrors.C:133
 AddUpSystematicErrors.C:134
 AddUpSystematicErrors.C:135
 AddUpSystematicErrors.C:136
 AddUpSystematicErrors.C:137
 AddUpSystematicErrors.C:138
 AddUpSystematicErrors.C:139
 AddUpSystematicErrors.C:140
 AddUpSystematicErrors.C:141
 AddUpSystematicErrors.C:142
 AddUpSystematicErrors.C:143
 AddUpSystematicErrors.C:144
 AddUpSystematicErrors.C:145
 AddUpSystematicErrors.C:146
 AddUpSystematicErrors.C:147
 AddUpSystematicErrors.C:148
 AddUpSystematicErrors.C:149
 AddUpSystematicErrors.C:150
 AddUpSystematicErrors.C:151
 AddUpSystematicErrors.C:152
 AddUpSystematicErrors.C:153
 AddUpSystematicErrors.C:154
 AddUpSystematicErrors.C:155
 AddUpSystematicErrors.C:156
 AddUpSystematicErrors.C:157
 AddUpSystematicErrors.C:158
 AddUpSystematicErrors.C:159
 AddUpSystematicErrors.C:160
 AddUpSystematicErrors.C:161
 AddUpSystematicErrors.C:162
 AddUpSystematicErrors.C:163
 AddUpSystematicErrors.C:164
 AddUpSystematicErrors.C:165
 AddUpSystematicErrors.C:166
 AddUpSystematicErrors.C:167
 AddUpSystematicErrors.C:168
 AddUpSystematicErrors.C:169
 AddUpSystematicErrors.C:170
 AddUpSystematicErrors.C:171
 AddUpSystematicErrors.C:172
 AddUpSystematicErrors.C:173
 AddUpSystematicErrors.C:174
 AddUpSystematicErrors.C:175
 AddUpSystematicErrors.C:176
 AddUpSystematicErrors.C:177
 AddUpSystematicErrors.C:178
 AddUpSystematicErrors.C:179
 AddUpSystematicErrors.C:180
 AddUpSystematicErrors.C:181
 AddUpSystematicErrors.C:182
 AddUpSystematicErrors.C:183
 AddUpSystematicErrors.C:184
 AddUpSystematicErrors.C:185
 AddUpSystematicErrors.C:186
 AddUpSystematicErrors.C:187
 AddUpSystematicErrors.C:188
 AddUpSystematicErrors.C:189
 AddUpSystematicErrors.C:190
 AddUpSystematicErrors.C:191
 AddUpSystematicErrors.C:192
 AddUpSystematicErrors.C:193
 AddUpSystematicErrors.C:194
 AddUpSystematicErrors.C:195
 AddUpSystematicErrors.C:196
 AddUpSystematicErrors.C:197
 AddUpSystematicErrors.C:198
 AddUpSystematicErrors.C:199
 AddUpSystematicErrors.C:200
 AddUpSystematicErrors.C:201
 AddUpSystematicErrors.C:202
 AddUpSystematicErrors.C:203
 AddUpSystematicErrors.C:204
 AddUpSystematicErrors.C:205
 AddUpSystematicErrors.C:206
 AddUpSystematicErrors.C:207
 AddUpSystematicErrors.C:208
 AddUpSystematicErrors.C:209
 AddUpSystematicErrors.C:210
 AddUpSystematicErrors.C:211
 AddUpSystematicErrors.C:212
 AddUpSystematicErrors.C:213
 AddUpSystematicErrors.C:214
 AddUpSystematicErrors.C:215
 AddUpSystematicErrors.C:216
 AddUpSystematicErrors.C:217
 AddUpSystematicErrors.C:218
 AddUpSystematicErrors.C:219
 AddUpSystematicErrors.C:220
 AddUpSystematicErrors.C:221
 AddUpSystematicErrors.C:222
 AddUpSystematicErrors.C:223
 AddUpSystematicErrors.C:224
 AddUpSystematicErrors.C:225
 AddUpSystematicErrors.C:226
 AddUpSystematicErrors.C:227
 AddUpSystematicErrors.C:228
 AddUpSystematicErrors.C:229
 AddUpSystematicErrors.C:230
 AddUpSystematicErrors.C:231
 AddUpSystematicErrors.C:232
 AddUpSystematicErrors.C:233
 AddUpSystematicErrors.C:234
 AddUpSystematicErrors.C:235
 AddUpSystematicErrors.C:236
 AddUpSystematicErrors.C:237
 AddUpSystematicErrors.C:238
 AddUpSystematicErrors.C:239
 AddUpSystematicErrors.C:240
 AddUpSystematicErrors.C:241
 AddUpSystematicErrors.C:242
 AddUpSystematicErrors.C:243
 AddUpSystematicErrors.C:244
 AddUpSystematicErrors.C:245
 AddUpSystematicErrors.C:246
 AddUpSystematicErrors.C:247
 AddUpSystematicErrors.C:248
 AddUpSystematicErrors.C:249
 AddUpSystematicErrors.C:250
 AddUpSystematicErrors.C:251
 AddUpSystematicErrors.C:252
 AddUpSystematicErrors.C:253
 AddUpSystematicErrors.C:254
 AddUpSystematicErrors.C:255
 AddUpSystematicErrors.C:256
 AddUpSystematicErrors.C:257
 AddUpSystematicErrors.C:258
 AddUpSystematicErrors.C:259
 AddUpSystematicErrors.C:260
 AddUpSystematicErrors.C:261
 AddUpSystematicErrors.C:262
 AddUpSystematicErrors.C:263
 AddUpSystematicErrors.C:264
 AddUpSystematicErrors.C:265
 AddUpSystematicErrors.C:266
 AddUpSystematicErrors.C:267
 AddUpSystematicErrors.C:268
 AddUpSystematicErrors.C:269
 AddUpSystematicErrors.C:270
 AddUpSystematicErrors.C:271
 AddUpSystematicErrors.C:272
 AddUpSystematicErrors.C:273
 AddUpSystematicErrors.C:274
 AddUpSystematicErrors.C:275
 AddUpSystematicErrors.C:276
 AddUpSystematicErrors.C:277
 AddUpSystematicErrors.C:278
 AddUpSystematicErrors.C:279