ROOT logo
#include "THnSparse.h"
#include "TH2D.h"
#include "TH1D.h"
#include "TProfile.h"
#include "TF1.h"
#include "TFitResultPtr.h"
#include "TFitResult.h"
#include "TCanvas.h"
#include "TStyle.h"
#include "TVirtualFitter.h"
#include "TObjArray.h"
#include "TString.h"
#include "TLegend.h"
#include "TFile.h"
#include "TGraphErrors.h"
#include "TGraph.h"
#include "TMath.h"
#include "TMatrixDSym.h"
#include "TRandom3.h"
#include "TROOT.h"

#include <iostream>
#include <iomanip>

#include "AliPID.h"

#include "THnSparseDefinitions.h"
#include "AliTPCPIDmathFit.h"

enum processMode { kPMpT = 0, kPMz = 1, kPMxi = 2 };
enum muonTreatment { kNoMuons = 0, kMuonFracEqualElFrac = 1, kMuonFracOverElFracTunedOnMCStandardTrackCuts = 2,
                     kMuonFracOverElFracTunedOnMCHybridTrackCuts = 3, kMuonFracOverElFracTunedOnMCHybridTrackCutsJets = 4,
                     kMuonFracOverElFracTunedOnMCStandardTrackCutsPPb = 5,
                     kNumHandlings = 6 };

const TString modeShortName[3] = { "Pt", "Z", "Xi" };
const TString modeLatexName[3] = { "P_{T}", "z", "#xi" };

const TString muonFractionHandlingShortName[kNumHandlings] =
  { "noMuons", "muonsEqualElectrons", "muonToElTunedOnMCStandardTrackCuts", "muonToElTunedOnMCHybridTrackCuts",
    "muonToElTunedOnMCHybridTrackCutsJets", "muonToElTunedOnMCStandardTrackCutsPPB" };

const Double_t epsilon = 1e-10;
const TString identifiedLabels[2] = { "Most Probable PID", "MC" };
Int_t isMC = 0;

TString minimisationStrategy = "MIGRAD"; // "MINIMIZE"
Bool_t takeIntoAccountMuons = kTRUE;

// 0 = no muons, 1 = muonFrac=elFrac, 2(3) = muonFrac/elFrac tuned on MC for DefaultTrackCuts (hybridTrackCuts),
// 4 = muonFrac/elFrac tuned on MC for hybridTrackCuts for jet particles,
Int_t muonFractionHandling = 3; 


//TODO getErrorOf.... is COMPLETELY wrong now, since the parameter numbering has changed and the muons had come into play!!!!!!

// TODO CAREFUL: fitMethod == 1 adds errors of electrons to pions, but not to muons (should be added to electron error instead!)
const Bool_t muonContamination = kFALSE;//TODO CAREFUL: fitMethod == 1 takes into account the muon contamination in the error calculation!!!

const Bool_t normaliseResults = kTRUE; // Works only for fitMethod == 2

const Bool_t enableShift = kFALSE;
const Int_t dataAxis = kPidDeltaPrime;//kPidDelta; kPidDeltaPrime

const Int_t numSimultaneousFits = 4;

// Upper and lower axis bounds (y-axis) of (data - fit) / data QA histos
const Double_t fitQAaxisLowBound = -0.5;
const Double_t fitQAaxisUpBound = 0.5;

Bool_t useDeltaPrime = (dataAxis == kPidDeltaPrime);

// Will be set later
Double_t muonFractionThresholdForFitting = -1.;
Double_t muonFractionThresholdBinForFitting = -1;
  
Double_t electronFractionThresholdForFitting = -1.;
Double_t electronFractionThresholdBinForFitting = -1;


TF1 fMuonOverElFractionMC("fMuonOverElFractionMC", "[0]+[1]/TMath::Min(x, [4])+[2]*TMath::Min(x, [4])+[3]*TMath::Min(x, [4])*TMath::Min(x, [4])+[5]*TMath::Min(x, [4])*TMath::Min(x, [4])*TMath::Min(x, [4])+[6]*(x>[7])*TMath::Min(x-[7], [8]-[7])",
                          0.01, 50.);

TF1* fElectronFraction = 0x0;
const Double_t lowFittingBoundElectronFraction = 3.0; 

TGraphErrors* gFractionElectronsData = 0x0;
Double_t lastPtForCallOfGetElectronFraction = -1;


//____________________________________________________________________________________________________________________
Double_t GetElectronFraction(const Double_t pT, const Double_t *par)
{
  // During the fit (both, simultaneous and non-simultaneous), the algorithm will always start off from
  // the low pT and go to higher pT. So, it is only necessary to do the fit once the first fixed bin is reached.
  // Then the parameters for the electron fraction remain fixed until the next fit iteration.
  // Since only for the case of regularisation the electron fractions of all x bins are stored in mathFit,
  // the evaluation of this function is done here only in that case (only then the electron fraction will
  // be set to "-pT".
  
  // NOTE 1: Electrons have index 3 per x bin
  // NOTE 2: This function is only called for fitting vs. pT. In that case, xValue holds the LOG of pT!
  
  AliTPCPIDmathFit* mathFit = AliTPCPIDmathFit::Instance();
  
  // lastPtForCallOfGetElectronFraction will be initialised with a value larger than any pT during the fit.
  // So, if this function is called and the pT is smaller than lastPtForCallOfGetElectronFraction, the parameters
  // must have changed and the electron fit needs to be re-done (also see comment above)
  if (pT < lastPtForCallOfGetElectronFraction) {
    for (Int_t xBin = 0; xBin < mathFit->GetNumXbinsRegularisation(); xBin++) {
      
      const Double_t xCoord = TMath::Exp(mathFit->GetXvaluesForRegularisation()[xBin]);
      const Int_t parIndexWithFraction = 3 + xBin * mathFit->GetNumParametersPerXbin(); 
      
      if (xCoord >= lowFittingBoundElectronFraction && xCoord <= electronFractionThresholdForFitting
          && par[parIndexWithFraction] > epsilon) { // Skip zero values (usually due to failed fits)
        gFractionElectronsData->SetPoint(xBin, TMath::Exp(mathFit->GetXvaluesForRegularisation()[xBin]), par[parIndexWithFraction]);
        // Since the errors during the fitting are not reliable, use the following approximation on a statistical basis
        // (which indeed turns out to be rather good!)
        
        // Bin effective weight required for weighted data sets. In case of no weighting, the weight error is sqrt(weight),
        // i.e. effWeight is 1
        const Double_t effWeight = mathFit->GetXstatisticalWeightError()[xBin] * mathFit->GetXstatisticalWeightError()[xBin]
                                   / mathFit->GetXstatisticalWeight()[xBin];
        gFractionElectronsData->SetPointError(xBin, 0, effWeight * TMath::Sqrt(par[parIndexWithFraction] 
                                                                               / mathFit->GetXstatisticalWeight()[xBin]));
      }
      else {
        gFractionElectronsData->SetPoint(xBin, -1, 0);
        gFractionElectronsData->SetPointError(xBin, 0, 0);
      }
    }
    
    gFractionElectronsData->Fit(fElectronFraction, "Ex0NQ", "", lowFittingBoundElectronFraction, electronFractionThresholdForFitting);
  }
  
  lastPtForCallOfGetElectronFraction = pT;
  
  // Catch cases in which the fit function yields invalid fractions (i.e. < 0 or > 1)
  return TMath::Max(0.0, TMath::Min(1.0, fElectronFraction->Eval(pT)));
}


//____________________________________________________________________________________________________________________
Double_t GetElectronFractionError()
{
  // This function estimates the error of the electron fraction for the fixed values via using the parameter errors of
  // the electron fraction function. Note that the parameters (and errors) must be set before calling this function.
  
  // Produce several values via setting the parameters to a random value, which is distributed with a gaussian with mean = parValue
  // and sigma = parError and then take the 2*RMS as the error
  const Int_t nGenValues = 1000;
  Double_t genValues[nGenValues];
  
  const Int_t nPars = fElectronFraction->GetNpar();
  Double_t par[nPars];
  
  TRandom3 rnd(0); // 0 means random seed
  
  const Double_t x = electronFractionThresholdForFitting + 1.; // Some value above the threshold to obtain a fixed value
  for (Int_t i = 0 ; i < nGenValues; i++) {
    for (Int_t iPar = 0; iPar < nPars; iPar++)
      par[iPar] = rnd.Gaus(fElectronFraction->GetParameter(iPar), fElectronFraction->GetParError(iPar));
    
    genValues[i] = fElectronFraction->EvalPar(&x, &par[0]);
  }
  
  // NOTE: RMS is not really the root mean square, is it rather the sigma deviation, which is what is wanted here
  return 2. * TMath::RMS(nGenValues, &genValues[0]);
}


//____________________________________________________________________________________________________________________
Double_t GetMuonFractionFromElectronFractionAndPt(Double_t pT, Double_t elFrac)
{
  if (muonFractionHandling == kMuonFracOverElFracTunedOnMCStandardTrackCuts) {
//    return elFrac / (1. + 7.06909e+01 * TMath::Exp(-2.95078e+00 * TMath::Power(pT, 5.05016e-01)));
    return elFrac / (1. + 2.01840e+10 * TMath::Exp(-2.50480e+01 * TMath::Power(pT, 5.89044e-02)));
  }
  else if (muonFractionHandling == kMuonFracOverElFracTunedOnMCHybridTrackCuts) {
    fMuonOverElFractionMC.SetParameters(-6.87241e-01, 4.19528e-02, 4.52095e+00, -6.20026e+00, 5.16629e-01, 2.88604e+00, 3.68058e-02,
                                        2.21086e+00, 5.75003e+00);
    return elFrac * fMuonOverElFractionMC.Eval(pT);
  }
  else if (muonFractionHandling == kMuonFracOverElFracTunedOnMCHybridTrackCutsJets) {
    fMuonOverElFractionMC.SetParameters(-7.64548e-01, 2.47929e-02, 4.49057e+00, -2.06320e-01, 4.23339e-02, 1.19697e+02, 1.28832e-01,
                                        -1.71895e-01, 6.00000e+00);
    return elFrac * fMuonOverElFractionMC.Eval(pT);
  }
  else if (muonFractionHandling == kMuonFracOverElFracTunedOnMCStandardTrackCutsPPb) {
    // WITH PID cluster cut!
    fMuonOverElFractionMC.SetParameters(-6.62149e-01, 4.89591e-02, 4.58356e+00, -6.04319e+00, 6.25368e-01, 3.27191e+00, 1.69933e-01,
                                        1.00004e+00, 2.61438e+00);
    return elFrac * fMuonOverElFractionMC.Eval(pT);
  }
  else if (muonFractionHandling == kMuonFracEqualElFrac) {
    return elFrac;
  }
  
  return 0.;
}


//____________________________________________________________________________________________________________________
Double_t GetCorrelatedError(const Double_t x, const Double_t y, const Double_t cov00, const Double_t cov11, const Double_t cov01) 
{
  // Calculate the correlated error df of f:
  //                (cov00 cov01) (x)
  //df^2 = (x, y) * (cov01 cov11) (y) = x^2 * cov00 + y^2 * cov11 + 2 * x * y * cov01
  //
  // with  f = f(p1, p2) = p1 / p2
  // and (x, y) = (\partial f / \partial p1, \partial f / \partial p2)
  //            = (f / p1, -f / p2)

  const Double_t df2 = x * x * cov00 + y * y * cov11 + 2. * x * y * cov01;
  
  if (df2 < epsilon)
    return 0.;
  
  return TMath::Sqrt(df2);
}


//____________________________________________________________________________________________________________________
void GetRatioWithCorrelatedError(const Double_t fractionA, const Double_t fractionB,
                                 const Double_t fractionErrorA, const Double_t fractionErrorB,
                                 const Double_t covMatrixElementAB, Double_t& ratio, Double_t& ratioError)
{
  // Given fractions A and B with corresponding errors and the off-diagonal covariance matrix element of
  // these fractions, calculate the ratio A/B and the error taking into account the correlation.
  // The results are stored in ratio and ratioError.
  
  if (fractionB < epsilon) {
    ratio = -999.;
    ratioError = 999.;
    
    return;
  }
  
  if (fractionA < epsilon) {
    ratio = 0.;
    ratioError = 999.;
    
    return;
  }
  
  ratio = fractionA / fractionB;
  
  const Double_t x = ratio / fractionA;
  const Double_t y = -ratio / fractionB;
  
  // covMatrixElement(i, i) = error(i)^2
  ratioError = GetCorrelatedError(x, y, fractionErrorA * fractionErrorA, fractionErrorB * fractionErrorB, covMatrixElementAB); 
  
  //printf("frationA %e\nfractionB %e\nfractionErrorA %e\nfractionErrorB %e\ncovMatrixElementAB %e\nratio %e\nx %e\ny %e\nratioError %e\n\n",
  //       fractionA, fractionB, fractionErrorA, fractionErrorB, covMatrixElementAB, ratio, x, y, ratioError);
}


//____________________________________________________________________________________________________________________
void SetReasonableAxisRange(TAxis* axis, Int_t mode, Double_t pLow = -1, Double_t pHigh = -1)
{
  if (mode == kPMpT)
    axis->SetRangeUser(TMath::Max(0.15, pLow - 0.1), TMath::Min(50., pHigh + 0.1));
  else if (mode == kPMz)
    axis->SetRange(0, -1);
  else if (mode == kPMxi)
    axis->SetRange(0, -1);
}

//____________________________________________________________________________________________________________________
void SetReasonableXaxisRange(TH1* h, Int_t& binLow, Int_t& binHigh)
{
  binLow = TMath::Max(1, h->FindFirstBinAbove(0));
  binHigh  = TMath::Min(h->GetNbinsX(), h->FindLastBinAbove(0));
  
  h->GetXaxis()->SetRange(binLow, binHigh);
  h->GetXaxis()->SetMoreLogLabels(kTRUE);
  h->GetXaxis()->SetNoExponent(kTRUE);
}


//____________________________________________________________________________________________________________________
Int_t FindMomentumBin(const Double_t* pTbins, const Double_t value, const Int_t numPtBins = nPtBins)
{
  for (Int_t bin = 0; bin < numPtBins; bin++) {
    if (value >= pTbins[bin] && value < pTbins[bin + 1])
      return bin;
  }
  
  return -1;
}


//____________________________________________________________________________________________________________________
Double_t normaliseHist(TH1* h, Double_t scaleFactor = -1)
{
  // Scales the histogram with the scale factor. If the scale factor is < 0,
  // the histogram is normalised to it's integral.
  // In both cases, the normalisation factor is returned.
  
  Double_t normFactor = 1.;
  
  if (scaleFactor < 0) {
    Double_t integralTemp = h->Integral();
    if (integralTemp > 0) {
      normFactor = 1.0 / integralTemp;
      h->Scale(normFactor);
    }
  }
  else {
    normFactor = scaleFactor;
    h->Scale(normFactor);
  }
  
  h->GetXaxis()->SetTitleOffset(1.0);
  
  return normFactor;
}


//____________________________________________________________________________________________________________________
void normaliseYieldHist(TH1* h, Double_t numEvents, Double_t deta)
{
  // Yield histos are already normalised to dpT. Now normalise to 1/NeV 1/(2pi pT) 1/deta in addition
  
  if (numEvents <= 0) // Do not normalise
    numEvents = 1; 
  
  for (Int_t bin = 1; bin <= h->GetNbinsX(); bin++) {
    Double_t normFactor = 1. / (numEvents * 2 * TMath::Pi() * h->GetXaxis()->GetBinCenter(bin) * deta);
    h->SetBinContent(bin, h->GetBinContent(bin) * normFactor);
    h->SetBinError(bin, h->GetBinError(bin) * normFactor);
  }
}


//____________________________________________________________________________________________________________________
void normaliseGenYieldMCtruthHist(TH1* h, Double_t numEvents, Double_t deta)
{
  // Yield histos are NOT normalised to dpT. Now normalise to 1/NeV 1/(2pi pT) 1/deta 1/dpT!
  
  if (numEvents <= 0) // Do not normalise
    numEvents = 1; 
  
  for (Int_t bin = 1; bin <= h->GetNbinsX(); bin++) {
    Double_t normFactor = 1. / (numEvents * 2 * TMath::Pi() * h->GetXaxis()->GetBinCenter(bin) * h->GetXaxis()->GetBinWidth(bin) * deta);
    h->SetBinContent(bin, h->GetBinContent(bin) * normFactor);
    h->SetBinError(bin, h->GetBinError(bin) * normFactor);
  }
}


//____________________________________________________________________________________________________________________
void setUpFitFunction(TF1* fitFunc, Int_t nBins, Bool_t noShift = kFALSE)
{
  fitFunc->SetLineColor(kGray + 1);
  fitFunc->SetLineWidth(2);
  fitFunc->SetLineStyle(1);
  fitFunc->SetNpx(nBins * 100);
  fitFunc->SetParName(0, "Pion fraction");
  fitFunc->SetParName(1, "Kaon fraction");
  fitFunc->SetParName(2, "Proton fraction");
  fitFunc->SetParName(3, "Electron fraction");
  fitFunc->SetParName(4, "Muon fraction");
  fitFunc->SetParName(5, "Total yield");
  if (noShift == kFALSE) {
    fitFunc->SetParName(6, "Shift of pion peak");
    fitFunc->SetParName(7, "Shift of kaon peak");
    fitFunc->SetParName(8, "Shift of proton peak");
    fitFunc->SetParName(9, "Shift of electron peak");
    fitFunc->SetParName(10, "Shift of muon peak");
  }
}


//____________________________________________________________________________________________________________________
inline Int_t findBinWithinRange(const TAxis* axis, Double_t value)
{
  Int_t bin = axis->FindFixBin(value);
  if (bin <= 0)
    bin = 1;
  if (bin > axis->GetNbins())
    bin = axis->GetNbins();
  
  return bin;
}


//____________________________________________________________________________________________________________________
Double_t linearInterpolation(const TH1* h, Double_t x, Double_t scaleFactor, Double_t shift, Double_t* error)
{  
  // Do linear interpolation between 2 bins to handle non-integer values of the shift parameters.
  // The shift also introduces some uncertainty, which is rather hard to estimate. Therefore, just take the maximum error of the involved bins.
  const Double_t xShifted = x - shift;

  // Just take value of bin, if beyond center of first/last bin
  if (xShifted <= h->GetBinCenter(1)) {
    if (error)
      *error = h->GetBinError(1) * scaleFactor;
    return h->GetBinContent(1) * scaleFactor;
  }
  else if(xShifted >= h->GetBinCenter(h->GetNbinsX())) {
    if (error)
      *error = h->GetBinError(h->GetNbinsX()) * scaleFactor;
    return h->GetBinContent(h->GetNbinsX()) * scaleFactor;
  }
  else {
    const Int_t xbin = h->FindFixBin(xShifted);
    Double_t x0, x1, y0, y1;
    
    if(xShifted <= h->GetBinCenter(xbin)) {
      y0 = h->GetBinContent(xbin - 1);
      x0 = h->GetBinCenter(xbin - 1);
      y1 = h->GetBinContent(xbin);
      x1 = h->GetBinCenter(xbin);
      
      if (error)
        *error = TMath::Max(h->GetBinError(xbin - 1), h->GetBinError(xbin)) * scaleFactor;
    } 
    else {
      y0 = h->GetBinContent(xbin);
      x0 = h->GetBinCenter(xbin);
      y1 = h->GetBinContent(xbin + 1);
      x1 = h->GetBinCenter(xbin + 1);
      
      if (error)
        *error = TMath::Max(h->GetBinError(xbin), h->GetBinError(xbin + 1)) * scaleFactor;
    }
    
    return scaleFactor * (y0 + (xShifted - x0) * ((y1 - y0) / (x1 - x0)));
  }
  
  return 0;
      
  /*Old version available for code bevor 03.05.2013*/
}


//____________________________________________________________________________________________________________________
void shiftHist(TH1D* h, Double_t shift, Bool_t useRegularisation = kFALSE)
{
  // Shift not available for regularisation. Just for convenience (can use the same code and only set one flag)
  // call this functions and then do nothing.
  // Actually, the shift is not availabe for simultaneous fitting also, but the parameter is just set to 0 there
  if (!h || useRegularisation)
    return;
  
  TString name = h->GetName();
  TH1D* hTemp = (TH1D*)h->Clone(Form("%s_clone", name.Data()));
  h->Reset();
  
  Double_t error = 0;
  for (Int_t i = 1; i <= h->GetNbinsX(); i++) {
    // linearInterpolation with scaleFactor = 1.0, since histo is assumed to be properly scaled
    h->SetBinContent(i,  linearInterpolation(hTemp, h->GetXaxis()->GetBinCenter(i), 1.0, shift, &error));
    h->SetBinError(i, error);
  }
  
  delete hTemp;
}


//____________________________________________________________________________________________________________________
Double_t multiGaussFitForSimultaneousFitting(const Double_t *xx, const Double_t *par, const Int_t offset)
{
  // Offset for reference histos for delta_Species
  AliTPCPIDmathFit* mathFit = AliTPCPIDmathFit::Instance();
  
  // parXbinIndex (fixed) will be used my mathfit to hold the pT bin index (needed for regularisation)
  const Int_t xBinIndex = mathFit->GetXbinIndex();
  const Int_t numParsPerXbin = mathFit->GetNumParametersPerXbin();
  
  const Int_t numRefHistosPerFit = numSimultaneousFits + (takeIntoAccountMuons ? 1 : 0);
  const Int_t numRefHistosPerXbin = numRefHistosPerFit * numSimultaneousFits;
  
  const Int_t refHistOffset = offset * numRefHistosPerFit + xBinIndex * numRefHistosPerXbin;
  
  const TH1* hRefPi = mathFit->GetRefHisto(0 + refHistOffset);
  const TH1* hRefKa = mathFit->GetRefHisto(1 + refHistOffset);
  const TH1* hRefPr = mathFit->GetRefHisto(2 + refHistOffset);
  const TH1* hRefEl = mathFit->GetRefHisto(3 + refHistOffset);
  const TH1* hRefMu = takeIntoAccountMuons ? mathFit->GetRefHisto(4 + refHistOffset) : 0x0;
  
  if (!hRefEl || !hRefKa || !hRefPi || !hRefPr)
    return 0;
  
  if (takeIntoAccountMuons && !hRefMu)
    return 0;
  
  const Int_t parOffset = xBinIndex * numParsPerXbin;
  const Int_t parPi = 0 + parOffset;
  const Int_t parKa = 1 + parOffset;
  const Int_t parPr = 2 + parOffset;
  const Int_t parEl = 3 + parOffset;
  const Int_t parMu = 4 + parOffset;
  const Int_t parAll = 5 + parOffset;
  
  const Double_t scaleFactorPi = par[parAll] * (par[parPi] + (muonContamination ? par[parEl] : 0));
  const Double_t scaleFactorKa = par[parAll] * par[parKa];
  const Double_t scaleFactorPr = par[parAll] * par[parPr];
  const Double_t parElFraction = (par[parEl] < 0) ? GetElectronFraction(-par[parEl], par) : par[parEl];
  const Double_t scaleFactorEl = par[parAll] * parElFraction;
  // Fix muon fraction to electron fraction (or some modified electron fraction) if desired, i.e. corresponding par < 0
  const Double_t scaleFactorMu = (par[parMu] < 0)
                                    ? (par[parAll] * GetMuonFractionFromElectronFractionAndPt(-par[parMu], parElFraction)) 
                                    : (par[parAll] * par[parMu]);
  
  // Since one is looking at the same deltaSpecies for all considered species, the reference histograms have the same axes
  // => Only need to search for the bin once
  const Int_t binWithinRange = findBinWithinRange(hRefPi->GetXaxis(), xx[0]);
  const Double_t countPi = scaleFactorPi * hRefPi->GetBinContent(binWithinRange);
  const Double_t countKa = scaleFactorKa * hRefKa->GetBinContent(binWithinRange);
  const Double_t countPr = scaleFactorPr * hRefPr->GetBinContent(binWithinRange);
  const Double_t countEl = scaleFactorEl * hRefEl->GetBinContent(binWithinRange);
  const Double_t countMu = takeIntoAccountMuons ? scaleFactorMu * hRefMu->GetBinContent(binWithinRange) : 0;
  
  const Double_t res = countPi + countKa + countPr + countEl + countMu;
  
  
  return res;
}


//____________________________________________________________________________________________________________________
inline Double_t multiGaussFitDeltaPi(const Double_t *xx, const Double_t *par)
{
  return multiGaussFitForSimultaneousFitting(xx, par, 0);
}

//____________________________________________________________________________________________________________________
inline Double_t multiGaussFitDeltaKa(const Double_t *xx, const Double_t *par)
{
  return multiGaussFitForSimultaneousFitting(xx, par, 1);
}

//____________________________________________________________________________________________________________________
inline Double_t multiGaussFitDeltaPr(const Double_t *xx, const Double_t *par)
{
  return multiGaussFitForSimultaneousFitting(xx, par, 2);
}

//____________________________________________________________________________________________________________________
inline Double_t multiGaussFitDeltaEl(const Double_t *xx, const Double_t *par)
{
  return multiGaussFitForSimultaneousFitting(xx, par, 3);
}


//____________________________________________________________________________________________________________________
Double_t multiGaussFit(const Double_t *xx, const Double_t *par)
{
  AliTPCPIDmathFit* mathFit = AliTPCPIDmathFit::Instance();
  const TH1* hRefPi = mathFit->GetRefHisto(0);
  const TH1* hRefKa = mathFit->GetRefHisto(1);
  const TH1* hRefPr = mathFit->GetRefHisto(2);
  const TH1* hRefEl = mathFit->GetRefHisto(3);
  const TH1* hRefMu = takeIntoAccountMuons ? mathFit->GetRefHisto(4) : 0x0;
  
  if (!hRefEl || !hRefKa || !hRefPi || !hRefPr)
    return 0;
  
  if (takeIntoAccountMuons && !hRefMu)
    return 0;  
  
  // Do linear interpolation between 2 bins to handle non-integer values of the shift parameters
  const Double_t scaleFactorPi = par[5] * (par[0] + (muonContamination ? par[3] : 0));
  const Double_t scaleFactorKa = par[5] * par[1];
  const Double_t scaleFactorPr = par[5] * par[2];
  const Double_t parElFraction = (par[3] < 0) ? GetElectronFraction(-par[3], par) : par[3];
  const Double_t scaleFactorEl = par[5] * parElFraction;
  // Fix muon fraction to electron fraction (or some modified electron fraction) if desired, i.e. corresponding par < 0
  const Double_t scaleFactorMu = (par[4] < 0)
                                    ? (par[5] * GetMuonFractionFromElectronFractionAndPt(-par[4], parElFraction)) 
                                    : (par[5] * par[4]);

  const Double_t countPi = linearInterpolation(hRefPi, xx[0], scaleFactorPi, par[6], 0x0);
  const Double_t countKa = linearInterpolation(hRefKa, xx[0], scaleFactorKa, par[7], 0x0);
  const Double_t countPr = linearInterpolation(hRefPr, xx[0], scaleFactorPr, par[8], 0x0);
  const Double_t countEl = linearInterpolation(hRefEl, xx[0], scaleFactorEl, par[9], 0x0);
  const Double_t countMu = takeIntoAccountMuons ? linearInterpolation(hRefMu, xx[0], scaleFactorMu, par[10], 0x0) : 0;
  
  const Double_t res = countPi + countKa + countPr + countEl + countMu;
  
  /*
  const Double_t countPi = linearInterpolation(hRefPi, xx[0], par[6], 0x0);
  const Double_t countKa = linearInterpolation(hRefKa, xx[0], par[7], 0x0);
  const Double_t countPr = linearInterpolation(hRefPr, xx[0], par[8], 0x0);
  const Double_t countEl = linearInterpolation(hRefEl, xx[0], par[9], 0x0);
  const Double_t countMu = takeIntoAccountMuons ? linearInterpolation(hRefMu, xx[0], par[10], 0x0) : 0; 
  
  const Double_t res = par[5] * ((par[0] + (muonContamination ? par[3] : 0)) * countPi + par[1] * countKa 
                                 + par[2] * countPr + par[3] * countEl + par[4] * countMu);

  */
  
  return res;
}


//____________________________________________________________________________________________________________________
Double_t errorOfFitHistosForSimultaneousFitting(const Double_t *xx, const Double_t *par, const Int_t offset)
{
  AliTPCPIDmathFit* mathFit = AliTPCPIDmathFit::Instance();
  
  Double_t summedError = 0;
  
  // parXbinIndex (fixed) will be used my mathfit to hold the pT bin index (needed for regularisation)
  const Int_t xBinIndex = mathFit->GetXbinIndex();
  const Int_t numParsPerXbin = mathFit->GetNumParametersPerXbin();
  
  const Int_t numRefHistosPerFit = numSimultaneousFits + (takeIntoAccountMuons ? 1 : 0);
  const Int_t numRefHistosPerXbin = numRefHistosPerFit * numSimultaneousFits;
  
  const Int_t refHistOffset = offset * numRefHistosPerFit + xBinIndex * numRefHistosPerXbin;
  
  const TH1* hRefPi = mathFit->GetRefHisto(0 + refHistOffset);
  const TH1* hRefKa = mathFit->GetRefHisto(1 + refHistOffset);
  const TH1* hRefPr = mathFit->GetRefHisto(2 + refHistOffset);
  const TH1* hRefEl = mathFit->GetRefHisto(3 + refHistOffset);
  const TH1* hRefMu = takeIntoAccountMuons ? 
                        mathFit->GetRefHisto(4 + refHistOffset) 
                        : 0x0;
  
  if (!hRefEl || !hRefKa || !hRefPi || !hRefPr)
    return 0;
  
  if (takeIntoAccountMuons && !hRefMu)
    return 0;
  
  const Int_t parOffset = xBinIndex * numParsPerXbin;
  const Int_t parPi = 0 + parOffset;
  const Int_t parKa = 1 + parOffset;
  const Int_t parPr = 2 + parOffset;
  const Int_t parEl = 3 + parOffset;
  const Int_t parMu = 4 + parOffset;
  const Int_t parAll = 5 + parOffset;
  
  const Double_t scaleFactorPi = par[parAll] * (par[parPi] + (muonContamination ? par[parEl] : 0));
  const Double_t scaleFactorKa = par[parAll] * par[parKa];
  const Double_t scaleFactorPr = par[parAll] * par[parPr];
  const Double_t scaleFactorEl = par[parAll] * ((par[parEl] < 0) ? GetElectronFraction(-par[parEl], par) : par[parEl]);
  // Fix muon fraction to electron fraction (or some modified electron fraction) if desired, i.e. corresponding par < 0
  const Double_t scaleFactorMu = (par[parMu] < 0) ? 
                                    (scaleFactorEl * GetMuonFractionFromElectronFractionAndPt(-par[parMu], par[parEl]) / par[parEl]) 
                                    : (par[parAll] * par[parMu]);
  
  Double_t errorPi = 0, errorKa = 0, errorPr = 0, errorEl = 0, errorMu = 0;

  // Do linear interpolation between 2 bins to handle non-integer values of the shift parameters
  // Shift not implemented for simultaneous fit -> Just set all corresponding parameters to zero
  linearInterpolation(hRefPi, xx[0], scaleFactorPi, 0, &errorPi);
  linearInterpolation(hRefKa, xx[0], scaleFactorKa, 0, &errorKa);
  linearInterpolation(hRefPr, xx[0], scaleFactorPr, 0, &errorPr);
  linearInterpolation(hRefEl, xx[0], scaleFactorEl, 0, &errorEl);
  if (takeIntoAccountMuons)
    linearInterpolation(hRefMu, xx[0], scaleFactorMu, 0, &errorMu);
  
  summedError += TMath::Power(errorPi, 2);
  summedError += TMath::Power(errorKa, 2);
  summedError += TMath::Power(errorPr, 2);
  summedError += TMath::Power(errorEl, 2);
  if (takeIntoAccountMuons)
    summedError += TMath::Power(errorMu, 2);
  
  return summedError;
}


//____________________________________________________________________________________________________________________
inline Double_t errorOfFitHistosDeltaPi(const Double_t *xx, const Double_t *par)
{
  return errorOfFitHistosForSimultaneousFitting(xx, par, 0);
}


//____________________________________________________________________________________________________________________
inline Double_t errorOfFitHistosDeltaKa(const Double_t *xx, const Double_t *par)
{
  return errorOfFitHistosForSimultaneousFitting(xx, par, 1);
}


//____________________________________________________________________________________________________________________
inline Double_t errorOfFitHistosDeltaPr(const Double_t *xx, const Double_t *par)
{
  return errorOfFitHistosForSimultaneousFitting(xx, par, 2);
}


//____________________________________________________________________________________________________________________
inline Double_t errorOfFitHistosDeltaEl(const Double_t *xx, const Double_t *par)
{
  return errorOfFitHistosForSimultaneousFitting(xx, par, 3);
}


//____________________________________________________________________________________________________________________
Double_t errorOfFitHistos(const Double_t *xx, const Double_t *par)
{
  //TODO Error of shift is still not taken into account
  AliTPCPIDmathFit* mathFit = AliTPCPIDmathFit::Instance();
  
  Double_t summedError = 0;
  
  const TH1* hRefPi = mathFit->GetRefHisto(0);
  const TH1* hRefKa = mathFit->GetRefHisto(1);
  const TH1* hRefPr = mathFit->GetRefHisto(2);
  const TH1* hRefEl = mathFit->GetRefHisto(3);
  const TH1* hRefMu = takeIntoAccountMuons ? mathFit->GetRefHisto(4) : 0x0;

  if (!hRefEl || !hRefKa || !hRefPi || !hRefPr)
    return 0;

  if (takeIntoAccountMuons && !hRefMu)
    return 0;
  
  // Do linear interpolation between 2 bins to handle non-integer values of the shift parameters
  const Double_t scaleFactorPi = par[5] * (par[0] + (muonContamination ? par[3] : 0));
  const Double_t scaleFactorKa = par[5] * par[1];
  const Double_t scaleFactorPr = par[5] * par[2];
  const Double_t scaleFactorEl = par[5] * ((par[3] < 0) ? GetElectronFraction(-par[3], par) : par[3]);
  // Fix muon fraction to electron fraction (or some modified electron fraction) if desired, i.e. corresponding par < 0
  const Double_t scaleFactorMu = (par[4] < 0) ? (scaleFactorEl * GetMuonFractionFromElectronFractionAndPt(-par[4], par[3]) / par[3]) 
                                              : (par[5] * par[4]);
  
  Double_t errorPi = 0, errorKa = 0, errorPr = 0, errorEl = 0, errorMu = 0;

  linearInterpolation(hRefPi, xx[0], scaleFactorPi, par[6], &errorPi);
  linearInterpolation(hRefKa, xx[0], scaleFactorKa, par[7], &errorKa);
  linearInterpolation(hRefPr, xx[0], scaleFactorPr, par[8], &errorPr);
  linearInterpolation(hRefEl, xx[0], scaleFactorEl, par[9], &errorEl);
  if (takeIntoAccountMuons)
    linearInterpolation(hRefMu, xx[0], scaleFactorMu, par[10], &errorMu); // Assume same fraction as electron, i.e. same scale factor
  
  summedError += TMath::Power(errorPi, 2);
  summedError += TMath::Power(errorKa, 2);
  summedError += TMath::Power(errorPr, 2);
  summedError += TMath::Power(errorEl, 2);
  if (takeIntoAccountMuons)
    summedError += TMath::Power(errorMu, 2);

      
  /*
  for (Int_t index = 0; index < mathFit->GetNrefHistos(); index++)   {
    TH1* HREF = mathFit->GetRefHisto(index);
    Int_t bin = findBinWithinRange(HREF->GetXaxis(), xx[0]);
    summedError += TMath::Power(HREF->GetBinError(bin) * par[index] * par[mathFit->GetNrefHistos()], 2);
  }
  */
  return summedError;
}


//____________________________________________________________________________________________________________________
inline Double_t saveDivide(Double_t numerator, Double_t denominator) 
{
  return ((denominator != 0) ? numerator/denominator : 0 );
}


//____________________________________________________________________________________________________________________
Double_t getErrorOfPionIntegral(TMatrixDSym covMat)
{
  return TMath::Sqrt(covMat(0, 0) + covMat(12, 12) + 2 * covMat(0, 12));
}


//____________________________________________________________________________________________________________________
Double_t getErrorOfElectronFraction(Double_t* par, TMatrixDSym covMat) 
{
  Double_t g = saveDivide(par[3], (par[0] + par[1] + par[2] + 2 * par[3]));
  Double_t s1 = TMath::Power(g, 4) * (covMat(0, 0) + covMat(1, 1) + covMat(2, 2) + 4 * covMat(3, 3));
  Double_t s2 = TMath::Power(g, 2) * covMat(3, 3);
  Double_t s3 = (4 * TMath::Power(g, 4) - 2 * TMath::Power(g, 3)) * (covMat(3, 2) + covMat(3, 1) + covMat(3, 0));
  Double_t s4 = TMath::Power(g, 4) * 2 * (covMat(2, 1) + covMat(2, 0) +covMat(1, 0));
  
  return saveDivide(TMath::Sqrt(s1 + s2 + s3 + s4), par[3]);
}


//____________________________________________________________________________________________________________________
Double_t getErrorOfKaonFraction(Double_t* par, TMatrixDSym covMat) 
{
  Double_t g = saveDivide(par[1], (par[0] + par[1] + par[2] + 2 * par[3]));
  Double_t s1 = TMath::Power(g, 4) * (covMat(0, 0) + covMat(1, 1) + covMat(2, 2) + 4 * covMat(3, 3));
  Double_t s2 = TMath::Power(g, 2) * covMat(1, 1);
  Double_t s3 = TMath::Power(g, 4) * (4 * covMat(3, 0) + 4 * covMat(3, 2) + 4 * covMat(3, 1) +
                                      2 * covMat(2, 1) + 2 * covMat(2, 0) + 2 * covMat(1, 0));
  Double_t s4 = TMath::Power(g, 3) * ((-4) * covMat(3, 1) - 2 * covMat(2, 1) - 2 * covMat(1, 0));
  
  return saveDivide(TMath::Sqrt(s1 + s2 + s3 + s4), par[1]);
}


//____________________________________________________________________________________________________________________
Double_t getErrorOfPionFraction(Double_t* par, TMatrixDSym covMat) 
{
  Double_t g = saveDivide(par[0] + par[3], (par[0] + par[1] + par[2] + 2 * par[3]));
  Double_t s1 = TMath::Power(g, 4) * (covMat(0, 0) + covMat(1, 1) + covMat(2, 2) + 4 * covMat(3, 3));
  Double_t s2 = TMath::Power(g, 2) * (covMat(0, 0) + covMat(3, 3));
  Double_t s3 = TMath::Power(g, 4) * 2 * covMat(2, 1);
  Double_t s4 = (4 * TMath::Power(g, 4) - 2 * TMath::Power(g, 3)) * (covMat(3, 2) + covMat(3, 1));
  Double_t s5 = 2 * covMat(3, 0) * (2 * TMath::Power(g, 4) - 3 * TMath::Power(g, 3) + TMath::Power(g, 2));
  Double_t s6 = 2 * (covMat(2, 0) + covMat(1, 0)) * (TMath::Power(g, 4) - TMath::Power(g, 3));
  
  return saveDivide(TMath::Sqrt(s1 + s2 + s3 + s4 + s5 + s6), par[0] + par[3]);
}


//____________________________________________________________________________________________________________________
Double_t getErrorOfProtonFraction(Double_t* par, TMatrixDSym covMat) 
{
  Double_t g = saveDivide(par[2], (par[0] + par[2] + par[1] + 2 * par[3]));
  Double_t s1 = TMath::Power(g, 4) * (covMat(0, 0) + covMat(1, 1) + covMat(2, 2) + 4 * covMat(3, 3));
  Double_t s2 = TMath::Power(g, 2) * covMat(2, 2);
  Double_t s3 = TMath::Power(g, 4) * (4 * covMat(3, 0) + 4 * covMat(3, 2) + 4 * covMat(3, 1) +
                                      2 * covMat(2, 1) + 2 * covMat(2, 0) + 2 * covMat(1, 0));
  Double_t s4 = TMath::Power(g, 3) * ((-4) * covMat(3, 2) - 2 * covMat(2, 1) - 2 * covMat(2, 0));
  
  return saveDivide(TMath::Sqrt(s1 + s2 + s3 + s4), par[2]);
}


//____________________________________________________________________________________________________________________
Double_t getErrorOfTotalIntegral(TMatrixDSym covMat) 
{
  Double_t s1 = covMat(0, 0) + covMat(1, 1) + covMat(2, 2) + 4 * covMat(3, 3);
  Double_t s2 = 4 * (covMat(3, 0) + covMat(3, 1) + covMat(3, 2));
  Double_t s3 = 2 * (covMat(2, 1) + covMat(2, 0) + covMat(1, 0));

  return TMath::Sqrt(s1 + s2 + s3);
}


//____________________________________________________________________________________________________________________
Double_t getMedianOfNonZeros(Double_t input[4])
{
  Double_t values[4] = {0,0,0,0};
  Int_t numNonZero = 0;
  if (input[0] > 0)  {
    values[numNonZero] = input[0];
    numNonZero++;
  }
  if (input[1] > 0)  {
    values[numNonZero] = input[1];
    numNonZero++;
  }
  if (input[2] > 0)  {
    values[numNonZero] = input[2];
    numNonZero++;
  }
  if (input[3] > 0)  {
    values[numNonZero] = input[3];
    numNonZero++;
  }
       
  return ((numNonZero > 0) ? TMath::Median(numNonZero, values) : 0);
}


//____________________________________________________________________________________________________________________
TCanvas* drawFractionHistos(TString canvName, TString canvTitle, Int_t mode, Double_t pLow, Double_t pHigh, 
                            TH1* histDeltaPion, TH1* histDeltaElectron, TH1* histDeltaKaon, TH1* histDeltaProton, TH1* histMC,
                            Bool_t plotIdentifiedSpectra)
{
  TCanvas* canv = new TCanvas(canvName.Data(), canvTitle.Data(),100,10,1200,800);
  canv->SetGridx(1);
  canv->SetGridy(1);
  canv->SetLogx(mode == kPMpT);
  histDeltaPion->GetYaxis()->SetRangeUser(0.0, 1.0);
  histDeltaPion->GetYaxis()->SetTitle(canvTitle.Data());
  SetReasonableAxisRange(histDeltaPion->GetXaxis(), mode, pLow, pHigh);
  histDeltaPion->SetMarkerStyle(20);
  histDeltaPion->GetXaxis()->SetMoreLogLabels(kTRUE);
  histDeltaPion->GetXaxis()->SetNoExponent(kTRUE);
  histDeltaPion->Draw("e p");
  histDeltaElectron->GetYaxis()->SetTitle(canvTitle.Data());
  SetReasonableAxisRange(histDeltaElectron->GetXaxis(), mode, pLow, pHigh);
  histDeltaElectron->SetMarkerStyle(21);
  histDeltaElectron->Draw("e p same");
  histDeltaKaon->GetYaxis()->SetTitle(canvTitle.Data());
  SetReasonableAxisRange(histDeltaKaon->GetXaxis(), mode, pLow, pHigh);
  histDeltaKaon->SetMarkerStyle(22);
  histDeltaKaon->Draw("e p same");
  histDeltaProton->GetYaxis()->SetTitle(canvTitle.Data());
  SetReasonableAxisRange(histDeltaProton->GetXaxis(), mode, pLow, pHigh);
  histDeltaProton->SetMarkerStyle(29);
  histDeltaProton->Draw("e p same");
  if (plotIdentifiedSpectra) {
    histMC->GetYaxis()->SetTitle(canvTitle.Data());
    SetReasonableAxisRange(histMC->GetXaxis(), mode, pLow, pHigh);
    histMC->SetMarkerStyle(24);
    histMC->Draw("e p same");
  }
  
  TLegend* legend = new TLegend(0.622126, 0.605932, 0.862069, 0.855932);    
  legend->SetBorderSize(0);
  legend->SetFillColor(0);
  legend->AddEntry(histDeltaPion, Form("#Delta%s", useDeltaPrime ? "'_{#lower[-0.5]{#pi}}" : "_{#pi}"), "p");
  legend->AddEntry(histDeltaElectron, Form("#Delta%s", useDeltaPrime ? "'_{#lower[-0.5]{e}}" : "_{e}"), "p");
  legend->AddEntry(histDeltaKaon, Form("#Delta%s", useDeltaPrime ? "'_{#lower[-0.5]{K}}" : "_{K}"), "p");
  legend->AddEntry(histDeltaProton, Form("#Delta%s", useDeltaPrime ? "'_{#lower[-0.5]{p}}" : "_{p}"), "p");
  if (plotIdentifiedSpectra)
    legend->AddEntry(histMC, identifiedLabels[isMC].Data(), "p");
  legend->SetEntrySeparation(0.2);
  legend->Draw();
  
  ClearTitleFromHistoInCanvas(canv);
  
  return canv;
}


//____________________________________________________________________________________________________________________
TCanvas* drawYieldHistos(TString canvName, TString canvTitle, Int_t mode, Double_t pLow, Double_t pHigh, 
                         TH1* histDeltaPion, TH1* histDeltaElectron, TH1* histDeltaKaon, TH1* histDeltaProton, TH1* histMC,
                         Bool_t plotIdentifiedSpectra)
{
  TCanvas* canv = new TCanvas(canvName.Data(), canvTitle.Data(),100,10,1200,800);
  canv->SetGridx(1);
  canv->SetGridy(1);
  canv->SetLogx(mode == kPMpT);
  canv->SetLogy(1);
  histDeltaPion->GetYaxis()->SetRangeUser(histDeltaPion->GetBinContent(histDeltaPion->FindLastBinAbove(0.)) / 10.,
                                          histDeltaPion->GetBinContent(histDeltaPion->GetMaximumBin()) * 10.);
  histDeltaPion->GetYaxis()->SetTitle(canvTitle.Data());
  SetReasonableAxisRange(histDeltaPion->GetXaxis(), mode, pLow, pHigh);
  histDeltaPion->SetMarkerStyle(20);
  histDeltaPion->GetXaxis()->SetMoreLogLabels(kTRUE);
  histDeltaPion->GetXaxis()->SetNoExponent(kTRUE);
  histDeltaPion->Draw("e p");
  histDeltaElectron->GetYaxis()->SetTitle(canvTitle.Data());
  SetReasonableAxisRange(histDeltaElectron->GetXaxis(), mode, pLow, pHigh);
  histDeltaElectron->SetMarkerStyle(21);
  histDeltaElectron->Draw("e p same");
  histDeltaKaon->GetYaxis()->SetTitle(canvTitle.Data());
  SetReasonableAxisRange(histDeltaKaon->GetXaxis(), mode, pLow, pHigh);
  histDeltaKaon->SetMarkerStyle(22);
  histDeltaKaon->Draw("e p same");
  histDeltaProton->GetYaxis()->SetTitle(canvTitle.Data());
  SetReasonableAxisRange(histDeltaProton->GetXaxis(), mode, pLow, pHigh);
  histDeltaProton->SetMarkerStyle(29);
  histDeltaProton->Draw("e p same");
  if (plotIdentifiedSpectra) {
    histMC->GetYaxis()->SetTitle(canvTitle.Data());
    SetReasonableAxisRange(histMC->GetXaxis(), mode, pLow, pHigh);
    histMC->SetMarkerStyle(24);
    histMC->Draw("e p same");
  }
  
  TLegend* legend = new TLegend(0.622126, 0.605932, 0.862069, 0.855932);    
  legend->SetBorderSize(0);
  legend->SetFillColor(0);
  
  legend->AddEntry(histDeltaPion, Form("#Delta%s", useDeltaPrime ? "'_{#lower[-0.5]{#pi}}" : "_{#pi}"), "p");
  legend->AddEntry(histDeltaElectron, Form("#Delta%s", useDeltaPrime ? "'_{#lower[-0.5]{e}}" : "_{e}"), "p");
  legend->AddEntry(histDeltaKaon, Form("#Delta%s", useDeltaPrime ? "'_{#lower[-0.5]{K}}" : "_{K}"), "p");
  legend->AddEntry(histDeltaProton, Form("#Delta%s", useDeltaPrime ? "'_{#lower[-0.5]{p}}" : "_{p}"), "p");
  if (plotIdentifiedSpectra)
    legend->AddEntry(histMC, identifiedLabels[isMC].Data(), "p");
  legend->SetEntrySeparation(0.2);
  legend->Draw();
  
  ClearTitleFromHistoInCanvas(canv);
  
  return canv;
}


//____________________________________________________________________________________________________________________
Int_t doSimultaneousFitRegularised(Int_t nPar, Double_t* gausParams, Double_t* parameterErrorsOut, Double_t* covMatrix,
                                   Double_t* stepSize, Double_t* lowParLimits, Double_t* upParLimits, Double_t& reducedChiSquare)
{
  AliTPCPIDmathFit* mathFit = AliTPCPIDmathFit::Instance();
  
  Double_t chiSquare = -999;
  Int_t ndf = -1;
  
  AliTPCPIDmathFit::FitFunc_t* multiGaussFitArray = new AliTPCPIDmathFit::FitFunc_t[numSimultaneousFits];
  multiGaussFitArray[0] = multiGaussFitDeltaPi;  
  multiGaussFitArray[1] = multiGaussFitDeltaKa;  
  multiGaussFitArray[2] = multiGaussFitDeltaPr;  
  multiGaussFitArray[3] = multiGaussFitDeltaEl;  
  
  AliTPCPIDmathFit::FitFunc_t* errorOfFitHistosArray = new AliTPCPIDmathFit::FitFunc_t[numSimultaneousFits];
  errorOfFitHistosArray[0] = errorOfFitHistosDeltaPi;  
  errorOfFitHistosArray[1] = errorOfFitHistosDeltaKa;  
  errorOfFitHistosArray[2] = errorOfFitHistosDeltaPr;  
  errorOfFitHistosArray[3] = errorOfFitHistosDeltaEl;  
  
  //TODO errorFunction for bin errors of fit histos?  
  Int_t errFlag = mathFit->MinuitFit(multiGaussFitArray, 0x0, nPar, gausParams, parameterErrorsOut, covMatrix, 
                                     chiSquare, ndf, stepSize, lowParLimits, upParLimits);
  //Int_t errFlag = mathFit->MinuitFit(multiGaussFitArray, errorOfFitHistosArray, nPar, gausParams, parameterErrorsOut, covMatrix, 
  //                                   chiSquare, ndf, stepSize, lowParLimits, upParLimits);
  
  std::cout << std::endl;
  
  for (Int_t xBin = 0; xBin < mathFit->GetNumXbinsRegularisation(); xBin++) {
    std::cout << "x bin " << xBin << ":" << std::endl;
    
    Double_t sumFractions = 0;
    
    for (Int_t parIndex = xBin * mathFit->GetNumParametersPerXbin(); parIndex < (xBin + 1) * mathFit->GetNumParametersPerXbin();
         parIndex++) {
      Int_t parIndexModulo = parIndex % mathFit->GetNumParametersPerXbin();
    
      // NOTE: Covariance matrix is NOT set. But this doesn't matter since the parameter is fixed anyway, so
      // the error from the matrix would be zero.
      // parIndexModulo = 4 means muons, parIndexModulo = 3 means electrons, i.e. if parIndexModulo corresponds to muons,
      // then parIndexModulo - 1 corresponds to electrons.
      
      // Set electron fraction to value evaluated from a function above some threshold.
      // Fixed electron fraction < 0 does this job within the fitting functions
      if (parIndexModulo == 3 && gausParams[parIndex] < 0) {
        gausParams[parIndex]         = GetElectronFraction(-gausParams[parIndex], &gausParams[0]);
        parameterErrorsOut[parIndex] = GetElectronFractionError();
      }
      // Set muon fraction equal to electron fraction (or some modified electron fraction) above some threshold,
      // which should be a reasonable approximation:
      // Fixed muon fraction < 0 does this job within the fitting functions
      else if (parIndexModulo == 4 && gausParams[parIndex] < 0) {
        gausParams[parIndex]         = GetMuonFractionFromElectronFractionAndPt(-gausParams[parIndex], gausParams[parIndex - 1]);
        parameterErrorsOut[parIndex] = parameterErrorsOut[parIndex - 1];
      }      
      
      
      std::cout << "par[" << parIndex << "]: " << gausParams[parIndex] << " +- " << parameterErrorsOut[parIndex] << std::endl;
    
    if (parIndexModulo <= 3 || ((muonContamination || takeIntoAccountMuons) && parIndexModulo == 4))
      sumFractions += gausParams[parIndex];
    }
    
    std::cout << "Sum of fractions" << (muonContamination || takeIntoAccountMuons ? "(including muon contamination)" : "") << ": "
              << sumFractions; std::cout << std::endl;
    std::cout << std::endl << std::endl;
  }
  
  if (errFlag == 0) 
    std::cout << std::endl << "***Fit operation completed successfully***" << std::endl << std::endl;
  else
    std::cout << std::endl << "***Fit operation completed, but with errors***" << std::endl << std::endl;
  
  reducedChiSquare = (ndf > 0) ? chiSquare / ndf : -1;
  
  return errFlag;
}      


//____________________________________________________________________________________________________________________
Int_t doSimultaneousFit(TH1D** hDelta, Double_t xLow, Double_t xUp, Int_t nPar, Double_t* gausParams, Double_t* parameterErrorsOut, 
                        Double_t* covMatrix, Double_t* stepSize, Double_t* lowParLimits, Double_t* upParLimits, Double_t& 
                        reducedChiSquare)
{
  AliTPCPIDmathFit* mathFit = AliTPCPIDmathFit::Instance();
  
  Double_t chiSquare = -999;
  Int_t ndf = -1;
  
  //TODO:
  // Using no error on x (next TODO line) and no errorFunction (next after next TODO line) sometimes gives good results.
  // However, it can completely fail for low statistics for the fit histos.
  // Using either an error on x or the errorFunction both gives reasonable results, but might be slightly worse results in some cases
  // (shifted/distorted data). Maybe: Choose one method - the rest is for systematic errors of this fitting
  
  //TODO The next TODO marks are only relevant for chiSquare, but not for loglikelihood
  //TODO Use error in x also -> If reference histos have low statistics, this will be very important
  
  for (Int_t i = 0; i < numSimultaneousFits; i++) {
    mathFit->InputData(hDelta[i], 0, i, xLow, xUp, -1., kFALSE); 
    //mathFit->InputData(hDelta[i], 0, i, xLow, xUp, -1., kTRUE); 
  }
  
  AliTPCPIDmathFit::FitFunc_t* multiGaussFitArray = new AliTPCPIDmathFit::FitFunc_t[numSimultaneousFits];
  multiGaussFitArray[0] = multiGaussFitDeltaPi;  
  multiGaussFitArray[1] = multiGaussFitDeltaKa;  
  multiGaussFitArray[2] = multiGaussFitDeltaPr;  
  multiGaussFitArray[3] = multiGaussFitDeltaEl;  
  
  AliTPCPIDmathFit::FitFunc_t* errorOfFitHistosArray = new AliTPCPIDmathFit::FitFunc_t[numSimultaneousFits];
  errorOfFitHistosArray[0] = errorOfFitHistosDeltaPi;  
  errorOfFitHistosArray[1] = errorOfFitHistosDeltaKa;  
  errorOfFitHistosArray[2] = errorOfFitHistosDeltaPr;  
  errorOfFitHistosArray[3] = errorOfFitHistosDeltaEl;  
  
  //TODO errorFunction for bin errors of fit histos?  
  Int_t errFlag = mathFit->MinuitFit(multiGaussFitArray, 0x0, nPar, gausParams, parameterErrorsOut, covMatrix, 
                                     chiSquare, ndf, stepSize, lowParLimits, upParLimits);
  //Int_t errFlag = mathFit->MinuitFit(multiGaussFitArray, errorOfFitHistosArray, nPar, gausParams, parameterErrorsOut, covMatrix, 
  //                                   chiSquare, ndf, stepSize, lowParLimits, upParLimits);
  
  std::cout << std::endl;
  
  // If the electron fraction is fixed, evaluate the error of the extrapolation of the fixed value
  if (TMath::Abs(lowParLimits[3] - upParLimits[3]) < epsilon) {
    // NOTE: Covariance matrix is NOT set. But this doesn't matter since the parameter is fixed anyway, so
    // the error from the matrix would be zero
    parameterErrorsOut[3] = GetElectronFractionError();
  }
  
  // Set muon fraction equal to electron fraction (or some modified electron fraction) above some threshold,
  // which should be a reasonable approximation:
  // Fixed muon fraction < 0 does this job within the fitting functions
  if (gausParams[4] < 0 ) {
    // NOTE: Covariance matrix is NOT set. But this doesn't matter since the parameter is fixed anyway, so
    // the error from the matrix would be zero
    gausParams[4] = GetMuonFractionFromElectronFractionAndPt(-gausParams[4], gausParams[3]);
    parameterErrorsOut[4] = parameterErrorsOut[3];
  }
  
  Double_t sumFractions = 0;
  for (Int_t parIndex = 0; parIndex < nPar; parIndex++) {
    std::cout << "par[" << parIndex << "]: " << gausParams[parIndex] << " +- " << parameterErrorsOut[parIndex] << std::endl;
  }
  sumFractions = gausParams[0] + gausParams[1] + gausParams[2] + gausParams[3];
  // In case of muon contamination add muon fraction also
  if (muonContamination || takeIntoAccountMuons) {
    sumFractions += gausParams[4];
  }
  
  std::cout << "Sum of fractions" << (muonContamination || takeIntoAccountMuons ? "(including muon contamination)" : "") << ": " << sumFractions; std::cout << std::endl;
  
  if (errFlag == 0) 
    std::cout << std::endl << "***Fit operation completed successfully***" << std::endl << std::endl;
  else
    std::cout << std::endl << "***Fit operation completed, but with errors***" << std::endl << std::endl;
  
  reducedChiSquare = (ndf > 0) ? chiSquare / ndf : -1;
  
  return errFlag;
}        


//____________________________________________________________________________________________________________________
Int_t doFit(TH1D* hDelta, Double_t xLow, Double_t xUp, Int_t nPar, Double_t* gausParams, Double_t* parameterErrorsOut, Double_t* covMatrix,
            Double_t* stepSize, Double_t* lowParLimits, Double_t* upParLimits, TF1* totalDeltaSpecies, Double_t& reducedChiSquare)
{
  AliTPCPIDmathFit* mathFit = AliTPCPIDmathFit::Instance();
  
  Double_t chiSquare = -999;
  Int_t ndf = -1;
  
  //TODO:
  // Using no error on x (next TODO line) and no errorFunction (next after next TODO line) sometimes gives good results.
  // However, it can completely fail for low statistics for the fit histos.
  // Using either an error on x or the errorFunction both gives reasonable results, but might be slightly worse results in some cases
  // (shifted/distorted data). Maybe: Choose one method - the rest is for systematic errors of this fitting
  
  //TODO The next TODO marks are only relevant for chiSquare, but not for loglikelihood
  //TODO Use error in x also -> If reference histos have low statistics, this will be very important
  mathFit->InputData(hDelta, 0, 0, xLow, xUp, -1., kFALSE); 
  //mathFit->InputData(hDelta, 0, 0, xLow, xUp, -1., kTRUE); 
  
  AliTPCPIDmathFit::FitFunc_t* multiGaussFitArray = new AliTPCPIDmathFit::FitFunc_t[1];
  multiGaussFitArray[0] = multiGaussFit; 
  
  AliTPCPIDmathFit::FitFunc_t* errorOfFitHistosArray = new AliTPCPIDmathFit::FitFunc_t[1];
  errorOfFitHistosArray[0] = errorOfFitHistos;
  
  //TODO errorFunction for bin errors of fit histos?
  Int_t errFlag = mathFit->MinuitFit(multiGaussFitArray, 0x0, nPar, gausParams, parameterErrorsOut, covMatrix, 
                                     chiSquare, ndf, stepSize, lowParLimits, upParLimits);
  //Int_t errFlag = mathFit->MinuitFit(multiGaussFitArray, errorOfFitHistosArray, nPar, gausParams, parameterErrorsOut, covMatrix, 
  //                                   chiSquare, ndf, stepSize, lowParLimits, upParLimits);
  
  // If the electron fraction is fixed, evaluate the error of the extrapolation of the fixed value
  if (TMath::Abs(lowParLimits[3] - upParLimits[3]) < epsilon) {
    // NOTE: Covariance matrix is NOT set. But this doesn't matter since the parameter is fixed anyway, so
    // the error from the matrix would be zero
    parameterErrorsOut[3] = GetElectronFractionError();
  }
  
  // Set muon fraction equal to electron fraction (or some modified electron fraction) above some threshold, which should be a reasonable approximation:
  // Fixed muon fraction < 0 does this job within the fitting functions
  if (gausParams[4] < 0 ) {
    // NOTE: Covariance matrix is NOT set. But this doesn't matter since the parameter is fixed anyway, so
    // the error from the matrix would be zero
    gausParams[4] = GetMuonFractionFromElectronFractionAndPt(-gausParams[4], gausParams[3]);
    parameterErrorsOut[4] = parameterErrorsOut[3];
  }
  
  Double_t sumFractions = 0;
  for (Int_t parIndex = 0; parIndex < nPar; parIndex++) {
    std::cout << totalDeltaSpecies->GetParName(parIndex) << ": " << gausParams[parIndex] << " +- " << parameterErrorsOut[parIndex] << std::endl;
  }
  sumFractions = gausParams[0] + gausParams[1] + gausParams[2] + gausParams[3];
  // In case of muon contamination add muon fraction also
  if (muonContamination || takeIntoAccountMuons) {
    sumFractions += gausParams[4];
  }
  
  std::cout << "Sum of fractions" << (muonContamination || takeIntoAccountMuons ? "(including muon contamination)" : "") << ": " << sumFractions;
  std::cout << std::endl;
  
  if (errFlag == 0) 
    std::cout << std::endl << "***Fit operation completed successfully***" << std::endl << std::endl;
  else
    std::cout << std::endl << "***Fit operation completed, but with errors***" << std::endl << std::endl;
  
  for (Int_t parIndex = 0; parIndex < nPar; parIndex++) {
    totalDeltaSpecies->SetParameter(parIndex, gausParams[parIndex]);
    totalDeltaSpecies->SetParError(parIndex, parameterErrorsOut[parIndex]);
  }
  
  reducedChiSquare = (ndf > 0) ? chiSquare / ndf : -1;
  
  return errFlag;
}        


//____________________________________________________________________________________________________________________
Double_t setFractionsAndYields(Int_t slice, Double_t inverseBinWidth, Double_t binWidthFitHisto, Int_t species, Double_t* parametersOut, 
                               Double_t* parameterErrorsOut, TH1* hFractionSpecies, TH1* hFractionPionsDeltaSpecies, 
                               TH1* hFractionElectronsDeltaSpecies, TH1* hFractionKaonsDeltaSpecies, TH1* hFractionProtonsDeltaSpecies,
                               TH1* hFractionMuonsDeltaSpecies, TH1* hYieldSpecies, TH1* hYieldPionsDeltaSpecies,
                               TH1* hYieldElectronsDeltaSpecies, TH1* hYieldKaonsDeltaSpecies, TH1* hYieldProtonsDeltaSpecies,
                               TH1* hYieldMuonsDeltaSpecies, 
                               Bool_t normaliseFractions = kFALSE)
{
  // Set fraction and yields in corresponding histograms. If normaliseFractions is kTRUE, the fractions will be normalised to unity
  // and the normalisation factor will be returned (i.e. 1./sumFraction)
  
  Double_t normalisationFactor = 1.0;
  
  // Since a log likelihood fit is anyway used, the normalisation should give a factor close to unity
  if (normaliseFractions) {
    Double_t sumFractions = parametersOut[0] + (muonContamination ? parametersOut[3] : 0) + parametersOut[1] + parametersOut[2] +
                            parametersOut[3] + (takeIntoAccountMuons ? parametersOut[4] : 0.);
    if (sumFractions > 0) {
      normalisationFactor = 1./sumFractions;
      for (Int_t i = 0; i < 5; i++) {
        parametersOut[i] *= normalisationFactor;
        
        // Do not introduce an error for the normalisation, i.e. just scale parameters and fractions with the same factor which is 
        // assumed to be exact.
        // Note that correlations should already be included in the parameterError        
        parameterErrorsOut[i] *= normalisationFactor;
      }
    }
  }
  
  Double_t sumOfParticles = inverseBinWidth * parametersOut[5] / binWidthFitHisto; // Divide by binWidthFitHisto since parametersOut includes this width
  
  if (species == kPi) {
    hFractionSpecies->SetBinContent(slice + 1, (parametersOut[0]+(muonContamination ? parametersOut[3] : 0)));
    hFractionSpecies->SetBinError(slice + 1, parameterErrorsOut[0]);
  }
  else if (species == kEl) {
    hFractionSpecies->SetBinContent(slice + 1, parametersOut[3]);
    hFractionSpecies->SetBinError(slice + 1, parameterErrorsOut[3]);
  }
  else if (species == kKa) {    
    hFractionSpecies->SetBinContent(slice + 1, parametersOut[1]);
    hFractionSpecies->SetBinError(slice + 1, parameterErrorsOut[1]);
  }
  else if (species == kPr) {    
    hFractionSpecies->SetBinContent(slice + 1, parametersOut[2]);
    hFractionSpecies->SetBinError(slice + 1, parameterErrorsOut[2]);
  }
  else if (species == kMu) {
    if (takeIntoAccountMuons) {    
      hFractionSpecies->SetBinContent(slice + 1, parametersOut[4]);
      hFractionSpecies->SetBinError(slice + 1, parameterErrorsOut[4]);
      
      hYieldSpecies->SetBinContent(slice + 1, sumOfParticles * hFractionSpecies->GetBinContent(slice + 1));
      hYieldSpecies->SetBinError(slice + 1, sumOfParticles * hFractionSpecies->GetBinError(slice + 1));
    }
    
    // Only set these histos for muons. The DeltaSpecies histos for muons will be set together with all other species
    return normalisationFactor;
  }
  
  hFractionPionsDeltaSpecies->SetBinContent(slice + 1, (parametersOut[0]+(muonContamination ? parametersOut[3] : 0)));
  hFractionPionsDeltaSpecies->SetBinError(slice + 1, parameterErrorsOut[0]);//TODO What about error of parOut[3]?
  hFractionElectronsDeltaSpecies->SetBinContent(slice + 1, parametersOut[3]);
  hFractionElectronsDeltaSpecies->SetBinError(slice + 1, parameterErrorsOut[3]);
  hFractionKaonsDeltaSpecies->SetBinContent(slice + 1, parametersOut[1]);
  hFractionKaonsDeltaSpecies->SetBinError(slice + 1, parameterErrorsOut[1]);
  hFractionProtonsDeltaSpecies->SetBinContent(slice + 1, parametersOut[2]);
  hFractionProtonsDeltaSpecies->SetBinError(slice + 1, parameterErrorsOut[2]);
  if (takeIntoAccountMuons) {
    hFractionMuonsDeltaSpecies->SetBinContent(slice + 1, parametersOut[4]);
    hFractionMuonsDeltaSpecies->SetBinError(slice + 1, parameterErrorsOut[4]);
  }
  
  hYieldSpecies->SetBinContent(slice + 1, sumOfParticles * hFractionSpecies->GetBinContent(slice + 1));
  hYieldSpecies->SetBinError(slice + 1, sumOfParticles * hFractionSpecies->GetBinError(slice + 1));
  
  hYieldPionsDeltaSpecies->SetBinContent(slice + 1, sumOfParticles * hFractionPionsDeltaSpecies->GetBinContent(slice + 1));
  hYieldPionsDeltaSpecies->SetBinError(slice + 1, sumOfParticles * hFractionPionsDeltaSpecies->GetBinError(slice + 1));
  hYieldElectronsDeltaSpecies->SetBinContent(slice + 1, sumOfParticles * hFractionElectronsDeltaSpecies->GetBinContent(slice + 1));
  hYieldElectronsDeltaSpecies->SetBinError(slice + 1, sumOfParticles * hFractionElectronsDeltaSpecies->GetBinError(slice + 1));
  hYieldKaonsDeltaSpecies->SetBinContent(slice + 1, sumOfParticles * hFractionKaonsDeltaSpecies->GetBinContent(slice + 1));
  hYieldKaonsDeltaSpecies->SetBinError(slice + 1, sumOfParticles * hFractionKaonsDeltaSpecies->GetBinError(slice + 1));
  hYieldProtonsDeltaSpecies->SetBinContent(slice + 1, sumOfParticles * hFractionProtonsDeltaSpecies->GetBinContent(slice + 1));
  hYieldProtonsDeltaSpecies->SetBinError(slice + 1, sumOfParticles * hFractionProtonsDeltaSpecies->GetBinError(slice + 1));
  if (takeIntoAccountMuons) {
    hYieldMuonsDeltaSpecies->SetBinContent(slice + 1, sumOfParticles * hFractionMuonsDeltaSpecies->GetBinContent(slice + 1));
    hYieldMuonsDeltaSpecies->SetBinError(slice + 1, sumOfParticles * hFractionMuonsDeltaSpecies->GetBinError(slice + 1));
  }
  
  return normalisationFactor;
}

//____________________________________________________________________________________________________________________
Int_t PID(TString fileName, Double_t deta, Double_t pLow, Double_t pHigh, Bool_t isMCdataSet, Int_t fitMethod, 
          Int_t muonFractionHandlingParameter, //0 = no muons, 1 = muonFrac=elFrac,
                                               //2(3) = muonFrac/elFrac tuned on MC for StandardTrackCuts(HybridTrackCuts)
          Bool_t useIdentifiedGeneratedSpectra, Bool_t plotIdentifiedSpectra, Int_t mode/*0=pT,1=z,2=xi*/,
          Int_t chargeMode /*kNegCharge = -1, kAllCharged = 0, kPosCharge = 1*/,
          Double_t lowerCentrality /*= -2*/, Double_t upperCentrality /*= -2*/,
          Double_t lowerJetPt /*= -1*/ , Double_t upperJetPt/* = -1*/,
          Int_t rebin/* = 1 -> DON'T USE FOR PT (will not work since binsPt will and should be used!)*/,
          Int_t rebinDeltaPrime/* = 1*/,
          TString listName /* = "bhess_PID"*/,
          Bool_t useLogLikelihood /*= kTRUE*/, Bool_t useWeightsForLogLikelihood /*= kFALSE*/,
          Int_t regularisation /*= 0*/,
          Double_t regularisationFactor /*= 1*/,
          TString filePathNameFileWithInititalFractions /*= ""*/,
          TString* filePathNameResults /*= 0x0*/) 
{
  // Do all the fitting
  
  isMC = isMCdataSet;
  
  muonFractionHandling = muonFractionHandlingParameter;
  
  Int_t genAxis = useDeltaPrime ? kPidGenDeltaPrime : 1000/*kPidGenDelta*/;
  if (!useDeltaPrime) {
    std::cout << "ERROR: delta plots no longer available!" << std::endl;
    return -1;
  }
  
  if (listName == "") {
    listName = fileName;
    listName.Replace(0, listName.Last('/') + 1, "");
    listName.ReplaceAll(".root", "");
  }
  
  
  if (rebin > 1 && mode == kPMpT) {
    std::cout << "ERROR: Requested re-binning of pT-axis! Since binsPt will be used, re-binning the data histo will lead to "
              << "unforeseen consequences!" << std::endl;
    return -1;
  }
    
  Int_t pSliceLow = -1;
  Int_t pSliceHigh = -1;
  
  Int_t axisForMode = kPidPt;
  Int_t axisGenForMode = kPidGenPt;
  
  std::cout << "Fitting \"" << fileName.Data() << "\" with settings:" << std::endl;
  
  std::cout << "Minimisation strategy: " << minimisationStrategy.Data() << std::endl;
  if (useLogLikelihood) 
    std::cout << "Binned loglikelihood fit" << (useWeightsForLogLikelihood ? " (weighted)" : "")  << std::endl;
  else
    std::cout << "ChiSquare fit" << std::endl;
  std::cout << "Processing mode: ";
  if (mode == kPMpT)
    std::cout << "pT" << std::endl;
  else if (mode == kPMz) {
    std::cout << "z" << std::endl;
    axisForMode = kPidZ;
    axisGenForMode = kPidGenZ;
  }
  else if (mode == kPMxi) {
    std::cout << "xi" << std::endl;
    axisForMode = kPidXi;
    axisGenForMode = kPidGenXi;
  }
  else {
    std::cout << "Unknown -> ERROR" << std::endl;
    return -1;
  }
  
  std::cout << "Charge selection: ";
  if (chargeMode == kAllCharged)
    std::cout << "All charged particles" << std::endl;
  else if (chargeMode == kNegCharge)
    std::cout << "Negative particles only" << std::endl;
  else if (chargeMode == kPosCharge)
    std::cout << "Positive particles only" << std::endl;
  else {
    std::cout << "Unknown -> ERROR" << std::endl;
    return -1;
  }
  
  const Bool_t restrictCharge = (chargeMode != kAllCharged);
  
  if (regularisation > 0)
    std::cout << "Regularisation with +-" << regularisation << " bins and factor " << regularisationFactor << " for penalty term."
              << std::endl;
  else
    std::cout << "No regularisation" << std::endl;
  
  std::cout << "Assumption on muon fraction: ";
  if (muonFractionHandlingParameter >= 0 && muonFractionHandlingParameter < kNumHandlings)
    std::cout << muonFractionHandlingShortName[muonFractionHandlingParameter].Data() << std::endl;
  /*if (muonFractionHandlingParameter == kNoMuons)
    std::cout << "Identical zero" << std::endl;
  else if (muonFractionHandlingParameter == kMuonFracEqualElFrac)
    std::cout << "Equal electron fraction" << std::endl;
  else if (muonFractionHandlingParameter == kMuonFracOverElFracTunedOnMCStandardTrackCuts)
    std::cout << "Ratio to electron fraction tuned on MC for standard track cuts" << std::endl;
  else if (muonFractionHandlingParameter == kMuonFracOverElFracTunedOnMCHybridTrackCuts)
    std::cout << "Ratio to electron fraction tuned on MC for hybrid track cuts" << std::endl;
  else if (muonFractionHandlingParameter == kMuonFracOverElFracTunedOnMCHybridTrackCutsJets)
    std::cout << "Ratio to electron fraction tuned on MC for hybrid track cuts for jet particles" << std::endl;
  else if (muonFractionHandlingParameter == kMuonFracOverElFracTunedOnMCHybridTrackCutsJets)
    std::cout << "Ratio to electron fraction tuned on MC for hybrid track cuts for jet particles" << std::endl;*/
  else {
    std::cout << "Unknown -> ERROR" << std::endl;
    return -1;
  }
  
  if (mode == kPMpT) {
    Int_t index = 0;
    while (pLow >= binsPt[index] && index < nPtBins)
      index++;
    pSliceLow = index - 1;
    
    index = 0;
    while (pHigh > binsPt[index] && index < nPtBins)
      index++;
    pSliceHigh = index - 1;
    
    Int_t numMomIntervals = pSliceHigh - pSliceLow + 1;
    
    if (numMomIntervals <= 0 || pSliceLow < 0 || pSliceHigh > nPtBins)  {
      std::cout << "Wrong choice of limits pLow/pHigh!" << std::endl;
      return -1;
    }
      
    pLow = binsPt[pSliceLow];
    pHigh =  binsPt[pSliceHigh + 1]; // need upper edge, but binsPt holds lower edge
    std::cout << "pLow/pHigh: ";
    std::cout << pLow << " / " << pHigh << std::endl;
  }
  
  Bool_t initialiseWithFractionsFromFile = kFALSE;
  TFile* fInitialFractions = 0x0;
  TH1 *hInitFracEl = 0x0, *hInitFracKa = 0x0, *hInitFracPi = 0x0, *hInitFracMu = 0x0, *hInitFracPr = 0x0;
  
  if (filePathNameFileWithInititalFractions != "") {
    initialiseWithFractionsFromFile = kTRUE;
    
    std::cout << "Initialising fractions from file: " << filePathNameFileWithInititalFractions.Data() << std::endl;
  }
  else
    std::cout << "Not initialising fractions from file" << std::endl;

  if (initialiseWithFractionsFromFile) {
    fInitialFractions = TFile::Open(filePathNameFileWithInititalFractions.Data());
    if (!fInitialFractions) {
      std::cout << std::endl;
      std::cout << "Failed to open file with initial fractions \"" << filePathNameFileWithInititalFractions.Data() << "\"!"
                << std::endl;
      return -1;
    }
    
    hInitFracEl = (TH1*)fInitialFractions->Get("hFractionElectrons");
    hInitFracKa = (TH1*)fInitialFractions->Get("hFractionKaons");
    hInitFracPi = (TH1*)fInitialFractions->Get("hFractionPions");
    hInitFracMu = (TH1*)fInitialFractions->Get("hFractionMuons");
    hInitFracPr = (TH1*)fInitialFractions->Get("hFractionProtons");
    
    if (!hInitFracEl || ! hInitFracKa || ! hInitFracPi  || ! hInitFracMu  || ! hInitFracPr) {
      std::cout << std::endl;
      std::cout << "Failed to load initial fractions from file \"" << filePathNameFileWithInititalFractions.Data() << "\"!"
                << std::endl;
      
      fInitialFractions->Close();
      return -1;
    }
  }
  
  
  
  TObjArray* histList = 0x0;
  
  TFile* f = TFile::Open(fileName.Data());
  if (!f)  {
    std::cout << std::endl;
    std::cout << "Failed to open file \"" << fileName.Data() << "\"!" << std::endl;
    return -1;
  }
  
  //TString listName = fileName;
  //listName = listName.ReplaceAll(".root", "");
  //listName = listName.Remove(1, listName.Last('/') + 1);
  histList = (TObjArray*)(f->Get(listName.Data()));
  if (!histList) {
    std::cout << std::endl;
    std::cout << "Failed to load list \"" << listName.Data() << "\"!" << std::endl;
    return -1;
  }
  
  // Extract the data histogram
  THnSparse* hPIDdata = dynamic_cast<THnSparse*>(histList->FindObject("hPIDdataAll"));
  if (!hPIDdata) {
    std::cout << std::endl;
    std::cout << "Failed to load data histo!" << std::endl;
    return -1;
  }
  
  // If desired, rebin considered axis
  if (rebin > 1 || rebinDeltaPrime > 1) {
    const Int_t nDimensions = hPIDdata->GetNdimensions();
    Int_t rebinFactor[nDimensions];
    
    for (Int_t dim = 0; dim < nDimensions; dim++) {
      if (dim == axisForMode && rebin > 1)
        rebinFactor[dim] = rebin;
      else if (dim == kPidDeltaPrime && rebinDeltaPrime > 1)
        rebinFactor[dim] = rebinDeltaPrime;
      else
        rebinFactor[dim] = 1;
    }
    
    THnSparse* temp = hPIDdata->Rebin(&rebinFactor[0]);
    hPIDdata->Reset();
    hPIDdata = temp;
  }
  
  // Set proper errors, if not yet calculated
  if (!hPIDdata->GetCalculateErrors()) {
    std::cout << "Re-calculating errors of " << hPIDdata->GetName() << "..." << std::endl;
    hPIDdata->Sumw2();
    Long64_t nBinsTHnSparse = hPIDdata->GetNbins();
    Double_t binContent = 0;
    
    for (Long64_t bin = 0; bin < nBinsTHnSparse; bin++) {
      binContent = hPIDdata->GetBinContent(bin);
      hPIDdata->SetBinError(bin, TMath::Sqrt(binContent));
    }
  }
  
  
  // If desired, restrict centrality axis
  Int_t lowerCentralityBinLimit = -1;
  Int_t upperCentralityBinLimit = -1;
  Bool_t restrictCentralityAxis = kFALSE;
  Double_t actualLowerCentrality = -1.;
  Double_t actualUpperCentrality = -1.;
  
  if (lowerCentrality >= -1 && upperCentrality >= -1) {
    // Add subtract a very small number to avoid problems with values right on the border between to bins
    lowerCentralityBinLimit = hPIDdata->GetAxis(kPidCentrality)->FindBin(lowerCentrality + 0.001);
    upperCentralityBinLimit = hPIDdata->GetAxis(kPidCentrality)->FindBin(upperCentrality - 0.001);
    
    // Check if the values look reasonable
    if (lowerCentralityBinLimit <= upperCentralityBinLimit && lowerCentralityBinLimit >= 1
        && upperCentralityBinLimit <= hPIDdata->GetAxis(kPidCentrality)->GetNbins()) {
      actualLowerCentrality = hPIDdata->GetAxis(kPidCentrality)->GetBinLowEdge(lowerCentralityBinLimit);
      actualUpperCentrality = hPIDdata->GetAxis(kPidCentrality)->GetBinUpEdge(upperCentralityBinLimit);

      restrictCentralityAxis = kTRUE;
    }
    else {
      std::cout << std::endl;
      std::cout << "Requested centrality range out of limits or upper and lower limit are switched!" << std::endl;
      return -1;
    }
  }
  
  std::cout << "centrality: ";
  if (restrictCentralityAxis) {
    std::cout << actualLowerCentrality << " - " << actualUpperCentrality << std::endl;
  }
  else {
    std::cout << "All" << std::endl;
  }
    
  if (restrictCentralityAxis) {
    hPIDdata->GetAxis(kPidCentrality)->SetRange(lowerCentralityBinLimit, upperCentralityBinLimit);
  }
  
  
  
  // If desired, restrict jetPt axis
  Int_t lowerJetPtBinLimit = -1;
  Int_t upperJetPtBinLimit = -1;
  Bool_t restrictJetPtAxis = kFALSE;
  Double_t actualLowerJetPt = -1.;
  Double_t actualUpperJetPt = -1.;
  
  if (lowerJetPt >= 0 && upperJetPt >= 0) {
    // Add subtract a very small number to avoid problems with values right on the border between to bins
    lowerJetPtBinLimit = hPIDdata->GetAxis(kPidJetPt)->FindBin(lowerJetPt + 0.001);
    upperJetPtBinLimit = hPIDdata->GetAxis(kPidJetPt)->FindBin(upperJetPt - 0.001);
    
    // Check if the values look reasonable
    if (lowerJetPtBinLimit <= upperJetPtBinLimit && lowerJetPtBinLimit >= 1 && upperJetPtBinLimit <= hPIDdata->GetAxis(kPidJetPt)->GetNbins()) {
      actualLowerJetPt = hPIDdata->GetAxis(kPidJetPt)->GetBinLowEdge(lowerJetPtBinLimit);
      actualUpperJetPt = hPIDdata->GetAxis(kPidJetPt)->GetBinUpEdge(upperJetPtBinLimit);

      restrictJetPtAxis = kTRUE;
    }
    else {
      std::cout << std::endl;
      std::cout << "Requested jet pT range out of limits or upper and lower limit are switched!" << std::endl;
      return -1;
    }
  }
  
  std::cout << "jet pT: ";
  if (restrictJetPtAxis) {
    std::cout << actualLowerJetPt << " - " << actualUpperJetPt << std::endl;
  }
  else {
    std::cout << "All" << std::endl;
  }
  
  if (restrictJetPtAxis) {
    hPIDdata->GetAxis(kPidJetPt)->SetRange(lowerJetPtBinLimit, upperJetPtBinLimit);
  }
  
  
  // If desired, restrict charge axis
  const Int_t indexChargeAxisData = GetAxisByTitle(hPIDdata, "Charge (e_{0})");
  if (indexChargeAxisData < 0 && restrictCharge) {
    std::cout << "Error: Charge axis not found for data histogram!" << std::endl;
    return -1;
  }
  Int_t lowerChargeBinLimitData = -1;
  Int_t upperChargeBinLimitData = -2;
  Double_t actualLowerChargeData = -999;
  Double_t actualUpperChargeData = -999;
  
  if (restrictCharge) {
    // Add subtract a very small number to avoid problems with values right on the border between to bins
    if (chargeMode == kNegCharge) {
      lowerChargeBinLimitData = hPIDdata->GetAxis(indexChargeAxisData)->FindBin(-1. + 0.001);
      upperChargeBinLimitData = hPIDdata->GetAxis(indexChargeAxisData)->FindBin(0. - 0.001);
    }
    else if (chargeMode == kPosCharge) {
      lowerChargeBinLimitData = hPIDdata->GetAxis(indexChargeAxisData)->FindBin(0. + 0.001);
      upperChargeBinLimitData = hPIDdata->GetAxis(indexChargeAxisData)->FindBin(1. - 0.001);
    }
    
    // Check if the values look reasonable
    if (lowerChargeBinLimitData <= upperChargeBinLimitData && lowerChargeBinLimitData >= 1
        && upperChargeBinLimitData <= hPIDdata->GetAxis(indexChargeAxisData)->GetNbins()) {
      actualLowerChargeData = hPIDdata->GetAxis(indexChargeAxisData)->GetBinLowEdge(lowerChargeBinLimitData);
      actualUpperChargeData = hPIDdata->GetAxis(indexChargeAxisData)->GetBinUpEdge(upperChargeBinLimitData);
      
      std::cout << "Charge range data: " << actualLowerChargeData << " - " << actualUpperChargeData << std::endl;
    }
    else {
      std::cout << std::endl;
      std::cout << "Requested charge range out of limits or upper and lower limit are switched!" << std::endl;
      return -1;
    }
    
    hPIDdata->GetAxis(indexChargeAxisData)->SetRange(lowerChargeBinLimitData, upperChargeBinLimitData);
  }
  
  std::cout << std::endl;
 
 
  
  // Open file in which all the projections (= intermediate results) will be saved
  TString saveInterFName = fileName;
  TString chargeString = "";
  if (chargeMode == kPosCharge)
    chargeString = "_posCharge";
  else if (chargeMode == kNegCharge)
    chargeString = "_negCharge";
  
  saveInterFName = Form("%s_Projections_%s_%d_%s%s%s%s%s.root", saveInterFName.ReplaceAll(".root", "").Data(), 
                        modeShortName[mode].Data(),
                        fitMethod, muonFractionHandlingShortName[muonFractionHandlingParameter].Data(),
                        useIdentifiedGeneratedSpectra ? "_idSpectra" : "",
                        restrictCentralityAxis ? Form("_centrality%.0f_%.0f", actualLowerCentrality, actualUpperCentrality) : "",
                        restrictJetPtAxis ? Form("_jetPt%.1f_%.1f", actualLowerJetPt, actualUpperJetPt) : "",
                        chargeString.Data());
  TFile *saveInterF = TFile::Open(saveInterFName.Data(), "RECREATE");
  saveInterF->cd();

  // TH1 hist with number of processed events
  Double_t numEvents = -1;
  TH1* hNumEvents = dynamic_cast<TH1*>(histList->FindObject("fhEventsProcessed"));
  if (!hNumEvents) {
    std::cout << std::endl;
    std::cout << "Histo with number of processed events not found! Yields will NOT be normalised to this number!" << std::endl 
              << std::endl;
  }
  else {
    numEvents = restrictCentralityAxis ? hNumEvents->Integral(lowerCentralityBinLimit, upperCentralityBinLimit) : 
                                         hNumEvents->Integral();
    
    if (numEvents <= 0) {
      numEvents = -1;
      std::cout << std::endl;
      std::cout << "Number of processed events < 1 in selected range! Yields will NOT be normalised to this number!"
                << std::endl << std::endl;
    }
  }
  
  
  // TH1D hist with total yield per pT bin (-> project to arbitrary selectSpecies to avoid multiple counting)
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(1, 1);
  TH1D* hYieldPt = hPIDdata->Projection(axisForMode, "e");
  hYieldPt->SetName(Form("hYield%s", modeShortName[mode].Data()));
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(0, -1);
  
  
  // Fill \Delta\species histograms for each momentum slice
  Int_t nBins = hPIDdata->GetAxis(dataAxis)->GetNbins();
  Double_t xLow = hPIDdata->GetAxis(dataAxis)->GetXmin();
  Double_t xUp = hPIDdata->GetAxis(dataAxis)->GetXmax();
  
  const Int_t numSlices = (mode == kPMpT) ? nPtBins : hPIDdata->GetAxis(axisForMode)->GetNbins();
  
  TH1D* hDeltaPi[numSlices];
  TH1D* hDeltaEl[numSlices];
  TH1D* hDeltaKa[numSlices];
  TH1D* hDeltaPr[numSlices]; 
  
  TH1D* hDeltaPiFitQA[numSlices];
  TH1D* hDeltaElFitQA[numSlices];
  TH1D* hDeltaKaFitQA[numSlices];
  TH1D* hDeltaPrFitQA[numSlices];
    
  const Int_t nMCbins = 5;
  TH1D* hDeltaPiMC[numSlices][nMCbins];
  TH1D* hDeltaElMC[numSlices][nMCbins];
  TH1D* hDeltaKaMC[numSlices][nMCbins];
  TH1D* hDeltaPrMC[numSlices][nMCbins]; 
  
  
  TH2D* h2Delta[4];
  TH2D* h2DeltaMC[4][nMCbins];
  
  for (Int_t i = 0; i < 4; i++) {
    TString speciesLabel = hPIDdata->GetAxis(kPidSelectSpecies)->GetBinLabel(i + 1);
    
    hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(i + 1, i + 1);
    h2Delta[i] = hPIDdata->Projection(dataAxis, axisForMode, "e");
    h2Delta[i]->SetName(Form("h2Delta_%s", speciesLabel.Data()));
    h2Delta[i]->GetXaxis()->SetTitle(hPIDdata->GetAxis(axisForMode)->GetTitle());
    h2Delta[i]->GetYaxis()->SetTitle(Form("#Delta%s_{%s} = dE/dx %s <dE/dx>_{%s} (arb. units)", useDeltaPrime ? "'" : "", speciesLabel.Data(),
                                          useDeltaPrime ? "/" : "-", speciesLabel.Data()));
    
    for (Int_t species = 0; species < nMCbins; species++) {
      hPIDdata->GetAxis(kPidMCpid)->SetRange(species + 1, species + 1); // Select MC species
      h2DeltaMC[i][species] = hPIDdata->Projection(dataAxis, axisGenForMode, "e");
      h2DeltaMC[i][species]->SetName(Form("h2Delta_MC_%s", speciesLabel.Data()));
      h2DeltaMC[i][species]->GetXaxis()->SetTitle(hPIDdata->GetAxis(axisGenForMode)->GetTitle());
      h2DeltaMC[i][species]->GetYaxis()->SetTitle(h2Delta[i]->GetYaxis()->GetTitle());
    }
    hPIDdata->GetAxis(kPidMCpid)->SetRange(0, -1);
  }
  
  Int_t firstValidSlice = -1;
  for (Int_t slice = 0; (mode == kPMpT) ? slice < nPtBins : slice < hPIDdata->GetAxis(axisForMode)->GetNbins(); slice++) {   
    if (mode == kPMpT && (slice < pSliceLow || slice > pSliceHigh))
      continue; 
    
    if (firstValidSlice < 0)
      firstValidSlice = slice;
        
    // Add/subtract some very small offset to be sure not to sit on the bin boundary, when looking for the integration/projection limits.
    // For modes different from pT, just take 1 bin
    const Int_t pBinLowProjLimit = (mode == kPMpT) ? h2Delta[0]->GetXaxis()->FindBin(binsPt[slice] + 1e-5)    : slice + 1;
    const Int_t pBinUpProjLimit  = (mode == kPMpT) ? h2Delta[0]->GetXaxis()->FindBin(binsPt[slice + 1]- 1e-5) : slice + 1;
    
    const TString binInfo = (mode == kPMpT) ? Form("%.2f_Pt_%.2f", binsPt[slice], binsPt[slice + 1])
                                            : Form("%.2f_%s_%.2f", hPIDdata->GetAxis(axisForMode)->GetBinLowEdge(pBinLowProjLimit), 
                                                                   modeShortName[mode].Data(),
                                                                   hPIDdata->GetAxis(axisForMode)->GetBinUpEdge(pBinUpProjLimit));
      
    hDeltaEl[slice] = h2Delta[0]->ProjectionY(Form("hDeltaEl_%s", binInfo.Data()), pBinLowProjLimit, pBinUpProjLimit, "e");
    hDeltaEl[slice]->GetXaxis()->SetTitle(h2Delta[0]->GetYaxis()->GetTitle());
    hDeltaEl[slice]->GetXaxis()->SetTitleOffset(1.0);
    hDeltaEl[slice]->SetStats(kFALSE);
    
    hDeltaKa[slice] = h2Delta[1]->ProjectionY(Form("hDeltaKa_%s", binInfo.Data()), pBinLowProjLimit, pBinUpProjLimit, "e");
    hDeltaKa[slice]->SetName(Form("hDeltaKa_%s", binInfo.Data()));
    hDeltaKa[slice]->GetXaxis()->SetTitle(h2Delta[1]->GetYaxis()->GetTitle());
    hDeltaKa[slice]->GetXaxis()->SetTitleOffset(1.0);
    hDeltaKa[slice]->SetStats(kFALSE);
    
    hDeltaPi[slice] = h2Delta[2]->ProjectionY(Form("hDeltaPi_%s", binInfo.Data()), pBinLowProjLimit, pBinUpProjLimit, "e");
    hDeltaPi[slice]->SetName(Form("hDeltaPi_%s", binInfo.Data()));
    hDeltaPi[slice]->GetXaxis()->SetTitle(h2Delta[2]->GetYaxis()->GetTitle());
    hDeltaPi[slice]->GetXaxis()->SetTitleOffset(1.0);
    hDeltaPi[slice]->SetStats(kFALSE);
    
    hDeltaPr[slice] = h2Delta[3]->ProjectionY(Form("hDeltaPr_%s", binInfo.Data()), pBinLowProjLimit, pBinUpProjLimit, "e");
    hDeltaPr[slice]->SetName(Form("hDeltaPr_%s", binInfo.Data()));
    hDeltaPr[slice]->GetXaxis()->SetTitle(h2Delta[3]->GetYaxis()->GetTitle());
    hDeltaPr[slice]->GetXaxis()->SetTitleOffset(1.0);
    hDeltaPr[slice]->SetStats(kFALSE);
    
    if (plotIdentifiedSpectra)  {
      // If identified spectra are available (mainly useful in the MC case) and shall be used,
      // create histos with signals from identified particles
  
      // DeltaEl
      for (Int_t species = 0; species < nMCbins; species++) {
        hDeltaElMC[slice][species] = h2DeltaMC[0][species]->ProjectionY(Form("hDeltaElMC_%s_species_%d", binInfo.Data(), species),
                                                                        pBinLowProjLimit, pBinUpProjLimit, "e");
        hDeltaElMC[slice][species]->SetLineColor(getLineColor(species + 1));
        hDeltaElMC[slice][species]->SetMarkerColor(getLineColor(species + 1));
        hDeltaElMC[slice][species]->SetMarkerStyle(24);
        hDeltaElMC[slice][species]->SetLineStyle(1);
        hDeltaElMC[slice][species]->GetXaxis()->SetTitle(h2DeltaMC[0][species]->GetYaxis()->GetTitle());
        hDeltaElMC[slice][species]->GetXaxis()->SetTitleOffset(1.0);
        hDeltaElMC[slice][species]->SetStats(kFALSE);
      }
      
      // DeltaKa
      for (Int_t species = 0; species < nMCbins; species++) {
        hDeltaKaMC[slice][species] = h2DeltaMC[1][species]->ProjectionY(Form("hDeltaKaMC_%s_species_%d", binInfo.Data(), species),
                                                                             pBinLowProjLimit, pBinUpProjLimit, "e");
        hDeltaKaMC[slice][species]->SetLineColor(getLineColor(species + 1));
        hDeltaKaMC[slice][species]->SetMarkerColor(getLineColor(species + 1));
        hDeltaKaMC[slice][species]->SetMarkerStyle(24);
        hDeltaKaMC[slice][species]->SetLineStyle(1);
        hDeltaKaMC[slice][species]->GetXaxis()->SetTitle(h2DeltaMC[1][species]->GetYaxis()->GetTitle());
        hDeltaKaMC[slice][species]->GetXaxis()->SetTitleOffset(1.0);
        hDeltaKaMC[slice][species]->SetStats(kFALSE);
      }
      
      // DeltaPi
      for (Int_t species = 0; species < nMCbins; species++) {
        hDeltaPiMC[slice][species] = h2DeltaMC[2][species]->ProjectionY(Form("hDeltaPiMC_%s_species_%d", binInfo.Data(), species),
                                                                             pBinLowProjLimit, pBinUpProjLimit, "e");
        hDeltaPiMC[slice][species]->SetLineColor(getLineColor(species + 1));
        hDeltaPiMC[slice][species]->SetMarkerColor(getLineColor(species + 1));
        hDeltaPiMC[slice][species]->SetMarkerStyle(24);
        hDeltaPiMC[slice][species]->SetLineStyle(1);
        hDeltaPiMC[slice][species]->GetXaxis()->SetTitle(h2DeltaMC[2][species]->GetYaxis()->GetTitle());
        hDeltaPiMC[slice][species]->GetXaxis()->SetTitleOffset(1.0);
        hDeltaPiMC[slice][species]->SetStats(kFALSE);
      }
      
      // DeltaPr
      for (Int_t species = 0; species < nMCbins; species++) {
        hDeltaPrMC[slice][species] = h2DeltaMC[3][species]->ProjectionY(Form("hDeltaPrMC_%s_species_%d", binInfo.Data(), species),
                                                                             pBinLowProjLimit, pBinUpProjLimit, "e");
        hDeltaPrMC[slice][species]->SetLineColor(getLineColor(species + 1));
        hDeltaPrMC[slice][species]->SetMarkerColor(getLineColor(species + 1));
        hDeltaPrMC[slice][species]->SetMarkerStyle(24);
        hDeltaPrMC[slice][species]->SetLineStyle(1);
        hDeltaPrMC[slice][species]->GetXaxis()->SetTitle(h2DeltaMC[3][species]->GetYaxis()->GetTitle());
        hDeltaPrMC[slice][species]->GetXaxis()->SetTitleOffset(1.0);
        hDeltaPrMC[slice][species]->SetStats(kFALSE);
      }
    }
  }
  hPIDdata->GetAxis(kPidMCpid)->SetRange(0, -1);
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(0, -1);
  
  hPIDdata->GetAxis(axisForMode)->SetRange(0, -1);

  /*
  // TOF TODO
  TCanvas* cTOF = new TCanvas("cTOF", "TOF PID",100,10,1200,800);
  cTOF->Divide(4,1);
  cTOF->cd(1);
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(1, 1);
  TH2D* h2TOFel = hPIDdata->Projection(kPidDeltaTOF, kPidPvertex);
  h2TOFel->SetName("h2TOFel");
  h2TOFel->GetYaxis()->SetTitle(Form("#DeltaTOF_{%s} (ps)", hPIDdata->GetAxis(kPidSelectSpecies)->GetBinLabel(1)));
  h2TOFel->Draw("colz");
  
  cTOF->cd(2);
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(2, 2);
  TH2D* h2TOFka = hPIDdata->Projection(kPidDeltaTOF, kPidPvertex);
  h2TOFka->SetName("h2TOFka");
  h2TOFka->GetYaxis()->SetTitle(Form("#DeltaTOF_{%s} (ps)", hPIDdata->GetAxis(kPidSelectSpecies)->GetBinLabel(2)));
  h2TOFka->Draw("colz");
  
  cTOF->cd(3);
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(3, 3);
  TH2D* h2TOFpi = hPIDdata->Projection(kPidDeltaTOF, kPidPvertex);
  h2TOFpi->SetName("h2TOFpi");
  h2TOFpi->GetYaxis()->SetTitle(Form("#DeltaTOF_{%s} (ps)", hPIDdata->GetAxis(kPidSelectSpecies)->GetBinLabel(3)));
  h2TOFpi->Draw("colz");
  
  cTOF->cd(4);
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(4, 4);
  TH2D* h2TOFpr = hPIDdata->Projection(kPidDeltaTOF, kPidPvertex);
  h2TOFpr->SetName("h2TOFpr");
  h2TOFpr->GetYaxis()->SetTitle(Form("#DeltaTOF_{%s} (ps)", hPIDdata->GetAxis(kPidSelectSpecies)->GetBinLabel(4)));
  h2TOFpr->Draw("colz");
  
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(0, -1);
  */
  
  // Start fitting of slices
  TCanvas* cSingleFit[numSlices][4];
  
  TF1*     fitFuncTotalDeltaPion[numSlices];
  TF1*     fitFuncTotalDeltaElectron[numSlices];
  TF1*     fitFuncTotalDeltaKaon[numSlices];
  TF1*     fitFuncTotalDeltaProton[numSlices];
  
  // Histos for particle fractions
  TH1F* hFractionElectrons = 0x0;
  if (mode == kPMpT)
    hFractionElectrons = new TH1F("hFractionElectrons", "e", nPtBins, binsPt);
  else {
    const TArrayD* histBins = hPIDdata->GetAxis(axisForMode)->GetXbins();
    if (histBins->fN == 0)
      hFractionElectrons = new TH1F("hFractionElectrons", "e", hPIDdata->GetAxis(axisForMode)->GetNbins(), hPIDdata->GetAxis(axisForMode)->GetXmin(),
                                    hPIDdata->GetAxis(axisForMode)->GetXmax());
    else
      hFractionElectrons = new TH1F("hFractionElectrons", "e", hPIDdata->GetAxis(axisForMode)->GetNbins(), histBins->fArray);
  }
  
  hFractionElectrons->GetXaxis()->SetTitle(hPIDdata->GetAxis(axisForMode)->GetTitle());
  hFractionElectrons->GetYaxis()->SetTitle("Fraction");
  hFractionElectrons->SetLineColor(getLineColor(kEl));
  hFractionElectrons->SetMarkerColor(getLineColor(kEl));
  hFractionElectrons->SetMarkerStyle(20);
  hFractionElectrons->Sumw2();
  hFractionElectrons->SetStats(kFALSE);
  
  TH1F* hFractionElectronsDeltaPion = (TH1F*)hFractionElectrons->Clone("hFractionElectronsDeltaPion");
  TH1F* hFractionElectronsDeltaElectron = (TH1F*)hFractionElectrons->Clone("hFractionElectronsDeltaElectron");
  TH1F* hFractionElectronsDeltaKaon = (TH1F*)hFractionElectrons->Clone("hFractionElectronsDeltaKaon");
  TH1F* hFractionElectronsDeltaProton = (TH1F*)hFractionElectrons->Clone("hFractionElectronsDeltaProton");
  
  TH1F* hFractionKaons = (TH1F*)hFractionElectrons->Clone("hFractionKaons");
  hFractionKaons->SetTitle("K");
  hFractionKaons->SetLineColor(getLineColor(kKa));
  hFractionKaons->SetMarkerColor(getLineColor(kKa));
  
  TH1F* hFractionKaonsDeltaPion = (TH1F*)hFractionKaons->Clone("hFractionKaonsDeltaPion");
  TH1F* hFractionKaonsDeltaElectron = (TH1F*)hFractionKaons->Clone("hFractionKaonsDeltaElectron");
  TH1F* hFractionKaonsDeltaKaon = (TH1F*)hFractionKaons->Clone("hFractionKaonsDeltaKaon");
  TH1F* hFractionKaonsDeltaProton = (TH1F*)hFractionKaons->Clone("hFractionKaonsDeltaProton");
  
  TH1F* hFractionPions = (TH1F*)hFractionElectrons->Clone("hFractionPions");
  hFractionPions->SetTitle("#pi");
  hFractionPions->SetLineColor(getLineColor(kPi));
  hFractionPions->SetMarkerColor(getLineColor(kPi));
  
  TH1F* hFractionPionsDeltaPion = (TH1F*)hFractionPions->Clone("hFractionPionsDeltaPion");
  TH1F* hFractionPionsDeltaElectron = (TH1F*)hFractionPions->Clone("hFractionPionsDeltaElectron");
  TH1F* hFractionPionsDeltaKaon = (TH1F*)hFractionPions->Clone("hFractionPionsDeltaKaon");
  TH1F* hFractionPionsDeltaProton = (TH1F*)hFractionPions->Clone("hFractionPionsDeltaProton");
  
  TH1F* hFractionProtons = (TH1F*)hFractionElectrons->Clone("hFractionProtons");
  hFractionProtons->SetTitle("p");
  hFractionProtons->SetLineColor(getLineColor(kPr));
  hFractionProtons->SetMarkerColor(getLineColor(kPr));
 
  TH1F* hFractionProtonsDeltaPion = (TH1F*)hFractionProtons->Clone("hFractionProtonsDeltaPion");
  TH1F* hFractionProtonsDeltaElectron = (TH1F*)hFractionProtons->Clone("hFractionProtonsDeltaElectron");
  TH1F* hFractionProtonsDeltaKaon = (TH1F*)hFractionProtons->Clone("hFractionProtonsDeltaKaon");
  TH1F* hFractionProtonsDeltaProton = (TH1F*)hFractionProtons->Clone("hFractionProtonsDeltaProton");
  
  TH1F* hFractionMuons = (TH1F*)hFractionElectrons->Clone("hFractionMuons");
  hFractionMuons->SetTitle("#mu");
  hFractionMuons->SetLineColor(getLineColor(kMu));
  hFractionMuons->SetMarkerColor(getLineColor(kMu));
 
  TH1F* hFractionMuonsDeltaPion = (TH1F*)hFractionMuons->Clone("hFractionMuonsDeltaPion");
  TH1F* hFractionMuonsDeltaElectron = (TH1F*)hFractionMuons->Clone("hFractionMuonsDeltaElectron");
  TH1F* hFractionMuonsDeltaKaon = (TH1F*)hFractionMuons->Clone("hFractionMuonsDeltaKaon");
  TH1F* hFractionMuonsDeltaProton = (TH1F*)hFractionMuons->Clone("hFractionMuonsDeltaProton");

  TH1F* hFractionSummed = (TH1F*)hFractionProtons->Clone("hFractionSummed");
  hFractionSummed->SetTitle("Sum");
  hFractionSummed->SetLineColor(kBlack);
  hFractionSummed->SetMarkerColor(kBlack);
  
  
  // MC fractions
  TH1F* hFractionElectronsMC = (TH1F*)hFractionElectrons->Clone("hFractionElectronsMC");
  hFractionElectronsMC->SetMarkerStyle(24);
  TH1F* hFractionKaonsMC = (TH1F*)hFractionKaons->Clone("hFractionKaonsMC");
  hFractionKaonsMC->SetMarkerStyle(24);
  TH1F* hFractionPionsMC = (TH1F*)hFractionPions->Clone("hFractionPionsMC");
  hFractionPionsMC->SetMarkerStyle(24);
  TH1F* hFractionMuonsMC = (TH1F*)hFractionMuons->Clone("hFractionMuonsMC");
  hFractionMuonsMC->SetMarkerStyle(24);
  TH1F* hFractionProtonsMC = (TH1F*)hFractionProtons->Clone("hFractionProtonsMC");
  hFractionProtonsMC->SetMarkerStyle(24);
  
  
  // Comparison fit result<->MC
  TString fractionComparisonTitle = Form("Fraction fit / fraction %s", identifiedLabels[isMC].Data()); 
  TH1F* hFractionComparisonElectrons = (TH1F*)hFractionElectrons->Clone("hFractionComparisonElectrons");
  hFractionComparisonElectrons->GetYaxis()->SetTitle(fractionComparisonTitle.Data());
  TH1F* hFractionComparisonMuons = (TH1F*)hFractionMuons->Clone("hFractionComparisonMuons");
  hFractionComparisonMuons->GetYaxis()->SetTitle(fractionComparisonTitle.Data());
  TH1F* hFractionComparisonKaons = (TH1F*)hFractionKaons->Clone("hFractionComparisonKaons");
  hFractionComparisonKaons->GetYaxis()->SetTitle(fractionComparisonTitle.Data());
  TH1F* hFractionComparisonPions = (TH1F*)hFractionPions->Clone("hFractionComparisonPions");
  hFractionComparisonPions->GetYaxis()->SetTitle(fractionComparisonTitle.Data());
  TH1F* hFractionComparisonProtons = (TH1F*)hFractionProtons->Clone("hFractionComparisonProtons");
  hFractionComparisonProtons->GetYaxis()->SetTitle(fractionComparisonTitle.Data());
  TH1F* hFractionComparisonTotal = (TH1F*)hFractionSummed->Clone("hFractionComparisonTotal");
  hFractionComparisonTotal->GetYaxis()->SetTitle(fractionComparisonTitle.Data());
  
  
  
  // Histos for particle yields
  TH1F* hYieldElectrons = 0x0;
  if (mode == kPMpT)
    hYieldElectrons = new TH1F("hYieldElectrons", "e", nPtBins, binsPt);
  else {
    const TArrayD* histBins = hPIDdata->GetAxis(axisForMode)->GetXbins();
    if (histBins->fN == 0)
      hYieldElectrons = new TH1F("hYieldElectrons", "e", hPIDdata->GetAxis(axisForMode)->GetNbins(), hPIDdata->GetAxis(axisForMode)->GetXmin(),
                                    hPIDdata->GetAxis(axisForMode)->GetXmax());
    else
      hYieldElectrons = new TH1F("hYieldElectrons", "e", hPIDdata->GetAxis(axisForMode)->GetNbins(), histBins->fArray);
  }
  
  hYieldElectrons->GetXaxis()->SetTitle(hPIDdata->GetAxis(axisForMode)->GetTitle());
  hYieldElectrons->GetYaxis()->SetTitle(Form("%s1/(2#pi%s) d^{2}N/d#etad%s%s", numEvents > 0 ? "1/N_{ev} " : "",
                                             modeLatexName[mode].Data(), modeLatexName[mode].Data(),
                                             mode == kPMpT ? " (GeV/c)^{-2}" : 0));
  hYieldElectrons->SetLineColor(getLineColor(kEl));
  hYieldElectrons->SetMarkerColor(getLineColor(kEl));
  hYieldElectrons->SetMarkerStyle(20);
  hYieldElectrons->Sumw2();
  hYieldElectrons->SetStats(kFALSE);
  
  TH1F* hYieldElectronsDeltaPion = (TH1F*)hYieldElectrons->Clone("hYieldElectronsDeltaPion");
  TH1F* hYieldElectronsDeltaElectron = (TH1F*)hYieldElectrons->Clone("hYieldElectronsDeltaElectron");
  TH1F* hYieldElectronsDeltaKaon = (TH1F*)hYieldElectrons->Clone("hYieldElectronsDeltaKaon");
  TH1F* hYieldElectronsDeltaProton = (TH1F*)hYieldElectrons->Clone("hYieldElectronsDeltaProton");
  
  TH1F* hYieldKaons = (TH1F*)hYieldElectrons->Clone("hYieldKaons");
  hYieldKaons->SetTitle("K");
  hYieldKaons->SetLineColor(getLineColor(kKa));
  hYieldKaons->SetMarkerColor(getLineColor(kKa));
  
  TH1F* hYieldKaonsDeltaPion = (TH1F*)hYieldKaons->Clone("hYieldKaonsDeltaPion");
  TH1F* hYieldKaonsDeltaElectron = (TH1F*)hYieldKaons->Clone("hYieldKaonsDeltaElectron");
  TH1F* hYieldKaonsDeltaKaon = (TH1F*)hYieldKaons->Clone("hYieldKaonsDeltaKaon");
  TH1F* hYieldKaonsDeltaProton = (TH1F*)hYieldKaons->Clone("hYieldKaonsDeltaProton");
  
  TH1F* hYieldPions = (TH1F*)hYieldElectrons->Clone("hYieldPions");
  hYieldPions->SetTitle("#pi");
  hYieldPions->SetLineColor(getLineColor(kPi));
  hYieldPions->SetMarkerColor(getLineColor(kPi));
  
  TH1F* hYieldPionsDeltaPion = (TH1F*)hYieldPions->Clone("hYieldPionsDeltaPion");
  TH1F* hYieldPionsDeltaElectron = (TH1F*)hYieldPions->Clone("hYieldPionsDeltaElectron");
  TH1F* hYieldPionsDeltaKaon = (TH1F*)hYieldPions->Clone("hYieldPionsDeltaKaon");
  TH1F* hYieldPionsDeltaProton = (TH1F*)hYieldPions->Clone("hYieldPionsDeltaProton");
  
  TH1F* hYieldProtons = (TH1F*)hYieldElectrons->Clone("hYieldProtons");
  hYieldProtons->SetTitle("p");
  hYieldProtons->SetLineColor(getLineColor(kPr));
  hYieldProtons->SetMarkerColor(getLineColor(kPr));
  
  TH1F* hYieldProtonsDeltaPion = (TH1F*)hYieldProtons->Clone("hYieldProtonsDeltaPion");
  TH1F* hYieldProtonsDeltaElectron = (TH1F*)hYieldProtons->Clone("hYieldProtonsDeltaElectron");
  TH1F* hYieldProtonsDeltaKaon = (TH1F*)hYieldProtons->Clone("hYieldProtonsDeltaKaon");
  TH1F* hYieldProtonsDeltaProton = (TH1F*)hYieldProtons->Clone("hYieldProtonsDeltaProton");
  
  TH1F* hYieldMuons = (TH1F*)hYieldElectrons->Clone("hYieldMuons");
  hYieldMuons->SetTitle("#mu");
  hYieldMuons->SetLineColor(getLineColor(kMu));
  hYieldMuons->SetMarkerColor(getLineColor(kMu));
  
  TH1F* hYieldMuonsDeltaPion = (TH1F*)hYieldMuons->Clone("hYieldMuonsDeltaPion");
  TH1F* hYieldMuonsDeltaElectron = (TH1F*)hYieldMuons->Clone("hYieldMuonsDeltaElectron");
  TH1F* hYieldMuonsDeltaKaon = (TH1F*)hYieldMuons->Clone("hYieldMuonsDeltaKaon");
  TH1F* hYieldMuonsDeltaProton = (TH1F*)hYieldMuons->Clone("hYieldMuonsDeltaProton");
  
  // MC yields
  TH1F* hYieldElectronsMC = (TH1F*)hYieldElectrons->Clone("hYieldElectronsMC");
  hYieldElectronsMC->SetMarkerStyle(24);
  TH1F* hYieldMuonsMC = (TH1F*)hYieldElectrons->Clone("hYieldMuonsMC");
  hYieldMuonsMC->SetMarkerStyle(24);
  hYieldMuonsMC->SetLineColor(getLineColor(kMu));
  hYieldMuonsMC->SetMarkerColor(getLineColor(kMu));
  TH1F* hYieldKaonsMC = (TH1F*)hYieldKaons->Clone("hYieldKaonsMC");
  hYieldKaonsMC->SetMarkerStyle(24);
  TH1F* hYieldPionsMC = (TH1F*)hYieldPions->Clone("hYieldPionsMC");
  hYieldPionsMC->SetMarkerStyle(24);
  TH1F* hYieldProtonsMC = (TH1F*)hYieldProtons->Clone("hYieldProtonsMC");
  hYieldProtonsMC->SetMarkerStyle(24);
  TH1F* hYieldSummedMC = (TH1F*)hYieldProtonsMC->Clone("hYieldSummedMC");
  hYieldSummedMC->SetTitle("Sum");
  hYieldSummedMC->SetLineColor(kBlack);
  hYieldSummedMC->SetMarkerColor(kBlack);
  
  // Comparison fit result<->MC (yields)
  TString yieldComparisonTitle = Form("Yield fit / yield %s", identifiedLabels[isMC].Data()); 
  TH1F* hYieldComparisonElectrons = (TH1F*)hYieldElectrons->Clone("hYieldComparisonElectrons");
  hYieldComparisonElectrons->GetYaxis()->SetTitle(yieldComparisonTitle.Data());
  TH1F* hYieldComparisonMuons = (TH1F*)hYieldMuons->Clone("hYieldComparisonMuons");
  hYieldComparisonMuons->GetYaxis()->SetTitle(yieldComparisonTitle.Data());
  TH1F* hYieldComparisonKaons = (TH1F*)hYieldKaons->Clone("hYieldComparisonKaons");
  hYieldComparisonKaons->GetYaxis()->SetTitle(yieldComparisonTitle.Data());
  TH1F* hYieldComparisonPions = (TH1F*)hYieldPions->Clone("hYieldComparisonPions");
  hYieldComparisonPions->GetYaxis()->SetTitle(yieldComparisonTitle.Data());
  TH1F* hYieldComparisonProtons = (TH1F*)hYieldProtons->Clone("hYieldComparisonProtons");
  hYieldComparisonProtons->GetYaxis()->SetTitle(yieldComparisonTitle.Data());
  
  
  // To-pi ratios
  TString electronString[3] = { "e^{-}", "e^{+}+e^{-}", "e^{+}" };
  TString muonString[3] = { "#mu^{-}", "#mu^{+}+#mu^{-}", "#mu^{+}" };
  TString kaonString[3] = { "K^{-}", "K^{+}+K^{-}", "K^{+}" };
  TString pionString[3] = { "#pi^{-}", "#pi^{+}+#pi^{-}", "#pi^{+}" };
  TString protonString[3] = { "#bar{p}", "p+#bar{p}", "p" };
  
  TH1F* hRatioToPiElectrons = (TH1F*)hYieldElectrons->Clone("hRatioToPiElectrons");
  hRatioToPiElectrons->GetYaxis()->SetTitle(Form("d^{2}N_{%s}/d#etad%s / d^{2}N_{%s}/d#etad%s",
                                                 electronString[chargeMode+1].Data(),
                                                 modeLatexName[mode].Data(),
                                                 pionString[chargeMode+1].Data(),
                                                 modeLatexName[mode].Data()));
  hRatioToPiElectrons->SetTitle(Form("%s", chargeMode == 0
                                             ? Form("(%s)/(%s)", electronString[chargeMode+1].Data(), pionString[chargeMode+1].Data())
                                             : Form("%s/%s", electronString[chargeMode+1].Data(), pionString[chargeMode+1].Data())));
  
  
  TH1F* hRatioToPiMuons = (TH1F*)hYieldMuons->Clone("hRatioToPiMuons");
  hRatioToPiMuons->GetYaxis()->SetTitle(Form("d^{2}N_{%s}/d#etad%s / d^{2}N_{%s}/d#etad%s",
                                             muonString[chargeMode+1].Data(),
                                             modeLatexName[mode].Data(),
                                             pionString[chargeMode+1].Data(),
                                             modeLatexName[mode].Data()));
  hRatioToPiMuons->SetTitle(Form("%s", chargeMode == 0
                                             ? Form("(%s)/(%s)", muonString[chargeMode+1].Data(), pionString[chargeMode+1].Data())
                                             : Form("%s/%s", muonString[chargeMode+1].Data(), pionString[chargeMode+1].Data())));
  
  TH1F* hRatioToPiKaons = (TH1F*)hYieldKaons->Clone("hRatioToPiKaons");
  hRatioToPiKaons->GetYaxis()->SetTitle(Form("d^{2}N_{%s}/d#etad%s / d^{2}N_{%s}/d#etad%s",
                                             kaonString[chargeMode+1].Data(),
                                             modeLatexName[mode].Data(),
                                             pionString[chargeMode+1].Data(),
                                             modeLatexName[mode].Data()));
  hRatioToPiKaons->SetTitle(Form("%s", chargeMode == 0
                                             ? Form("(%s)/(%s)", kaonString[chargeMode+1].Data(), pionString[chargeMode+1].Data())
                                             : Form("%s/%s", kaonString[chargeMode+1].Data(), pionString[chargeMode+1].Data())));
  
  TH1F* hRatioToPiProtons = (TH1F*)hYieldProtons->Clone("hRatioToPiProtons");
  hRatioToPiProtons->GetYaxis()->SetTitle(Form("d^{2}N_{%s}/d#etad%s / d^{2}N_{%s}/d#etad%s",
                                             protonString[chargeMode+1].Data(),
                                             modeLatexName[mode].Data(),
                                             pionString[chargeMode+1].Data(),
                                             modeLatexName[mode].Data()));
  hRatioToPiProtons->SetTitle(Form("%s", chargeMode == 0
                                             ? Form("(%s)/(%s)", protonString[chargeMode+1].Data(), pionString[chargeMode+1].Data())
                                             : Form("%s/%s", protonString[chargeMode+1].Data(), pionString[chargeMode+1].Data())));
  
  // MC to-pi ratios
  TH1F* hRatioToPiElectronsMC = (TH1F*)hRatioToPiElectrons->Clone("hRatioToPiElectronsMC");
  hRatioToPiElectronsMC->SetMarkerStyle(24);
  TH1F* hRatioToPiMuonsMC = (TH1F*)hRatioToPiMuons->Clone("hRatioToPiMuonsMC");
  hRatioToPiMuonsMC->SetMarkerStyle(24);
  hRatioToPiMuonsMC->SetLineColor(getLineColor(kMu));
  hRatioToPiMuonsMC->SetMarkerColor(getLineColor(kMu));
  TH1F* hRatioToPiKaonsMC = (TH1F*)hRatioToPiKaons->Clone("hRatioToPiKaonsMC");
  hRatioToPiKaonsMC->SetMarkerStyle(24);
  TH1F* hRatioToPiProtonsMC = (TH1F*)hRatioToPiProtons->Clone("hRatioToPiProtonsMC");
  hRatioToPiProtonsMC->SetMarkerStyle(24);
  
  // Reduced Chi^2 of fits vs. pT for all Delta_Species
  TH2F* hReducedChiSquarePt = 0x0;
  if (mode == kPMpT)
    hReducedChiSquarePt = new TH2F("hReducedChiSquarePt", "e", nPtBins, binsPt, 4, 0, 4);
  else {
    const TArrayD* histBins = hPIDdata->GetAxis(axisForMode)->GetXbins();
    if (histBins->fN == 0)
      hReducedChiSquarePt = new TH2F(Form("hReducedChiSquare%s", modeShortName[mode].Data()), "e",
                                     hPIDdata->GetAxis(axisForMode)->GetNbins(), hPIDdata->GetAxis(axisForMode)->GetXmin(),
                                     hPIDdata->GetAxis(axisForMode)->GetXmax(), 4, 0, 4);
    else
      hReducedChiSquarePt = new TH2F(Form("hReducedChiSquare%s", modeShortName[mode].Data()), "e",
                                     hPIDdata->GetAxis(axisForMode)->GetNbins(), histBins->fArray, 4, 0, 4);
  }
  
  hReducedChiSquarePt->GetXaxis()->SetTitle(hPIDdata->GetAxis(axisForMode)->GetTitle());
  hReducedChiSquarePt->GetYaxis()->SetTitle("Delta_{Species}");
  hReducedChiSquarePt->GetYaxis()->SetBinLabel(1, "e");
  hReducedChiSquarePt->GetYaxis()->SetBinLabel(2, "K");
  hReducedChiSquarePt->GetYaxis()->SetBinLabel(3, "#pi");
  hReducedChiSquarePt->GetYaxis()->SetBinLabel(4, "p");
  hReducedChiSquarePt->SetMarkerColor(kRed);
  hReducedChiSquarePt->SetMarkerStyle(20);
  hReducedChiSquarePt->SetStats(kFALSE);
  
  // Obtain MC information about particle yields
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(1, 1); // Do not count each particle more than once
  TH2D* hMCdata = (TH2D*)hPIDdata->Projection(kPidMCpid, axisForMode, "e");
  hMCdata->SetName("hMCdata");
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(0, -1); // Reset range

  
  
  // Extract the MC truth generated primary yields
  THnSparse* hMCgeneratedYieldsPrimaries = isMCdataSet ? dynamic_cast<THnSparse*>(histList->FindObject("fhMCgeneratedYieldsPrimaries"))
                                                       : 0x0;
  
  TH1D* hMCgenYieldsPrimSpecies[AliPID::kSPECIES];
  for (Int_t i = 0; i < AliPID::kSPECIES; i++)
    hMCgenYieldsPrimSpecies[i] = 0x0;
  
  if (hMCgeneratedYieldsPrimaries) {
    // Set proper errors, if not yet calculated
    if (!hMCgeneratedYieldsPrimaries->GetCalculateErrors()) {
      std::cout << "Re-calculating errors of " << hMCgeneratedYieldsPrimaries->GetName() << "..." << std::endl;
      
      hMCgeneratedYieldsPrimaries->Sumw2();
      
      Long64_t nBinsTHnSparseGenYield = hMCgeneratedYieldsPrimaries->GetNbins();
      Double_t binContentGenYield = 0;
      for (Long64_t bin = 0; bin < nBinsTHnSparseGenYield; bin++) {
        binContentGenYield = hMCgeneratedYieldsPrimaries->GetBinContent(bin);
        hMCgeneratedYieldsPrimaries->SetBinError(bin, TMath::Sqrt(binContentGenYield));
      }
    }
      
    if (restrictJetPtAxis) 
      hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->SetRange(lowerJetPtBinLimit, upperJetPtBinLimit);
    
    if (restrictCentralityAxis)
      hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldCentrality)->SetRange(lowerCentralityBinLimit, upperCentralityBinLimit);
    
    
    if (restrictCharge) {
      const Int_t indexChargeAxisGenYield = GetAxisByTitle(hMCgeneratedYieldsPrimaries, "Charge (e_{0})");
      if (indexChargeAxisGenYield < 0) {
        std::cout << "Error: Charge axis not found for gen yield histogram!" << std::endl;
        return -1;
      }
  
      Int_t lowerChargeBinLimitGenYield = -1;
      Int_t upperChargeBinLimitGenYield = -2;
      Double_t actualLowerChargeGenYield = -999;
      Double_t actualUpperChargeGenYield = -999;
  
      // Add subtract a very small number to avoid problems with values right on the border between to bins
      if (chargeMode == kNegCharge) {
        lowerChargeBinLimitGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->FindBin(-1. + 0.001);
        upperChargeBinLimitGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->FindBin(0. - 0.001);
      }
      else if (chargeMode == kPosCharge) {
        lowerChargeBinLimitGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->FindBin(0. + 0.001);
        upperChargeBinLimitGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->FindBin(1. - 0.001);
      }
      
      // Check if the values look reasonable
      if (lowerChargeBinLimitGenYield <= upperChargeBinLimitGenYield && lowerChargeBinLimitGenYield >= 1
          && upperChargeBinLimitGenYield <= hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->GetNbins()) {
        actualLowerChargeGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->GetBinLowEdge(lowerChargeBinLimitGenYield);
        actualUpperChargeGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->GetBinUpEdge(upperChargeBinLimitGenYield);
        
        if (TMath::Abs(actualLowerChargeGenYield - actualLowerChargeData) > 1e-4 ||
            TMath::Abs(actualUpperChargeGenYield - actualUpperChargeData) > 1e-4) {
          std::cout << std::endl;
          std::cout << "Error: Charge range gen yield: " << actualLowerChargeGenYield << " - " << actualUpperChargeGenYield
                    << std::endl << "differs from that of data: " << actualLowerChargeData << " - " << actualUpperChargeData
                    << std::endl;
          return -1;
        }
      }
      else {
        std::cout << std::endl;
        std::cout << "Requested charge range (gen yield) out of limits or upper and lower limit are switched!" << std::endl;
        return -1;
      }
      
      hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->SetRange(lowerChargeBinLimitGenYield, upperChargeBinLimitGenYield);
    }
    
    for (Int_t MCid = 0; MCid < AliPID::kSPECIES; MCid++) {
      hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldMCpid)->SetRange(MCid + 1, MCid + 1);
      
      hMCgenYieldsPrimSpecies[MCid] = hMCgeneratedYieldsPrimaries->Projection(kPidGenYieldPt, "e");
      hMCgenYieldsPrimSpecies[MCid]->SetName(Form("hMCgenYieldsPrimSpecies_%s", AliPID::ParticleShortName(MCid)));
      hMCgenYieldsPrimSpecies[MCid]->SetTitle(Form("MC truth generated primary yield, %s", AliPID::ParticleName(MCid)));
      
      // Choose the same binning as for the fitted yields, i.e. rebin the histogram (Rebin will create a clone!)
      TH1D* temp = (TH1D*)hMCgenYieldsPrimSpecies[MCid]->Rebin(nPtBins, hMCgenYieldsPrimSpecies[MCid]->GetName(), binsPt);
      // Delete the old binned histo and take the new binned one
      delete hMCgenYieldsPrimSpecies[MCid];
      hMCgenYieldsPrimSpecies[MCid] = temp;
      
      hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldMCpid)->SetRange(0, -1);
    }
  }
  
  
  // Get expected shapes for pT bins
  TString Ytitle = "";
  
  // Array index 0 as unused dummy
  TH2D* hGenDelta[6][6]; // DeltaSpecies (first index) for species (second index)
  TH2D* hGenDeltaMCid[6][6]; // DeltaSpecies (first index) for species (second index)
  
  for (Int_t i = 0; i < 6; i++) {
    for (Int_t j = 0; j < 6; j++) {
      hGenDelta[i][j] = 0x0;
      hGenDeltaMCid[i][j] = 0x0;
    }
  }
  
  THnSparse* current = 0x0;
  
  THnSparse* hGenEl = dynamic_cast<THnSparse*>(histList->FindObject("hGenEl"));
  if (!hGenEl)  {
    std::cout << "Failed to load expected dEdx signal shape for: Electrons!" << std::endl;
    return -1;
  }
  
  THnSparse* hGenKa = dynamic_cast<THnSparse*>(histList->FindObject("hGenKa"));
  if (!hGenKa)  {
    std::cout << "Failed to load expected dEdx signal shape for: Kaons!" << std::endl;
    return -1;
  }
  
  THnSparse* hGenPi = dynamic_cast<THnSparse*>(histList->FindObject("hGenPi"));
  if (!hGenPi)  {
    std::cout << "Failed to load expected dEdx signal shape for: Pions!" << std::endl;
    return -1;
  }
  
  THnSparse* hGenMu = dynamic_cast<THnSparse*>(histList->FindObject("hGenMu"));
  if (!hGenMu)  {
    std::cout << "Failed to load expected dEdx signal shape for: Muons! Treated muons as pions in the following." << std::endl;
    takeIntoAccountMuons = kFALSE; 
  }
  
  THnSparse* hGenPr = dynamic_cast<THnSparse*>(histList->FindObject("hGenPr"));
  if (!hGenPr)  {
    std::cout << "Failed to load expected dEdx signal shape for: Protons!" << std::endl;
    return -1;
  }

  for (Int_t MCid = kEl; MCid <= kPr; MCid++) {
    if (MCid == kEl)
      current = hGenEl;
    else if (MCid == kKa)
      current = hGenKa;
    else if (MCid == kMu) {
      if (takeIntoAccountMuons)
        current = hGenMu;
      else
       continue; // No histo for muons in this case
    }
    else if (MCid == kPi)
      current = hGenPi;
    else if (MCid == kPr)
      current = hGenPr;
    else
      break;
    
    // If desired, rebin considered axis
    if (rebin > 1 || rebinDeltaPrime > 1) {
      const Int_t nDimensions = current->GetNdimensions();
      Int_t rebinFactor[nDimensions];
      
      for (Int_t dim = 0; dim < nDimensions; dim++) {
        if (dim == axisGenForMode)
          rebinFactor[dim] = rebin;
        else if (dim == kPidGenDeltaPrime && rebinDeltaPrime > 1)
        rebinFactor[dim] = rebinDeltaPrime;
        else
          rebinFactor[dim] = 1;
      }
      
      THnSparse* temp = current->Rebin(&rebinFactor[0]);
      current->Reset();
      current = temp;
    }
    
    // Set proper errors, if not yet calculated
    if (!current->GetCalculateErrors()) {
      std::cout << "Re-calculating errors of " << current->GetName() << "..." << std::endl;
      
      current->Sumw2();
      
      Long64_t nBinsTHnSparseGen = current->GetNbins();
      Double_t binContentGen = 0;
      for (Long64_t bin = 0; bin < nBinsTHnSparseGen; bin++) {
        binContentGen = current->GetBinContent(bin);
        current->SetBinError(bin, TMath::Sqrt(binContentGen));
      }
    }
    
    // If desired, restrict centrality range
    if (restrictCentralityAxis) {
      current->GetAxis(kPidGenCentrality)->SetRange(lowerCentralityBinLimit, upperCentralityBinLimit);
    }
    
    // If desired, restrict jet pT range
    if (restrictJetPtAxis) {
      current->GetAxis(kPidGenJetPt)->SetRange(lowerJetPtBinLimit, upperJetPtBinLimit);
    }
    
    // If desired, restrict charge range
    if (restrictCharge) {
      const Int_t indexChargeAxisGen = GetAxisByTitle(current, "Charge (e_{0})");
      if (indexChargeAxisGen < 0) {
        std::cout << "Error: Charge axis not found for gen histogram!" << std::endl;
        return -1;
      }
  
      Int_t lowerChargeBinLimitGen = -1;
      Int_t upperChargeBinLimitGen = -2;
      Double_t actualLowerChargeGen = -999;
      Double_t actualUpperChargeGen = -999;
  
      // Add subtract a very small number to avoid problems with values right on the border between to bins
      if (chargeMode == kNegCharge) {
        lowerChargeBinLimitGen = current->GetAxis(indexChargeAxisGen)->FindBin(-1. + 0.001);
        upperChargeBinLimitGen = current->GetAxis(indexChargeAxisGen)->FindBin(0. - 0.001);
      }
      else if (chargeMode == kPosCharge) {
        lowerChargeBinLimitGen = current->GetAxis(indexChargeAxisGen)->FindBin(0. + 0.001);
        upperChargeBinLimitGen = current->GetAxis(indexChargeAxisGen)->FindBin(1. - 0.001);
      }
      
      // Check if the values look reasonable
      if (lowerChargeBinLimitGen <= upperChargeBinLimitGen && lowerChargeBinLimitGen >= 1
          && upperChargeBinLimitGen <= current->GetAxis(indexChargeAxisGen)->GetNbins()) {
        actualLowerChargeGen = current->GetAxis(indexChargeAxisGen)->GetBinLowEdge(lowerChargeBinLimitGen);
        actualUpperChargeGen = current->GetAxis(indexChargeAxisGen)->GetBinUpEdge(upperChargeBinLimitGen);
        
        if (TMath::Abs(actualLowerChargeGen - actualLowerChargeData) > 1e-4 ||
            TMath::Abs(actualUpperChargeGen - actualUpperChargeData) > 1e-4) {
          std::cout << std::endl;
          std::cout << "Error: Charge range gen: " << actualLowerChargeGen << " - " << actualUpperChargeGen
                    << std::endl << "differs from that of data: " << actualLowerChargeData << " - " << actualUpperChargeData
                    << std::endl;
          return -1;
        }
      }
      else {
        std::cout << std::endl;
        std::cout << "Requested charge range (gen) out of limits or upper and lower limit are switched!" << std::endl;
        return -1;
      }
      
      current->GetAxis(indexChargeAxisGen)->SetRange(lowerChargeBinLimitGen, upperChargeBinLimitGen);
    }
    
    
  
    for (Int_t selectBin = 1; selectBin <= 4; selectBin++)  {
      Int_t selectMCid = (selectBin >= 3) ? (selectBin+1) : selectBin;

      current->GetAxis(kPidGenSelectSpecies)->SetRange(selectBin, selectBin);
      
      Ytitle = Form("#Delta%s_{%s} = dE/dx %s <dE/dx>_{%s} (arb. units)", useDeltaPrime ? "'" : "",
                    partShortName[selectMCid - 1].Data(), useDeltaPrime ? "/" : "-",
                    partShortName[selectMCid - 1].Data());
      
      TH2* hGenCurrent = 0x0;
      if (!useIdentifiedGeneratedSpectra)   {
        hGenDelta[selectMCid][MCid] = current->Projection(genAxis, axisGenForMode, "e");
        hGenDelta[selectMCid][MCid]->SetName(Form("hGenDelta%sFor%s", partShortName[selectMCid - 1].Data(),
                                                  partShortName[MCid - 1].Data()));
        hGenCurrent = hGenDelta[selectMCid][MCid];
      }
      else  {
        current->GetAxis(kPidGenMCpid)->SetRange(MCid, MCid);
        hGenDeltaMCid[selectMCid][MCid] = current->Projection(genAxis, axisGenForMode, "e");
        hGenDeltaMCid[selectMCid][MCid]->SetName(Form("hGenDelta%sForMCid%s", partShortName[selectMCid - 1].Data(), 
                                                      partShortName[MCid - 1].Data()));
        
        hGenCurrent = hGenDeltaMCid[selectMCid][MCid];
        current->GetAxis(kPidGenMCpid)->SetRange(0, -1);
      }
      
      hGenCurrent->GetYaxis()->SetTitle(Ytitle.Data());
      hGenCurrent->SetLineColor(getLineColor(MCid));
      hGenCurrent->SetMarkerColor(getLineColor(MCid));
      hGenCurrent->SetLineWidth(2);
      hGenCurrent->SetLineStyle(2);
      hGenCurrent->SetMarkerStyle(20);
      hGenCurrent->GetXaxis()->SetTitleOffset(1.0);
    }
    
    current->GetAxis(kPidGenSelectSpecies)->SetRange(0, -1);
  }    
  
  // Free a lot of memory for the following procedure. Histogram is not needed anymore (only its projections)
  delete f;
  
  // Save intermediate results
  //TODO save intermediate TOF results
  saveInterF->cd();
  
  if (hMCdata)
    hMCdata->Write();
  
  for (Int_t i = 0; i < 6; i++) {
    for (Int_t j = 0; j < 6; j++) {
      if (hGenDelta[i][j])
        hGenDelta[i][j]->Write();
        
      if (hGenDeltaMCid[i][j])
        hGenDeltaMCid[i][j]->Write();
    }
  }
  
  for (Int_t slice = 0; (mode == kPMpT) ? slice < nPtBins : slice < hFractionPions->GetXaxis()->GetNbins(); slice++) {   
    if (mode == kPMpT && (slice < pSliceLow || slice > pSliceHigh))
      continue; 
    
    if(hDeltaPi[slice])  
      hDeltaPi[slice]->Write();
    if(hDeltaEl[slice])
      hDeltaEl[slice]->Write();
    if(hDeltaKa[slice])
      hDeltaKa[slice]->Write();
    if(hDeltaPr[slice])
      hDeltaPr[slice]->Write();
      
    if (plotIdentifiedSpectra)  {
      for (Int_t species = 0; species < 5; species++) {
        hDeltaElMC[slice][species]->Write();
        hDeltaKaMC[slice][species]->Write();
        hDeltaPiMC[slice][species]->Write();
        hDeltaPrMC[slice][species]->Write(); 
      }
    }   
  }
  
  // File may not be closed because the projections are needed in the following!
  //saveInterF->Close();
  
  // Save some first results for the final output
  TString saveFName = fileName;
  saveFName = Form("%s_results_%s__%s_%d_reg%d_regFac%.2f_%s%s%s%s%s.root", saveFName.ReplaceAll(".root", "").Data(), 
                   useLogLikelihood ? (useWeightsForLogLikelihood ? "weightedLLFit" : "LLFit") : "ChiSquareFit",
                   modeShortName[mode].Data(), fitMethod, regularisation, regularisationFactor,
                   muonFractionHandlingShortName[muonFractionHandlingParameter].Data(),
                   useIdentifiedGeneratedSpectra ? "_idSpectra" : "",
                   restrictCentralityAxis ? Form("_centrality%.0f_%.0f", actualLowerCentrality, actualUpperCentrality) : "",
                   restrictJetPtAxis ? Form("_jetPt%.1f_%.1f", actualLowerJetPt, actualUpperJetPt) : "",
                   chargeString.Data());
  TFile *saveF = TFile::Open(saveFName.Data(), "RECREATE");
  saveF->cd();
  
  if (hFractionElectrons)
      hFractionElectrons->Write(0, TObject::kWriteDelete);
      
  if (hFractionKaons)
    hFractionKaons->Write(0, TObject::kWriteDelete);
    
  if (hFractionPions)
    hFractionPions->Write(0, TObject::kWriteDelete);
    
  if (hFractionProtons)
    hFractionProtons->Write(0, TObject::kWriteDelete);
  
  if (hFractionMuons)
    hFractionMuons->Write(0, TObject::kWriteDelete);
  
  if (hFractionSummed)
    hFractionSummed->Write(0, TObject::kWriteDelete);
  
  if (hFractionElectronsMC)
    hFractionElectronsMC->Write(0, TObject::kWriteDelete);
  
  if (hFractionKaonsMC)
    hFractionKaonsMC->Write(0, TObject::kWriteDelete);
  
  if (hFractionPionsMC)
    hFractionPionsMC->Write(0, TObject::kWriteDelete);
  
  if (hFractionMuonsMC)
    hFractionMuonsMC->Write(0, TObject::kWriteDelete);
  
  if (hFractionProtonsMC)
    hFractionProtonsMC->Write(0, TObject::kWriteDelete);

  
  if (hYieldElectrons)
    hYieldElectrons->Write(0, TObject::kWriteDelete);
  
  if (hYieldKaons)
    hYieldKaons->Write(0, TObject::kWriteDelete);
  
  if (hYieldPions)
    hYieldPions->Write(0, TObject::kWriteDelete);
  
  if (hYieldProtons)
    hYieldProtons->Write(0, TObject::kWriteDelete);
  
  if (hYieldMuons)
    hYieldMuons->Write(0, TObject::kWriteDelete);
  
  if (hYieldElectronsMC)
    hYieldElectronsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldMuonsMC)
    hYieldMuonsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldKaonsMC)
    hYieldKaonsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldPionsMC)
    hYieldPionsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldProtonsMC)
    hYieldProtonsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldSummedMC)
    hYieldSummedMC->Write(0, TObject::kWriteDelete);
  
  
  if (hRatioToPiElectrons)
    hRatioToPiElectrons->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiMuons)
    hRatioToPiMuons->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiKaons)
    hRatioToPiKaons->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiProtons)
    hRatioToPiProtons->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiElectronsMC)
    hRatioToPiElectronsMC->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiMuonsMC)
    hRatioToPiMuonsMC->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiKaonsMC)
    hRatioToPiKaonsMC->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiProtonsMC)
    hRatioToPiProtonsMC->Write(0, TObject::kWriteDelete);
  
  
  // Dummy histo to create generic legend entries from
  TH1D* hMCmuonsAndPionsDummy = 0x0;
  if (plotIdentifiedSpectra && firstValidSlice >= 0) {
    hMCmuonsAndPionsDummy = new TH1D(*hDeltaPiMC[firstValidSlice][kPi]);
    hMCmuonsAndPionsDummy->SetLineColor(getLineColor(kMuPlusPi));
    hMCmuonsAndPionsDummy->SetMarkerColor(getLineColor(kMuPlusPi));
    hMCmuonsAndPionsDummy->SetName("hMCmuonsAndPionsDummy");
  }
  
  
  muonFractionThresholdForFitting = 0.;//OLD 0.295;
  muonFractionThresholdBinForFitting = (mode == kPMpT) ? FindMomentumBin(binsPt, muonFractionThresholdForFitting) : -1;
  
  electronFractionThresholdForFitting = 9.;
  electronFractionThresholdBinForFitting = (mode == kPMpT) ? FindMomentumBin(binsPt, electronFractionThresholdForFitting) : -1;
  
  lastPtForCallOfGetElectronFraction = pHigh + 10.; // Make sure that this value is higher than in any call during the fit
  
  fElectronFraction = new TF1("fElectronFraction", Form("[0]+(x<%f)*[1]*(x-%f)", electronFractionThresholdForFitting, 
                                                        electronFractionThresholdForFitting), 
                              pLow, pHigh);
  fElectronFraction->SetParameters(0.01, 0.0);
  
  
  
  TString speciesLabel[4] = {"El", "Ka", "Pi", "Pr" };
  
  const Double_t binWidthFitHisto = 1.0; // Not used any longer
  
  // In case of regularisation, the actual number of x bins and the (for pT: logs of their) bin centres are required
  Int_t numXBins = 0;
  Double_t* xBinCentres = 0x0;
  Double_t* xBinStatisticalWeight = 0x0;
  Double_t* xBinStatisticalWeightError = 0x0;
  
  // Set the number of parameters per x bin:
  // Regularisation only implemented for simultaneous fit.
  const Int_t numParamsPerXbin = AliPID::kSPECIES + 1; // Fractions of each species + total yield in x bin
  
  // Construct the array of all the parameters that are to be regularised, i.e. only the FREE fractions
  // and NOT the total yields or the x bin
  Int_t nParToRegulariseSimultaneousFit = 0;
  Int_t* indexParametersToRegularise = 0x0;
  Int_t* lastNotFixedIndexOfParameters = 0x0;
  
  if (regularisation > 0) {
    Int_t xBinIndexTemp = 0;
    Int_t internalParIndexTemp = 0;
    
    // Loop twice over data: Determine the number of bins in the first iteration, allocate the memory and fill in the 2. iteration
    for (Int_t i = 0; i < 2; i++) {
      if (i == 1) {
        if (numXBins == 0) {
          printf("No bins for fitting! Exiting...\n");
          
          return -1;
        }
        if (nParToRegulariseSimultaneousFit == 0) {
          printf("No parameters to regularise! Exiting...\n");
          
          return -1;
        }
        
        xBinCentres = new Double_t[numXBins];
        xBinStatisticalWeight = new Double_t[numXBins];
        xBinStatisticalWeightError = new Double_t[numXBins];
        
        indexParametersToRegularise = new Int_t[nParToRegulariseSimultaneousFit];
        
        lastNotFixedIndexOfParameters = new Int_t[numParamsPerXbin];
        
        // Set last not fixed index of parameter to numXBins, i.e. a index larger than any existing index.
        // This will not restrict the parameter regularisation range. In the following, the range for electrons
        // and muons will be restricted
        for (Int_t iPar = 0; iPar < numParamsPerXbin; iPar++) 
          lastNotFixedIndexOfParameters[iPar] = numXBins;
      }
      
        
      for (Int_t slice = 0; (mode == kPMpT) ? slice < nPtBins : slice < hFractionPions->GetXaxis()->GetNbins(); slice++) {   
        if (mode == kPMpT && (slice < pSliceLow || slice > pSliceHigh))
          continue; 
        
        // There won't (actually: shouldn't) be tracks with a pT larger than the jet pT
        if (mode == kPMpT && restrictJetPtAxis && binsPt[slice] >= actualUpperJetPt)
          continue;
        
        const Int_t pBinLowProjLimit = (mode == kPMpT) ? hYieldPt->GetXaxis()->FindBin(binsPt[slice] + 1e-5)    : slice + 1;
        const Int_t pBinUpProjLimit  = (mode == kPMpT) ? hYieldPt->GetXaxis()->FindBin(binsPt[slice + 1]- 1e-5) : slice + 1;
        
        // NOTE: In case of regularisation, only the simultaneous fit values will be used, i.e. totalYield and not allDeltaSpecies!
        
        // Also take into account bin width in delta(Prime) plots -> Multiply by binWidthFitHisto
        Double_t totalYieldError = 0;
        const Double_t totalYield = binWidthFitHisto * hYieldPt->IntegralAndError(pBinLowProjLimit, pBinUpProjLimit, totalYieldError);
        totalYieldError *= binWidthFitHisto;
        
        if (totalYield <= 0) 
          continue;
        
        if (i == 1) {
          if (mode == kPMpT)
            // Take the logarithm in case of pT
            xBinCentres[xBinIndexTemp] = TMath::Log((binsPt[slice + 1] + binsPt[slice]) / 2.);
          else
            xBinCentres[xBinIndexTemp] = hFractionPions->GetXaxis()->GetBinCenter(slice + 1);
          
          xBinStatisticalWeight[xBinIndexTemp] = totalYield;
          
          // NOTE: The total yield is a fact - a number w/o error. However, one assigns this error here to use it
          // to calculate the effective weighting for the weighted likelihood fit (and the error is only used for this).
          // So, it is more like a weighting than an error...
          xBinStatisticalWeightError[xBinIndexTemp] = totalYieldError;
          
          
          // Mark the fractions for all species except for electrons and muons in this bin for regularisation
          for (Int_t speciesIndex = 0; speciesIndex < AliPID::kSPECIES - 2; speciesIndex++)
            indexParametersToRegularise[internalParIndexTemp++] = numParamsPerXbin * xBinIndexTemp + speciesIndex;
          
          // Also mark electrons for regularisation in this bin, if not fixed
          if( !(mode == kPMpT && slice >= electronFractionThresholdBinForFitting) ) {
            indexParametersToRegularise[internalParIndexTemp++] = numParamsPerXbin * xBinIndexTemp + 3; 
          }
          else {
            // Set the index of the last x bin in which the parameter is not fixed.
            // If the parameter is fixed in all x bins, this index will be -1.
            if (xBinIndexTemp - 1 < lastNotFixedIndexOfParameters[3])
              lastNotFixedIndexOfParameters[3] = xBinIndexTemp - 1;
          }
          
          // Also mark muons for regularisation in this bin, if not fixed
          if( !(mode != kPMpT || slice >= muonFractionThresholdBinForFitting) ) {
            indexParametersToRegularise[internalParIndexTemp++] = numParamsPerXbin * xBinIndexTemp + 4; 
          }
          else {
            // Set the index of the last x bin in which the parameter is not fixed.
            // If the parameter is fixed in all x bins, this index will be -1.
            if (xBinIndexTemp - 1 < lastNotFixedIndexOfParameters[4])
              lastNotFixedIndexOfParameters[4] = xBinIndexTemp - 1;
          }
          
          xBinIndexTemp++;
        }
        
        if (i == 0) {
          nParToRegulariseSimultaneousFit += AliPID::kSPECIES - 2; // Fracs for all species in this bin except for electrons and muons

          if( !(mode == kPMpT && slice >= electronFractionThresholdBinForFitting) )
            nParToRegulariseSimultaneousFit++; // Also regularise electrons in this bin (not fixed)
          
          if( !(mode != kPMpT || slice >= muonFractionThresholdBinForFitting) )
            nParToRegulariseSimultaneousFit++; // Also regularise muons in this bin (not fixed)

          numXBins++;
        }
      }
    }
  }
  AliTPCPIDmathFit* mathFit = 0x0;
  
  if (regularisation > 0) {
    mathFit = (fitMethod == 2) ? AliTPCPIDmathFit::Instance(numXBins, 4, 1810)
                               : AliTPCPIDmathFit::Instance(numXBins, 1, 1810);
  }
  else {
    mathFit = (fitMethod == 2) ? AliTPCPIDmathFit::Instance(1, 4, 1810)
                               : AliTPCPIDmathFit::Instance(1, 1, 1810);
  }
  
  mathFit->SetDebugLevel(0); 
  mathFit->SetEpsilon(5e-05);
  mathFit->SetMaxCalls(1e8);
  
  mathFit->SetMinimisationStrategy(minimisationStrategy);
  
  mathFit->SetUseLogLikelihood(useLogLikelihood);
  mathFit->SetUseWeightsForLogLikelihood(useWeightsForLogLikelihood);
  
  if (fitMethod == 2) {
    // If the deltaPrime range is large enough, we artificially get a factor 4 in statistics by looking at the four
    // different deltaPrimeSpecies, which have (except for binning effects) the same information. 
    // Therefore, to get the "real" statistical error, we need to multiply the obtained error by sqrt(4) = 2
    mathFit->SetScaleFactorError(2.);
  }
  
  mathFit->SetRegularisation(regularisation, regularisationFactor);
  
  // Number of parameters for fitting
  const Int_t nPar = 11;
  
  // Fracs of each species + total yield in x bin
  const Int_t nParSimultaneousFit = AliPID::kSPECIES + 1; 
  
  // Fracs of each species in x bin + tot yield in x bin
  const Int_t nParSimultaneousFitRegularised = numXBins * (AliPID::kSPECIES + 1); 
  
  if (regularisation > 0) {
    if (!mathFit->SetParametersToRegularise(nParToRegulariseSimultaneousFit, numParamsPerXbin, indexParametersToRegularise,
                                            lastNotFixedIndexOfParameters, xBinCentres, xBinStatisticalWeight, 
                                            xBinStatisticalWeightError))
      return -1;
  }
  
  delete xBinCentres;
  xBinCentres = 0x0;
  
  delete xBinStatisticalWeight;
  xBinStatisticalWeight = 0x0;
  
  delete xBinStatisticalWeightError;
  xBinStatisticalWeight = 0x0;
  
  delete indexParametersToRegularise;
  indexParametersToRegularise = 0x0;
  
  delete lastNotFixedIndexOfParameters;
  lastNotFixedIndexOfParameters = 0x0;
  
  
  
  gFractionElectronsData = new TGraphErrors(numXBins);
  
  // Fit each slice with sum of 4/5 shapes with means and sigmas fixed from last fitting step
  // For electrons: Fit up to certain pT bin and use constant value for higher momenta
  
  // Two iterations required for regularisation
  Bool_t regularisedFitDone = kFALSE;
  Double_t reducedChiSquareRegularisation = -1;
  
  Double_t gausParamsSimultaneousFitRegularised[nParSimultaneousFitRegularised];
  Double_t parameterErrorsOutRegularised[nParSimultaneousFitRegularised];
  Double_t lowParLimitsSimultaneousFitRegularised[nParSimultaneousFitRegularised];
  Double_t upParLimitsSimultaneousFitRegularised[nParSimultaneousFitRegularised];
  Double_t stepSizeSimultaneousFitRegularised[nParSimultaneousFitRegularised];
  
  for (Int_t i = 0; i < nParSimultaneousFitRegularised; i++) {
    gausParamsSimultaneousFitRegularised[i] = 0;
    parameterErrorsOutRegularised[i] = 0;
    lowParLimitsSimultaneousFitRegularised[i] = 0;
    upParLimitsSimultaneousFitRegularised[i] = 0;
    stepSizeSimultaneousFitRegularised[i] = 0;
  }
  
  mathFit->ClearRefHistos();
  
  
  const Int_t nParUsed = (fitMethod == 2) ? ((regularisation <= 0) ? nParSimultaneousFit: nParSimultaneousFitRegularised) : nPar;
  Double_t parameterErrorsOut[nParUsed];
  Double_t covMatrix[nParUsed][nParUsed];
  
  for (Int_t iter = 0; iter < 2; iter++) {
    if (regularisation <= 0 && iter == 0)
      continue; // Only one iteration w/o regularisation
  
    Int_t currXbin = 0;
    
    for (Int_t slice = 0; (mode == kPMpT) ? slice < nPtBins : slice < hFractionPions->GetXaxis()->GetNbins(); slice++) {   
      if (mode == kPMpT && (slice < pSliceLow || slice > pSliceHigh))
        continue; 
      
      // There won't (actually: shouldn't) be tracks with a pT larger than the jet pT
      if (mode == kPMpT && restrictJetPtAxis && binsPt[slice] >= actualUpperJetPt)
        continue;
      
      if (regularisation <= 0) {
        if (mode == kPMpT)
          std::cout << "Fitting range " << binsPt[slice] << " GeV/c < Pt < " << binsPt[slice + 1] << " GeV/c..." << std::endl;
        else {
          std::cout << "Fitting range " << hFractionPions->GetXaxis()->GetBinLowEdge(slice + 1) << " < " << modeShortName[mode].Data() << " < ";
          std::cout << hFractionPions->GetXaxis()->GetBinUpEdge(slice + 1) << "..." << std::endl;
        }
      }
      
      // Add/subtract some very small offset to be sure not to sit on the bin boundary, when looking for the integration/projection limits.
      const Int_t pBinLowProjLimit = (mode == kPMpT) ? hYieldPt->GetXaxis()->FindBin(binsPt[slice] + 1e-5)    : slice + 1;
      const Int_t pBinUpProjLimit  = (mode == kPMpT) ? hYieldPt->GetXaxis()->FindBin(binsPt[slice + 1]- 1e-5) : slice + 1;
      
      // Also take into account bin width in delta(Prime) plots -> Multiply by binWidthFitHisto
      const Double_t totalYield = binWidthFitHisto * hYieldPt->Integral(pBinLowProjLimit, pBinUpProjLimit);
      
      if (totalYield <= 0) {
        std::cout << "Skipped bin (yield is zero)!" << std::endl;
        continue;
      }
      
      const Double_t allDeltaPion = hDeltaPi[slice]->Integral();
      const Double_t allDeltaElectron = hDeltaEl[slice]->Integral();
      const Double_t allDeltaKaon = hDeltaKa[slice]->Integral();
      const Double_t allDeltaProton = hDeltaPr[slice]->Integral();
      
      // inverseBinWidth = 1.0, if the raw yield for each bin is requested.
      // If divided by the bin size, the histograms give "yield per unit pT in the corresponding bin" or dN/dpT
      Double_t inverseBinWidth = (mode == kPMpT) ? 1.0 / (binsPt[slice + 1] - binsPt[slice])
                                                : 1.0 / hYieldPt->GetBinWidth(slice + 1); 
      
      TH1D *hGenDeltaElForElProj = 0x0, *hGenDeltaKaForElProj = 0x0, *hGenDeltaPiForElProj = 0x0, *hGenDeltaPrForElProj = 0x0;
      TH1D *hGenDeltaElForKaProj = 0x0, *hGenDeltaKaForKaProj = 0x0, *hGenDeltaPiForKaProj = 0x0, *hGenDeltaPrForKaProj = 0x0;
      TH1D *hGenDeltaElForPiProj = 0x0, *hGenDeltaKaForPiProj = 0x0, *hGenDeltaPiForPiProj = 0x0, *hGenDeltaPrForPiProj = 0x0;
      TH1D *hGenDeltaElForMuProj = 0x0, *hGenDeltaKaForMuProj = 0x0, *hGenDeltaPiForMuProj = 0x0, *hGenDeltaPrForMuProj = 0x0;
      TH1D *hGenDeltaElForPrProj = 0x0, *hGenDeltaKaForPrProj = 0x0, *hGenDeltaPiForPrProj = 0x0, *hGenDeltaPrForPrProj = 0x0;
      
      TH2D* hGenDeltaUsed[6][6];
      if (useIdentifiedGeneratedSpectra) { 
        for (Int_t i = 0; i < 6; i++) {
          for (Int_t j = 0; j < 6; j++) {
            hGenDeltaUsed[i][j] = hGenDeltaMCid[i][j];
          }
        }
      }
      else {
        for (Int_t i = 0; i < 6; i++) {
          for (Int_t j = 0; j < 6; j++) {
            hGenDeltaUsed[i][j] = hGenDelta[i][j];
          }
        }
      }
      
      hGenDeltaElForElProj =(TH1D*)hGenDeltaUsed[kEl][kEl]->ProjectionY(Form("hGenDeltaElForElProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaKaForElProj =(TH1D*)hGenDeltaUsed[kKa][kEl]->ProjectionY(Form("hGenDeltaKaForElProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaPiForElProj =(TH1D*)hGenDeltaUsed[kPi][kEl]->ProjectionY(Form("hGenDeltaPiForElProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaPrForElProj =(TH1D*)hGenDeltaUsed[kPr][kEl]->ProjectionY(Form("hGenDeltaPrForElProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      
      hGenDeltaElForKaProj =(TH1D*)hGenDeltaUsed[kEl][kKa]->ProjectionY(Form("hGenDeltaElForKaProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaKaForKaProj =(TH1D*)hGenDeltaUsed[kKa][kKa]->ProjectionY(Form("hGenDeltaKaForKaProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaPiForKaProj =(TH1D*)hGenDeltaUsed[kPi][kKa]->ProjectionY(Form("hGenDeltaPiForKaProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaPrForKaProj =(TH1D*)hGenDeltaUsed[kPr][kKa]->ProjectionY(Form("hGenDeltaPrForKaProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      
      hGenDeltaElForPiProj =(TH1D*)hGenDeltaUsed[kEl][kPi]->ProjectionY(Form("hGenDeltaElForPiProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaKaForPiProj =(TH1D*)hGenDeltaUsed[kKa][kPi]->ProjectionY(Form("hGenDeltaKaForPiProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaPiForPiProj =(TH1D*)hGenDeltaUsed[kPi][kPi]->ProjectionY(Form("hGenDeltaPiForPiProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaPrForPiProj =(TH1D*)hGenDeltaUsed[kPr][kPi]->ProjectionY(Form("hGenDeltaPrForPiProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      
      if (takeIntoAccountMuons) {
        hGenDeltaElForMuProj =(TH1D*)hGenDeltaUsed[kEl][kMu]->ProjectionY(Form("hGenDeltaElForMuProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
        hGenDeltaKaForMuProj =(TH1D*)hGenDeltaUsed[kKa][kMu]->ProjectionY(Form("hGenDeltaKaForMuProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
        hGenDeltaPiForMuProj =(TH1D*)hGenDeltaUsed[kPi][kMu]->ProjectionY(Form("hGenDeltaPiForMuProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
        hGenDeltaPrForMuProj =(TH1D*)hGenDeltaUsed[kPr][kMu]->ProjectionY(Form("hGenDeltaPrForMuProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      }
      
      hGenDeltaElForPrProj =(TH1D*)hGenDeltaUsed[kEl][kPr]->ProjectionY(Form("hGenDeltaElForPrProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaKaForPrProj =(TH1D*)hGenDeltaUsed[kKa][kPr]->ProjectionY(Form("hGenDeltaKaForPrProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaPiForPrProj =(TH1D*)hGenDeltaUsed[kPi][kPr]->ProjectionY(Form("hGenDeltaPiForPrProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      hGenDeltaPrForPrProj =(TH1D*)hGenDeltaUsed[kPr][kPr]->ProjectionY(Form("hGenDeltaPrForPrProj%d", slice), pBinLowProjLimit, pBinUpProjLimit, "e");
      
      
      
      if (fitMethod == 2) {
        // Normalise generated histos to TOTAL number of GENERATED particles for this species (i.e. including
        // entries that lie in the under or overflow bin), so that situations in which the generated spectra lie
        // at least partly outside the histo are treated properly. To find the total number of generated particle
        // species X, one can just take the integral of the generated histo for DeltaX (which should include all
        // generated entries) and apply the same normalisation factor to all other DeltaSpecies.
        // Also set some cosmetics
        
        // Generated electrons
        Double_t normEl = normaliseHist(hGenDeltaElForElProj, -1);
        normaliseHist(hGenDeltaKaForElProj, normEl);
        normaliseHist(hGenDeltaPiForElProj, normEl);
        normaliseHist(hGenDeltaPrForElProj, normEl);
        
        
        // Generated kaons
        Double_t normKa = normaliseHist(hGenDeltaKaForKaProj, -1);
        normaliseHist(hGenDeltaElForKaProj, normKa);
        normaliseHist(hGenDeltaPiForKaProj, normKa);
        normaliseHist(hGenDeltaPrForKaProj, normKa);
        
        
        // Generated pions
        Double_t normPi = normaliseHist(hGenDeltaPiForPiProj, -1);
        normaliseHist(hGenDeltaElForPiProj, normPi);
        normaliseHist(hGenDeltaKaForPiProj, normPi);
        normaliseHist(hGenDeltaPrForPiProj, normPi);
        

        Double_t normMu = 1;
        if (takeIntoAccountMuons) {
          // Generated pions
          // Since masses of muons and pions are so similar, the normalisation scheme should still work when looking at deltaPion instead
          normMu = normaliseHist(hGenDeltaPiForMuProj, -1);
          normaliseHist(hGenDeltaElForMuProj, normMu);
          normaliseHist(hGenDeltaKaForMuProj, normMu);
          normaliseHist(hGenDeltaPrForMuProj, normMu);
        }
        
        
        // Generated protons
        Double_t normPr = normaliseHist(hGenDeltaPrForPrProj, -1);
        normaliseHist(hGenDeltaElForPrProj, normPr);    
        normaliseHist(hGenDeltaKaForPrProj, normPr);
        normaliseHist(hGenDeltaPiForPrProj, normPr);
      }
      else {
        // Normalise generated histos to total number of particles for this delta
        // and also set some cosmetics
        
        // DeltaEl
        normaliseHist(hGenDeltaElForElProj);
        normaliseHist(hGenDeltaElForKaProj);
        normaliseHist(hGenDeltaElForPiProj);
        if (takeIntoAccountMuons)
          normaliseHist(hGenDeltaElForMuProj);
        normaliseHist(hGenDeltaElForPrProj);    
        
        // DeltaKa
        normaliseHist(hGenDeltaKaForElProj);
        normaliseHist(hGenDeltaKaForKaProj);
        normaliseHist(hGenDeltaKaForPiProj);
        if (takeIntoAccountMuons)
          normaliseHist(hGenDeltaKaForMuProj);
        normaliseHist(hGenDeltaKaForPrProj);
        
        // DeltaPi
        normaliseHist(hGenDeltaPiForElProj);
        normaliseHist(hGenDeltaPiForKaProj);
        normaliseHist(hGenDeltaPiForPiProj);
        if (takeIntoAccountMuons)
          normaliseHist(hGenDeltaPiForMuProj);
        normaliseHist(hGenDeltaPiForPrProj);
        
        // DeltaPr
        normaliseHist(hGenDeltaPrForElProj);
        normaliseHist(hGenDeltaPrForKaProj);
        normaliseHist(hGenDeltaPrForPiProj);
        if (takeIntoAccountMuons)
          normaliseHist(hGenDeltaPrForMuProj);
        normaliseHist(hGenDeltaPrForPrProj);
      }

      
      TF1* totalDeltaPion = 0x0;
      TF1* totalDeltaKaon = 0x0;
      TF1* totalDeltaProton = 0x0;
      TF1* totalDeltaElectron = 0x0;
      
      TLegend* legend = 0x0;
      
      if (iter == 1) { // Only needed for second iteration (= the only iteration w/o regularisation)
        // The number of parameters and their values will always be adjusted, such that using nPar parameters is fine
        totalDeltaPion = new TF1(Form("totalDeltaPion_slice%d", slice), (fitMethod == 2) ? multiGaussFitDeltaPi : multiGaussFit, 
                                 xLow, xUp, nPar);
        setUpFitFunction(totalDeltaPion, nBins);
        
        totalDeltaKaon = new TF1(Form("totalDeltaKaon_slice%d", slice), (fitMethod == 2) ? multiGaussFitDeltaKa : multiGaussFit,
                                 xLow, xUp, nPar);
        setUpFitFunction(totalDeltaKaon, nBins);
        
        totalDeltaProton = new TF1(Form("totalDeltaProton_slice%d", slice), (fitMethod == 2) ? multiGaussFitDeltaPr : multiGaussFit, 
                                   xLow, xUp, nPar);
        setUpFitFunction(totalDeltaProton, nBins);
        
        totalDeltaElectron = new TF1(Form("totalDeltaElectron_slice%d", slice), 
                                     (fitMethod == 2) ? multiGaussFitDeltaEl : multiGaussFit,
                                     xLow, xUp, nPar);
        setUpFitFunction(totalDeltaElectron, nBins);
        
        // Legend is the same for all \Delta "species" plots
        legend = new TLegend(0.722126, 0.605932, 0.962069, 0.925932);
        legend->SetBorderSize(0);
        legend->SetFillColor(0);
        if (plotIdentifiedSpectra)
          legend->SetNColumns(2);
        legend->AddEntry((TObject*)0x0, "Fit", "");
        if (plotIdentifiedSpectra)
          legend->AddEntry((TObject*)0x0, identifiedLabels[isMC].Data(), "");
        
        legend->AddEntry(hDeltaPi[slice], "Data", "Lp");
        if (plotIdentifiedSpectra)
          legend->AddEntry((TObject*)0x0, "", "");
        
        legend->AddEntry(totalDeltaPion, "Multi-template fit", "L");
        if (plotIdentifiedSpectra)
          legend->AddEntry(hMCmuonsAndPionsDummy, "#mu + #pi", "Lp");
        
        if (takeIntoAccountMuons)
          legend->AddEntry(hGenDeltaPiForMuProj, "#mu", "Lp");
        else if (plotIdentifiedSpectra)
          legend->AddEntry((TObject*)0x0, "", "");
        if (plotIdentifiedSpectra)
          legend->AddEntry(hDeltaPiMC[slice][kMu - 1], "#mu", "Lp");
        
        legend->AddEntry(hGenDeltaPiForPiProj, takeIntoAccountMuons ? "#pi" : "#pi + #mu", "Lp");
        if (plotIdentifiedSpectra)
          legend->AddEntry(hDeltaPiMC[slice][kPi - 1], "#pi", "Lp");
        
        legend->AddEntry(hGenDeltaPiForKaProj, "K", "Lp");
        if (plotIdentifiedSpectra)
          legend->AddEntry(hDeltaPiMC[slice][kKa - 1], "K", "Lp");
        
        legend->AddEntry(hGenDeltaPiForPrProj, "p", "Lp");
        if (plotIdentifiedSpectra)
          legend->AddEntry(hDeltaPiMC[slice][kPr - 1], "p", "Lp");
        
        legend->AddEntry(hGenDeltaPiForElProj, "e", "Lp");
        if (plotIdentifiedSpectra) 
          legend->AddEntry(hDeltaPiMC[slice][kEl -1], "e", "Lp");
      }
      
      
      // Allow tolerance of +-2% (for delta -> assume dEdx = 80 and take +-2%)
      //const Double_t peakTolerance = (useDeltaPrime ? 0.8 : 1.0) / hGenDeltaElForElProj->GetXaxis()->GetBinWidth(1);
      //const Double_t shiftStepSize = 0.01;
      const Double_t peakTolerance = (useDeltaPrime ? 0.02 : 1.6);
      const Double_t shiftStepSize = 0.01;
      
      // Assume fractions vs. pT to be smooth. Allow 1 sigma variations from bin to bin. For small pT, the error will be very small.
      // Therefore, allow at least a change of some percent.
      const Double_t nSigma = 1.;
      const Double_t minChange = 1.0; // This disables the sigma restriction
      
      Double_t fractionPions = (muonContamination ? 0.87 : 0.88);
      
      Double_t fractionErrorUpPions = 1.;
      Double_t fractionErrorLowPions = 0.;
      
      Int_t xBinInit = 0;
      if (initialiseWithFractionsFromFile) {
        Double_t xBinCentre = (mode == kPMpT) ? (binsPt[slice + 1] + binsPt[slice]) / 2.
                                              : hYieldPt->GetXaxis()->GetBinCenter(slice + 1); 
        xBinInit = hInitFracPi->GetXaxis()->FindBin(xBinCentre);
        fractionPions = hInitFracPi->GetBinContent(xBinInit) + (muonContamination ? hInitFracMu->GetBinContent(xBinInit) : 0.);
      }
      else {
        // Set found fraction from last slice, if available. Note: Current bin for slice = slice + 1
        // => Bin for last slice = slice
        if (hFractionPions->GetBinContent(slice) > 0 && hFractionPions->GetBinError(slice) > 0) {
          fractionPions = hFractionPions->GetBinContent(slice);
          fractionErrorUpPions = TMath::Min(1.0, fractionPions + TMath::Max(minChange, nSigma * hFractionPions->GetBinError(slice)));
          fractionErrorLowPions = TMath::Max(0.0, fractionPions - TMath::Max(minChange, nSigma * hFractionPions->GetBinError(slice)));
        }
      }
      
      Double_t fractionKaons = 0.08;
      Double_t fractionErrorUpKaons = 1.;
      Double_t fractionErrorLowKaons = 0.;
      
      if (initialiseWithFractionsFromFile) {
        fractionKaons = hInitFracKa->GetBinContent(xBinInit);
      }
      else {
        if (hFractionKaons->GetBinContent(slice) > 0 && hFractionKaons->GetBinError(slice) > 0) {
          fractionKaons = hFractionKaons->GetBinContent(slice);
          fractionErrorUpKaons = TMath::Min(1.0, fractionKaons + TMath::Max(minChange, nSigma * hFractionKaons->GetBinError(slice)));
          fractionErrorLowKaons = TMath::Max(0.0, fractionKaons - TMath::Max(minChange, nSigma * hFractionKaons->GetBinError(slice)));
        }
      }
       
      Double_t fractionProtons = 0.02;
      Double_t fractionErrorUpProtons = 1.;
      Double_t fractionErrorLowProtons = 0.;
      
      if (initialiseWithFractionsFromFile) {
        fractionProtons = hInitFracPr->GetBinContent(xBinInit);
      }
      else {
        if (hFractionProtons->GetBinContent(slice) > 0 && hFractionProtons->GetBinError(slice) > 0) {
          fractionProtons = hFractionProtons->GetBinContent(slice);
          fractionErrorUpProtons = TMath::Min(1.0, fractionProtons +
                                                   TMath::Max(minChange, nSigma * hFractionProtons->GetBinError(slice)));
          fractionErrorLowProtons = TMath::Max(0.0, fractionProtons -
                                                    TMath::Max(minChange, nSigma * hFractionProtons->GetBinError(slice)));
        }
      }
        
      Double_t fractionElectrons = (takeIntoAccountMuons ? 0.01 : 0.02);
      Double_t fractionErrorUpElectrons = 1.;
      Double_t fractionErrorLowElectrons = 0.;
      
      if (initialiseWithFractionsFromFile) {
        fractionElectrons = hInitFracEl->GetBinContent(xBinInit);
      }
      else {
        if (hFractionElectrons->GetBinContent(slice) > 0 && hFractionElectrons->GetBinError(slice) > 0) {
          fractionElectrons = hFractionElectrons->GetBinContent(slice);
          fractionErrorUpElectrons = TMath::Min(1.0, fractionElectrons + 
                                                     TMath::Max(minChange, nSigma * hFractionElectrons->GetBinError(slice)));
          fractionErrorLowElectrons = TMath::Max(0.0, fractionElectrons -
                                                      TMath::Max(minChange, nSigma * hFractionElectrons->GetBinError(slice)));
        }
      }
      
      Double_t fractionMuons = (takeIntoAccountMuons ? 0.01 : 0.);
      Double_t fractionErrorUpMuons = 1.;
      Double_t fractionErrorLowMuons = 0.;
      if (!takeIntoAccountMuons) {
        fractionErrorUpMuons = 0.;
        fractionErrorLowMuons = 0.;
      }
      else {
        if (initialiseWithFractionsFromFile) {
          fractionMuons = hInitFracMu->GetBinContent(xBinInit);
        }
        else {
          if (hFractionMuons->GetBinContent(slice) > 0 && hFractionMuons->GetBinError(slice) > 0) {
            fractionMuons = hFractionMuons->GetBinContent(slice);
            fractionErrorUpMuons = TMath::Min(1.0, fractionMuons + TMath::Max(minChange, nSigma * hFractionMuons->GetBinError(slice)));
            fractionErrorLowMuons = TMath::Max(0.0, fractionMuons - TMath::Max(minChange, nSigma * hFractionMuons->GetBinError(slice)));
          }
        }
      }
      
      Double_t gausParamsPi[nPar] = { 
        fractionPions,
        fractionKaons,
        fractionProtons,
        fractionElectrons,
        fractionMuons,
        allDeltaPion,
        0,
        0,
        0,
        0,
        0
      };
      
      Double_t gausParamsEl[nPar] = { 
        fractionPions,
        fractionKaons,
        fractionProtons,
        fractionElectrons,
        fractionMuons,
        allDeltaElectron,
        0,
        0,
        0,
        0,
        0
      };
      
      Double_t gausParamsKa[nPar] = { 
        fractionPions,
        fractionKaons,
        fractionProtons,
        fractionElectrons,
        fractionMuons,
        allDeltaKaon,
        0,
        0,
        0,
        0,
        0
      };
      
      Double_t gausParamsPr[nPar] = { 
        fractionPions,
        fractionKaons,
        fractionProtons,
        fractionElectrons,
        fractionMuons,
        allDeltaProton,
        0,
        0,
        0,
        0,
        0
      };
      
      Double_t lowParLimitsPi[nPar] = {
        fractionErrorLowPions,
        fractionErrorLowKaons,
        fractionErrorLowProtons,
        fractionErrorLowElectrons,
        fractionErrorLowMuons,
        allDeltaPion,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance
      };
      
      Double_t lowParLimitsEl[nPar] = {
        fractionErrorLowPions,
        fractionErrorLowKaons,
        fractionErrorLowProtons,
        fractionErrorLowElectrons,
        fractionErrorLowMuons,
        allDeltaElectron,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance
      };
      
      Double_t lowParLimitsKa[nPar] = {
        fractionErrorLowPions,
        fractionErrorLowKaons,
        fractionErrorLowProtons,
        fractionErrorLowElectrons,
        fractionErrorLowMuons,
        allDeltaKaon,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance
      };
      
      Double_t lowParLimitsPr[nPar] = {
        fractionErrorLowPions,
        fractionErrorLowKaons,
        fractionErrorLowProtons,
        fractionErrorLowElectrons,
        fractionErrorLowMuons,
        allDeltaProton,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance,
        -peakTolerance
        -peakTolerance
      };
      
      
      Double_t upParLimitsPi[nPar] = {
        fractionErrorUpPions,
        fractionErrorUpKaons,
        fractionErrorUpProtons,
        fractionErrorUpElectrons,
        fractionErrorUpMuons,
        allDeltaPion,
        peakTolerance,
        peakTolerance,
        peakTolerance,
        peakTolerance,
        peakTolerance
      };
      
      Double_t upParLimitsEl[nPar] = {
        fractionErrorUpPions,
        fractionErrorUpKaons,
        fractionErrorUpProtons,
        fractionErrorUpElectrons,
        fractionErrorUpMuons,
        allDeltaElectron,
        peakTolerance,
        peakTolerance,
        peakTolerance,
        peakTolerance,
        peakTolerance
      };
      
      Double_t upParLimitsKa[nPar] = {
        fractionErrorUpPions,
        fractionErrorUpKaons,
        fractionErrorUpProtons,
        fractionErrorUpElectrons,
        fractionErrorUpMuons,
        allDeltaKaon,
        peakTolerance,
        peakTolerance,
        peakTolerance,
        peakTolerance,
        peakTolerance
      };
      
      Double_t upParLimitsPr[nPar] = {
        fractionErrorUpPions,
        fractionErrorUpKaons,
        fractionErrorUpProtons,
        fractionErrorUpElectrons,
        fractionErrorUpMuons,
        allDeltaProton,
        peakTolerance,
        peakTolerance,
        peakTolerance,
        peakTolerance,
        peakTolerance,
      };
      
      Double_t stepSize[nPar] = {
        0.1,
        0.1,
        0.1,
        0.1,
        (takeIntoAccountMuons ? 0.1 : 0.),
        
        0.0,
        
        enableShift ? shiftStepSize : 0.,
        enableShift ? shiftStepSize : 0.,
        enableShift ? shiftStepSize : 0.,
        enableShift ? shiftStepSize : 0.,
        (enableShift && takeIntoAccountMuons) ? shiftStepSize : 0.
      };
      
      
      Double_t gausParamsSimultaneousFit[nParSimultaneousFit] = { 
        fractionPions,
        fractionKaons,
        fractionProtons,
        fractionElectrons,
        fractionMuons,
        totalYield
        // No shifts because they do not make too much sense (different eta + possible deviations from Bethe-Bloch in one x-Bin)
      };
      
      Double_t lowParLimitsSimultaneousFit[nParSimultaneousFit] = {
        fractionErrorLowPions,
        fractionErrorLowKaons,
        fractionErrorLowProtons,
        fractionErrorLowElectrons,
        fractionErrorLowMuons,
        totalYield
      };
      
      Double_t upParLimitsSimultaneousFit[nParSimultaneousFit] = {
        fractionErrorUpPions,
        fractionErrorUpKaons,
        fractionErrorUpProtons,
        fractionErrorUpElectrons,
        fractionErrorUpMuons,
        totalYield
      };
      
      Double_t stepSizeSimultaneousFit[nParSimultaneousFit] = {
        0.1,
        0.1,
        0.1,
        0.1,
        (takeIntoAccountMuons ? 0.1 : 0.),
        
        0.0
      };
      
      if (regularisation <= 0 && iter == 1) {
        // In case of no regularisation, do the fit of the electron fraction here (compare comment below)
        if (mode == kPMpT && slice == electronFractionThresholdBinForFitting) 
          hFractionElectrons->Fit(fElectronFraction, "N", "", lowFittingBoundElectronFraction, electronFractionThresholdForFitting);
      }
      
      if ((regularisation > 0 && iter == 0) || (regularisation <= 0 && iter == 1)) {
        // Set the electron fraction to the negative pT -> A function will be used
        // to evaluate the electron fraction for each bin above the threshold
        if(mode == kPMpT && slice >= electronFractionThresholdBinForFitting) {
          // In case of no regularisation, mathFit has no information about the fraction of other x bins.
          // Thus, the electron fraction is evaluated and set here. For the case w/ regularisation,
          // just "-pT" is set and the electron fraction will be evaluated during the fit.
          Double_t fixElectronFraction = (regularisation <= 0) ? fElectronFraction->Eval((binsPt[slice + 1] + binsPt[slice]) / 2.)
                                                               : -(binsPt[slice + 1] + binsPt[slice]) / 2.;
          
          if (regularisation <= 0) {
            fixElectronFraction = TMath::Min(1.0, fixElectronFraction);
            fixElectronFraction = TMath::Max(0.0, fixElectronFraction);
          }
          
          gausParamsPi[3] = fixElectronFraction;
          lowParLimitsPi[3] = fixElectronFraction;
          upParLimitsPi[3] = fixElectronFraction;
          
          gausParamsEl[3] = fixElectronFraction;
          lowParLimitsEl[3] = fixElectronFraction;
          upParLimitsEl[3] = fixElectronFraction;
          
          gausParamsKa[3] = fixElectronFraction;
          lowParLimitsKa[3] = fixElectronFraction;
          upParLimitsKa[3] = fixElectronFraction;
          
          gausParamsPr[3] = fixElectronFraction;
          lowParLimitsPr[3] = fixElectronFraction;
          upParLimitsPr[3] = fixElectronFraction;
          
          stepSize[3] = 0.0;
          
          gausParamsSimultaneousFit[3] = fixElectronFraction;
          lowParLimitsSimultaneousFit[3] = fixElectronFraction;
          upParLimitsSimultaneousFit[3] = fixElectronFraction;
          
          stepSizeSimultaneousFit[3] = 0.0;
        }   
        
        
        // Set muon fraction equal to (some modified) electron fraction above some threshold, which should be a reasonable approximation:
        // Fixed muon fraction < 0 does this job within the fitting functions
        if(mode != kPMpT || slice >= muonFractionThresholdBinForFitting) {
          // "Abuse" the muon fraction to forward the pT, which can then be used to get some modified electron fraction
          const Double_t fixedValue = -(binsPt[slice] + binsPt[slice + 1]) / 2.;
          gausParamsPi[4] = fixedValue;
          lowParLimitsPi[4] = fixedValue;
          upParLimitsPi[4] = fixedValue;
          
          gausParamsEl[4] = fixedValue;
          lowParLimitsEl[4] = fixedValue;
          upParLimitsEl[4] = fixedValue;
          
          gausParamsKa[4] = fixedValue;
          lowParLimitsKa[4] = fixedValue;
          upParLimitsKa[4] = fixedValue;
          
          gausParamsPr[4] = fixedValue;
          lowParLimitsPr[4] = fixedValue;
          upParLimitsPr[4] = fixedValue;
        
          stepSize[4] = 0.;
          
          gausParamsSimultaneousFit[4] = fixedValue;
          lowParLimitsSimultaneousFit[4] = fixedValue;
          upParLimitsSimultaneousFit[4] = fixedValue;
          
          stepSizeSimultaneousFit[4] = 0.0;
        }
      }
      
      // iter 0 used for initialisation
      if (regularisation > 0 && iter == 0) {
        const Int_t offset = currXbin * mathFit->GetNumParametersPerXbin();
        for (Int_t i = 0; i < mathFit->GetNumParametersPerXbin(); i++) {
          gausParamsSimultaneousFitRegularised[offset + i] = gausParamsSimultaneousFit[i];
          lowParLimitsSimultaneousFitRegularised[offset + i] = lowParLimitsSimultaneousFit[i];
          upParLimitsSimultaneousFitRegularised[offset + i] = upParLimitsSimultaneousFit[i];
          stepSizeSimultaneousFitRegularised[offset + i] = stepSizeSimultaneousFit[i];
        }
      }
      
      
      if (iter == 1) {
        // The parameters are only used for fitMethod < 2. Thus, they can be set for these methods,
        // although a different method is used
        totalDeltaPion->SetParameters(gausParamsPi);
        totalDeltaElectron->SetParameters(gausParamsEl);
        totalDeltaKaon->SetParameters(gausParamsKa);
        totalDeltaProton->SetParameters(gausParamsPr);
      }
      
      const TString binInfo = (mode == kPMpT) ? Form("%.2f_Pt_%.2f", binsPt[slice], binsPt[slice + 1])
                                              : Form("%.2f_%s_%.2f", hFractionPions->GetXaxis()->GetBinLowEdge(slice + 1), 
                                                     modeShortName[mode].Data(), hFractionPions->GetXaxis()->GetBinUpEdge(slice + 1));
      
      const TString binInfoTitle = (mode == kPMpT) ? Form("%.2f < Pt <%.2f", binsPt[slice], binsPt[slice + 1])
                                                   : Form("%.2f < %s < %.2f", hFractionPions->GetXaxis()->GetBinLowEdge(slice + 1), 
                                                          modeShortName[mode].Data(), 
                                                          hFractionPions->GetXaxis()->GetBinUpEdge(slice + 1));
      
      const TString fitFuncSuffix = (mode == kPMpT) ? Form("%.3f_Pt_%.3f", binsPt[slice], binsPt[slice + 1])
                                                    : Form("%.3f_%s_%.3f", hFractionPions->GetXaxis()->GetBinLowEdge(slice + 1), 
                                                           modeShortName[mode].Data(), 
                                                           hFractionPions->GetXaxis()->GetBinUpEdge(slice + 1));
      
      if (iter == 1) {
        for (Int_t species = 0; species < 4; species++) {
          cSingleFit[slice][species] = new TCanvas(Form("cSingleFit_%s_%s", binInfo.Data(), speciesLabel[species].Data()), 
                                                  Form("single fit for %s (%s)", binInfoTitle.Data(), speciesLabel[species].Data()),
                                                  1366, 768);
          cSingleFit[slice][species]->Divide(1, 2, 0.01, 0.);
          cSingleFit[slice][species]->GetPad(1)->SetRightMargin(0.001);
          cSingleFit[slice][species]->GetPad(2)->SetRightMargin(0.001);
          cSingleFit[slice][species]->GetPad(1)->SetTopMargin(0.001);
          cSingleFit[slice][species]->GetPad(2)->SetTopMargin(0.01);
          cSingleFit[slice][species]->GetPad(1)->SetBottomMargin(0.01);
          
          cSingleFit[slice][species]->GetPad(1)->SetGridx(kTRUE);
          cSingleFit[slice][species]->GetPad(2)->SetGridx(kTRUE);
          cSingleFit[slice][species]->GetPad(1)->SetGridy(kTRUE);
          cSingleFit[slice][species]->GetPad(2)->SetGridy(kTRUE);
          
          cSingleFit[slice][species]->GetPad(1)->SetLogy(kTRUE);
          cSingleFit[slice][species]->GetPad(1)->SetLogx(kTRUE);
          cSingleFit[slice][species]->GetPad(2)->SetLogx(kTRUE);
        }
      }
    
      // Problem: For p < 0.5 GeV/c, the fractions cannot be simply taken from the parameters because
      // not all entries of the histogram are inside the considered range.
      // Also: Small deviations of summed fractions from one if taking the fractions from different Delta species histos.
      // Therefore: Add up the integrals of the individual fits (\Delta species) and take the fraction of the sum
      Double_t integralTotal = 0;
      Double_t integralPions = 0, integralKaons = 0, integralProtons = 0, integralElectrons = 0, integralMuons = 0;
      
      Double_t integralPionsDeltaPion = 0, integralPionsDeltaElectron = 0, integralPionsDeltaKaon = 0, integralPionsDeltaProton = 0;
      Double_t integralElectronsDeltaPion = 0, integralElectronsDeltaElectron = 0, integralElectronsDeltaKaon = 0, 
              integralElectronsDeltaProton = 0;
      Double_t integralKaonsDeltaPion = 0, integralKaonsDeltaElectron = 0, integralKaonsDeltaKaon = 0, integralKaonsDeltaProton = 0;
      Double_t integralProtonsDeltaPion = 0, integralProtonsDeltaElectron = 0, integralProtonsDeltaKaon = 0, 
              integralProtonsDeltaProton = 0;
      Double_t integralMuonsDeltaPion = 0, integralMuonsDeltaElectron = 0, integralMuonsDeltaKaon = 0, integralMuonsDeltaProton = 0;
      
      /*
      Double_t integralErrorPions = 0, integralErrorKaons = 0, integralErrorProtons = 0, integralErrorElectrons = 0;
      
      Double_t integralErrorPionsDeltaPion = 0, integralErrorPionsDeltaElectron = 0, integralErrorPionsDeltaKaon = 0, 
              integralErrorPionsDeltaProton = 0;
      Double_t integralErrorElectronsDeltaPion = 0, integralErrorElectronsDeltaElectron = 0, integralErrorElectronsDeltaKaon = 0, 
              integralErrorElectronsDeltaProton = 0;
      Double_t integralErrorKaonsDeltaPion = 0, integralErrorKaonsDeltaElectron = 0, integralErrorKaonsDeltaKaon = 0, 
              integralErrorKaonsDeltaProton = 0;
      Double_t integralErrorProtonsDeltaPion = 0, integralErrorProtonsDeltaElectron = 0, integralErrorProtonsDeltaKaon = 0, 
              integralErrorProtonsDeltaProton = 0;
      
      Double_t integralErrorTotalDeltaPion = 0, integralErrorTotalDeltaElectron = 0, integralErrorTotalDeltaKaon = 0;   
      Double_t integralErrorTotalDeltaProton = 0;
      */
    
      Int_t errFlag = 0;
      
      // Reset temp arrays for next slice
      for (Int_t ind = 0; ind < nParUsed; ind++)
        parameterErrorsOut[ind] = 0;
      
      // Do not reset, if regularisation is on and the fit is done because the covariance matrix
      // will not be changed anymore in this case. On the other hand it will only be calculated once,
      // so resetting it would mean that is not available anymore.
      if (regularisation <= 0 || !regularisedFitDone) {
        for (Int_t i = 0; i < nParUsed; i++) {
          for (Int_t j = 0; j < nParUsed; j++) {
            covMatrix[i][j] = 0;
          }
        }
      }
      
      Double_t reducedChiSquare = -1;
      
      if (fitMethod == 2) {
        if (regularisation <= 0 && iter == 1)
          std::cout << "Fitting data simultaneously...." << std::endl << std::endl;
         
        // Add ref histos in initialisation step (w/ reg) or in the only loop (w/o reg)
        if ((regularisation > 0 && iter == 0) || (regularisation <= 0 && iter == 1)) {
          
          if (regularisation <= 0)
            mathFit->ClearRefHistos();
          
          mathFit->AddRefHisto(hGenDeltaPiForPiProj);
          mathFit->AddRefHisto(hGenDeltaPiForKaProj);
          mathFit->AddRefHisto(hGenDeltaPiForPrProj);
          mathFit->AddRefHisto(hGenDeltaPiForElProj);
          if (takeIntoAccountMuons)
            mathFit->AddRefHisto(hGenDeltaPiForMuProj);
          
          mathFit->AddRefHisto(hGenDeltaKaForPiProj);
          mathFit->AddRefHisto(hGenDeltaKaForKaProj);
          mathFit->AddRefHisto(hGenDeltaKaForPrProj);
          mathFit->AddRefHisto(hGenDeltaKaForElProj);
          if (takeIntoAccountMuons)
            mathFit->AddRefHisto(hGenDeltaKaForMuProj);
          
          mathFit->AddRefHisto(hGenDeltaPrForPiProj);
          mathFit->AddRefHisto(hGenDeltaPrForKaProj);
          mathFit->AddRefHisto(hGenDeltaPrForPrProj);
          mathFit->AddRefHisto(hGenDeltaPrForElProj);
          if (takeIntoAccountMuons)
            mathFit->AddRefHisto(hGenDeltaPrForMuProj);
          
          mathFit->AddRefHisto(hGenDeltaElForPiProj);
          mathFit->AddRefHisto(hGenDeltaElForKaProj);
          mathFit->AddRefHisto(hGenDeltaElForPrProj);
          mathFit->AddRefHisto(hGenDeltaElForElProj);
          if (takeIntoAccountMuons)
            mathFit->AddRefHisto(hGenDeltaElForMuProj);
          
          // In reg case, fill in the data for this bin and continue with the nex bin
          if (regularisation > 0) {
            TH1D* hDeltaSpecies[numSimultaneousFits] = { hDeltaPi[slice], hDeltaKa[slice], hDeltaPr[slice], hDeltaEl[slice] };
            
            for (Int_t i = 0; i < numSimultaneousFits; i++) {
              mathFit->InputData(hDeltaSpecies[i], currXbin, i, xLow, xUp, -1., kFALSE); 
            }
            
            currXbin++;
            continue;
          }
        }
        
        if (regularisation > 0 && iter == 1 && !regularisedFitDone) {
          std::cout << "Fitting data simultaneously with regularisation...." << std::endl << std::endl;
        
          // TODO At the moment, the covariance matrix is NOT forwarded from TMinuit (has completely different dimensions)
          // -> Since it is not used at the moment, this is not necessary. If it is to be used in future,
          // this has to be implemented! But one has to be careful, since parameters from different bins then
          // depend on each other! Furthermore, there will be no errors for fixed parameters like muon fraction or electron fraction
          // above the corresponding threshold in the covariance matrix, but an estimated error will be set manually.
          errFlag =  errFlag | doSimultaneousFitRegularised(nParSimultaneousFitRegularised, gausParamsSimultaneousFitRegularised, 
                                                            parameterErrorsOutRegularised, &covMatrix[0][0],
                                                            stepSizeSimultaneousFitRegularised, 
                                                            lowParLimitsSimultaneousFitRegularised, 
                                                            upParLimitsSimultaneousFitRegularised, reducedChiSquare);
          if (errFlag != 0)
            std::cout << "errFlag " << errFlag << std::endl << std::endl;
          
          reducedChiSquareRegularisation = reducedChiSquare;
          
          // Since everything is fitted in one go, only do this for the first x bin
          // (more convenient to put the fitting in the x bin loop in order to intialise
          // the parameters in the same way they are initialised for the fit w/o regularisation.
          regularisedFitDone = kTRUE;
        }
        
        if (regularisation > 0 && iter == 1) {
          // To allow for an identical processing, just forward the parameter results for the current xBin to the
          // array used by the standard simultaneous fit. The rest of the code is then the same for regularisation on and off
          
          for (Int_t i = 0; i < mathFit->GetNumParametersPerXbin(); i++) {
            const Int_t iRegularised = i + currXbin * mathFit->GetNumParametersPerXbin();
            
            gausParamsSimultaneousFit[i] = gausParamsSimultaneousFitRegularised[iRegularised];
            parameterErrorsOut[i]        = parameterErrorsOutRegularised[iRegularised];
          }
          
          // Same reducedChiSquare for all bins, since only one fit
          reducedChiSquare = reducedChiSquareRegularisation;
          
          
          // Also clear reference histos and load those for the current bin
          mathFit->ClearRefHistos();
          
          mathFit->AddRefHisto(hGenDeltaPiForPiProj);
          mathFit->AddRefHisto(hGenDeltaPiForKaProj);
          mathFit->AddRefHisto(hGenDeltaPiForPrProj);
          mathFit->AddRefHisto(hGenDeltaPiForElProj);
          if (takeIntoAccountMuons)
            mathFit->AddRefHisto(hGenDeltaPiForMuProj);
          
          mathFit->AddRefHisto(hGenDeltaKaForPiProj);
          mathFit->AddRefHisto(hGenDeltaKaForKaProj);
          mathFit->AddRefHisto(hGenDeltaKaForPrProj);
          mathFit->AddRefHisto(hGenDeltaKaForElProj);
          if (takeIntoAccountMuons)
            mathFit->AddRefHisto(hGenDeltaKaForMuProj);
          
          mathFit->AddRefHisto(hGenDeltaPrForPiProj);
          mathFit->AddRefHisto(hGenDeltaPrForKaProj);
          mathFit->AddRefHisto(hGenDeltaPrForPrProj);
          mathFit->AddRefHisto(hGenDeltaPrForElProj);
          if (takeIntoAccountMuons)
            mathFit->AddRefHisto(hGenDeltaPrForMuProj);
          
          mathFit->AddRefHisto(hGenDeltaElForPiProj);
          mathFit->AddRefHisto(hGenDeltaElForKaProj);
          mathFit->AddRefHisto(hGenDeltaElForPrProj);
          mathFit->AddRefHisto(hGenDeltaElForElProj);
          if (takeIntoAccountMuons)
            mathFit->AddRefHisto(hGenDeltaElForMuProj);
        }
      
      
        if (regularisation <= 0) {
          TH1D* hDeltaSpecies[numSimultaneousFits] = { hDeltaPi[slice], hDeltaKa[slice], hDeltaPr[slice], hDeltaEl[slice] };
          errFlag = errFlag | 
                    doSimultaneousFit(hDeltaSpecies, xLow, xUp, nParSimultaneousFit, gausParamsSimultaneousFit, parameterErrorsOut, 
                                      &covMatrix[0][0], stepSizeSimultaneousFit, lowParLimitsSimultaneousFit,
                                      upParLimitsSimultaneousFit, reducedChiSquare);
        }
        
        // Forward parameters to single fits
        for (Int_t parIndex = 0; parIndex < nPar; parIndex++) {
          // Fractions
          if (parIndex <= 4) {
            totalDeltaPion->SetParameter(parIndex, gausParamsSimultaneousFit[parIndex]);
            totalDeltaPion->SetParError(parIndex, parameterErrorsOut[parIndex]);
            
            totalDeltaKaon->SetParameter(parIndex, gausParamsSimultaneousFit[parIndex]);
            totalDeltaKaon->SetParError(parIndex, parameterErrorsOut[parIndex]);
            
            totalDeltaProton->SetParameter(parIndex, gausParamsSimultaneousFit[parIndex]);
            totalDeltaProton->SetParError(parIndex, parameterErrorsOut[parIndex]);
            
            totalDeltaElectron->SetParameter(parIndex, gausParamsSimultaneousFit[parIndex]);
            totalDeltaElectron->SetParError(parIndex, parameterErrorsOut[parIndex]);
          }
          // Total yield
          else if (parIndex == 5) {
            totalDeltaPion->SetParameter(parIndex, totalYield);
            totalDeltaPion->SetParError(parIndex, 0);
            
            totalDeltaKaon->SetParameter(parIndex, totalYield);
            totalDeltaKaon->SetParError(parIndex, 0);
            
            totalDeltaProton->SetParameter(parIndex, totalYield);
            totalDeltaProton->SetParError(parIndex, 0);
            
            totalDeltaElectron->SetParameter(parIndex, totalYield);
            totalDeltaElectron->SetParError(parIndex, 0);
          }
          // Hist shifts
          else {
            totalDeltaPion->SetParameter(parIndex, 0);
            totalDeltaPion->SetParError(parIndex, 0);
            
            totalDeltaKaon->SetParameter(parIndex, 0);
            totalDeltaKaon->SetParError(parIndex, 0);
            
            totalDeltaProton->SetParameter(parIndex, 0);
            totalDeltaProton->SetParError(parIndex, 0);
            
            totalDeltaElectron->SetParameter(parIndex, 0);
            totalDeltaElectron->SetParError(parIndex, 0);
          }
        }
        
        const Bool_t useRegularisation = regularisation > 0;
      
        // Plot single fits
        
        Int_t binLow = -1;
        Int_t binHigh = -1;
        
        // DeltaPions
        cSingleFit[slice][2]->cd(1);
        
        hDeltaPi[slice]->SetTitle("");
        SetReasonableXaxisRange(hDeltaPi[slice], binLow, binHigh);
        hDeltaPi[slice]->Draw("e");
        
        fitFuncTotalDeltaPion[slice] = (TF1*)totalDeltaPion->Clone(Form("Fit_Total_DeltaPion_%s", fitFuncSuffix.Data()));
        
        hDeltaPiFitQA[slice] = (TH1D*)hDeltaPi[slice]->Clone(Form("hDeltaPiFitQA_%d", slice));
        hDeltaPiFitQA[slice]->GetYaxis()->SetTitle("(Data - Fit) / Data");
        hDeltaPiFitQA[slice]->Add(fitFuncTotalDeltaPion[slice], -1);
        hDeltaPiFitQA[slice]->Divide(hDeltaPi[slice]);
        
        hDeltaPi[slice]->GetListOfFunctions()->Add(fitFuncTotalDeltaPion[slice]);
        fitFuncTotalDeltaPion[slice]->Draw("same");   
        
        Double_t* parametersOut = &totalDeltaPion->GetParameters()[0];
        
        hGenDeltaPiForPiProj->Scale(parametersOut[5] * (parametersOut[0] + (muonContamination ? parametersOut[3] : 0)));
        shiftHist(hGenDeltaPiForPiProj, parametersOut[6], useRegularisation);
        hGenDeltaPiForPiProj->Draw("same");
        
        hGenDeltaPiForKaProj->Scale(parametersOut[5] * parametersOut[1]);
        shiftHist(hGenDeltaPiForKaProj, parametersOut[7], useRegularisation);
        hGenDeltaPiForKaProj->Draw("same");
        
        hGenDeltaPiForPrProj->Scale(parametersOut[5] * parametersOut[2]);
        shiftHist(hGenDeltaPiForPrProj, parametersOut[8], useRegularisation);
        hGenDeltaPiForPrProj->Draw("same");
        
        hGenDeltaPiForElProj->Scale(parametersOut[5] * parametersOut[3]);
        shiftHist(hGenDeltaPiForElProj, parametersOut[9], useRegularisation);
        hGenDeltaPiForElProj->Draw("same");
        
        if (takeIntoAccountMuons) {
          hGenDeltaPiForMuProj->Scale(parametersOut[5] * parametersOut[4]);
          shiftHist(hGenDeltaPiForMuProj, parametersOut[10], useRegularisation);
          hGenDeltaPiForMuProj->Draw("same");
        }
        
        if (plotIdentifiedSpectra) {
          for (Int_t species = 0; species < 5; species++) 
            hDeltaPiMC[slice][species]->Draw("same");
          
          // Draw histo for sum of MC muons and pions
          TH1D* hMCmuonsAndPions = new TH1D(*hDeltaPiMC[slice][kPi - 1]);
          hMCmuonsAndPions->Add(hDeltaPiMC[slice][kMu - 1]);
          hMCmuonsAndPions->SetLineColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetMarkerColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetName(Form("%s_muonsAdded", hDeltaPiMC[slice][kPi - 1]->GetName()));
          hMCmuonsAndPions->Draw("same");
        }
        
        hDeltaPi[slice]->Draw("esame");
        
        legend->Draw();
        
        cSingleFit[slice][2]->cd(2);
        hDeltaPiFitQA[slice]->GetYaxis()->SetRangeUser(fitQAaxisLowBound, fitQAaxisUpBound);
        hDeltaPiFitQA[slice]->Draw("e");    
        
        hReducedChiSquarePt->SetBinContent(slice + 1, 3, reducedChiSquare);
        
       // TMatrixDSym covMatrixPi(nParUsed, &covMatrix[0][0]);   
       
        setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kPi, parametersOut, parameterErrorsOut, hFractionPions,
                              hFractionPionsDeltaPion, hFractionElectronsDeltaPion, hFractionKaonsDeltaPion,
                              hFractionProtonsDeltaPion, hFractionMuonsDeltaPion, hYieldPions, hYieldPionsDeltaPion, hYieldElectronsDeltaPion,
                              hYieldKaonsDeltaPion, hYieldProtonsDeltaPion, hYieldMuonsDeltaPion, normaliseResults);
        
        // Also set specific muon fractions and yields -> The deltaSpecies histos are not needed here: They will be set together with
        // the fraction and yields for all other species
        setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kMu, parametersOut, parameterErrorsOut, hFractionMuons,
                              0x0, 0x0, 0x0, 0x0, 0x0, hYieldMuons, 0x0, 0x0, 0x0, 0x0, 0x0, normaliseResults);
        
        
        // DeltaElectrons
        cSingleFit[slice][0]->cd(1);
        
        hDeltaEl[slice]->SetTitle("");
        SetReasonableXaxisRange(hDeltaEl[slice], binLow, binHigh);
        hDeltaEl[slice]->Draw("e");
        
        fitFuncTotalDeltaElectron[slice] = (TF1*)totalDeltaElectron->Clone(Form("Fit_Total_DeltaElectron_%s", fitFuncSuffix.Data()));
        
        hDeltaElFitQA[slice] = (TH1D*)hDeltaEl[slice]->Clone(Form("hDeltaElFitQA_%d", slice));
        hDeltaElFitQA[slice]->GetYaxis()->SetTitle("(Data - Fit) / Data");
        hDeltaElFitQA[slice]->Add(fitFuncTotalDeltaElectron[slice], -1);
        hDeltaElFitQA[slice]->Divide(hDeltaEl[slice]);
        
        hDeltaEl[slice]->GetListOfFunctions()->Add(fitFuncTotalDeltaElectron[slice]);
        fitFuncTotalDeltaElectron[slice]->Draw("same");  
        
        parametersOut = &totalDeltaElectron->GetParameters()[0];
        
        hGenDeltaElForPiProj->Scale(parametersOut[5] * (parametersOut[0] + (muonContamination ? parametersOut[3] : 0)));
        shiftHist(hGenDeltaElForPiProj, parametersOut[6], useRegularisation);
        hGenDeltaElForPiProj->Draw("same");
        
        hGenDeltaElForKaProj->Scale(parametersOut[5] * parametersOut[1]);
        shiftHist(hGenDeltaElForKaProj, parametersOut[7], useRegularisation);
        hGenDeltaElForKaProj->Draw("same");
        
        hGenDeltaElForPrProj->Scale(parametersOut[5] * parametersOut[2]);
        shiftHist(hGenDeltaElForPrProj, parametersOut[8], useRegularisation);
        hGenDeltaElForPrProj->Draw("same");
        
        hGenDeltaElForElProj->Scale(parametersOut[5] * parametersOut[3]);
        shiftHist(hGenDeltaElForElProj, parametersOut[9], useRegularisation);
        hGenDeltaElForElProj->Draw("same");
        
        if (takeIntoAccountMuons) {
          hGenDeltaElForMuProj->Scale(parametersOut[5] * parametersOut[4]);
          shiftHist(hGenDeltaElForMuProj, parametersOut[10], useRegularisation);
          hGenDeltaElForMuProj->Draw("same");
        }
        
        if (plotIdentifiedSpectra) {
          for (Int_t species = 0; species < 5; species++) 
            hDeltaElMC[slice][species]->Draw("same");
          
          // Draw histo for sum of MC muons and pions
          TH1D* hMCmuonsAndPions = new TH1D(*hDeltaElMC[slice][kPi - 1]);
          hMCmuonsAndPions->Add(hDeltaElMC[slice][kMu - 1]);
          hMCmuonsAndPions->SetLineColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetMarkerColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetName(Form("%s_muonsAdded", hDeltaElMC[slice][kPi - 1]->GetName()));
          hMCmuonsAndPions->Draw("same");
        }
        
        hDeltaEl[slice]->Draw("esame");
        
        legend->Draw();
        
        cSingleFit[slice][0]->cd(2);
        hDeltaElFitQA[slice]->GetYaxis()->SetRangeUser(fitQAaxisLowBound, fitQAaxisUpBound);
        hDeltaElFitQA[slice]->Draw("e");
        
        hReducedChiSquarePt->SetBinContent(slice + 1, 1, reducedChiSquare);
        
        //TMatrixDSym covMatrixEl(nParUsed, &covMatrix[0][0]);
        
        setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kEl, parametersOut, parameterErrorsOut, hFractionElectrons,
                              hFractionPionsDeltaElectron, hFractionElectronsDeltaElectron, hFractionKaonsDeltaElectron,
                              hFractionProtonsDeltaElectron, hFractionMuonsDeltaElectron, hYieldElectrons, hYieldPionsDeltaElectron, 
                              hYieldElectronsDeltaElectron, hYieldKaonsDeltaElectron, hYieldProtonsDeltaElectron, hYieldMuonsDeltaElectron, 
                              normaliseResults);
        
        
        
        // DeltaKaons 
        cSingleFit[slice][1]->cd(1);
        
        hDeltaKa[slice]->SetTitle("");
        SetReasonableXaxisRange(hDeltaKa[slice], binLow, binHigh);
        hDeltaKa[slice]->Draw("e");
        
        fitFuncTotalDeltaKaon[slice] = (TF1*)totalDeltaKaon->Clone(Form("Fit_Total_DeltaKaon_%s", fitFuncSuffix.Data()));
        
        hDeltaKaFitQA[slice] = (TH1D*)hDeltaKa[slice]->Clone(Form("hDeltaKaFitQA_%d", slice));
        hDeltaKaFitQA[slice]->GetYaxis()->SetTitle("(Data - Fit) / Data");
        hDeltaKaFitQA[slice]->Add(fitFuncTotalDeltaKaon[slice], -1);
        hDeltaKaFitQA[slice]->Divide(hDeltaKa[slice]);
        
        hDeltaKa[slice]->GetListOfFunctions()->Add(fitFuncTotalDeltaKaon[slice]);
        fitFuncTotalDeltaKaon[slice]->Draw("same");  
        
        parametersOut = &totalDeltaKaon->GetParameters()[0];
        
        hGenDeltaKaForPiProj->Scale(parametersOut[5] * (parametersOut[0] + (muonContamination ? parametersOut[3] : 0)));
        shiftHist(hGenDeltaKaForPiProj, parametersOut[6], useRegularisation);
        hGenDeltaKaForPiProj->Draw("same");
        
        hGenDeltaKaForKaProj->Scale(parametersOut[5] * parametersOut[1]);
        shiftHist(hGenDeltaKaForKaProj, parametersOut[7], useRegularisation);
        hGenDeltaKaForKaProj->Draw("same");
        
        hGenDeltaKaForPrProj->Scale(parametersOut[5] * parametersOut[2]);
        shiftHist(hGenDeltaKaForPrProj, parametersOut[8], useRegularisation);
        hGenDeltaKaForPrProj->Draw("same");
        
        hGenDeltaKaForElProj->Scale(parametersOut[5] * parametersOut[3]);
        shiftHist(hGenDeltaKaForElProj, parametersOut[9], useRegularisation);
        hGenDeltaKaForElProj->Draw("same");
        
        if (takeIntoAccountMuons) {
          hGenDeltaKaForMuProj->Scale(parametersOut[5] * parametersOut[4]);
          shiftHist(hGenDeltaKaForMuProj, parametersOut[10], useRegularisation);
          hGenDeltaKaForMuProj->Draw("same");
        }
        
        if (plotIdentifiedSpectra) {
          for (Int_t species = 0; species < 5; species++) 
            hDeltaKaMC[slice][species]->Draw("same");
          
          // Draw histo for sum of MC muons and pions
          TH1D* hMCmuonsAndPions = new TH1D(*hDeltaKaMC[slice][kPi - 1]);
          hMCmuonsAndPions->Add(hDeltaKaMC[slice][kMu - 1]);
          hMCmuonsAndPions->SetLineColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetMarkerColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetName(Form("%s_muonsAdded", hDeltaKaMC[slice][kPi - 1]->GetName()));
          hMCmuonsAndPions->Draw("same");
        }
        
        hDeltaKa[slice]->Draw("esame");
        
        legend->Draw();
        
        cSingleFit[slice][1]->cd(2);
        hDeltaKaFitQA[slice]->GetYaxis()->SetRangeUser(fitQAaxisLowBound, fitQAaxisUpBound);
        hDeltaKaFitQA[slice]->Draw("e");
        
        hReducedChiSquarePt->SetBinContent(slice + 1, 2, reducedChiSquare);
        
        //TMatrixDSym covMatrixKa(nParUsed, &covMatrix[0][0]);
        
        setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kKa, parametersOut, parameterErrorsOut, hFractionKaons,
                              hFractionPionsDeltaKaon, hFractionElectronsDeltaKaon, hFractionKaonsDeltaKaon, hFractionProtonsDeltaKaon,
                              hFractionMuonsDeltaKaon, hYieldKaons, hYieldPionsDeltaKaon, hYieldElectronsDeltaKaon, hYieldKaonsDeltaKaon,
                              hYieldProtonsDeltaKaon, hYieldMuonsDeltaKaon, normaliseResults);
        
        
        
        // DeltaProtons
        cSingleFit[slice][3]->cd(1);
        
        hDeltaPr[slice]->SetTitle("");
        SetReasonableXaxisRange(hDeltaPr[slice], binLow, binHigh);
        hDeltaPr[slice]->Draw("e");
        
        fitFuncTotalDeltaProton[slice] = (TF1*)totalDeltaProton->Clone(Form("Fit_Total_DeltaProton_%s", fitFuncSuffix.Data()));
        
        hDeltaPrFitQA[slice] = (TH1D*)hDeltaPr[slice]->Clone(Form("hDeltaPrFitQA_%d", slice));
        hDeltaPrFitQA[slice]->GetYaxis()->SetTitle("(Data - Fit) / Data");
        hDeltaPrFitQA[slice]->Add(fitFuncTotalDeltaProton[slice], -1);
        hDeltaPrFitQA[slice]->Divide(hDeltaPr[slice]);
        
        hDeltaPr[slice]->GetListOfFunctions()->Add(fitFuncTotalDeltaProton[slice]);
        
        fitFuncTotalDeltaProton[slice]->Draw("same");  
        
        parametersOut = &totalDeltaProton->GetParameters()[0];
        
        hGenDeltaPrForPiProj->Scale(parametersOut[5] * (parametersOut[0] + (muonContamination ? parametersOut[3] : 0)));
        shiftHist(hGenDeltaPrForPiProj, parametersOut[6], useRegularisation);
        hGenDeltaPrForPiProj->Draw("same");
        
        hGenDeltaPrForKaProj->Scale(parametersOut[5] * parametersOut[1]);
        shiftHist(hGenDeltaPrForKaProj, parametersOut[7], useRegularisation);
        hGenDeltaPrForKaProj->Draw("same");
        
        hGenDeltaPrForPrProj->Scale(parametersOut[5] * parametersOut[2]);
        shiftHist(hGenDeltaPrForPrProj, parametersOut[8], useRegularisation);
        hGenDeltaPrForPrProj->Draw("same");
        
        hGenDeltaPrForElProj->Scale(parametersOut[5] * parametersOut[3]);
        shiftHist(hGenDeltaPrForElProj, parametersOut[9], useRegularisation);
        hGenDeltaPrForElProj->Draw("same");
        
        if (takeIntoAccountMuons) {
          hGenDeltaPrForMuProj->Scale(parametersOut[5] * parametersOut[4]);
          shiftHist(hGenDeltaPrForMuProj, parametersOut[10], useRegularisation);
          hGenDeltaPrForMuProj->Draw("same");
        }
        
        if (plotIdentifiedSpectra) {
          for (Int_t species = 0; species < 5; species++) 
            hDeltaPrMC[slice][species]->Draw("same");
          
          // Draw histo for sum of MC muons and pions
          TH1D* hMCmuonsAndPions = new TH1D(*hDeltaPrMC[slice][kPi - 1]);
          hMCmuonsAndPions->Add(hDeltaPrMC[slice][kMu - 1]);
          hMCmuonsAndPions->SetLineColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetMarkerColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetName(Form("%s_muonsAdded", hDeltaPrMC[slice][kPi - 1]->GetName()));
          hMCmuonsAndPions->Draw("same");
        }
        
        hDeltaPr[slice]->Draw("esame");
        
        legend->Draw();
        
        cSingleFit[slice][3]->cd(2);
        hDeltaPrFitQA[slice]->GetYaxis()->SetRangeUser(fitQAaxisLowBound, fitQAaxisUpBound);
        hDeltaPrFitQA[slice]->Draw("e");
        
        hReducedChiSquarePt->SetBinContent(slice + 1, 4, reducedChiSquare);
        
        //TMatrixDSym covMatrixPr(nParUsed, &covMatrix[0][0]);
        
        Double_t normalisationFactor = 1.0;
        normalisationFactor = setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kPr, parametersOut, parameterErrorsOut, 
                                                    hFractionProtons, hFractionPionsDeltaProton, hFractionElectronsDeltaProton, 
                                                    hFractionKaonsDeltaProton, hFractionProtonsDeltaProton, hFractionMuonsDeltaProton, 
                                                    hYieldProtons, hYieldPionsDeltaProton, hYieldElectronsDeltaProton,
                                                    hYieldKaonsDeltaProton, hYieldProtonsDeltaProton, hYieldMuonsDeltaProton, 
                                                    normaliseResults);
        
        // Fractions are the same for all plots -> just take deltaPion as default
        Double_t sumFractions = hFractionPionsDeltaPion->GetBinContent(slice + 1) + 
            hFractionElectronsDeltaPion->GetBinContent(slice + 1) + (takeIntoAccountMuons ? hFractionMuonsDeltaPion->GetBinContent(slice + 1) : 0.) +
            hFractionKaonsDeltaPion->GetBinContent(slice + 1) + hFractionProtonsDeltaPion->GetBinContent(slice + 1);
        
        hFractionSummed->SetBinContent(slice + 1, sumFractions);
        hFractionSummed->SetBinError(slice + 1, 
                                    TMath::Sqrt(TMath::Power(hFractionPionsDeltaPion->GetBinError(slice + 1), 2) + 
                                                TMath::Power(hFractionElectronsDeltaPion->GetBinError(slice + 1), 2) +
                                                (takeIntoAccountMuons ? TMath::Power(hFractionMuonsDeltaPion->GetBinError(slice + 1), 2) : 0.) +
                                                TMath::Power(hFractionKaonsDeltaPion->GetBinError(slice + 1), 2) +
                                                TMath::Power(hFractionProtonsDeltaPion->GetBinError(slice + 1), 2)));
          
        for (Int_t species = 0; species < 4; species++) {
          cSingleFit[slice][species]->Modified();
          cSingleFit[slice][species]->Update();
        }
        
        
        // Compute the to-pi ratios with proper error for the current slice
        // NOTE: error and covariance matrix are already scaled for the simultaneous fit
        // by mathFit (it was checked that all (i.e. also off-diagonal) matrix elements grow by fScaleError^2
        // NOTE 2: take the fractions and error from the histogram (takes correct muon and electrons fractions with errors set manually 
        // in case of fixed fraction; the parameters are fixed, so the elements of the off-diagonal elements of the covariance matrix 
        // remain zero!). The fractions are then also scaled to sum up to 1 (but correction factor usually close to unity).
        // The covariance matrix is NOT scaled like this. Therefore, scale the matrix elements accordingly.
        // If the normalisation is not done for the fractions, then this factor is unity by construction.
        
        
        
        Double_t covMatrixElementToPiForEl = 0.;
        Double_t covMatrixElementToPiForMu = 0.;
        Double_t covMatrixElementToPiForKa = 0.;
        Double_t covMatrixElementToPiForPr = 0.;
        
        // Get the correct covariance matrix elements and apply the normalisation factor
        Int_t parOffset = 0;
        
        // In case of regularisation, there is an offset with respect to the current slice
        if (useRegularisation)
          parOffset = currXbin * numParamsPerXbin;
        
        
        covMatrixElementToPiForEl = covMatrix[3 + parOffset][0 + parOffset] * normalisationFactor * normalisationFactor;
        covMatrixElementToPiForMu = covMatrix[4 + parOffset][0 + parOffset] * normalisationFactor * normalisationFactor;
        covMatrixElementToPiForKa = covMatrix[1 + parOffset][0 + parOffset] * normalisationFactor * normalisationFactor;
        covMatrixElementToPiForPr = covMatrix[2 + parOffset][0 + parOffset] * normalisationFactor * normalisationFactor;
        
        Double_t ratio = -999.;
        Double_t ratioError = 999.;
        Double_t currFractionSpecies = 0.;
        Double_t currFractionPions = 0.;
        Double_t currFractionErrorSpecies = 0.;
        Double_t currFractionErrorPions = 0.;
        Double_t covMatrixElementAB = 0.; // NOTE that there is only one covariance matrix (simultaneous fit!)
        
        currFractionPions = hFractionPions->GetBinContent(slice + 1);
        currFractionErrorPions = hFractionPions->GetBinError(slice + 1);
        
        // NOTE: Even in case of regularisation, when fractions of different bins become correlated, this does NOT change
        // the formula. Only the covariance matrix element for the considered fraction in the SAME slice needs to be taken
        // into account. Explanation: f = f(fracA_slice, fracB_slice), this means that \dell f / \dell fracA_slice+-1 = 0 (etc.).
        // So, the formula is the same, although the correlation between different slices is contained in the covariance matrix.
        
        // el-to-pi ratio
        currFractionSpecies = hFractionElectrons->GetBinContent(slice + 1);
        currFractionErrorSpecies = hFractionElectrons->GetBinError(slice + 1);
        covMatrixElementAB = covMatrixElementToPiForEl;
        
        GetRatioWithCorrelatedError(currFractionSpecies, currFractionPions, currFractionErrorSpecies, currFractionErrorPions,
                                    covMatrixElementAB, ratio, ratioError);
        
        hRatioToPiElectrons->SetBinContent(slice + 1, ratio);
        hRatioToPiElectrons->SetBinError(slice + 1, ratioError);
        
        // mu-to-pi ratio
        currFractionSpecies = hFractionMuons->GetBinContent(slice + 1);
        currFractionErrorSpecies = hFractionMuons->GetBinError(slice + 1);
        covMatrixElementAB = covMatrixElementToPiForMu;
        
        GetRatioWithCorrelatedError(currFractionSpecies, currFractionPions, currFractionErrorSpecies, currFractionErrorPions,
                                    covMatrixElementAB, ratio, ratioError);
        
        hRatioToPiMuons->SetBinContent(slice + 1, ratio);
        hRatioToPiMuons->SetBinError(slice + 1, ratioError);
        
        
        // K-to-pi ratio
        currFractionSpecies = hFractionKaons->GetBinContent(slice + 1);
        currFractionErrorSpecies = hFractionKaons->GetBinError(slice + 1);
        covMatrixElementAB = covMatrixElementToPiForKa;
        
        GetRatioWithCorrelatedError(currFractionSpecies, currFractionPions, currFractionErrorSpecies, currFractionErrorPions,
                                    covMatrixElementAB, ratio, ratioError);
        
        hRatioToPiKaons->SetBinContent(slice + 1, ratio);
        hRatioToPiKaons->SetBinError(slice + 1, ratioError);
        
        
        // p-to-pi ratio
        currFractionSpecies = hFractionProtons->GetBinContent(slice + 1);
        currFractionErrorSpecies = hFractionProtons->GetBinError(slice + 1);
        covMatrixElementAB = covMatrixElementToPiForPr;
        
        GetRatioWithCorrelatedError(currFractionSpecies, currFractionPions, currFractionErrorSpecies, currFractionErrorPions,
                                    covMatrixElementAB, ratio, ratioError);
        
        hRatioToPiProtons->SetBinContent(slice + 1, ratio);
        hRatioToPiProtons->SetBinError(slice + 1, ratioError);
        
        /*
        for (Int_t i = 0; i < nParUsed; i++) {
          for (Int_t j = 0; j < nParUsed; j++) {
            printf("\t%e", covMatrix[i][j]);
          }
          printf("\n");
        }
        */
        
        currXbin++;
      }
      //_____________________________________________________________________
      // Other methods without simultaneous fitting
      else {
        Int_t binLow = -1;
        Int_t binHigh = -1;
        
        // DeltaPions 
        
        std::cout << "Fitting deltaPion...." << std::endl << std::endl;
          
        cSingleFit[slice][2]->cd(1);
        
        mathFit->ClearRefHistos();
        mathFit->AddRefHisto(hGenDeltaPiForPiProj);
        mathFit->AddRefHisto(hGenDeltaPiForKaProj);
        mathFit->AddRefHisto(hGenDeltaPiForPrProj);
        mathFit->AddRefHisto(hGenDeltaPiForElProj);
        if (takeIntoAccountMuons)
          mathFit->AddRefHisto(hGenDeltaPiForMuProj);
        
        errFlag = errFlag |
                  doFit(hDeltaPi[slice], xLow, xUp, nPar, gausParamsPi, parameterErrorsOut, &covMatrix[0][0],
                        stepSize, lowParLimitsPi, upParLimitsPi, totalDeltaPion, reducedChiSquare);
        
        hDeltaPi[slice]->SetTitle("");
        SetReasonableXaxisRange(hDeltaPi[slice], binLow, binHigh);
        hDeltaPi[slice]->Draw("e");
        
        fitFuncTotalDeltaPion[slice] = (TF1*)totalDeltaPion->Clone(Form("Fit_Total_DeltaPion_%s", fitFuncSuffix.Data()));
        
        hDeltaPiFitQA[slice] = (TH1D*)hDeltaPi[slice]->Clone(Form("hDeltaPiFitQA_%d", slice));
        hDeltaPiFitQA[slice]->GetYaxis()->SetTitle("(Data - Fit) / Data");
        hDeltaPiFitQA[slice]->Add(fitFuncTotalDeltaPion[slice], -1);
        hDeltaPiFitQA[slice]->Divide(hDeltaPi[slice]);
        
        hDeltaPi[slice]->GetListOfFunctions()->Add(fitFuncTotalDeltaPion[slice]);
        fitFuncTotalDeltaPion[slice]->Draw("same");   
        
        Double_t* parametersOut = &gausParamsPi[0];
        
        hGenDeltaPiForPiProj->Scale(gausParamsPi[5] * (gausParamsPi[0] + (muonContamination ? gausParamsPi[3] : 0)));
        shiftHist(hGenDeltaPiForPiProj, gausParamsPi[6]);
        hGenDeltaPiForPiProj->Draw("same");
        
        hGenDeltaPiForKaProj->Scale(gausParamsPi[5] * gausParamsPi[1]);
        shiftHist(hGenDeltaPiForKaProj, gausParamsPi[7]);
        hGenDeltaPiForKaProj->Draw("same");
        
        hGenDeltaPiForPrProj->Scale(gausParamsPi[5] * gausParamsPi[2]);
        shiftHist(hGenDeltaPiForPrProj, gausParamsPi[8]);
        hGenDeltaPiForPrProj->Draw("same");
        
        hGenDeltaPiForElProj->Scale(gausParamsPi[5] * gausParamsPi[3]);
        shiftHist(hGenDeltaPiForElProj, gausParamsPi[9]);
        hGenDeltaPiForElProj->Draw("same");
        
        if (takeIntoAccountMuons) {
          hGenDeltaPiForMuProj->Scale(gausParamsPi[5] * gausParamsPi[4]);
          shiftHist(hGenDeltaPiForMuProj, gausParamsPi[10]);
          hGenDeltaPiForMuProj->Draw("same");
        }
        
        if (plotIdentifiedSpectra) {
          for (Int_t species = 0; species < 5; species++) 
            hDeltaPiMC[slice][species]->Draw("same");
          
          // Draw histo for sum of MC muons and pions
          TH1D* hMCmuonsAndPions = new TH1D(*hDeltaPiMC[slice][kPi - 1]);
          hMCmuonsAndPions->Add(hDeltaPiMC[slice][kMu - 1]);
          hMCmuonsAndPions->SetLineColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetMarkerColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetName(Form("%s_muonsAdded", hDeltaPiMC[slice][kPi - 1]->GetName()));
          hMCmuonsAndPions->Draw("same");
        }
        
        hDeltaPi[slice]->Draw("esame");
        
        legend->Draw();
        
        cSingleFit[slice][2]->cd(2);
        hDeltaPiFitQA[slice]->GetYaxis()->SetRangeUser(fitQAaxisLowBound, fitQAaxisUpBound);
        hDeltaPiFitQA[slice]->Draw("e");    
        
        hReducedChiSquarePt->SetBinContent(slice + 1, 3, reducedChiSquare);
        
        TMatrixDSym covMatrixPi(nParUsed, &covMatrix[0][0]);    
      
        if (fitMethod == 1)  {
          // Histos are normalised => expression equals integral
          integralPions = allDeltaPion * (parametersOut[0] + (muonContamination ? parametersOut[3] : 0)); 
          integralTotal += integralPions;
          if (takeIntoAccountMuons) {
            integralMuons = allDeltaPion * parametersOut[4];
            integralTotal += integralMuons;
          }
          
          /*
          integralErrorTotalDeltaPion = getErrorOfTotalIntegral(covMatrixPi) * allDeltaPion;
          
          integralErrorPions = getErrorOfPionIntegral(covMatrixPi) * allDeltaPion;
          */
          
          integralPionsDeltaPion = integralPions;
          
          // Compare comment above
          integralElectronsDeltaPion = allDeltaPion * parametersOut[3];
          integralKaonsDeltaPion = allDeltaPion * parametersOut[1];
          integralProtonsDeltaPion = allDeltaPion * parametersOut[2];
          integralMuonsDeltaPion = allDeltaPion * parametersOut[4];
          
          /*
          integralErrorPionsDeltaPion = integralErrorPions;
          
          integralErrorElectronsDeltaPion = allDeltaPion * parameterErrorsOut[3];
          integralErrorKaonsDeltaPion = allDeltaPion * parameterErrorsOut[1];
          integralErrorProtonsDeltaPion = allDeltaPion * parameterErrorsOut[2];
          */
        }
        else  {
          setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kPi, parametersOut, parameterErrorsOut, hFractionPions,
                                hFractionPionsDeltaPion, hFractionElectronsDeltaPion, hFractionKaonsDeltaPion,
                                hFractionProtonsDeltaPion, hFractionMuonsDeltaPion, hYieldPions, hYieldPionsDeltaPion, hYieldElectronsDeltaPion,
                                hYieldKaonsDeltaPion, hYieldProtonsDeltaPion, hYieldMuonsDeltaPion);
          
          // Also set specific muon fractions and yields -> The deltaSpecies histos are not needed here: They will be set together with
          // the fraction and yields for all other species
          setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kMu, parametersOut, parameterErrorsOut, hFractionMuons,
                                0x0, 0x0, 0x0, 0x0, 0x0, hYieldMuons, 0x0, 0x0, 0x0, 0x0, 0x0);
        }
        
        
        std::cout << std::endl << std::endl;
        

        // DeltaElectrons
        
        std::cout << "Fitting deltaElectron...." << std::endl << std::endl;
        
        cSingleFit[slice][0]->cd(1);
        
        mathFit->ClearRefHistos();
        mathFit->AddRefHisto(hGenDeltaElForPiProj);
        mathFit->AddRefHisto(hGenDeltaElForKaProj);
        mathFit->AddRefHisto(hGenDeltaElForPrProj);
        mathFit->AddRefHisto(hGenDeltaElForElProj);
        if (takeIntoAccountMuons)
          mathFit->AddRefHisto(hGenDeltaElForMuProj);
        
        errFlag = errFlag |
                  doFit(hDeltaEl[slice], xLow, xUp, nPar, gausParamsEl, parameterErrorsOut, &covMatrix[0][0],
                        stepSize, lowParLimitsEl, upParLimitsEl, totalDeltaElectron, reducedChiSquare);
        
        hDeltaEl[slice]->SetTitle("");
        SetReasonableXaxisRange(hDeltaEl[slice], binLow, binHigh);
        hDeltaEl[slice]->Draw("e");
        
        fitFuncTotalDeltaElectron[slice] = (TF1*)totalDeltaElectron->Clone(Form("Fit_Total_DeltaElectron_%s", fitFuncSuffix.Data()));
        
        hDeltaElFitQA[slice] = (TH1D*)hDeltaEl[slice]->Clone(Form("hDeltaElFitQA_%d", slice));
        hDeltaElFitQA[slice]->GetYaxis()->SetTitle("(Data - Fit) / Data");
        hDeltaElFitQA[slice]->Add(fitFuncTotalDeltaElectron[slice], -1);
        hDeltaElFitQA[slice]->Divide(hDeltaEl[slice]);
        
        hDeltaEl[slice]->GetListOfFunctions()->Add(fitFuncTotalDeltaElectron[slice]);
        fitFuncTotalDeltaElectron[slice]->Draw("same");  
        
        parametersOut = &gausParamsEl[0];
        
        hGenDeltaElForPiProj->Scale(gausParamsEl[5] * (gausParamsEl[0] + (muonContamination ? gausParamsEl[3] : 0)));
        shiftHist(hGenDeltaElForPiProj, gausParamsEl[6]);
        hGenDeltaElForPiProj->Draw("same");
        
        hGenDeltaElForKaProj->Scale(gausParamsEl[5] * gausParamsEl[1]);
        shiftHist(hGenDeltaElForKaProj, gausParamsEl[7]);
        hGenDeltaElForKaProj->Draw("same");
        
        hGenDeltaElForPrProj->Scale(gausParamsEl[5] * gausParamsEl[2]);
        shiftHist(hGenDeltaElForPrProj, gausParamsEl[8]);
        hGenDeltaElForPrProj->Draw("same");
        
        hGenDeltaElForElProj->Scale(gausParamsEl[5] * gausParamsEl[3]);
        shiftHist(hGenDeltaElForElProj, gausParamsEl[9]);
        hGenDeltaElForElProj->Draw("same");
        
        if (takeIntoAccountMuons) {
          hGenDeltaElForMuProj->Scale(gausParamsEl[5] * gausParamsEl[4]);
          shiftHist(hGenDeltaElForMuProj, gausParamsEl[10]);
          hGenDeltaElForMuProj->Draw("same");
        }
        
        if (plotIdentifiedSpectra) {
          for (Int_t species = 0; species < 5; species++) 
            hDeltaElMC[slice][species]->Draw("same");
          
          // Draw histo for sum of MC muons and pions
          TH1D* hMCmuonsAndPions = new TH1D(*hDeltaElMC[slice][kPi - 1]);
          hMCmuonsAndPions->Add(hDeltaElMC[slice][kMu - 1]);
          hMCmuonsAndPions->SetLineColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetMarkerColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetName(Form("%s_muonsAdded", hDeltaElMC[slice][kPi - 1]->GetName()));
          hMCmuonsAndPions->Draw("same");
        }
        
        hDeltaEl[slice]->Draw("esame");
        
        legend->Draw();
        
        cSingleFit[slice][0]->cd(2);
        hDeltaElFitQA[slice]->GetYaxis()->SetRangeUser(fitQAaxisLowBound, fitQAaxisUpBound);
        hDeltaElFitQA[slice]->Draw("e");
        
        hReducedChiSquarePt->SetBinContent(slice + 1, 1, reducedChiSquare);
        
        TMatrixDSym covMatrixEl(nParUsed, &covMatrix[0][0]);
        
        if (fitMethod == 1)  {
          integralElectrons = allDeltaElectron * parametersOut[3]; // Histos are normalised => expression equals integral
          integralTotal += integralElectrons;
          
          /*                                                                   
          integralErrorTotalDeltaElectron = getErrorOfTotalIntegral(covMatrixEl) * allDeltaElectron;
          
          integralErrorElectrons = allDeltaElectron * parameterErrorsOut[3];
          */
                          
          // Factor 2 in case of takeIntoAccountMuons will be applied below
          integralElectronsDeltaElectron = integralElectrons;

          // Compare comment above
          integralPionsDeltaElectron = allDeltaElectron * (parametersOut[0] + (muonContamination ? parametersOut[3] : 0));
          integralKaonsDeltaElectron = allDeltaElectron * parametersOut[1];
          integralProtonsDeltaElectron = allDeltaElectron * parametersOut[2];
          integralMuonsDeltaElectron = allDeltaElectron * parametersOut[4];
          
          
          /*
          integralErrorElectronsDeltaElectron = integralErrorElectrons;
          
          integralErrorPionsDeltaElectron = getErrorOfPionIntegral(covMatrixEl) * allDeltaElectron;
          integralErrorKaonsDeltaElectron = allDeltaElectron * parameterErrorsOut[1];
          integralErrorProtonsDeltaElectron = allDeltaElectron * parameterErrorsOut[2];
          */
        }
        else  {
          setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kEl, parametersOut, parameterErrorsOut, hFractionElectrons,
                                hFractionPionsDeltaElectron, hFractionElectronsDeltaElectron, hFractionKaonsDeltaElectron,
                                hFractionProtonsDeltaElectron, hFractionMuonsDeltaElectron, hYieldElectrons, hYieldPionsDeltaElectron, 
                                hYieldElectronsDeltaElectron, hYieldKaonsDeltaElectron, hYieldProtonsDeltaElectron, hYieldMuonsDeltaElectron);
        }
        
        std::cout << std::endl << std::endl;
        
        // DeltaKaons 
        
        std::cout << "Fitting deltaKaon...." << std::endl << std::endl;
        
        cSingleFit[slice][1]->cd(1);
        
        mathFit->ClearRefHistos();
        mathFit->AddRefHisto(hGenDeltaKaForPiProj);
        mathFit->AddRefHisto(hGenDeltaKaForKaProj);
        mathFit->AddRefHisto(hGenDeltaKaForPrProj);
        mathFit->AddRefHisto(hGenDeltaKaForElProj);
        if (takeIntoAccountMuons)
          mathFit->AddRefHisto(hGenDeltaKaForMuProj);
        
        errFlag = errFlag |
                  doFit(hDeltaKa[slice], xLow, xUp, nPar, gausParamsKa, parameterErrorsOut, &covMatrix[0][0],
                        stepSize, lowParLimitsKa, upParLimitsKa, totalDeltaKaon, reducedChiSquare);
        
        hDeltaKa[slice]->SetTitle("");
        SetReasonableXaxisRange(hDeltaKa[slice], binLow, binHigh);
        hDeltaKa[slice]->Draw("e");
        
        fitFuncTotalDeltaKaon[slice] = (TF1*)totalDeltaKaon->Clone(Form("Fit_Total_DeltaKaon_%s", fitFuncSuffix.Data()));
        
        hDeltaKaFitQA[slice] = (TH1D*)hDeltaKa[slice]->Clone(Form("hDeltaKaFitQA_%d", slice));
        hDeltaKaFitQA[slice]->GetYaxis()->SetTitle("(Data - Fit) / Data");
        hDeltaKaFitQA[slice]->Add(fitFuncTotalDeltaKaon[slice], -1);
        hDeltaKaFitQA[slice]->Divide(hDeltaKa[slice]);
        
        hDeltaKa[slice]->GetListOfFunctions()->Add(fitFuncTotalDeltaKaon[slice]);
        fitFuncTotalDeltaKaon[slice]->Draw("same");  
        
        parametersOut = &gausParamsKa[0];
        
        hGenDeltaKaForPiProj->Scale(gausParamsKa[5] * (gausParamsKa[0] + (muonContamination ? gausParamsKa[3] : 0)));
        shiftHist(hGenDeltaKaForPiProj, gausParamsKa[6]);
        hGenDeltaKaForPiProj->Draw("same");
        
        hGenDeltaKaForKaProj->Scale(gausParamsKa[5] * gausParamsKa[1]);
        shiftHist(hGenDeltaKaForKaProj, gausParamsKa[7]);
        hGenDeltaKaForKaProj->Draw("same");
        
        hGenDeltaKaForPrProj->Scale(gausParamsKa[5] * gausParamsKa[2]);
        shiftHist(hGenDeltaKaForPrProj, gausParamsKa[8]);
        hGenDeltaKaForPrProj->Draw("same");
        
        hGenDeltaKaForElProj->Scale(gausParamsKa[5] * gausParamsKa[3]);
        shiftHist(hGenDeltaKaForElProj, gausParamsKa[9]);
        hGenDeltaKaForElProj->Draw("same");
        
        if (takeIntoAccountMuons) {
          hGenDeltaKaForMuProj->Scale(gausParamsKa[5] * gausParamsKa[4]);
          shiftHist(hGenDeltaKaForMuProj, gausParamsKa[10]);
          hGenDeltaKaForMuProj->Draw("same");
        }
        
        if (plotIdentifiedSpectra) {
          for (Int_t species = 0; species < 5; species++) 
            hDeltaKaMC[slice][species]->Draw("same");
          
          // Draw histo for sum of MC muons and pions
          TH1D* hMCmuonsAndPions = new TH1D(*hDeltaKaMC[slice][kPi - 1]);
          hMCmuonsAndPions->Add(hDeltaKaMC[slice][kMu - 1]);
          hMCmuonsAndPions->SetLineColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetMarkerColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetName(Form("%s_muonsAdded", hDeltaKaMC[slice][kPi - 1]->GetName()));
          hMCmuonsAndPions->Draw("same");
        }
        
        hDeltaKa[slice]->Draw("esame");
        
        legend->Draw();
        
        cSingleFit[slice][1]->cd(2);
        hDeltaKaFitQA[slice]->GetYaxis()->SetRangeUser(fitQAaxisLowBound, fitQAaxisUpBound);
        hDeltaKaFitQA[slice]->Draw("e");
        
        hReducedChiSquarePt->SetBinContent(slice + 1, 2, reducedChiSquare);
        
        TMatrixDSym covMatrixKa(nParUsed, &covMatrix[0][0]);
        
        if (fitMethod == 1)  {
          integralKaons = allDeltaKaon * parametersOut[1]; // Histos are normalised => expression equals integral
          integralTotal += integralKaons;
          /*
          integralErrorTotalDeltaKaon = getErrorOfTotalIntegral(covMatrixKa) * allDeltaKaon;
                                                                      
          integralErrorKaons = allDeltaKaon * parameterErrorsOut[1];
          */
          
          
          integralKaonsDeltaKaon = integralKaons;
          
          // Compare comment above
          integralPionsDeltaKaon = allDeltaKaon * (parametersOut[0] + (muonContamination ? parametersOut[3] : 0));
          integralElectronsDeltaKaon = allDeltaKaon * parametersOut[3];
          integralProtonsDeltaKaon = allDeltaKaon * parametersOut[2];
          integralMuonsDeltaKaon = allDeltaKaon * parametersOut[4];
          
          /*
          integralErrorKaonsDeltaKaon = integralErrorKaons;                                                            
                                  
          integralErrorPionsDeltaKaon = getErrorOfPionIntegral(covMatrixKa) * allDeltaKaon;
          integralErrorElectronsDeltaKaon = allDeltaKaon * parameterErrorsOut[3];
          integralErrorProtonsDeltaKaon = allDeltaKaon * parameterErrorsOut[2];
          */
        }
        else  {
          setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kKa, parametersOut, parameterErrorsOut, hFractionKaons,
                                hFractionPionsDeltaKaon, hFractionElectronsDeltaKaon, hFractionKaonsDeltaKaon, hFractionProtonsDeltaKaon,
                                hFractionMuonsDeltaKaon, hYieldKaons, hYieldPionsDeltaKaon, hYieldElectronsDeltaKaon, hYieldKaonsDeltaKaon, 
                                hYieldProtonsDeltaKaon, hYieldMuonsDeltaKaon);
        }
        
        std::cout << std::endl << std::endl;
        
        
        // DeltaProtons
        
        std::cout << "Fitting deltaProton...." << std::endl << std::endl;
        
        cSingleFit[slice][3]->cd(1);
        
        mathFit->ClearRefHistos();
        mathFit->AddRefHisto(hGenDeltaPrForPiProj);
        mathFit->AddRefHisto(hGenDeltaPrForKaProj);
        mathFit->AddRefHisto(hGenDeltaPrForPrProj);
        mathFit->AddRefHisto(hGenDeltaPrForElProj);
        if (takeIntoAccountMuons)
          mathFit->AddRefHisto(hGenDeltaPrForMuProj);
        
        errFlag = errFlag | 
                  doFit(hDeltaPr[slice], xLow, xUp, nPar, gausParamsPr, parameterErrorsOut, &covMatrix[0][0],
                        stepSize, lowParLimitsPr, upParLimitsPr, totalDeltaProton, reducedChiSquare);
        
        hDeltaPr[slice]->SetTitle("");
        SetReasonableXaxisRange(hDeltaPr[slice], binLow, binHigh);
        hDeltaPr[slice]->Draw("e");
        
        fitFuncTotalDeltaProton[slice] = (TF1*)totalDeltaProton->Clone(Form("Fit_Total_DeltaProton_%s", fitFuncSuffix.Data()));
        
        hDeltaPrFitQA[slice] = (TH1D*)hDeltaPr[slice]->Clone(Form("hDeltaPrFitQA_%d", slice));
        hDeltaPrFitQA[slice]->GetYaxis()->SetTitle("(Data - Fit) / Data");
        hDeltaPrFitQA[slice]->Add(fitFuncTotalDeltaProton[slice], -1);
        hDeltaPrFitQA[slice]->Divide(hDeltaPr[slice]);
        
        hDeltaPr[slice]->GetListOfFunctions()->Add(fitFuncTotalDeltaProton[slice]);
        
        fitFuncTotalDeltaProton[slice]->Draw("same");  
        
        parametersOut = &gausParamsPr[0];
        
        hGenDeltaPrForPiProj->Scale(gausParamsPr[5] * (gausParamsPr[0] + (muonContamination ? gausParamsPr[3] : 0)));
        shiftHist(hGenDeltaPrForPiProj, gausParamsPr[6]);
        hGenDeltaPrForPiProj->Draw("same");
        
        hGenDeltaPrForKaProj->Scale(gausParamsPr[5] * gausParamsPr[1]);
        shiftHist(hGenDeltaPrForKaProj, gausParamsPr[7]);
        hGenDeltaPrForKaProj->Draw("same");
        
        hGenDeltaPrForPrProj->Scale(gausParamsPr[5] * gausParamsPr[2]);
        shiftHist(hGenDeltaPrForPrProj, gausParamsPr[8]);
        hGenDeltaPrForPrProj->Draw("same");
        
        hGenDeltaPrForElProj->Scale(gausParamsPr[5] * gausParamsPr[3]);
        shiftHist(hGenDeltaPrForElProj, gausParamsPr[9]);
        hGenDeltaPrForElProj->Draw("same");
        
        if (takeIntoAccountMuons) {
          hGenDeltaPrForMuProj->Scale(gausParamsPr[5] * gausParamsPr[4]);
          shiftHist(hGenDeltaPrForMuProj, gausParamsPr[10]);
          hGenDeltaPrForMuProj->Draw("same");
        }
        
        if (plotIdentifiedSpectra) {
          for (Int_t species = 0; species < 5; species++) 
            hDeltaPrMC[slice][species]->Draw("same");
          
          // Draw histo for sum of MC muons and pions
          TH1D* hMCmuonsAndPions = new TH1D(*hDeltaPrMC[slice][kPi - 1]);
          hMCmuonsAndPions->Add(hDeltaPrMC[slice][kMu - 1]);
          hMCmuonsAndPions->SetLineColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetMarkerColor(getLineColor(kMuPlusPi));
          hMCmuonsAndPions->SetName(Form("%s_muonsAdded", hDeltaPrMC[slice][kPi - 1]->GetName()));
          hMCmuonsAndPions->Draw("same");
        }
        
        hDeltaPr[slice]->Draw("esame");
        
        legend->Draw();
        
        cSingleFit[slice][3]->cd(2);
        hDeltaPrFitQA[slice]->GetYaxis()->SetRangeUser(fitQAaxisLowBound, fitQAaxisUpBound);
        hDeltaPrFitQA[slice]->Draw("e");
        
        hReducedChiSquarePt->SetBinContent(slice + 1, 4, reducedChiSquare);
        
        TMatrixDSym covMatrixPr(nParUsed, &covMatrix[0][0]);
        
        if (fitMethod == 1)  {
          integralProtons = allDeltaProton * parametersOut[2]; // Histos are normalised => expression equals integral
          integralTotal += integralProtons;
          /*
          integralErrorTotalDeltaProton = getErrorOfTotalIntegral(covMatrixPr) * allDeltaProton;
          
          integralErrorProtons = allDeltaProton * parameterErrorsOut[2];
          */                                       
          
          integralProtonsDeltaProton = integralProtons;
          
          // Compare comment above
          integralPionsDeltaProton = allDeltaProton * (parametersOut[0] + (muonContamination ? parametersOut[3] : 0));
          integralElectronsDeltaProton = allDeltaProton * parametersOut[3];
          integralKaonsDeltaProton = allDeltaProton * parametersOut[1];
          integralMuonsDeltaProton = allDeltaProton * parametersOut[4];
          
          
          /*
          integralErrorProtonsDeltaProton = integralErrorProtons;                                                            
                                  
          integralErrorPionsDeltaProton = getErrorOfPionIntegral(covMatrixPr) * allDeltaProton;
          integralErrorElectronsDeltaProton = allDeltaProton * parameterErrorsOut[3];
          integralErrorKaonsDeltaProton = allDeltaProton * parameterErrorsOut[1];
          */
        }
        else  {
          setFractionsAndYields(slice, inverseBinWidth, binWidthFitHisto, kPr, parametersOut, parameterErrorsOut, hFractionProtons,
                                hFractionPionsDeltaProton, hFractionElectronsDeltaProton, hFractionKaonsDeltaProton,
                                hFractionProtonsDeltaProton, hFractionMuonsDeltaProton, hYieldProtons, hYieldPionsDeltaProton,
                                hYieldElectronsDeltaProton, hYieldKaonsDeltaProton, hYieldProtonsDeltaProton, hYieldMuonsDeltaProton);
        }
        
        std::cout << std::endl << std::endl;
      
        
        if (fitMethod == 1)  { 
          // Calculate fractions and yields for method 1
          if (integralTotal > 0)  {   
            
            Double_t sumOfParticles = 0;
            
            // Check fraction and yield determination for systematics
            // DeltaPion
            Double_t integralTotalDeltaPion = integralPionsDeltaPion + integralElectronsDeltaPion +
                                              (takeIntoAccountMuons ? integralMuonsDeltaPion : 0.) + 
                                              integralKaonsDeltaPion + integralProtonsDeltaPion;
            totalDeltaPion->GetParameters(parametersOut);
            
            Double_t pionFractionDeltaPion = saveDivide(integralPionsDeltaPion, integralTotalDeltaPion);
            Double_t pionFractionErrorDeltaPion = getErrorOfPionFraction(parametersOut, covMatrixPi);
            hFractionPionsDeltaPion->SetBinContent(slice + 1, pionFractionDeltaPion);
            hFractionPionsDeltaPion->SetBinError(slice + 1, pionFractionErrorDeltaPion);
            
            Double_t electronFractionDeltaPion = saveDivide(integralElectronsDeltaPion, integralTotalDeltaPion);
            Double_t electronFractionErrorDeltaPion = getErrorOfElectronFraction(parametersOut, covMatrixPi);
            hFractionElectronsDeltaPion->SetBinContent(slice + 1, electronFractionDeltaPion);
            hFractionElectronsDeltaPion->SetBinError(slice + 1, electronFractionErrorDeltaPion);
            
            Double_t kaonFractionDeltaPion = saveDivide(integralKaonsDeltaPion, integralTotalDeltaPion);
            Double_t kaonFractionErrorDeltaPion = getErrorOfKaonFraction(parametersOut, covMatrixPi);
            hFractionKaonsDeltaPion->SetBinContent(slice + 1, kaonFractionDeltaPion);
            hFractionKaonsDeltaPion->SetBinError(slice + 1, kaonFractionErrorDeltaPion);
            
            Double_t protonFractionDeltaPion = saveDivide(integralProtonsDeltaPion, integralTotalDeltaPion);
            Double_t protonFractionErrorDeltaPion = getErrorOfProtonFraction(parametersOut, covMatrixPi);
            hFractionProtonsDeltaPion->SetBinContent(slice + 1, protonFractionDeltaPion);
            hFractionProtonsDeltaPion->SetBinError(slice + 1, protonFractionErrorDeltaPion);
            
            Double_t muonFractionDeltaPion = saveDivide(integralMuonsDeltaPion, integralTotalDeltaPion);
            // TODO Error is anyway not implemented correctly. Just take electron error as an approximation
            Double_t muonFractionErrorDeltaPion = getErrorOfElectronFraction(parametersOut, covMatrixPi);
            hFractionMuonsDeltaPion->SetBinContent(slice + 1, muonFractionDeltaPion);
            hFractionMuonsDeltaPion->SetBinError(slice + 1, muonFractionErrorDeltaPion);
            
            sumOfParticles = inverseBinWidth * gausParamsPi[5] / binWidthFitHisto; // Divide by binWidthFitHisto, since gausParamsXX includes this width
            
            hYieldPionsDeltaPion->SetBinContent(slice + 1, sumOfParticles * hFractionPionsDeltaPion->GetBinContent(slice + 1));
            hYieldPionsDeltaPion->SetBinError(slice + 1, sumOfParticles * hFractionPionsDeltaPion->GetBinError(slice + 1));
            hYieldElectronsDeltaPion->SetBinContent(slice + 1, sumOfParticles * hFractionElectronsDeltaPion->GetBinContent(slice + 1));
            hYieldElectronsDeltaPion->SetBinError(slice + 1, sumOfParticles * hFractionElectronsDeltaPion->GetBinError(slice + 1));
            hYieldKaonsDeltaPion->SetBinContent(slice + 1, sumOfParticles * hFractionKaonsDeltaPion->GetBinContent(slice + 1));
            hYieldKaonsDeltaPion->SetBinError(slice + 1, sumOfParticles * hFractionKaonsDeltaPion->GetBinError(slice + 1));
            hYieldProtonsDeltaPion->SetBinContent(slice + 1, sumOfParticles * hFractionProtonsDeltaPion->GetBinContent(slice + 1));
            hYieldProtonsDeltaPion->SetBinError(slice + 1, sumOfParticles * hFractionProtonsDeltaPion->GetBinError(slice + 1));
            hYieldMuonsDeltaPion->SetBinContent(slice + 1, sumOfParticles * hFractionMuonsDeltaPion->GetBinContent(slice + 1));
            hYieldMuonsDeltaPion->SetBinError(slice + 1, sumOfParticles * hFractionMuonsDeltaPion->GetBinError(slice + 1));
            
            
            // DeltaElectron
            Double_t integralTotalDeltaElectron = integralPionsDeltaElectron + integralElectronsDeltaElectron + 
                                                  (takeIntoAccountMuons ? integralMuonsDeltaElectron : 0.) + 
                                                  integralKaonsDeltaElectron + integralProtonsDeltaElectron;
            totalDeltaElectron->GetParameters(parametersOut);
            
            Double_t pionFractionDeltaElectron = saveDivide(integralPionsDeltaElectron, integralTotalDeltaElectron);
            Double_t pionFractionErrorDeltaElectron = getErrorOfPionFraction(parametersOut, covMatrixEl);
            hFractionPionsDeltaElectron->SetBinContent(slice + 1, pionFractionDeltaElectron);
            hFractionPionsDeltaElectron->SetBinError(slice + 1, pionFractionErrorDeltaElectron);
            
            Double_t electronFractionDeltaElectron = saveDivide(integralElectronsDeltaElectron, integralTotalDeltaElectron);
            Double_t electronFractionErrorDeltaElectron = getErrorOfElectronFraction(parametersOut, covMatrixEl);
            hFractionElectronsDeltaElectron->SetBinContent(slice + 1, electronFractionDeltaElectron);
            hFractionElectronsDeltaElectron->SetBinError(slice + 1, electronFractionErrorDeltaElectron);
            
            Double_t kaonFractionDeltaElectron = saveDivide(integralKaonsDeltaElectron, integralTotalDeltaElectron);
            Double_t kaonFractionErrorDeltaElectron = getErrorOfKaonFraction(parametersOut, covMatrixEl);
            hFractionKaonsDeltaElectron->SetBinContent(slice + 1, kaonFractionDeltaElectron);
            hFractionKaonsDeltaElectron->SetBinError(slice + 1, kaonFractionErrorDeltaElectron);
            
            Double_t protonFractionDeltaElectron = saveDivide(integralProtonsDeltaElectron, integralTotalDeltaElectron);
            Double_t protonFractionErrorDeltaElectron = getErrorOfProtonFraction(parametersOut, covMatrixEl);
            hFractionProtonsDeltaElectron->SetBinContent(slice + 1, protonFractionDeltaElectron);
            hFractionProtonsDeltaElectron->SetBinError(slice + 1, protonFractionErrorDeltaElectron);
            
            Double_t muonFractionDeltaElectron = saveDivide(integralMuonsDeltaElectron, integralTotalDeltaElectron);
            // TODO Error is anyway not implemented correctly. Just take electron error as an approximation
            Double_t muonFractionErrorDeltaElectron = getErrorOfElectronFraction(parametersOut, covMatrixEl);
            hFractionMuonsDeltaElectron->SetBinContent(slice + 1, muonFractionDeltaElectron);
            hFractionMuonsDeltaElectron->SetBinError(slice + 1, muonFractionErrorDeltaElectron);
            
            sumOfParticles = inverseBinWidth * gausParamsEl[5] / binWidthFitHisto; // Divide by binWidthFitHisto, since gausParamsXX includes this width
            
            hYieldPionsDeltaElectron->SetBinContent(slice + 1, sumOfParticles * hFractionPionsDeltaElectron->GetBinContent(slice + 1));
            hYieldPionsDeltaElectron->SetBinError(slice + 1, sumOfParticles * hFractionPionsDeltaElectron->GetBinError(slice + 1));
            hYieldElectronsDeltaElectron->SetBinContent(slice + 1, sumOfParticles * hFractionElectronsDeltaElectron->GetBinContent(slice + 1));
            hYieldElectronsDeltaElectron->SetBinError(slice + 1, sumOfParticles * hFractionElectronsDeltaElectron->GetBinError(slice + 1));
            hYieldKaonsDeltaElectron->SetBinContent(slice + 1, sumOfParticles * hFractionKaonsDeltaElectron->GetBinContent(slice + 1));
            hYieldKaonsDeltaElectron->SetBinError(slice + 1, sumOfParticles * hFractionKaonsDeltaElectron->GetBinError(slice + 1));
            hYieldProtonsDeltaElectron->SetBinContent(slice + 1, sumOfParticles * hFractionProtonsDeltaElectron->GetBinContent(slice + 1));
            hYieldProtonsDeltaElectron->SetBinError(slice + 1, sumOfParticles * hFractionProtonsDeltaElectron->GetBinError(slice + 1));
            hYieldMuonsDeltaElectron->SetBinContent(slice + 1, sumOfParticles * hFractionMuonsDeltaElectron->GetBinContent(slice + 1));
            hYieldMuonsDeltaElectron->SetBinError(slice + 1, sumOfParticles * hFractionMuonsDeltaElectron->GetBinError(slice + 1));
            
            
            // DeltaKaon
            Double_t integralTotalDeltaKaon = integralPionsDeltaKaon + integralElectronsDeltaKaon +
                                              (takeIntoAccountMuons ? integralMuonsDeltaKaon : 0.) + 
                                              integralKaonsDeltaKaon + integralProtonsDeltaKaon;
            totalDeltaKaon->GetParameters(parametersOut);
            
            Double_t pionFractionDeltaKaon = saveDivide(integralPionsDeltaKaon, integralTotalDeltaKaon);
            Double_t pionFractionErrorDeltaKaon = getErrorOfPionFraction(parametersOut, covMatrixKa);
            hFractionPionsDeltaKaon->SetBinContent(slice + 1, pionFractionDeltaKaon);
            hFractionPionsDeltaKaon->SetBinError(slice + 1, pionFractionErrorDeltaKaon);
            
            Double_t electronFractionDeltaKaon = saveDivide(integralElectronsDeltaKaon, integralTotalDeltaKaon);
            Double_t electronFractionErrorDeltaKaon = getErrorOfElectronFraction(parametersOut, covMatrixKa);
            hFractionElectronsDeltaKaon->SetBinContent(slice + 1, electronFractionDeltaKaon);
            hFractionElectronsDeltaKaon->SetBinError(slice + 1, electronFractionErrorDeltaKaon);
            
            Double_t kaonFractionDeltaKaon = saveDivide(integralKaonsDeltaKaon, integralTotalDeltaKaon);
            Double_t kaonFractionErrorDeltaKaon = getErrorOfKaonFraction(parametersOut, covMatrixKa);
            hFractionKaonsDeltaKaon->SetBinContent(slice + 1, kaonFractionDeltaKaon);
            hFractionKaonsDeltaKaon->SetBinError(slice + 1, kaonFractionErrorDeltaKaon);
            
            Double_t protonFractionDeltaKaon = saveDivide(integralProtonsDeltaKaon, integralTotalDeltaKaon);
            Double_t protonFractionErrorDeltaKaon = getErrorOfProtonFraction(parametersOut, covMatrixKa);
            hFractionProtonsDeltaKaon->SetBinContent(slice + 1, protonFractionDeltaKaon);
            hFractionProtonsDeltaKaon->SetBinError(slice + 1, protonFractionErrorDeltaKaon);
            
            Double_t muonFractionDeltaKaon = saveDivide(integralMuonsDeltaKaon, integralTotalDeltaKaon);
            // TODO Error is anyway not implemented correctly. Just take electron error as an approximation
            Double_t muonFractionErrorDeltaKaon = getErrorOfElectronFraction(parametersOut, covMatrixKa);
            hFractionMuonsDeltaKaon->SetBinContent(slice + 1, muonFractionDeltaKaon);
            hFractionMuonsDeltaKaon->SetBinError(slice + 1, muonFractionErrorDeltaKaon);
            
            sumOfParticles = inverseBinWidth * gausParamsKa[5] / binWidthFitHisto; // Divide by binWidthFitHisto, since gausParamsXX includes this width
            
            hYieldPionsDeltaKaon->SetBinContent(slice + 1, sumOfParticles * hFractionPionsDeltaKaon->GetBinContent(slice + 1));
            hYieldPionsDeltaKaon->SetBinError(slice + 1, sumOfParticles * hFractionPionsDeltaKaon->GetBinError(slice + 1));
            hYieldElectronsDeltaKaon->SetBinContent(slice + 1, sumOfParticles * hFractionElectronsDeltaKaon->GetBinContent(slice + 1));
            hYieldElectronsDeltaKaon->SetBinError(slice + 1, sumOfParticles * hFractionElectronsDeltaKaon->GetBinError(slice + 1));
            hYieldKaonsDeltaKaon->SetBinContent(slice + 1, sumOfParticles * hFractionKaonsDeltaKaon->GetBinContent(slice + 1));
            hYieldKaonsDeltaKaon->SetBinError(slice + 1, sumOfParticles * hFractionKaonsDeltaKaon->GetBinError(slice + 1));
            hYieldProtonsDeltaKaon->SetBinContent(slice + 1, sumOfParticles * hFractionProtonsDeltaKaon->GetBinContent(slice + 1));
            hYieldProtonsDeltaKaon->SetBinError(slice + 1, sumOfParticles * hFractionProtonsDeltaKaon->GetBinError(slice + 1));
            hYieldMuonsDeltaKaon->SetBinContent(slice + 1, sumOfParticles * hFractionMuonsDeltaKaon->GetBinContent(slice + 1));
            hYieldMuonsDeltaKaon->SetBinError(slice + 1, sumOfParticles * hFractionMuonsDeltaKaon->GetBinError(slice + 1));
            
            
            
            // DeltaProton
            Double_t integralTotalDeltaProton = integralPionsDeltaProton + integralElectronsDeltaProton +
                                                (takeIntoAccountMuons ? integralMuonsDeltaProton : 0.) + 
                                                integralKaonsDeltaProton + integralProtonsDeltaProton;
            totalDeltaProton->GetParameters(parametersOut);
            
            Double_t pionFractionDeltaProton = saveDivide(integralPionsDeltaProton, integralTotalDeltaProton);
            Double_t pionFractionErrorDeltaProton = getErrorOfPionFraction(parametersOut, covMatrixPr);
            hFractionPionsDeltaProton->SetBinContent(slice + 1, pionFractionDeltaProton);
            hFractionPionsDeltaProton->SetBinError(slice + 1, pionFractionErrorDeltaProton);
            
            Double_t electronFractionDeltaProton = saveDivide(integralElectronsDeltaProton, integralTotalDeltaProton);
            Double_t electronFractionErrorDeltaProton = getErrorOfElectronFraction(parametersOut, covMatrixPr);
            hFractionElectronsDeltaProton->SetBinContent(slice + 1, electronFractionDeltaProton);
            hFractionElectronsDeltaProton->SetBinError(slice + 1, electronFractionErrorDeltaProton);
            
            Double_t kaonFractionDeltaProton = saveDivide(integralKaonsDeltaProton, integralTotalDeltaProton);
            Double_t kaonFractionErrorDeltaProton = getErrorOfKaonFraction(parametersOut, covMatrixPr);
            hFractionKaonsDeltaProton->SetBinContent(slice + 1, kaonFractionDeltaProton);
            hFractionKaonsDeltaProton->SetBinError(slice + 1, kaonFractionErrorDeltaProton);
            
            Double_t protonFractionDeltaProton = saveDivide(integralProtonsDeltaProton, integralTotalDeltaProton);
            Double_t protonFractionErrorDeltaProton = getErrorOfProtonFraction(parametersOut, covMatrixPr);
            hFractionProtonsDeltaProton->SetBinContent(slice + 1, protonFractionDeltaProton);
            hFractionProtonsDeltaProton->SetBinError(slice + 1, protonFractionErrorDeltaProton);
            
            Double_t muonFractionDeltaProton = saveDivide(integralMuonsDeltaProton, integralTotalDeltaProton);
            // TODO Error is anyway not implemented correctly. Just take electron error as an approximation
            Double_t muonFractionErrorDeltaProton = getErrorOfElectronFraction(parametersOut, covMatrixPr);
            hFractionMuonsDeltaProton->SetBinContent(slice + 1, muonFractionDeltaProton);
            hFractionMuonsDeltaProton->SetBinError(slice + 1, muonFractionErrorDeltaProton);
            
            sumOfParticles = inverseBinWidth * gausParamsPr[5] / binWidthFitHisto; // Divide by binWidthFitHisto, since gausParamsXX includes this width
            
            hYieldPionsDeltaProton->SetBinContent(slice + 1, sumOfParticles * hFractionPionsDeltaProton->GetBinContent(slice + 1));
            hYieldPionsDeltaProton->SetBinError(slice + 1, sumOfParticles * hFractionPionsDeltaProton->GetBinError(slice + 1));
            hYieldElectronsDeltaProton->SetBinContent(slice + 1, sumOfParticles * hFractionElectronsDeltaProton->GetBinContent(slice + 1));
            hYieldElectronsDeltaProton->SetBinError(slice + 1, sumOfParticles * hFractionElectronsDeltaProton->GetBinError(slice + 1));
            hYieldKaonsDeltaProton->SetBinContent(slice + 1, sumOfParticles * hFractionKaonsDeltaProton->GetBinContent(slice + 1));
            hYieldKaonsDeltaProton->SetBinError(slice + 1, sumOfParticles * hFractionKaonsDeltaProton->GetBinError(slice + 1));
            hYieldProtonsDeltaProton->SetBinContent(slice + 1, sumOfParticles * hFractionProtonsDeltaProton->GetBinContent(slice + 1));
            hYieldProtonsDeltaProton->SetBinError(slice + 1, sumOfParticles * hFractionProtonsDeltaProton->GetBinError(slice + 1));
            hYieldMuonsDeltaProton->SetBinContent(slice + 1, sumOfParticles * hFractionMuonsDeltaProton->GetBinContent(slice + 1));
            hYieldMuonsDeltaProton->SetBinError(slice + 1, sumOfParticles * hFractionMuonsDeltaProton->GetBinError(slice + 1));
            
            
            
            // Take for XXXXfractionError the median of XXXXfractionErrorYYYY and do not take into account errors
            // with value zero, since the should correspond to a failed fit (but the other fits can still converge).
            // Same for the yields
            Double_t pionFraction = saveDivide(integralPions, integralTotal);
            Double_t errorsPions[4] = { pionFractionErrorDeltaPion, pionFractionErrorDeltaElectron, 
                pionFractionErrorDeltaKaon, pionFractionErrorDeltaProton };
            Double_t pionFractionError = getMedianOfNonZeros(errorsPions);
            
            Double_t electronFraction = saveDivide(integralElectrons, integralTotal);
            Double_t errorsElectrons[4] = { electronFractionErrorDeltaPion, electronFractionErrorDeltaElectron, 
                electronFractionErrorDeltaKaon, electronFractionErrorDeltaProton };
            Double_t electronFractionError = getMedianOfNonZeros(errorsElectrons);
            
            Double_t kaonFraction = saveDivide(integralKaons, integralTotal);
            Double_t errorsKaons[4] = { kaonFractionErrorDeltaPion, kaonFractionErrorDeltaElectron, 
                kaonFractionErrorDeltaKaon, kaonFractionErrorDeltaProton };
            Double_t kaonFractionError = getMedianOfNonZeros(errorsKaons);
            
            Double_t protonFraction = saveDivide(integralProtons, integralTotal);
            Double_t errorsProtons[4] = { protonFractionErrorDeltaPion, protonFractionErrorDeltaElectron, 
                protonFractionErrorDeltaKaon, protonFractionErrorDeltaProton };
            Double_t protonFractionError = getMedianOfNonZeros(errorsProtons);
            
            Double_t muonFraction = saveDivide(integralMuons, integralTotal);
            Double_t errorsMuons[4] = { muonFractionErrorDeltaPion, muonFractionErrorDeltaElectron, 
                muonFractionErrorDeltaKaon, muonFractionErrorDeltaProton };
            Double_t muonFractionError = getMedianOfNonZeros(errorsMuons);
            
            hFractionPions->SetBinContent(slice + 1, pionFraction);
            hFractionPions->SetBinError(slice + 1, pionFractionError);
            hFractionElectrons->SetBinContent(slice + 1, electronFraction);
            hFractionElectrons->SetBinError(slice + 1, electronFractionError);
            hFractionKaons->SetBinContent(slice + 1, kaonFraction);
            hFractionKaons->SetBinError(slice + 1, kaonFractionError);
            hFractionProtons->SetBinContent(slice + 1, protonFraction);
            hFractionProtons->SetBinError(slice + 1, protonFractionError);
            hFractionMuons->SetBinContent(slice + 1, muonFraction);
            hFractionMuons->SetBinError(slice + 1, muonFractionError);
            
            hFractionSummed->SetBinContent(slice + 1, pionFraction + electronFraction + (takeIntoAccountMuons ? muonFraction : 0.) +
                                                      kaonFraction + protonFraction);
            hFractionSummed->SetBinError(slice + 1, 
                                        TMath::Sqrt(TMath::Power(pionFractionError, 2) +
                                                    TMath::Power(electronFractionError, 2)  +
                                                    (takeIntoAccountMuons ? TMath::Power(muonFractionError, 2) : 0.) +
                                                    TMath::Power(kaonFractionError, 2) +
                                                    TMath::Power(protonFractionError, 2)));
            
            sumOfParticles = inverseBinWidth * integralTotal / binWidthFitHisto; // Divide by binWidthFitHisto, since integralTotal includes this width
            
            hYieldPions->SetBinContent(slice + 1, sumOfParticles * hFractionPions->GetBinContent(slice + 1));
            hYieldPions->SetBinError(slice + 1, sumOfParticles * hFractionPions->GetBinError(slice + 1));
            hYieldElectrons->SetBinContent(slice + 1, sumOfParticles * hFractionElectrons->GetBinContent(slice + 1));
            hYieldElectrons->SetBinError(slice + 1, sumOfParticles * hFractionElectrons->GetBinError(slice + 1));
            hYieldKaons->SetBinContent(slice + 1, sumOfParticles * hFractionKaons->GetBinContent(slice + 1));
            hYieldKaons->SetBinError(slice + 1, sumOfParticles * hFractionKaons->GetBinError(slice + 1));
            hYieldProtons->SetBinContent(slice + 1, sumOfParticles * hFractionProtons->GetBinContent(slice + 1));
            hYieldProtons->SetBinError(slice + 1, sumOfParticles * hFractionProtons->GetBinError(slice + 1));
            hYieldMuons->SetBinContent(slice + 1, sumOfParticles * hFractionMuons->GetBinContent(slice + 1));
            hYieldMuons->SetBinError(slice + 1, sumOfParticles * hFractionMuons->GetBinError(slice + 1));
          }
        }
        else  {  
          Double_t SumFractionsDeltaElectron = hFractionPionsDeltaElectron->GetBinContent(slice + 1) + 
              hFractionElectronsDeltaElectron->GetBinContent(slice + 1) + 
              (takeIntoAccountMuons ? hFractionMuonsDeltaElectron->GetBinContent(slice + 1) : 0.) +
              hFractionKaonsDeltaElectron->GetBinContent(slice + 1) + hFractionProtonsDeltaElectron->GetBinContent(slice + 1);
          
          Double_t SumFractionsDeltaKaon = hFractionPionsDeltaKaon->GetBinContent(slice + 1) + 
              hFractionElectronsDeltaKaon->GetBinContent(slice + 1) +
              (takeIntoAccountMuons ? hFractionMuonsDeltaKaon->GetBinContent(slice + 1) : 0.) +
              hFractionKaonsDeltaKaon->GetBinContent(slice + 1) + hFractionProtonsDeltaKaon->GetBinContent(slice + 1);
          
          Double_t SumFractionsDeltaPion = hFractionPionsDeltaPion->GetBinContent(slice + 1) + 
              hFractionElectronsDeltaPion->GetBinContent(slice + 1) +
              (takeIntoAccountMuons ? hFractionMuonsDeltaPion->GetBinContent(slice + 1) : 0.) +
              hFractionKaonsDeltaPion->GetBinContent(slice + 1) + hFractionProtonsDeltaPion->GetBinContent(slice + 1);
          
          Double_t SumFractionsDeltaProton = hFractionPionsDeltaProton->GetBinContent(slice + 1) + 
              hFractionElectronsDeltaProton->GetBinContent(slice + 1) +
              (takeIntoAccountMuons ? hFractionMuonsDeltaProton->GetBinContent(slice + 1) : 0.) +
              hFractionKaonsDeltaProton->GetBinContent(slice + 1) + hFractionProtonsDeltaProton->GetBinContent(slice + 1);
          
          Double_t SumFractionsUsed = hFractionPionsDeltaPion->GetBinContent(slice + 1) + 
              hFractionElectronsDeltaElectron->GetBinContent(slice + 1) +
              (takeIntoAccountMuons ? hFractionMuonsDeltaPion->GetBinContent(slice + 1) : 0.) +
              hFractionKaonsDeltaKaon->GetBinContent(slice + 1) + hFractionProtonsDeltaProton->GetBinContent(slice + 1);
          
          hFractionSummed->SetBinContent(slice + 1, SumFractionsUsed);
          hFractionSummed->SetBinError(slice + 1, 
                                      TMath::Sqrt(TMath::Power(hFractionPionsDeltaPion->GetBinError(slice + 1), 2) + 
                                                  TMath::Power(hFractionElectronsDeltaElectron->GetBinError(slice + 1), 2) +
                                                  (takeIntoAccountMuons ? TMath::Power(hFractionMuonsDeltaPion->GetBinError(slice + 1),   
                                                                                        2) : 0.) +
                                                  TMath::Power(hFractionKaonsDeltaKaon->GetBinError(slice + 1), 2) +
                                                  TMath::Power(hFractionProtonsDeltaProton->GetBinError(slice + 1), 2)));
          
          
          std::cout << "Sum Fractions DeltaElectron: " << SumFractionsDeltaElectron;
          std::cout << (TMath::Abs(SumFractionsDeltaElectron - 1) >= 0.001 ? " WARNING: Deviation >= 0.001" : "") << std::endl;
          
          std::cout << "Sum Fractions DeltaKaon: " << SumFractionsDeltaKaon;
          std::cout << (TMath::Abs(SumFractionsDeltaKaon - 1) >= 0.001 ? " WARNING: Deviation >= 0.001" : "") << std::endl;
          
          std::cout << "Sum Fractions DeltaPion: " << SumFractionsDeltaPion;
          std::cout << (TMath::Abs(SumFractionsDeltaPion - 1) >= 0.001 ? " WARNING: Deviation >= 0.001" : "") << std::endl;
          
          std::cout << "Sum fractions DeltaProton: " << SumFractionsDeltaProton;
          std::cout << (TMath::Abs(SumFractionsDeltaProton - 1) >= 0.001 ? " WARNING: Deviation >= 0.001" : "") << std::endl;
          
          std::cout << "Sum fractions used: " << SumFractionsUsed;
          std::cout << (TMath::Abs(SumFractionsUsed - 1) >= 0.001 ? " WARNING: Deviation >= 0.001" : "") << std::endl;
        }
        
        for (Int_t species = 0; species < 4; species++) {
          cSingleFit[slice][species]->Modified();
          cSingleFit[slice][species]->Update();
        }
        
      
      }
      
      if (regularisation <= 0)
        std::cout << std::endl << std::endl;
      
      
      // MC results
      Double_t MCtotal = -1, MCelectrons = -1, MCkaons = -1, MCmuons = -1, MCpions = -1, MCprotons = -1;
      Double_t MCelectronsErr = 0, MCkaonsErr = 0, MCmuonsErr = 0, MCpionsErr = 0, MCprotonsErr = 0;
      
      MCelectrons = hMCdata->IntegralAndError(pBinLowProjLimit, pBinUpProjLimit, 1, 1, MCelectronsErr) * inverseBinWidth;
      MCkaons     = hMCdata->IntegralAndError(pBinLowProjLimit, pBinUpProjLimit, 2, 2, MCkaonsErr)     * inverseBinWidth;
      MCmuons     = hMCdata->IntegralAndError(pBinLowProjLimit, pBinUpProjLimit, 3, 3, MCmuonsErr)     * inverseBinWidth;
      MCpions     = hMCdata->IntegralAndError(pBinLowProjLimit, pBinUpProjLimit, 4, 4, MCpionsErr)     * inverseBinWidth;
      MCprotons   = hMCdata->IntegralAndError(pBinLowProjLimit, pBinUpProjLimit, 5, 5, MCprotonsErr)   * inverseBinWidth;

      MCelectronsErr *= inverseBinWidth;
      MCkaonsErr *= inverseBinWidth;
      MCmuonsErr *= inverseBinWidth;
      MCpionsErr *= inverseBinWidth;
      MCprotonsErr *= inverseBinWidth;
      
      MCtotal = MCelectrons + MCkaons + MCpions + MCprotons + MCmuons;
      
      if (MCtotal > 0)  {
        hYieldElectronsMC->SetBinContent(slice + 1, MCelectrons);
        hYieldElectronsMC->SetBinError(slice + 1, MCelectronsErr);
        
        hYieldMuonsMC->SetBinContent(slice + 1, MCmuons);
        hYieldMuonsMC->SetBinError(slice + 1, MCmuonsErr);
        
        hYieldKaonsMC->SetBinContent(slice + 1, MCkaons);
        hYieldKaonsMC->SetBinError(slice + 1, MCkaonsErr);
        
        hYieldPionsMC->SetBinContent(slice + 1, MCpions);
        hYieldPionsMC->SetBinError(slice + 1, MCpionsErr);
        
        hYieldProtonsMC->SetBinContent(slice + 1, MCprotons);
        hYieldProtonsMC->SetBinError(slice + 1, MCprotonsErr);
        
        hYieldSummedMC->SetBinContent(slice + 1, hYieldElectronsMC->GetBinContent(slice + 1) +
                                                hYieldKaonsMC->GetBinContent(slice + 1) +                           
                                                hYieldPionsMC->GetBinContent(slice + 1) +
                                                hYieldProtonsMC->GetBinContent(slice + 1) +
                                                hYieldMuonsMC->GetBinContent(slice + 1));
        hYieldSummedMC->SetBinError(slice + 1, TMath::Sqrt(TMath::Power(hYieldPionsMC->GetBinError(slice + 1), 2) + 
                                                          TMath::Power(hYieldElectronsMC->GetBinError(slice + 1), 2) +
                                                          TMath::Power(hYieldKaonsMC->GetBinError(slice + 1), 2) +
                                                          TMath::Power(hYieldProtonsMC->GetBinError(slice + 1), 2) +
                                                          TMath::Power(hYieldMuonsMC->GetBinError(slice + 1), 2)));
        
        // MCspecies and MCtotal are correlated. This can be taken into account via using the binomial error in the division
        hFractionElectronsMC->Divide(hYieldElectronsMC, hYieldSummedMC, 1., 1., "B");
        hFractionMuonsMC->Divide(hYieldMuonsMC, hYieldSummedMC, 1., 1., "B");
        hFractionKaonsMC->Divide(hYieldKaonsMC, hYieldSummedMC, 1., 1., "B");
        hFractionPionsMC->Divide(hYieldPionsMC, hYieldSummedMC, 1., 1., "B");
        hFractionProtonsMC->Divide(hYieldProtonsMC, hYieldSummedMC, 1., 1., "B");
      }
      
      // Save further results
      if (slice % 18 == 0 || slice == pSliceLow) {
        saveF->cd();  

        if (hFractionElectrons)
          hFractionElectrons->Write(0, TObject::kWriteDelete);
          
        if (hFractionKaons)
          hFractionKaons->Write(0, TObject::kWriteDelete);
        
        if (hFractionPions)
          hFractionPions->Write(0, TObject::kWriteDelete);
        
        if (hFractionProtons)
          hFractionProtons->Write(0, TObject::kWriteDelete);
        
        if (hFractionMuons)
          hFractionMuons->Write(0, TObject::kWriteDelete);
        
        if (hFractionSummed)
          hFractionSummed->Write(0, TObject::kWriteDelete);
          
          
        if (hFractionElectronsDeltaElectron)
          hFractionElectronsDeltaElectron->Write(0, TObject::kWriteDelete);
          
        if (hFractionKaonsDeltaElectron)
          hFractionKaonsDeltaElectron->Write(0, TObject::kWriteDelete);
        
        if (hFractionPionsDeltaElectron)
          hFractionPionsDeltaElectron->Write(0, TObject::kWriteDelete);
        
        if (hFractionProtonsDeltaElectron)
          hFractionProtonsDeltaElectron->Write(0, TObject::kWriteDelete);
        
        if (hFractionMuonsDeltaElectron)
          hFractionMuonsDeltaElectron->Write(0, TObject::kWriteDelete);
          
          
        if (hFractionElectronsDeltaPion)
          hFractionElectronsDeltaPion->Write(0, TObject::kWriteDelete);
          
        if (hFractionKaonsDeltaPion)
          hFractionKaonsDeltaPion->Write(0, TObject::kWriteDelete);
        
        if (hFractionPionsDeltaPion)
          hFractionPionsDeltaPion->Write(0, TObject::kWriteDelete);
        
        if (hFractionProtonsDeltaPion)
          hFractionProtonsDeltaPion->Write(0, TObject::kWriteDelete);
        
        if (hFractionMuonsDeltaPion)
          hFractionMuonsDeltaPion->Write(0, TObject::kWriteDelete);
          
        
        if (hFractionElectronsDeltaKaon)
          hFractionElectronsDeltaKaon->Write(0, TObject::kWriteDelete);
          
        if (hFractionKaonsDeltaKaon)
          hFractionKaonsDeltaKaon->Write(0, TObject::kWriteDelete);
        
        if (hFractionPionsDeltaKaon)
          hFractionPionsDeltaKaon->Write(0, TObject::kWriteDelete);
        
        if (hFractionProtonsDeltaKaon)
          hFractionProtonsDeltaKaon->Write(0, TObject::kWriteDelete);
        
        if (hFractionMuonsDeltaKaon)
          hFractionMuonsDeltaKaon->Write(0, TObject::kWriteDelete);
          
        
        if (hFractionElectronsDeltaProton)
          hFractionElectronsDeltaProton->Write(0, TObject::kWriteDelete);
          
        if (hFractionKaonsDeltaProton)
          hFractionKaonsDeltaProton->Write(0, TObject::kWriteDelete);
        
        if (hFractionPionsDeltaProton)
          hFractionPionsDeltaProton->Write(0, TObject::kWriteDelete);
        
        if (hFractionProtonsDeltaProton)
          hFractionProtonsDeltaProton->Write(0, TObject::kWriteDelete);
        
        if (hFractionMuonsDeltaProton)
          hFractionMuonsDeltaProton->Write(0, TObject::kWriteDelete);
          
          
        if (hFractionElectronsMC)
          hFractionElectronsMC->Write(0, TObject::kWriteDelete);
        
        if (hFractionKaonsMC)
          hFractionKaonsMC->Write(0, TObject::kWriteDelete);
        
        if (hFractionPionsMC)
          hFractionPionsMC->Write(0, TObject::kWriteDelete);
        
        if (hFractionMuonsMC)
          hFractionMuonsMC->Write(0, TObject::kWriteDelete);
        
        if (hFractionProtonsMC)
          hFractionProtonsMC->Write(0, TObject::kWriteDelete);
        
        
        
        
        if (hYieldElectrons)
          hYieldElectrons->Write(0, TObject::kWriteDelete);
          
        if (hYieldKaons)
          hYieldKaons->Write(0, TObject::kWriteDelete);
        
        if (hYieldPions)
          hYieldPions->Write(0, TObject::kWriteDelete);
        
        if (hYieldProtons)
          hYieldProtons->Write(0, TObject::kWriteDelete);
        
        if (hYieldMuons)
          hYieldMuons->Write(0, TObject::kWriteDelete);
          
          
        if (hYieldElectronsDeltaElectron)
          hYieldElectronsDeltaElectron->Write(0, TObject::kWriteDelete);
          
        if (hYieldKaonsDeltaElectron)
          hYieldKaonsDeltaElectron->Write(0, TObject::kWriteDelete);
        
        if (hYieldPionsDeltaElectron)
          hYieldPionsDeltaElectron->Write(0, TObject::kWriteDelete);
        
        if (hYieldProtonsDeltaElectron)
          hYieldProtonsDeltaElectron->Write(0, TObject::kWriteDelete);
        
        if (hYieldMuonsDeltaElectron)
          hYieldMuonsDeltaElectron->Write(0, TObject::kWriteDelete);
          
          
        if (hYieldElectronsDeltaPion)
          hYieldElectronsDeltaPion->Write(0, TObject::kWriteDelete);
          
        if (hYieldKaonsDeltaPion)
          hYieldKaonsDeltaPion->Write(0, TObject::kWriteDelete);
        
        if (hYieldPionsDeltaPion)
          hYieldPionsDeltaPion->Write(0, TObject::kWriteDelete);
        
        if (hYieldProtonsDeltaPion)
          hYieldProtonsDeltaPion->Write(0, TObject::kWriteDelete);
        
        if (hYieldMuonsDeltaPion)
          hYieldMuonsDeltaPion->Write(0, TObject::kWriteDelete);
          
        
        if (hYieldElectronsDeltaKaon)
          hYieldElectronsDeltaKaon->Write(0, TObject::kWriteDelete);
          
        if (hYieldKaonsDeltaKaon)
          hYieldKaonsDeltaKaon->Write(0, TObject::kWriteDelete);
        
        if (hYieldPionsDeltaKaon)
          hYieldPionsDeltaKaon->Write(0, TObject::kWriteDelete);
        
        if (hYieldProtonsDeltaKaon)
          hYieldProtonsDeltaKaon->Write(0, TObject::kWriteDelete);
        
        if (hYieldMuonsDeltaKaon)
          hYieldMuonsDeltaKaon->Write(0, TObject::kWriteDelete);
          
        
        if (hYieldElectronsDeltaProton)
          hYieldElectronsDeltaProton->Write(0, TObject::kWriteDelete);
          
        if (hYieldKaonsDeltaProton)
          hYieldKaonsDeltaProton->Write(0, TObject::kWriteDelete);
        
        if (hYieldPionsDeltaProton)
          hYieldPionsDeltaProton->Write(0, TObject::kWriteDelete);
        
        if (hYieldProtonsDeltaProton)
          hYieldProtonsDeltaProton->Write(0, TObject::kWriteDelete);
        
        if (hYieldMuonsDeltaProton)
          hYieldMuonsDeltaProton->Write(0, TObject::kWriteDelete);
          
          
        if (hYieldElectronsMC)
          hYieldElectronsMC->Write(0, TObject::kWriteDelete);
        
        if (hYieldKaonsMC)
          hYieldKaonsMC->Write(0, TObject::kWriteDelete);
        
        if (hYieldPionsMC)
          hYieldPionsMC->Write(0, TObject::kWriteDelete);
        
        if (hYieldMuonsMC)
          hYieldMuonsMC->Write(0, TObject::kWriteDelete);
        
        if (hYieldProtonsMC)
          hYieldProtonsMC->Write(0, TObject::kWriteDelete);
        
        if (hYieldSummedMC)
          hYieldSummedMC->Write(0, TObject::kWriteDelete);
      }
      
      TString saveDir = (mode == kPMpT) ? Form("SingleFit_%.2f_Pt_%.2f", binsPt[slice], binsPt[slice + 1])
                                        : Form("SingleFit_%.2f_%s_%.2f", hFractionPions->GetXaxis()->GetBinLowEdge(slice + 1), 
                                              modeShortName[mode].Data(), hFractionPions->GetXaxis()->GetBinUpEdge(slice + 1));
      saveF->mkdir(saveDir.Data());
      saveF->cd(saveDir.Data());
      
      for (Int_t species = 0; species < 4; species++) {
        if (cSingleFit[slice][species]) {
          cSingleFit[slice][species]->Write();
          delete cSingleFit[slice][species];
        }
      }
      
      if (hDeltaPi[slice])
        hDeltaPi[slice]->Write();
      
      if (hDeltaEl[slice])
        hDeltaEl[slice]->Write();
      
      if (hDeltaKa[slice])
        hDeltaKa[slice]->Write();
      
      if (hDeltaPr[slice])
        hDeltaPr[slice]->Write();
      
      
      if (hDeltaPiFitQA[slice])
        hDeltaPiFitQA[slice]->Write();
      delete hDeltaPiFitQA[slice];
      
      if (hDeltaElFitQA[slice])
        hDeltaElFitQA[slice]->Write();
      delete hDeltaElFitQA[slice];
      
      if (hDeltaKaFitQA[slice])
        hDeltaKaFitQA[slice]->Write();
      delete hDeltaKaFitQA[slice];
      
      if (hDeltaPrFitQA[slice])
        hDeltaPrFitQA[slice]->Write();
      delete hDeltaPrFitQA[slice];
      
      if (hGenDeltaElForElProj) 
        hGenDeltaElForElProj->Write();
      delete hGenDeltaElForElProj;
      
      if (hGenDeltaElForKaProj) 
        hGenDeltaElForKaProj->Write();
      delete hGenDeltaElForKaProj;
      
      if (hGenDeltaElForPiProj) 
        hGenDeltaElForPiProj->Write();
      delete hGenDeltaElForPiProj;
      
      if (hGenDeltaElForPrProj) 
        hGenDeltaElForPrProj->Write();
      delete hGenDeltaElForPrProj;
      
      if (hGenDeltaElForMuProj) 
        hGenDeltaElForMuProj->Write();
      delete hGenDeltaElForMuProj;
      
      //if (fitFuncTotalDeltaElectron[slice]) 
      //  fitFuncTotalDeltaElectron[slice]->Write();
      delete fitFuncTotalDeltaElectron[slice];
      
      if (hGenDeltaKaForElProj) 
        hGenDeltaKaForElProj->Write();
      delete hGenDeltaKaForElProj;
      
      if (hGenDeltaKaForKaProj) 
        hGenDeltaKaForKaProj->Write();
      delete hGenDeltaKaForKaProj;
      
      if (hGenDeltaKaForPiProj) 
        hGenDeltaKaForPiProj->Write();
      delete hGenDeltaKaForPiProj;
      
      if (hGenDeltaKaForPrProj) 
        hGenDeltaKaForPrProj->Write();
      delete hGenDeltaKaForPrProj;
      
      if (hGenDeltaKaForMuProj) 
        hGenDeltaKaForMuProj->Write();
      delete hGenDeltaKaForMuProj;
      
      //if (fitFuncTotalDeltaKaon[slice]) 
      //  fitFuncTotalDeltaKaon[slice]->Write();
      delete fitFuncTotalDeltaKaon[slice];
      
        
      if (hGenDeltaPiForElProj) 
        hGenDeltaPiForElProj->Write();
      delete hGenDeltaPiForElProj;
      
      if (hGenDeltaPiForKaProj) 
        hGenDeltaPiForKaProj->Write();
      delete hGenDeltaPiForKaProj;
      
      if (hGenDeltaPiForPiProj) 
        hGenDeltaPiForPiProj->Write();
      delete hGenDeltaPiForPiProj;
      
      if (hGenDeltaPiForPrProj) 
        hGenDeltaPiForPrProj->Write();
      delete hGenDeltaPiForPrProj;
      
      if (hGenDeltaPiForMuProj) 
        hGenDeltaPiForMuProj->Write();
      delete hGenDeltaPiForMuProj;
      
      //if (fitFuncTotalDeltaPion[slice]) 
      //  fitFuncTotalDeltaPion[slice]->Write();
      delete fitFuncTotalDeltaPion[slice];
      
      
      if (hGenDeltaPrForElProj) 
        hGenDeltaPrForElProj->Write();
      delete hGenDeltaPrForElProj;
      
      if (hGenDeltaPrForKaProj) 
        hGenDeltaPrForKaProj->Write();
      delete hGenDeltaPrForKaProj;
      
      if (hGenDeltaPrForPiProj) 
        hGenDeltaPrForPiProj->Write();
      delete hGenDeltaPrForPiProj;
      
      if (hGenDeltaPrForPrProj) 
        hGenDeltaPrForPrProj->Write();
      delete hGenDeltaPrForPrProj;
      
      if (hGenDeltaPrForMuProj) 
        hGenDeltaPrForMuProj->Write();
      delete hGenDeltaPrForMuProj;
      
      //if (fitFuncTotalDeltaProton[slice]) 
      //  fitFuncTotalDeltaProton[slice]->Write();
      delete fitFuncTotalDeltaProton[slice];
      
      delete totalDeltaElectron;
      delete totalDeltaKaon;
      delete totalDeltaPion;
      delete totalDeltaProton;
      
      delete legend;
      
      if (errFlag != 0)
        std::cout << "errFlag " << errFlag << std::endl << std::endl;
    }
  }
  
  // Calculate MC to-pi ratios -> In MC the yields are uncorrelated, so just divide the histos to get the correct result
  hRatioToPiElectronsMC->Divide(hYieldElectronsMC, hYieldPionsMC);
  hRatioToPiMuonsMC->Divide(hYieldMuonsMC, hYieldPionsMC);
  hRatioToPiKaonsMC->Divide(hYieldKaonsMC, hYieldPionsMC);
  hRatioToPiProtonsMC->Divide(hYieldProtonsMC, hYieldPionsMC);
  
  
  TCanvas* cFractions = new TCanvas("cFractions", "Particle fractions",100,10,1200,800);
  cFractions->SetGridx(1);
  cFractions->SetGridy(1);
  cFractions->SetLogx(mode == kPMpT);
  hFractionPions->GetYaxis()->SetRangeUser(0.0, 1.0);
  SetReasonableAxisRange(hFractionPions->GetXaxis(), mode, pLow, pHigh);
  hFractionPions->GetXaxis()->SetMoreLogLabels(kTRUE);
  hFractionPions->GetXaxis()->SetNoExponent(kTRUE);
  hFractionPions->Draw("e p");
  if (plotIdentifiedSpectra) {
    SetReasonableAxisRange(hFractionPionsMC->GetXaxis(), mode, pLow, pHigh);
    hFractionPionsMC->Draw("e p same");
  }
  
  SetReasonableAxisRange(hFractionKaons->GetXaxis(), mode, pLow, pHigh);
  hFractionKaons->Draw("e p same");
  if (plotIdentifiedSpectra) {
    SetReasonableAxisRange(hFractionKaonsMC->GetXaxis(), mode, pLow, pHigh);
    hFractionKaonsMC->Draw("e p same");
  }
  
  SetReasonableAxisRange(hFractionProtons->GetXaxis(), mode, pLow, pHigh);
  hFractionProtons->Draw("e p same");
  if (plotIdentifiedSpectra) {
    SetReasonableAxisRange(hFractionProtonsMC->GetXaxis(), mode, pLow, pHigh);
    hFractionProtonsMC->Draw("e p same");
  }
  
  SetReasonableAxisRange(hFractionElectrons->GetXaxis(), mode, pLow, pHigh);
  hFractionElectrons->Draw("e p same");
  if (plotIdentifiedSpectra) {
    SetReasonableAxisRange(hFractionElectronsMC->GetXaxis(), mode, pLow, pHigh);
    hFractionElectronsMC->Draw("e p same");
  }
  
  if (takeIntoAccountMuons) {
    SetReasonableAxisRange(hFractionMuons->GetXaxis(), mode, pLow, pHigh);
    hFractionMuons->Draw("e p same");
  }
  if (plotIdentifiedSpectra) {
    SetReasonableAxisRange(hFractionMuonsMC->GetXaxis(), mode, pLow, pHigh);
    hFractionMuonsMC->Draw("e p same");
  }
  
  hFractionSummed->Draw("e p same");
  
  if (mode == kPMpT) {
    fElectronFraction->SetRange(lowFittingBoundElectronFraction, pHigh);
    fElectronFraction->Draw("same");
  }
  
  TLegend* legend = new TLegend(0.622126, 0.605932, 0.862069, 0.855932);    
  legend->SetBorderSize(0);
  legend->SetFillColor(0);
  if (plotIdentifiedSpectra)
    legend->SetNColumns(2);
  if (plotIdentifiedSpectra)
    legend->AddEntry((TObject*)0x0, "Fit", "");
  if (plotIdentifiedSpectra)
    legend->AddEntry((TObject*)0x0, identifiedLabels[isMC].Data(), "");
  legend->AddEntry(hFractionPions, "#pi", "p");
  if (plotIdentifiedSpectra)
    legend->AddEntry(hFractionPionsMC, "#pi", "p");
  legend->AddEntry(hFractionKaons, "K", "p");
  if (plotIdentifiedSpectra)
    legend->AddEntry(hFractionKaonsMC, "K", "p");
  legend->AddEntry(hFractionProtons, "p", "p");
  if (plotIdentifiedSpectra)
    legend->AddEntry(hFractionProtonsMC, "p", "p");
  legend->AddEntry(hFractionElectrons, "e", "p");
  if (plotIdentifiedSpectra)
    legend->AddEntry(hFractionElectronsMC, "e", "p");
  if (takeIntoAccountMuons)
    legend->AddEntry(hFractionMuons, "#mu", "p");
  else
    legend->AddEntry((TObject*)0x0, "", "");
  if (plotIdentifiedSpectra)
    legend->AddEntry(hFractionMuonsMC, "#mu", "p");
  legend->AddEntry(hFractionSummed, "Total", "p");
  legend->Draw();
  
  ClearTitleFromHistoInCanvas(cFractions);
  

  // Compare data points with MC
  for (Int_t i = 1; i <= hFractionComparisonPions->GetNbinsX(); i++) {
    hFractionComparisonPions->SetBinContent(i, hFractionPions->GetBinContent(i));
    hFractionComparisonPions->SetBinError(i, hFractionPions->GetBinError(i));
    
    hFractionComparisonElectrons->SetBinContent(i, hFractionElectrons->GetBinContent(i));
    hFractionComparisonElectrons->SetBinError(i, hFractionElectrons->GetBinError(i));
    
    if (takeIntoAccountMuons) {
      hFractionComparisonMuons->SetBinContent(i, hFractionMuons->GetBinContent(i));
      hFractionComparisonMuons->SetBinError(i, hFractionMuons->GetBinError(i));
    }
    
    hFractionComparisonKaons->SetBinContent(i, hFractionKaons->GetBinContent(i));
    hFractionComparisonKaons->SetBinError(i, hFractionKaons->GetBinError(i));
    
    hFractionComparisonProtons->SetBinContent(i, hFractionProtons->GetBinContent(i));
    hFractionComparisonProtons->SetBinError(i, hFractionProtons->GetBinError(i));
    
    hFractionComparisonTotal->SetBinContent(i, hFractionSummed->GetBinContent(i));
    hFractionComparisonTotal->SetBinError(i, hFractionSummed->GetBinError(i));
  }
  
  hFractionComparisonPions->Divide(hFractionPionsMC);
  hFractionComparisonElectrons->Divide(hFractionElectronsMC);
  if (takeIntoAccountMuons)
    hFractionComparisonMuons->Divide(hFractionMuonsMC);
  hFractionComparisonKaons->Divide(hFractionKaonsMC);
  hFractionComparisonProtons->Divide(hFractionProtonsMC);
  
  
  TCanvas* cFractionComparisons = new TCanvas("cFractionComparisons", "Particle fraction comparisons",100,10,1200,800);
  cFractionComparisons->SetGridx(1);
  cFractionComparisons->SetGridy(1);
  cFractionComparisons->SetLogx(mode == kPMpT);
  hFractionComparisonPions->GetYaxis()->SetRangeUser(0.0, 10.0);
  SetReasonableAxisRange(hFractionComparisonPions->GetXaxis(), mode, pLow, pHigh);
  hFractionComparisonPions->GetXaxis()->SetMoreLogLabels(kTRUE);
  hFractionComparisonPions->GetXaxis()->SetNoExponent(kTRUE);
  hFractionComparisonPions->Draw("e p");
  
  hFractionComparisonElectrons->GetYaxis()->SetRangeUser(0.0, 10.0);
  SetReasonableAxisRange(hFractionComparisonElectrons->GetXaxis(), mode, pLow, pHigh);
  hFractionComparisonElectrons->Draw("e p same");
  
  if (takeIntoAccountMuons) {
    hFractionComparisonMuons->GetYaxis()->SetRangeUser(0.0, 10.0);
    SetReasonableAxisRange(hFractionComparisonMuons->GetXaxis(), mode, pLow, pHigh);
    hFractionComparisonMuons->Draw("e p same");
  }
  
  hFractionComparisonKaons->GetYaxis()->SetRangeUser(0.0, 10.0);
  SetReasonableAxisRange(hFractionComparisonKaons->GetXaxis(), mode, pLow, pHigh);
  hFractionComparisonKaons->Draw("e p same");
  
  hFractionComparisonProtons->GetYaxis()->SetRangeUser(0.0, 10.0);
  SetReasonableAxisRange(hFractionComparisonProtons->GetXaxis(), mode, pLow, pHigh);
  hFractionComparisonProtons->Draw("e p same");
  
  hFractionComparisonTotal->GetYaxis()->SetRangeUser(0.0, 10.0);
  SetReasonableAxisRange(hFractionComparisonTotal->GetXaxis(), mode, pLow, pHigh);
  hFractionComparisonTotal->Draw("e p same");
  
  TLegend* legend2 = new TLegend(0.622126, 0.605932, 0.862069, 0.855932);    
  legend2->SetBorderSize(0);
  legend2->SetFillColor(0);
  legend2->SetNColumns(2);
  legend2->AddEntry(hFractionComparisonPions, "#pi", "p");
  legend2->AddEntry(hFractionComparisonKaons, "K", "p");
  legend2->AddEntry(hFractionComparisonProtons, "p", "p");
  legend2->AddEntry(hFractionComparisonElectrons, "e", "p");
  if (takeIntoAccountMuons)
    legend2->AddEntry(hFractionComparisonMuons, "#mu", "p");
  legend2->AddEntry(hFractionComparisonTotal, "Total", "p");
  legend2->Draw();
  
  ClearTitleFromHistoInCanvas(cFractionComparisons);
  
  // Normalise the yields
  normaliseYieldHist(hYieldPions, numEvents, deta);
  normaliseYieldHist(hYieldPionsMC, numEvents, deta);
  normaliseYieldHist(hYieldPionsDeltaElectron, numEvents, deta);
  normaliseYieldHist(hYieldPionsDeltaPion, numEvents, deta);
  normaliseYieldHist(hYieldPionsDeltaKaon, numEvents, deta);
  normaliseYieldHist(hYieldPionsDeltaProton, numEvents, deta);
  
  normaliseYieldHist(hYieldElectrons, numEvents, deta);
  normaliseYieldHist(hYieldElectronsMC, numEvents, deta);
  normaliseYieldHist(hYieldElectronsDeltaElectron, numEvents, deta);
  normaliseYieldHist(hYieldElectronsDeltaPion, numEvents, deta);
  normaliseYieldHist(hYieldElectronsDeltaKaon, numEvents, deta);
  normaliseYieldHist(hYieldElectronsDeltaProton, numEvents, deta);
  
  normaliseYieldHist(hYieldMuons, numEvents, deta);
  normaliseYieldHist(hYieldMuonsMC, numEvents, deta);
  normaliseYieldHist(hYieldMuonsDeltaElectron, numEvents, deta);
  normaliseYieldHist(hYieldMuonsDeltaPion, numEvents, deta);
  normaliseYieldHist(hYieldMuonsDeltaKaon, numEvents, deta);
  normaliseYieldHist(hYieldMuonsDeltaProton, numEvents, deta);
  
  normaliseYieldHist(hYieldKaons, numEvents, deta);
  normaliseYieldHist(hYieldKaonsMC, numEvents, deta);
  normaliseYieldHist(hYieldKaonsDeltaElectron, numEvents, deta);
  normaliseYieldHist(hYieldKaonsDeltaPion, numEvents, deta);
  normaliseYieldHist(hYieldKaonsDeltaKaon, numEvents, deta);
  normaliseYieldHist(hYieldKaonsDeltaProton, numEvents, deta);
  
  normaliseYieldHist(hYieldProtons, numEvents, deta);
  normaliseYieldHist(hYieldProtonsMC, numEvents, deta);
  normaliseYieldHist(hYieldProtonsDeltaElectron, numEvents, deta);
  normaliseYieldHist(hYieldProtonsDeltaPion, numEvents, deta);
  normaliseYieldHist(hYieldProtonsDeltaKaon, numEvents, deta);
  normaliseYieldHist(hYieldProtonsDeltaProton, numEvents, deta);
  
  normaliseYieldHist(hYieldSummedMC, numEvents, deta);
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hMCgenYieldsPrimSpecies[i]) {
      Int_t color = kBlack;
      
      switch (i) {
        case AliPID::kElectron:
          color = getLineColor(kEl);
          break;
        case AliPID::kKaon:
          color = getLineColor(kKa);
          break;
        case AliPID::kMuon:
          color = getLineColor(kMu);
          break;
        case AliPID::kPion:
          color = getLineColor(kPi);
          break;
        case AliPID::kProton:
          color = getLineColor(kPr);
          break;
      }
      
      hMCgenYieldsPrimSpecies[i]->SetLineColor(color);
      hMCgenYieldsPrimSpecies[i]->SetMarkerColor(color);
      hMCgenYieldsPrimSpecies[i]->SetMarkerStyle(28);
      hMCgenYieldsPrimSpecies[i]->SetLineStyle(1);
      hMCgenYieldsPrimSpecies[i]->GetXaxis()->SetTitleOffset(1.0);
      hMCgenYieldsPrimSpecies[i]->SetStats(kFALSE);
      
      SetReasonableAxisRange(hMCgenYieldsPrimSpecies[i]->GetXaxis(), kPMpT, pLow, pHigh);
      normaliseGenYieldMCtruthHist(hMCgenYieldsPrimSpecies[i], numEvents, deta);
    }
  }
  
  
  // Compare data points with MC (yield)
  for (Int_t i = 1; i <= hYieldComparisonPions->GetNbinsX(); i++) {
    hYieldComparisonPions->SetBinContent(i, hYieldPions->GetBinContent(i));
    hYieldComparisonPions->SetBinError(i, hYieldPions->GetBinError(i));
    
    hYieldComparisonElectrons->SetBinContent(i, hYieldElectrons->GetBinContent(i));
    hYieldComparisonElectrons->SetBinError(i, hYieldElectrons->GetBinError(i));
    
    if (takeIntoAccountMuons) {
      hYieldComparisonMuons->SetBinContent(i, hYieldMuons->GetBinContent(i));
      hYieldComparisonMuons->SetBinError(i, hYieldMuons->GetBinError(i));
    }
    
    hYieldComparisonKaons->SetBinContent(i, hYieldKaons->GetBinContent(i));
    hYieldComparisonKaons->SetBinError(i, hYieldKaons->GetBinError(i));
    
    hYieldComparisonProtons->SetBinContent(i, hYieldProtons->GetBinContent(i));
    hYieldComparisonProtons->SetBinError(i, hYieldProtons->GetBinError(i));
  }
  
  hYieldComparisonPions->Divide(hYieldPionsMC);
  hYieldComparisonElectrons->Divide(hYieldElectronsMC);
  if (takeIntoAccountMuons)
    hYieldComparisonMuons->Divide(hYieldMuonsMC);
  hYieldComparisonKaons->Divide(hYieldKaonsMC);
  hYieldComparisonProtons->Divide(hYieldProtonsMC);
  
  
  TCanvas* cYieldComparisons = new TCanvas("cYieldComparisons", "Particle yield comparisons",100,10,1200,800);
  cYieldComparisons->SetGridx(1);
  cYieldComparisons->SetGridy(1);
  cYieldComparisons->SetLogx(mode == kPMpT);
  hYieldComparisonPions->GetYaxis()->SetRangeUser(0.0, 10.0);
  SetReasonableAxisRange(hYieldComparisonPions->GetXaxis(), mode, pLow, pHigh);
  hYieldComparisonPions->GetXaxis()->SetMoreLogLabels(kTRUE);
  hYieldComparisonPions->GetXaxis()->SetNoExponent(kTRUE);
  hYieldComparisonPions->Draw("e p");
  
  hYieldComparisonElectrons->GetYaxis()->SetRangeUser(0.0, 10.0);
  SetReasonableAxisRange(hYieldComparisonElectrons->GetXaxis(), mode, pLow, pHigh);
  hYieldComparisonElectrons->Draw("e p same");
  
  if (takeIntoAccountMuons) {
    hYieldComparisonMuons->GetYaxis()->SetRangeUser(0.0, 10.0);
    SetReasonableAxisRange(hYieldComparisonMuons->GetXaxis(), mode, pLow, pHigh);
    hYieldComparisonMuons->Draw("e p same");
  }
  
  hYieldComparisonKaons->GetYaxis()->SetRangeUser(0.0, 10.0);
  SetReasonableAxisRange(hYieldComparisonKaons->GetXaxis(), mode, pLow, pHigh);
  hYieldComparisonKaons->Draw("e p same");
  
  hYieldComparisonProtons->GetYaxis()->SetRangeUser(0.0, 10.0);
  SetReasonableAxisRange(hYieldComparisonProtons->GetXaxis(), mode, pLow, pHigh);
  hYieldComparisonProtons->Draw("e p same");
  
  TLegend* legend3 = new TLegend(0.622126, 0.605932, 0.862069, 0.855932);    
  legend3->SetBorderSize(0);
  legend3->SetFillColor(0);
  legend3->SetNColumns(2);
  legend3->AddEntry(hYieldComparisonPions, "#pi", "p");
  legend3->AddEntry(hYieldComparisonKaons, "K", "p");
  legend3->AddEntry(hYieldComparisonProtons, "p", "p");
  legend3->AddEntry(hYieldComparisonElectrons, "e", "p");
  if (takeIntoAccountMuons)
    legend3->AddEntry(hYieldComparisonMuons, "#mu", "p");
  legend3->Draw();
  
  ClearTitleFromHistoInCanvas(cYieldComparisons);
  
  
  
  
  TCanvas* cFractionsPions = drawFractionHistos("cFractionsPions", "Pion fractions", mode, pLow, pHigh, hFractionPionsDeltaPion, 
                                                hFractionPionsDeltaElectron, hFractionPionsDeltaKaon, hFractionPionsDeltaProton,
                                                hFractionPionsMC, plotIdentifiedSpectra);
  
  
  TCanvas* cFractionsElectrons = drawFractionHistos("cFractionsElectrons", "Electron fractions", mode, pLow, pHigh, 
                                                    hFractionElectronsDeltaPion, hFractionElectronsDeltaElectron,
                                                    hFractionElectronsDeltaKaon, hFractionElectronsDeltaProton, hFractionElectronsMC, 
                                                    plotIdentifiedSpectra);
  
  TCanvas* cFractionsKaons = drawFractionHistos("cFractionsKaons", "Kaon fractions", mode, pLow, pHigh, hFractionKaonsDeltaPion, 
                                                hFractionKaonsDeltaElectron, hFractionKaonsDeltaKaon, hFractionKaonsDeltaProton,
                                                hFractionKaonsMC, plotIdentifiedSpectra);
                                                
  TCanvas* cFractionsProtons = drawFractionHistos("cFractionsProtons", "Proton fractions", mode, pLow, pHigh, hFractionProtonsDeltaPion, 
                                                hFractionProtonsDeltaElectron, hFractionProtonsDeltaKaon, hFractionProtonsDeltaProton,
                                                hFractionProtonsMC, plotIdentifiedSpectra);
  
  TCanvas* cFractionsMuons = drawFractionHistos("cFractionsMuons", "Muon fractions", mode, pLow, pHigh, hFractionMuonsDeltaPion, 
                                                hFractionMuonsDeltaElectron, hFractionMuonsDeltaKaon, hFractionMuonsDeltaProton,
                                                hFractionMuonsMC, plotIdentifiedSpectra);
                                              
  
  
  TCanvas* cYields = new TCanvas("cYields", "Particle yields",100,10,1200,800);
  cYields->SetGridx(1);
  cYields->SetGridy(1);
  cYields->SetLogx(mode == kPMpT);
  cYields->SetLogy(1);
  hYieldPions->GetYaxis()->SetRangeUser(hYieldElectrons->GetBinContent(hYieldElectrons->FindLastBinAbove(0.)) / 10.,
                                        hYieldPions->GetBinContent(hYieldPions->GetMaximumBin()) * 10.);
  SetReasonableAxisRange(hYieldPions->GetXaxis(), mode, pLow, pHigh);
  hYieldPions->GetXaxis()->SetMoreLogLabels(kTRUE);
  hYieldPions->GetXaxis()->SetNoExponent(kTRUE);
  hYieldPions->Draw("e p");
  if (plotIdentifiedSpectra) {
    SetReasonableAxisRange(hYieldPionsMC->GetXaxis(), mode, pLow, pHigh);
    hYieldPionsMC->Draw("e p same");
  }
  
  SetReasonableAxisRange(hYieldKaons->GetXaxis(), mode, pLow, pHigh);
  hYieldKaons->Draw("e p same");
  if (plotIdentifiedSpectra) {
    SetReasonableAxisRange(hYieldKaonsMC->GetXaxis(), mode, pLow, pHigh);
    hYieldKaonsMC->Draw("e p same");
  }
  
  SetReasonableAxisRange(hYieldProtons->GetXaxis(), mode, pLow, pHigh);
  hYieldProtons->Draw("e p same");
  if (plotIdentifiedSpectra) {
    SetReasonableAxisRange(hYieldProtonsMC->GetXaxis(), mode, pLow, pHigh);
    hYieldProtonsMC->Draw("e p same");
  }
  
  if (takeIntoAccountMuons) {
    SetReasonableAxisRange(hYieldMuons->GetXaxis(), mode, pLow, pHigh);
    hYieldMuons->Draw("e p same");
    if (plotIdentifiedSpectra) {    
      SetReasonableAxisRange(hYieldMuonsMC->GetXaxis(), mode, pLow, pHigh);
      hYieldMuonsMC->Draw("e p same");
    }
  }
  
  SetReasonableAxisRange(hYieldElectrons->GetXaxis(), mode, pLow, pHigh);
  hYieldElectrons->Draw("e p same");
  if (plotIdentifiedSpectra) {
    SetReasonableAxisRange(hYieldElectronsMC->GetXaxis(), mode, pLow, pHigh);
    hYieldElectronsMC->Draw("e p same");
  }
  
  TLegend* legendYields = new TLegend(0.622126, 0.605932, 0.862069, 0.855932);    
  legendYields->SetBorderSize(0);
  legendYields->SetFillColor(0);
  if (plotIdentifiedSpectra)
    legendYields->SetNColumns(2);
  if (plotIdentifiedSpectra)
    legendYields->AddEntry((TObject*)0x0, "Fit", "");
  if (plotIdentifiedSpectra)
    legendYields->AddEntry((TObject*)0x0, identifiedLabels[isMC].Data(), "");
  legendYields->AddEntry(hYieldPions, "#pi", "p");
  if (plotIdentifiedSpectra)
    legendYields->AddEntry(hYieldPionsMC, "#pi", "p");
  legendYields->AddEntry(hYieldKaons, "K", "p");
  if (plotIdentifiedSpectra)
    legendYields->AddEntry(hYieldKaonsMC, "K", "p");
  legendYields->AddEntry(hYieldProtons, "p", "p");
  if (plotIdentifiedSpectra)
    legendYields->AddEntry(hYieldProtonsMC, "p", "p");
  legendYields->AddEntry(hYieldElectrons, "e", "p");
  if (plotIdentifiedSpectra)
    legendYields->AddEntry(hYieldElectronsMC, "e", "p");
  if (takeIntoAccountMuons)
    legendYields->AddEntry(hYieldMuons, "#mu", "p");
  else
    legendYields->AddEntry((TObject*)0x0, "", "");
  if (plotIdentifiedSpectra)
    legendYields->AddEntry(hYieldMuonsMC, "#mu", "p");
  legendYields->Draw();
  
  ClearTitleFromHistoInCanvas(cYields);
  
  
  TCanvas* cYieldsPions = drawYieldHistos("cYieldsPions", "Pion yields", mode, pLow, pHigh, hYieldPionsDeltaPion, hYieldPionsDeltaElectron,
                                          hYieldPionsDeltaKaon, hYieldPionsDeltaProton, hYieldPionsMC, plotIdentifiedSpectra);
  
  
  TCanvas* cYieldsElectrons = drawYieldHistos("cYieldsElectrons", "Electron yields", mode, pLow, pHigh, hYieldElectronsDeltaPion,
                                              hYieldElectronsDeltaElectron, hYieldElectronsDeltaKaon, hYieldElectronsDeltaProton, hYieldElectronsMC,
                                              plotIdentifiedSpectra);
  
  TCanvas* cYieldsKaons = drawYieldHistos("cYieldsKaons", "Kaon yields", mode, pLow, pHigh, hYieldKaonsDeltaPion, hYieldKaonsDeltaElectron,
                                          hYieldKaonsDeltaKaon, hYieldKaonsDeltaProton, hYieldKaonsMC, plotIdentifiedSpectra);
  
  TCanvas* cYieldsProtons = drawYieldHistos("cYieldsProtons", "Proton yields", mode, pLow, pHigh, hYieldProtonsDeltaPion, hYieldProtonsDeltaElectron,
                                            hYieldProtonsDeltaKaon, hYieldProtonsDeltaProton, hYieldProtonsMC, plotIdentifiedSpectra);
  
  TCanvas* cYieldsMuons = drawYieldHistos("cYieldsMuons", "Muon yields", mode, pLow, pHigh, hYieldMuonsDeltaPion, hYieldMuonsDeltaElectron,
                                            hYieldMuonsDeltaKaon, hYieldMuonsDeltaProton, hYieldMuonsMC, plotIdentifiedSpectra);
  
  
  // Save final results
  saveF->cd();
  
  if (fElectronFraction)
    fElectronFraction->Write();
  
  if (hFractionElectrons)
    hFractionElectrons->Write(0, TObject::kWriteDelete);
    
  if (hFractionKaons)
    hFractionKaons->Write(0, TObject::kWriteDelete);
  
  if (hFractionPions)
    hFractionPions->Write(0, TObject::kWriteDelete);
  
  if (hFractionProtons)
    hFractionProtons->Write(0, TObject::kWriteDelete);
  
  if (hFractionMuons)
    hFractionMuons->Write(0, TObject::kWriteDelete);
  
  if (hFractionSummed)
    hFractionSummed->Write(0, TObject::kWriteDelete);
    
  
  if (hFractionElectronsDeltaElectron)
    hFractionElectronsDeltaElectron->Write(0, TObject::kWriteDelete);
      
  if (hFractionKaonsDeltaElectron)
    hFractionKaonsDeltaElectron->Write(0, TObject::kWriteDelete);
    
  if (hFractionPionsDeltaElectron)
    hFractionPionsDeltaElectron->Write(0, TObject::kWriteDelete);
    
  if (hFractionProtonsDeltaElectron)
    hFractionProtonsDeltaElectron->Write(0, TObject::kWriteDelete);
  
  if (hFractionMuonsDeltaElectron)
    hFractionMuonsDeltaElectron->Write(0, TObject::kWriteDelete);
      
      
  if (hFractionElectronsDeltaPion)
    hFractionElectronsDeltaPion->Write(0, TObject::kWriteDelete);
      
  if (hFractionKaonsDeltaPion)
    hFractionKaonsDeltaPion->Write(0, TObject::kWriteDelete);
    
  if (hFractionPionsDeltaPion)
    hFractionPionsDeltaPion->Write(0, TObject::kWriteDelete);
    
  if (hFractionProtonsDeltaPion)
    hFractionProtonsDeltaPion->Write(0, TObject::kWriteDelete);
  
  if (hFractionMuonsDeltaPion)
    hFractionMuonsDeltaPion->Write(0, TObject::kWriteDelete);
      
    
  if (hFractionElectronsDeltaKaon)
    hFractionElectronsDeltaKaon->Write(0, TObject::kWriteDelete);
      
  if (hFractionKaonsDeltaKaon)
    hFractionKaonsDeltaKaon->Write(0, TObject::kWriteDelete);
    
  if (hFractionPionsDeltaKaon)
    hFractionPionsDeltaKaon->Write(0, TObject::kWriteDelete);
    
  if (hFractionProtonsDeltaKaon)
    hFractionProtonsDeltaKaon->Write(0, TObject::kWriteDelete);
  
  if (hFractionMuonsDeltaKaon)
    hFractionMuonsDeltaKaon->Write(0, TObject::kWriteDelete);
      
    
  if (hFractionElectronsDeltaProton)
    hFractionElectronsDeltaProton->Write(0, TObject::kWriteDelete);
      
  if (hFractionKaonsDeltaProton)
    hFractionKaonsDeltaProton->Write(0, TObject::kWriteDelete);
    
  if (hFractionPionsDeltaProton)
    hFractionPionsDeltaProton->Write(0, TObject::kWriteDelete);
    
  if (hFractionProtonsDeltaProton)
    hFractionProtonsDeltaProton->Write(0, TObject::kWriteDelete);
  
  if (hFractionMuonsDeltaProton)
    hFractionMuonsDeltaProton->Write(0, TObject::kWriteDelete);
  
  if (hNumEvents)
    hNumEvents->Write();
  
  if (cFractions)
    cFractions->Write();
  if (cFractionsPions)
    cFractionsPions->Write();
  if (cFractionsElectrons)
    cFractionsElectrons->Write();
  if (cFractionsKaons)
    cFractionsKaons->Write();
  if (cFractionsProtons)
    cFractionsProtons->Write();
  if (cFractionsMuons)
    cFractionsMuons->Write();
  
  
  if (hFractionElectronsMC)
    hFractionElectronsMC->Write(0, TObject::kWriteDelete);
  
  if (hFractionKaonsMC)
    hFractionKaonsMC->Write(0, TObject::kWriteDelete);
  
  if (hFractionPionsMC)
    hFractionPionsMC->Write(0, TObject::kWriteDelete);
  
  if (hFractionMuonsMC)
    hFractionMuonsMC->Write(0, TObject::kWriteDelete);
  
  if (hFractionProtonsMC)
    hFractionProtonsMC->Write(0, TObject::kWriteDelete);
  
  
  if (hFractionComparisonElectrons)
    hFractionComparisonElectrons->Write(0, TObject::kWriteDelete);
  
  if (hFractionComparisonMuons)
    hFractionComparisonMuons->Write(0, TObject::kWriteDelete);
  
  if (hFractionComparisonKaons)
    hFractionComparisonKaons->Write(0, TObject::kWriteDelete);
  
  if (hFractionComparisonPions)
    hFractionComparisonPions->Write(0, TObject::kWriteDelete);
  
  if (hFractionComparisonProtons)
    hFractionComparisonProtons->Write(0, TObject::kWriteDelete);
  
  if (hFractionComparisonTotal)
    hFractionComparisonTotal->Write(0, TObject::kWriteDelete);
  
  if (cFractionComparisons)
    cFractionComparisons->Write();
  
  
  if (hYieldComparisonElectrons)
    hYieldComparisonElectrons->Write(0, TObject::kWriteDelete);
  
  if (hYieldComparisonMuons)
    hYieldComparisonMuons->Write(0, TObject::kWriteDelete);
  
  if (hYieldComparisonKaons)
    hYieldComparisonKaons->Write(0, TObject::kWriteDelete);
  
  if (hYieldComparisonPions)
    hYieldComparisonPions->Write(0, TObject::kWriteDelete);
  
  if (hYieldComparisonProtons)
    hYieldComparisonProtons->Write(0, TObject::kWriteDelete);
  
  if (cYieldComparisons)
    cYieldComparisons->Write();
  
  
  if (hYieldElectrons)
    hYieldElectrons->Write(0, TObject::kWriteDelete);
  
  if (hYieldKaons)
    hYieldKaons->Write(0, TObject::kWriteDelete);
  
  if (hYieldPions)
    hYieldPions->Write(0, TObject::kWriteDelete);
  
  if (hYieldProtons)
    hYieldProtons->Write(0, TObject::kWriteDelete);
  
  if (hYieldMuons)
    hYieldMuons->Write(0, TObject::kWriteDelete);
  
  
  if (hYieldElectronsDeltaElectron)
    hYieldElectronsDeltaElectron->Write(0, TObject::kWriteDelete);
  
  if (hYieldKaonsDeltaElectron)
    hYieldKaonsDeltaElectron->Write(0, TObject::kWriteDelete);
  
  if (hYieldPionsDeltaElectron)
    hYieldPionsDeltaElectron->Write(0, TObject::kWriteDelete);
  
  if (hYieldProtonsDeltaElectron)
    hYieldProtonsDeltaElectron->Write(0, TObject::kWriteDelete);
  
  if (hYieldMuonsDeltaElectron)
    hYieldMuonsDeltaElectron->Write(0, TObject::kWriteDelete);
  
  
  if (hYieldElectronsDeltaPion)
    hYieldElectronsDeltaPion->Write(0, TObject::kWriteDelete);
  
  if (hYieldKaonsDeltaPion)
    hYieldKaonsDeltaPion->Write(0, TObject::kWriteDelete);
  
  if (hYieldPionsDeltaPion)
    hYieldPionsDeltaPion->Write(0, TObject::kWriteDelete);
  
  if (hYieldProtonsDeltaPion)
    hYieldProtonsDeltaPion->Write(0, TObject::kWriteDelete);
  
  if (hYieldMuonsDeltaPion)
    hYieldMuonsDeltaPion->Write(0, TObject::kWriteDelete);
  
  
  if (hYieldElectronsDeltaKaon)
    hYieldElectronsDeltaKaon->Write(0, TObject::kWriteDelete);
  
  if (hYieldKaonsDeltaKaon)
    hYieldKaonsDeltaKaon->Write(0, TObject::kWriteDelete);
  
  if (hYieldPionsDeltaKaon)
    hYieldPionsDeltaKaon->Write(0, TObject::kWriteDelete);
  
  if (hYieldProtonsDeltaKaon)
    hYieldProtonsDeltaKaon->Write(0, TObject::kWriteDelete);
  
  if (hYieldMuonsDeltaKaon)
    hYieldMuonsDeltaKaon->Write(0, TObject::kWriteDelete);
  
  
  if (hYieldElectronsDeltaProton)
    hYieldElectronsDeltaProton->Write(0, TObject::kWriteDelete);
  
  if (hYieldKaonsDeltaProton)
    hYieldKaonsDeltaProton->Write(0, TObject::kWriteDelete);
  
  if (hYieldPionsDeltaProton)
    hYieldPionsDeltaProton->Write(0, TObject::kWriteDelete);
  
  if (hYieldProtonsDeltaProton)
    hYieldProtonsDeltaProton->Write(0, TObject::kWriteDelete);
  
  if (hYieldMuonsDeltaProton)
    hYieldMuonsDeltaProton->Write(0, TObject::kWriteDelete);
  
  
  if (hYieldElectronsMC)
    hYieldElectronsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldKaonsMC)
    hYieldKaonsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldPionsMC)
    hYieldPionsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldMuonsMC)
    hYieldMuonsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldProtonsMC)
    hYieldProtonsMC->Write(0, TObject::kWriteDelete);
  
  if (hYieldSummedMC)
    hYieldSummedMC->Write(0, TObject::kWriteDelete);
  
  
  if (hRatioToPiElectrons)
    hRatioToPiElectrons->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiMuons)
    hRatioToPiMuons->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiKaons)
    hRatioToPiKaons->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiProtons)
    hRatioToPiProtons->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiElectronsMC)
    hRatioToPiElectronsMC->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiMuonsMC)
    hRatioToPiMuonsMC->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiKaonsMC)
    hRatioToPiKaonsMC->Write(0, TObject::kWriteDelete);
  
  if (hRatioToPiProtonsMC)
    hRatioToPiProtonsMC->Write(0, TObject::kWriteDelete);
  
  
  
  if (hReducedChiSquarePt)
    hReducedChiSquarePt->Write(0, TObject::kWriteDelete);
  
  if (cYields)
    cYields->Write();
  if (cYieldsPions)
    cYieldsPions->Write();
  if (cYieldsElectrons)
    cYieldsElectrons->Write();
  if (cYieldsKaons)
    cYieldsKaons->Write();
  if (cYieldsProtons)
    cYieldsProtons->Write();
  if (cYieldsMuons)
    cYieldsMuons->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hMCgenYieldsPrimSpecies[i])
      hMCgenYieldsPrimSpecies[i]->Write();
  }
  
  if (filePathNameResults)
    *filePathNameResults = saveFName;
  
  if (TMath::Abs(mathFit->GetScaleFactorError() - 1.) > 1e-6) {
    // If the deltaPrime range is large enough, we artificially get a factor 4 in statistics by looking at the four
    // different deltaPrimeSpecies, which have (except for binning effects) the same information. 
    // Therefore, to get the "real" statistical error, we need to multiply the obtained error by sqrt(4) = 2
    std::cout << "NOTE: Errors multiplied by " << mathFit->GetScaleFactorError() 
              << " to take into account artificially higher statistics (by factor of 4) due to same information "
              << "for all deltaPrimeSpecies (except for binning effects), if deltaPrimeRange sufficiently large!" << std::endl
              << std::endl;
  }
  
  if (fitMethod < 2) {
    std::cout << "WARNING: Errors might be wrong! Especially, for the to-pi ratios there are no correlations taken into account!"
              << std::endl;
  }
  
  delete gFractionElectronsData;
  delete fElectronFraction;
  
  delete mathFit;
  
  delete cFractions;
  delete cFractionComparisons;
  delete cYieldComparisons;
  delete cFractionsPions;
  delete cFractionsElectrons;
  delete cFractionsKaons;
  delete cFractionsProtons;
  delete cFractionsMuons;
  delete cYields;
  delete cYieldsPions;
  delete cYieldsKaons;
  delete cYieldsMuons;
  delete cYieldsProtons;
  delete cYieldsElectrons;
  
  saveF->Close();

  return 0; 
}
 PID.C:1
 PID.C:2
 PID.C:3
 PID.C:4
 PID.C:5
 PID.C:6
 PID.C:7
 PID.C:8
 PID.C:9
 PID.C:10
 PID.C:11
 PID.C:12
 PID.C:13
 PID.C:14
 PID.C:15
 PID.C:16
 PID.C:17
 PID.C:18
 PID.C:19
 PID.C:20
 PID.C:21
 PID.C:22
 PID.C:23
 PID.C:24
 PID.C:25
 PID.C:26
 PID.C:27
 PID.C:28
 PID.C:29
 PID.C:30
 PID.C:31
 PID.C:32
 PID.C:33
 PID.C:34
 PID.C:35
 PID.C:36
 PID.C:37
 PID.C:38
 PID.C:39
 PID.C:40
 PID.C:41
 PID.C:42
 PID.C:43
 PID.C:44
 PID.C:45
 PID.C:46
 PID.C:47
 PID.C:48
 PID.C:49
 PID.C:50
 PID.C:51
 PID.C:52
 PID.C:53
 PID.C:54
 PID.C:55
 PID.C:56
 PID.C:57
 PID.C:58
 PID.C:59
 PID.C:60
 PID.C:61
 PID.C:62
 PID.C:63
 PID.C:64
 PID.C:65
 PID.C:66
 PID.C:67
 PID.C:68
 PID.C:69
 PID.C:70
 PID.C:71
 PID.C:72
 PID.C:73
 PID.C:74
 PID.C:75
 PID.C:76
 PID.C:77
 PID.C:78
 PID.C:79
 PID.C:80
 PID.C:81
 PID.C:82
 PID.C:83
 PID.C:84
 PID.C:85
 PID.C:86
 PID.C:87
 PID.C:88
 PID.C:89
 PID.C:90
 PID.C:91
 PID.C:92
 PID.C:93
 PID.C:94
 PID.C:95
 PID.C:96
 PID.C:97
 PID.C:98
 PID.C:99
 PID.C:100
 PID.C:101
 PID.C:102
 PID.C:103
 PID.C:104
 PID.C:105
 PID.C:106
 PID.C:107
 PID.C:108
 PID.C:109
 PID.C:110
 PID.C:111
 PID.C:112
 PID.C:113
 PID.C:114
 PID.C:115
 PID.C:116
 PID.C:117
 PID.C:118
 PID.C:119
 PID.C:120
 PID.C:121
 PID.C:122
 PID.C:123
 PID.C:124
 PID.C:125
 PID.C:126
 PID.C:127
 PID.C:128
 PID.C:129
 PID.C:130
 PID.C:131
 PID.C:132
 PID.C:133
 PID.C:134
 PID.C:135
 PID.C:136
 PID.C:137
 PID.C:138
 PID.C:139
 PID.C:140
 PID.C:141
 PID.C:142
 PID.C:143
 PID.C:144
 PID.C:145
 PID.C:146
 PID.C:147
 PID.C:148
 PID.C:149
 PID.C:150
 PID.C:151
 PID.C:152
 PID.C:153
 PID.C:154
 PID.C:155
 PID.C:156
 PID.C:157
 PID.C:158
 PID.C:159
 PID.C:160
 PID.C:161
 PID.C:162
 PID.C:163
 PID.C:164
 PID.C:165
 PID.C:166
 PID.C:167
 PID.C:168
 PID.C:169
 PID.C:170
 PID.C:171
 PID.C:172
 PID.C:173
 PID.C:174
 PID.C:175
 PID.C:176
 PID.C:177
 PID.C:178
 PID.C:179
 PID.C:180
 PID.C:181
 PID.C:182
 PID.C:183
 PID.C:184
 PID.C:185
 PID.C:186
 PID.C:187
 PID.C:188
 PID.C:189
 PID.C:190
 PID.C:191
 PID.C:192
 PID.C:193
 PID.C:194
 PID.C:195
 PID.C:196
 PID.C:197
 PID.C:198
 PID.C:199
 PID.C:200
 PID.C:201
 PID.C:202
 PID.C:203
 PID.C:204
 PID.C:205
 PID.C:206
 PID.C:207
 PID.C:208
 PID.C:209
 PID.C:210
 PID.C:211
 PID.C:212
 PID.C:213
 PID.C:214
 PID.C:215
 PID.C:216
 PID.C:217
 PID.C:218
 PID.C:219
 PID.C:220
 PID.C:221
 PID.C:222
 PID.C:223
 PID.C:224
 PID.C:225
 PID.C:226
 PID.C:227
 PID.C:228
 PID.C:229
 PID.C:230
 PID.C:231
 PID.C:232
 PID.C:233
 PID.C:234
 PID.C:235
 PID.C:236
 PID.C:237
 PID.C:238
 PID.C:239
 PID.C:240
 PID.C:241
 PID.C:242
 PID.C:243
 PID.C:244
 PID.C:245
 PID.C:246
 PID.C:247
 PID.C:248
 PID.C:249
 PID.C:250
 PID.C:251
 PID.C:252
 PID.C:253
 PID.C:254
 PID.C:255
 PID.C:256
 PID.C:257
 PID.C:258
 PID.C:259
 PID.C:260
 PID.C:261
 PID.C:262
 PID.C:263
 PID.C:264
 PID.C:265
 PID.C:266
 PID.C:267
 PID.C:268
 PID.C:269
 PID.C:270
 PID.C:271
 PID.C:272
 PID.C:273
 PID.C:274
 PID.C:275
 PID.C:276
 PID.C:277
 PID.C:278
 PID.C:279
 PID.C:280
 PID.C:281
 PID.C:282
 PID.C:283
 PID.C:284
 PID.C:285
 PID.C:286
 PID.C:287
 PID.C:288
 PID.C:289
 PID.C:290
 PID.C:291
 PID.C:292
 PID.C:293
 PID.C:294
 PID.C:295
 PID.C:296
 PID.C:297
 PID.C:298
 PID.C:299
 PID.C:300
 PID.C:301
 PID.C:302
 PID.C:303
 PID.C:304
 PID.C:305
 PID.C:306
 PID.C:307
 PID.C:308
 PID.C:309
 PID.C:310
 PID.C:311
 PID.C:312
 PID.C:313
 PID.C:314
 PID.C:315
 PID.C:316
 PID.C:317
 PID.C:318
 PID.C:319
 PID.C:320
 PID.C:321
 PID.C:322
 PID.C:323
 PID.C:324
 PID.C:325
 PID.C:326
 PID.C:327
 PID.C:328
 PID.C:329
 PID.C:330
 PID.C:331
 PID.C:332
 PID.C:333
 PID.C:334
 PID.C:335
 PID.C:336
 PID.C:337
 PID.C:338
 PID.C:339
 PID.C:340
 PID.C:341
 PID.C:342
 PID.C:343
 PID.C:344
 PID.C:345
 PID.C:346
 PID.C:347
 PID.C:348
 PID.C:349
 PID.C:350
 PID.C:351
 PID.C:352
 PID.C:353
 PID.C:354
 PID.C:355
 PID.C:356
 PID.C:357
 PID.C:358
 PID.C:359
 PID.C:360
 PID.C:361
 PID.C:362
 PID.C:363
 PID.C:364
 PID.C:365
 PID.C:366
 PID.C:367
 PID.C:368
 PID.C:369
 PID.C:370
 PID.C:371
 PID.C:372
 PID.C:373
 PID.C:374
 PID.C:375
 PID.C:376
 PID.C:377
 PID.C:378
 PID.C:379
 PID.C:380
 PID.C:381
 PID.C:382
 PID.C:383
 PID.C:384
 PID.C:385
 PID.C:386
 PID.C:387
 PID.C:388
 PID.C:389
 PID.C:390
 PID.C:391
 PID.C:392
 PID.C:393
 PID.C:394
 PID.C:395
 PID.C:396
 PID.C:397
 PID.C:398
 PID.C:399
 PID.C:400
 PID.C:401
 PID.C:402
 PID.C:403
 PID.C:404
 PID.C:405
 PID.C:406
 PID.C:407
 PID.C:408
 PID.C:409
 PID.C:410
 PID.C:411
 PID.C:412
 PID.C:413
 PID.C:414
 PID.C:415
 PID.C:416
 PID.C:417
 PID.C:418
 PID.C:419
 PID.C:420
 PID.C:421
 PID.C:422
 PID.C:423
 PID.C:424
 PID.C:425
 PID.C:426
 PID.C:427
 PID.C:428
 PID.C:429
 PID.C:430
 PID.C:431
 PID.C:432
 PID.C:433
 PID.C:434
 PID.C:435
 PID.C:436
 PID.C:437
 PID.C:438
 PID.C:439
 PID.C:440
 PID.C:441
 PID.C:442
 PID.C:443
 PID.C:444
 PID.C:445
 PID.C:446
 PID.C:447
 PID.C:448
 PID.C:449
 PID.C:450
 PID.C:451
 PID.C:452
 PID.C:453
 PID.C:454
 PID.C:455
 PID.C:456
 PID.C:457
 PID.C:458
 PID.C:459
 PID.C:460
 PID.C:461
 PID.C:462
 PID.C:463
 PID.C:464
 PID.C:465
 PID.C:466
 PID.C:467
 PID.C:468
 PID.C:469
 PID.C:470
 PID.C:471
 PID.C:472
 PID.C:473
 PID.C:474
 PID.C:475
 PID.C:476
 PID.C:477
 PID.C:478
 PID.C:479
 PID.C:480
 PID.C:481
 PID.C:482
 PID.C:483
 PID.C:484
 PID.C:485
 PID.C:486
 PID.C:487
 PID.C:488
 PID.C:489
 PID.C:490
 PID.C:491
 PID.C:492
 PID.C:493
 PID.C:494
 PID.C:495
 PID.C:496
 PID.C:497
 PID.C:498
 PID.C:499
 PID.C:500
 PID.C:501
 PID.C:502
 PID.C:503
 PID.C:504
 PID.C:505
 PID.C:506
 PID.C:507
 PID.C:508
 PID.C:509
 PID.C:510
 PID.C:511
 PID.C:512
 PID.C:513
 PID.C:514
 PID.C:515
 PID.C:516
 PID.C:517
 PID.C:518
 PID.C:519
 PID.C:520
 PID.C:521
 PID.C:522
 PID.C:523
 PID.C:524
 PID.C:525
 PID.C:526
 PID.C:527
 PID.C:528
 PID.C:529
 PID.C:530
 PID.C:531
 PID.C:532
 PID.C:533
 PID.C:534
 PID.C:535
 PID.C:536
 PID.C:537
 PID.C:538
 PID.C:539
 PID.C:540
 PID.C:541
 PID.C:542
 PID.C:543
 PID.C:544
 PID.C:545
 PID.C:546
 PID.C:547
 PID.C:548
 PID.C:549
 PID.C:550
 PID.C:551
 PID.C:552
 PID.C:553
 PID.C:554
 PID.C:555
 PID.C:556
 PID.C:557
 PID.C:558
 PID.C:559
 PID.C:560
 PID.C:561
 PID.C:562
 PID.C:563
 PID.C:564
 PID.C:565
 PID.C:566
 PID.C:567
 PID.C:568
 PID.C:569
 PID.C:570
 PID.C:571
 PID.C:572
 PID.C:573
 PID.C:574
 PID.C:575
 PID.C:576
 PID.C:577
 PID.C:578
 PID.C:579
 PID.C:580
 PID.C:581
 PID.C:582
 PID.C:583
 PID.C:584
 PID.C:585
 PID.C:586
 PID.C:587
 PID.C:588
 PID.C:589
 PID.C:590
 PID.C:591
 PID.C:592
 PID.C:593
 PID.C:594
 PID.C:595
 PID.C:596
 PID.C:597
 PID.C:598
 PID.C:599
 PID.C:600
 PID.C:601
 PID.C:602
 PID.C:603
 PID.C:604
 PID.C:605
 PID.C:606
 PID.C:607
 PID.C:608
 PID.C:609
 PID.C:610
 PID.C:611
 PID.C:612
 PID.C:613
 PID.C:614
 PID.C:615
 PID.C:616
 PID.C:617
 PID.C:618
 PID.C:619
 PID.C:620
 PID.C:621
 PID.C:622
 PID.C:623
 PID.C:624
 PID.C:625
 PID.C:626
 PID.C:627
 PID.C:628
 PID.C:629
 PID.C:630
 PID.C:631
 PID.C:632
 PID.C:633
 PID.C:634
 PID.C:635
 PID.C:636
 PID.C:637
 PID.C:638
 PID.C:639
 PID.C:640
 PID.C:641
 PID.C:642
 PID.C:643
 PID.C:644
 PID.C:645
 PID.C:646
 PID.C:647
 PID.C:648
 PID.C:649
 PID.C:650
 PID.C:651
 PID.C:652
 PID.C:653
 PID.C:654
 PID.C:655
 PID.C:656
 PID.C:657
 PID.C:658
 PID.C:659
 PID.C:660
 PID.C:661
 PID.C:662
 PID.C:663
 PID.C:664
 PID.C:665
 PID.C:666
 PID.C:667
 PID.C:668
 PID.C:669
 PID.C:670
 PID.C:671
 PID.C:672
 PID.C:673
 PID.C:674
 PID.C:675
 PID.C:676
 PID.C:677
 PID.C:678
 PID.C:679
 PID.C:680
 PID.C:681
 PID.C:682
 PID.C:683
 PID.C:684
 PID.C:685
 PID.C:686
 PID.C:687
 PID.C:688
 PID.C:689
 PID.C:690
 PID.C:691
 PID.C:692
 PID.C:693
 PID.C:694
 PID.C:695
 PID.C:696
 PID.C:697
 PID.C:698
 PID.C:699
 PID.C:700
 PID.C:701
 PID.C:702
 PID.C:703
 PID.C:704
 PID.C:705
 PID.C:706
 PID.C:707
 PID.C:708
 PID.C:709
 PID.C:710
 PID.C:711
 PID.C:712
 PID.C:713
 PID.C:714
 PID.C:715
 PID.C:716
 PID.C:717
 PID.C:718
 PID.C:719
 PID.C:720
 PID.C:721
 PID.C:722
 PID.C:723
 PID.C:724
 PID.C:725
 PID.C:726
 PID.C:727
 PID.C:728
 PID.C:729
 PID.C:730
 PID.C:731
 PID.C:732
 PID.C:733
 PID.C:734
 PID.C:735
 PID.C:736
 PID.C:737
 PID.C:738
 PID.C:739
 PID.C:740
 PID.C:741
 PID.C:742
 PID.C:743
 PID.C:744
 PID.C:745
 PID.C:746
 PID.C:747
 PID.C:748
 PID.C:749
 PID.C:750
 PID.C:751
 PID.C:752
 PID.C:753
 PID.C:754
 PID.C:755
 PID.C:756
 PID.C:757
 PID.C:758
 PID.C:759
 PID.C:760
 PID.C:761
 PID.C:762
 PID.C:763
 PID.C:764
 PID.C:765
 PID.C:766
 PID.C:767
 PID.C:768
 PID.C:769
 PID.C:770
 PID.C:771
 PID.C:772
 PID.C:773
 PID.C:774
 PID.C:775
 PID.C:776
 PID.C:777
 PID.C:778
 PID.C:779
 PID.C:780
 PID.C:781
 PID.C:782
 PID.C:783
 PID.C:784
 PID.C:785
 PID.C:786
 PID.C:787
 PID.C:788
 PID.C:789
 PID.C:790
 PID.C:791
 PID.C:792
 PID.C:793
 PID.C:794
 PID.C:795
 PID.C:796
 PID.C:797
 PID.C:798
 PID.C:799
 PID.C:800
 PID.C:801
 PID.C:802
 PID.C:803
 PID.C:804
 PID.C:805
 PID.C:806
 PID.C:807
 PID.C:808
 PID.C:809
 PID.C:810
 PID.C:811
 PID.C:812
 PID.C:813
 PID.C:814
 PID.C:815
 PID.C:816
 PID.C:817
 PID.C:818
 PID.C:819
 PID.C:820
 PID.C:821
 PID.C:822
 PID.C:823
 PID.C:824
 PID.C:825
 PID.C:826
 PID.C:827
 PID.C:828
 PID.C:829
 PID.C:830
 PID.C:831
 PID.C:832
 PID.C:833
 PID.C:834
 PID.C:835
 PID.C:836
 PID.C:837
 PID.C:838
 PID.C:839
 PID.C:840
 PID.C:841
 PID.C:842
 PID.C:843
 PID.C:844
 PID.C:845
 PID.C:846
 PID.C:847
 PID.C:848
 PID.C:849
 PID.C:850
 PID.C:851
 PID.C:852
 PID.C:853
 PID.C:854
 PID.C:855
 PID.C:856
 PID.C:857
 PID.C:858
 PID.C:859
 PID.C:860
 PID.C:861
 PID.C:862
 PID.C:863
 PID.C:864
 PID.C:865
 PID.C:866
 PID.C:867
 PID.C:868
 PID.C:869
 PID.C:870
 PID.C:871
 PID.C:872
 PID.C:873
 PID.C:874
 PID.C:875
 PID.C:876
 PID.C:877
 PID.C:878
 PID.C:879
 PID.C:880
 PID.C:881
 PID.C:882
 PID.C:883
 PID.C:884
 PID.C:885
 PID.C:886
 PID.C:887
 PID.C:888
 PID.C:889
 PID.C:890
 PID.C:891
 PID.C:892
 PID.C:893
 PID.C:894
 PID.C:895
 PID.C:896
 PID.C:897
 PID.C:898
 PID.C:899
 PID.C:900
 PID.C:901
 PID.C:902
 PID.C:903
 PID.C:904
 PID.C:905
 PID.C:906
 PID.C:907
 PID.C:908
 PID.C:909
 PID.C:910
 PID.C:911
 PID.C:912
 PID.C:913
 PID.C:914
 PID.C:915
 PID.C:916
 PID.C:917
 PID.C:918
 PID.C:919
 PID.C:920
 PID.C:921
 PID.C:922
 PID.C:923
 PID.C:924
 PID.C:925
 PID.C:926
 PID.C:927
 PID.C:928
 PID.C:929
 PID.C:930
 PID.C:931
 PID.C:932
 PID.C:933
 PID.C:934
 PID.C:935
 PID.C:936
 PID.C:937
 PID.C:938
 PID.C:939
 PID.C:940
 PID.C:941
 PID.C:942
 PID.C:943
 PID.C:944
 PID.C:945
 PID.C:946
 PID.C:947
 PID.C:948
 PID.C:949
 PID.C:950
 PID.C:951
 PID.C:952
 PID.C:953
 PID.C:954
 PID.C:955
 PID.C:956
 PID.C:957
 PID.C:958
 PID.C:959
 PID.C:960
 PID.C:961
 PID.C:962
 PID.C:963
 PID.C:964
 PID.C:965
 PID.C:966
 PID.C:967
 PID.C:968
 PID.C:969
 PID.C:970
 PID.C:971
 PID.C:972
 PID.C:973
 PID.C:974
 PID.C:975
 PID.C:976
 PID.C:977
 PID.C:978
 PID.C:979
 PID.C:980
 PID.C:981
 PID.C:982
 PID.C:983
 PID.C:984
 PID.C:985
 PID.C:986
 PID.C:987
 PID.C:988
 PID.C:989
 PID.C:990
 PID.C:991
 PID.C:992
 PID.C:993
 PID.C:994
 PID.C:995
 PID.C:996
 PID.C:997
 PID.C:998
 PID.C:999
 PID.C:1000
 PID.C:1001
 PID.C:1002
 PID.C:1003
 PID.C:1004
 PID.C:1005
 PID.C:1006
 PID.C:1007
 PID.C:1008
 PID.C:1009
 PID.C:1010
 PID.C:1011
 PID.C:1012
 PID.C:1013
 PID.C:1014
 PID.C:1015
 PID.C:1016
 PID.C:1017
 PID.C:1018
 PID.C:1019
 PID.C:1020
 PID.C:1021
 PID.C:1022
 PID.C:1023
 PID.C:1024
 PID.C:1025
 PID.C:1026
 PID.C:1027
 PID.C:1028
 PID.C:1029
 PID.C:1030
 PID.C:1031
 PID.C:1032
 PID.C:1033
 PID.C:1034
 PID.C:1035
 PID.C:1036
 PID.C:1037
 PID.C:1038
 PID.C:1039
 PID.C:1040
 PID.C:1041
 PID.C:1042
 PID.C:1043
 PID.C:1044
 PID.C:1045
 PID.C:1046
 PID.C:1047
 PID.C:1048
 PID.C:1049
 PID.C:1050
 PID.C:1051
 PID.C:1052
 PID.C:1053
 PID.C:1054
 PID.C:1055
 PID.C:1056
 PID.C:1057
 PID.C:1058
 PID.C:1059
 PID.C:1060
 PID.C:1061
 PID.C:1062
 PID.C:1063
 PID.C:1064
 PID.C:1065
 PID.C:1066
 PID.C:1067
 PID.C:1068
 PID.C:1069
 PID.C:1070
 PID.C:1071
 PID.C:1072
 PID.C:1073
 PID.C:1074
 PID.C:1075
 PID.C:1076
 PID.C:1077
 PID.C:1078
 PID.C:1079
 PID.C:1080
 PID.C:1081
 PID.C:1082
 PID.C:1083
 PID.C:1084
 PID.C:1085
 PID.C:1086
 PID.C:1087
 PID.C:1088
 PID.C:1089
 PID.C:1090
 PID.C:1091
 PID.C:1092
 PID.C:1093
 PID.C:1094
 PID.C:1095
 PID.C:1096
 PID.C:1097
 PID.C:1098
 PID.C:1099
 PID.C:1100
 PID.C:1101
 PID.C:1102
 PID.C:1103
 PID.C:1104
 PID.C:1105
 PID.C:1106
 PID.C:1107
 PID.C:1108
 PID.C:1109
 PID.C:1110
 PID.C:1111
 PID.C:1112
 PID.C:1113
 PID.C:1114
 PID.C:1115
 PID.C:1116
 PID.C:1117
 PID.C:1118
 PID.C:1119
 PID.C:1120
 PID.C:1121
 PID.C:1122
 PID.C:1123
 PID.C:1124
 PID.C:1125
 PID.C:1126
 PID.C:1127
 PID.C:1128
 PID.C:1129
 PID.C:1130
 PID.C:1131
 PID.C:1132
 PID.C:1133
 PID.C:1134
 PID.C:1135
 PID.C:1136
 PID.C:1137
 PID.C:1138
 PID.C:1139
 PID.C:1140
 PID.C:1141
 PID.C:1142
 PID.C:1143
 PID.C:1144
 PID.C:1145
 PID.C:1146
 PID.C:1147
 PID.C:1148
 PID.C:1149
 PID.C:1150
 PID.C:1151
 PID.C:1152
 PID.C:1153
 PID.C:1154
 PID.C:1155
 PID.C:1156
 PID.C:1157
 PID.C:1158
 PID.C:1159
 PID.C:1160
 PID.C:1161
 PID.C:1162
 PID.C:1163
 PID.C:1164
 PID.C:1165
 PID.C:1166
 PID.C:1167
 PID.C:1168
 PID.C:1169
 PID.C:1170
 PID.C:1171
 PID.C:1172
 PID.C:1173
 PID.C:1174
 PID.C:1175
 PID.C:1176
 PID.C:1177
 PID.C:1178
 PID.C:1179
 PID.C:1180
 PID.C:1181
 PID.C:1182
 PID.C:1183
 PID.C:1184
 PID.C:1185
 PID.C:1186
 PID.C:1187
 PID.C:1188
 PID.C:1189
 PID.C:1190
 PID.C:1191
 PID.C:1192
 PID.C:1193
 PID.C:1194
 PID.C:1195
 PID.C:1196
 PID.C:1197
 PID.C:1198
 PID.C:1199
 PID.C:1200
 PID.C:1201
 PID.C:1202
 PID.C:1203
 PID.C:1204
 PID.C:1205
 PID.C:1206
 PID.C:1207
 PID.C:1208
 PID.C:1209
 PID.C:1210
 PID.C:1211
 PID.C:1212
 PID.C:1213
 PID.C:1214
 PID.C:1215
 PID.C:1216
 PID.C:1217
 PID.C:1218
 PID.C:1219
 PID.C:1220
 PID.C:1221
 PID.C:1222
 PID.C:1223
 PID.C:1224
 PID.C:1225
 PID.C:1226
 PID.C:1227
 PID.C:1228
 PID.C:1229
 PID.C:1230
 PID.C:1231
 PID.C:1232
 PID.C:1233
 PID.C:1234
 PID.C:1235
 PID.C:1236
 PID.C:1237
 PID.C:1238
 PID.C:1239
 PID.C:1240
 PID.C:1241
 PID.C:1242
 PID.C:1243
 PID.C:1244
 PID.C:1245
 PID.C:1246
 PID.C:1247
 PID.C:1248
 PID.C:1249
 PID.C:1250
 PID.C:1251
 PID.C:1252
 PID.C:1253
 PID.C:1254
 PID.C:1255
 PID.C:1256
 PID.C:1257
 PID.C:1258
 PID.C:1259
 PID.C:1260
 PID.C:1261
 PID.C:1262
 PID.C:1263
 PID.C:1264
 PID.C:1265
 PID.C:1266
 PID.C:1267
 PID.C:1268
 PID.C:1269
 PID.C:1270
 PID.C:1271
 PID.C:1272
 PID.C:1273
 PID.C:1274
 PID.C:1275
 PID.C:1276
 PID.C:1277
 PID.C:1278
 PID.C:1279
 PID.C:1280
 PID.C:1281
 PID.C:1282
 PID.C:1283
 PID.C:1284
 PID.C:1285
 PID.C:1286
 PID.C:1287
 PID.C:1288
 PID.C:1289
 PID.C:1290
 PID.C:1291
 PID.C:1292
 PID.C:1293
 PID.C:1294
 PID.C:1295
 PID.C:1296
 PID.C:1297
 PID.C:1298
 PID.C:1299
 PID.C:1300
 PID.C:1301
 PID.C:1302
 PID.C:1303
 PID.C:1304
 PID.C:1305
 PID.C:1306
 PID.C:1307
 PID.C:1308
 PID.C:1309
 PID.C:1310
 PID.C:1311
 PID.C:1312
 PID.C:1313
 PID.C:1314
 PID.C:1315
 PID.C:1316
 PID.C:1317
 PID.C:1318
 PID.C:1319
 PID.C:1320
 PID.C:1321
 PID.C:1322
 PID.C:1323
 PID.C:1324
 PID.C:1325
 PID.C:1326
 PID.C:1327
 PID.C:1328
 PID.C:1329
 PID.C:1330
 PID.C:1331
 PID.C:1332
 PID.C:1333
 PID.C:1334
 PID.C:1335
 PID.C:1336
 PID.C:1337
 PID.C:1338
 PID.C:1339
 PID.C:1340
 PID.C:1341
 PID.C:1342
 PID.C:1343
 PID.C:1344
 PID.C:1345
 PID.C:1346
 PID.C:1347
 PID.C:1348
 PID.C:1349
 PID.C:1350
 PID.C:1351
 PID.C:1352
 PID.C:1353
 PID.C:1354
 PID.C:1355
 PID.C:1356
 PID.C:1357
 PID.C:1358
 PID.C:1359
 PID.C:1360
 PID.C:1361
 PID.C:1362
 PID.C:1363
 PID.C:1364
 PID.C:1365
 PID.C:1366
 PID.C:1367
 PID.C:1368
 PID.C:1369
 PID.C:1370
 PID.C:1371
 PID.C:1372
 PID.C:1373
 PID.C:1374
 PID.C:1375
 PID.C:1376
 PID.C:1377
 PID.C:1378
 PID.C:1379
 PID.C:1380
 PID.C:1381
 PID.C:1382
 PID.C:1383
 PID.C:1384
 PID.C:1385
 PID.C:1386
 PID.C:1387
 PID.C:1388
 PID.C:1389
 PID.C:1390
 PID.C:1391
 PID.C:1392
 PID.C:1393
 PID.C:1394
 PID.C:1395
 PID.C:1396
 PID.C:1397
 PID.C:1398
 PID.C:1399
 PID.C:1400
 PID.C:1401
 PID.C:1402
 PID.C:1403
 PID.C:1404
 PID.C:1405
 PID.C:1406
 PID.C:1407
 PID.C:1408
 PID.C:1409
 PID.C:1410
 PID.C:1411
 PID.C:1412
 PID.C:1413
 PID.C:1414
 PID.C:1415
 PID.C:1416
 PID.C:1417
 PID.C:1418
 PID.C:1419
 PID.C:1420
 PID.C:1421
 PID.C:1422
 PID.C:1423
 PID.C:1424
 PID.C:1425
 PID.C:1426
 PID.C:1427
 PID.C:1428
 PID.C:1429
 PID.C:1430
 PID.C:1431
 PID.C:1432
 PID.C:1433
 PID.C:1434
 PID.C:1435
 PID.C:1436
 PID.C:1437
 PID.C:1438
 PID.C:1439
 PID.C:1440
 PID.C:1441
 PID.C:1442
 PID.C:1443
 PID.C:1444
 PID.C:1445
 PID.C:1446
 PID.C:1447
 PID.C:1448
 PID.C:1449
 PID.C:1450
 PID.C:1451
 PID.C:1452
 PID.C:1453
 PID.C:1454
 PID.C:1455
 PID.C:1456
 PID.C:1457
 PID.C:1458
 PID.C:1459
 PID.C:1460
 PID.C:1461
 PID.C:1462
 PID.C:1463
 PID.C:1464
 PID.C:1465
 PID.C:1466
 PID.C:1467
 PID.C:1468
 PID.C:1469
 PID.C:1470
 PID.C:1471
 PID.C:1472
 PID.C:1473
 PID.C:1474
 PID.C:1475
 PID.C:1476
 PID.C:1477
 PID.C:1478
 PID.C:1479
 PID.C:1480
 PID.C:1481
 PID.C:1482
 PID.C:1483
 PID.C:1484
 PID.C:1485
 PID.C:1486
 PID.C:1487
 PID.C:1488
 PID.C:1489
 PID.C:1490
 PID.C:1491
 PID.C:1492
 PID.C:1493
 PID.C:1494
 PID.C:1495
 PID.C:1496
 PID.C:1497
 PID.C:1498
 PID.C:1499
 PID.C:1500
 PID.C:1501
 PID.C:1502
 PID.C:1503
 PID.C:1504
 PID.C:1505
 PID.C:1506
 PID.C:1507
 PID.C:1508
 PID.C:1509
 PID.C:1510
 PID.C:1511
 PID.C:1512
 PID.C:1513
 PID.C:1514
 PID.C:1515
 PID.C:1516
 PID.C:1517
 PID.C:1518
 PID.C:1519
 PID.C:1520
 PID.C:1521
 PID.C:1522
 PID.C:1523
 PID.C:1524
 PID.C:1525
 PID.C:1526
 PID.C:1527
 PID.C:1528
 PID.C:1529
 PID.C:1530
 PID.C:1531
 PID.C:1532
 PID.C:1533
 PID.C:1534
 PID.C:1535
 PID.C:1536
 PID.C:1537
 PID.C:1538
 PID.C:1539
 PID.C:1540
 PID.C:1541
 PID.C:1542
 PID.C:1543
 PID.C:1544
 PID.C:1545
 PID.C:1546
 PID.C:1547
 PID.C:1548
 PID.C:1549
 PID.C:1550
 PID.C:1551
 PID.C:1552
 PID.C:1553
 PID.C:1554
 PID.C:1555
 PID.C:1556
 PID.C:1557
 PID.C:1558
 PID.C:1559
 PID.C:1560
 PID.C:1561
 PID.C:1562
 PID.C:1563
 PID.C:1564
 PID.C:1565
 PID.C:1566
 PID.C:1567
 PID.C:1568
 PID.C:1569
 PID.C:1570
 PID.C:1571
 PID.C:1572
 PID.C:1573
 PID.C:1574
 PID.C:1575
 PID.C:1576
 PID.C:1577
 PID.C:1578
 PID.C:1579
 PID.C:1580
 PID.C:1581
 PID.C:1582
 PID.C:1583
 PID.C:1584
 PID.C:1585
 PID.C:1586
 PID.C:1587
 PID.C:1588
 PID.C:1589
 PID.C:1590
 PID.C:1591
 PID.C:1592
 PID.C:1593
 PID.C:1594
 PID.C:1595
 PID.C:1596
 PID.C:1597
 PID.C:1598
 PID.C:1599
 PID.C:1600
 PID.C:1601
 PID.C:1602
 PID.C:1603
 PID.C:1604
 PID.C:1605
 PID.C:1606
 PID.C:1607
 PID.C:1608
 PID.C:1609
 PID.C:1610
 PID.C:1611
 PID.C:1612
 PID.C:1613
 PID.C:1614
 PID.C:1615
 PID.C:1616
 PID.C:1617
 PID.C:1618
 PID.C:1619
 PID.C:1620
 PID.C:1621
 PID.C:1622
 PID.C:1623
 PID.C:1624
 PID.C:1625
 PID.C:1626
 PID.C:1627
 PID.C:1628
 PID.C:1629
 PID.C:1630
 PID.C:1631
 PID.C:1632
 PID.C:1633
 PID.C:1634
 PID.C:1635
 PID.C:1636
 PID.C:1637
 PID.C:1638
 PID.C:1639
 PID.C:1640
 PID.C:1641
 PID.C:1642
 PID.C:1643
 PID.C:1644
 PID.C:1645
 PID.C:1646
 PID.C:1647
 PID.C:1648
 PID.C:1649
 PID.C:1650
 PID.C:1651
 PID.C:1652
 PID.C:1653
 PID.C:1654
 PID.C:1655
 PID.C:1656
 PID.C:1657
 PID.C:1658
 PID.C:1659
 PID.C:1660
 PID.C:1661
 PID.C:1662
 PID.C:1663
 PID.C:1664
 PID.C:1665
 PID.C:1666
 PID.C:1667
 PID.C:1668
 PID.C:1669
 PID.C:1670
 PID.C:1671
 PID.C:1672
 PID.C:1673
 PID.C:1674
 PID.C:1675
 PID.C:1676
 PID.C:1677
 PID.C:1678
 PID.C:1679
 PID.C:1680
 PID.C:1681
 PID.C:1682
 PID.C:1683
 PID.C:1684
 PID.C:1685
 PID.C:1686
 PID.C:1687
 PID.C:1688
 PID.C:1689
 PID.C:1690
 PID.C:1691
 PID.C:1692
 PID.C:1693
 PID.C:1694
 PID.C:1695
 PID.C:1696
 PID.C:1697
 PID.C:1698
 PID.C:1699
 PID.C:1700
 PID.C:1701
 PID.C:1702
 PID.C:1703
 PID.C:1704
 PID.C:1705
 PID.C:1706
 PID.C:1707
 PID.C:1708
 PID.C:1709
 PID.C:1710
 PID.C:1711
 PID.C:1712
 PID.C:1713
 PID.C:1714
 PID.C:1715
 PID.C:1716
 PID.C:1717
 PID.C:1718
 PID.C:1719
 PID.C:1720
 PID.C:1721
 PID.C:1722
 PID.C:1723
 PID.C:1724
 PID.C:1725
 PID.C:1726
 PID.C:1727
 PID.C:1728
 PID.C:1729
 PID.C:1730
 PID.C:1731
 PID.C:1732
 PID.C:1733
 PID.C:1734
 PID.C:1735
 PID.C:1736
 PID.C:1737
 PID.C:1738
 PID.C:1739
 PID.C:1740
 PID.C:1741
 PID.C:1742
 PID.C:1743
 PID.C:1744
 PID.C:1745
 PID.C:1746
 PID.C:1747
 PID.C:1748
 PID.C:1749
 PID.C:1750
 PID.C:1751
 PID.C:1752
 PID.C:1753
 PID.C:1754
 PID.C:1755
 PID.C:1756
 PID.C:1757
 PID.C:1758
 PID.C:1759
 PID.C:1760
 PID.C:1761
 PID.C:1762
 PID.C:1763
 PID.C:1764
 PID.C:1765
 PID.C:1766
 PID.C:1767
 PID.C:1768
 PID.C:1769
 PID.C:1770
 PID.C:1771
 PID.C:1772
 PID.C:1773
 PID.C:1774
 PID.C:1775
 PID.C:1776
 PID.C:1777
 PID.C:1778
 PID.C:1779
 PID.C:1780
 PID.C:1781
 PID.C:1782
 PID.C:1783
 PID.C:1784
 PID.C:1785
 PID.C:1786
 PID.C:1787
 PID.C:1788
 PID.C:1789
 PID.C:1790
 PID.C:1791
 PID.C:1792
 PID.C:1793
 PID.C:1794
 PID.C:1795
 PID.C:1796
 PID.C:1797
 PID.C:1798
 PID.C:1799
 PID.C:1800
 PID.C:1801
 PID.C:1802
 PID.C:1803
 PID.C:1804
 PID.C:1805
 PID.C:1806
 PID.C:1807
 PID.C:1808
 PID.C:1809
 PID.C:1810
 PID.C:1811
 PID.C:1812
 PID.C:1813
 PID.C:1814
 PID.C:1815
 PID.C:1816
 PID.C:1817
 PID.C:1818
 PID.C:1819
 PID.C:1820
 PID.C:1821
 PID.C:1822
 PID.C:1823
 PID.C:1824
 PID.C:1825
 PID.C:1826
 PID.C:1827
 PID.C:1828
 PID.C:1829
 PID.C:1830
 PID.C:1831
 PID.C:1832
 PID.C:1833
 PID.C:1834
 PID.C:1835
 PID.C:1836
 PID.C:1837
 PID.C:1838
 PID.C:1839
 PID.C:1840
 PID.C:1841
 PID.C:1842
 PID.C:1843
 PID.C:1844
 PID.C:1845
 PID.C:1846
 PID.C:1847
 PID.C:1848
 PID.C:1849
 PID.C:1850
 PID.C:1851
 PID.C:1852
 PID.C:1853
 PID.C:1854
 PID.C:1855
 PID.C:1856
 PID.C:1857
 PID.C:1858
 PID.C:1859
 PID.C:1860
 PID.C:1861
 PID.C:1862
 PID.C:1863
 PID.C:1864
 PID.C:1865
 PID.C:1866
 PID.C:1867
 PID.C:1868
 PID.C:1869
 PID.C:1870
 PID.C:1871
 PID.C:1872
 PID.C:1873
 PID.C:1874
 PID.C:1875
 PID.C:1876
 PID.C:1877
 PID.C:1878
 PID.C:1879
 PID.C:1880
 PID.C:1881
 PID.C:1882
 PID.C:1883
 PID.C:1884
 PID.C:1885
 PID.C:1886
 PID.C:1887
 PID.C:1888
 PID.C:1889
 PID.C:1890
 PID.C:1891
 PID.C:1892
 PID.C:1893
 PID.C:1894
 PID.C:1895
 PID.C:1896
 PID.C:1897
 PID.C:1898
 PID.C:1899
 PID.C:1900
 PID.C:1901
 PID.C:1902
 PID.C:1903
 PID.C:1904
 PID.C:1905
 PID.C:1906
 PID.C:1907
 PID.C:1908
 PID.C:1909
 PID.C:1910
 PID.C:1911
 PID.C:1912
 PID.C:1913
 PID.C:1914
 PID.C:1915
 PID.C:1916
 PID.C:1917
 PID.C:1918
 PID.C:1919
 PID.C:1920
 PID.C:1921
 PID.C:1922
 PID.C:1923
 PID.C:1924
 PID.C:1925
 PID.C:1926
 PID.C:1927
 PID.C:1928
 PID.C:1929
 PID.C:1930
 PID.C:1931
 PID.C:1932
 PID.C:1933
 PID.C:1934
 PID.C:1935
 PID.C:1936
 PID.C:1937
 PID.C:1938
 PID.C:1939
 PID.C:1940
 PID.C:1941
 PID.C:1942
 PID.C:1943
 PID.C:1944
 PID.C:1945
 PID.C:1946
 PID.C:1947
 PID.C:1948
 PID.C:1949
 PID.C:1950
 PID.C:1951
 PID.C:1952
 PID.C:1953
 PID.C:1954
 PID.C:1955
 PID.C:1956
 PID.C:1957
 PID.C:1958
 PID.C:1959
 PID.C:1960
 PID.C:1961
 PID.C:1962
 PID.C:1963
 PID.C:1964
 PID.C:1965
 PID.C:1966
 PID.C:1967
 PID.C:1968
 PID.C:1969
 PID.C:1970
 PID.C:1971
 PID.C:1972
 PID.C:1973
 PID.C:1974
 PID.C:1975
 PID.C:1976
 PID.C:1977
 PID.C:1978
 PID.C:1979
 PID.C:1980
 PID.C:1981
 PID.C:1982
 PID.C:1983
 PID.C:1984
 PID.C:1985
 PID.C:1986
 PID.C:1987
 PID.C:1988
 PID.C:1989
 PID.C:1990
 PID.C:1991
 PID.C:1992
 PID.C:1993
 PID.C:1994
 PID.C:1995
 PID.C:1996
 PID.C:1997
 PID.C:1998
 PID.C:1999
 PID.C:2000
 PID.C:2001
 PID.C:2002
 PID.C:2003
 PID.C:2004
 PID.C:2005
 PID.C:2006
 PID.C:2007
 PID.C:2008
 PID.C:2009
 PID.C:2010
 PID.C:2011
 PID.C:2012
 PID.C:2013
 PID.C:2014
 PID.C:2015
 PID.C:2016
 PID.C:2017
 PID.C:2018
 PID.C:2019
 PID.C:2020
 PID.C:2021
 PID.C:2022
 PID.C:2023
 PID.C:2024
 PID.C:2025
 PID.C:2026
 PID.C:2027
 PID.C:2028
 PID.C:2029
 PID.C:2030
 PID.C:2031
 PID.C:2032
 PID.C:2033
 PID.C:2034
 PID.C:2035
 PID.C:2036
 PID.C:2037
 PID.C:2038
 PID.C:2039
 PID.C:2040
 PID.C:2041
 PID.C:2042
 PID.C:2043
 PID.C:2044
 PID.C:2045
 PID.C:2046
 PID.C:2047
 PID.C:2048
 PID.C:2049
 PID.C:2050
 PID.C:2051
 PID.C:2052
 PID.C:2053
 PID.C:2054
 PID.C:2055
 PID.C:2056
 PID.C:2057
 PID.C:2058
 PID.C:2059
 PID.C:2060
 PID.C:2061
 PID.C:2062
 PID.C:2063
 PID.C:2064
 PID.C:2065
 PID.C:2066
 PID.C:2067
 PID.C:2068
 PID.C:2069
 PID.C:2070
 PID.C:2071
 PID.C:2072
 PID.C:2073
 PID.C:2074
 PID.C:2075
 PID.C:2076
 PID.C:2077
 PID.C:2078
 PID.C:2079
 PID.C:2080
 PID.C:2081
 PID.C:2082
 PID.C:2083
 PID.C:2084
 PID.C:2085
 PID.C:2086
 PID.C:2087
 PID.C:2088
 PID.C:2089
 PID.C:2090
 PID.C:2091
 PID.C:2092
 PID.C:2093
 PID.C:2094
 PID.C:2095
 PID.C:2096
 PID.C:2097
 PID.C:2098
 PID.C:2099
 PID.C:2100
 PID.C:2101
 PID.C:2102
 PID.C:2103
 PID.C:2104
 PID.C:2105
 PID.C:2106
 PID.C:2107
 PID.C:2108
 PID.C:2109
 PID.C:2110
 PID.C:2111
 PID.C:2112
 PID.C:2113
 PID.C:2114
 PID.C:2115
 PID.C:2116
 PID.C:2117
 PID.C:2118
 PID.C:2119
 PID.C:2120
 PID.C:2121
 PID.C:2122
 PID.C:2123
 PID.C:2124
 PID.C:2125
 PID.C:2126
 PID.C:2127
 PID.C:2128
 PID.C:2129
 PID.C:2130
 PID.C:2131
 PID.C:2132
 PID.C:2133
 PID.C:2134
 PID.C:2135
 PID.C:2136
 PID.C:2137
 PID.C:2138
 PID.C:2139
 PID.C:2140
 PID.C:2141
 PID.C:2142
 PID.C:2143
 PID.C:2144
 PID.C:2145
 PID.C:2146
 PID.C:2147
 PID.C:2148
 PID.C:2149
 PID.C:2150
 PID.C:2151
 PID.C:2152
 PID.C:2153
 PID.C:2154
 PID.C:2155
 PID.C:2156
 PID.C:2157
 PID.C:2158
 PID.C:2159
 PID.C:2160
 PID.C:2161
 PID.C:2162
 PID.C:2163
 PID.C:2164
 PID.C:2165
 PID.C:2166
 PID.C:2167
 PID.C:2168
 PID.C:2169
 PID.C:2170
 PID.C:2171
 PID.C:2172
 PID.C:2173
 PID.C:2174
 PID.C:2175
 PID.C:2176
 PID.C:2177
 PID.C:2178
 PID.C:2179
 PID.C:2180
 PID.C:2181
 PID.C:2182
 PID.C:2183
 PID.C:2184
 PID.C:2185
 PID.C:2186
 PID.C:2187
 PID.C:2188
 PID.C:2189
 PID.C:2190
 PID.C:2191
 PID.C:2192
 PID.C:2193
 PID.C:2194
 PID.C:2195
 PID.C:2196
 PID.C:2197
 PID.C:2198
 PID.C:2199
 PID.C:2200
 PID.C:2201
 PID.C:2202
 PID.C:2203
 PID.C:2204
 PID.C:2205
 PID.C:2206
 PID.C:2207
 PID.C:2208
 PID.C:2209
 PID.C:2210
 PID.C:2211
 PID.C:2212
 PID.C:2213
 PID.C:2214
 PID.C:2215
 PID.C:2216
 PID.C:2217
 PID.C:2218
 PID.C:2219
 PID.C:2220
 PID.C:2221
 PID.C:2222
 PID.C:2223
 PID.C:2224
 PID.C:2225
 PID.C:2226
 PID.C:2227
 PID.C:2228
 PID.C:2229
 PID.C:2230
 PID.C:2231
 PID.C:2232
 PID.C:2233
 PID.C:2234
 PID.C:2235
 PID.C:2236
 PID.C:2237
 PID.C:2238
 PID.C:2239
 PID.C:2240
 PID.C:2241
 PID.C:2242
 PID.C:2243
 PID.C:2244
 PID.C:2245
 PID.C:2246
 PID.C:2247
 PID.C:2248
 PID.C:2249
 PID.C:2250
 PID.C:2251
 PID.C:2252
 PID.C:2253
 PID.C:2254
 PID.C:2255
 PID.C:2256
 PID.C:2257
 PID.C:2258
 PID.C:2259
 PID.C:2260
 PID.C:2261
 PID.C:2262
 PID.C:2263
 PID.C:2264
 PID.C:2265
 PID.C:2266
 PID.C:2267
 PID.C:2268
 PID.C:2269
 PID.C:2270
 PID.C:2271
 PID.C:2272
 PID.C:2273
 PID.C:2274
 PID.C:2275
 PID.C:2276
 PID.C:2277
 PID.C:2278
 PID.C:2279
 PID.C:2280
 PID.C:2281
 PID.C:2282
 PID.C:2283
 PID.C:2284
 PID.C:2285
 PID.C:2286
 PID.C:2287
 PID.C:2288
 PID.C:2289
 PID.C:2290
 PID.C:2291
 PID.C:2292
 PID.C:2293
 PID.C:2294
 PID.C:2295
 PID.C:2296
 PID.C:2297
 PID.C:2298
 PID.C:2299
 PID.C:2300
 PID.C:2301
 PID.C:2302
 PID.C:2303
 PID.C:2304
 PID.C:2305
 PID.C:2306
 PID.C:2307
 PID.C:2308
 PID.C:2309
 PID.C:2310
 PID.C:2311
 PID.C:2312
 PID.C:2313
 PID.C:2314
 PID.C:2315
 PID.C:2316
 PID.C:2317
 PID.C:2318
 PID.C:2319
 PID.C:2320
 PID.C:2321
 PID.C:2322
 PID.C:2323
 PID.C:2324
 PID.C:2325
 PID.C:2326
 PID.C:2327
 PID.C:2328
 PID.C:2329
 PID.C:2330
 PID.C:2331
 PID.C:2332
 PID.C:2333
 PID.C:2334
 PID.C:2335
 PID.C:2336
 PID.C:2337
 PID.C:2338
 PID.C:2339
 PID.C:2340
 PID.C:2341
 PID.C:2342
 PID.C:2343
 PID.C:2344
 PID.C:2345
 PID.C:2346
 PID.C:2347
 PID.C:2348
 PID.C:2349
 PID.C:2350
 PID.C:2351
 PID.C:2352
 PID.C:2353
 PID.C:2354
 PID.C:2355
 PID.C:2356
 PID.C:2357
 PID.C:2358
 PID.C:2359
 PID.C:2360
 PID.C:2361
 PID.C:2362
 PID.C:2363
 PID.C:2364
 PID.C:2365
 PID.C:2366
 PID.C:2367
 PID.C:2368
 PID.C:2369
 PID.C:2370
 PID.C:2371
 PID.C:2372
 PID.C:2373
 PID.C:2374
 PID.C:2375
 PID.C:2376
 PID.C:2377
 PID.C:2378
 PID.C:2379
 PID.C:2380
 PID.C:2381
 PID.C:2382
 PID.C:2383
 PID.C:2384
 PID.C:2385
 PID.C:2386
 PID.C:2387
 PID.C:2388
 PID.C:2389
 PID.C:2390
 PID.C:2391
 PID.C:2392
 PID.C:2393
 PID.C:2394
 PID.C:2395
 PID.C:2396
 PID.C:2397
 PID.C:2398
 PID.C:2399
 PID.C:2400
 PID.C:2401
 PID.C:2402
 PID.C:2403
 PID.C:2404
 PID.C:2405
 PID.C:2406
 PID.C:2407
 PID.C:2408
 PID.C:2409
 PID.C:2410
 PID.C:2411
 PID.C:2412
 PID.C:2413
 PID.C:2414
 PID.C:2415
 PID.C:2416
 PID.C:2417
 PID.C:2418
 PID.C:2419
 PID.C:2420
 PID.C:2421
 PID.C:2422
 PID.C:2423
 PID.C:2424
 PID.C:2425
 PID.C:2426
 PID.C:2427
 PID.C:2428
 PID.C:2429
 PID.C:2430
 PID.C:2431
 PID.C:2432
 PID.C:2433
 PID.C:2434
 PID.C:2435
 PID.C:2436
 PID.C:2437
 PID.C:2438
 PID.C:2439
 PID.C:2440
 PID.C:2441
 PID.C:2442
 PID.C:2443
 PID.C:2444
 PID.C:2445
 PID.C:2446
 PID.C:2447
 PID.C:2448
 PID.C:2449
 PID.C:2450
 PID.C:2451
 PID.C:2452
 PID.C:2453
 PID.C:2454
 PID.C:2455
 PID.C:2456
 PID.C:2457
 PID.C:2458
 PID.C:2459
 PID.C:2460
 PID.C:2461
 PID.C:2462
 PID.C:2463
 PID.C:2464
 PID.C:2465
 PID.C:2466
 PID.C:2467
 PID.C:2468
 PID.C:2469
 PID.C:2470
 PID.C:2471
 PID.C:2472
 PID.C:2473
 PID.C:2474
 PID.C:2475
 PID.C:2476
 PID.C:2477
 PID.C:2478
 PID.C:2479
 PID.C:2480
 PID.C:2481
 PID.C:2482
 PID.C:2483
 PID.C:2484
 PID.C:2485
 PID.C:2486
 PID.C:2487
 PID.C:2488
 PID.C:2489
 PID.C:2490
 PID.C:2491
 PID.C:2492
 PID.C:2493
 PID.C:2494
 PID.C:2495
 PID.C:2496
 PID.C:2497
 PID.C:2498
 PID.C:2499
 PID.C:2500
 PID.C:2501
 PID.C:2502
 PID.C:2503
 PID.C:2504
 PID.C:2505
 PID.C:2506
 PID.C:2507
 PID.C:2508
 PID.C:2509
 PID.C:2510
 PID.C:2511
 PID.C:2512
 PID.C:2513
 PID.C:2514
 PID.C:2515
 PID.C:2516
 PID.C:2517
 PID.C:2518
 PID.C:2519
 PID.C:2520
 PID.C:2521
 PID.C:2522
 PID.C:2523
 PID.C:2524
 PID.C:2525
 PID.C:2526
 PID.C:2527
 PID.C:2528
 PID.C:2529
 PID.C:2530
 PID.C:2531
 PID.C:2532
 PID.C:2533
 PID.C:2534
 PID.C:2535
 PID.C:2536
 PID.C:2537
 PID.C:2538
 PID.C:2539
 PID.C:2540
 PID.C:2541
 PID.C:2542
 PID.C:2543
 PID.C:2544
 PID.C:2545
 PID.C:2546
 PID.C:2547
 PID.C:2548
 PID.C:2549
 PID.C:2550
 PID.C:2551
 PID.C:2552
 PID.C:2553
 PID.C:2554
 PID.C:2555
 PID.C:2556
 PID.C:2557
 PID.C:2558
 PID.C:2559
 PID.C:2560
 PID.C:2561
 PID.C:2562
 PID.C:2563
 PID.C:2564
 PID.C:2565
 PID.C:2566
 PID.C:2567
 PID.C:2568
 PID.C:2569
 PID.C:2570
 PID.C:2571
 PID.C:2572
 PID.C:2573
 PID.C:2574
 PID.C:2575
 PID.C:2576
 PID.C:2577
 PID.C:2578
 PID.C:2579
 PID.C:2580
 PID.C:2581
 PID.C:2582
 PID.C:2583
 PID.C:2584
 PID.C:2585
 PID.C:2586
 PID.C:2587
 PID.C:2588
 PID.C:2589
 PID.C:2590
 PID.C:2591
 PID.C:2592
 PID.C:2593
 PID.C:2594
 PID.C:2595
 PID.C:2596
 PID.C:2597
 PID.C:2598
 PID.C:2599
 PID.C:2600
 PID.C:2601
 PID.C:2602
 PID.C:2603
 PID.C:2604
 PID.C:2605
 PID.C:2606
 PID.C:2607
 PID.C:2608
 PID.C:2609
 PID.C:2610
 PID.C:2611
 PID.C:2612
 PID.C:2613
 PID.C:2614
 PID.C:2615
 PID.C:2616
 PID.C:2617
 PID.C:2618
 PID.C:2619
 PID.C:2620
 PID.C:2621
 PID.C:2622
 PID.C:2623
 PID.C:2624
 PID.C:2625
 PID.C:2626
 PID.C:2627
 PID.C:2628
 PID.C:2629
 PID.C:2630
 PID.C:2631
 PID.C:2632
 PID.C:2633
 PID.C:2634
 PID.C:2635
 PID.C:2636
 PID.C:2637
 PID.C:2638
 PID.C:2639
 PID.C:2640
 PID.C:2641
 PID.C:2642
 PID.C:2643
 PID.C:2644
 PID.C:2645
 PID.C:2646
 PID.C:2647
 PID.C:2648
 PID.C:2649
 PID.C:2650
 PID.C:2651
 PID.C:2652
 PID.C:2653
 PID.C:2654
 PID.C:2655
 PID.C:2656
 PID.C:2657
 PID.C:2658
 PID.C:2659
 PID.C:2660
 PID.C:2661
 PID.C:2662
 PID.C:2663
 PID.C:2664
 PID.C:2665
 PID.C:2666
 PID.C:2667
 PID.C:2668
 PID.C:2669
 PID.C:2670
 PID.C:2671
 PID.C:2672
 PID.C:2673
 PID.C:2674
 PID.C:2675
 PID.C:2676
 PID.C:2677
 PID.C:2678
 PID.C:2679
 PID.C:2680
 PID.C:2681
 PID.C:2682
 PID.C:2683
 PID.C:2684
 PID.C:2685
 PID.C:2686
 PID.C:2687
 PID.C:2688
 PID.C:2689
 PID.C:2690
 PID.C:2691
 PID.C:2692
 PID.C:2693
 PID.C:2694
 PID.C:2695
 PID.C:2696
 PID.C:2697
 PID.C:2698
 PID.C:2699
 PID.C:2700
 PID.C:2701
 PID.C:2702
 PID.C:2703
 PID.C:2704
 PID.C:2705
 PID.C:2706
 PID.C:2707
 PID.C:2708
 PID.C:2709
 PID.C:2710
 PID.C:2711
 PID.C:2712
 PID.C:2713
 PID.C:2714
 PID.C:2715
 PID.C:2716
 PID.C:2717
 PID.C:2718
 PID.C:2719
 PID.C:2720
 PID.C:2721
 PID.C:2722
 PID.C:2723
 PID.C:2724
 PID.C:2725
 PID.C:2726
 PID.C:2727
 PID.C:2728
 PID.C:2729
 PID.C:2730
 PID.C:2731
 PID.C:2732
 PID.C:2733
 PID.C:2734
 PID.C:2735
 PID.C:2736
 PID.C:2737
 PID.C:2738
 PID.C:2739
 PID.C:2740
 PID.C:2741
 PID.C:2742
 PID.C:2743
 PID.C:2744
 PID.C:2745
 PID.C:2746
 PID.C:2747
 PID.C:2748
 PID.C:2749
 PID.C:2750
 PID.C:2751
 PID.C:2752
 PID.C:2753
 PID.C:2754
 PID.C:2755
 PID.C:2756
 PID.C:2757
 PID.C:2758
 PID.C:2759
 PID.C:2760
 PID.C:2761
 PID.C:2762
 PID.C:2763
 PID.C:2764
 PID.C:2765
 PID.C:2766
 PID.C:2767
 PID.C:2768
 PID.C:2769
 PID.C:2770
 PID.C:2771
 PID.C:2772
 PID.C:2773
 PID.C:2774
 PID.C:2775
 PID.C:2776
 PID.C:2777
 PID.C:2778
 PID.C:2779
 PID.C:2780
 PID.C:2781
 PID.C:2782
 PID.C:2783
 PID.C:2784
 PID.C:2785
 PID.C:2786
 PID.C:2787
 PID.C:2788
 PID.C:2789
 PID.C:2790
 PID.C:2791
 PID.C:2792
 PID.C:2793
 PID.C:2794
 PID.C:2795
 PID.C:2796
 PID.C:2797
 PID.C:2798
 PID.C:2799
 PID.C:2800
 PID.C:2801
 PID.C:2802
 PID.C:2803
 PID.C:2804
 PID.C:2805
 PID.C:2806
 PID.C:2807
 PID.C:2808
 PID.C:2809
 PID.C:2810
 PID.C:2811
 PID.C:2812
 PID.C:2813
 PID.C:2814
 PID.C:2815
 PID.C:2816
 PID.C:2817
 PID.C:2818
 PID.C:2819
 PID.C:2820
 PID.C:2821
 PID.C:2822
 PID.C:2823
 PID.C:2824
 PID.C:2825
 PID.C:2826
 PID.C:2827
 PID.C:2828
 PID.C:2829
 PID.C:2830
 PID.C:2831
 PID.C:2832
 PID.C:2833
 PID.C:2834
 PID.C:2835
 PID.C:2836
 PID.C:2837
 PID.C:2838
 PID.C:2839
 PID.C:2840
 PID.C:2841
 PID.C:2842
 PID.C:2843
 PID.C:2844
 PID.C:2845
 PID.C:2846
 PID.C:2847
 PID.C:2848
 PID.C:2849
 PID.C:2850
 PID.C:2851
 PID.C:2852
 PID.C:2853
 PID.C:2854
 PID.C:2855
 PID.C:2856
 PID.C:2857
 PID.C:2858
 PID.C:2859
 PID.C:2860
 PID.C:2861
 PID.C:2862
 PID.C:2863
 PID.C:2864
 PID.C:2865
 PID.C:2866
 PID.C:2867
 PID.C:2868
 PID.C:2869
 PID.C:2870
 PID.C:2871
 PID.C:2872
 PID.C:2873
 PID.C:2874
 PID.C:2875
 PID.C:2876
 PID.C:2877
 PID.C:2878
 PID.C:2879
 PID.C:2880
 PID.C:2881
 PID.C:2882
 PID.C:2883
 PID.C:2884
 PID.C:2885
 PID.C:2886
 PID.C:2887
 PID.C:2888
 PID.C:2889
 PID.C:2890
 PID.C:2891
 PID.C:2892
 PID.C:2893
 PID.C:2894
 PID.C:2895
 PID.C:2896
 PID.C:2897
 PID.C:2898
 PID.C:2899
 PID.C:2900
 PID.C:2901
 PID.C:2902
 PID.C:2903
 PID.C:2904
 PID.C:2905
 PID.C:2906
 PID.C:2907
 PID.C:2908
 PID.C:2909
 PID.C:2910
 PID.C:2911
 PID.C:2912
 PID.C:2913
 PID.C:2914
 PID.C:2915
 PID.C:2916
 PID.C:2917
 PID.C:2918
 PID.C:2919
 PID.C:2920
 PID.C:2921
 PID.C:2922
 PID.C:2923
 PID.C:2924
 PID.C:2925
 PID.C:2926
 PID.C:2927
 PID.C:2928
 PID.C:2929
 PID.C:2930
 PID.C:2931
 PID.C:2932
 PID.C:2933
 PID.C:2934
 PID.C:2935
 PID.C:2936
 PID.C:2937
 PID.C:2938
 PID.C:2939
 PID.C:2940
 PID.C:2941
 PID.C:2942
 PID.C:2943
 PID.C:2944
 PID.C:2945
 PID.C:2946
 PID.C:2947
 PID.C:2948
 PID.C:2949
 PID.C:2950
 PID.C:2951
 PID.C:2952
 PID.C:2953
 PID.C:2954
 PID.C:2955
 PID.C:2956
 PID.C:2957
 PID.C:2958
 PID.C:2959
 PID.C:2960
 PID.C:2961
 PID.C:2962
 PID.C:2963
 PID.C:2964
 PID.C:2965
 PID.C:2966
 PID.C:2967
 PID.C:2968
 PID.C:2969
 PID.C:2970
 PID.C:2971
 PID.C:2972
 PID.C:2973
 PID.C:2974
 PID.C:2975
 PID.C:2976
 PID.C:2977
 PID.C:2978
 PID.C:2979
 PID.C:2980
 PID.C:2981
 PID.C:2982
 PID.C:2983
 PID.C:2984
 PID.C:2985
 PID.C:2986
 PID.C:2987
 PID.C:2988
 PID.C:2989
 PID.C:2990
 PID.C:2991
 PID.C:2992
 PID.C:2993
 PID.C:2994
 PID.C:2995
 PID.C:2996
 PID.C:2997
 PID.C:2998
 PID.C:2999
 PID.C:3000
 PID.C:3001
 PID.C:3002
 PID.C:3003
 PID.C:3004
 PID.C:3005
 PID.C:3006
 PID.C:3007
 PID.C:3008
 PID.C:3009
 PID.C:3010
 PID.C:3011
 PID.C:3012
 PID.C:3013
 PID.C:3014
 PID.C:3015
 PID.C:3016
 PID.C:3017
 PID.C:3018
 PID.C:3019
 PID.C:3020
 PID.C:3021
 PID.C:3022
 PID.C:3023
 PID.C:3024
 PID.C:3025
 PID.C:3026
 PID.C:3027
 PID.C:3028
 PID.C:3029
 PID.C:3030
 PID.C:3031
 PID.C:3032
 PID.C:3033
 PID.C:3034
 PID.C:3035
 PID.C:3036
 PID.C:3037
 PID.C:3038
 PID.C:3039
 PID.C:3040
 PID.C:3041
 PID.C:3042
 PID.C:3043
 PID.C:3044
 PID.C:3045
 PID.C:3046
 PID.C:3047
 PID.C:3048
 PID.C:3049
 PID.C:3050
 PID.C:3051
 PID.C:3052
 PID.C:3053
 PID.C:3054
 PID.C:3055
 PID.C:3056
 PID.C:3057
 PID.C:3058
 PID.C:3059
 PID.C:3060
 PID.C:3061
 PID.C:3062
 PID.C:3063
 PID.C:3064
 PID.C:3065
 PID.C:3066
 PID.C:3067
 PID.C:3068
 PID.C:3069
 PID.C:3070
 PID.C:3071
 PID.C:3072
 PID.C:3073
 PID.C:3074
 PID.C:3075
 PID.C:3076
 PID.C:3077
 PID.C:3078
 PID.C:3079
 PID.C:3080
 PID.C:3081
 PID.C:3082
 PID.C:3083
 PID.C:3084
 PID.C:3085
 PID.C:3086
 PID.C:3087
 PID.C:3088
 PID.C:3089
 PID.C:3090
 PID.C:3091
 PID.C:3092
 PID.C:3093
 PID.C:3094
 PID.C:3095
 PID.C:3096
 PID.C:3097
 PID.C:3098
 PID.C:3099
 PID.C:3100
 PID.C:3101
 PID.C:3102
 PID.C:3103
 PID.C:3104
 PID.C:3105
 PID.C:3106
 PID.C:3107
 PID.C:3108
 PID.C:3109
 PID.C:3110
 PID.C:3111
 PID.C:3112
 PID.C:3113
 PID.C:3114
 PID.C:3115
 PID.C:3116
 PID.C:3117
 PID.C:3118
 PID.C:3119
 PID.C:3120
 PID.C:3121
 PID.C:3122
 PID.C:3123
 PID.C:3124
 PID.C:3125
 PID.C:3126
 PID.C:3127
 PID.C:3128
 PID.C:3129
 PID.C:3130
 PID.C:3131
 PID.C:3132
 PID.C:3133
 PID.C:3134
 PID.C:3135
 PID.C:3136
 PID.C:3137
 PID.C:3138
 PID.C:3139
 PID.C:3140
 PID.C:3141
 PID.C:3142
 PID.C:3143
 PID.C:3144
 PID.C:3145
 PID.C:3146
 PID.C:3147
 PID.C:3148
 PID.C:3149
 PID.C:3150
 PID.C:3151
 PID.C:3152
 PID.C:3153
 PID.C:3154
 PID.C:3155
 PID.C:3156
 PID.C:3157
 PID.C:3158
 PID.C:3159
 PID.C:3160
 PID.C:3161
 PID.C:3162
 PID.C:3163
 PID.C:3164
 PID.C:3165
 PID.C:3166
 PID.C:3167
 PID.C:3168
 PID.C:3169
 PID.C:3170
 PID.C:3171
 PID.C:3172
 PID.C:3173
 PID.C:3174
 PID.C:3175
 PID.C:3176
 PID.C:3177
 PID.C:3178
 PID.C:3179
 PID.C:3180
 PID.C:3181
 PID.C:3182
 PID.C:3183
 PID.C:3184
 PID.C:3185
 PID.C:3186
 PID.C:3187
 PID.C:3188
 PID.C:3189
 PID.C:3190
 PID.C:3191
 PID.C:3192
 PID.C:3193
 PID.C:3194
 PID.C:3195
 PID.C:3196
 PID.C:3197
 PID.C:3198
 PID.C:3199
 PID.C:3200
 PID.C:3201
 PID.C:3202
 PID.C:3203
 PID.C:3204
 PID.C:3205
 PID.C:3206
 PID.C:3207
 PID.C:3208
 PID.C:3209
 PID.C:3210
 PID.C:3211
 PID.C:3212
 PID.C:3213
 PID.C:3214
 PID.C:3215
 PID.C:3216
 PID.C:3217
 PID.C:3218
 PID.C:3219
 PID.C:3220
 PID.C:3221
 PID.C:3222
 PID.C:3223
 PID.C:3224
 PID.C:3225
 PID.C:3226
 PID.C:3227
 PID.C:3228
 PID.C:3229
 PID.C:3230
 PID.C:3231
 PID.C:3232
 PID.C:3233
 PID.C:3234
 PID.C:3235
 PID.C:3236
 PID.C:3237
 PID.C:3238
 PID.C:3239
 PID.C:3240
 PID.C:3241
 PID.C:3242
 PID.C:3243
 PID.C:3244
 PID.C:3245
 PID.C:3246
 PID.C:3247
 PID.C:3248
 PID.C:3249
 PID.C:3250
 PID.C:3251
 PID.C:3252
 PID.C:3253
 PID.C:3254
 PID.C:3255
 PID.C:3256
 PID.C:3257
 PID.C:3258
 PID.C:3259
 PID.C:3260
 PID.C:3261
 PID.C:3262
 PID.C:3263
 PID.C:3264
 PID.C:3265
 PID.C:3266
 PID.C:3267
 PID.C:3268
 PID.C:3269
 PID.C:3270
 PID.C:3271
 PID.C:3272
 PID.C:3273
 PID.C:3274
 PID.C:3275
 PID.C:3276
 PID.C:3277
 PID.C:3278
 PID.C:3279
 PID.C:3280
 PID.C:3281
 PID.C:3282
 PID.C:3283
 PID.C:3284
 PID.C:3285
 PID.C:3286
 PID.C:3287
 PID.C:3288
 PID.C:3289
 PID.C:3290
 PID.C:3291
 PID.C:3292
 PID.C:3293
 PID.C:3294
 PID.C:3295
 PID.C:3296
 PID.C:3297
 PID.C:3298
 PID.C:3299
 PID.C:3300
 PID.C:3301
 PID.C:3302
 PID.C:3303
 PID.C:3304
 PID.C:3305
 PID.C:3306
 PID.C:3307
 PID.C:3308
 PID.C:3309
 PID.C:3310
 PID.C:3311
 PID.C:3312
 PID.C:3313
 PID.C:3314
 PID.C:3315
 PID.C:3316
 PID.C:3317
 PID.C:3318
 PID.C:3319
 PID.C:3320
 PID.C:3321
 PID.C:3322
 PID.C:3323
 PID.C:3324
 PID.C:3325
 PID.C:3326
 PID.C:3327
 PID.C:3328
 PID.C:3329
 PID.C:3330
 PID.C:3331
 PID.C:3332
 PID.C:3333
 PID.C:3334
 PID.C:3335
 PID.C:3336
 PID.C:3337
 PID.C:3338
 PID.C:3339
 PID.C:3340
 PID.C:3341
 PID.C:3342
 PID.C:3343
 PID.C:3344
 PID.C:3345
 PID.C:3346
 PID.C:3347
 PID.C:3348
 PID.C:3349
 PID.C:3350
 PID.C:3351
 PID.C:3352
 PID.C:3353
 PID.C:3354
 PID.C:3355
 PID.C:3356
 PID.C:3357
 PID.C:3358
 PID.C:3359
 PID.C:3360
 PID.C:3361
 PID.C:3362
 PID.C:3363
 PID.C:3364
 PID.C:3365
 PID.C:3366
 PID.C:3367
 PID.C:3368
 PID.C:3369
 PID.C:3370
 PID.C:3371
 PID.C:3372
 PID.C:3373
 PID.C:3374
 PID.C:3375
 PID.C:3376
 PID.C:3377
 PID.C:3378
 PID.C:3379
 PID.C:3380
 PID.C:3381
 PID.C:3382
 PID.C:3383
 PID.C:3384
 PID.C:3385
 PID.C:3386
 PID.C:3387
 PID.C:3388
 PID.C:3389
 PID.C:3390
 PID.C:3391
 PID.C:3392
 PID.C:3393
 PID.C:3394
 PID.C:3395
 PID.C:3396
 PID.C:3397
 PID.C:3398
 PID.C:3399
 PID.C:3400
 PID.C:3401
 PID.C:3402
 PID.C:3403
 PID.C:3404
 PID.C:3405
 PID.C:3406
 PID.C:3407
 PID.C:3408
 PID.C:3409
 PID.C:3410
 PID.C:3411
 PID.C:3412
 PID.C:3413
 PID.C:3414
 PID.C:3415
 PID.C:3416
 PID.C:3417
 PID.C:3418
 PID.C:3419
 PID.C:3420
 PID.C:3421
 PID.C:3422
 PID.C:3423
 PID.C:3424
 PID.C:3425
 PID.C:3426
 PID.C:3427
 PID.C:3428
 PID.C:3429
 PID.C:3430
 PID.C:3431
 PID.C:3432
 PID.C:3433
 PID.C:3434
 PID.C:3435
 PID.C:3436
 PID.C:3437
 PID.C:3438
 PID.C:3439
 PID.C:3440
 PID.C:3441
 PID.C:3442
 PID.C:3443
 PID.C:3444
 PID.C:3445
 PID.C:3446
 PID.C:3447
 PID.C:3448
 PID.C:3449
 PID.C:3450
 PID.C:3451
 PID.C:3452
 PID.C:3453
 PID.C:3454
 PID.C:3455
 PID.C:3456
 PID.C:3457
 PID.C:3458
 PID.C:3459
 PID.C:3460
 PID.C:3461
 PID.C:3462
 PID.C:3463
 PID.C:3464
 PID.C:3465
 PID.C:3466
 PID.C:3467
 PID.C:3468
 PID.C:3469
 PID.C:3470
 PID.C:3471
 PID.C:3472
 PID.C:3473
 PID.C:3474
 PID.C:3475
 PID.C:3476
 PID.C:3477
 PID.C:3478
 PID.C:3479
 PID.C:3480
 PID.C:3481
 PID.C:3482
 PID.C:3483
 PID.C:3484
 PID.C:3485
 PID.C:3486
 PID.C:3487
 PID.C:3488
 PID.C:3489
 PID.C:3490
 PID.C:3491
 PID.C:3492
 PID.C:3493
 PID.C:3494
 PID.C:3495
 PID.C:3496
 PID.C:3497
 PID.C:3498
 PID.C:3499
 PID.C:3500
 PID.C:3501
 PID.C:3502
 PID.C:3503
 PID.C:3504
 PID.C:3505
 PID.C:3506
 PID.C:3507
 PID.C:3508
 PID.C:3509
 PID.C:3510
 PID.C:3511
 PID.C:3512
 PID.C:3513
 PID.C:3514
 PID.C:3515
 PID.C:3516
 PID.C:3517
 PID.C:3518
 PID.C:3519
 PID.C:3520
 PID.C:3521
 PID.C:3522
 PID.C:3523
 PID.C:3524
 PID.C:3525
 PID.C:3526
 PID.C:3527
 PID.C:3528
 PID.C:3529
 PID.C:3530
 PID.C:3531
 PID.C:3532
 PID.C:3533
 PID.C:3534
 PID.C:3535
 PID.C:3536
 PID.C:3537
 PID.C:3538
 PID.C:3539
 PID.C:3540
 PID.C:3541
 PID.C:3542
 PID.C:3543
 PID.C:3544
 PID.C:3545
 PID.C:3546
 PID.C:3547
 PID.C:3548
 PID.C:3549
 PID.C:3550
 PID.C:3551
 PID.C:3552
 PID.C:3553
 PID.C:3554
 PID.C:3555
 PID.C:3556
 PID.C:3557
 PID.C:3558
 PID.C:3559
 PID.C:3560
 PID.C:3561
 PID.C:3562
 PID.C:3563
 PID.C:3564
 PID.C:3565
 PID.C:3566
 PID.C:3567
 PID.C:3568
 PID.C:3569
 PID.C:3570
 PID.C:3571
 PID.C:3572
 PID.C:3573
 PID.C:3574
 PID.C:3575
 PID.C:3576
 PID.C:3577
 PID.C:3578
 PID.C:3579
 PID.C:3580
 PID.C:3581
 PID.C:3582
 PID.C:3583
 PID.C:3584
 PID.C:3585
 PID.C:3586
 PID.C:3587
 PID.C:3588
 PID.C:3589
 PID.C:3590
 PID.C:3591
 PID.C:3592
 PID.C:3593
 PID.C:3594
 PID.C:3595
 PID.C:3596
 PID.C:3597
 PID.C:3598
 PID.C:3599
 PID.C:3600
 PID.C:3601
 PID.C:3602
 PID.C:3603
 PID.C:3604
 PID.C:3605
 PID.C:3606
 PID.C:3607
 PID.C:3608
 PID.C:3609
 PID.C:3610
 PID.C:3611
 PID.C:3612
 PID.C:3613
 PID.C:3614
 PID.C:3615
 PID.C:3616
 PID.C:3617
 PID.C:3618
 PID.C:3619
 PID.C:3620
 PID.C:3621
 PID.C:3622
 PID.C:3623
 PID.C:3624
 PID.C:3625
 PID.C:3626
 PID.C:3627
 PID.C:3628
 PID.C:3629
 PID.C:3630
 PID.C:3631
 PID.C:3632
 PID.C:3633
 PID.C:3634
 PID.C:3635
 PID.C:3636
 PID.C:3637
 PID.C:3638
 PID.C:3639
 PID.C:3640
 PID.C:3641
 PID.C:3642
 PID.C:3643
 PID.C:3644
 PID.C:3645
 PID.C:3646
 PID.C:3647
 PID.C:3648
 PID.C:3649
 PID.C:3650
 PID.C:3651
 PID.C:3652
 PID.C:3653
 PID.C:3654
 PID.C:3655
 PID.C:3656
 PID.C:3657
 PID.C:3658
 PID.C:3659
 PID.C:3660
 PID.C:3661
 PID.C:3662
 PID.C:3663
 PID.C:3664
 PID.C:3665
 PID.C:3666
 PID.C:3667
 PID.C:3668
 PID.C:3669
 PID.C:3670
 PID.C:3671
 PID.C:3672
 PID.C:3673
 PID.C:3674
 PID.C:3675
 PID.C:3676
 PID.C:3677
 PID.C:3678
 PID.C:3679
 PID.C:3680
 PID.C:3681
 PID.C:3682
 PID.C:3683
 PID.C:3684
 PID.C:3685
 PID.C:3686
 PID.C:3687
 PID.C:3688
 PID.C:3689
 PID.C:3690
 PID.C:3691
 PID.C:3692
 PID.C:3693
 PID.C:3694
 PID.C:3695
 PID.C:3696
 PID.C:3697
 PID.C:3698
 PID.C:3699
 PID.C:3700
 PID.C:3701
 PID.C:3702
 PID.C:3703
 PID.C:3704
 PID.C:3705
 PID.C:3706
 PID.C:3707
 PID.C:3708
 PID.C:3709
 PID.C:3710
 PID.C:3711
 PID.C:3712
 PID.C:3713
 PID.C:3714
 PID.C:3715
 PID.C:3716
 PID.C:3717
 PID.C:3718
 PID.C:3719
 PID.C:3720
 PID.C:3721
 PID.C:3722
 PID.C:3723
 PID.C:3724
 PID.C:3725
 PID.C:3726
 PID.C:3727
 PID.C:3728
 PID.C:3729
 PID.C:3730
 PID.C:3731
 PID.C:3732
 PID.C:3733
 PID.C:3734
 PID.C:3735
 PID.C:3736
 PID.C:3737
 PID.C:3738
 PID.C:3739
 PID.C:3740
 PID.C:3741
 PID.C:3742
 PID.C:3743
 PID.C:3744
 PID.C:3745
 PID.C:3746
 PID.C:3747
 PID.C:3748
 PID.C:3749
 PID.C:3750
 PID.C:3751
 PID.C:3752
 PID.C:3753
 PID.C:3754
 PID.C:3755
 PID.C:3756
 PID.C:3757
 PID.C:3758
 PID.C:3759
 PID.C:3760
 PID.C:3761
 PID.C:3762
 PID.C:3763
 PID.C:3764
 PID.C:3765
 PID.C:3766
 PID.C:3767
 PID.C:3768
 PID.C:3769
 PID.C:3770
 PID.C:3771
 PID.C:3772
 PID.C:3773
 PID.C:3774
 PID.C:3775
 PID.C:3776
 PID.C:3777
 PID.C:3778
 PID.C:3779
 PID.C:3780
 PID.C:3781
 PID.C:3782
 PID.C:3783
 PID.C:3784
 PID.C:3785
 PID.C:3786
 PID.C:3787
 PID.C:3788
 PID.C:3789
 PID.C:3790
 PID.C:3791
 PID.C:3792
 PID.C:3793
 PID.C:3794
 PID.C:3795
 PID.C:3796
 PID.C:3797
 PID.C:3798
 PID.C:3799
 PID.C:3800
 PID.C:3801
 PID.C:3802
 PID.C:3803
 PID.C:3804
 PID.C:3805
 PID.C:3806
 PID.C:3807
 PID.C:3808
 PID.C:3809
 PID.C:3810
 PID.C:3811
 PID.C:3812
 PID.C:3813
 PID.C:3814
 PID.C:3815
 PID.C:3816
 PID.C:3817
 PID.C:3818
 PID.C:3819
 PID.C:3820
 PID.C:3821
 PID.C:3822
 PID.C:3823
 PID.C:3824
 PID.C:3825
 PID.C:3826
 PID.C:3827
 PID.C:3828
 PID.C:3829
 PID.C:3830
 PID.C:3831
 PID.C:3832
 PID.C:3833
 PID.C:3834
 PID.C:3835
 PID.C:3836
 PID.C:3837
 PID.C:3838
 PID.C:3839
 PID.C:3840
 PID.C:3841
 PID.C:3842
 PID.C:3843
 PID.C:3844
 PID.C:3845
 PID.C:3846
 PID.C:3847
 PID.C:3848
 PID.C:3849
 PID.C:3850
 PID.C:3851
 PID.C:3852
 PID.C:3853
 PID.C:3854
 PID.C:3855
 PID.C:3856
 PID.C:3857
 PID.C:3858
 PID.C:3859
 PID.C:3860
 PID.C:3861
 PID.C:3862
 PID.C:3863
 PID.C:3864
 PID.C:3865
 PID.C:3866
 PID.C:3867
 PID.C:3868
 PID.C:3869
 PID.C:3870
 PID.C:3871
 PID.C:3872
 PID.C:3873
 PID.C:3874
 PID.C:3875
 PID.C:3876
 PID.C:3877
 PID.C:3878
 PID.C:3879
 PID.C:3880
 PID.C:3881
 PID.C:3882
 PID.C:3883
 PID.C:3884
 PID.C:3885
 PID.C:3886
 PID.C:3887
 PID.C:3888
 PID.C:3889
 PID.C:3890
 PID.C:3891
 PID.C:3892
 PID.C:3893
 PID.C:3894
 PID.C:3895
 PID.C:3896
 PID.C:3897
 PID.C:3898
 PID.C:3899
 PID.C:3900
 PID.C:3901
 PID.C:3902
 PID.C:3903
 PID.C:3904
 PID.C:3905
 PID.C:3906
 PID.C:3907
 PID.C:3908
 PID.C:3909
 PID.C:3910
 PID.C:3911
 PID.C:3912
 PID.C:3913
 PID.C:3914
 PID.C:3915
 PID.C:3916
 PID.C:3917
 PID.C:3918
 PID.C:3919
 PID.C:3920
 PID.C:3921
 PID.C:3922
 PID.C:3923
 PID.C:3924
 PID.C:3925
 PID.C:3926
 PID.C:3927
 PID.C:3928
 PID.C:3929
 PID.C:3930
 PID.C:3931
 PID.C:3932
 PID.C:3933
 PID.C:3934
 PID.C:3935
 PID.C:3936
 PID.C:3937
 PID.C:3938
 PID.C:3939
 PID.C:3940
 PID.C:3941
 PID.C:3942
 PID.C:3943
 PID.C:3944
 PID.C:3945
 PID.C:3946
 PID.C:3947
 PID.C:3948
 PID.C:3949
 PID.C:3950
 PID.C:3951
 PID.C:3952
 PID.C:3953
 PID.C:3954
 PID.C:3955
 PID.C:3956
 PID.C:3957
 PID.C:3958
 PID.C:3959
 PID.C:3960
 PID.C:3961
 PID.C:3962
 PID.C:3963
 PID.C:3964
 PID.C:3965
 PID.C:3966
 PID.C:3967
 PID.C:3968
 PID.C:3969
 PID.C:3970
 PID.C:3971
 PID.C:3972
 PID.C:3973
 PID.C:3974
 PID.C:3975
 PID.C:3976
 PID.C:3977
 PID.C:3978
 PID.C:3979
 PID.C:3980
 PID.C:3981
 PID.C:3982
 PID.C:3983
 PID.C:3984
 PID.C:3985
 PID.C:3986
 PID.C:3987
 PID.C:3988
 PID.C:3989
 PID.C:3990
 PID.C:3991
 PID.C:3992
 PID.C:3993
 PID.C:3994
 PID.C:3995
 PID.C:3996
 PID.C:3997
 PID.C:3998
 PID.C:3999
 PID.C:4000
 PID.C:4001
 PID.C:4002
 PID.C:4003
 PID.C:4004
 PID.C:4005
 PID.C:4006
 PID.C:4007
 PID.C:4008
 PID.C:4009
 PID.C:4010
 PID.C:4011
 PID.C:4012
 PID.C:4013
 PID.C:4014
 PID.C:4015
 PID.C:4016
 PID.C:4017
 PID.C:4018
 PID.C:4019
 PID.C:4020
 PID.C:4021
 PID.C:4022
 PID.C:4023
 PID.C:4024
 PID.C:4025
 PID.C:4026
 PID.C:4027
 PID.C:4028
 PID.C:4029
 PID.C:4030
 PID.C:4031
 PID.C:4032
 PID.C:4033
 PID.C:4034
 PID.C:4035
 PID.C:4036
 PID.C:4037
 PID.C:4038
 PID.C:4039
 PID.C:4040
 PID.C:4041
 PID.C:4042
 PID.C:4043
 PID.C:4044
 PID.C:4045
 PID.C:4046
 PID.C:4047
 PID.C:4048
 PID.C:4049
 PID.C:4050
 PID.C:4051
 PID.C:4052
 PID.C:4053
 PID.C:4054
 PID.C:4055
 PID.C:4056
 PID.C:4057
 PID.C:4058
 PID.C:4059
 PID.C:4060
 PID.C:4061
 PID.C:4062
 PID.C:4063
 PID.C:4064
 PID.C:4065
 PID.C:4066
 PID.C:4067
 PID.C:4068
 PID.C:4069
 PID.C:4070
 PID.C:4071
 PID.C:4072
 PID.C:4073
 PID.C:4074
 PID.C:4075
 PID.C:4076
 PID.C:4077
 PID.C:4078
 PID.C:4079
 PID.C:4080
 PID.C:4081
 PID.C:4082
 PID.C:4083
 PID.C:4084
 PID.C:4085
 PID.C:4086
 PID.C:4087
 PID.C:4088
 PID.C:4089
 PID.C:4090
 PID.C:4091
 PID.C:4092
 PID.C:4093
 PID.C:4094
 PID.C:4095
 PID.C:4096
 PID.C:4097
 PID.C:4098
 PID.C:4099
 PID.C:4100
 PID.C:4101
 PID.C:4102
 PID.C:4103
 PID.C:4104
 PID.C:4105
 PID.C:4106
 PID.C:4107
 PID.C:4108
 PID.C:4109
 PID.C:4110
 PID.C:4111
 PID.C:4112
 PID.C:4113
 PID.C:4114
 PID.C:4115
 PID.C:4116
 PID.C:4117
 PID.C:4118
 PID.C:4119
 PID.C:4120
 PID.C:4121
 PID.C:4122
 PID.C:4123
 PID.C:4124
 PID.C:4125
 PID.C:4126
 PID.C:4127
 PID.C:4128
 PID.C:4129
 PID.C:4130
 PID.C:4131
 PID.C:4132
 PID.C:4133
 PID.C:4134
 PID.C:4135
 PID.C:4136
 PID.C:4137
 PID.C:4138
 PID.C:4139
 PID.C:4140
 PID.C:4141
 PID.C:4142
 PID.C:4143
 PID.C:4144
 PID.C:4145
 PID.C:4146
 PID.C:4147
 PID.C:4148
 PID.C:4149
 PID.C:4150
 PID.C:4151
 PID.C:4152
 PID.C:4153
 PID.C:4154
 PID.C:4155
 PID.C:4156
 PID.C:4157
 PID.C:4158
 PID.C:4159
 PID.C:4160
 PID.C:4161
 PID.C:4162
 PID.C:4163
 PID.C:4164
 PID.C:4165
 PID.C:4166
 PID.C:4167
 PID.C:4168
 PID.C:4169
 PID.C:4170
 PID.C:4171
 PID.C:4172
 PID.C:4173
 PID.C:4174
 PID.C:4175
 PID.C:4176
 PID.C:4177
 PID.C:4178
 PID.C:4179
 PID.C:4180
 PID.C:4181
 PID.C:4182
 PID.C:4183
 PID.C:4184
 PID.C:4185
 PID.C:4186
 PID.C:4187
 PID.C:4188
 PID.C:4189
 PID.C:4190
 PID.C:4191
 PID.C:4192
 PID.C:4193
 PID.C:4194
 PID.C:4195
 PID.C:4196
 PID.C:4197
 PID.C:4198
 PID.C:4199
 PID.C:4200
 PID.C:4201
 PID.C:4202
 PID.C:4203
 PID.C:4204
 PID.C:4205
 PID.C:4206
 PID.C:4207
 PID.C:4208
 PID.C:4209
 PID.C:4210
 PID.C:4211
 PID.C:4212
 PID.C:4213
 PID.C:4214
 PID.C:4215
 PID.C:4216
 PID.C:4217
 PID.C:4218
 PID.C:4219
 PID.C:4220
 PID.C:4221
 PID.C:4222
 PID.C:4223
 PID.C:4224
 PID.C:4225
 PID.C:4226
 PID.C:4227
 PID.C:4228
 PID.C:4229
 PID.C:4230
 PID.C:4231
 PID.C:4232
 PID.C:4233
 PID.C:4234
 PID.C:4235
 PID.C:4236
 PID.C:4237
 PID.C:4238
 PID.C:4239
 PID.C:4240
 PID.C:4241
 PID.C:4242
 PID.C:4243
 PID.C:4244
 PID.C:4245
 PID.C:4246
 PID.C:4247
 PID.C:4248
 PID.C:4249
 PID.C:4250
 PID.C:4251
 PID.C:4252
 PID.C:4253
 PID.C:4254
 PID.C:4255
 PID.C:4256
 PID.C:4257
 PID.C:4258
 PID.C:4259
 PID.C:4260
 PID.C:4261
 PID.C:4262
 PID.C:4263
 PID.C:4264
 PID.C:4265
 PID.C:4266
 PID.C:4267
 PID.C:4268
 PID.C:4269
 PID.C:4270
 PID.C:4271
 PID.C:4272
 PID.C:4273
 PID.C:4274
 PID.C:4275
 PID.C:4276
 PID.C:4277
 PID.C:4278
 PID.C:4279
 PID.C:4280
 PID.C:4281
 PID.C:4282
 PID.C:4283
 PID.C:4284
 PID.C:4285
 PID.C:4286
 PID.C:4287
 PID.C:4288
 PID.C:4289
 PID.C:4290
 PID.C:4291
 PID.C:4292
 PID.C:4293
 PID.C:4294
 PID.C:4295
 PID.C:4296
 PID.C:4297
 PID.C:4298
 PID.C:4299
 PID.C:4300
 PID.C:4301
 PID.C:4302
 PID.C:4303
 PID.C:4304
 PID.C:4305
 PID.C:4306
 PID.C:4307
 PID.C:4308
 PID.C:4309
 PID.C:4310
 PID.C:4311
 PID.C:4312
 PID.C:4313
 PID.C:4314
 PID.C:4315
 PID.C:4316
 PID.C:4317
 PID.C:4318
 PID.C:4319
 PID.C:4320
 PID.C:4321
 PID.C:4322
 PID.C:4323
 PID.C:4324
 PID.C:4325
 PID.C:4326
 PID.C:4327
 PID.C:4328
 PID.C:4329
 PID.C:4330
 PID.C:4331
 PID.C:4332
 PID.C:4333
 PID.C:4334
 PID.C:4335
 PID.C:4336
 PID.C:4337
 PID.C:4338
 PID.C:4339
 PID.C:4340
 PID.C:4341
 PID.C:4342
 PID.C:4343
 PID.C:4344
 PID.C:4345
 PID.C:4346
 PID.C:4347
 PID.C:4348
 PID.C:4349
 PID.C:4350
 PID.C:4351
 PID.C:4352
 PID.C:4353
 PID.C:4354
 PID.C:4355
 PID.C:4356
 PID.C:4357
 PID.C:4358
 PID.C:4359
 PID.C:4360
 PID.C:4361
 PID.C:4362
 PID.C:4363
 PID.C:4364
 PID.C:4365
 PID.C:4366
 PID.C:4367
 PID.C:4368
 PID.C:4369
 PID.C:4370
 PID.C:4371
 PID.C:4372
 PID.C:4373
 PID.C:4374
 PID.C:4375
 PID.C:4376
 PID.C:4377
 PID.C:4378
 PID.C:4379
 PID.C:4380
 PID.C:4381
 PID.C:4382
 PID.C:4383
 PID.C:4384
 PID.C:4385
 PID.C:4386
 PID.C:4387
 PID.C:4388
 PID.C:4389
 PID.C:4390
 PID.C:4391
 PID.C:4392
 PID.C:4393
 PID.C:4394
 PID.C:4395
 PID.C:4396
 PID.C:4397
 PID.C:4398
 PID.C:4399
 PID.C:4400
 PID.C:4401
 PID.C:4402
 PID.C:4403
 PID.C:4404
 PID.C:4405
 PID.C:4406
 PID.C:4407
 PID.C:4408
 PID.C:4409
 PID.C:4410
 PID.C:4411
 PID.C:4412
 PID.C:4413
 PID.C:4414
 PID.C:4415
 PID.C:4416
 PID.C:4417
 PID.C:4418
 PID.C:4419
 PID.C:4420
 PID.C:4421
 PID.C:4422
 PID.C:4423
 PID.C:4424
 PID.C:4425
 PID.C:4426
 PID.C:4427
 PID.C:4428
 PID.C:4429
 PID.C:4430
 PID.C:4431
 PID.C:4432
 PID.C:4433
 PID.C:4434
 PID.C:4435
 PID.C:4436
 PID.C:4437
 PID.C:4438
 PID.C:4439
 PID.C:4440
 PID.C:4441
 PID.C:4442
 PID.C:4443
 PID.C:4444
 PID.C:4445
 PID.C:4446
 PID.C:4447
 PID.C:4448
 PID.C:4449
 PID.C:4450
 PID.C:4451
 PID.C:4452
 PID.C:4453
 PID.C:4454
 PID.C:4455
 PID.C:4456
 PID.C:4457
 PID.C:4458
 PID.C:4459
 PID.C:4460
 PID.C:4461
 PID.C:4462
 PID.C:4463
 PID.C:4464
 PID.C:4465
 PID.C:4466
 PID.C:4467
 PID.C:4468
 PID.C:4469
 PID.C:4470
 PID.C:4471
 PID.C:4472
 PID.C:4473
 PID.C:4474
 PID.C:4475
 PID.C:4476
 PID.C:4477
 PID.C:4478
 PID.C:4479
 PID.C:4480
 PID.C:4481
 PID.C:4482
 PID.C:4483
 PID.C:4484
 PID.C:4485
 PID.C:4486
 PID.C:4487
 PID.C:4488
 PID.C:4489
 PID.C:4490
 PID.C:4491
 PID.C:4492
 PID.C:4493
 PID.C:4494
 PID.C:4495
 PID.C:4496
 PID.C:4497
 PID.C:4498
 PID.C:4499
 PID.C:4500
 PID.C:4501
 PID.C:4502
 PID.C:4503
 PID.C:4504
 PID.C:4505
 PID.C:4506
 PID.C:4507
 PID.C:4508
 PID.C:4509
 PID.C:4510
 PID.C:4511
 PID.C:4512
 PID.C:4513
 PID.C:4514
 PID.C:4515
 PID.C:4516
 PID.C:4517
 PID.C:4518
 PID.C:4519
 PID.C:4520
 PID.C:4521
 PID.C:4522
 PID.C:4523
 PID.C:4524
 PID.C:4525
 PID.C:4526
 PID.C:4527
 PID.C:4528
 PID.C:4529
 PID.C:4530
 PID.C:4531
 PID.C:4532
 PID.C:4533
 PID.C:4534
 PID.C:4535
 PID.C:4536
 PID.C:4537
 PID.C:4538
 PID.C:4539
 PID.C:4540
 PID.C:4541
 PID.C:4542
 PID.C:4543
 PID.C:4544
 PID.C:4545
 PID.C:4546
 PID.C:4547
 PID.C:4548
 PID.C:4549
 PID.C:4550
 PID.C:4551
 PID.C:4552
 PID.C:4553
 PID.C:4554
 PID.C:4555
 PID.C:4556
 PID.C:4557
 PID.C:4558
 PID.C:4559
 PID.C:4560
 PID.C:4561
 PID.C:4562
 PID.C:4563
 PID.C:4564
 PID.C:4565
 PID.C:4566
 PID.C:4567
 PID.C:4568
 PID.C:4569
 PID.C:4570
 PID.C:4571
 PID.C:4572
 PID.C:4573
 PID.C:4574
 PID.C:4575
 PID.C:4576
 PID.C:4577
 PID.C:4578
 PID.C:4579
 PID.C:4580
 PID.C:4581
 PID.C:4582
 PID.C:4583
 PID.C:4584
 PID.C:4585
 PID.C:4586
 PID.C:4587
 PID.C:4588
 PID.C:4589
 PID.C:4590
 PID.C:4591
 PID.C:4592
 PID.C:4593
 PID.C:4594
 PID.C:4595
 PID.C:4596
 PID.C:4597
 PID.C:4598
 PID.C:4599
 PID.C:4600
 PID.C:4601
 PID.C:4602
 PID.C:4603
 PID.C:4604
 PID.C:4605
 PID.C:4606
 PID.C:4607
 PID.C:4608
 PID.C:4609
 PID.C:4610
 PID.C:4611
 PID.C:4612
 PID.C:4613
 PID.C:4614
 PID.C:4615
 PID.C:4616
 PID.C:4617
 PID.C:4618
 PID.C:4619
 PID.C:4620
 PID.C:4621
 PID.C:4622
 PID.C:4623
 PID.C:4624
 PID.C:4625
 PID.C:4626
 PID.C:4627
 PID.C:4628
 PID.C:4629
 PID.C:4630
 PID.C:4631
 PID.C:4632
 PID.C:4633
 PID.C:4634
 PID.C:4635
 PID.C:4636
 PID.C:4637
 PID.C:4638
 PID.C:4639
 PID.C:4640
 PID.C:4641
 PID.C:4642
 PID.C:4643
 PID.C:4644
 PID.C:4645
 PID.C:4646
 PID.C:4647
 PID.C:4648
 PID.C:4649
 PID.C:4650
 PID.C:4651
 PID.C:4652
 PID.C:4653
 PID.C:4654
 PID.C:4655
 PID.C:4656
 PID.C:4657
 PID.C:4658
 PID.C:4659
 PID.C:4660
 PID.C:4661
 PID.C:4662
 PID.C:4663
 PID.C:4664
 PID.C:4665
 PID.C:4666
 PID.C:4667
 PID.C:4668
 PID.C:4669
 PID.C:4670
 PID.C:4671
 PID.C:4672
 PID.C:4673
 PID.C:4674
 PID.C:4675
 PID.C:4676
 PID.C:4677
 PID.C:4678
 PID.C:4679
 PID.C:4680
 PID.C:4681
 PID.C:4682
 PID.C:4683
 PID.C:4684
 PID.C:4685
 PID.C:4686
 PID.C:4687
 PID.C:4688
 PID.C:4689
 PID.C:4690
 PID.C:4691
 PID.C:4692
 PID.C:4693
 PID.C:4694
 PID.C:4695
 PID.C:4696
 PID.C:4697
 PID.C:4698
 PID.C:4699
 PID.C:4700
 PID.C:4701
 PID.C:4702
 PID.C:4703
 PID.C:4704
 PID.C:4705
 PID.C:4706
 PID.C:4707
 PID.C:4708
 PID.C:4709
 PID.C:4710
 PID.C:4711
 PID.C:4712
 PID.C:4713
 PID.C:4714
 PID.C:4715
 PID.C:4716
 PID.C:4717
 PID.C:4718
 PID.C:4719
 PID.C:4720
 PID.C:4721
 PID.C:4722
 PID.C:4723
 PID.C:4724
 PID.C:4725
 PID.C:4726
 PID.C:4727
 PID.C:4728
 PID.C:4729
 PID.C:4730
 PID.C:4731
 PID.C:4732
 PID.C:4733
 PID.C:4734
 PID.C:4735
 PID.C:4736
 PID.C:4737
 PID.C:4738
 PID.C:4739
 PID.C:4740
 PID.C:4741
 PID.C:4742
 PID.C:4743
 PID.C:4744
 PID.C:4745
 PID.C:4746
 PID.C:4747
 PID.C:4748
 PID.C:4749
 PID.C:4750
 PID.C:4751
 PID.C:4752
 PID.C:4753
 PID.C:4754
 PID.C:4755
 PID.C:4756
 PID.C:4757
 PID.C:4758
 PID.C:4759
 PID.C:4760
 PID.C:4761
 PID.C:4762
 PID.C:4763
 PID.C:4764
 PID.C:4765
 PID.C:4766
 PID.C:4767
 PID.C:4768
 PID.C:4769
 PID.C:4770
 PID.C:4771
 PID.C:4772
 PID.C:4773
 PID.C:4774
 PID.C:4775
 PID.C:4776
 PID.C:4777
 PID.C:4778
 PID.C:4779
 PID.C:4780
 PID.C:4781
 PID.C:4782
 PID.C:4783
 PID.C:4784
 PID.C:4785
 PID.C:4786
 PID.C:4787
 PID.C:4788
 PID.C:4789
 PID.C:4790
 PID.C:4791
 PID.C:4792
 PID.C:4793
 PID.C:4794
 PID.C:4795
 PID.C:4796
 PID.C:4797
 PID.C:4798
 PID.C:4799
 PID.C:4800
 PID.C:4801
 PID.C:4802
 PID.C:4803
 PID.C:4804
 PID.C:4805
 PID.C:4806
 PID.C:4807
 PID.C:4808
 PID.C:4809
 PID.C:4810
 PID.C:4811
 PID.C:4812
 PID.C:4813
 PID.C:4814
 PID.C:4815
 PID.C:4816
 PID.C:4817
 PID.C:4818
 PID.C:4819
 PID.C:4820
 PID.C:4821
 PID.C:4822
 PID.C:4823
 PID.C:4824
 PID.C:4825
 PID.C:4826
 PID.C:4827
 PID.C:4828
 PID.C:4829
 PID.C:4830
 PID.C:4831
 PID.C:4832
 PID.C:4833
 PID.C:4834
 PID.C:4835
 PID.C:4836
 PID.C:4837
 PID.C:4838
 PID.C:4839
 PID.C:4840
 PID.C:4841
 PID.C:4842
 PID.C:4843
 PID.C:4844
 PID.C:4845
 PID.C:4846
 PID.C:4847
 PID.C:4848
 PID.C:4849
 PID.C:4850
 PID.C:4851
 PID.C:4852
 PID.C:4853
 PID.C:4854
 PID.C:4855
 PID.C:4856
 PID.C:4857
 PID.C:4858
 PID.C:4859
 PID.C:4860
 PID.C:4861
 PID.C:4862
 PID.C:4863
 PID.C:4864
 PID.C:4865
 PID.C:4866
 PID.C:4867
 PID.C:4868
 PID.C:4869
 PID.C:4870
 PID.C:4871
 PID.C:4872
 PID.C:4873
 PID.C:4874
 PID.C:4875
 PID.C:4876
 PID.C:4877
 PID.C:4878
 PID.C:4879
 PID.C:4880
 PID.C:4881
 PID.C:4882
 PID.C:4883
 PID.C:4884
 PID.C:4885
 PID.C:4886
 PID.C:4887
 PID.C:4888
 PID.C:4889
 PID.C:4890
 PID.C:4891
 PID.C:4892
 PID.C:4893
 PID.C:4894
 PID.C:4895
 PID.C:4896
 PID.C:4897
 PID.C:4898
 PID.C:4899
 PID.C:4900
 PID.C:4901
 PID.C:4902
 PID.C:4903
 PID.C:4904
 PID.C:4905
 PID.C:4906
 PID.C:4907
 PID.C:4908
 PID.C:4909
 PID.C:4910
 PID.C:4911
 PID.C:4912
 PID.C:4913
 PID.C:4914
 PID.C:4915
 PID.C:4916
 PID.C:4917
 PID.C:4918
 PID.C:4919
 PID.C:4920
 PID.C:4921
 PID.C:4922
 PID.C:4923
 PID.C:4924
 PID.C:4925
 PID.C:4926
 PID.C:4927
 PID.C:4928
 PID.C:4929
 PID.C:4930
 PID.C:4931
 PID.C:4932
 PID.C:4933
 PID.C:4934
 PID.C:4935
 PID.C:4936
 PID.C:4937
 PID.C:4938
 PID.C:4939
 PID.C:4940
 PID.C:4941
 PID.C:4942
 PID.C:4943
 PID.C:4944
 PID.C:4945
 PID.C:4946
 PID.C:4947
 PID.C:4948
 PID.C:4949
 PID.C:4950
 PID.C:4951
 PID.C:4952
 PID.C:4953
 PID.C:4954
 PID.C:4955
 PID.C:4956
 PID.C:4957
 PID.C:4958
 PID.C:4959
 PID.C:4960
 PID.C:4961
 PID.C:4962
 PID.C:4963
 PID.C:4964
 PID.C:4965
 PID.C:4966
 PID.C:4967
 PID.C:4968
 PID.C:4969
 PID.C:4970
 PID.C:4971
 PID.C:4972
 PID.C:4973
 PID.C:4974
 PID.C:4975
 PID.C:4976
 PID.C:4977
 PID.C:4978
 PID.C:4979
 PID.C:4980
 PID.C:4981
 PID.C:4982
 PID.C:4983
 PID.C:4984
 PID.C:4985
 PID.C:4986
 PID.C:4987
 PID.C:4988
 PID.C:4989
 PID.C:4990
 PID.C:4991
 PID.C:4992
 PID.C:4993
 PID.C:4994
 PID.C:4995
 PID.C:4996
 PID.C:4997
 PID.C:4998
 PID.C:4999
 PID.C:5000
 PID.C:5001
 PID.C:5002
 PID.C:5003
 PID.C:5004
 PID.C:5005
 PID.C:5006
 PID.C:5007
 PID.C:5008
 PID.C:5009
 PID.C:5010
 PID.C:5011
 PID.C:5012
 PID.C:5013
 PID.C:5014
 PID.C:5015
 PID.C:5016
 PID.C:5017
 PID.C:5018
 PID.C:5019
 PID.C:5020
 PID.C:5021
 PID.C:5022
 PID.C:5023
 PID.C:5024
 PID.C:5025
 PID.C:5026
 PID.C:5027
 PID.C:5028
 PID.C:5029
 PID.C:5030
 PID.C:5031
 PID.C:5032
 PID.C:5033
 PID.C:5034
 PID.C:5035
 PID.C:5036
 PID.C:5037
 PID.C:5038
 PID.C:5039
 PID.C:5040
 PID.C:5041
 PID.C:5042
 PID.C:5043
 PID.C:5044
 PID.C:5045
 PID.C:5046
 PID.C:5047
 PID.C:5048
 PID.C:5049
 PID.C:5050
 PID.C:5051
 PID.C:5052
 PID.C:5053
 PID.C:5054
 PID.C:5055
 PID.C:5056
 PID.C:5057
 PID.C:5058
 PID.C:5059
 PID.C:5060
 PID.C:5061
 PID.C:5062
 PID.C:5063
 PID.C:5064
 PID.C:5065
 PID.C:5066
 PID.C:5067
 PID.C:5068
 PID.C:5069
 PID.C:5070
 PID.C:5071
 PID.C:5072
 PID.C:5073
 PID.C:5074
 PID.C:5075
 PID.C:5076
 PID.C:5077
 PID.C:5078
 PID.C:5079
 PID.C:5080
 PID.C:5081
 PID.C:5082
 PID.C:5083
 PID.C:5084
 PID.C:5085
 PID.C:5086
 PID.C:5087
 PID.C:5088
 PID.C:5089
 PID.C:5090
 PID.C:5091
 PID.C:5092
 PID.C:5093
 PID.C:5094
 PID.C:5095
 PID.C:5096
 PID.C:5097
 PID.C:5098
 PID.C:5099
 PID.C:5100
 PID.C:5101
 PID.C:5102
 PID.C:5103
 PID.C:5104
 PID.C:5105
 PID.C:5106
 PID.C:5107
 PID.C:5108
 PID.C:5109
 PID.C:5110
 PID.C:5111
 PID.C:5112
 PID.C:5113
 PID.C:5114
 PID.C:5115
 PID.C:5116
 PID.C:5117
 PID.C:5118
 PID.C:5119
 PID.C:5120
 PID.C:5121
 PID.C:5122
 PID.C:5123
 PID.C:5124
 PID.C:5125
 PID.C:5126
 PID.C:5127
 PID.C:5128
 PID.C:5129
 PID.C:5130
 PID.C:5131
 PID.C:5132
 PID.C:5133
 PID.C:5134
 PID.C:5135
 PID.C:5136
 PID.C:5137
 PID.C:5138
 PID.C:5139
 PID.C:5140
 PID.C:5141
 PID.C:5142
 PID.C:5143
 PID.C:5144
 PID.C:5145
 PID.C:5146
 PID.C:5147
 PID.C:5148
 PID.C:5149
 PID.C:5150
 PID.C:5151
 PID.C:5152
 PID.C:5153
 PID.C:5154
 PID.C:5155
 PID.C:5156
 PID.C:5157
 PID.C:5158
 PID.C:5159
 PID.C:5160
 PID.C:5161
 PID.C:5162
 PID.C:5163
 PID.C:5164
 PID.C:5165
 PID.C:5166
 PID.C:5167
 PID.C:5168
 PID.C:5169
 PID.C:5170
 PID.C:5171
 PID.C:5172
 PID.C:5173
 PID.C:5174
 PID.C:5175
 PID.C:5176
 PID.C:5177
 PID.C:5178
 PID.C:5179
 PID.C:5180
 PID.C:5181
 PID.C:5182
 PID.C:5183
 PID.C:5184
 PID.C:5185
 PID.C:5186
 PID.C:5187
 PID.C:5188
 PID.C:5189
 PID.C:5190
 PID.C:5191
 PID.C:5192
 PID.C:5193
 PID.C:5194
 PID.C:5195
 PID.C:5196
 PID.C:5197
 PID.C:5198
 PID.C:5199
 PID.C:5200
 PID.C:5201
 PID.C:5202
 PID.C:5203
 PID.C:5204
 PID.C:5205
 PID.C:5206
 PID.C:5207
 PID.C:5208
 PID.C:5209
 PID.C:5210
 PID.C:5211
 PID.C:5212
 PID.C:5213
 PID.C:5214
 PID.C:5215
 PID.C:5216
 PID.C:5217
 PID.C:5218
 PID.C:5219
 PID.C:5220
 PID.C:5221
 PID.C:5222
 PID.C:5223
 PID.C:5224
 PID.C:5225
 PID.C:5226
 PID.C:5227
 PID.C:5228
 PID.C:5229
 PID.C:5230
 PID.C:5231
 PID.C:5232
 PID.C:5233
 PID.C:5234
 PID.C:5235
 PID.C:5236
 PID.C:5237
 PID.C:5238
 PID.C:5239
 PID.C:5240
 PID.C:5241
 PID.C:5242
 PID.C:5243
 PID.C:5244
 PID.C:5245
 PID.C:5246
 PID.C:5247
 PID.C:5248
 PID.C:5249
 PID.C:5250
 PID.C:5251
 PID.C:5252
 PID.C:5253
 PID.C:5254
 PID.C:5255
 PID.C:5256
 PID.C:5257
 PID.C:5258
 PID.C:5259
 PID.C:5260
 PID.C:5261
 PID.C:5262
 PID.C:5263
 PID.C:5264
 PID.C:5265
 PID.C:5266
 PID.C:5267
 PID.C:5268
 PID.C:5269
 PID.C:5270
 PID.C:5271
 PID.C:5272
 PID.C:5273
 PID.C:5274
 PID.C:5275
 PID.C:5276
 PID.C:5277
 PID.C:5278
 PID.C:5279
 PID.C:5280
 PID.C:5281
 PID.C:5282
 PID.C:5283
 PID.C:5284
 PID.C:5285
 PID.C:5286
 PID.C:5287
 PID.C:5288
 PID.C:5289
 PID.C:5290
 PID.C:5291
 PID.C:5292
 PID.C:5293
 PID.C:5294
 PID.C:5295
 PID.C:5296
 PID.C:5297
 PID.C:5298
 PID.C:5299
 PID.C:5300
 PID.C:5301
 PID.C:5302
 PID.C:5303
 PID.C:5304
 PID.C:5305
 PID.C:5306
 PID.C:5307
 PID.C:5308
 PID.C:5309
 PID.C:5310
 PID.C:5311
 PID.C:5312
 PID.C:5313
 PID.C:5314
 PID.C:5315
 PID.C:5316
 PID.C:5317
 PID.C:5318
 PID.C:5319
 PID.C:5320
 PID.C:5321
 PID.C:5322
 PID.C:5323
 PID.C:5324
 PID.C:5325
 PID.C:5326
 PID.C:5327
 PID.C:5328
 PID.C:5329
 PID.C:5330
 PID.C:5331
 PID.C:5332
 PID.C:5333
 PID.C:5334
 PID.C:5335
 PID.C:5336
 PID.C:5337
 PID.C:5338
 PID.C:5339
 PID.C:5340
 PID.C:5341
 PID.C:5342
 PID.C:5343
 PID.C:5344
 PID.C:5345
 PID.C:5346
 PID.C:5347
 PID.C:5348
 PID.C:5349
 PID.C:5350
 PID.C:5351
 PID.C:5352
 PID.C:5353
 PID.C:5354
 PID.C:5355
 PID.C:5356
 PID.C:5357
 PID.C:5358
 PID.C:5359
 PID.C:5360
 PID.C:5361
 PID.C:5362
 PID.C:5363
 PID.C:5364
 PID.C:5365
 PID.C:5366
 PID.C:5367
 PID.C:5368
 PID.C:5369
 PID.C:5370
 PID.C:5371
 PID.C:5372
 PID.C:5373
 PID.C:5374
 PID.C:5375
 PID.C:5376
 PID.C:5377
 PID.C:5378
 PID.C:5379
 PID.C:5380
 PID.C:5381
 PID.C:5382
 PID.C:5383
 PID.C:5384
 PID.C:5385
 PID.C:5386
 PID.C:5387
 PID.C:5388
 PID.C:5389
 PID.C:5390
 PID.C:5391
 PID.C:5392
 PID.C:5393
 PID.C:5394
 PID.C:5395
 PID.C:5396
 PID.C:5397
 PID.C:5398
 PID.C:5399
 PID.C:5400
 PID.C:5401
 PID.C:5402
 PID.C:5403
 PID.C:5404
 PID.C:5405
 PID.C:5406
 PID.C:5407
 PID.C:5408
 PID.C:5409
 PID.C:5410
 PID.C:5411
 PID.C:5412
 PID.C:5413
 PID.C:5414
 PID.C:5415
 PID.C:5416
 PID.C:5417
 PID.C:5418
 PID.C:5419
 PID.C:5420
 PID.C:5421
 PID.C:5422
 PID.C:5423
 PID.C:5424
 PID.C:5425
 PID.C:5426
 PID.C:5427
 PID.C:5428
 PID.C:5429
 PID.C:5430
 PID.C:5431
 PID.C:5432
 PID.C:5433
 PID.C:5434
 PID.C:5435
 PID.C:5436
 PID.C:5437
 PID.C:5438
 PID.C:5439
 PID.C:5440
 PID.C:5441
 PID.C:5442
 PID.C:5443
 PID.C:5444
 PID.C:5445
 PID.C:5446
 PID.C:5447
 PID.C:5448
 PID.C:5449
 PID.C:5450
 PID.C:5451
 PID.C:5452
 PID.C:5453
 PID.C:5454
 PID.C:5455
 PID.C:5456
 PID.C:5457
 PID.C:5458
 PID.C:5459
 PID.C:5460
 PID.C:5461
 PID.C:5462
 PID.C:5463
 PID.C:5464
 PID.C:5465
 PID.C:5466
 PID.C:5467
 PID.C:5468
 PID.C:5469
 PID.C:5470
 PID.C:5471
 PID.C:5472
 PID.C:5473
 PID.C:5474
 PID.C:5475
 PID.C:5476
 PID.C:5477
 PID.C:5478
 PID.C:5479
 PID.C:5480
 PID.C:5481
 PID.C:5482
 PID.C:5483
 PID.C:5484
 PID.C:5485
 PID.C:5486
 PID.C:5487
 PID.C:5488
 PID.C:5489
 PID.C:5490
 PID.C:5491
 PID.C:5492
 PID.C:5493
 PID.C:5494
 PID.C:5495
 PID.C:5496
 PID.C:5497
 PID.C:5498
 PID.C:5499
 PID.C:5500
 PID.C:5501
 PID.C:5502
 PID.C:5503
 PID.C:5504
 PID.C:5505
 PID.C:5506
 PID.C:5507
 PID.C:5508
 PID.C:5509
 PID.C:5510
 PID.C:5511
 PID.C:5512
 PID.C:5513
 PID.C:5514
 PID.C:5515
 PID.C:5516
 PID.C:5517
 PID.C:5518
 PID.C:5519
 PID.C:5520
 PID.C:5521
 PID.C:5522
 PID.C:5523
 PID.C:5524
 PID.C:5525
 PID.C:5526
 PID.C:5527
 PID.C:5528
 PID.C:5529
 PID.C:5530
 PID.C:5531
 PID.C:5532
 PID.C:5533
 PID.C:5534
 PID.C:5535
 PID.C:5536
 PID.C:5537
 PID.C:5538
 PID.C:5539
 PID.C:5540
 PID.C:5541
 PID.C:5542
 PID.C:5543
 PID.C:5544
 PID.C:5545
 PID.C:5546
 PID.C:5547
 PID.C:5548
 PID.C:5549
 PID.C:5550
 PID.C:5551
 PID.C:5552
 PID.C:5553
 PID.C:5554
 PID.C:5555
 PID.C:5556
 PID.C:5557
 PID.C:5558
 PID.C:5559
 PID.C:5560
 PID.C:5561
 PID.C:5562
 PID.C:5563
 PID.C:5564
 PID.C:5565
 PID.C:5566
 PID.C:5567
 PID.C:5568
 PID.C:5569
 PID.C:5570
 PID.C:5571
 PID.C:5572
 PID.C:5573
 PID.C:5574
 PID.C:5575
 PID.C:5576
 PID.C:5577
 PID.C:5578
 PID.C:5579
 PID.C:5580
 PID.C:5581
 PID.C:5582
 PID.C:5583
 PID.C:5584
 PID.C:5585
 PID.C:5586
 PID.C:5587
 PID.C:5588
 PID.C:5589
 PID.C:5590
 PID.C:5591
 PID.C:5592
 PID.C:5593
 PID.C:5594
 PID.C:5595
 PID.C:5596
 PID.C:5597
 PID.C:5598
 PID.C:5599
 PID.C:5600
 PID.C:5601
 PID.C:5602
 PID.C:5603
 PID.C:5604
 PID.C:5605
 PID.C:5606
 PID.C:5607
 PID.C:5608
 PID.C:5609
 PID.C:5610
 PID.C:5611
 PID.C:5612
 PID.C:5613
 PID.C:5614
 PID.C:5615
 PID.C:5616
 PID.C:5617
 PID.C:5618
 PID.C:5619
 PID.C:5620
 PID.C:5621
 PID.C:5622
 PID.C:5623
 PID.C:5624
 PID.C:5625
 PID.C:5626
 PID.C:5627
 PID.C:5628
 PID.C:5629
 PID.C:5630
 PID.C:5631
 PID.C:5632
 PID.C:5633
 PID.C:5634
 PID.C:5635
 PID.C:5636
 PID.C:5637
 PID.C:5638
 PID.C:5639
 PID.C:5640
 PID.C:5641
 PID.C:5642
 PID.C:5643
 PID.C:5644
 PID.C:5645
 PID.C:5646
 PID.C:5647
 PID.C:5648
 PID.C:5649
 PID.C:5650
 PID.C:5651
 PID.C:5652
 PID.C:5653
 PID.C:5654
 PID.C:5655
 PID.C:5656
 PID.C:5657
 PID.C:5658
 PID.C:5659
 PID.C:5660
 PID.C:5661
 PID.C:5662
 PID.C:5663
 PID.C:5664
 PID.C:5665
 PID.C:5666
 PID.C:5667
 PID.C:5668
 PID.C:5669
 PID.C:5670
 PID.C:5671
 PID.C:5672
 PID.C:5673
 PID.C:5674
 PID.C:5675
 PID.C:5676
 PID.C:5677
 PID.C:5678
 PID.C:5679
 PID.C:5680
 PID.C:5681
 PID.C:5682
 PID.C:5683
 PID.C:5684
 PID.C:5685
 PID.C:5686
 PID.C:5687
 PID.C:5688
 PID.C:5689
 PID.C:5690
 PID.C:5691
 PID.C:5692
 PID.C:5693
 PID.C:5694
 PID.C:5695
 PID.C:5696
 PID.C:5697
 PID.C:5698
 PID.C:5699
 PID.C:5700
 PID.C:5701
 PID.C:5702
 PID.C:5703
 PID.C:5704
 PID.C:5705
 PID.C:5706
 PID.C:5707
 PID.C:5708
 PID.C:5709
 PID.C:5710
 PID.C:5711
 PID.C:5712
 PID.C:5713
 PID.C:5714
 PID.C:5715
 PID.C:5716
 PID.C:5717
 PID.C:5718
 PID.C:5719
 PID.C:5720
 PID.C:5721
 PID.C:5722
 PID.C:5723
 PID.C:5724
 PID.C:5725
 PID.C:5726
 PID.C:5727
 PID.C:5728
 PID.C:5729
 PID.C:5730
 PID.C:5731
 PID.C:5732
 PID.C:5733
 PID.C:5734
 PID.C:5735
 PID.C:5736
 PID.C:5737
 PID.C:5738
 PID.C:5739
 PID.C:5740
 PID.C:5741
 PID.C:5742
 PID.C:5743
 PID.C:5744
 PID.C:5745
 PID.C:5746
 PID.C:5747
 PID.C:5748
 PID.C:5749
 PID.C:5750
 PID.C:5751
 PID.C:5752
 PID.C:5753
 PID.C:5754
 PID.C:5755
 PID.C:5756
 PID.C:5757
 PID.C:5758
 PID.C:5759
 PID.C:5760
 PID.C:5761
 PID.C:5762
 PID.C:5763
 PID.C:5764
 PID.C:5765
 PID.C:5766
 PID.C:5767
 PID.C:5768
 PID.C:5769
 PID.C:5770
 PID.C:5771
 PID.C:5772
 PID.C:5773
 PID.C:5774
 PID.C:5775
 PID.C:5776
 PID.C:5777
 PID.C:5778
 PID.C:5779
 PID.C:5780
 PID.C:5781
 PID.C:5782
 PID.C:5783
 PID.C:5784
 PID.C:5785
 PID.C:5786
 PID.C:5787
 PID.C:5788
 PID.C:5789
 PID.C:5790
 PID.C:5791
 PID.C:5792
 PID.C:5793
 PID.C:5794
 PID.C:5795
 PID.C:5796
 PID.C:5797
 PID.C:5798
 PID.C:5799
 PID.C:5800
 PID.C:5801
 PID.C:5802
 PID.C:5803
 PID.C:5804
 PID.C:5805
 PID.C:5806
 PID.C:5807
 PID.C:5808
 PID.C:5809
 PID.C:5810
 PID.C:5811
 PID.C:5812
 PID.C:5813
 PID.C:5814
 PID.C:5815
 PID.C:5816
 PID.C:5817
 PID.C:5818
 PID.C:5819
 PID.C:5820
 PID.C:5821
 PID.C:5822
 PID.C:5823
 PID.C:5824
 PID.C:5825
 PID.C:5826
 PID.C:5827
 PID.C:5828
 PID.C:5829
 PID.C:5830
 PID.C:5831
 PID.C:5832
 PID.C:5833
 PID.C:5834
 PID.C:5835
 PID.C:5836
 PID.C:5837
 PID.C:5838
 PID.C:5839
 PID.C:5840
 PID.C:5841
 PID.C:5842
 PID.C:5843
 PID.C:5844
 PID.C:5845
 PID.C:5846
 PID.C:5847
 PID.C:5848
 PID.C:5849
 PID.C:5850
 PID.C:5851
 PID.C:5852
 PID.C:5853
 PID.C:5854
 PID.C:5855
 PID.C:5856
 PID.C:5857
 PID.C:5858
 PID.C:5859
 PID.C:5860
 PID.C:5861
 PID.C:5862
 PID.C:5863
 PID.C:5864
 PID.C:5865
 PID.C:5866
 PID.C:5867
 PID.C:5868
 PID.C:5869
 PID.C:5870
 PID.C:5871
 PID.C:5872
 PID.C:5873
 PID.C:5874
 PID.C:5875
 PID.C:5876
 PID.C:5877
 PID.C:5878
 PID.C:5879
 PID.C:5880
 PID.C:5881
 PID.C:5882
 PID.C:5883
 PID.C:5884
 PID.C:5885
 PID.C:5886
 PID.C:5887
 PID.C:5888
 PID.C:5889
 PID.C:5890
 PID.C:5891
 PID.C:5892
 PID.C:5893
 PID.C:5894
 PID.C:5895
 PID.C:5896
 PID.C:5897
 PID.C:5898
 PID.C:5899
 PID.C:5900
 PID.C:5901
 PID.C:5902
 PID.C:5903
 PID.C:5904
 PID.C:5905
 PID.C:5906
 PID.C:5907
 PID.C:5908
 PID.C:5909
 PID.C:5910
 PID.C:5911
 PID.C:5912
 PID.C:5913
 PID.C:5914
 PID.C:5915
 PID.C:5916
 PID.C:5917
 PID.C:5918
 PID.C:5919
 PID.C:5920
 PID.C:5921
 PID.C:5922
 PID.C:5923
 PID.C:5924
 PID.C:5925
 PID.C:5926
 PID.C:5927
 PID.C:5928
 PID.C:5929
 PID.C:5930
 PID.C:5931
 PID.C:5932
 PID.C:5933
 PID.C:5934
 PID.C:5935
 PID.C:5936
 PID.C:5937
 PID.C:5938
 PID.C:5939
 PID.C:5940
 PID.C:5941
 PID.C:5942
 PID.C:5943
 PID.C:5944
 PID.C:5945
 PID.C:5946
 PID.C:5947
 PID.C:5948
 PID.C:5949
 PID.C:5950
 PID.C:5951
 PID.C:5952
 PID.C:5953
 PID.C:5954
 PID.C:5955
 PID.C:5956
 PID.C:5957
 PID.C:5958
 PID.C:5959
 PID.C:5960
 PID.C:5961
 PID.C:5962
 PID.C:5963
 PID.C:5964
 PID.C:5965
 PID.C:5966
 PID.C:5967
 PID.C:5968
 PID.C:5969
 PID.C:5970
 PID.C:5971
 PID.C:5972
 PID.C:5973
 PID.C:5974
 PID.C:5975
 PID.C:5976
 PID.C:5977
 PID.C:5978
 PID.C:5979
 PID.C:5980
 PID.C:5981
 PID.C:5982
 PID.C:5983
 PID.C:5984
 PID.C:5985
 PID.C:5986
 PID.C:5987
 PID.C:5988
 PID.C:5989
 PID.C:5990
 PID.C:5991
 PID.C:5992
 PID.C:5993
 PID.C:5994
 PID.C:5995
 PID.C:5996
 PID.C:5997
 PID.C:5998
 PID.C:5999
 PID.C:6000
 PID.C:6001
 PID.C:6002
 PID.C:6003
 PID.C:6004
 PID.C:6005
 PID.C:6006
 PID.C:6007
 PID.C:6008
 PID.C:6009
 PID.C:6010
 PID.C:6011
 PID.C:6012
 PID.C:6013
 PID.C:6014
 PID.C:6015
 PID.C:6016
 PID.C:6017
 PID.C:6018
 PID.C:6019
 PID.C:6020
 PID.C:6021
 PID.C:6022
 PID.C:6023
 PID.C:6024
 PID.C:6025
 PID.C:6026
 PID.C:6027
 PID.C:6028
 PID.C:6029
 PID.C:6030
 PID.C:6031
 PID.C:6032
 PID.C:6033
 PID.C:6034
 PID.C:6035
 PID.C:6036
 PID.C:6037
 PID.C:6038
 PID.C:6039
 PID.C:6040
 PID.C:6041
 PID.C:6042
 PID.C:6043
 PID.C:6044
 PID.C:6045
 PID.C:6046
 PID.C:6047
 PID.C:6048
 PID.C:6049
 PID.C:6050
 PID.C:6051
 PID.C:6052
 PID.C:6053
 PID.C:6054
 PID.C:6055
 PID.C:6056
 PID.C:6057
 PID.C:6058
 PID.C:6059
 PID.C:6060
 PID.C:6061
 PID.C:6062
 PID.C:6063
 PID.C:6064
 PID.C:6065
 PID.C:6066
 PID.C:6067
 PID.C:6068
 PID.C:6069
 PID.C:6070
 PID.C:6071
 PID.C:6072
 PID.C:6073
 PID.C:6074
 PID.C:6075
 PID.C:6076
 PID.C:6077
 PID.C:6078
 PID.C:6079
 PID.C:6080
 PID.C:6081
 PID.C:6082
 PID.C:6083
 PID.C:6084
 PID.C:6085
 PID.C:6086
 PID.C:6087
 PID.C:6088
 PID.C:6089
 PID.C:6090
 PID.C:6091
 PID.C:6092
 PID.C:6093
 PID.C:6094
 PID.C:6095
 PID.C:6096
 PID.C:6097
 PID.C:6098
 PID.C:6099
 PID.C:6100
 PID.C:6101
 PID.C:6102
 PID.C:6103
 PID.C:6104
 PID.C:6105
 PID.C:6106
 PID.C:6107
 PID.C:6108
 PID.C:6109
 PID.C:6110
 PID.C:6111
 PID.C:6112
 PID.C:6113
 PID.C:6114
 PID.C:6115
 PID.C:6116
 PID.C:6117
 PID.C:6118
 PID.C:6119
 PID.C:6120
 PID.C:6121
 PID.C:6122
 PID.C:6123
 PID.C:6124
 PID.C:6125
 PID.C:6126
 PID.C:6127
 PID.C:6128
 PID.C:6129
 PID.C:6130
 PID.C:6131
 PID.C:6132
 PID.C:6133
 PID.C:6134
 PID.C:6135
 PID.C:6136
 PID.C:6137
 PID.C:6138
 PID.C:6139
 PID.C:6140
 PID.C:6141
 PID.C:6142
 PID.C:6143
 PID.C:6144
 PID.C:6145
 PID.C:6146
 PID.C:6147
 PID.C:6148
 PID.C:6149
 PID.C:6150
 PID.C:6151
 PID.C:6152
 PID.C:6153
 PID.C:6154
 PID.C:6155
 PID.C:6156
 PID.C:6157
 PID.C:6158
 PID.C:6159
 PID.C:6160
 PID.C:6161
 PID.C:6162
 PID.C:6163
 PID.C:6164
 PID.C:6165
 PID.C:6166
 PID.C:6167
 PID.C:6168
 PID.C:6169
 PID.C:6170
 PID.C:6171
 PID.C:6172
 PID.C:6173
 PID.C:6174
 PID.C:6175
 PID.C:6176
 PID.C:6177
 PID.C:6178
 PID.C:6179
 PID.C:6180
 PID.C:6181
 PID.C:6182
 PID.C:6183
 PID.C:6184
 PID.C:6185
 PID.C:6186
 PID.C:6187
 PID.C:6188
 PID.C:6189
 PID.C:6190
 PID.C:6191
 PID.C:6192
 PID.C:6193
 PID.C:6194
 PID.C:6195
 PID.C:6196
 PID.C:6197
 PID.C:6198
 PID.C:6199
 PID.C:6200
 PID.C:6201
 PID.C:6202
 PID.C:6203
 PID.C:6204
 PID.C:6205
 PID.C:6206
 PID.C:6207
 PID.C:6208
 PID.C:6209
 PID.C:6210
 PID.C:6211
 PID.C:6212
 PID.C:6213
 PID.C:6214
 PID.C:6215
 PID.C:6216
 PID.C:6217
 PID.C:6218
 PID.C:6219
 PID.C:6220
 PID.C:6221
 PID.C:6222
 PID.C:6223
 PID.C:6224
 PID.C:6225
 PID.C:6226
 PID.C:6227
 PID.C:6228
 PID.C:6229
 PID.C:6230
 PID.C:6231
 PID.C:6232
 PID.C:6233
 PID.C:6234
 PID.C:6235
 PID.C:6236
 PID.C:6237
 PID.C:6238
 PID.C:6239
 PID.C:6240
 PID.C:6241
 PID.C:6242
 PID.C:6243
 PID.C:6244
 PID.C:6245
 PID.C:6246
 PID.C:6247
 PID.C:6248
 PID.C:6249
 PID.C:6250
 PID.C:6251
 PID.C:6252
 PID.C:6253
 PID.C:6254