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

#include "AliPID.h"

#include <iostream>
#include <iomanip>

#include "SystematicErrorUtils.h"

const Int_t numSpecies = 5;

//________________________________________________________
TCanvas* calculateSystematics(TString canvName, TString canvTitle, TH1F** histos, Int_t numHistos, Int_t speciesID, Double_t /*nSigma*/,
                              const TString* systematicsHistosName, Int_t reference, TH1F** hSystematics, TGraphAsymmErrors** gr,
                              Bool_t ignoreSigmaErrors)
{
  // For every bin:
  // Since the method with the root finding already takes into account the statistical error,
  // there is no need to use nSigma > 0.
  // If the statistical error is ignored, nevertheless don't use nSigma > 0 because this might
  // give zero systematic error for high pT, which is usually not accepted by people, although
  // the natural point of view "no systematic visible for given statistical error" is reasonable to me.
  
  Double_t ymax = 0;
  Double_t ymin = 0;
  
  
  // Just for drawing
  for (Int_t j = 0; j < numHistos; j++) {
    hSystematics[j] = new TH1F(*histos[j]);
    hSystematics[j]->SetName(Form("%s_%s", systematicsHistosName[j].Data(), AliPID::ParticleName(speciesID)));
    hSystematics[j]->Reset(); 
    hSystematics[j]->GetXaxis()->SetRange(0, -1);
    
    for (Int_t bin = 1; bin <= histos[j]->GetNbinsX(); bin++) {
      hSystematics[j]->SetBinContent(bin, histos[reference]->GetBinContent(bin) - histos[j]->GetBinContent(bin));
      hSystematics[j]->SetBinError(bin, TMath::Sqrt(TMath::Abs(TMath::Power(histos[reference]->GetBinError(bin), 2) - 
                                                               TMath::Power(histos[j]->GetBinError(bin), 2))));
  
      if (hSystematics[j]->GetBinError(bin) == 0)
        hSystematics[j]->SetBinError(bin, 1e-10);
      Double_t temp = hSystematics[j]->GetBinContent(bin) + hSystematics[j]->GetBinError(bin);
      if (temp > ymax)
        ymax = temp;
        
      temp = hSystematics[j]->GetBinContent(bin) - hSystematics[j]->GetBinError(bin);
      if (temp < ymin)
        ymin = temp;
    }
  }
  
  TCanvas* canv = new TCanvas(canvName.Data(), canvTitle.Data(),100,10,1200,800);
  canv->SetGridy(1);
  
  hSystematics[reference]->Draw("e p");
  hSystematics[reference]->GetYaxis()->SetRangeUser(ymin, ymax);
  for (Int_t j = 0; j < numHistos; j++) {
    if (j == reference)
      continue;
  
    hSystematics[j]->SetMarkerStyle(20 + j);
    hSystematics[j]->Draw("e p same");
  }
  
  TLegend* legend = new TLegend(0.622126, 0.605932, 0.862069, 0.855932);    
  legend->SetBorderSize(0);
  legend->SetFillColor(0);
  
  for (Int_t j = 0; j < numHistos; j++) {
    legend->AddEntry(hSystematics[j], Form("%s", systematicsHistosName[j].Data()), "p");
  }
  legend->Draw();
             
             
  const Int_t nBins = histos[reference]->GetNbinsX();
  Double_t x[nBins];
  Double_t y[nBins];
  Double_t xerr[nBins];
  Double_t yerrl[nBins];
  Double_t yerrh[nBins];
  
  Double_t meansForFit[numHistos];
  Double_t sigmasForFit[numHistos];
  
  for (Int_t bin = 0; bin < nBins; bin++) {
    x[bin] = histos[reference]->GetBinCenter(bin + 1);
    xerr[bin] = histos[reference]->GetBinWidth(bin + 1) / 2.;
    y[bin] = histos[reference]->GetBinContent(bin + 1);
    
    for (Int_t j = 0; j < numHistos; j++) {
      meansForFit[j] = histos[j]->GetBinContent(bin + 1);
      sigmasForFit[j] = histos[j]->GetBinError(bin + 1);
    }
  
    yerrl[bin] = yerrh[bin] = findSystematicError(numHistos, meansForFit, sigmasForFit, ignoreSigmaErrors);
  }
  
  TGraphAsymmErrors* gTemp = new TGraphAsymmErrors(nBins, x, y, xerr, xerr, yerrl, yerrh);
  *gr = gTemp;
  (*gr)->SetName(Form("systematicError_%s", AliPID::ParticleName(speciesID)));
  (*gr)->SetLineColor(hSystematics[0]->GetMarkerColor());
  //(*gr)->SetFillColor(kGray);
  (*gr)->SetFillStyle(0);//3004 + reference);
  
  return canv;
}


/*OLD
//________________________________________________________
TCanvas* calculateSystematics(TString canvName, TString canvTitle, TH1F** histos, Int_t numHistos, Int_t speciesID, Double_t nSigma,
                              const TString* systematicsHistosName, Int_t reference, TH1F** hSystematics, TGraphAsymmErrors** gr)
{
  Double_t ymax = 0;
  Double_t ymin = 0;
  
  for (Int_t j = 0; j < numHistos; j++) {
    hSystematics[j] = new TH1F(*histos[j]);
    hSystematics[j]->SetName(Form("%s_%s", systematicsHistosName[j].Data(), AliPID::ParticleName(speciesID)));
    hSystematics[j]->Reset(); 
    hSystematics[j]->GetXaxis()->SetRange(0, -1);
    
    for (Int_t bin = 1; bin <= histos[j]->GetNbinsX(); bin++) {
      hSystematics[j]->SetBinContent(bin, histos[reference]->GetBinContent(bin) - histos[j]->GetBinContent(bin));
      hSystematics[j]->SetBinError(bin, TMath::Sqrt(TMath::Abs(TMath::Power(histos[reference]->GetBinError(bin), 2) - 
                                                               TMath::Power(histos[j]->GetBinError(bin), 2))));
  
      if (hSystematics[j]->GetBinError(bin) == 0)
        hSystematics[j]->SetBinError(bin, 1e-10);
      Double_t temp = hSystematics[j]->GetBinContent(bin) + hSystematics[j]->GetBinError(bin);
      if (temp > ymax)
        ymax = temp;
        
      temp = hSystematics[j]->GetBinContent(bin) - hSystematics[j]->GetBinError(bin);
      if (temp < ymin)
        ymin = temp;
    }
  }
  
  TCanvas* canv = new TCanvas(canvName.Data(), canvTitle.Data(),100,10,1200,800);
  canv->SetGridy(1);
  
  hSystematics[reference]->Draw("e p");
  hSystematics[reference]->GetYaxis()->SetRangeUser(ymin, ymax);
  for (Int_t j = 0; j < numHistos; j++) {
    if (j == reference)
      continue;
  
    hSystematics[j]->SetMarkerStyle(20 + j);
    hSystematics[j]->Draw("e p same");
  }
  
  TLegend* legend = new TLegend(0.622126, 0.605932, 0.862069, 0.855932);    
  legend->SetBorderSize(0);
  legend->SetFillColor(0);
  
  for (Int_t j = 0; j < numHistos; j++) {
    legend->AddEntry(hSystematics[j], Form("%s", systematicsHistosName[j].Data()), "p");
  }
  legend->Draw();
			       
			       
  const Int_t nBins = histos[reference]->GetNbinsX();
  Double_t x[nBins];
  Double_t y[nBins];
  Double_t xerr[nBins];
  Double_t yerrl[nBins];
  Double_t yerrh[nBins];
  
  for (Int_t bin = 0; bin < nBins; bin++) {
    x[bin] = histos[reference]->GetBinCenter(bin + 1);
    xerr[bin] = histos[reference]->GetBinWidth(bin + 1) / 2.;
    y[bin] = histos[reference]->GetBinContent(bin + 1);
    
    // Take all points that are more than nSigma sigma away from 0.
    // If there are at least 2 such points, take the difference between
    // the extreme values (i.e. maximum and minimum) as a measure of
    // the systematics
    Int_t count = 0;
    Double_t deltaMin = 0;
    Double_t deltaMax = 0;
    
    for (Int_t j = 0; j < numHistos; j++) {
      if (hSystematics[j]->GetBinError(bin + 1) == 0) // Per definition always true for reference histo
        continue;
        
      Double_t delta = hSystematics[j]->GetBinContent(bin + 1);
      if (TMath::Abs(delta / hSystematics[j]->GetBinError(bin + 1)) > nSigma)  {
        //if (count == 0) {
        //  deltaMin = delta;
        //  deltaMax = delta;
        //}
        //else {
          if (delta < deltaMin)
            deltaMin = delta;
          if (delta > deltaMax)
            deltaMax = delta;
        //}
        count++;
      }
    }
    
    //if (deltaMax > 0.) 
    //  yerrh[bin] = deltaMax;
    //else
    //  yerrh[bin] = 0.;
    //  
    //if (deltaMin < 0.)
    //  yerrl[bin] = -deltaMin;
    //else
    //  yerrl[bin] = 0.;
    
    if (count < 1) // Reference histo is not counted. One can only do systematics if there is at least one other histogram
      yerrl[bin] = yerrh[bin] = 0.;
    else
      yerrl[bin] = yerrh[bin] = (deltaMax - deltaMin) / TMath::Sqrt(2);
    
  }
  
  TGraphAsymmErrors* gTemp = new TGraphAsymmErrors(nBins, x, y, xerr, xerr, yerrl, yerrh);
  *gr = gTemp;
  (*gr)->SetName(Form("systematicError_%s", AliPID::ParticleName(speciesID)));
  (*gr)->SetLineColor(hSystematics[0]->GetMarkerColor());
  //(*gr)->SetFillColor(kGray);
  (*gr)->SetFillStyle(0);//3004 + reference);
  
  return canv;
}*/


//________________________________________________________
TCanvas* DrawFractionHistos(TString canvName, TString canvTitle, Double_t pLow, Double_t pHigh, TH1F*** hist, Int_t reference,
                            TGraphAsymmErrors** gr)
{
  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++) {
    hist[i][reference]->GetYaxis()->SetRangeUser(0.0, 1.0);
    hist[i][reference]->GetYaxis()->SetTitle(canvTitle.Data());
    hist[i][reference]->GetXaxis()->SetRangeUser(pLow, pHigh);
    //hist[i][reference]->SetFillStyle(3004 + i);
    //hist[i][reference]->SetFillColor(kGray);
    hist[i][reference]->SetFillStyle(0);
    hist[i][reference]->SetFillColor(hist[i][reference]->GetMarkerColor());
    hist[i][reference]->SetLineColor(hist[i][reference]->GetMarkerColor());
  }
  hist[2][reference]->SetMarkerStyle(20);
  hist[2][reference]->Draw("e p");
  hist[0][reference]->SetMarkerStyle(21);
  hist[0][reference]->Draw("e p same");
  hist[1][reference]->SetMarkerStyle(22);
  hist[1][reference]->Draw("e p same");
  hist[3][reference]->SetMarkerStyle(29);
  hist[3][reference]->Draw("e p same");
  hist[4][reference]->SetMarkerStyle(30);
  hist[4][reference]->Draw("e p same");
  
  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(hist[2][reference], "#pi", "flp");
  legend->AddEntry(hist[0][reference], "e", "flp");
  legend->AddEntry(hist[1][reference], "K", "flp");
  legend->AddEntry(hist[3][reference], "p", "flp");
  legend->AddEntry(hist[4][reference], "#mu", "flp");
  legend->Draw();
  
  return canv;
}


//________________________________________________________
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 SystematicErrorEstimation(const TString path, const TString outFileTitle, const TString* fileNames, const TString* histTitles,
                                const Int_t numFiles, const Double_t nSigma, const Bool_t ignoreSigmaErrors) 
{ 
  if (!fileNames || numFiles < 1)
    return -1;
  
  TFile* f[numFiles];
  TH1F** hFractions[numSpecies];
  for (Int_t i = 0; i < numSpecies; i++) 
    hFractions[i] = new TH1F*[numFiles];
  
  const Int_t reference = 0;
  TH1F* hYields[numSpecies]; // Only the reference yields
  
  const TString histNames[numSpecies] = {"hFractionElectrons", "hFractionKaons", "hFractionPions", "hFractionProtons", "hFractionMuons" };
  
  const TString histNamesYields[numSpecies] = {"hYieldElectrons", "hYieldKaons", "hYieldPions", "hYieldProtons", "hYieldMuons" };
    
  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 histograms
    for (Int_t i = 0; i < numSpecies; i++) {
      hFractions[i][iFile] = loadHisto(histNames[i], f[iFile]);
      if (!hFractions[i][iFile])
        return -1;
      
      if (iFile == reference) {
        hYields[i] = loadHisto(histNamesYields[i], f[iFile]);
        if (!hYields[i])
          return -1;
      }
    }
  }
    
  
  TGraphAsymmErrors* grSysErrors[numSpecies] = {0x0,};
  TGraphAsymmErrors* grSysErrorsYields[numSpecies] = {0x0,};
  
  TH1F* hSystematicsPions[numFiles];
  TCanvas* cSystematicsPions = calculateSystematics("cSystematicsPions", "Systematics Pions", hFractions[2], numFiles,
                                                    AliPID::kPion, nSigma,
                                                    histTitles, reference, hSystematicsPions, &grSysErrors[2], ignoreSigmaErrors);

  TH1F* hSystematicsElectrons[numFiles];
  TCanvas* cSystematicsElectrons = calculateSystematics("cSystematicsElectrons", "Systematics Electrons", hFractions[0], numFiles,
                                                        AliPID::kElectron,
                                                        nSigma, histTitles, reference, hSystematicsElectrons,
                                                        &grSysErrors[0], ignoreSigmaErrors);
  
  TH1F* hSystematicsKaons[numFiles];
  TCanvas* cSystematicsKaons = calculateSystematics("cSystematicsKaons", "Systematics Kaons", hFractions[1], numFiles, AliPID::kKaon, nSigma,
                                                    histTitles, reference, hSystematicsKaons, &grSysErrors[1], ignoreSigmaErrors);
  
  TH1F* hSystematicsProtons[numFiles];  
  TCanvas* cSystematicsProtons = calculateSystematics("cSystematicsProtons", "Systematics Protons", hFractions[3], numFiles,
                                                      AliPID::kProton, nSigma,
                                                      histTitles, reference, hSystematicsProtons, &grSysErrors[3], ignoreSigmaErrors);
  
  TH1F* hSystematicsMuons[numFiles];
  TCanvas* cSystematicsMuons = calculateSystematics("cSystematicsMuons", "Systematics Muons", hFractions[4], numFiles,
                                                    AliPID::kMuon, nSigma,
                                                    histTitles, reference, hSystematicsMuons, &grSysErrors[4], ignoreSigmaErrors);
  
  Double_t pLow = 0.15;
  Double_t pHigh = 50.;
  TCanvas* cFractionsWithSystematicError = DrawFractionHistos("cFractionsWithSystematicError", "Particle fractions", pLow, pHigh, hFractions, reference, 
                                                              grSysErrors);
  
  
  //TODO At the moment, the error of the fractions and the yield is just a constant factor (number of tracks in that bin)
  // (-> But this can change in future (I have to think about it a little bit more carefully)).
  // Thus, the relative errors are the same for fractions and yields and I can just use this fact to
  // transform the errors from the fractions to those of the yields.
  // However, this causes trouble in case of fraction = 0. Therefore, sum up the yields to the total yield and use this for scaling
  for (Int_t i = 0; i < numSpecies; i++) {
    grSysErrorsYields[i] = new TGraphAsymmErrors(*grSysErrors[i]);
    TString name = grSysErrors[i]->GetName();
    name.ReplaceAll("systematicError_", "systematicErrorYields_");
    grSysErrorsYields[i]->SetName(name.Data());
    
    for (Int_t ind = 0; ind < grSysErrorsYields[i]->GetN(); ind++) {
      Double_t totalYield = 0;
      for (Int_t j = 0; j < numSpecies; j++)
        totalYield += hYields[j]->GetBinContent(ind + 1);
      
      const Double_t yield = hYields[i]->GetBinContent(ind + 1);
      const Double_t sysErrorLow = grSysErrors[i]->GetErrorYlow(ind);
      const Double_t sysErrorHigh = grSysErrors[i]->GetErrorYhigh(ind);
      
      grSysErrorsYields[i]->SetPoint(ind, grSysErrorsYields[i]->GetX()[ind], yield);
      grSysErrorsYields[i]->SetPointEYhigh(ind, totalYield * sysErrorHigh);
      grSysErrorsYields[i]->SetPointEYlow(ind, totalYield * sysErrorLow);
      
      /*
      Double_t totalYield = 0;
      for (Int_t j = 0; j < numSpecies; j++)
        totalYield += hYields[j]->GetBinContent(ind + 1);
      
      const Double_t yield = hYields[i]->GetBinContent(ind + 1);
      const Double_t fraction = hFractions[i][reference]->GetBinContent(ind + 1);
      const Double_t sysErrorLow = grSysErrors[i]->GetErrorYlow(ind);
      const Double_t sysErrorHigh = grSysErrors[i]->GetErrorYhigh(ind);
      
      if (fraction <= 0.) {
        printf("Error: Fraction = 0 for species %d. Cannot transform error....\n", i);
        return -1;
      }
      const Double_t sysErrorLowRel = sysErrorLow / fraction;
      const Double_t sysErrorHighRel = sysErrorHigh / fraction;
      
      grSysErrorsYields[i]->SetPoint(ind, grSysErrorsYields[i]->GetX()[ind], yield);
      grSysErrorsYields[i]->SetPointEYhigh(ind, sysErrorHighRel * yield);
      grSysErrorsYields[i]->SetPointEYlow(ind, sysErrorLowRel * yield);
      */
    }
  }
  
  
  // Output file
  TFile* fSave = 0x0;
  TDatime daTime;
  TString saveFileName;
    
  saveFileName = Form("outputSystematics_%s_nSigma%.1f__%04d_%02d_%02d.root", outFileTitle.Data(), nSigma, 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();
  
  for (Int_t i = 0; i < numFiles; i++) {
    if (hSystematicsElectrons[i])
      hSystematicsElectrons[i]->Write();
    
    if (hSystematicsPions[i])
      hSystematicsPions[i]->Write();
    
    if (hSystematicsKaons[i])
      hSystematicsKaons[i]->Write();
    
    if (hSystematicsProtons[i])
      hSystematicsProtons[i]->Write();
    if (hSystematicsMuons[i])
      hSystematicsMuons[i]->Write();
  }
  
  if (cSystematicsElectrons)
      cSystematicsElectrons->Write();
  
  if (cSystematicsPions)
      cSystematicsPions->Write();
  
  if (cSystematicsKaons)
      cSystematicsKaons->Write();
  
  if (cSystematicsProtons)
      cSystematicsProtons->Write();
  
  if (cSystematicsMuons)
      cSystematicsMuons->Write();
  
  if (cFractionsWithSystematicError)
      cFractionsWithSystematicError->Write();
  
  for (Int_t i = 0; i < numSpecies; i++) {
    if (hFractions[i][reference])
      hFractions[i][reference]->Write();
    
    if (grSysErrors[i])
      grSysErrors[i]->Write();
    
    if (hYields[i])
      hYields[i]->Write();
    
    if (grSysErrorsYields[i])
      grSysErrorsYields[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();
    
  fSave->Close();
  
  delete cSystematicsElectrons;
  delete cSystematicsPions;
  delete cSystematicsKaons;
  delete cSystematicsMuons;
  delete cSystematicsProtons;
  delete cFractionsWithSystematicError;
  
  return 0;
}
 SystematicErrorEstimation.C:1
 SystematicErrorEstimation.C:2
 SystematicErrorEstimation.C:3
 SystematicErrorEstimation.C:4
 SystematicErrorEstimation.C:5
 SystematicErrorEstimation.C:6
 SystematicErrorEstimation.C:7
 SystematicErrorEstimation.C:8
 SystematicErrorEstimation.C:9
 SystematicErrorEstimation.C:10
 SystematicErrorEstimation.C:11
 SystematicErrorEstimation.C:12
 SystematicErrorEstimation.C:13
 SystematicErrorEstimation.C:14
 SystematicErrorEstimation.C:15
 SystematicErrorEstimation.C:16
 SystematicErrorEstimation.C:17
 SystematicErrorEstimation.C:18
 SystematicErrorEstimation.C:19
 SystematicErrorEstimation.C:20
 SystematicErrorEstimation.C:21
 SystematicErrorEstimation.C:22
 SystematicErrorEstimation.C:23
 SystematicErrorEstimation.C:24
 SystematicErrorEstimation.C:25
 SystematicErrorEstimation.C:26
 SystematicErrorEstimation.C:27
 SystematicErrorEstimation.C:28
 SystematicErrorEstimation.C:29
 SystematicErrorEstimation.C:30
 SystematicErrorEstimation.C:31
 SystematicErrorEstimation.C:32
 SystematicErrorEstimation.C:33
 SystematicErrorEstimation.C:34
 SystematicErrorEstimation.C:35
 SystematicErrorEstimation.C:36
 SystematicErrorEstimation.C:37
 SystematicErrorEstimation.C:38
 SystematicErrorEstimation.C:39
 SystematicErrorEstimation.C:40
 SystematicErrorEstimation.C:41
 SystematicErrorEstimation.C:42
 SystematicErrorEstimation.C:43
 SystematicErrorEstimation.C:44
 SystematicErrorEstimation.C:45
 SystematicErrorEstimation.C:46
 SystematicErrorEstimation.C:47
 SystematicErrorEstimation.C:48
 SystematicErrorEstimation.C:49
 SystematicErrorEstimation.C:50
 SystematicErrorEstimation.C:51
 SystematicErrorEstimation.C:52
 SystematicErrorEstimation.C:53
 SystematicErrorEstimation.C:54
 SystematicErrorEstimation.C:55
 SystematicErrorEstimation.C:56
 SystematicErrorEstimation.C:57
 SystematicErrorEstimation.C:58
 SystematicErrorEstimation.C:59
 SystematicErrorEstimation.C:60
 SystematicErrorEstimation.C:61
 SystematicErrorEstimation.C:62
 SystematicErrorEstimation.C:63
 SystematicErrorEstimation.C:64
 SystematicErrorEstimation.C:65
 SystematicErrorEstimation.C:66
 SystematicErrorEstimation.C:67
 SystematicErrorEstimation.C:68
 SystematicErrorEstimation.C:69
 SystematicErrorEstimation.C:70
 SystematicErrorEstimation.C:71
 SystematicErrorEstimation.C:72
 SystematicErrorEstimation.C:73
 SystematicErrorEstimation.C:74
 SystematicErrorEstimation.C:75
 SystematicErrorEstimation.C:76
 SystematicErrorEstimation.C:77
 SystematicErrorEstimation.C:78
 SystematicErrorEstimation.C:79
 SystematicErrorEstimation.C:80
 SystematicErrorEstimation.C:81
 SystematicErrorEstimation.C:82
 SystematicErrorEstimation.C:83
 SystematicErrorEstimation.C:84
 SystematicErrorEstimation.C:85
 SystematicErrorEstimation.C:86
 SystematicErrorEstimation.C:87
 SystematicErrorEstimation.C:88
 SystematicErrorEstimation.C:89
 SystematicErrorEstimation.C:90
 SystematicErrorEstimation.C:91
 SystematicErrorEstimation.C:92
 SystematicErrorEstimation.C:93
 SystematicErrorEstimation.C:94
 SystematicErrorEstimation.C:95
 SystematicErrorEstimation.C:96
 SystematicErrorEstimation.C:97
 SystematicErrorEstimation.C:98
 SystematicErrorEstimation.C:99
 SystematicErrorEstimation.C:100
 SystematicErrorEstimation.C:101
 SystematicErrorEstimation.C:102
 SystematicErrorEstimation.C:103
 SystematicErrorEstimation.C:104
 SystematicErrorEstimation.C:105
 SystematicErrorEstimation.C:106
 SystematicErrorEstimation.C:107
 SystematicErrorEstimation.C:108
 SystematicErrorEstimation.C:109
 SystematicErrorEstimation.C:110
 SystematicErrorEstimation.C:111
 SystematicErrorEstimation.C:112
 SystematicErrorEstimation.C:113
 SystematicErrorEstimation.C:114
 SystematicErrorEstimation.C:115
 SystematicErrorEstimation.C:116
 SystematicErrorEstimation.C:117
 SystematicErrorEstimation.C:118
 SystematicErrorEstimation.C:119
 SystematicErrorEstimation.C:120
 SystematicErrorEstimation.C:121
 SystematicErrorEstimation.C:122
 SystematicErrorEstimation.C:123
 SystematicErrorEstimation.C:124
 SystematicErrorEstimation.C:125
 SystematicErrorEstimation.C:126
 SystematicErrorEstimation.C:127
 SystematicErrorEstimation.C:128
 SystematicErrorEstimation.C:129
 SystematicErrorEstimation.C:130
 SystematicErrorEstimation.C:131
 SystematicErrorEstimation.C:132
 SystematicErrorEstimation.C:133
 SystematicErrorEstimation.C:134
 SystematicErrorEstimation.C:135
 SystematicErrorEstimation.C:136
 SystematicErrorEstimation.C:137
 SystematicErrorEstimation.C:138
 SystematicErrorEstimation.C:139
 SystematicErrorEstimation.C:140
 SystematicErrorEstimation.C:141
 SystematicErrorEstimation.C:142
 SystematicErrorEstimation.C:143
 SystematicErrorEstimation.C:144
 SystematicErrorEstimation.C:145
 SystematicErrorEstimation.C:146
 SystematicErrorEstimation.C:147
 SystematicErrorEstimation.C:148
 SystematicErrorEstimation.C:149
 SystematicErrorEstimation.C:150
 SystematicErrorEstimation.C:151
 SystematicErrorEstimation.C:152
 SystematicErrorEstimation.C:153
 SystematicErrorEstimation.C:154
 SystematicErrorEstimation.C:155
 SystematicErrorEstimation.C:156
 SystematicErrorEstimation.C:157
 SystematicErrorEstimation.C:158
 SystematicErrorEstimation.C:159
 SystematicErrorEstimation.C:160
 SystematicErrorEstimation.C:161
 SystematicErrorEstimation.C:162
 SystematicErrorEstimation.C:163
 SystematicErrorEstimation.C:164
 SystematicErrorEstimation.C:165
 SystematicErrorEstimation.C:166
 SystematicErrorEstimation.C:167
 SystematicErrorEstimation.C:168
 SystematicErrorEstimation.C:169
 SystematicErrorEstimation.C:170
 SystematicErrorEstimation.C:171
 SystematicErrorEstimation.C:172
 SystematicErrorEstimation.C:173
 SystematicErrorEstimation.C:174
 SystematicErrorEstimation.C:175
 SystematicErrorEstimation.C:176
 SystematicErrorEstimation.C:177
 SystematicErrorEstimation.C:178
 SystematicErrorEstimation.C:179
 SystematicErrorEstimation.C:180
 SystematicErrorEstimation.C:181
 SystematicErrorEstimation.C:182
 SystematicErrorEstimation.C:183
 SystematicErrorEstimation.C:184
 SystematicErrorEstimation.C:185
 SystematicErrorEstimation.C:186
 SystematicErrorEstimation.C:187
 SystematicErrorEstimation.C:188
 SystematicErrorEstimation.C:189
 SystematicErrorEstimation.C:190
 SystematicErrorEstimation.C:191
 SystematicErrorEstimation.C:192
 SystematicErrorEstimation.C:193
 SystematicErrorEstimation.C:194
 SystematicErrorEstimation.C:195
 SystematicErrorEstimation.C:196
 SystematicErrorEstimation.C:197
 SystematicErrorEstimation.C:198
 SystematicErrorEstimation.C:199
 SystematicErrorEstimation.C:200
 SystematicErrorEstimation.C:201
 SystematicErrorEstimation.C:202
 SystematicErrorEstimation.C:203
 SystematicErrorEstimation.C:204
 SystematicErrorEstimation.C:205
 SystematicErrorEstimation.C:206
 SystematicErrorEstimation.C:207
 SystematicErrorEstimation.C:208
 SystematicErrorEstimation.C:209
 SystematicErrorEstimation.C:210
 SystematicErrorEstimation.C:211
 SystematicErrorEstimation.C:212
 SystematicErrorEstimation.C:213
 SystematicErrorEstimation.C:214
 SystematicErrorEstimation.C:215
 SystematicErrorEstimation.C:216
 SystematicErrorEstimation.C:217
 SystematicErrorEstimation.C:218
 SystematicErrorEstimation.C:219
 SystematicErrorEstimation.C:220
 SystematicErrorEstimation.C:221
 SystematicErrorEstimation.C:222
 SystematicErrorEstimation.C:223
 SystematicErrorEstimation.C:224
 SystematicErrorEstimation.C:225
 SystematicErrorEstimation.C:226
 SystematicErrorEstimation.C:227
 SystematicErrorEstimation.C:228
 SystematicErrorEstimation.C:229
 SystematicErrorEstimation.C:230
 SystematicErrorEstimation.C:231
 SystematicErrorEstimation.C:232
 SystematicErrorEstimation.C:233
 SystematicErrorEstimation.C:234
 SystematicErrorEstimation.C:235
 SystematicErrorEstimation.C:236
 SystematicErrorEstimation.C:237
 SystematicErrorEstimation.C:238
 SystematicErrorEstimation.C:239
 SystematicErrorEstimation.C:240
 SystematicErrorEstimation.C:241
 SystematicErrorEstimation.C:242
 SystematicErrorEstimation.C:243
 SystematicErrorEstimation.C:244
 SystematicErrorEstimation.C:245
 SystematicErrorEstimation.C:246
 SystematicErrorEstimation.C:247
 SystematicErrorEstimation.C:248
 SystematicErrorEstimation.C:249
 SystematicErrorEstimation.C:250
 SystematicErrorEstimation.C:251
 SystematicErrorEstimation.C:252
 SystematicErrorEstimation.C:253
 SystematicErrorEstimation.C:254
 SystematicErrorEstimation.C:255
 SystematicErrorEstimation.C:256
 SystematicErrorEstimation.C:257
 SystematicErrorEstimation.C:258
 SystematicErrorEstimation.C:259
 SystematicErrorEstimation.C:260
 SystematicErrorEstimation.C:261
 SystematicErrorEstimation.C:262
 SystematicErrorEstimation.C:263
 SystematicErrorEstimation.C:264
 SystematicErrorEstimation.C:265
 SystematicErrorEstimation.C:266
 SystematicErrorEstimation.C:267
 SystematicErrorEstimation.C:268
 SystematicErrorEstimation.C:269
 SystematicErrorEstimation.C:270
 SystematicErrorEstimation.C:271
 SystematicErrorEstimation.C:272
 SystematicErrorEstimation.C:273
 SystematicErrorEstimation.C:274
 SystematicErrorEstimation.C:275
 SystematicErrorEstimation.C:276
 SystematicErrorEstimation.C:277
 SystematicErrorEstimation.C:278
 SystematicErrorEstimation.C:279
 SystematicErrorEstimation.C:280
 SystematicErrorEstimation.C:281
 SystematicErrorEstimation.C:282
 SystematicErrorEstimation.C:283
 SystematicErrorEstimation.C:284
 SystematicErrorEstimation.C:285
 SystematicErrorEstimation.C:286
 SystematicErrorEstimation.C:287
 SystematicErrorEstimation.C:288
 SystematicErrorEstimation.C:289
 SystematicErrorEstimation.C:290
 SystematicErrorEstimation.C:291
 SystematicErrorEstimation.C:292
 SystematicErrorEstimation.C:293
 SystematicErrorEstimation.C:294
 SystematicErrorEstimation.C:295
 SystematicErrorEstimation.C:296
 SystematicErrorEstimation.C:297
 SystematicErrorEstimation.C:298
 SystematicErrorEstimation.C:299
 SystematicErrorEstimation.C:300
 SystematicErrorEstimation.C:301
 SystematicErrorEstimation.C:302
 SystematicErrorEstimation.C:303
 SystematicErrorEstimation.C:304
 SystematicErrorEstimation.C:305
 SystematicErrorEstimation.C:306
 SystematicErrorEstimation.C:307
 SystematicErrorEstimation.C:308
 SystematicErrorEstimation.C:309
 SystematicErrorEstimation.C:310
 SystematicErrorEstimation.C:311
 SystematicErrorEstimation.C:312
 SystematicErrorEstimation.C:313
 SystematicErrorEstimation.C:314
 SystematicErrorEstimation.C:315
 SystematicErrorEstimation.C:316
 SystematicErrorEstimation.C:317
 SystematicErrorEstimation.C:318
 SystematicErrorEstimation.C:319
 SystematicErrorEstimation.C:320
 SystematicErrorEstimation.C:321
 SystematicErrorEstimation.C:322
 SystematicErrorEstimation.C:323
 SystematicErrorEstimation.C:324
 SystematicErrorEstimation.C:325
 SystematicErrorEstimation.C:326
 SystematicErrorEstimation.C:327
 SystematicErrorEstimation.C:328
 SystematicErrorEstimation.C:329
 SystematicErrorEstimation.C:330
 SystematicErrorEstimation.C:331
 SystematicErrorEstimation.C:332
 SystematicErrorEstimation.C:333
 SystematicErrorEstimation.C:334
 SystematicErrorEstimation.C:335
 SystematicErrorEstimation.C:336
 SystematicErrorEstimation.C:337
 SystematicErrorEstimation.C:338
 SystematicErrorEstimation.C:339
 SystematicErrorEstimation.C:340
 SystematicErrorEstimation.C:341
 SystematicErrorEstimation.C:342
 SystematicErrorEstimation.C:343
 SystematicErrorEstimation.C:344
 SystematicErrorEstimation.C:345
 SystematicErrorEstimation.C:346
 SystematicErrorEstimation.C:347
 SystematicErrorEstimation.C:348
 SystematicErrorEstimation.C:349
 SystematicErrorEstimation.C:350
 SystematicErrorEstimation.C:351
 SystematicErrorEstimation.C:352
 SystematicErrorEstimation.C:353
 SystematicErrorEstimation.C:354
 SystematicErrorEstimation.C:355
 SystematicErrorEstimation.C:356
 SystematicErrorEstimation.C:357
 SystematicErrorEstimation.C:358
 SystematicErrorEstimation.C:359
 SystematicErrorEstimation.C:360
 SystematicErrorEstimation.C:361
 SystematicErrorEstimation.C:362
 SystematicErrorEstimation.C:363
 SystematicErrorEstimation.C:364
 SystematicErrorEstimation.C:365
 SystematicErrorEstimation.C:366
 SystematicErrorEstimation.C:367
 SystematicErrorEstimation.C:368
 SystematicErrorEstimation.C:369
 SystematicErrorEstimation.C:370
 SystematicErrorEstimation.C:371
 SystematicErrorEstimation.C:372
 SystematicErrorEstimation.C:373
 SystematicErrorEstimation.C:374
 SystematicErrorEstimation.C:375
 SystematicErrorEstimation.C:376
 SystematicErrorEstimation.C:377
 SystematicErrorEstimation.C:378
 SystematicErrorEstimation.C:379
 SystematicErrorEstimation.C:380
 SystematicErrorEstimation.C:381
 SystematicErrorEstimation.C:382
 SystematicErrorEstimation.C:383
 SystematicErrorEstimation.C:384
 SystematicErrorEstimation.C:385
 SystematicErrorEstimation.C:386
 SystematicErrorEstimation.C:387
 SystematicErrorEstimation.C:388
 SystematicErrorEstimation.C:389
 SystematicErrorEstimation.C:390
 SystematicErrorEstimation.C:391
 SystematicErrorEstimation.C:392
 SystematicErrorEstimation.C:393
 SystematicErrorEstimation.C:394
 SystematicErrorEstimation.C:395
 SystematicErrorEstimation.C:396
 SystematicErrorEstimation.C:397
 SystematicErrorEstimation.C:398
 SystematicErrorEstimation.C:399
 SystematicErrorEstimation.C:400
 SystematicErrorEstimation.C:401
 SystematicErrorEstimation.C:402
 SystematicErrorEstimation.C:403
 SystematicErrorEstimation.C:404
 SystematicErrorEstimation.C:405
 SystematicErrorEstimation.C:406
 SystematicErrorEstimation.C:407
 SystematicErrorEstimation.C:408
 SystematicErrorEstimation.C:409
 SystematicErrorEstimation.C:410
 SystematicErrorEstimation.C:411
 SystematicErrorEstimation.C:412
 SystematicErrorEstimation.C:413
 SystematicErrorEstimation.C:414
 SystematicErrorEstimation.C:415
 SystematicErrorEstimation.C:416
 SystematicErrorEstimation.C:417
 SystematicErrorEstimation.C:418
 SystematicErrorEstimation.C:419
 SystematicErrorEstimation.C:420
 SystematicErrorEstimation.C:421
 SystematicErrorEstimation.C:422
 SystematicErrorEstimation.C:423
 SystematicErrorEstimation.C:424
 SystematicErrorEstimation.C:425
 SystematicErrorEstimation.C:426
 SystematicErrorEstimation.C:427
 SystematicErrorEstimation.C:428
 SystematicErrorEstimation.C:429
 SystematicErrorEstimation.C:430
 SystematicErrorEstimation.C:431
 SystematicErrorEstimation.C:432
 SystematicErrorEstimation.C:433
 SystematicErrorEstimation.C:434
 SystematicErrorEstimation.C:435
 SystematicErrorEstimation.C:436
 SystematicErrorEstimation.C:437
 SystematicErrorEstimation.C:438
 SystematicErrorEstimation.C:439
 SystematicErrorEstimation.C:440
 SystematicErrorEstimation.C:441
 SystematicErrorEstimation.C:442
 SystematicErrorEstimation.C:443
 SystematicErrorEstimation.C:444
 SystematicErrorEstimation.C:445
 SystematicErrorEstimation.C:446
 SystematicErrorEstimation.C:447
 SystematicErrorEstimation.C:448
 SystematicErrorEstimation.C:449
 SystematicErrorEstimation.C:450
 SystematicErrorEstimation.C:451
 SystematicErrorEstimation.C:452
 SystematicErrorEstimation.C:453
 SystematicErrorEstimation.C:454
 SystematicErrorEstimation.C:455
 SystematicErrorEstimation.C:456
 SystematicErrorEstimation.C:457
 SystematicErrorEstimation.C:458
 SystematicErrorEstimation.C:459
 SystematicErrorEstimation.C:460
 SystematicErrorEstimation.C:461
 SystematicErrorEstimation.C:462
 SystematicErrorEstimation.C:463
 SystematicErrorEstimation.C:464
 SystematicErrorEstimation.C:465
 SystematicErrorEstimation.C:466
 SystematicErrorEstimation.C:467
 SystematicErrorEstimation.C:468
 SystematicErrorEstimation.C:469
 SystematicErrorEstimation.C:470
 SystematicErrorEstimation.C:471
 SystematicErrorEstimation.C:472
 SystematicErrorEstimation.C:473
 SystematicErrorEstimation.C:474
 SystematicErrorEstimation.C:475
 SystematicErrorEstimation.C:476
 SystematicErrorEstimation.C:477
 SystematicErrorEstimation.C:478
 SystematicErrorEstimation.C:479
 SystematicErrorEstimation.C:480
 SystematicErrorEstimation.C:481
 SystematicErrorEstimation.C:482
 SystematicErrorEstimation.C:483
 SystematicErrorEstimation.C:484
 SystematicErrorEstimation.C:485
 SystematicErrorEstimation.C:486
 SystematicErrorEstimation.C:487
 SystematicErrorEstimation.C:488
 SystematicErrorEstimation.C:489
 SystematicErrorEstimation.C:490
 SystematicErrorEstimation.C:491
 SystematicErrorEstimation.C:492
 SystematicErrorEstimation.C:493
 SystematicErrorEstimation.C:494
 SystematicErrorEstimation.C:495
 SystematicErrorEstimation.C:496
 SystematicErrorEstimation.C:497
 SystematicErrorEstimation.C:498
 SystematicErrorEstimation.C:499
 SystematicErrorEstimation.C:500
 SystematicErrorEstimation.C:501
 SystematicErrorEstimation.C:502
 SystematicErrorEstimation.C:503
 SystematicErrorEstimation.C:504
 SystematicErrorEstimation.C:505
 SystematicErrorEstimation.C:506
 SystematicErrorEstimation.C:507
 SystematicErrorEstimation.C:508
 SystematicErrorEstimation.C:509
 SystematicErrorEstimation.C:510
 SystematicErrorEstimation.C:511
 SystematicErrorEstimation.C:512
 SystematicErrorEstimation.C:513
 SystematicErrorEstimation.C:514
 SystematicErrorEstimation.C:515
 SystematicErrorEstimation.C:516
 SystematicErrorEstimation.C:517
 SystematicErrorEstimation.C:518