ROOT logo
#include "TH1D.h"
#include "TH2D.h"
#include "TCanvas.h"
#include "TFile.h"
#include "TGraphAsymmErrors.h"
#include "TLegend.h"

#include "AliCFContainer.h"
#include "AliCFEffGrid.h"
#include "AliCFDataGrid.h"
#include "AliPID.h"

#include <iostream>

#include "THnSparseDefinitions.h"

enum type { kTrackPt = 0, kZ = 1, kXi = 2, kNtypes = 3 };


const Int_t nPtBinsType2 = 44;
const Double_t binsPtType2[nPtBinsType2+1] = {0., 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45,
          0.5, 0.55, 0.6, 0.65, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4,
          1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.4, 3.8,
          4.5, 5.5, 6.5, 8.0, 10.0, 12.0, 14.0, 16.0, 20.0, 24.0,
          28.0, 32.0, 36.0, 45.0, 50.0 };


//___________________________________________________________________
const Double_t* GetBins(Int_t type, Int_t& nBins)
{
  if (type == 2) {
    nBins = nPtBinsType2;
    
    return binsPtType2;
  }
  
  return 0x0;
}


//___________________________________________________________________
Double_t trackingPtGeantFlukaCorrectionPrMinus(Double_t pTmc)
{
  return (1. - 0.129758 * TMath::Exp(-pTmc * 0.679612));
}


//___________________________________________________________________
Double_t trackingPtGeantFlukaCorrectionKaMinus(Double_t pTmc)
{
  return TMath::Min((0.972865 + 0.0117093 * pTmc), 1.);
}


//___________________________________________________________________
Bool_t geantFlukaCorrection(AliCFContainer* data, Int_t genStepToDownscale)
{
  // Issue: GEANT/FLUKA correction factor is for MC_pT. 
  // Finally the effeciency should be DIVIDED by this correction factor.
  // To include resolution effects, it is therefore the best way to just
  // multiply the generated step with the correction factor.
  
  if (!data) {
    printf("No CFContainer for GEANT/FLUKA correction!\n");
    return kFALSE;
  }
  
  const Int_t iPt     = data->GetVar("P_{T} (GeV/c)");
  const Int_t iMCid   = data->GetVar("MC ID");
  const Int_t iCharge = data->GetVar("Charge (e_{0})");
  
  if (iPt < 0 || iMCid < 0 || iCharge < 0) {
    printf("Data axis for GEANT/FLUKA correction not found!\n");
    return kFALSE;
  }
  
  if (!data->GetGrid(genStepToDownscale)) {
    printf("Step for downscaling (GEANT/FLUKA) not found!\n");
    return kFALSE;
  }
  
  const Int_t nDim = data->GetNVar();
  Int_t coord[nDim];
  Double_t binCenterCoord[nDim];
  
  Long64_t nBinsGrid = data->GetGrid(genStepToDownscale)->GetGrid()->GetNbins();
  
  for (Long64_t iBin = 0; iBin < nBinsGrid; iBin++) {
    Double_t binContent = data->GetGrid(genStepToDownscale)->GetGrid()->GetBinContent(iBin, coord);
    Double_t binError  = data->GetGrid(genStepToDownscale)->GetGrid()->GetBinError(iBin);
    
    for (Int_t iDim = 0; iDim < nDim; iDim++) 
      binCenterCoord[iDim] = data->GetBinCenter(iDim, coord[iDim]);

    if (binCenterCoord[iCharge] < 0) {
      Double_t corrFactor = 1.;
      
      if (binCenterCoord[iMCid] - 0.5 == AliPID::kProton) 
        corrFactor = trackingPtGeantFlukaCorrectionPrMinus(binCenterCoord[iPt]);
      else if (binCenterCoord[iMCid] - 0.5 == AliPID::kKaon)
        corrFactor = trackingPtGeantFlukaCorrectionKaMinus(binCenterCoord[iPt]);
      else
        continue;
      
      data->GetGrid(genStepToDownscale)->GetGrid()->SetBinContent(iBin, binContent * corrFactor);
      data->GetGrid(genStepToDownscale)->GetGrid()->SetBinError(iBin, binError * corrFactor);
    }
  }
  
  return kTRUE;
}



//___________________________________________________________________
void setupHist(TH1* h, TString histName, TString histTitle, TString xAxisTitle, TString yAxisTitle, Int_t color)
{
  if (histName != "")
    h->SetName(histName.Data());
  h->SetTitle(histTitle.Data());
  
  if (xAxisTitle != "")
    h->GetXaxis()->SetTitle(xAxisTitle.Data());
  if (yAxisTitle != "")
    h->GetYaxis()->SetTitle(yAxisTitle.Data());
  
  h->SetMarkerStyle(24);
  h->SetLineColor(color);
  h->SetMarkerColor(color);
  
  h->SetStats(kFALSE);
}


//____________________________________________________________________________________________________________________
void undoJetNormalisationHist2D(TH2* hData, TH2* hNumJets, const Int_t lowerCentralityBinLimit, const Int_t upperCentralityBinLimit)
{
  // Undo normalisation to 1/numJets. NOTE: jetPt binning of hData and hNumJets assumed to be the same!
  
  if (!hData || !hNumJets)
    return;
  
  for (Int_t binJetPt = 0; binJetPt <= hData->GetNbinsY() + 1; binJetPt++) {
    const Double_t numJets = hNumJets->Integral(lowerCentralityBinLimit, upperCentralityBinLimit, binJetPt, binJetPt);
    Bool_t noJets = numJets < 1e-13;
    
    for (Int_t binObs = 0; binObs <= hData->GetNbinsX() + 1; binObs++) {
      if (noJets) 
        continue;

      hData->SetBinContent(binObs, binJetPt, hData->GetBinContent(binObs, binJetPt) * numJets);
      hData->SetBinError(binObs, binJetPt, hData->GetBinError(binObs, binJetPt) * numJets);
    }
  }
}


//___________________________________________________________________
void normaliseHist(TH1* h, Double_t scale = 1.0)
{
  if (h->GetSumw2N() <= 0)
    h->Sumw2();
  
  h->Scale(scale);
  
  for (Int_t i = 1; i <= h->GetNbinsX(); i++) {
    Double_t normFactor = h->GetBinWidth(i);
    h->SetBinContent(i, h->GetBinContent(i) / normFactor);
    h->SetBinError(i, h->GetBinError(i) / normFactor);
  }
}


//___________________________________________________________________
void multiplyHistsDifferentBinning(TH1* h1, const TH1* h2, Double_t c1, Double_t c2, Bool_t ignoreErrorOfSecondHist = kFALSE)
{
   Int_t nbinsx = h1->GetNbinsX();
   Int_t nbinsy = h1->GetNbinsY();
   Int_t nbinsz = h1->GetNbinsZ();
   
   if (h1->GetDimension() < 2)
     nbinsy -= 1;
   if (h1->GetDimension() < 3)
     nbinsz -= 1;
   
   if (h1->GetSumw2N() == 0)
     h1->Sumw2();
   
   Int_t bin, bin2, binx, biny, binz;
   Double_t b1,b2,w,d1,d2;
   d1 = c1*c1;
   d2 = c2*c2;
   
   // Loop over bins (including underflows/overflows)
   for (binz = 0; binz <= nbinsz + 1; binz++) {
      for (biny = 0; biny <= nbinsy + 1; biny++) {
         for (binx = 0; binx <= nbinsx + 1;binx++) {
            bin = binx + (nbinsx + 2) * (biny + (nbinsy + 2) * binz);
            bin2 = h2->FindFixBin(h1->GetXaxis()->GetBinCenter(binx), h1->GetYaxis()->GetBinCenter(biny),
                                  h1->GetZaxis()->GetBinCenter(binz));
            b1  = h1->GetBinContent(bin);
            b2  = h2->GetBinContent(bin2);
            w   = (c1*b1)*(c2*b2);
            h1->SetBinContent(bin, w);
            Double_t e1 = h1->GetBinError(bin);
            Double_t e2 = ignoreErrorOfSecondHist ? 0. : h2->GetBinError(bin2);
            h1->SetBinError(bin, TMath::Sqrt(d1*d2*(e1*e1*b2*b2 + e2*e2*b1*b1)));
         }
      }
   }
}


//___________________________________________________________________
void divideHistsDifferentBinning(TH1* h1, const TH1* h2, Double_t c1, Double_t c2, Bool_t ignoreErrorOfSecondHist = kFALSE)
{
   Int_t nbinsx = h1->GetNbinsX();
   Int_t nbinsy = h1->GetNbinsY();
   Int_t nbinsz = h1->GetNbinsZ();
   
   if (h1->GetDimension() < 2)
     nbinsy -= 1;
   if (h1->GetDimension() < 3)
     nbinsz -= 1;
   
   if (h1->GetSumw2N() == 0)
     h1->Sumw2();
   
   Int_t bin, bin2, binx, biny, binz;
   Double_t b1,b2,w,d1,d2;
   d1 = c1*c1;
   d2 = c2*c2;
   
   // Loop over bins (including underflows/overflows)
   for (binz = 0; binz <= nbinsz + 1; binz++) {
      for (biny = 0; biny <= nbinsy + 1; biny++) {
         for (binx = 0; binx <= nbinsx + 1;binx++) {
            bin = binx + (nbinsx + 2) * (biny + (nbinsy + 2) * binz);
            bin2 = h2->FindFixBin(h1->GetXaxis()->GetBinCenter(binx), h1->GetYaxis()->GetBinCenter(biny),
                                  h1->GetZaxis()->GetBinCenter(binz));
            b1  = h1->GetBinContent(bin);
            b2  = h2->GetBinContent(bin2);
            if (b2)
              w = (c1*b1)/(c2*b2);
            else 
              w = 0;
            h1->SetBinContent(bin, w);
            
            if (!b2) {
              h1->SetBinError(bin, 0);
              continue;
            }
            
            Double_t b22 = b2*b2*d2;
            Double_t e1 = h1->GetBinError(bin);
            Double_t e2 = ignoreErrorOfSecondHist ? 0. : h2->GetBinError(bin2);
            h1->SetBinError(bin, TMath::Sqrt(d1*d2*(e1*e1*b2*b2 + e2*e2*b1*b1)/(b22*b22)));
         }
      }
   }
}


//___________________________________________________________________
// Efficiency for inclusive spectra vs. pT (or also jets, but without using the generation)
// E.g. a 'calcEfficiency.C+("finalCuts/MC_pp/7TeV/LHC10f6a/corrected/finalisedSplines/analytical/efficiency_noClCut_preliminary/bhess_PID_Jets_Inclusive_PureGauss_efficiency.root", "finalCuts/pp/7TeV/LHC10e.pass2/corrected/finalisedSplines/finalMapsAndTail/Jets/noCutOn_ncl_or_liav/outputSystematicsTotal_SummedSystematicErrors__2013_10_21.root", kTRUE, kFALSE, 0, -2, -2, -1, -1, 8, 2)' -b -q
Int_t calcEfficiency(TString pathNameEfficiency, TString pathNameData, Bool_t correctGeantFluka, Bool_t scaleStrangeness,
                     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*/,
                     Double_t constantCorrectionAbovePtThreshold,
                     Int_t rebinEfficiency)
{
  TString pathData = pathNameData;
  pathData.Replace(pathData.Last('/'), pathData.Length(), "");
  
  TFile* fileEff = TFile::Open(pathNameEfficiency.Data());
  if (!fileEff) {
    printf("Failed to open efficiency file \"%s\"\n", pathNameEfficiency.Data());
    return -1;
  }
  
  AliCFContainer* data = (AliCFContainer*)(fileEff->Get("containerEff"));
  if (!data) {
    printf("Failed to load efficiency container!\n");
    return -1;
  }
  
  const Int_t iMCid   = data->GetVar("MC ID");
  const Int_t iPt     = data->GetVar("P_{T} (GeV/c)");
  const Int_t iEta    = data->GetVar("#eta");
  const Int_t iCharge = data->GetVar("Charge (e_{0})");
  const Int_t iMult   = data->GetVar("Centrality Percentile");
  const Int_t iJetPt  = data->GetVar("P_{T}^{jet} (GeV/c)");
  //const Int_t iZ      = data->GetVar("z = P_{T}^{track} / P_{T}^{jet}");
  //const Int_t iXi     = data->GetVar("#xi = ln(P_{T}^{jet} / P_{T}^{track})");
  
  TFile* fileData = TFile::Open(pathNameData.Data());
  if (!fileData) {
    printf("Failed to open data file \"%s\"\n", pathNameData.Data());
    return -1;
  }
  
  TH1D* hYield[AliPID::kSPECIES] = { 0x0, };
  TH1D* hYieldSysError[AliPID::kSPECIES] = { 0x0, };
  TGraphAsymmErrors* gYieldSysError[AliPID::kSPECIES] = { 0x0, };
  TH1D* hMCgenPrimYield[AliPID::kSPECIES] = { 0x0, };
  Int_t numMCgenPrimYieldHistsFound = 0;
  
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    TString speciesName = AliPID::ParticleName(species);
    TString firstLetter = speciesName(0);
    firstLetter.ToUpper();
    speciesName.Replace(0, 1, firstLetter.Data());
    TString histName = Form("hYield%ss", speciesName.Data());
    hYield[species] = (TH1D*)fileData->Get(histName.Data());
    if (!hYield[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    hYield[species]->SetFillStyle(0);
    
    TString graphName = Form("systematicErrorYields_%s", AliPID::ParticleName(species));
    gYieldSysError[species] = (TGraphAsymmErrors*)fileData->Get(graphName.Data());
    
    // In case of MC also retrieve the MC truth generated yields
    TString histNameMCgenYields = Form("hMCgenYieldsPrimSpecies_%s", AliPID::ParticleShortName(species));
    hMCgenPrimYield[species] = (TH1D*)fileData->Get(histNameMCgenYields.Data());
    if (hMCgenPrimYield[species])
      numMCgenPrimYieldHistsFound++;
  }
  
  if (numMCgenPrimYieldHistsFound > 0 && numMCgenPrimYieldHistsFound != AliPID::kSPECIES) {
    printf("Error: Unable to retrieve all MC generated prim yield histos! Got %d.\n", numMCgenPrimYieldHistsFound);
    return -1;
  }
  
  TCanvas* cFractions = (TCanvas*)fileData->Get("cFractionsWithTotalSystematicError");
  if (!cFractions)
    cFractions = (TCanvas*)fileData->Get("cFractions");
  
  
  // Convert graphs with systematic errors into histograms (assume symmetric error, which is currently true)
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    if (gYieldSysError[species]) {
      hYieldSysError[species] = new TH1D(*hYield[species]);
      hYieldSysError[species]->SetName(Form("%s_sysError", hYieldSysError[species]->GetName()));
      hYieldSysError[species]->SetFillStyle(0);
      
      for (Int_t binX = 1; binX <= hYieldSysError[species]->GetNbinsX(); binX++) {
        hYieldSysError[species]->SetBinContent(binX, gYieldSysError[species]->GetY()[binX - 1]);
        hYieldSysError[species]->SetBinError(binX, gYieldSysError[species]->GetErrorY(binX - 1));
      }
    }
  }
  
  // Take pT binning from pion yield (binning for all species the same) and create a new AliCFContainer with this new binning for pT
  TH1D hDummy(*hYield[AliPID::kPion]);
  hDummy.SetName("hDummy");
  TAxis* axis = 0x0;
  
  if (rebinEfficiency > 1) {
    Int_t nBinsNew = 0;
    const Double_t* newBins = GetBins(rebinEfficiency, nBinsNew);
    
    hDummy.SetBins(nBinsNew, newBins);
    
    axis = hDummy.GetXaxis();
  
    //axis = hDummy.Rebin(rebinEfficiency, "", 0)->GetXaxis();
  }
  else
    axis = hDummy.GetXaxis();

  const TArrayD* binsPtCurrent = axis->GetXbins();
  TArrayD* binsPtNew = new TArrayD(*binsPtCurrent);
  
  const Int_t nEffDims = data->GetNVar();
  Int_t nEffBins[nEffDims];
  
  for (Int_t iDim = 0; iDim < nEffDims; iDim++) {
    if (iDim == iPt)
      nEffBins[iDim] = axis->GetNbins();
    else 
      nEffBins[iDim] = data->GetNBins(iDim);
  }
  
  
  // Just make one large pT bin above some threshold, if desired
  if (binsPtNew->fN != 0 && constantCorrectionAbovePtThreshold > 0) {
    for (Int_t iBin = 0; iBin < nEffBins[iPt]; iBin++) {
      // Find the first bin edged really larger than the threshold.
      // If the bin edge before equals the threshold, just set the
      // current bin edge to the right end of the spectrum -> Done.
      // If the bin edge before is different, set the bin edge to the
      // threshold
      if (binsPtNew->fArray[iBin] > constantCorrectionAbovePtThreshold) {
        if (binsPtNew->fArray[iBin - 1] == constantCorrectionAbovePtThreshold) {
          binsPtNew->fArray[iBin] = binsPtNew->fArray[nEffBins[iPt]];
          nEffBins[iPt] = iBin;
          break;
        }
        else {
          binsPtNew->fArray[iBin] = constantCorrectionAbovePtThreshold;
        }
      }
    }
  }
  
  
  AliCFContainer *dataRebinned = new AliCFContainer(Form("%s_rebinned", data->GetName()), Form("%s (rebinned)", data->GetTitle()),
                                                    data->GetNStep(), nEffDims, nEffBins);
  
  for (Int_t iDim = 0; iDim < nEffDims; iDim++) {
    dataRebinned->SetVarTitle(iDim, data->GetVarTitle(iDim));
    
    if (iDim == iPt) {
      if (binsPtNew->fN == 0)
        dataRebinned->SetBinLimits(iDim, axis->GetXmin(), axis->GetXmax());
      else
        dataRebinned->SetBinLimits(iDim, binsPtNew->fArray);
    }
    else {
      dataRebinned->SetBinLimits(iDim, data->GetBinLimits(iDim));
    }
  }
  
  for (Int_t iStep = 0; iStep < data->GetNStep(); iStep++)
    dataRebinned->SetStepTitle(iStep, data->GetStepTitle(iStep));
  
  Int_t coord[nEffDims];
  Double_t binCenterCoord[nEffDims];
  
  // Fill content from old grid into the new grid with proper binning
  for (Int_t iStep = 0; iStep < data->GetNStep(); iStep++) {
    Long64_t nBinsGrid = data->GetGrid(iStep)->GetGrid()->GetNbins();
    
    for (Long64_t iBin = 0; iBin < nBinsGrid; iBin++) {
      Double_t binContent = data->GetGrid(iStep)->GetGrid()->GetBinContent(iBin, coord);
      Double_t binError2  = data->GetGrid(iStep)->GetGrid()->GetBinError2(iBin);
      
      for (Int_t iDim = 0; iDim < nEffDims; iDim++) {
        binCenterCoord[iDim] = data->GetBinCenter(iDim, coord[iDim]);
      }

      Long64_t iBinRebinned = dataRebinned->GetGrid(iStep)->GetGrid()->GetBin(binCenterCoord);
      dataRebinned->GetGrid(iStep)->GetGrid()->AddBinContent(iBinRebinned, binContent);
      dataRebinned->GetGrid(iStep)->GetGrid()->AddBinError2(iBinRebinned, binError2);
    }
  }
  
  
  // If desired, restrict centrality axis
  Int_t lowerCentralityBinLimit = -1;
  Int_t upperCentralityBinLimit = -2; // Integral(lowerCentBinLimit, uppCentBinLimit) will not be restricted if these values are kept
  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 = dataRebinned->GetAxis(iMult, 0)->FindBin(lowerCentrality + 0.001);
    upperCentralityBinLimit = dataRebinned->GetAxis(iMult, 0)->FindBin(upperCentrality - 0.001);
    
    // Check if the values look reasonable
    if (lowerCentralityBinLimit <= upperCentralityBinLimit && lowerCentralityBinLimit >= 1
        && upperCentralityBinLimit <= dataRebinned->GetAxis(iMult, 0)->GetNbins()) {
      actualLowerCentrality = dataRebinned->GetAxis(iMult, 0)->GetBinLowEdge(lowerCentralityBinLimit);
      actualUpperCentrality = dataRebinned->GetAxis(iMult, 0)->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;
    dataRebinned->SetRangeUser(iMult, lowerCentralityBinLimit, upperCentralityBinLimit, kTRUE);
  }
  else {
    std::cout << "All" << std::endl;
  }
  
  
  
  // 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 = dataRebinned->GetAxis(iJetPt, 0)->FindBin(lowerJetPt + 0.001);
    upperJetPtBinLimit = dataRebinned->GetAxis(iJetPt, 0)->FindBin(upperJetPt - 0.001);
    
    // Check if the values look reasonable
    if (lowerJetPtBinLimit <= upperJetPtBinLimit && lowerJetPtBinLimit >= 1 &&
        upperJetPtBinLimit <= dataRebinned->GetAxis(iJetPt, 0)->GetNbins()) {
      actualLowerJetPt = dataRebinned->GetAxis(iJetPt, 0)->GetBinLowEdge(lowerJetPtBinLimit);
      actualUpperJetPt = dataRebinned->GetAxis(iJetPt, 0)->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;
    dataRebinned->SetRangeUser(iJetPt, lowerJetPtBinLimit, upperJetPtBinLimit, kTRUE);
  }
  else {
    std::cout << "All" << std::endl;
  }
  
  // If desired, restrict charge axis
  std::cout << "Charge selection (efficiency): ";
  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);
  
  Int_t lowerChargeBinLimit = -1;
  Int_t upperChargeBinLimit = -2;
  Double_t actualLowerCharge = -999;
  Double_t actualUpperCharge = -999;
  
  if (restrictCharge) {
    // Add subtract a very small number to avoid problems with values right on the border between to bins
    if (chargeMode == kNegCharge) {
      lowerChargeBinLimit = dataRebinned->GetAxis(iCharge, 0)->FindBin(-1. + 0.001);
      upperChargeBinLimit = dataRebinned->GetAxis(iCharge, 0)->FindBin(0. - 0.001);
    }
    else if (chargeMode == kPosCharge) {
      lowerChargeBinLimit = dataRebinned->GetAxis(iCharge, 0)->FindBin(0. + 0.001);
      upperChargeBinLimit = dataRebinned->GetAxis(iCharge, 0)->FindBin(1. - 0.001);
    }
    
    // Check if the values look reasonable
    if (lowerChargeBinLimit <= upperChargeBinLimit && lowerChargeBinLimit >= 1
        && upperChargeBinLimit <= dataRebinned->GetAxis(iCharge, 0)->GetNbins()) {
      actualLowerCharge = dataRebinned->GetAxis(iCharge, 0)->GetBinLowEdge(lowerChargeBinLimit);
      actualUpperCharge = dataRebinned->GetAxis(iCharge, 0)->GetBinUpEdge(upperChargeBinLimit);
      
      std::cout << "Charge range (efficiency): " << actualLowerCharge << " - " << actualUpperCharge << std::endl;
    }
    else {
      std::cout << std::endl;
      std::cout << "Requested charge range (efficiency) out of limits or upper and lower limit are switched!" << std::endl;
      return -1;
    }
    
    dataRebinned->SetRangeUser(iCharge, lowerChargeBinLimit, upperChargeBinLimit, kTRUE);
    data->SetRangeUser(iCharge, lowerChargeBinLimit, upperChargeBinLimit, kTRUE);
  }
  
  std::cout << std::endl;
  
  
  // If jet axis is restricted (i.e. jet input), also need num jet histos for proper normalisation.
  // Load numJet histos from bhess_PID*.root file related to efficiency file.
  TH2D* hNjetsGen = 0x0;
  TH2D* hNjetsRec = 0x0;

  if (restrictJetPtAxis) {
    TString pathNameDataMC = pathNameEfficiency;
    pathNameDataMC.ReplaceAll("_efficiency", "");
    
    TFile* fDataMC = TFile::Open(pathNameDataMC.Data());
    if (!fDataMC)  {
      std::cout << std::endl;
      std::cout << "Failed to open file \"" << pathNameData.Data() << "\" to obtain num of rec/gen jets!" << std::endl;
      
      return -1;
    }
    
    TString listName = pathNameDataMC;
    listName.Replace(0, listName.Last('/') + 1, "");
    listName.ReplaceAll(".root", "");
      
    TObjArray* histList = (TObjArray*)(fDataMC->Get(listName.Data()));
    if (!histList) {
      std::cout << std::endl;
      std::cout << "Failed to load list \"" << listName.Data() << "\" to obtain num of rec/gen jets!" << std::endl;
      return -1;
    }
    
    hNjetsGen = (TH2D*)histList->FindObject("fh2FFJetPtGen");
    hNjetsRec = (TH2D*)histList->FindObject("fh2FFJetPtRec");
    
    if (!hNjetsRec || !hNjetsGen) {
      std::cout << "Failed to load number of jets histos!" << std::endl;
      
      
      // For backward compatibility (TODO REMOVE IN FUTURE): Load info from fixed AnalysisResults file (might be wrong, if other
      // period is considered; also: No multiplicity information)
      TString pathEfficiency = pathNameEfficiency;
      pathEfficiency.Replace(pathEfficiency.Last('/'), pathEfficiency.Length(), "");
      TString pathBackward = Form("%s/AnalysisResults.root", pathEfficiency.Data());
      TFile* fBackward = TFile::Open(pathBackward.Data());
      
      TString dirDataInFile = "";
      TDirectory* dirData = fBackward ? (TDirectory*)fBackward->Get(fBackward->GetListOfKeys()->At(0)->GetName()) : 0x0;
    
      TList* list = dirData ? (TList*)dirData->Get(dirData->GetListOfKeys()->At(0)->GetName()) : 0x0;

      TH1D* hFFJetPtRec = list ? (TH1D*)list->FindObject("fh1FFJetPtRecCuts") : 0x0;
      TH1D* hFFJetPtGen = list ? (TH1D*)list->FindObject("fh1FFJetPtGen") : 0x0;
      
      if (hFFJetPtRec && hFFJetPtGen) {
        printf("***WARNING: For backward compatibility, using file \"%s\" to get number of jets. BUT: Might be wrong period and has no mult info!***\n",
          pathBackward.Data());
        
        hNjetsRec = new TH2D("fh2FFJetPtRec", "", 1, -1, 1, dataRebinned->GetAxis(iJetPt, 0)->GetNbins(),
                            dataRebinned->GetAxis(iJetPt, 0)->GetXbins()->GetArray());
        
        for (Int_t iJet = 1; iJet <= hNjetsRec->GetNbinsY(); iJet++) {
          Int_t lowerBin = hFFJetPtRec->FindBin(hNjetsRec->GetYaxis()->GetBinLowEdge(iJet) + 1e-3);
          Int_t upperBin = hFFJetPtRec->FindBin(hNjetsRec->GetYaxis()->GetBinUpEdge(iJet) - 1e-3);
          hNjetsRec->SetBinContent(1, iJet, hFFJetPtRec->Integral(lowerBin, upperBin));
        }
        
        hNjetsGen = new TH2D("fh2FFJetPtGen", "", 1, -1, 1,  dataRebinned->GetAxis(iJetPt, 0)->GetNbins(),
                            dataRebinned->GetAxis(iJetPt, 0)->GetXbins()->GetArray());
        
        for (Int_t iJet = 1; iJet <= hNjetsGen->GetNbinsY(); iJet++) {
          Int_t lowerBin = hFFJetPtGen->FindBin(hNjetsGen->GetYaxis()->GetBinLowEdge(iJet) + 1e-3);
          Int_t upperBin = hFFJetPtGen->FindBin(hNjetsGen->GetYaxis()->GetBinUpEdge(iJet) - 1e-3);
          hNjetsGen->SetBinContent(1, iJet, hFFJetPtGen->Integral(lowerBin, upperBin));
        }
      }
      
      if (!hNjetsRec || ! hNjetsGen)
        return -1;
    }
  }

  // For normalisation to number of jets
  // NOTE: These numbers are for the efficiency only! The data will be normalised to its own number!!!
  const Double_t nJetsGen = hNjetsGen ? hNjetsGen->Integral(lowerCentralityBinLimit, upperCentralityBinLimit, lowerJetPtBinLimit,
                                                            upperJetPtBinLimit) : 1.;
  const Double_t nJetsRec = hNjetsRec ? hNjetsRec->Integral(lowerCentralityBinLimit, upperCentralityBinLimit, lowerJetPtBinLimit,
                                                            upperJetPtBinLimit) : 1.;
  
  // Secondary correction
  AliCFEffGrid* sec = new AliCFEffGrid("sec", "Secondary Contamination", *dataRebinned);
  AliCFEffGrid* secStrangeScale = new AliCFEffGrid("secStrangeScale", "Secondary Contamination with Strangeness Scaling",
                                                   *dataRebinned);
  
  // Either one can take kStepRecWithGenCutsMeasuredObs or, what I prefer, one can take
  // kStepRecWithRecCutsMeasuredObsPrimaries => The difference is only the eta cut, which is on the rec level
  // in the latter case, i.e. one corrects for eta resolution (although the effect should be very small)
  // => TESTED: There is NO difference (only 1 bin vs. pt shows a deviation by one entry), so this cut has,
  // in principle, more or less no effect
  
  // For testing with data set w/o strangeness secStrangeScale->CalculateEfficiency(kStepRecWithRecCutsMeasuredObsPrimaries, kStepRecWithRecCutsMeasuredObs);
  secStrangeScale->CalculateEfficiency(kStepRecWithRecCutsMeasuredObsPrimaries, kStepRecWithRecCutsMeasuredObsStrangenessScaled);
  sec->CalculateEfficiency(kStepRecWithRecCutsMeasuredObsPrimaries, kStepRecWithRecCutsMeasuredObs);
  
  // QA plots for secondaries
  TCanvas* cSec = new TCanvas("cSec", "Secondary Contamination", 100, 10, 1200, 800);
  cSec->Divide(2, 1);
  cSec->GetPad(1)->SetLogx(kTRUE);
  cSec->cd(1);
  TH1* hSecPt = sec->Project(iPt); 
  hSecPt->SetName("hSecPt");
  hSecPt->SetStats(kFALSE);
  hSecPt->GetXaxis()->SetRangeUser(0.15, 50.);
  hSecPt->GetXaxis()->SetMoreLogLabels(kTRUE);
  hSecPt->GetXaxis()->SetNoExponent(kTRUE);
  hSecPt->GetYaxis()->SetTitle("Primary Fraction");
  hSecPt->Draw("E1");
  cSec->cd(2);
  TH1* hEtaSec = sec->Project(iEta);
  hEtaSec->SetName("hEtaSec");
  hEtaSec->SetStats(kFALSE);
  hEtaSec->GetYaxis()->SetTitle("Primary Fraction");
  hEtaSec->Draw("E1");
  TH2D* hSecID2Pt = (TH2D*)sec->Project(iPt, iMCid);
  hSecID2Pt->SetName("hSecID2Pt");
  
  // Get the secondary contamination vs. pT for each species
  TH1D* hSec[AliPID::kSPECIES];
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    hSec[species] = hSecID2Pt->ProjectionX(Form("hSec_%s", AliPID::ParticleShortName(species)), species + 1, species + 1, "e");
    hSec[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
    hSec[species]->SetLineColor(hYield[species]->GetLineColor());
    hSec[species]->SetMarkerColor(hYield[species]->GetLineColor());
    hSec[species]->SetLineWidth(2.);
    hSec[species]->GetXaxis()->SetRangeUser(0.15, 50);
    hSec[species]->GetYaxis()->SetRangeUser(0., 1.01);
    hSec[species]->GetXaxis()->SetMoreLogLabels(kTRUE);
    hSec[species]->GetXaxis()->SetNoExponent(kTRUE);
    hSec[species]->SetStats(kFALSE);
    hSec[species]->GetYaxis()->SetTitle("Primary Fraction");
  }
  
  TCanvas* cSec2 = new TCanvas("cSec2", "Primary fraction for different species", 100, 10, 1200, 800);
  cSec2->SetGridx(1);
  cSec2->SetGridy(1);
  cSec2->SetLogx(1);
  
  hSec[0]->Draw("E1");
  
  for (Int_t i = 1; i < AliPID::kSPECIES; i++) {
    hSec[i]->Draw("E1 same");
  }
  cSec2->BuildLegend()->SetFillColor(kWhite);
  
  ClearTitleFromHistoInCanvas(cSec2);
  
  // QA plots for secondaries with strangeness scaling
  TCanvas* cSecSS = new TCanvas("cSecSS", "Secondary Contamination (strangeness scaled)", 100, 10, 1200, 800);
  cSecSS->Divide(2, 1);
  cSecSS->GetPad(1)->SetLogx(kTRUE);
  cSecSS->cd(1);
  TH1* hSecSSPt = secStrangeScale->Project(iPt); 
  hSecSSPt->SetName("hSecSSPt");
  hSecSSPt->SetStats(kFALSE);
  hSecSSPt->GetXaxis()->SetRangeUser(0.15, 50.);
  hSecSSPt->GetXaxis()->SetMoreLogLabels(kTRUE);
  hSecSSPt->GetXaxis()->SetNoExponent(kTRUE);
  hSecSSPt->GetYaxis()->SetTitle("Primary Fraction");
  hSecSSPt->Draw("E1");
  cSecSS->cd(2);
  TH1* hEtaSecSS = secStrangeScale->Project(iEta);
  hEtaSecSS->SetName("hEtaSecSS");
  hEtaSecSS->SetStats(kFALSE);
  hEtaSecSS->GetYaxis()->SetTitle("Primary Fraction");
  hEtaSecSS->Draw("E1");
  TH2D* hSecSSID2Pt = (TH2D*)secStrangeScale->Project(iPt, iMCid);
  hSecSSID2Pt->SetName("hSecSSID2Pt");
  
  // Get the secondary contamination vs. pT for each species
  TH1D* hSecSS[AliPID::kSPECIES];
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    hSecSS[species] = hSecSSID2Pt->ProjectionX(Form("hSecSS_%s", AliPID::ParticleShortName(species)), species + 1, species + 1, "e");
    hSecSS[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
    hSecSS[species]->SetLineColor(hYield[species]->GetLineColor());
    hSecSS[species]->SetMarkerColor(hYield[species]->GetLineColor());
    hSecSS[species]->SetLineWidth(2.);
    hSecSS[species]->GetXaxis()->SetRangeUser(0.15, 50);
    hSecSS[species]->GetYaxis()->SetRangeUser(0., 1.01);
    hSecSS[species]->GetXaxis()->SetMoreLogLabels(kTRUE);
    hSecSS[species]->GetXaxis()->SetNoExponent(kTRUE);
    hSecSS[species]->SetStats(kFALSE);
    hSecSS[species]->GetYaxis()->SetTitle("Primary Fraction");
  }
  
  TCanvas* cSecSS2 = new TCanvas("cSecSS2", "Primary fraction for different species (strangeness scaled)", 100, 10, 1200, 800);
  cSecSS2->SetGridx(1);
  cSecSS2->SetGridy(1);
  cSecSS2->SetLogx(1);
  
  hSecSS[0]->Draw("E1");
  
  for (Int_t i = 1; i < AliPID::kSPECIES; i++) {
    hSecSS[i]->Draw("E1 same");
  }
  cSecSS2->BuildLegend()->SetFillColor(kWhite);
  
  ClearTitleFromHistoInCanvas(cSecSS2);
  
  
  // Secondary correction for to-pi-ratios
  TH1D* hSecToPiRatio[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSecSSToPiRatio[AliPID::kSPECIES] = { 0x0, };
  
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    if (species == AliPID::kPion)
      continue; // Do not consider pion-to-pion ratio
      
    hSecToPiRatio[species] = new TH1D(*hSec[species]);
    hSecToPiRatio[species]->Reset();
    hSecToPiRatio[species]->SetName(Form("hSecSSToPionRatio_%s", AliPID::ParticleShortName(species)));
    hSecToPiRatio[species]->SetTitle(Form("%s/#pi", AliPID::ParticleLatexName(species)));
    hSecToPiRatio[species]->SetLineColor(getLineColorAliPID(species));
    hSecToPiRatio[species]->SetMarkerColor(getLineColorAliPID(species));
    hSecToPiRatio[species]->SetMarkerStyle(24);
    hSecToPiRatio[species]->SetLineWidth(2.);
    hSecToPiRatio[species]->SetStats(kFALSE);
    hSecToPiRatio[species]->GetYaxis()->SetTitle("Primary Fraction of Ratio");
    
    hSecSSToPiRatio[species] = new TH1D(*hSecToPiRatio[species]);
    hSecSSToPiRatio[species]->SetName(Form("hSecSSToPionRatio_%s", AliPID::ParticleShortName(species)));
    
    // Samples for different species are independent, so just divide correction factors
    hSecToPiRatio[species]->Divide(hSec[species], hSec[AliPID::kPion], 1., 1., ""); 
    hSecToPiRatio[species]->GetYaxis()->SetRangeUser(0., 1.1);
    
    hSecSSToPiRatio[species]->Divide(hSecSS[species], hSecSS[AliPID::kPion], 1., 1., ""); 
    hSecSSToPiRatio[species]->GetYaxis()->SetRangeUser(0., 1.1);
  }
  
  TCanvas* cSecToPiRatio = new TCanvas("cSecToPiRatio", "Primary fraction of to-#pi-ratio for different species", 100, 10, 1200, 800);
  cSecToPiRatio->SetGridx(1);
  cSecToPiRatio->SetGridy(1);
  cSecToPiRatio->SetLogx(1);
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (i == AliPID::kPion)
      continue;
    
    hSecToPiRatio[i]->Draw(Form("E1%s", i == 0 ? "" : " same"));
  }
  
  cSecToPiRatio->BuildLegend()->SetFillColor(kWhite);
  
  ClearTitleFromHistoInCanvas(cSecToPiRatio);
  
  
  
  TCanvas* cSecSSToPiRatio = new TCanvas("cSecSSToPiRatio",
                                         "Primary fraction of to-#pi-ratio for different species (strangeness scaled)",
                                         100, 10, 1200, 800);
  cSecSSToPiRatio->SetGridx(1);
  cSecSSToPiRatio->SetGridy(1);
  cSecSSToPiRatio->SetLogx(1);
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (i == AliPID::kPion)
      continue;
    
    hSecSSToPiRatio[i]->Draw(Form("E1%s", i == 0 ? "" : " same"));
  }
  
  cSecSSToPiRatio->BuildLegend()->SetFillColor(kWhite);
  
  ClearTitleFromHistoInCanvas(cSecSSToPiRatio);
  
  

  
  // If desired, apply the GEANT/FLUKA correction first
  // NOTE: This will change dataRebinned! If anything else should also be calculated, it must be done before.
  // Otherwise, the GEANT/FLUKA correction factor for the efficiency will also affect it!
  const Int_t genStepEff = kStepGenWithGenCuts;
  if (correctGeantFluka) {
    printf("Applying GEANT/FLUKA correction...\n");
    if (!geantFlukaCorrection(dataRebinned, genStepEff)) {
      printf("GEANT/FLUKA correction could not be applied!\n");
      return kFALSE;
    }
  }
  
  // Construct the efficiency grid from the data container 
  AliCFEffGrid* eff = new AliCFEffGrid("eff", "Efficiency x Acceptance x pT Resolution", *dataRebinned);
  
  // Either one can take kStepRecWithGenCutsMeasuredObs or, what I prefer, one can take
  // kStepRecWithRecCutsMeasuredObsPrimaries => The difference is only the eta cut, which is on the rec level
  // in the latter case, i.e. one corrects for eta resolution (although the effect should be very small)
  eff->CalculateEfficiency(kStepRecWithRecCutsMeasuredObsPrimaries, genStepEff);
  
  // If the jet axis is restricted (i.e. jet input), scale with the corresponding number of jets.
  // Note: Since this is supposed to be a real scaling, set the error of the scale factor to zero
  // (second element of factor array)
  if (restrictJetPtAxis) {
    Double_t factor_Numerator[2] = { nJetsRec > 0 ? 1. / nJetsRec : 0., 0.  };
    Double_t factor_Denominator[2] = { nJetsGen > 0 ? 1. / nJetsGen : 0., 0.  };
    eff->GetNum()->Scale(factor_Numerator);
    eff->GetDen()->Scale(factor_Denominator);
  }
  
  //The efficiency along pt and vertex, and 2-D projection
  TCanvas* cEff = new TCanvas("cEff", "Efficiency x Acceptance x pT Resolution", 100, 10, 1200, 800);
  cEff->Divide(2, 1);
  cEff->GetPad(1)->SetLogx(kTRUE);
  cEff->cd(1);
  TH1* hEffPt = eff->Project(iPt); //the efficiency vs pt
  hEffPt->SetStats(kFALSE);
  hEffPt->GetXaxis()->SetRangeUser(0.15, 50.);
  hEffPt->GetXaxis()->SetMoreLogLabels(kTRUE);
  hEffPt->GetXaxis()->SetNoExponent(kTRUE);
  hEffPt->GetYaxis()->SetTitle("Efficiency x Acceptance x pT Resolution");
  hEffPt->Draw("E1");
  cEff->cd(2);
  TH1* hEffEta = eff->Project(iEta); //the efficiency vs eta
  hEffEta->SetStats(kFALSE);
  hEffEta->GetYaxis()->SetTitle("Efficiency x Acceptance x pT Resolution");
  hEffEta->GetYaxis()->SetTitleSize(0.05);
  hEffEta->Draw("E1");
  TH2D* hEffID2Pt = (TH2D*)eff->Project(iPt, iMCid);

  // Get the efficiencies vs. pT for each species
  TH1D* hEfficiency[AliPID::kSPECIES];
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    hEfficiency[species] = hEffID2Pt->ProjectionX(Form("hEfficiency_%s", AliPID::ParticleShortName(species)), species + 1, species + 1, "e");
    hEfficiency[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
    hEfficiency[species]->SetLineColor(hYield[species]->GetLineColor());
    hEfficiency[species]->SetMarkerColor(hYield[species]->GetLineColor());
    hEfficiency[species]->SetLineWidth(2.);
    hEfficiency[species]->GetXaxis()->SetRangeUser(0.15, 50);
    hEfficiency[species]->GetYaxis()->SetRangeUser(0., 1.01);
    hEfficiency[species]->GetXaxis()->SetMoreLogLabels(kTRUE);
    hEfficiency[species]->GetXaxis()->SetNoExponent(kTRUE);
    hEfficiency[species]->SetStats(kFALSE);
    hEfficiency[species]->GetYaxis()->SetTitle("Efficiency x Acceptance x pT Resolution");
    hEfficiency[species]->GetYaxis()->SetTitleSize(0.05);
  }
  
  TCanvas* cEff2 = new TCanvas("cEff2", "Efficiency x Acceptance x pT Resolution for different species", 0, 300, 900, 900);
  cEff2->SetGridx(1);
  cEff2->SetGridy(1);
  cEff2->SetLogx(1);
  
  hEfficiency[0]->Draw("E1");
  
  for (Int_t i = 1; i < AliPID::kSPECIES; i++) {
    hEfficiency[i]->Draw("E1 same");
  }
  cEff2->BuildLegend()->SetFillColor(kWhite);
  
  ClearTitleFromHistoInCanvas(cEff2);
  
  
  
  
  // Efficiency correction for to-pi-ratios
  TH1D* hEfficiencyToPiRatio[AliPID::kSPECIES] = { 0x0, };
  
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    if (species == AliPID::kPion)
      continue; // Do not consider pion-to-pion ratio
      
    hEfficiencyToPiRatio[species] = new TH1D(*hEfficiency[species]);
    hEfficiencyToPiRatio[species]->Reset();
    hEfficiencyToPiRatio[species]->SetName(Form("hEfficiencyToPionRatio_%s", AliPID::ParticleShortName(species)));
    hEfficiencyToPiRatio[species]->SetTitle(Form("%s/#pi", AliPID::ParticleLatexName(species)));
    
    // Samples for different species are independent, so just divide correction factors
    hEfficiencyToPiRatio[species]->Divide(hEfficiency[species], hEfficiency[AliPID::kPion], 1., 1., ""); 
    hEfficiencyToPiRatio[species]->GetYaxis()->SetRangeUser(0., 2.0);
  }
  
  TCanvas* cEffToPiRatio = new TCanvas("cEffToPiRatio", "Efficiency x Acceptance x pT Resolution of to-#pi-ratio for different species",
                                       100, 10, 1200, 800);
  cEffToPiRatio->SetGridx(1);
  cEffToPiRatio->SetGridy(1);
  cEffToPiRatio->SetLogx(1);
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (i == AliPID::kPion)
      continue;
    
    hEfficiencyToPiRatio[i]->Draw(Form("E1%s", i == 0 ? "" : " same"));
  }
  
  cEffToPiRatio->BuildLegend()->SetFillColor(kWhite);
  
  ClearTitleFromHistoInCanvas(cEffToPiRatio);
  
  
  // Correct the yields with the efficiencies and primary fractions
  TH1D* hYieldCorrected[AliPID::kSPECIES] = { 0x0, };
  TH1D* hYieldCorrectedSysError[AliPID::kSPECIES] = { 0x0, };
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    hYieldCorrected[species] = new TH1D(*hYield[species]);
    hYieldCorrected[species]->SetName(Form("%s_corrected", hYield[species]->GetName()));
    hYieldCorrected[species]->SetTitle(Form("%s", hYield[species]->GetTitle()));
    //hYieldCorrected[species]->SetTitle(Form("%s, secondary and efficiency x acceptance x pT resolution corrected",
    //                                        hYield[species]->GetTitle()));
    
    // Correction factor histos can have different binning than data histos (constant factor above some threshold)
    // -> Need special functions to multiply and divide such histos
    multiplyHistsDifferentBinning(hYieldCorrected[species], scaleStrangeness ? hSecSS[species] : hSec[species], 1., 1.);
    divideHistsDifferentBinning(hYieldCorrected[species], hEfficiency[species], 1., 1.);

    if (hYieldSysError[species]) {
      hYieldCorrectedSysError[species] = new TH1D(*hYieldSysError[species]);
      hYieldCorrectedSysError[species]->SetName(Form("%s_corrected", hYieldSysError[species]->GetName()));
      hYieldCorrectedSysError[species]->SetTitle(Form("%s", hYieldSysError[species]->GetTitle()));
      
      multiplyHistsDifferentBinning(hYieldCorrectedSysError[species], scaleStrangeness ? hSecSS[species] : hSec[species], 1., 1.,
                                    kTRUE);
      divideHistsDifferentBinning(hYieldCorrectedSysError[species], hEfficiency[species], 1., 1., kTRUE);
    }
  }
  
  // Calculate the total corrected yield. The original total yield had no error (just the number of detected tracks in a pT bin),
  // but due to the correction there is some error for the total yield. Also the error of the fractions introduces uncertainties
  // for the yields of individual species
  TH1D* hYieldCorrectedTotal = new TH1D(*hYieldCorrected[0]);
  hYieldCorrectedTotal->SetLineColor(kBlack);
  hYieldCorrectedTotal->SetMarkerColor(kBlack);
  hYieldCorrectedTotal->SetName("hYieldCorrectedTotal");
  hYieldCorrectedTotal->SetTitle("Total");
  //hYieldCorrectedTotal->SetTitle("Total yield, secondary and efficiency x acceptance x pT resolution corrected");
  
  for (Int_t i = 1; i < AliPID::kSPECIES; i++)
    hYieldCorrectedTotal->Add(hYieldCorrected[i], 1.);
  
  // Calculate the corrected fractions
  TH1D* hFractionCorrected[AliPID::kSPECIES] = { 0x0, };
  TH1D* hFractionCorrectedSysError[AliPID::kSPECIES] = { 0x0, };
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    hFractionCorrected[species] = new TH1D(*hYield[species]);
    TString oldName = hYield[species]->GetName();
    TString newName = oldName.ReplaceAll("Yield", "Fraction");
    TString oldTitle = hYield[species]->GetTitle();
    TString newTitle = oldTitle.ReplaceAll("Yield", "Fraction");
    hFractionCorrected[species]->SetName(Form("%s_corrected", newName.Data()));
    hFractionCorrected[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
    hFractionCorrected[species]->GetYaxis()->SetTitle("Corrected Fraction");
    hFractionCorrected[species]->GetXaxis()->SetMoreLogLabels(kTRUE);
    hFractionCorrected[species]->GetXaxis()->SetNoExponent(kTRUE);

    // Binomial error as for efficiencies (numerator and denominator are statistically not independent) for correct error calculation
    // (numerator is a "selected" subset of the denominator). It doesn't matter that the error of the histos is not just "sqrt(content)"
    // because the error formula also works for weighted histograms (which means that the error can be more or less anything)
    hFractionCorrected[species]->Divide(hYieldCorrected[species], hYieldCorrectedTotal, 1., 1., "B"); 
    

    //  The systematic errors just need to be scaled in the same way as the fractions.
    // So, just take the ratio to the uncorrected fraction and scale the sys. error accordingly
    // or, in this case, just divide by the same total yield as for yield -> fractions
    if (hYieldCorrectedSysError[species]) {
      hFractionCorrectedSysError[species] = new TH1D(*hFractionCorrected[species]);
      hFractionCorrectedSysError[species]->SetName(Form("%s_sysError", hFractionCorrected[species]->GetName()));
      hFractionCorrectedSysError[species]->SetTitle(Form("%s (sys. error)", hFractionCorrected[species]->GetTitle()));
      
      for (Int_t binX = 1; binX <= hFractionCorrectedSysError[species]->GetNbinsX(); binX++) {
        const Double_t corrTotalYield = hYieldCorrectedTotal->GetBinContent(binX);
        const Double_t scaleFactor = corrTotalYield > 0 ? 1.0 / corrTotalYield : 1.;
        hFractionCorrectedSysError[species]->SetBinError(binX,   hYieldCorrectedSysError[species]->GetBinError(binX) * scaleFactor);
      }
    }
  }
  
  // If MC is available, calculate the generated fractions
  TH1D* hMCgenPrimYieldTotal = 0x0;
  TH1D* hMCgenPrimFraction[AliPID::kSPECIES];
  for (Int_t i = 0; i < AliPID::kSPECIES; i++)
    hMCgenPrimFraction[i] = 0x0;
  
  if (numMCgenPrimYieldHistsFound > 0) {
    hMCgenPrimYieldTotal = new TH1D(*hMCgenPrimYield[0]);
    hMCgenPrimYieldTotal->SetLineColor(kBlack);
    hMCgenPrimYieldTotal->SetMarkerColor(kBlack);
    hMCgenPrimYieldTotal->SetName("hMCgenPrimYieldTotal");
    hMCgenPrimYieldTotal->SetTitle("Total (MC truth)");
    //hMCgenPrimYieldTotal->SetTitle("Total generated primary yield (MC truth)");
    
    for (Int_t i = 1; i < AliPID::kSPECIES; i++)
      hMCgenPrimYieldTotal->Add(hMCgenPrimYield[i], 1.);
    
    // Calculate the MC fractions
    for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
      hMCgenPrimYield[species]->SetTitle(Form("%s (MC truth)", AliPID::ParticleLatexName(species)));
      
      hMCgenPrimFraction[species] = new TH1D(*hMCgenPrimYield[species]);
      TString oldName = hMCgenPrimYield[species]->GetName();
      TString newName = oldName.ReplaceAll("Yield", "Fraction");
      TString oldTitle = hMCgenPrimYield[species]->GetTitle();
      TString newTitle = oldTitle.ReplaceAll("yield", "fraction");
      hMCgenPrimFraction[species]->SetName(newName.Data());
      hMCgenPrimFraction[species]->SetTitle(newTitle.Data());

      // Binomial error as for efficiencies (numerator and denominator are statistically not independent) for correct error calculation
      // (numerator is a "selected" subset of the denominator).
      hMCgenPrimFraction[species]->Divide(hMCgenPrimFraction[species], hMCgenPrimYieldTotal, 1., 1., "B"); 
    }
  }
  
  TCanvas* cCorrData = new TCanvas("cCorrData", "Corrected data", 0, 300, 900, 900);
  cCorrData->Divide(2, 1);//, 0., 0.01);
  cCorrData->GetPad(1)->SetLogx(1);
  cCorrData->GetPad(1)->SetLogy(1);
  cCorrData->GetPad(2)->SetLogx(1);
  cCorrData->GetPad(2)->SetLogy(1);
  
  cCorrData->GetPad(1)->SetRightMargin(0.001);
  cCorrData->GetPad(2)->SetRightMargin(0.001);
  
  cCorrData->GetPad(1)->SetLeftMargin(0.2);
  cCorrData->GetPad(2)->SetLeftMargin(0.2);
  
  cCorrData->cd(1); // uncorrected
  hYield[AliPID::kPion]->GetYaxis()->SetTitleOffset(1.4);
  hYield[AliPID::kPion]->Draw("E1");
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hYieldSysError[i])
      hYieldSysError[i]->Draw("E2 same");
    
    if (i == AliPID::kPion) continue;
    hYield[i]->Draw("E1 same");
  }
  
  ClearTitleFromHistoInCanvas(cCorrData, 1);
  
  cCorrData->cd(2); // corrected
  hYieldCorrectedTotal->GetYaxis()->SetTitleOffset(1.4);
  hYieldCorrectedTotal->GetXaxis()->SetMoreLogLabels(kTRUE);
  hYieldCorrectedTotal->GetXaxis()->SetNoExponent(kTRUE);
  hYieldCorrectedTotal->GetYaxis()->SetRangeUser(hYieldCorrected[AliPID::kMuon]->GetBinContent(hYieldCorrected[AliPID::kMuon]->FindLastBinAbove(0.)) * 0.1,
                                                 hYieldCorrectedTotal->GetBinContent(hYieldCorrectedTotal->GetMaximumBin()) * 10.);
  
  if (hMCgenPrimYieldTotal) {
    hMCgenPrimYieldTotal->GetYaxis()->SetTitleOffset(1.4);
    hMCgenPrimYieldTotal->GetXaxis()->SetMoreLogLabels(kTRUE);
    hMCgenPrimYieldTotal->GetXaxis()->SetNoExponent(kTRUE);
    hMCgenPrimYieldTotal->GetXaxis()->SetTitle(hYieldCorrectedTotal->GetXaxis()->GetTitle());
    hMCgenPrimYieldTotal->GetYaxis()->SetRangeUser(hYieldCorrected[AliPID::kMuon]->GetBinContent(hYieldCorrected[AliPID::kMuon]->FindLastBinAbove(0.)) * 0.1,
                                                   hYieldCorrectedTotal->GetBinContent(hYieldCorrectedTotal->GetMaximumBin()) * 10.);
  }
  
  if (hMCgenPrimYieldTotal) {
    hMCgenPrimYieldTotal->Draw("E1");
    hYieldCorrectedTotal->Draw("E1 same");
  }
  else
    hYieldCorrectedTotal->Draw("E1");
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hMCgenPrimYield[i])
      hMCgenPrimYield[i]->Draw("E1 same");
    hYieldCorrected[i]->Draw("E1 same");
  }
  
  TLegend* legTemp = cCorrData->cd(2)->BuildLegend(0.25, 0.16, 0.65, 0.51);
  legTemp->SetNColumns(2);
  legTemp->SetFillColor(kWhite);
  
  // Do not include in legend
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hYieldCorrectedSysError[i])
      hYieldCorrectedSysError[i]->Draw("E2 same");
  }
  
  ClearTitleFromHistoInCanvas(cCorrData, 2);
  
  TCanvas* cCorrYieldsRatio = 0x0;
  
  TH1D* hYieldCorrectedRatioToMC[AliPID::kSPECIES];
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) 
    hYieldCorrectedRatioToMC[i] = 0x0;

  TH1D* hYieldCorrectedTotalRatioToMC = 0x0;
  
  if (numMCgenPrimYieldHistsFound > 0) {
    // Compare with MC truth
    for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
      hYieldCorrectedRatioToMC[species] = new TH1D(*hYieldCorrected[species]);
      hYieldCorrectedRatioToMC[species]->SetName(Form("hYieldCorrectedRatioToMC_%s", AliPID::ParticleShortName(species)));
      hYieldCorrectedRatioToMC[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
      hYieldCorrectedRatioToMC[species]->GetYaxis()->SetTitle("Corrected Yield: Fit / MC Truth");
      hYieldCorrectedRatioToMC[species]->Divide(hMCgenPrimYield[species]);
    }
    
    hYieldCorrectedTotalRatioToMC = new TH1D(*hYieldCorrectedTotal);
    hYieldCorrectedTotalRatioToMC->SetName("hYieldCorrectedTotalRatioToMC");
    hYieldCorrectedTotalRatioToMC->SetTitle("Total");
    hYieldCorrectedTotalRatioToMC->GetYaxis()->SetTitle("Corrected Yield: Fit / MC Truth");
    hYieldCorrectedTotalRatioToMC->Divide(hMCgenPrimYieldTotal);
    
    cCorrYieldsRatio = new TCanvas("cCorrYieldsRatio", "Corrected Yields Comparison to MC", 0, 300, 900, 900);
    cCorrYieldsRatio->SetGridx(1);
    cCorrYieldsRatio->SetGridy(1);
    cCorrYieldsRatio->SetLogx(1);
    
    hYieldCorrectedTotalRatioToMC->GetYaxis()->SetRangeUser(0.6, 1.6);
    hYieldCorrectedTotalRatioToMC->GetYaxis()->SetTitleOffset(0.85);
    hYieldCorrectedTotalRatioToMC->Draw("E1");
    
    for (Int_t species = 0; species < AliPID::kSPECIES; species++)
      hYieldCorrectedRatioToMC[species]->Draw("E1 same");
    
    cCorrYieldsRatio->BuildLegend()->SetFillColor(kWhite);
    
    ClearTitleFromHistoInCanvas(cCorrYieldsRatio);
  }
  
  
  if (cFractions)
    cFractions->Draw();
  
  TCanvas* cCorrFractions = new TCanvas("cCorrFractions", "Corrected particleFractions", 0, 300, 900, 900);
  cCorrFractions->SetLogx(1);
  hFractionCorrected[0]->GetYaxis()->SetRangeUser(0., 1.);
  hFractionCorrected[0]->Draw("E1");
  if (hMCgenPrimFraction[0])
    hMCgenPrimFraction[0]->Draw("E1 same");
  
  for (Int_t i = 1; i < AliPID::kSPECIES; i++) {
    hFractionCorrected[i]->Draw("E1 same");
    if (hMCgenPrimFraction[i])
      hMCgenPrimFraction[i]->Draw("E1 same");
  }
  
  cCorrFractions->BuildLegend()->SetFillColor(kWhite);
  
  // Do not include in legend!!
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hFractionCorrectedSysError[i])
      hFractionCorrectedSysError[i]->Draw("E2 same");
  }
  
  
  ClearTitleFromHistoInCanvas(cCorrFractions);
  
  // Save results to file
  TString chargeString = "";
  if (chargeMode == kPosCharge)
    chargeString = "_posCharge";
  else if (chargeMode == kNegCharge)
    chargeString = "_negCharge";
  
  TString saveFileName = pathNameData;
  saveFileName.ReplaceAll(Form("%s/", pathData.Data()), "");
  saveFileName.Prepend("output_EfficiencyCorrection_");
  saveFileName.ReplaceAll(".root", Form("%s.root", chargeString.Data()));
  
  TString saveFilePathName = Form("%s/%s", pathData.Data(), saveFileName.Data());
  TFile* saveFile = TFile::Open(saveFilePathName.Data(), "RECREATE");
  saveFile->cd();
  
  if (cSec)
    cSec->Write();
  
  if (cSecSS)
    cSecSS->Write();
  
  if (cSec2)
    cSec2->Write();
  
  if (cSecSS2)
    cSecSS2->Write();
  
  if (cSecToPiRatio)
    cSecToPiRatio->Write();
  
  if (cSecSSToPiRatio)
    cSecSSToPiRatio->Write();
  
  if (cEff)
    cEff->Write();
  
  if (cEff2)
    cEff2->Write();
  
  if (cEffToPiRatio)
    cEffToPiRatio->Write();
  
  if (cCorrData)
    cCorrData->Write();
  
  if (cCorrYieldsRatio)
    cCorrYieldsRatio->Write();
  
  if (cFractions)
    cFractions->Write();
  
  if (cCorrFractions)
    cCorrFractions->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSec[i])
      hSec[i]->Write();
    
    if (hSecSS[i])
      hSecSS[i]->Write();
  }
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSecToPiRatio[i])
      hSecToPiRatio[i]->Write();
    
    if (hSecSSToPiRatio[i])
      hSecSSToPiRatio[i]->Write();
  }
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hEfficiency[i])
      hEfficiency[i]->Write();
  }
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hEfficiencyToPiRatio[i])
      hEfficiencyToPiRatio[i]->Write();
  }
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hYield[i])
      hYield[i]->Write();
    
    if (hYieldSysError[i])
      hYieldSysError[i]->Write();
  }
  
  if (hYieldCorrectedTotal)
    hYieldCorrectedTotal->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hYieldCorrected[i])
      hYieldCorrected[i]->Write();
    
    if (hYieldCorrectedSysError[i])
      hYieldCorrectedSysError[i]->Write();
  }
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hMCgenPrimYield[i])
      hMCgenPrimYield[i]->Write();
  }
  
  if (hMCgenPrimYieldTotal)
      hMCgenPrimYieldTotal->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hYieldCorrectedRatioToMC[i])
      hYieldCorrectedRatioToMC[i]->Write();
  }
  
  if (hYieldCorrectedTotalRatioToMC)
      hYieldCorrectedTotalRatioToMC->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hFractionCorrected[i])
      hFractionCorrected[i]->Write();
    
    if (hFractionCorrectedSysError[i])
      hFractionCorrectedSysError[i]->Write();
  }
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hMCgenPrimFraction[i])
      hMCgenPrimFraction[i]->Write();
  }
  
  TNamed* settings = new TNamed(
      Form("Settings: Efficiency file \"%s\", Data file \"%s\", lowerCentrality %.3f, upperCentrality %.3f, lowerJetPt %.1f, upperJetPt %.1f, constantCorrectionAbovePtThreshold %.3f\n",
           pathNameEfficiency.Data(), pathNameData.Data(), lowerCentrality, upperCentrality, lowerJetPt,
           upperJetPt, constantCorrectionAbovePtThreshold), "");
  settings->Write();
  
  saveFile->Close();
  
  return 0;
}


//___________________________________________________________________
// Efficiency for jet spectra (pT, z and xi)
// E.g. a 'calcEfficiency.C+("finalCuts/MC_pp/7TeV/LHC11a1/corrected/allJetPtMergedWeighted/bhess_PID_Jets_PureGauss_efficiency.root", "finalCuts/pp/7TeV/LHC10e.pass2/corrected/finalisedSplines/finalMapsAndTail/Jets/noCutOn_ncl_or_liav/output_extractedFFs_bhess_PID_Jets_centrality_all_highN_rougherXi.root", kTRUE, kFALSE, 0, -2, -2, -2, -2, 40, 80, -100, -100, 2, 1, 2)' -b -q
Int_t calcEfficiency(TString pathNameEfficiency, TString pathNameData, Bool_t correctGeantFluka, Bool_t scaleStrangeness,
                     Int_t chargeMode /*kNegCharge = -1, kAllCharged = 0, kPosCharge = 1*/,
                     Double_t lowerCentralityData /*= -2*/, Double_t upperCentralityData /*= -2*/,
                     Double_t lowerCentrality /*= -2*/, Double_t upperCentrality /*= -2*/,
                     Double_t lowerJetPt /*= -1*/ , Double_t upperJetPt/* = -1*/,
                     Double_t constantCorrectionAbovePtThreshold,
                     Double_t constantCorrectionAboveXiThreshold,
                     Int_t rebinEfficiencyPt,
                     Int_t rebinEfficiencyZ,
                     Int_t rebinEfficiencyXi)
{
  TString titles[kNtypes];
  titles[kTrackPt] = "trackPt";
  titles[kZ] = "z";
  titles[kXi] = "xi";
  
  TString pathData = pathNameData;
  pathData.Replace(pathData.Last('/'), pathData.Length(), "");
  
  TFile* fileEff = TFile::Open(pathNameEfficiency.Data());
  if (!fileEff) {
    printf("Failed to open efficiency file \"%s\"\n", pathNameEfficiency.Data());
    return -1;
  }
  
  AliCFContainer* data = (AliCFContainer*)(fileEff->Get("containerEff"));
  if (!data) {
    printf("Failed to load efficiency container!\n");
    return -1;
  }
  
  const Int_t iMCid   = data->GetVar("MC ID");
  const Int_t iPt     = data->GetVar("P_{T} (GeV/c)");
  //const Int_t iEta    = data->GetVar("#eta");
  const Int_t iCharge = data->GetVar("Charge (e_{0})");
  const Int_t iMult   = data->GetVar("Centrality Percentile");
  const Int_t iJetPt  = data->GetVar("P_{T}^{jet} (GeV/c)");
  const Int_t iZ      = data->GetVar("z = P_{T}^{track} / P_{T}^{jet}");
  const Int_t iXi     = data->GetVar("#xi = ln(P_{T}^{jet} / P_{T}^{track})");
  
  TH2D* hNjetsGen = 0x0;
  TH2D* hNjetsRec = 0x0;
  
  TH2D* hNjetsGenData = 0x0;
  TH2D* hNjetsRecData = 0x0;
  
  TH1D* hYieldPt[AliPID::kSPECIES] = {0x0, };
  TH1D* hYieldPtSysError[AliPID::kSPECIES] = {0x0, };
  TH1D* hMCgenPrimYieldPt[AliPID::kSPECIES] = {0x0, };
  
  TH1D* hYieldZ[AliPID::kSPECIES] = {0x0, };
  TH1D* hYieldZSysError[AliPID::kSPECIES] = {0x0, };
  TH1D* hMCgenPrimYieldZ[AliPID::kSPECIES] = {0x0, };
  
  TH1D* hYieldXi[AliPID::kSPECIES] = {0x0, };
  TH1D* hYieldXiSysError[AliPID::kSPECIES] = {0x0, };
  TH1D* hMCgenPrimYieldXi[AliPID::kSPECIES] = {0x0, };
  
  
  TH2D* hTemp = 0x0;
  
  Int_t numMCgenPrimYieldHistsFound = 0;
  
  Int_t lowerJetPtBinYields = -1;
  Int_t upperJetPtBinYields = -1;
  
  Double_t actualLowerJetPtYields = -10;
  Double_t actualUpperJetPtYields = -10;
  
  TFile* fileData = TFile::Open(pathNameData.Data());
  if (!fileData) {
    printf("Failed to open data file \"%s\"\n", pathNameData.Data());
    return -1;
  }
  
  
  hNjetsGenData = (TH2D*)fileData->Get("fh2FFJetPtGen");
  
  hNjetsRecData = (TH2D*)fileData->Get("fh2FFJetPtRec");
  
  if (!hNjetsRecData) {
    printf("Failed to load numJet histo for data!\n");
    return -1;
  }
  
  const Bool_t restrictCentralityData = ((lowerCentralityData >= -1) && (upperCentralityData >= -1));
  // Integral(lowerCentBinLimitData, uppCentBinLimitData) will not be restricted if these values are kept
  const Int_t lowerCentralityBinLimitData = restrictCentralityData ? hNjetsRecData->GetXaxis()->FindBin(lowerCentralityData + 0.001) 
                                                                   : -1;
  const Int_t upperCentralityBinLimitData = restrictCentralityData ? hNjetsRecData->GetXaxis()->FindBin(upperCentralityData - 0.001) 
                                                                   : -2;
  
  // Integral(lowerJetBinLimitData, uppJetBinLimitData) will not be restricted if these values are kept
  const Int_t lowerJetPtBinLimitData = ((lowerJetPt >= 0) && (upperJetPt >= 0)) 
                                       ? hNjetsRecData->GetYaxis()->FindBin(lowerJetPt + 0.001) : -1;
  const Int_t upperJetPtBinLimitData  = ((lowerJetPt >= 0) && (upperJetPt >= 0)) 
                                       ? hNjetsRecData->GetYaxis()->FindBin(upperJetPt - 0.001) : -2;
  
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    TString histName = Form("hIDFFz_%s", AliPID::ParticleShortName(species));
    hTemp = (TH2D*)fileData->Get(histName.Data());
    
    if (hTemp && (lowerJetPtBinYields < 0 || upperJetPtBinYields < 0)) {
      // If the jetPt range is to be restricted
      if (lowerJetPt >= 0 && upperJetPt >= 0) {
        lowerJetPtBinYields = hTemp->GetYaxis()->FindBin(lowerJetPt + 0.001);
        upperJetPtBinYields = hTemp->GetYaxis()->FindBin(upperJetPt - 0.001);
        
        actualLowerJetPtYields = hTemp->GetYaxis()->GetBinLowEdge(lowerJetPtBinYields);
        actualUpperJetPtYields = hTemp->GetYaxis()->GetBinUpEdge(upperJetPtBinYields);
      }
      else {
        lowerJetPtBinYields = 0;
        upperJetPtBinYields = -1;
      }
    }
    
    if ((lowerJetPtBinYields < 0 || upperJetPtBinYields < 0) && (lowerJetPt >= 0 && upperJetPt >= 0)) {
      printf("Failed to determine jet pt bin limits!\n");
      return -1;
    }
    
    // NOTE: The yields have already been normalised to nJets in extractFFs. However, the binning in jetPt might be different now.
    // Thus, in order to get the correct result, the old normalisation (just the same binnnig as in the nJet histo) has to be 
    // undone and then it has to be normalised to the number of jets in the new binning again (see below).
    
    if (hTemp) {
      undoJetNormalisationHist2D(hTemp, hNjetsRecData, lowerCentralityBinLimitData, upperCentralityBinLimitData);
      hYieldZ[species] = hTemp->ProjectionX(histName.ReplaceAll("hIDFF", "hYieldIDFF").Data(), lowerJetPtBinYields, upperJetPtBinYields, 
                                            "e");
    }
      
    if (!hYieldZ[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    
    
    
    histName = Form("hIDFFxi_%s", AliPID::ParticleShortName(species));
    
    hTemp = (TH2D*)fileData->Get(histName.Data());
    
    if (hTemp) {
      undoJetNormalisationHist2D(hTemp, hNjetsRecData, lowerCentralityBinLimitData, upperCentralityBinLimitData);
      hYieldXi[species] = hTemp->ProjectionX(histName.ReplaceAll("hIDFF", "hYieldIDFF").Data(),
                                             lowerJetPtBinYields, upperJetPtBinYields, "e");
    }
    
    if (!hYieldXi[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    
    histName = Form("hIDFFtrackPt_%s", AliPID::ParticleShortName(species));
    
    hTemp = (TH2D*)fileData->Get(histName.Data());
    
    if (hTemp) {
      undoJetNormalisationHist2D(hTemp, hNjetsRecData, lowerCentralityBinLimitData, upperCentralityBinLimitData);
      hYieldPt[species] = hTemp->ProjectionX(histName.ReplaceAll("hIDFF", "hYieldIDFF").Data(), 
                                             lowerJetPtBinYields, upperJetPtBinYields, "e");
    }
    
    if (!hYieldPt[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    
    
    
    histName = Form("hIDFFz_%s_sysError", AliPID::ParticleShortName(species));
    
    hTemp = (TH2D*)fileData->Get(histName.Data());
    
    if (hTemp) {
      undoJetNormalisationHist2D(hTemp, hNjetsRecData, lowerCentralityBinLimitData, upperCentralityBinLimitData);
      hYieldZSysError[species] = hTemp->ProjectionX(histName.ReplaceAll("hIDFF", "hYieldIDFF").Data(), lowerJetPtBinYields, 
                                                    upperJetPtBinYields, "e");
    }
    
    if (!hYieldZSysError[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    
    histName = Form("hIDFFxi_%s_sysError", AliPID::ParticleShortName(species));
    
    hTemp = (TH2D*)fileData->Get(histName.Data());
    
    if (hTemp) {
      undoJetNormalisationHist2D(hTemp, hNjetsRecData, lowerCentralityBinLimitData, upperCentralityBinLimitData);
      hYieldXiSysError[species] = hTemp->ProjectionX(histName.ReplaceAll("hIDFF", "hYieldIDFF").Data(), lowerJetPtBinYields, 
                                                     upperJetPtBinYields, "e");
    }
    
    if (!hYieldXiSysError[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    
    histName = Form("hIDFFtrackPt_%s_sysError", AliPID::ParticleShortName(species));
    
    hTemp = (TH2D*)fileData->Get(histName.Data());
    
    if (hTemp) {
      undoJetNormalisationHist2D(hTemp, hNjetsRecData, lowerCentralityBinLimitData, upperCentralityBinLimitData);
      hYieldPtSysError[species] = hTemp->ProjectionX(histName.ReplaceAll("hIDFF", "hYieldIDFF").Data(), lowerJetPtBinYields, 
                                                     upperJetPtBinYields, "e");
    }
    
    if (!hYieldPtSysError[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    
    // In case of MC also retrieve the MC truth generated yields
    histName = Form("hMCgenYieldsPrimZ_%s", AliPID::ParticleShortName(species));
    
    hTemp = (TH2D*)fileData->Get(histName.Data());
    
    if (hTemp) {
      undoJetNormalisationHist2D(hTemp, hNjetsGenData, lowerCentralityBinLimitData, upperCentralityBinLimitData);
      hMCgenPrimYieldZ[species] = hTemp->ProjectionX(histName.ReplaceAll("hMCgen", "hYieldMCgen").Data(), lowerJetPtBinYields,
                                                     upperJetPtBinYields, "e");
    }
    
    
    histName = Form("hMCgenYieldsPrimXi_%s", AliPID::ParticleShortName(species));
    
    hTemp = (TH2D*)fileData->Get(histName.Data());
    
    if (hTemp) {
      undoJetNormalisationHist2D(hTemp, hNjetsGenData, lowerCentralityBinLimitData, upperCentralityBinLimitData);
      hMCgenPrimYieldXi[species] = hTemp->ProjectionX(histName.ReplaceAll("hMCgen", "hYieldMCgen").Data(), lowerJetPtBinYields,
                                                      upperJetPtBinYields, "e");
    }
    
    
    histName = Form("hMCgenYieldsPrimPt_%s", AliPID::ParticleShortName(species));
    
    hTemp = (TH2D*)fileData->Get(histName.Data());
    
    if (hTemp) {
      undoJetNormalisationHist2D(hTemp, hNjetsGenData, lowerCentralityBinLimitData, upperCentralityBinLimitData);
      hMCgenPrimYieldPt[species] = hTemp->ProjectionX(histName.ReplaceAll("hMCgen", "hYieldMCgen").Data(), lowerJetPtBinYields,
                                                      upperJetPtBinYields, "e");
    }
    
    if (hMCgenPrimYieldPt[species] && hMCgenPrimYieldZ[species] && hMCgenPrimYieldXi[species])
      numMCgenPrimYieldHistsFound++;
  }
  
  if (numMCgenPrimYieldHistsFound > 0 && numMCgenPrimYieldHistsFound != AliPID::kSPECIES) {
    printf("Error: Unable to retrieve all MC generated prim yield histos! Got %d.\n", numMCgenPrimYieldHistsFound);
    return -1;
  }
  
  
  /*OLD: Load from AnalysisResults.root
  
  File* fileData = TFile::Open(pathNameData.Data());
  if (!fileData) {
    printf("Failed to open data file \"%s\"\n", pathNameData.Data());
    return -1;
  }
  
  TString dirDataInFile = "";
  TDirectory* dirData = (TDirectory*)fileData->Get(fileData->GetListOfKeys()->At(0)->GetName());
  if (!dirData) {
    printf("No directory found inside data file \"%s\"\n", pathNameData.Data());
    return -1;
  }
  
  TList* list = (TList*)dirData->Get(dirData->GetListOfKeys()->At(0)->GetName());
  if (!list) {
    printf("No list found in directory \"%s\" inside data file \"%s\"\n",
           dirData->GetListOfKeys()->At(0)->GetName(),pathNameData.Data());
    return -1;
  }
  
  hNjetsGen = (TH1D*)list->FindObject("fh1FFJetPtGen");
  hNjetsRec = (TH1D*)list->FindObject("fh1FFJetPtRecCuts");
  
  if (!hNjetsRec) {
    printf("Failed to load number of jets (rec) histo!\n");
    return -1;
  }
  
  
  for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
    TString histName = Form("fh2FFZRecCuts_%s", AliPID::ParticleName(species));
    hTemp = (TH2D*)list->FindObject(histName.Data());
    
    if (hTemp && (lowerJetPtBinYields < 0 || upperJetPtBinYields < 0)) {
      // If the jetPt range is to be restricted
      if (lowerJetPt >= 0 && upperJetPt >= 0) {
        lowerJetPtBinYields = hTemp->GetXaxis()->FindBin(lowerJetPt + 0.001);
        upperJetPtBinYields = hTemp->GetXaxis()->FindBin(upperJetPt - 0.001);
        
        actualLowerJetPtYields = hTemp->GetXaxis()->GetBinLowEdge(lowerJetPtBinYields);
        actualUpperJetPtYields = hTemp->GetXaxis()->GetBinUpEdge(upperJetPtBinYields);
      }
      else {
        lowerJetPtBinYields = 0;
        upperJetPtBinYields = -1;
      }
    }
    
    if ((lowerJetPtBinYields < 0 || upperJetPtBinYields < 0) && (lowerJetPt >= 0 && upperJetPt >= 0)) {
      printf("Failed to determine jet pt bin limits!\n");
      return -1;
    }
    
    if (hTemp)
      hYieldZ[species] = hTemp->ProjectionY(histName.ReplaceAll("fh2", "fh").Data(), lowerJetPtBinYields, upperJetPtBinYields, "e");
      
    if (!hYieldZ[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    
    
    
    histName = Form("fh2FFXiRecCuts_%s", AliPID::ParticleName(species));
    
    hTemp = (TH2D*)list->FindObject(histName.Data());
    
    if (hTemp)
      hYieldXi[species] = hTemp->ProjectionY(histName.ReplaceAll("fh2", "fh").Data(), lowerJetPtBinYields, upperJetPtBinYields, "e");
    
    if (!hYieldXi[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    
    histName = Form("fh2FFTrackPtRecCuts_%s", AliPID::ParticleName(species));
    
    hTemp = (TH2D*)list->FindObject(histName.Data());
    
    if (hTemp)
      hYieldPt[species] = hTemp->ProjectionY(histName.ReplaceAll("fh2", "fh").Data(), lowerJetPtBinYields, upperJetPtBinYields, "e");
    
    if (!hYieldPt[species]) {
      printf("Failed to load hist \"%s\"\n", histName.Data());
      return -1;
    }
    
    // In case of MC also retrieve the MC truth generated yields
    histName = Form("fh2FFZGen_%s", AliPID::ParticleName(species));
    
    hTemp = (TH2D*)list->FindObject(histName.Data());
    if (hTemp)
      hMCgenPrimYieldZ[species] = hTemp->ProjectionY(histName.ReplaceAll("fh2", "fh").Data(), lowerJetPtBinYields, upperJetPtBinYields, 
                                                     "e");
    
    
    histName = Form("fh2FFXiGen_%s", AliPID::ParticleName(species));
    
    hTemp = (TH2D*)list->FindObject(histName.Data());
    if (hTemp)
      hMCgenPrimYieldXi[species] = hTemp->ProjectionY(histName.ReplaceAll("fh2", "fh").Data(), lowerJetPtBinYields, upperJetPtBinYields, 
                                                      "e");
    
    
    histName = Form("fh2FFTrackPtGen_%s", AliPID::ParticleName(species));
    
    hTemp = (TH2D*)list->FindObject(histName.Data());
    if (hTemp)
      hMCgenPrimYieldPt[species] = hTemp->ProjectionY(histName.ReplaceAll("fh2", "fh").Data(), lowerJetPtBinYields, upperJetPtBinYields, 
                                                      "e");
    
    if (hMCgenPrimYieldPt[species] && hMCgenPrimYieldZ[species] && hMCgenPrimYieldXi[species])
      numMCgenPrimYieldHistsFound++;
  }
  
  if (numMCgenPrimYieldHistsFound > 0 && numMCgenPrimYieldHistsFound != AliPID::kSPECIES) {
    printf("Error: Unable to retrieve all MC generated prim yield histos! Got %d.\n", numMCgenPrimYieldHistsFound);
    return -1;
  }
  
  
  const Double_t nJetsGen = hNjetsGen ? hNjetsGen->Integral(lowerJetPtBinYields, upperJetPtBinYields) : -1;
  const Double_t nJetsRec = hNjetsRec->Integral(lowerJetPtBinYields, upperJetPtBinYields);
  */
  
  // Take binning from pion yield (binning for all species the same) and create a new AliCFContainer with this new binning
  TH1D hDummyPt(*hYieldPt[AliPID::kPion]);
  hDummyPt.SetName("hDummyPt");
  TAxis* axisPt = 0x0;
  
  if (rebinEfficiencyPt > 1) {
    Int_t nBinsNew = 0;
    const Double_t* newBins = GetBins(rebinEfficiencyPt, nBinsNew);
    
    hDummyPt.SetBins(nBinsNew, newBins);
    
    axisPt = hDummyPt.GetXaxis();
  
    //axisPt = hDummyPt.Rebin(rebinEfficiencyPt, "", 0)->GetXaxis();
  }
  else
    axisPt = hDummyPt.GetXaxis();
  
  const TArrayD* binsPtCurrent = axisPt->GetXbins();
  TArrayD* binsPtNew = new TArrayD(*binsPtCurrent);
  
  TH1D hDummyZ(*hYieldZ[AliPID::kPion]);
  hDummyZ.SetName("hDummyZ");
  TAxis* axisZ = 0x0;
  
  if (rebinEfficiencyZ > 1)
    axisZ = hDummyZ.Rebin(rebinEfficiencyZ, "", 0)->GetXaxis();
  else
    axisZ = hDummyZ.GetXaxis();

  const TArrayD* binsZCurrent = axisZ->GetXbins();
  TArrayD* binsZNew = new TArrayD(*binsZCurrent);
  
  TH1D hDummyXi(*hYieldXi[AliPID::kPion]);
  hDummyXi.SetName("hDummyXi");
  TAxis* axisXi = 0x0;
  
  if (rebinEfficiencyXi > 1)
    axisXi = hDummyXi.Rebin(rebinEfficiencyXi, "", 0)->GetXaxis();
  else
    axisXi = hDummyXi.GetXaxis();

  const TArrayD* binsXiCurrent = axisXi->GetXbins();
  TArrayD* binsXiNew = new TArrayD(*binsXiCurrent);
  
  
  const Int_t nEffDims = data->GetNVar();
  Int_t nEffBins[nEffDims];
  
  for (Int_t iDim = 0; iDim < nEffDims; iDim++) {
    if (iDim == iPt)
      nEffBins[iDim] = axisPt->GetNbins();
    else if (iDim == iZ)
      nEffBins[iDim] = axisZ->GetNbins();
    else if (iDim == iXi)
      nEffBins[iDim] = axisXi->GetNbins();
    else 
      nEffBins[iDim] = data->GetNBins(iDim);
  }
  
 
  // Just make one large pT bin above some threshold, if desired
  if (binsPtNew->fN != 0 && constantCorrectionAbovePtThreshold > 0) {
    for (Int_t iBin = 0; iBin <= nEffBins[iPt] + 1; iBin++) {
      // Find the first bin edged really larger than the threshold.
      // If the bin edge before equals the threshold, just set the
      // current bin edge to the right end of the spectrum -> Done.
      // If the bin edge before is different, set the bin edge to the
      // threshold
      if (binsPtNew->fArray[iBin] > constantCorrectionAbovePtThreshold) {
        if (binsPtNew->fArray[iBin - 1] == constantCorrectionAbovePtThreshold) {
          binsPtNew->fArray[iBin] = binsPtNew->fArray[nEffBins[iPt]];
          nEffBins[iPt] = iBin;
          break;
        }
        else {
          binsPtNew->fArray[iBin] = constantCorrectionAbovePtThreshold;
        }
      }
    }
  }
  
  // Just make one large Xi bin above some threshold, if desired
  if (binsXiNew->fN != 0 && constantCorrectionAboveXiThreshold > 0) {
    for (Int_t iBin = 0; iBin <= nEffBins[iXi] + 1; iBin++) {
      // Find the first bin edged really larger than the threshold.
      // If the bin edge before equals the threshold, just set the
      // current bin edge to the right end of the spectrum -> Done.
      // If the bin edge before is different, set the bin edge to the
      // threshold
      if (binsXiNew->fArray[iBin] > constantCorrectionAboveXiThreshold) {
        if (binsXiNew->fArray[iBin - 1] == constantCorrectionAboveXiThreshold) {
          binsXiNew->fArray[iBin] = binsXiNew->fArray[nEffBins[iXi]];
          nEffBins[iXi] = iBin;
          break;
        }
        else {
          binsXiNew->fArray[iBin] = constantCorrectionAboveXiThreshold;
        }
      }
    }
  }
  
  AliCFContainer *dataRebinned = new AliCFContainer(Form("%s_rebinned", data->GetName()), Form("%s (rebinned)", data->GetTitle()),
                                                    data->GetNStep(), nEffDims, nEffBins);
  
  for (Int_t iDim = 0; iDim < nEffDims; iDim++) {
    dataRebinned->SetVarTitle(iDim, data->GetVarTitle(iDim));
    
    if (iDim == iPt) {
      if (binsPtNew->fN == 0)
        dataRebinned->SetBinLimits(iDim, axisPt->GetXmin(), axisPt->GetXmax());
      else
        dataRebinned->SetBinLimits(iDim, binsPtNew->fArray);
    }
    else if (iDim == iZ) {
      if (binsZNew->fN == 0)
        dataRebinned->SetBinLimits(iDim, axisZ->GetXmin(), axisZ->GetXmax());
      else
        dataRebinned->SetBinLimits(iDim, binsZNew->fArray);
    }
    else if (iDim == iXi) {
      if (binsXiNew->fN == 0)
        dataRebinned->SetBinLimits(iDim, axisXi->GetXmin(), axisXi->GetXmax());
      else
        dataRebinned->SetBinLimits(iDim, binsXiNew->fArray);
    }
    else {
      dataRebinned->SetBinLimits(iDim, data->GetBinLimits(iDim));
    }
  }
  
  for (Int_t iStep = 0; iStep < data->GetNStep(); iStep++)
    dataRebinned->SetStepTitle(iStep, data->GetStepTitle(iStep));
  
  Int_t coord[nEffDims];
  Double_t binCenterCoord[nEffDims];
  
  // Fill content from old grid into the new grid with proper binning
  for (Int_t iStep = 0; iStep < data->GetNStep(); iStep++) {
    Long64_t nBinsGrid = data->GetGrid(iStep)->GetGrid()->GetNbins();
    
    for (Long64_t iBin = 0; iBin <= nBinsGrid + 1; iBin++) {
      Double_t binContent = data->GetGrid(iStep)->GetGrid()->GetBinContent(iBin, coord);
      Double_t binError2  = data->GetGrid(iStep)->GetGrid()->GetBinError2(iBin);
      
      for (Int_t iDim = 0; iDim < nEffDims; iDim++) {
        binCenterCoord[iDim] = data->GetBinCenter(iDim, coord[iDim]);
      }

      Long64_t iBinRebinned = dataRebinned->GetGrid(iStep)->GetGrid()->GetBin(binCenterCoord);
      dataRebinned->GetGrid(iStep)->GetGrid()->AddBinContent(iBinRebinned, binContent);
      dataRebinned->GetGrid(iStep)->GetGrid()->AddBinError2(iBinRebinned, binError2);
    }
  }
  
  
  // If desired, restrict centrality axis
  Int_t lowerCentralityBinLimit = -1;
  Int_t upperCentralityBinLimit = -2; // Integral(lowerCentBinLimit, uppCentBinLimit) will not be restricted if these values are kept
  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 = dataRebinned->GetAxis(iMult, 0)->FindBin(lowerCentrality + 0.001);
    upperCentralityBinLimit = dataRebinned->GetAxis(iMult, 0)->FindBin(upperCentrality - 0.001);
    
    // Check if the values look reasonable
    if (lowerCentralityBinLimit <= upperCentralityBinLimit && lowerCentralityBinLimit >= 1
        && upperCentralityBinLimit <= dataRebinned->GetAxis(iMult, 0)->GetNbins()) {
      actualLowerCentrality = dataRebinned->GetAxis(iMult, 0)->GetBinLowEdge(lowerCentralityBinLimit);
      actualUpperCentrality = dataRebinned->GetAxis(iMult, 0)->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;
    dataRebinned->SetRangeUser(iMult, lowerCentralityBinLimit, upperCentralityBinLimit, kTRUE);
    data->SetRangeUser(iMult, lowerCentralityBinLimit, upperCentralityBinLimit, kTRUE);
  }
  else {
    std::cout << "All" << std::endl;
  }
  
  
  
  // If desired, restrict jetPt axis
  Int_t lowerJetPtBinLimit = -1;
  Int_t upperJetPtBinLimit = -2; // Integral(lowerJetBinLimit, uppJetBinLimit) will not be restricted if these values are kept
  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 = dataRebinned->GetAxis(iJetPt, 0)->FindBin(lowerJetPt + 0.001);
    upperJetPtBinLimit = dataRebinned->GetAxis(iJetPt, 0)->FindBin(upperJetPt - 0.001);
    
    // Check if the values look reasonable
    if (lowerJetPtBinLimit <= upperJetPtBinLimit && lowerJetPtBinLimit >= 1 &&
        upperJetPtBinLimit <= dataRebinned->GetAxis(iJetPt, 0)->GetNbins()) {
      actualLowerJetPt = dataRebinned->GetAxis(iJetPt, 0)->GetBinLowEdge(lowerJetPtBinLimit);
      actualUpperJetPt = dataRebinned->GetAxis(iJetPt, 0)->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;
    dataRebinned->SetRangeUser(iJetPt, lowerJetPtBinLimit, upperJetPtBinLimit, kTRUE);
    data->SetRangeUser(iJetPt, lowerJetPtBinLimit, upperJetPtBinLimit, kTRUE);
  }
  else {
    std::cout << "All" << std::endl;
  }
  
  if (restrictJetPtAxis && 
      (TMath::Abs(actualLowerJetPt - actualLowerJetPtYields) > 1e-3 || TMath::Abs(actualUpperJetPt - actualUpperJetPtYields) > 1e-3)) {
    std::cout << "ERROR: Disagreement between jetPt bounds of data and efficiency!" << std::endl;
    return -1;
  }
  
  // If desired, restrict charge axis
  std::cout << "Charge selection (efficiency): ";
  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);
  
  Int_t lowerChargeBinLimit = -1;
  Int_t upperChargeBinLimit = -2;
  Double_t actualLowerCharge = -999;
  Double_t actualUpperCharge = -999;
  
  if (restrictCharge) {
    // Add subtract a very small number to avoid problems with values right on the border between to bins
    if (chargeMode == kNegCharge) {
      lowerChargeBinLimit = dataRebinned->GetAxis(iCharge, 0)->FindBin(-1. + 0.001);
      upperChargeBinLimit = dataRebinned->GetAxis(iCharge, 0)->FindBin(0. - 0.001);
    }
    else if (chargeMode == kPosCharge) {
      lowerChargeBinLimit = dataRebinned->GetAxis(iCharge, 0)->FindBin(0. + 0.001);
      upperChargeBinLimit = dataRebinned->GetAxis(iCharge, 0)->FindBin(1. - 0.001);
    }
    
    // Check if the values look reasonable
    if (lowerChargeBinLimit <= upperChargeBinLimit && lowerChargeBinLimit >= 1
        && upperChargeBinLimit <= dataRebinned->GetAxis(iCharge, 0)->GetNbins()) {
      actualLowerCharge = dataRebinned->GetAxis(iCharge, 0)->GetBinLowEdge(lowerChargeBinLimit);
      actualUpperCharge = dataRebinned->GetAxis(iCharge, 0)->GetBinUpEdge(upperChargeBinLimit);
      
      std::cout << "Charge range (efficiency): " << actualLowerCharge << " - " << actualUpperCharge << std::endl;
    }
    else {
      std::cout << std::endl;
      std::cout << "Requested charge range (efficiency) out of limits or upper and lower limit are switched!" << std::endl;
      return -1;
    }
    
    dataRebinned->SetRangeUser(iCharge, lowerChargeBinLimit, upperChargeBinLimit, kTRUE);
    data->SetRangeUser(iCharge, lowerChargeBinLimit, upperChargeBinLimit, kTRUE);
  }
  
  std::cout << std::endl;
  
  
  // Load numJet histos from bhess_PID*.root file related to efficiency file.
  TString pathNameDataMC = pathNameEfficiency;
  pathNameDataMC.ReplaceAll("_efficiency", "");
  
  TFile* fDataMC = TFile::Open(pathNameDataMC.Data());
  if (!fDataMC)  {
    std::cout << std::endl;
    std::cout << "Failed to open file \"" << pathNameData.Data() << "\" to obtain num of rec/gen jets!" << std::endl;
    
    return -1;
  }
  
  TString listName = pathNameDataMC;
  listName.Replace(0, listName.Last('/') + 1, "");
  listName.ReplaceAll(".root", "");
    
  TObjArray* histList = (TObjArray*)(fDataMC->Get(listName.Data()));
  if (!histList) {
    std::cout << std::endl;
    std::cout << "Failed to load list \"" << listName.Data() << "\" to obtain num of rec/gen jets!" << std::endl;
    return -1;
  }
  
  hNjetsGen = (TH2D*)histList->FindObject("fh2FFJetPtGen");
  hNjetsRec = (TH2D*)histList->FindObject("fh2FFJetPtRec");
  
  if (!hNjetsRec || !hNjetsGen) {
    std::cout << "Failed to load number of jets histos!" << std::endl;
    
    
    // For backward compatibility (TODO REMOVE IN FUTURE): Load info from fixed AnalysisResults file (might be wrong, if other
    // period is considered; also: No multiplicity information)
    TString pathEfficiency = pathNameEfficiency;
    pathEfficiency.Replace(pathEfficiency.Last('/'), pathEfficiency.Length(), "");
    TString pathBackward = Form("%s/AnalysisResults.root", pathEfficiency.Data());
    TFile* fBackward = TFile::Open(pathBackward.Data());
    
    TString dirDataInFile = "";
    TDirectory* dirData = fBackward ? (TDirectory*)fBackward->Get(fBackward->GetListOfKeys()->At(0)->GetName()) : 0x0;
  
    TList* list = dirData ? (TList*)dirData->Get(dirData->GetListOfKeys()->At(0)->GetName()) : 0x0;

    TH1D* hFFJetPtRec = list ? (TH1D*)list->FindObject("fh1FFJetPtRecCutsInc") : 0x0;
    TH1D* hFFJetPtGen = list ? (TH1D*)list->FindObject("fh1FFJetPtGenInc") : 0x0;
    
    if (hFFJetPtRec && hFFJetPtGen) {
      printf("***WARNING: For backward compatibility, using file \"%s\" to get number of jets. BUT: Might be wrong period and has no mult info!***\n",
        pathBackward.Data());
      printf("ALSO: Using Njets for inclusive jets!!!!\n");
      
      hNjetsRec = new TH2D("fh2FFJetPtRec", "", 1, -1, 1, dataRebinned->GetAxis(iJetPt, 0)->GetNbins(),
                          dataRebinned->GetAxis(iJetPt, 0)->GetXbins()->GetArray());
      
      for (Int_t iJet = 1; iJet <= hNjetsRec->GetNbinsY(); iJet++) {
        Int_t lowerBin = hFFJetPtRec->FindBin(hNjetsRec->GetYaxis()->GetBinLowEdge(iJet) + 1e-3);
        Int_t upperBin = hFFJetPtRec->FindBin(hNjetsRec->GetYaxis()->GetBinUpEdge(iJet) - 1e-3);
        hNjetsRec->SetBinContent(1, iJet, hFFJetPtRec->Integral(lowerBin, upperBin));
      }
      
      hNjetsGen = new TH2D("fh2FFJetPtGen", "", 1, -1, 1,  dataRebinned->GetAxis(iJetPt, 0)->GetNbins(),
                          dataRebinned->GetAxis(iJetPt, 0)->GetXbins()->GetArray());
      
      for (Int_t iJet = 1; iJet <= hNjetsGen->GetNbinsY(); iJet++) {
        Int_t lowerBin = hFFJetPtGen->FindBin(hNjetsGen->GetYaxis()->GetBinLowEdge(iJet) + 1e-3);
        Int_t upperBin = hFFJetPtGen->FindBin(hNjetsGen->GetYaxis()->GetBinUpEdge(iJet) - 1e-3);
        hNjetsGen->SetBinContent(1, iJet, hFFJetPtGen->Integral(lowerBin, upperBin));
      }
    }
    
    if (!hNjetsRec || ! hNjetsGen)
      return -1;
  }

  // For normalisation to number of jets
  // NOTE: These numbers are for the efficiency only! The data will be normalised to its own number!!!
  const Double_t nJetsGen = hNjetsGen ? hNjetsGen->Integral(lowerCentralityBinLimit, upperCentralityBinLimit, lowerJetPtBinLimit,
                                                            upperJetPtBinLimit) : 1.;
  const Double_t nJetsRec = hNjetsRec ? hNjetsRec->Integral(lowerCentralityBinLimit, upperCentralityBinLimit, lowerJetPtBinLimit,
                                                            upperJetPtBinLimit) : 1.;
  
  
  
  // Secondary correction
  AliCFEffGrid* sec = new AliCFEffGrid("sec", "Secondary Contamination", *dataRebinned);
  sec->CalculateEfficiency(kStepRecWithRecCutsMeasuredObsPrimaries, kStepRecWithRecCutsMeasuredObs);
  
  TH1 *hSecAllPt = 0x0, *hSecID2Pt = 0x0;
  TH1D* hSecPt[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSecToPiRatioPt[AliPID::kSPECIES] = { 0x0, };
  TCanvas *cSecPt = 0x0;
  TCanvas *cSecToPiRatioPt = 0x0;
  
  TH1 *hSecAllZ = 0x0, *hSecID2Z = 0x0;
  TH1D* hSecZ[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSecToPiRatioZ[AliPID::kSPECIES] = { 0x0, };
  TCanvas *cSecZ = 0x0;
  TCanvas *cSecToPiRatioZ = 0x0;
  
  TH1 *hSecAllXi = 0x0, *hSecID2Xi = 0x0;
  TH1D* hSecXi[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSecToPiRatioXi[AliPID::kSPECIES] = { 0x0, };
  TCanvas *cSecXi = 0x0;
  TCanvas *cSecToPiRatioXi = 0x0;
  
  // Secondary correction with strangeness scaling
  AliCFEffGrid* secStrangeScale = new AliCFEffGrid("secStrangeScale", "Secondary Contamination with strangeness scaling",
                                                   *dataRebinned);
  secStrangeScale->CalculateEfficiency(kStepRecWithRecCutsMeasuredObsPrimaries, kStepRecWithRecCutsMeasuredObsStrangenessScaled);
  
  TH1 *hSecSSAllPt = 0x0, *hSecSSID2Pt = 0x0;
  TH1D* hSecSSPt[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSecSSToPiRatioPt[AliPID::kSPECIES] = { 0x0, };
  TCanvas *cSecSSPt = 0x0;
  TCanvas *cSecSSToPiRatioPt = 0x0;
  
  TH1 *hSecSSAllZ = 0x0, *hSecSSID2Z = 0x0;
  TH1D* hSecSSZ[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSecSSToPiRatioZ[AliPID::kSPECIES] = { 0x0, };
  TCanvas *cSecSSZ = 0x0;
  TCanvas *cSecSSToPiRatioZ = 0x0;
 
  TH1 *hSecSSAllXi = 0x0, *hSecSSID2Xi = 0x0;
  TH1D* hSecSSXi[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSecSSToPiRatioXi[AliPID::kSPECIES] = { 0x0, };
  TCanvas *cSecSSXi = 0x0;
  TCanvas *cSecSSToPiRatioXi = 0x0;
  
  
  const Double_t upperTrackPt = restrictJetPtAxis ? actualUpperJetPt : 50.;
  
  TString strangenessString[2] = { "", "SS" };
  
  // Get the secondary contamination vs. pT,z,xi for each species w/ and w/o strangeness scaling
  
  for (Int_t type = 0; type < kNtypes; type++) {
    for (Int_t strangenessScaling = 0; strangenessScaling < 2; strangenessScaling++) {
      TH1 **hSecAll, **hSecID2;
      TH1D **hSec, **hSecToPiRatio;
      TCanvas **cSec, **cSecToPiRatio;
      
      Int_t iDimProj = -1;
      
      AliCFEffGrid* secCurr = strangenessScaling ? secStrangeScale : sec;
    
      if (type == kTrackPt) {
        hSecAll = strangenessScaling ? &hSecSSAllPt : &hSecAllPt;
        hSecID2 = strangenessScaling ? &hSecSSID2Pt : &hSecID2Pt;
        hSec = strangenessScaling ? &hSecSSPt[0] : &hSecPt[0];
        hSecToPiRatio = strangenessScaling ? &hSecSSToPiRatioPt[0] : &hSecToPiRatioPt[0];
        cSec = strangenessScaling ? &cSecSSPt : &cSecPt;
        cSecToPiRatio = strangenessScaling ? &cSecSSToPiRatioPt : &cSecToPiRatioPt;
        iDimProj = iPt;
      }
      else if (type == kZ) {
        hSecAll = strangenessScaling ? &hSecSSAllZ : &hSecAllZ;
        hSecID2 = strangenessScaling ? &hSecSSID2Z : &hSecID2Z;
        hSec = strangenessScaling ? &hSecSSZ[0] : &hSecZ[0];
        hSecToPiRatio = strangenessScaling ? &hSecSSToPiRatioZ[0] : &hSecToPiRatioZ[0];
        cSec = strangenessScaling ? &cSecSSZ : &cSecZ;
        cSecToPiRatio = strangenessScaling ? &cSecSSToPiRatioZ : &cSecToPiRatioZ;
        iDimProj = iZ;
      }
      else if (type == kXi) {
        hSecAll = strangenessScaling ? &hSecSSAllXi : &hSecAllXi;
        hSecID2 = strangenessScaling ? &hSecSSID2Xi : &hSecID2Xi;
        hSec = strangenessScaling ? &hSecSSXi[0] : &hSecXi[0];
        hSecToPiRatio = strangenessScaling ? &hSecSSToPiRatioXi[0] : &hSecToPiRatioXi[0];
        cSec = strangenessScaling ? &cSecSSXi : &cSecXi;
        cSecToPiRatio = strangenessScaling ? &cSecSSToPiRatioXi : &cSecToPiRatioXi;
        iDimProj = iXi;
      }
      else
        continue;
      
      *hSecAll = secCurr->Project(iDimProj); 
      (*hSecAll)->SetName(Form("hSec%s_%s_all", strangenessString[strangenessScaling].Data(), titles[type].Data()));
      (*hSecAll)->SetTitle("All");
      (*hSecAll)->SetMarkerStyle(24);
      (*hSecAll)->SetLineWidth(2.);
      (*hSecAll)->SetStats(kFALSE);
      (*hSecAll)->GetYaxis()->SetTitle("Primary Fraction");
      (*hSecID2) = (TH2D*)secCurr->Project(iDimProj, iMCid);
      (*hSecID2)->SetName(Form("hSecID2_%s", titles[type].Data()));
      
      for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
        hSec[species] = ((TH2D*)*hSecID2)->ProjectionX(Form("hSec%s_%s_%s", strangenessString[strangenessScaling].Data(),
                                                            titles[type].Data(), AliPID::ParticleShortName(species)),
                                                      species + 1, species + 1, "e");
        hSec[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
        hSec[species]->SetLineColor(getLineColorAliPID(species));
        hSec[species]->SetMarkerColor(getLineColorAliPID(species));
        hSec[species]->SetMarkerStyle(24);
        hSec[species]->SetLineWidth(2.);
        hSec[species]->GetYaxis()->SetRangeUser(0., 1.01);
        hSec[species]->SetStats(kFALSE);
        hSec[species]->GetYaxis()->SetTitle("Primary Fraction");
      }
      
      *cSec = new TCanvas(Form("cSec%s_%s", strangenessString[strangenessScaling].Data(), titles[type].Data()),
                          Form("Primary fraction for different species%s", strangenessScaling ? " (strangeness scaled)" : ""),
                          100, 10, 1200, 800);
      (*cSec)->cd();
      (*cSec)->SetGridx(1);
      (*cSec)->SetGridy(1);
      
      if (type == kTrackPt)
        (*hSecAll)->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
      
      (*hSecAll)->Draw("E1");
      
      for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
        if (type == kTrackPt)
          hSec[i]->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
        
        hSec[i]->Draw("E1 same");
      }
      (*cSec)->BuildLegend()->SetFillColor(kWhite);
      
      ClearTitleFromHistoInCanvas(*cSec);
      
      // To-pi ratios
      for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
        if (species == AliPID::kPion)
          continue; // Do not consider pion-to-pion ratio
          
        hSecToPiRatio[species] = new TH1D(*hSec[species]);
        hSecToPiRatio[species]->Reset();
        hSecToPiRatio[species]->SetName(Form("hSec%sToPionRatio_%s_%s", strangenessString[strangenessScaling].Data(),
                                             titles[type].Data(), AliPID::ParticleShortName(species)));
        hSecToPiRatio[species]->SetTitle(Form("%s/#pi", AliPID::ParticleLatexName(species)));
        hSecToPiRatio[species]->SetLineColor(getLineColorAliPID(species));
        hSecToPiRatio[species]->SetMarkerColor(getLineColorAliPID(species));
        hSecToPiRatio[species]->SetMarkerStyle(24);
        hSecToPiRatio[species]->SetLineWidth(2.);
        hSecToPiRatio[species]->SetStats(kFALSE);
        hSecToPiRatio[species]->GetYaxis()->SetTitle("Primary Fraction of Ratio");
        
        // Samples for different species are independent, so just divide correction factors
        hSecToPiRatio[species]->Divide(hSec[species], hSec[AliPID::kPion], 1., 1., ""); 
        hSecToPiRatio[species]->GetYaxis()->SetRangeUser(0., 1.1);
      }
      
      *cSecToPiRatio = new TCanvas(Form("cSec%sToPiRatio_%s", strangenessString[strangenessScaling].Data(), titles[type].Data()),
                                   Form("Primary fraction of to-#pi-ratio for different species%s",
                                        strangenessScaling ? " (strangeness scaled)" : ""),
                                   100, 10, 1200, 800);
      (*cSecToPiRatio)->cd();
      (*cSecToPiRatio)->SetGridx(1);
      (*cSecToPiRatio)->SetGridy(1);
      
      for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
        if (i == AliPID::kPion)
          continue;
        
        if (type == kTrackPt)
          hSecToPiRatio[i]->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
        
        hSecToPiRatio[i]->Draw(Form("E1%s", i == 0 ? "" : " same"));
      }
      (*cSecToPiRatio)->BuildLegend()->SetFillColor(kWhite);
      
      ClearTitleFromHistoInCanvas(*cSecToPiRatio);
    }
  }
  
  
  // Construct the efficiency grid from the data container 
  // NOTE: Here, the scale factors 1/nJet are different. This effects the error of the ratio.
  // Thus, the histograms must be extracted, scaled and THEN divided to arrive at the correction
  // factor and the standard "calculateEfficiency" function CANNOT be used (multiplying the ratio
  // of the scale factor afterwards would result in wrong errors)
  
  
  
  // If desired, apply the GEANT/FLUKA correction first
  // NOTE: This will change dataRebinned! If anything else should also be calculated, it must be done before.
  // Otherwise, the GEANT/FLUKA correction factor for the efficiency will also affect it!
  const Int_t genStepEff = kStepGenWithGenCuts;
  if (correctGeantFluka) {
    printf("Applying GEANT/FLUKA correction...\n");
    if (!geantFlukaCorrection(dataRebinned, genStepEff)) {
      printf("GEANT/FLUKA correction could not be applied!\n");
      return kFALSE;
    }
  }
  
  
  // Either one can take kStepRecWithGenCutsMeasuredObs or, what I prefer, one can take
  // kStepRecWithRecCutsMeasuredObsPrimaries => The difference is only the eta cut, which is on the rec level
  // in the latter case, i.e. one corrects for eta resolution (although the effect should be very small)
  const Int_t recStepEff = kStepRecWithRecCutsMeasuredObsPrimaries;
  
  // The efficiency vs. pT, z, xi
  TH1* hSpecPt_RecPrimaries = 0x0;
  TH1* hSpecPt_GenPrimaries = 0x0;
  TH1D* hEfficiencyAllPt = 0x0;
  
  TH2* hSpecID2Pt_RecPrimaries = 0x0;
  TH2* hSpecID2Pt_GenPrimaries = 0x0;
  TH2D* hEffID2Pt = 0x0;
  
  TH1D* hSpecIDPt_GenPrimaries[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSpecIDPt_RecPrimaries[AliPID::kSPECIES] = { 0x0, };
  TH1D* hEfficiencyPt[AliPID::kSPECIES] = { 0x0, };
  TH1D* hEfficiencyToPiRatioPt[AliPID::kSPECIES] = { 0x0, };
  
  TCanvas *cSpecPt = 0x0, *cEffPt = 0x0, *cEffToPiRatioPt = 0x0;
  
  
  TH1* hSpecZ_RecPrimaries = 0x0;
  TH1* hSpecZ_GenPrimaries = 0x0;
  TH1D* hEfficiencyAllZ = 0x0;
  
  TH2* hSpecID2Z_RecPrimaries = 0x0;
  TH2* hSpecID2Z_GenPrimaries = 0x0;
  TH2D* hEffID2Z = 0x0;
  
  TH1D* hSpecIDZ_GenPrimaries[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSpecIDZ_RecPrimaries[AliPID::kSPECIES] = { 0x0, };
  TH1D* hEfficiencyZ[AliPID::kSPECIES] = { 0x0, };
  TH1D* hEfficiencyToPiRatioZ[AliPID::kSPECIES] = { 0x0, };
  
  TCanvas *cSpecZ = 0x0, *cEffZ = 0x0, *cEffToPiRatioZ = 0x0;
  
  
  TH1* hSpecXi_RecPrimaries = 0x0;
  TH1* hSpecXi_GenPrimaries = 0x0;
  TH1D* hEfficiencyAllXi = 0x0;
  
  TH2* hSpecID2Xi_RecPrimaries = 0x0;
  TH2* hSpecID2Xi_GenPrimaries = 0x0;
  TH2D* hEffID2Xi = 0x0;
  
  TH1D* hSpecIDXi_GenPrimaries[AliPID::kSPECIES] = { 0x0, };
  TH1D* hSpecIDXi_RecPrimaries[AliPID::kSPECIES] = { 0x0, };
  TH1D* hEfficiencyXi[AliPID::kSPECIES] = { 0x0, };
  TH1D* hEfficiencyToPiRatioXi[AliPID::kSPECIES] = { 0x0, };

  TCanvas *cSpecXi = 0x0, *cEffXi = 0x0, *cEffToPiRatioXi = 0x0;
  
  TString titleYaxis[kNtypes];
  titleYaxis[kTrackPt] = "1/N_{Jets} dN/dP_{T} (GeV/c)^{-1}";
  titleYaxis[kZ] = "1/N_{Jets} dN/dz";
  titleYaxis[kXi] = "1/N_{Jets} dN/d#xi";
  
  for (Int_t type = 0; type < kNtypes; type++) {
    TH1** hSpec_RecPrimaries;
    TH1** hSpec_GenPrimaries;
    TH1D** hEfficiencyAll;
    
    TH2** hSpecID2_RecPrimaries;
    TH2** hSpecID2_GenPrimaries;
    TH2D** hEffID2;
    
    TH1D** hSpecID_GenPrimaries;
    TH1D** hSpecID_RecPrimaries;
    TH1D** hEfficiency;
    TH1D** hEfficiencyToPiRatio;
    
    TCanvas **cSpec, **cEff, **cEffToPiRatio;
    
    Int_t iDimProj = -1;
    
  
    if (type == kTrackPt) {
      hSpec_RecPrimaries = &hSpecPt_RecPrimaries;
      hSpec_GenPrimaries = &hSpecPt_GenPrimaries;
      hEfficiencyAll = &hEfficiencyAllPt;
      
      hSpecID2_RecPrimaries = &hSpecID2Pt_RecPrimaries;
      hSpecID2_GenPrimaries = &hSpecID2Pt_GenPrimaries;
      hEffID2 = &hEffID2Pt;
      
      hSpecID_RecPrimaries = &hSpecIDPt_RecPrimaries[0];
      hSpecID_GenPrimaries = &hSpecIDPt_GenPrimaries[0];
      hEfficiency = &hEfficiencyPt[0];
      hEfficiencyToPiRatio = &hEfficiencyToPiRatioPt[0];
      
      cSpec = &cSpecPt;
      cEff = &cEffPt;
      cEffToPiRatio = &cEffToPiRatioPt;
      
      iDimProj = iPt;
    }
    else if (type == kZ) {
      hSpec_RecPrimaries = &hSpecZ_RecPrimaries;
      hSpec_GenPrimaries = &hSpecZ_GenPrimaries;
      hEfficiencyAll = &hEfficiencyAllZ;
      
      hSpecID2_RecPrimaries = &hSpecID2Z_RecPrimaries;
      hSpecID2_GenPrimaries = &hSpecID2Z_GenPrimaries;
      hEffID2 = &hEffID2Z;
      
      hSpecID_RecPrimaries = &hSpecIDZ_RecPrimaries[0];
      hSpecID_GenPrimaries = &hSpecIDZ_GenPrimaries[0];
      hEfficiency = &hEfficiencyZ[0];
      hEfficiencyToPiRatio = &hEfficiencyToPiRatioZ[0];
      
      cSpec = &cSpecZ;
      cEff = &cEffZ;
      cEffToPiRatio = &cEffToPiRatioZ;
      
      iDimProj = iZ;
    }
    else if (type == kXi) {
      hSpec_RecPrimaries = &hSpecXi_RecPrimaries;
      hSpec_GenPrimaries = &hSpecXi_GenPrimaries;
      hEfficiencyAll = &hEfficiencyAllXi;
      
      hSpecID2_RecPrimaries = &hSpecID2Xi_RecPrimaries;
      hSpecID2_GenPrimaries = &hSpecID2Xi_GenPrimaries;
      hEffID2 = &hEffID2Xi;
      
      hSpecID_RecPrimaries = &hSpecIDXi_RecPrimaries[0];
      hSpecID_GenPrimaries = &hSpecIDXi_GenPrimaries[0];
      hEfficiency = &hEfficiencyXi[0];
      hEfficiencyToPiRatio = &hEfficiencyToPiRatioXi[0];
      
      cSpec = &cSpecXi;
      cEff = &cEffXi;
      cEffToPiRatio = &cEffToPiRatioXi;
      
      iDimProj = iXi;
    }
    else
      continue;
    
    
    // Divide steps: recStepEff (=kStepRecWithRecCutsMeasuredObsPrimaries) / genStepEff (=kStepGenWithGenCuts)
    *hSpec_RecPrimaries = dataRebinned->GetGrid(recStepEff)->Project(iDimProj);  
    setupHist(*hSpec_RecPrimaries, Form("hSpec_%s_RecPrimaries", titles[type].Data()), "All, rec", "",
              titleYaxis[type].Data(), kBlack);
    normaliseHist(*hSpec_RecPrimaries, nJetsRec > 0 ? 1. / nJetsRec : 0.);
    (*hSpec_RecPrimaries)->SetLineWidth(2.);
    (*hSpec_RecPrimaries)->SetMarkerStyle(20);
    
    *hSpec_GenPrimaries = dataRebinned->GetGrid(genStepEff)->Project(iDimProj);
    setupHist(*hSpec_GenPrimaries, Form("hSpec_%s_GenPrimaries", titles[type].Data()), "All, gen", "",
              titleYaxis[type].Data(), kBlack);
    normaliseHist(*hSpec_GenPrimaries, nJetsGen > 0 ? 1. / nJetsGen : 0.);
    (*hSpec_GenPrimaries)->SetLineWidth(2.);
    (*hSpec_GenPrimaries)->SetLineStyle(2);
    
    *hEfficiencyAll = new TH1D(*(TH1D*)(*hSpec_RecPrimaries));
    (*hEfficiencyAll)->SetName(Form("hEfficiencyAll_%s", titles[type].Data()));
    (*hEfficiencyAll)->GetYaxis()->SetTitle("");
    (*hEfficiencyAll)->SetTitle("All");
    (*hEfficiencyAll)->SetLineWidth(2.0);
    (*hEfficiencyAll)->SetStats(kFALSE);
    (*hEfficiencyAll)->GetYaxis()->SetTitle("Efficiency x Acceptance x pT Resolution");
    (*hEfficiencyAll)->GetYaxis()->SetTitleSize(0.05);
    (*hEfficiencyAll)->Divide(*hSpec_RecPrimaries, *hSpec_GenPrimaries, 1., 1., "B");
    (*hEfficiencyAll)->GetYaxis()->SetRangeUser(0., 2.0);
    
    *hSpecID2_RecPrimaries = (TH2*)dataRebinned->GetGrid(recStepEff)->Project(iDimProj, iMCid);  
    (*hSpecID2_RecPrimaries)->SetName(Form("hSpecID2_RecPrimaries_%s", titles[type].Data()));
    (*hSpecID2_RecPrimaries)->Scale(nJetsRec > 0 ? 1. / nJetsRec : 0.);
    
    *hSpecID2_GenPrimaries = (TH2*)dataRebinned->GetGrid(genStepEff)->Project(iDimProj, iMCid); 
    (*hSpecID2_GenPrimaries)->SetName(Form("hSpecID2_GenPrimaries_%s", titles[type].Data()));
    (*hSpecID2_GenPrimaries)->Scale(nJetsGen > 0 ? 1. / nJetsGen : 0.);
    
    *hEffID2 = new TH2D(*(TH2D*)(*hSpecID2_RecPrimaries));
    (*hEffID2)->SetName(Form("hEff_%s", titles[type].Data()));
    (*hEffID2)->SetTitle("All");
    (*hEffID2)->Divide(*hSpecID2_RecPrimaries, *hSpecID2_GenPrimaries, 1., 1., "B");

    // Get the efficiencies vs. pT,z,xi for each species
    for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
      hEfficiency[species] = ((TH2D*)*hEffID2)->ProjectionX(Form("hEfficiency_%s_%s", titles[type].Data(),
                                                                 AliPID::ParticleShortName(species)), 
                                                            species + 1, species + 1, "e");
      setupHist(hEfficiency[species], "", Form("%s", AliPID::ParticleLatexName(species)), "", "",
                getLineColorAliPID(species));
      hEfficiency[species]->SetLineWidth(2.);
      hEfficiency[species]->GetYaxis()->SetRangeUser(0., 2.0);
      hEfficiency[species]->SetStats(kFALSE);
      hEfficiency[species]->GetYaxis()->SetTitle("Efficiency x Acceptance x pT Resolution");
      hEfficiency[species]->GetYaxis()->SetTitleSize(0.05);
      
      hSpecID_GenPrimaries[species] = ((TH2D*)*hSpecID2_GenPrimaries)->ProjectionX(Form("hSpecID_%s_gen_%s",
                                                                                        titles[type].Data(),
                                                                                        AliPID::ParticleShortName(species)),
                                                                                        species + 1, species + 1, "e");
      setupHist(hSpecID_GenPrimaries[species], "", Form("%s, gen", AliPID::ParticleLatexName(species)), "",
                titleYaxis[type].Data(), getLineColorAliPID(species));
      normaliseHist(hSpecID_GenPrimaries[species], 1.);
      hSpecID_GenPrimaries[species]->SetLineWidth(2.);
      hSpecID_GenPrimaries[species]->SetLineStyle(2.);
      hSpecID_GenPrimaries[species]->SetStats(kFALSE);
      
      
      hSpecID_RecPrimaries[species] = ((TH2D*)*hSpecID2_RecPrimaries)->ProjectionX(Form("hSpecID_%s_rec_%s",
                                                                                        titles[type].Data(),
                                                                                        AliPID::ParticleShortName(species)),
                                                                                        species + 1, species + 1, "e");
      setupHist(hSpecID_RecPrimaries[species], "", Form("%s, rec", AliPID::ParticleLatexName(species)), "",
                titleYaxis[type].Data(), getLineColorAliPID(species));
      normaliseHist(hSpecID_RecPrimaries[species], 1.);
      hSpecID_RecPrimaries[species]->SetLineWidth(2.);
      hSpecID_RecPrimaries[species]->SetMarkerStyle(20);
      hSpecID_RecPrimaries[species]->SetStats(kFALSE);
    }

    *cSpec = new TCanvas(Form("cSpec_%s", titles[type].Data()), "Spectra for different species", 0, 300, 900, 900);
    (*cSpec)->cd();
    (*cSpec)->SetGridx(1);
    (*cSpec)->SetGridy(1);
    (*cSpec)->SetLogy(1);
    
    if (type == kTrackPt)
      (*hSpec_GenPrimaries)->GetYaxis()->SetRangeUser(1e-8, 1e2);
    else if (type == kZ)
      (*hSpec_GenPrimaries)->GetYaxis()->SetRangeUser(1e-5, 1e3);
    else if (type == kXi)
      (*hSpec_GenPrimaries)->GetYaxis()->SetRangeUser(1e-5, 1e3);
    
    
    if (type == kTrackPt)
      (*hSpec_GenPrimaries)->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
    (*hSpec_GenPrimaries)->Draw("E1");
    
    if (type == kTrackPt)
      (*hSpec_RecPrimaries)->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
    (*hSpec_RecPrimaries)->Draw("E1 same");
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (type == kTrackPt) {
        hSpecID_GenPrimaries[i]->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
        hSpecID_RecPrimaries[i]->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
      }
      
      hSpecIDPt_GenPrimaries[i]->Draw("E1 same");
      hSpecIDPt_RecPrimaries[i]->Draw("E1 same");
    }
    TLegend* leg = (*cSpec)->BuildLegend();
    leg->SetFillColor(kWhite);
    leg->SetNColumns(2);
    
    ClearTitleFromHistoInCanvas(*cSpec);
    
    
    *cEff = new TCanvas(Form("cEff_%s", titles[type].Data()), "Efficiency x Acceptance x pT Resolution for different species",
                        0, 300, 900, 900);
    (*cEff)->cd();
    (*cEff)->SetGridx(1);
    (*cEff)->SetGridy(1);
    
    if (type == kTrackPt)
      (*hEfficiencyAll)->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
    (*hEfficiencyAll)->Draw("E1");
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (type == kTrackPt)
        hEfficiency[i]->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
      hEfficiency[i]->Draw("E1 same");
    }
    (*cEff)->BuildLegend()->SetFillColor(kWhite);
    
    ClearTitleFromHistoInCanvas(*cEff);
    
    
    // To-pi ratios
    for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
      if (species == AliPID::kPion)
        continue; // Do not consider pion-to-pion ratio
        
      hEfficiencyToPiRatio[species] = new TH1D(*hEfficiency[species]);
      hEfficiencyToPiRatio[species]->Reset();
      hEfficiencyToPiRatio[species]->SetName(Form("hEfficiency_ToPionRatio_%s_%s", titles[type].Data(),
                                                  AliPID::ParticleShortName(species)));
      
      setupHist(hEfficiencyToPiRatio[species], "", Form("%s/#pi", AliPID::ParticleLatexName(species)), "", "",
                getLineColorAliPID(species));
      hEfficiencyToPiRatio[species]->SetLineWidth(2.);
      hEfficiencyToPiRatio[species]->SetStats(kFALSE);
      hEfficiencyToPiRatio[species]->GetYaxis()->SetTitle("Efficiency x Acceptance x pT Resolution");
      hEfficiencyToPiRatio[species]->GetYaxis()->SetTitleSize(0.05);
      
      // Samples for different species are independent, so just divide correction factors
      hEfficiencyToPiRatio[species]->Divide(hEfficiency[species], hEfficiency[AliPID::kPion], 1., 1., ""); 
      hEfficiencyToPiRatio[species]->GetYaxis()->SetRangeUser(0., 2.0);
    }
    
    *cEffToPiRatio = new TCanvas(Form("cEffToPiRatio_%s", titles[type].Data()),
                                 "Efficiency x Acceptance x pT Resolution for different to-#pi-ratios",
                                 100, 10, 1200, 800);
    (*cEffToPiRatio)->cd();
    (*cEffToPiRatio)->SetGridx(1);
    (*cEffToPiRatio)->SetGridy(1);
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (i == AliPID::kPion)
        continue;
      
      if (type == kTrackPt)
        hEfficiencyToPiRatio[i]->GetXaxis()->SetRangeUser(0.15, upperTrackPt);
      
      hEfficiencyToPiRatio[i]->Draw(Form("E1%s", i == 0 ? "" : " same"));
    }
    (*cEffToPiRatio)->BuildLegend()->SetFillColor(kWhite);
    
    ClearTitleFromHistoInCanvas(*cEffToPiRatio);
  }
  
  // Save results to file
  TString chargeString = "";
  if (chargeMode == kPosCharge)
    chargeString = "_posCharge";
  else if (chargeMode == kNegCharge)
    chargeString = "_negCharge";
  
  TString saveFileName = pathNameData;
  saveFileName.ReplaceAll(Form("%s/", pathData.Data()), "");
  saveFileName.Prepend("output_EfficiencyCorrection_");
  saveFileName.ReplaceAll(".root", Form("_jetPt%.1f_%.1f%s.root", actualLowerJetPt, actualUpperJetPt, chargeString.Data()));
  
  TString saveFilePathName = Form("%s/%s", pathData.Data(), saveFileName.Data());
  TFile* saveFile = TFile::Open(saveFilePathName.Data(), "RECREATE");
  
  if (!saveFile) {
    printf("Could not save results!\n");
    
    return -1;
  }
  
  saveFile->cd();
  
  if (cSecPt)
    cSecPt->Write();
  
  if (cSecSSPt)
    cSecSSPt->Write();
  
  if (hSecAllPt)
      hSecAllPt->Write();
  
  if (hSecSSAllPt)
      hSecSSAllPt->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSecPt[i])
      hSecPt[i]->Write();
    
    if (hSecSSPt[i])
      hSecSSPt[i]->Write();
  }
  
  if (cSecToPiRatioPt)
    cSecToPiRatioPt->Write();
  
  if (cSecSSToPiRatioPt)
    cSecSSToPiRatioPt->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSecToPiRatioPt[i])
      hSecToPiRatioPt[i]->Write();
    
    if (hSecSSToPiRatioPt[i])
      hSecSSToPiRatioPt[i]->Write();
  }

  
  
  if (cSecZ)
    cSecZ->Write();
  
  if (cSecSSZ)
    cSecSSZ->Write();
  
  if (hSecAllZ)
      hSecAllZ->Write();
  
  if (hSecSSAllZ)
      hSecSSAllZ->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSecZ[i])
      hSecZ[i]->Write();
    
    if (hSecSSZ[i])
      hSecSSZ[i]->Write();
  }
  
  if (cSecToPiRatioZ)
    cSecToPiRatioZ->Write();
  
  if (cSecSSToPiRatioZ)
    cSecSSToPiRatioZ->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSecToPiRatioZ[i])
      hSecToPiRatioZ[i]->Write();
    
    if (hSecSSToPiRatioZ[i])
      hSecSSToPiRatioZ[i]->Write();
  }
  
  
  
  if (cSecXi)
    cSecXi->Write();
  
  if (cSecSSXi)
    cSecSSXi->Write();
  
  if (hSecAllXi)
      hSecAllXi->Write();
  
  if (hSecSSAllXi)
      hSecSSAllXi->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSecXi[i])
      hSecXi[i]->Write();
    
    if (hSecSSXi[i])
      hSecSSXi[i]->Write();
  }
  
  if (cSecToPiRatioXi)
    cSecToPiRatioXi->Write();
  
  if (cSecSSToPiRatioXi)
    cSecSSToPiRatioXi->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSecToPiRatioXi[i])
      hSecToPiRatioXi[i]->Write();
    
    if (hSecSSToPiRatioXi[i])
      hSecSSToPiRatioXi[i]->Write();
  }
  
  
  
  if (cSpecPt)
    cSpecPt->Write();
  
  if (hSpecPt_RecPrimaries)
    hSpecPt_RecPrimaries->Write();
  
  if (hSpecPt_GenPrimaries)
    hSpecPt_GenPrimaries->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSpecIDPt_GenPrimaries[i])
      hSpecIDPt_GenPrimaries[i]->Write();
    
    if (hSpecIDPt_RecPrimaries[i])
      hSpecIDPt_RecPrimaries[i]->Write();
  }
  
  
  if (cEffPt)
    cEffPt->Write();
  
  if (hEfficiencyAllPt)
      hEfficiencyAllPt->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hEfficiencyPt[i])
      hEfficiencyPt[i]->Write();
  }
  
  if (cEffToPiRatioPt)
    cEffToPiRatioPt->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hEfficiencyToPiRatioPt[i])
      hEfficiencyToPiRatioPt[i]->Write();
  }
  
  
  
  if (cSpecZ)
    cSpecZ->Write();
  
  if (hSpecZ_RecPrimaries)
    hSpecZ_RecPrimaries->Write();
  
  if (hSpecZ_GenPrimaries)
    hSpecZ_GenPrimaries->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSpecIDZ_GenPrimaries[i])
      hSpecIDZ_GenPrimaries[i]->Write();
    
    if (hSpecIDZ_RecPrimaries[i])
      hSpecIDZ_RecPrimaries[i]->Write();
  }
  
  
  if (cEffZ)
    cEffZ->Write();
  
  if (hEfficiencyAllZ)
      hEfficiencyAllZ->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hEfficiencyZ[i])
      hEfficiencyZ[i]->Write();
  }
  
  if (cEffToPiRatioZ)
    cEffToPiRatioZ->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hEfficiencyToPiRatioZ[i])
      hEfficiencyToPiRatioZ[i]->Write();
  }
  
  
  
  if (cSpecXi)
    cSpecXi->Write();
  
  if (hSpecXi_RecPrimaries)
    hSpecXi_RecPrimaries->Write();
  
  if (hSpecXi_GenPrimaries)
    hSpecXi_GenPrimaries->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hSpecIDXi_GenPrimaries[i])
      hSpecIDXi_GenPrimaries[i]->Write();
    
    if (hSpecIDXi_RecPrimaries[i])
      hSpecIDXi_RecPrimaries[i]->Write();
  }
  
  
  if (cEffXi)
    cEffXi->Write();
  
  if (hEfficiencyAllXi)
      hEfficiencyAllXi->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hEfficiencyXi[i])
      hEfficiencyXi[i]->Write();
  }
  
  if (cEffToPiRatioXi)
    cEffToPiRatioXi->Write();
  
  for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
    if (hEfficiencyToPiRatioXi[i])
      hEfficiencyToPiRatioXi[i]->Write();
  }
  
  
  
  // Correct the yields with the efficiencies and primary fractions
  for (Int_t type = 0; type < kNtypes; type++) {
    TH1D* hYieldCorrected[AliPID::kSPECIES];
    TH1D* hYieldCorrectedSysError[AliPID::kSPECIES];
    
    TH1D** hYield;
    TH1D** hYieldSysError;
    TH1D** hMCgenPrimYield;
    TH1D** hSecSS;
    TH1D** hSec;
    TH1D** hEfficiency;
    
    if (type == kTrackPt) {
      hYield = &hYieldPt[0];
      hYieldSysError = &hYieldPtSysError[0];
      hMCgenPrimYield = &hMCgenPrimYieldPt[0];
      hSecSS = &hSecSSPt[0];
      hSec = &hSecPt[0];
      hEfficiency = &hEfficiencyPt[0];
    }
    else if (type == kZ) {
      hYield = &hYieldZ[0];
      hYieldSysError = &hYieldZSysError[0];
      hMCgenPrimYield = &hMCgenPrimYieldZ[0];
      hSecSS = &hSecSSZ[0];
      hSec = &hSecZ[0];
      hEfficiency = &hEfficiencyZ[0];
    }
    else if (type == kXi) {
      hYield = &hYieldXi[0];
      hYieldSysError = &hYieldXiSysError[0];
      hMCgenPrimYield = &hMCgenPrimYieldXi[0];
      hSecSS = &hSecSSXi[0];
      hSec = &hSecXi[0];
      hEfficiency = &hEfficiencyXi[0];
    }
    else
      continue;
    
    
    // NOTE: The yields have already been normalised to nJets in extractFFs. However, the binning in jetPt might be different now.
    // Thus, in order to get the correct result, the old normalisation (just the same binnnig as in the nJet histo) has to be 
    // undone (was done above) and then it has to be normalised to the number of jets in the new binning again (now).
    // Also NOTE: Histos are already normalised to bin width via extractFFs!
    const Double_t nJetsGenData = hNjetsGenData ? hNjetsGenData->Integral(lowerCentralityBinLimitData, upperCentralityBinLimitData, 
                                                                          lowerJetPtBinLimitData, upperJetPtBinLimitData) : 1.;
    const Double_t nJetsRecData = hNjetsRecData ? hNjetsRecData->Integral(lowerCentralityBinLimitData, upperCentralityBinLimitData,                 
                                                                          lowerJetPtBinLimitData, upperJetPtBinLimitData) : 1.;
    
    for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
      hYield[species]->Scale((nJetsRecData > 0) ? 1. / nJetsRecData : 0.);
      hYieldSysError[species]->Scale((nJetsRecData > 0) ? 1. / nJetsRecData : 0.);
        
      hYield[species]->SetStats(kFALSE);
      hYieldSysError[species]->SetStats(kFALSE);
      
      if (hMCgenPrimYield[species]) {
        hMCgenPrimYield[species]->Scale((nJetsGenData > 0) ? 1. / nJetsGenData : 0.);
        hMCgenPrimYield[species]->SetStats(kFALSE);
      }
      
      hYield[species]->GetYaxis()->SetTitle(titleYaxis[type].Data());
      if (hMCgenPrimYield[species]) {
        hMCgenPrimYield[species]->GetYaxis()->SetTitle(titleYaxis[type].Data());
        hMCgenPrimYield[species]->SetTitle(Form("%s (MC)", AliPID::ParticleLatexName(species)));
        hMCgenPrimYield[species]->SetMarkerStyle(24);
        hMCgenPrimYield[species]->SetLineColor(getLineColorAliPID(species));
        hMCgenPrimYield[species]->SetMarkerColor(getLineColorAliPID(species));
      }

      hYield[species]->SetLineColor(getLineColorAliPID(species));
      hYield[species]->SetMarkerColor(getLineColorAliPID(species));
      hYield[species]->SetMarkerStyle(20);
      
      hYieldSysError[species]->SetLineColor(getLineColorAliPID(species));
      hYieldSysError[species]->SetMarkerColor(getLineColorAliPID(species));
      hYieldSysError[species]->SetMarkerStyle(20);
      hYieldSysError[species]->SetFillStyle(0);
      
      hYieldCorrected[species] = new TH1D(*hYield[species]);
      hYieldCorrected[species]->SetName(Form("%s_corrected", hYield[species]->GetName()));
      hYieldCorrected[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
      
      hYieldCorrectedSysError[species] = new TH1D(*hYieldSysError[species]);
      hYieldCorrectedSysError[species]->SetName(Form("%s_corrected", hYieldSysError[species]->GetName()));
      hYieldCorrectedSysError[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
    
      // Correction factor histos can have different binning than data histos (constant factor above some threshold)
      // -> Need special functions to multiply and divide such histos
      multiplyHistsDifferentBinning(hYieldCorrected[species], scaleStrangeness ? hSecSS[species] : hSec[species], 1., 1.);
      divideHistsDifferentBinning(hYieldCorrected[species], hEfficiency[species], 1., 1.);
      
      multiplyHistsDifferentBinning(hYieldCorrectedSysError[species], scaleStrangeness ? hSecSS[species] : hSec[species], 1., 1.,
                                    kTRUE);
      divideHistsDifferentBinning(hYieldCorrectedSysError[species], hEfficiency[species], 1., 1., kTRUE);

      //hYieldCorrected[species]->Multiply(hYieldCorrected[species], scaleStrangeness ? hSecSS[species] : hSec[species], 1., 1.,
      //"");
      //hYieldCorrected[species]->Divide(hYieldCorrected[species], hEfficiency[species], 1., 1., ""); 
    }
    
    // Calculate the total corrected yield. The original total yield had no error (just the number of detected tracks in a pT bin),
    // but due to the correction there is some error for the total yield. Also the error of the fractions introduces uncertainties
    // for the yields of individual species
    TH1D* hYieldCorrectedTotal = new TH1D(*hYieldCorrected[0]);
    hYieldCorrectedTotal->SetLineColor(kBlack);
    hYieldCorrectedTotal->SetMarkerColor(kBlack);
    hYieldCorrectedTotal->SetMarkerStyle(20);
    hYieldCorrectedTotal->SetName(Form("hYieldCorrectedTotal_%s", titles[type].Data()));
    hYieldCorrectedTotal->SetTitle("Total");
    //hYieldCorrectedTotal->SetTitle("Total, secondary and efficiency x acceptance x pT resolution corrected");
    
    //TODO doesn't it require the covariance matrix here to get the error of the corrected total yield?
    // Because before the total count was taken into account just by the fit. Now the fractions and their errors
    // influence the MC correction (and its errors), so that there is some error on the corrected total yield.
    // However, the errors of the contributing yields are correlated!
    for (Int_t i = 1; i < AliPID::kSPECIES; i++)
      hYieldCorrectedTotal->Add(hYieldCorrected[i], 1.);
    
    // Calculate the corrected fractions
    TH1D* hFractionCorrected[AliPID::kSPECIES];
    TH1D* hFractionCorrectedSysError[AliPID::kSPECIES];
    
    for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
      hFractionCorrected[species] = new TH1D(*hYield[species]);
      TString oldName = hYield[species]->GetName();
      TString newName = oldName.ReplaceAll("Yield", "Fraction");
      hFractionCorrected[species]->SetName(Form("%s_corrected", newName.Data()));
      hFractionCorrected[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
      hFractionCorrected[species]->GetYaxis()->SetTitle("Corrected Fraction");
      hFractionCorrected[species]->GetXaxis()->SetMoreLogLabels(kTRUE);
      hFractionCorrected[species]->GetXaxis()->SetNoExponent(kTRUE);
      hFractionCorrected[species]->SetFillStyle(0);

      
      // Binomial error as for efficiencies (numerator and denominator are statistically not independent) for correct error calculation
      // (numerator is a "selected" subset of the denominator). It doesn't matter that the error of the histos is not just 
      // "sqrt(content)" because the error formula also works for weighted histograms (which means that the error can be more
      // or less anything)
      hFractionCorrected[species]->Divide(hYieldCorrected[species], hYieldCorrectedTotal, 1., 1., "B"); 
      
      
      
      //  The systematic errors just need to be scaled in the same way as the fractions.
      // So, just take the ratio to the uncorrected fraction and scale the sys. error accordingly
      // or, in this case, just divide by the same total yield as for yield -> fractions
      hFractionCorrectedSysError[species] = new TH1D(*hFractionCorrected[species]);
      hFractionCorrectedSysError[species]->SetName(Form("%s_sysError", hFractionCorrected[species]->GetName()));
      hFractionCorrectedSysError[species]->SetTitle(Form("%s (sys. error)", hFractionCorrected[species]->GetTitle()));
      
      for (Int_t binX = 1; binX <= hFractionCorrectedSysError[species]->GetNbinsX(); binX++) {
        const Double_t corrTotalYield = hYieldCorrectedTotal->GetBinContent(binX);
        const Double_t scaleFactor = corrTotalYield > 0 ? 1.0 / corrTotalYield : 1.;
        hFractionCorrectedSysError[species]->SetBinError(binX,   hYieldCorrectedSysError[species]->GetBinError(binX) * scaleFactor);
      }
    }
    
    // If MC is available, calculate the generated fractions
    TH1D* hMCgenPrimYieldTotal = 0x0;
    TH1D* hMCgenPrimFraction[AliPID::kSPECIES];
    for (Int_t i = 0; i < AliPID::kSPECIES; i++)
      hMCgenPrimFraction[i] = 0x0;
    
    if (numMCgenPrimYieldHistsFound > 0) {
      hMCgenPrimYieldTotal = new TH1D(*hMCgenPrimYield[0]);
      hMCgenPrimYieldTotal->SetLineColor(kBlack);
      hMCgenPrimYieldTotal->SetMarkerColor(kBlack);
      hMCgenPrimYieldTotal->SetMarkerStyle(24);
      hMCgenPrimYieldTotal->SetName(Form("hMCgenPrimYieldTotal%s", titles[type].Data()));
      hMCgenPrimYieldTotal->SetTitle("Total, MC truth");
      //hMCgenPrimYieldTotal->SetTitle("Total generated primary yield (MC truth)");
      
      for (Int_t i = 1; i < AliPID::kSPECIES; i++)
        hMCgenPrimYieldTotal->Add(hMCgenPrimYield[i], 1.);
      
      // Calculate the MC fractions
      for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
        hMCgenPrimYield[species]->SetLineColor(getLineColorAliPID(species));
        hMCgenPrimYield[species]->SetMarkerColor(getLineColorAliPID(species));
        hMCgenPrimYield[species]->SetMarkerStyle(24);
      
        hMCgenPrimYield[species]->SetTitle(Form("%s, MC truth", AliPID::ParticleLatexName(species)));
        
        hMCgenPrimFraction[species] = new TH1D(*hMCgenPrimYield[species]);
        TString oldName = hMCgenPrimYield[species]->GetName();
        TString newName = oldName.ReplaceAll("Yield", "Fraction");
        hMCgenPrimFraction[species]->SetName(newName.Data());

        // Binomial error as for efficiencies (numerator and denominator are statistically not independent) for correct error calculation
        // (numerator is a "selected" subset of the denominator).
        hMCgenPrimFraction[species]->Divide(hMCgenPrimFraction[species], hMCgenPrimYieldTotal, 1., 1., "B"); 
      }
    }
    
    TCanvas* cCorrData = new TCanvas(Form("cCorrData_%s", titles[type].Data()), "Corrected data", 0, 300, 900, 900);
    cCorrData->Divide(2, 1, 0., 0.01);
    cCorrData->GetPad(1)->SetLogx(1);
    cCorrData->GetPad(1)->SetLogy(1);
    cCorrData->GetPad(2)->SetLogx(1);
    cCorrData->GetPad(2)->SetLogy(1);
    
    cCorrData->GetPad(1)->SetRightMargin(0.001);
    cCorrData->GetPad(2)->SetRightMargin(0.001);
    
    cCorrData->GetPad(1)->SetLeftMargin(0.2);
    cCorrData->GetPad(2)->SetLeftMargin(0.2);
    
    cCorrData->cd(1); // uncorrected
    hYield[AliPID::kPion]->GetYaxis()->SetTitleOffset(1.4);
    hYield[AliPID::kPion]->Draw("E1");
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      hYieldSysError[i]->Draw("E2 same");
      
      if (i == AliPID::kPion) continue;
      hYield[i]->Draw("E1 same");
    }
    
    
    ClearTitleFromHistoInCanvas(cCorrData, 1);
    
    Double_t maximum = hYieldCorrectedTotal->GetBinContent(hYieldCorrectedTotal->GetMaximumBin()) * 10.;
    Double_t minimum = maximum;
    for (Int_t spec = 0; spec < AliPID::kSPECIES; spec++) {
      Double_t temp = hYieldCorrected[spec]->GetBinContent(hYieldCorrected[spec]->FindLastBinAbove(0.)) * 0.1;
      if (temp > 0)
        minimum = temp;
    }
    
    
    cCorrData->cd(2); // corrected
    hYieldCorrectedTotal->GetXaxis()->SetMoreLogLabels(kTRUE);
    hYieldCorrectedTotal->GetXaxis()->SetNoExponent(kTRUE);
    hYieldCorrectedTotal->GetYaxis()->SetRangeUser(minimum, maximum);
    
    if (hMCgenPrimYieldTotal) {
      hMCgenPrimYieldTotal->GetYaxis()->SetTitleOffset(1.4);
      hMCgenPrimYieldTotal->GetXaxis()->SetMoreLogLabels(kTRUE);
      hMCgenPrimYieldTotal->GetXaxis()->SetNoExponent(kTRUE);
      hMCgenPrimYieldTotal->GetXaxis()->SetTitle(hYieldCorrectedTotal->GetXaxis()->GetTitle());
      hMCgenPrimYieldTotal->GetYaxis()->SetRangeUser(minimum, maximum);
    }
    
    if (hMCgenPrimYieldTotal) {
      hMCgenPrimYieldTotal->Draw("E1");
      hYieldCorrectedTotal->Draw("E1 same");
    }
    else
      hYieldCorrectedTotal->Draw("E1");
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (hMCgenPrimYield[i])
        hMCgenPrimYield[i]->Draw("E1 same");
      hYieldCorrected[i]->Draw("E1 same");
    }
    
    TLegend* legTemp = cCorrData->cd(2)->BuildLegend();//0.25, 0.16, 0.65, 0.51);
    legTemp->SetNColumns(2);
    legTemp->SetFillColor(kWhite);
    
    // Do not include into legend
    for (Int_t i = 0; i < AliPID::kSPECIES; i++)
      hYieldCorrectedSysError[i]->Draw("E2 same");
    
    ClearTitleFromHistoInCanvas(cCorrData, 2);
    
    TCanvas* cCorrYieldsRatio = 0x0;
    
    TH1D* hYieldCorrectedRatioToMC[AliPID::kSPECIES];
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) 
      hYieldCorrectedRatioToMC[i] = 0x0;

    TH1D* hYieldCorrectedTotalRatioToMC = 0x0;
    
    if (numMCgenPrimYieldHistsFound > 0) {
      // Compare with MC truth
      for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
        hYieldCorrectedRatioToMC[species] = new TH1D(*hYieldCorrected[species]);
        hYieldCorrectedRatioToMC[species]->SetName(Form("hYieldCorrectedRatioToMC_%s_%s", titles[type].Data(), 
                                                        AliPID::ParticleShortName(species)));
        hYieldCorrectedRatioToMC[species]->SetTitle(Form("%s", AliPID::ParticleLatexName(species)));
        hYieldCorrectedRatioToMC[species]->GetYaxis()->SetTitle("Corrected Yield: Fit / MC Truth");
        hYieldCorrectedRatioToMC[species]->Divide(hMCgenPrimYield[species]);
      }
      
      hYieldCorrectedTotalRatioToMC = new TH1D(*hYieldCorrectedTotal);
      hYieldCorrectedTotalRatioToMC->SetName(Form("hYieldCorrectedTotalRatioToMC_%s", titles[type].Data()));
      hYieldCorrectedTotalRatioToMC->SetTitle("Total yield");
      hYieldCorrectedTotalRatioToMC->GetYaxis()->SetTitle("Corrected Yield: Fit / MC Truth");
      hYieldCorrectedTotalRatioToMC->Divide(hMCgenPrimYieldTotal);
      
      cCorrYieldsRatio = new TCanvas(Form("cCorrYieldsRatio_%s", titles[type].Data()), "Corrected Yields Comparison to MC",
                                     0, 300, 900, 900);
      cCorrYieldsRatio->SetGridx(1);
      cCorrYieldsRatio->SetGridy(1);
      cCorrYieldsRatio->SetLogx(1);
      
      hYieldCorrectedTotalRatioToMC->GetYaxis()->SetRangeUser(0.6, 1.6);
      hYieldCorrectedTotalRatioToMC->GetYaxis()->SetTitleOffset(0.85);
      hYieldCorrectedTotalRatioToMC->Draw("E1");
      
      for (Int_t species = 0; species < AliPID::kSPECIES; species++)
        hYieldCorrectedRatioToMC[species]->Draw("E1 same");
      
      cCorrYieldsRatio->BuildLegend()->SetFillColor(kWhite);
      
      ClearTitleFromHistoInCanvas(cCorrYieldsRatio);
    }
    
    TCanvas* cCorrFractions = new TCanvas(Form("cCorrFractions_%s", titles[type].Data()), "Corrected particleFractions",
                                          0, 300, 900, 900);
    cCorrFractions->SetLogx(1);
    hFractionCorrected[0]->GetYaxis()->SetRangeUser(0., 1.);
    hFractionCorrected[0]->Draw("E1");
    if (hMCgenPrimFraction[0])
      hMCgenPrimFraction[0]->Draw("E1 same");
    
    for (Int_t i = 1; i < AliPID::kSPECIES; i++) {
      hFractionCorrected[i]->Draw("E1 same");
      if (hMCgenPrimFraction[i])
        hMCgenPrimFraction[i]->Draw("E1 same");
    }
    
    cCorrFractions->BuildLegend()->SetFillColor(kWhite);
    
    // Do not include into legend
    for (Int_t i = 0; i < AliPID::kSPECIES; i++)
      hFractionCorrectedSysError[i]->Draw("E2 same");
    
    ClearTitleFromHistoInCanvas(cCorrFractions);
    
    // Save results
    saveFile->cd();
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (hYield[i])
        hYield[i]->Write();
    }
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (hYieldCorrected[i])
        hYieldCorrected[i]->Write();
      
      if (hYieldCorrectedSysError[i])
        hYieldCorrectedSysError[i]->Write();
    }
    
    if (hYieldCorrectedTotal)
      hYieldCorrectedTotal->Write();
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (hMCgenPrimYield[i])
        hMCgenPrimYield[i]->Write();
    }
    
    if (hMCgenPrimYieldTotal)
        hMCgenPrimYieldTotal->Write();
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (hYieldCorrectedRatioToMC[i])
        hYieldCorrectedRatioToMC[i]->Write();
    }
    
    if (hYieldCorrectedTotalRatioToMC)
        hYieldCorrectedTotalRatioToMC->Write();
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (hFractionCorrected[i])
        hFractionCorrected[i]->Write();
      
      if (hFractionCorrectedSysError[i])
        hFractionCorrectedSysError[i]->Write();
    }
    
    for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
      if (hMCgenPrimFraction[i])
        hMCgenPrimFraction[i]->Write();
    }
    
    if (cCorrData)
      cCorrData->Write();
    
    if (cCorrYieldsRatio)
      cCorrYieldsRatio->Write();
    
    if (cCorrFractions)
      cCorrFractions->Write();
  }
  
  saveFile->cd();
  
  TNamed* settings = new TNamed(
      Form("Settings: Efficiency file \"%s\", numJetsForEfficiency file \"%s\", Data file \"%s\", lowerCentrality %.3f, upperCentrality %.3f, lowerJetPt %.1f, upperJetPt %.1f, constantCorrectionAbovePtThreshold %.3f\n",
           pathNameEfficiency.Data(), pathNameDataMC.Data(), pathNameData.Data(), lowerCentrality, upperCentrality, lowerJetPt,
           upperJetPt, constantCorrectionAbovePtThreshold), "");
  settings->Write();
  
  saveFile->Close();
  
  
  return 0;
 calcEfficiency.C:1
 calcEfficiency.C:2
 calcEfficiency.C:3
 calcEfficiency.C:4
 calcEfficiency.C:5
 calcEfficiency.C:6
 calcEfficiency.C:7
 calcEfficiency.C:8
 calcEfficiency.C:9
 calcEfficiency.C:10
 calcEfficiency.C:11
 calcEfficiency.C:12
 calcEfficiency.C:13
 calcEfficiency.C:14
 calcEfficiency.C:15
 calcEfficiency.C:16
 calcEfficiency.C:17
 calcEfficiency.C:18
 calcEfficiency.C:19
 calcEfficiency.C:20
 calcEfficiency.C:21
 calcEfficiency.C:22
 calcEfficiency.C:23
 calcEfficiency.C:24
 calcEfficiency.C:25
 calcEfficiency.C:26
 calcEfficiency.C:27
 calcEfficiency.C:28
 calcEfficiency.C:29
 calcEfficiency.C:30
 calcEfficiency.C:31
 calcEfficiency.C:32
 calcEfficiency.C:33
 calcEfficiency.C:34
 calcEfficiency.C:35
 calcEfficiency.C:36
 calcEfficiency.C:37
 calcEfficiency.C:38
 calcEfficiency.C:39
 calcEfficiency.C:40
 calcEfficiency.C:41
 calcEfficiency.C:42
 calcEfficiency.C:43
 calcEfficiency.C:44
 calcEfficiency.C:45
 calcEfficiency.C:46
 calcEfficiency.C:47
 calcEfficiency.C:48
 calcEfficiency.C:49
 calcEfficiency.C:50
 calcEfficiency.C:51
 calcEfficiency.C:52
 calcEfficiency.C:53
 calcEfficiency.C:54
 calcEfficiency.C:55
 calcEfficiency.C:56
 calcEfficiency.C:57
 calcEfficiency.C:58
 calcEfficiency.C:59
 calcEfficiency.C:60
 calcEfficiency.C:61
 calcEfficiency.C:62
 calcEfficiency.C:63
 calcEfficiency.C:64
 calcEfficiency.C:65
 calcEfficiency.C:66
 calcEfficiency.C:67
 calcEfficiency.C:68
 calcEfficiency.C:69
 calcEfficiency.C:70
 calcEfficiency.C:71
 calcEfficiency.C:72
 calcEfficiency.C:73
 calcEfficiency.C:74
 calcEfficiency.C:75
 calcEfficiency.C:76
 calcEfficiency.C:77
 calcEfficiency.C:78
 calcEfficiency.C:79
 calcEfficiency.C:80
 calcEfficiency.C:81
 calcEfficiency.C:82
 calcEfficiency.C:83
 calcEfficiency.C:84
 calcEfficiency.C:85
 calcEfficiency.C:86
 calcEfficiency.C:87
 calcEfficiency.C:88
 calcEfficiency.C:89
 calcEfficiency.C:90
 calcEfficiency.C:91
 calcEfficiency.C:92
 calcEfficiency.C:93
 calcEfficiency.C:94
 calcEfficiency.C:95
 calcEfficiency.C:96
 calcEfficiency.C:97
 calcEfficiency.C:98
 calcEfficiency.C:99
 calcEfficiency.C:100
 calcEfficiency.C:101
 calcEfficiency.C:102
 calcEfficiency.C:103
 calcEfficiency.C:104
 calcEfficiency.C:105
 calcEfficiency.C:106
 calcEfficiency.C:107
 calcEfficiency.C:108
 calcEfficiency.C:109
 calcEfficiency.C:110
 calcEfficiency.C:111
 calcEfficiency.C:112
 calcEfficiency.C:113
 calcEfficiency.C:114
 calcEfficiency.C:115
 calcEfficiency.C:116
 calcEfficiency.C:117
 calcEfficiency.C:118
 calcEfficiency.C:119
 calcEfficiency.C:120
 calcEfficiency.C:121
 calcEfficiency.C:122
 calcEfficiency.C:123
 calcEfficiency.C:124
 calcEfficiency.C:125
 calcEfficiency.C:126
 calcEfficiency.C:127
 calcEfficiency.C:128
 calcEfficiency.C:129
 calcEfficiency.C:130
 calcEfficiency.C:131
 calcEfficiency.C:132
 calcEfficiency.C:133
 calcEfficiency.C:134
 calcEfficiency.C:135
 calcEfficiency.C:136
 calcEfficiency.C:137
 calcEfficiency.C:138
 calcEfficiency.C:139
 calcEfficiency.C:140
 calcEfficiency.C:141
 calcEfficiency.C:142
 calcEfficiency.C:143
 calcEfficiency.C:144
 calcEfficiency.C:145
 calcEfficiency.C:146
 calcEfficiency.C:147
 calcEfficiency.C:148
 calcEfficiency.C:149
 calcEfficiency.C:150
 calcEfficiency.C:151
 calcEfficiency.C:152
 calcEfficiency.C:153
 calcEfficiency.C:154
 calcEfficiency.C:155
 calcEfficiency.C:156
 calcEfficiency.C:157
 calcEfficiency.C:158
 calcEfficiency.C:159
 calcEfficiency.C:160
 calcEfficiency.C:161
 calcEfficiency.C:162
 calcEfficiency.C:163
 calcEfficiency.C:164
 calcEfficiency.C:165
 calcEfficiency.C:166
 calcEfficiency.C:167
 calcEfficiency.C:168
 calcEfficiency.C:169
 calcEfficiency.C:170
 calcEfficiency.C:171
 calcEfficiency.C:172
 calcEfficiency.C:173
 calcEfficiency.C:174
 calcEfficiency.C:175
 calcEfficiency.C:176
 calcEfficiency.C:177
 calcEfficiency.C:178
 calcEfficiency.C:179
 calcEfficiency.C:180
 calcEfficiency.C:181
 calcEfficiency.C:182
 calcEfficiency.C:183
 calcEfficiency.C:184
 calcEfficiency.C:185
 calcEfficiency.C:186
 calcEfficiency.C:187
 calcEfficiency.C:188
 calcEfficiency.C:189
 calcEfficiency.C:190
 calcEfficiency.C:191
 calcEfficiency.C:192
 calcEfficiency.C:193
 calcEfficiency.C:194
 calcEfficiency.C:195
 calcEfficiency.C:196
 calcEfficiency.C:197
 calcEfficiency.C:198
 calcEfficiency.C:199
 calcEfficiency.C:200
 calcEfficiency.C:201
 calcEfficiency.C:202
 calcEfficiency.C:203
 calcEfficiency.C:204
 calcEfficiency.C:205
 calcEfficiency.C:206
 calcEfficiency.C:207
 calcEfficiency.C:208
 calcEfficiency.C:209
 calcEfficiency.C:210
 calcEfficiency.C:211
 calcEfficiency.C:212
 calcEfficiency.C:213
 calcEfficiency.C:214
 calcEfficiency.C:215
 calcEfficiency.C:216
 calcEfficiency.C:217
 calcEfficiency.C:218
 calcEfficiency.C:219
 calcEfficiency.C:220
 calcEfficiency.C:221
 calcEfficiency.C:222
 calcEfficiency.C:223
 calcEfficiency.C:224
 calcEfficiency.C:225
 calcEfficiency.C:226
 calcEfficiency.C:227
 calcEfficiency.C:228
 calcEfficiency.C:229
 calcEfficiency.C:230
 calcEfficiency.C:231
 calcEfficiency.C:232
 calcEfficiency.C:233
 calcEfficiency.C:234
 calcEfficiency.C:235
 calcEfficiency.C:236
 calcEfficiency.C:237
 calcEfficiency.C:238
 calcEfficiency.C:239
 calcEfficiency.C:240
 calcEfficiency.C:241
 calcEfficiency.C:242
 calcEfficiency.C:243
 calcEfficiency.C:244
 calcEfficiency.C:245
 calcEfficiency.C:246
 calcEfficiency.C:247
 calcEfficiency.C:248
 calcEfficiency.C:249
 calcEfficiency.C:250
 calcEfficiency.C:251
 calcEfficiency.C:252
 calcEfficiency.C:253
 calcEfficiency.C:254
 calcEfficiency.C:255
 calcEfficiency.C:256
 calcEfficiency.C:257
 calcEfficiency.C:258
 calcEfficiency.C:259
 calcEfficiency.C:260
 calcEfficiency.C:261
 calcEfficiency.C:262
 calcEfficiency.C:263
 calcEfficiency.C:264
 calcEfficiency.C:265
 calcEfficiency.C:266
 calcEfficiency.C:267
 calcEfficiency.C:268
 calcEfficiency.C:269
 calcEfficiency.C:270
 calcEfficiency.C:271
 calcEfficiency.C:272
 calcEfficiency.C:273
 calcEfficiency.C:274
 calcEfficiency.C:275
 calcEfficiency.C:276
 calcEfficiency.C:277
 calcEfficiency.C:278
 calcEfficiency.C:279
 calcEfficiency.C:280
 calcEfficiency.C:281
 calcEfficiency.C:282
 calcEfficiency.C:283
 calcEfficiency.C:284
 calcEfficiency.C:285
 calcEfficiency.C:286
 calcEfficiency.C:287
 calcEfficiency.C:288
 calcEfficiency.C:289
 calcEfficiency.C:290
 calcEfficiency.C:291
 calcEfficiency.C:292
 calcEfficiency.C:293
 calcEfficiency.C:294
 calcEfficiency.C:295
 calcEfficiency.C:296
 calcEfficiency.C:297
 calcEfficiency.C:298
 calcEfficiency.C:299
 calcEfficiency.C:300
 calcEfficiency.C:301
 calcEfficiency.C:302
 calcEfficiency.C:303
 calcEfficiency.C:304
 calcEfficiency.C:305
 calcEfficiency.C:306
 calcEfficiency.C:307
 calcEfficiency.C:308
 calcEfficiency.C:309
 calcEfficiency.C:310
 calcEfficiency.C:311
 calcEfficiency.C:312
 calcEfficiency.C:313
 calcEfficiency.C:314
 calcEfficiency.C:315
 calcEfficiency.C:316
 calcEfficiency.C:317
 calcEfficiency.C:318
 calcEfficiency.C:319
 calcEfficiency.C:320
 calcEfficiency.C:321
 calcEfficiency.C:322
 calcEfficiency.C:323
 calcEfficiency.C:324
 calcEfficiency.C:325
 calcEfficiency.C:326
 calcEfficiency.C:327
 calcEfficiency.C:328
 calcEfficiency.C:329
 calcEfficiency.C:330
 calcEfficiency.C:331
 calcEfficiency.C:332
 calcEfficiency.C:333
 calcEfficiency.C:334
 calcEfficiency.C:335
 calcEfficiency.C:336
 calcEfficiency.C:337
 calcEfficiency.C:338
 calcEfficiency.C:339
 calcEfficiency.C:340
 calcEfficiency.C:341
 calcEfficiency.C:342
 calcEfficiency.C:343
 calcEfficiency.C:344
 calcEfficiency.C:345
 calcEfficiency.C:346
 calcEfficiency.C:347
 calcEfficiency.C:348
 calcEfficiency.C:349
 calcEfficiency.C:350
 calcEfficiency.C:351
 calcEfficiency.C:352
 calcEfficiency.C:353
 calcEfficiency.C:354
 calcEfficiency.C:355
 calcEfficiency.C:356
 calcEfficiency.C:357
 calcEfficiency.C:358
 calcEfficiency.C:359
 calcEfficiency.C:360
 calcEfficiency.C:361
 calcEfficiency.C:362
 calcEfficiency.C:363
 calcEfficiency.C:364
 calcEfficiency.C:365
 calcEfficiency.C:366
 calcEfficiency.C:367
 calcEfficiency.C:368
 calcEfficiency.C:369
 calcEfficiency.C:370
 calcEfficiency.C:371
 calcEfficiency.C:372
 calcEfficiency.C:373
 calcEfficiency.C:374
 calcEfficiency.C:375
 calcEfficiency.C:376
 calcEfficiency.C:377
 calcEfficiency.C:378
 calcEfficiency.C:379
 calcEfficiency.C:380
 calcEfficiency.C:381
 calcEfficiency.C:382
 calcEfficiency.C:383
 calcEfficiency.C:384
 calcEfficiency.C:385
 calcEfficiency.C:386
 calcEfficiency.C:387
 calcEfficiency.C:388
 calcEfficiency.C:389
 calcEfficiency.C:390
 calcEfficiency.C:391
 calcEfficiency.C:392
 calcEfficiency.C:393
 calcEfficiency.C:394
 calcEfficiency.C:395
 calcEfficiency.C:396
 calcEfficiency.C:397
 calcEfficiency.C:398
 calcEfficiency.C:399
 calcEfficiency.C:400
 calcEfficiency.C:401
 calcEfficiency.C:402
 calcEfficiency.C:403
 calcEfficiency.C:404
 calcEfficiency.C:405
 calcEfficiency.C:406
 calcEfficiency.C:407
 calcEfficiency.C:408
 calcEfficiency.C:409
 calcEfficiency.C:410
 calcEfficiency.C:411
 calcEfficiency.C:412
 calcEfficiency.C:413
 calcEfficiency.C:414
 calcEfficiency.C:415
 calcEfficiency.C:416
 calcEfficiency.C:417
 calcEfficiency.C:418
 calcEfficiency.C:419
 calcEfficiency.C:420
 calcEfficiency.C:421
 calcEfficiency.C:422
 calcEfficiency.C:423
 calcEfficiency.C:424
 calcEfficiency.C:425
 calcEfficiency.C:426
 calcEfficiency.C:427
 calcEfficiency.C:428
 calcEfficiency.C:429
 calcEfficiency.C:430
 calcEfficiency.C:431
 calcEfficiency.C:432
 calcEfficiency.C:433
 calcEfficiency.C:434
 calcEfficiency.C:435
 calcEfficiency.C:436
 calcEfficiency.C:437
 calcEfficiency.C:438
 calcEfficiency.C:439
 calcEfficiency.C:440
 calcEfficiency.C:441
 calcEfficiency.C:442
 calcEfficiency.C:443
 calcEfficiency.C:444
 calcEfficiency.C:445
 calcEfficiency.C:446
 calcEfficiency.C:447
 calcEfficiency.C:448
 calcEfficiency.C:449
 calcEfficiency.C:450
 calcEfficiency.C:451
 calcEfficiency.C:452
 calcEfficiency.C:453
 calcEfficiency.C:454
 calcEfficiency.C:455
 calcEfficiency.C:456
 calcEfficiency.C:457
 calcEfficiency.C:458
 calcEfficiency.C:459
 calcEfficiency.C:460
 calcEfficiency.C:461
 calcEfficiency.C:462
 calcEfficiency.C:463
 calcEfficiency.C:464
 calcEfficiency.C:465
 calcEfficiency.C:466
 calcEfficiency.C:467
 calcEfficiency.C:468
 calcEfficiency.C:469
 calcEfficiency.C:470
 calcEfficiency.C:471
 calcEfficiency.C:472
 calcEfficiency.C:473
 calcEfficiency.C:474
 calcEfficiency.C:475
 calcEfficiency.C:476
 calcEfficiency.C:477
 calcEfficiency.C:478
 calcEfficiency.C:479
 calcEfficiency.C:480
 calcEfficiency.C:481
 calcEfficiency.C:482
 calcEfficiency.C:483
 calcEfficiency.C:484
 calcEfficiency.C:485
 calcEfficiency.C:486
 calcEfficiency.C:487
 calcEfficiency.C:488
 calcEfficiency.C:489
 calcEfficiency.C:490
 calcEfficiency.C:491
 calcEfficiency.C:492
 calcEfficiency.C:493
 calcEfficiency.C:494
 calcEfficiency.C:495
 calcEfficiency.C:496
 calcEfficiency.C:497
 calcEfficiency.C:498
 calcEfficiency.C:499
 calcEfficiency.C:500
 calcEfficiency.C:501
 calcEfficiency.C:502
 calcEfficiency.C:503
 calcEfficiency.C:504
 calcEfficiency.C:505
 calcEfficiency.C:506
 calcEfficiency.C:507
 calcEfficiency.C:508
 calcEfficiency.C:509
 calcEfficiency.C:510
 calcEfficiency.C:511
 calcEfficiency.C:512
 calcEfficiency.C:513
 calcEfficiency.C:514
 calcEfficiency.C:515
 calcEfficiency.C:516
 calcEfficiency.C:517
 calcEfficiency.C:518
 calcEfficiency.C:519
 calcEfficiency.C:520
 calcEfficiency.C:521
 calcEfficiency.C:522
 calcEfficiency.C:523
 calcEfficiency.C:524
 calcEfficiency.C:525
 calcEfficiency.C:526
 calcEfficiency.C:527
 calcEfficiency.C:528
 calcEfficiency.C:529
 calcEfficiency.C:530
 calcEfficiency.C:531
 calcEfficiency.C:532
 calcEfficiency.C:533
 calcEfficiency.C:534
 calcEfficiency.C:535
 calcEfficiency.C:536
 calcEfficiency.C:537
 calcEfficiency.C:538
 calcEfficiency.C:539
 calcEfficiency.C:540
 calcEfficiency.C:541
 calcEfficiency.C:542
 calcEfficiency.C:543
 calcEfficiency.C:544
 calcEfficiency.C:545
 calcEfficiency.C:546
 calcEfficiency.C:547
 calcEfficiency.C:548
 calcEfficiency.C:549
 calcEfficiency.C:550
 calcEfficiency.C:551
 calcEfficiency.C:552
 calcEfficiency.C:553
 calcEfficiency.C:554
 calcEfficiency.C:555
 calcEfficiency.C:556
 calcEfficiency.C:557
 calcEfficiency.C:558
 calcEfficiency.C:559
 calcEfficiency.C:560
 calcEfficiency.C:561
 calcEfficiency.C:562
 calcEfficiency.C:563
 calcEfficiency.C:564
 calcEfficiency.C:565
 calcEfficiency.C:566
 calcEfficiency.C:567
 calcEfficiency.C:568
 calcEfficiency.C:569
 calcEfficiency.C:570
 calcEfficiency.C:571
 calcEfficiency.C:572
 calcEfficiency.C:573
 calcEfficiency.C:574
 calcEfficiency.C:575
 calcEfficiency.C:576
 calcEfficiency.C:577
 calcEfficiency.C:578
 calcEfficiency.C:579
 calcEfficiency.C:580
 calcEfficiency.C:581
 calcEfficiency.C:582
 calcEfficiency.C:583
 calcEfficiency.C:584
 calcEfficiency.C:585
 calcEfficiency.C:586
 calcEfficiency.C:587
 calcEfficiency.C:588
 calcEfficiency.C:589
 calcEfficiency.C:590
 calcEfficiency.C:591
 calcEfficiency.C:592
 calcEfficiency.C:593
 calcEfficiency.C:594
 calcEfficiency.C:595
 calcEfficiency.C:596
 calcEfficiency.C:597
 calcEfficiency.C:598
 calcEfficiency.C:599
 calcEfficiency.C:600
 calcEfficiency.C:601
 calcEfficiency.C:602
 calcEfficiency.C:603
 calcEfficiency.C:604
 calcEfficiency.C:605
 calcEfficiency.C:606
 calcEfficiency.C:607
 calcEfficiency.C:608
 calcEfficiency.C:609
 calcEfficiency.C:610
 calcEfficiency.C:611
 calcEfficiency.C:612
 calcEfficiency.C:613
 calcEfficiency.C:614
 calcEfficiency.C:615
 calcEfficiency.C:616
 calcEfficiency.C:617
 calcEfficiency.C:618
 calcEfficiency.C:619
 calcEfficiency.C:620
 calcEfficiency.C:621
 calcEfficiency.C:622
 calcEfficiency.C:623
 calcEfficiency.C:624
 calcEfficiency.C:625
 calcEfficiency.C:626
 calcEfficiency.C:627
 calcEfficiency.C:628
 calcEfficiency.C:629
 calcEfficiency.C:630
 calcEfficiency.C:631
 calcEfficiency.C:632
 calcEfficiency.C:633
 calcEfficiency.C:634
 calcEfficiency.C:635
 calcEfficiency.C:636
 calcEfficiency.C:637
 calcEfficiency.C:638
 calcEfficiency.C:639
 calcEfficiency.C:640
 calcEfficiency.C:641
 calcEfficiency.C:642
 calcEfficiency.C:643
 calcEfficiency.C:644
 calcEfficiency.C:645
 calcEfficiency.C:646
 calcEfficiency.C:647
 calcEfficiency.C:648
 calcEfficiency.C:649
 calcEfficiency.C:650
 calcEfficiency.C:651
 calcEfficiency.C:652
 calcEfficiency.C:653
 calcEfficiency.C:654
 calcEfficiency.C:655
 calcEfficiency.C:656
 calcEfficiency.C:657
 calcEfficiency.C:658
 calcEfficiency.C:659
 calcEfficiency.C:660
 calcEfficiency.C:661
 calcEfficiency.C:662
 calcEfficiency.C:663
 calcEfficiency.C:664
 calcEfficiency.C:665
 calcEfficiency.C:666
 calcEfficiency.C:667
 calcEfficiency.C:668
 calcEfficiency.C:669
 calcEfficiency.C:670
 calcEfficiency.C:671
 calcEfficiency.C:672
 calcEfficiency.C:673
 calcEfficiency.C:674
 calcEfficiency.C:675
 calcEfficiency.C:676
 calcEfficiency.C:677
 calcEfficiency.C:678
 calcEfficiency.C:679
 calcEfficiency.C:680
 calcEfficiency.C:681
 calcEfficiency.C:682
 calcEfficiency.C:683
 calcEfficiency.C:684
 calcEfficiency.C:685
 calcEfficiency.C:686
 calcEfficiency.C:687
 calcEfficiency.C:688
 calcEfficiency.C:689
 calcEfficiency.C:690
 calcEfficiency.C:691
 calcEfficiency.C:692
 calcEfficiency.C:693
 calcEfficiency.C:694
 calcEfficiency.C:695
 calcEfficiency.C:696
 calcEfficiency.C:697
 calcEfficiency.C:698
 calcEfficiency.C:699
 calcEfficiency.C:700
 calcEfficiency.C:701
 calcEfficiency.C:702
 calcEfficiency.C:703
 calcEfficiency.C:704
 calcEfficiency.C:705
 calcEfficiency.C:706
 calcEfficiency.C:707
 calcEfficiency.C:708
 calcEfficiency.C:709
 calcEfficiency.C:710
 calcEfficiency.C:711
 calcEfficiency.C:712
 calcEfficiency.C:713
 calcEfficiency.C:714
 calcEfficiency.C:715
 calcEfficiency.C:716
 calcEfficiency.C:717
 calcEfficiency.C:718
 calcEfficiency.C:719
 calcEfficiency.C:720
 calcEfficiency.C:721
 calcEfficiency.C:722
 calcEfficiency.C:723
 calcEfficiency.C:724
 calcEfficiency.C:725
 calcEfficiency.C:726
 calcEfficiency.C:727
 calcEfficiency.C:728
 calcEfficiency.C:729
 calcEfficiency.C:730
 calcEfficiency.C:731
 calcEfficiency.C:732
 calcEfficiency.C:733
 calcEfficiency.C:734
 calcEfficiency.C:735
 calcEfficiency.C:736
 calcEfficiency.C:737
 calcEfficiency.C:738
 calcEfficiency.C:739
 calcEfficiency.C:740
 calcEfficiency.C:741
 calcEfficiency.C:742
 calcEfficiency.C:743
 calcEfficiency.C:744
 calcEfficiency.C:745
 calcEfficiency.C:746
 calcEfficiency.C:747
 calcEfficiency.C:748
 calcEfficiency.C:749
 calcEfficiency.C:750
 calcEfficiency.C:751
 calcEfficiency.C:752
 calcEfficiency.C:753
 calcEfficiency.C:754
 calcEfficiency.C:755
 calcEfficiency.C:756
 calcEfficiency.C:757
 calcEfficiency.C:758
 calcEfficiency.C:759
 calcEfficiency.C:760
 calcEfficiency.C:761
 calcEfficiency.C:762
 calcEfficiency.C:763
 calcEfficiency.C:764
 calcEfficiency.C:765
 calcEfficiency.C:766
 calcEfficiency.C:767
 calcEfficiency.C:768
 calcEfficiency.C:769
 calcEfficiency.C:770
 calcEfficiency.C:771
 calcEfficiency.C:772
 calcEfficiency.C:773
 calcEfficiency.C:774
 calcEfficiency.C:775
 calcEfficiency.C:776
 calcEfficiency.C:777
 calcEfficiency.C:778
 calcEfficiency.C:779
 calcEfficiency.C:780
 calcEfficiency.C:781
 calcEfficiency.C:782
 calcEfficiency.C:783
 calcEfficiency.C:784
 calcEfficiency.C:785
 calcEfficiency.C:786
 calcEfficiency.C:787
 calcEfficiency.C:788
 calcEfficiency.C:789
 calcEfficiency.C:790
 calcEfficiency.C:791
 calcEfficiency.C:792
 calcEfficiency.C:793
 calcEfficiency.C:794
 calcEfficiency.C:795
 calcEfficiency.C:796
 calcEfficiency.C:797
 calcEfficiency.C:798
 calcEfficiency.C:799
 calcEfficiency.C:800
 calcEfficiency.C:801
 calcEfficiency.C:802
 calcEfficiency.C:803
 calcEfficiency.C:804
 calcEfficiency.C:805
 calcEfficiency.C:806
 calcEfficiency.C:807
 calcEfficiency.C:808
 calcEfficiency.C:809
 calcEfficiency.C:810
 calcEfficiency.C:811
 calcEfficiency.C:812
 calcEfficiency.C:813
 calcEfficiency.C:814
 calcEfficiency.C:815
 calcEfficiency.C:816
 calcEfficiency.C:817
 calcEfficiency.C:818
 calcEfficiency.C:819
 calcEfficiency.C:820
 calcEfficiency.C:821
 calcEfficiency.C:822
 calcEfficiency.C:823
 calcEfficiency.C:824
 calcEfficiency.C:825
 calcEfficiency.C:826
 calcEfficiency.C:827
 calcEfficiency.C:828
 calcEfficiency.C:829
 calcEfficiency.C:830
 calcEfficiency.C:831
 calcEfficiency.C:832
 calcEfficiency.C:833
 calcEfficiency.C:834
 calcEfficiency.C:835
 calcEfficiency.C:836
 calcEfficiency.C:837
 calcEfficiency.C:838
 calcEfficiency.C:839
 calcEfficiency.C:840
 calcEfficiency.C:841
 calcEfficiency.C:842
 calcEfficiency.C:843
 calcEfficiency.C:844
 calcEfficiency.C:845
 calcEfficiency.C:846
 calcEfficiency.C:847
 calcEfficiency.C:848
 calcEfficiency.C:849
 calcEfficiency.C:850
 calcEfficiency.C:851
 calcEfficiency.C:852
 calcEfficiency.C:853
 calcEfficiency.C:854
 calcEfficiency.C:855
 calcEfficiency.C:856
 calcEfficiency.C:857
 calcEfficiency.C:858
 calcEfficiency.C:859
 calcEfficiency.C:860
 calcEfficiency.C:861
 calcEfficiency.C:862
 calcEfficiency.C:863
 calcEfficiency.C:864
 calcEfficiency.C:865
 calcEfficiency.C:866
 calcEfficiency.C:867
 calcEfficiency.C:868
 calcEfficiency.C:869
 calcEfficiency.C:870
 calcEfficiency.C:871
 calcEfficiency.C:872
 calcEfficiency.C:873
 calcEfficiency.C:874
 calcEfficiency.C:875
 calcEfficiency.C:876
 calcEfficiency.C:877
 calcEfficiency.C:878
 calcEfficiency.C:879
 calcEfficiency.C:880
 calcEfficiency.C:881
 calcEfficiency.C:882
 calcEfficiency.C:883
 calcEfficiency.C:884
 calcEfficiency.C:885
 calcEfficiency.C:886
 calcEfficiency.C:887
 calcEfficiency.C:888
 calcEfficiency.C:889
 calcEfficiency.C:890
 calcEfficiency.C:891
 calcEfficiency.C:892
 calcEfficiency.C:893
 calcEfficiency.C:894
 calcEfficiency.C:895
 calcEfficiency.C:896
 calcEfficiency.C:897
 calcEfficiency.C:898
 calcEfficiency.C:899
 calcEfficiency.C:900
 calcEfficiency.C:901
 calcEfficiency.C:902
 calcEfficiency.C:903
 calcEfficiency.C:904
 calcEfficiency.C:905
 calcEfficiency.C:906
 calcEfficiency.C:907
 calcEfficiency.C:908
 calcEfficiency.C:909
 calcEfficiency.C:910
 calcEfficiency.C:911
 calcEfficiency.C:912
 calcEfficiency.C:913
 calcEfficiency.C:914
 calcEfficiency.C:915
 calcEfficiency.C:916
 calcEfficiency.C:917
 calcEfficiency.C:918
 calcEfficiency.C:919
 calcEfficiency.C:920
 calcEfficiency.C:921
 calcEfficiency.C:922
 calcEfficiency.C:923
 calcEfficiency.C:924
 calcEfficiency.C:925
 calcEfficiency.C:926
 calcEfficiency.C:927
 calcEfficiency.C:928
 calcEfficiency.C:929
 calcEfficiency.C:930
 calcEfficiency.C:931
 calcEfficiency.C:932
 calcEfficiency.C:933
 calcEfficiency.C:934
 calcEfficiency.C:935
 calcEfficiency.C:936
 calcEfficiency.C:937
 calcEfficiency.C:938
 calcEfficiency.C:939
 calcEfficiency.C:940
 calcEfficiency.C:941
 calcEfficiency.C:942
 calcEfficiency.C:943
 calcEfficiency.C:944
 calcEfficiency.C:945
 calcEfficiency.C:946
 calcEfficiency.C:947
 calcEfficiency.C:948
 calcEfficiency.C:949
 calcEfficiency.C:950
 calcEfficiency.C:951
 calcEfficiency.C:952
 calcEfficiency.C:953
 calcEfficiency.C:954
 calcEfficiency.C:955
 calcEfficiency.C:956
 calcEfficiency.C:957
 calcEfficiency.C:958
 calcEfficiency.C:959
 calcEfficiency.C:960
 calcEfficiency.C:961
 calcEfficiency.C:962
 calcEfficiency.C:963
 calcEfficiency.C:964
 calcEfficiency.C:965
 calcEfficiency.C:966
 calcEfficiency.C:967
 calcEfficiency.C:968
 calcEfficiency.C:969
 calcEfficiency.C:970
 calcEfficiency.C:971
 calcEfficiency.C:972
 calcEfficiency.C:973
 calcEfficiency.C:974
 calcEfficiency.C:975
 calcEfficiency.C:976
 calcEfficiency.C:977
 calcEfficiency.C:978
 calcEfficiency.C:979
 calcEfficiency.C:980
 calcEfficiency.C:981
 calcEfficiency.C:982
 calcEfficiency.C:983
 calcEfficiency.C:984
 calcEfficiency.C:985
 calcEfficiency.C:986
 calcEfficiency.C:987
 calcEfficiency.C:988
 calcEfficiency.C:989
 calcEfficiency.C:990
 calcEfficiency.C:991
 calcEfficiency.C:992
 calcEfficiency.C:993
 calcEfficiency.C:994
 calcEfficiency.C:995
 calcEfficiency.C:996
 calcEfficiency.C:997
 calcEfficiency.C:998
 calcEfficiency.C:999
 calcEfficiency.C:1000
 calcEfficiency.C:1001
 calcEfficiency.C:1002
 calcEfficiency.C:1003
 calcEfficiency.C:1004
 calcEfficiency.C:1005
 calcEfficiency.C:1006
 calcEfficiency.C:1007
 calcEfficiency.C:1008
 calcEfficiency.C:1009
 calcEfficiency.C:1010
 calcEfficiency.C:1011
 calcEfficiency.C:1012
 calcEfficiency.C:1013
 calcEfficiency.C:1014
 calcEfficiency.C:1015
 calcEfficiency.C:1016
 calcEfficiency.C:1017
 calcEfficiency.C:1018
 calcEfficiency.C:1019
 calcEfficiency.C:1020
 calcEfficiency.C:1021
 calcEfficiency.C:1022
 calcEfficiency.C:1023
 calcEfficiency.C:1024
 calcEfficiency.C:1025
 calcEfficiency.C:1026
 calcEfficiency.C:1027
 calcEfficiency.C:1028
 calcEfficiency.C:1029
 calcEfficiency.C:1030
 calcEfficiency.C:1031
 calcEfficiency.C:1032
 calcEfficiency.C:1033
 calcEfficiency.C:1034
 calcEfficiency.C:1035
 calcEfficiency.C:1036
 calcEfficiency.C:1037
 calcEfficiency.C:1038
 calcEfficiency.C:1039
 calcEfficiency.C:1040
 calcEfficiency.C:1041
 calcEfficiency.C:1042
 calcEfficiency.C:1043
 calcEfficiency.C:1044
 calcEfficiency.C:1045
 calcEfficiency.C:1046
 calcEfficiency.C:1047
 calcEfficiency.C:1048
 calcEfficiency.C:1049
 calcEfficiency.C:1050
 calcEfficiency.C:1051
 calcEfficiency.C:1052
 calcEfficiency.C:1053
 calcEfficiency.C:1054
 calcEfficiency.C:1055
 calcEfficiency.C:1056
 calcEfficiency.C:1057
 calcEfficiency.C:1058
 calcEfficiency.C:1059
 calcEfficiency.C:1060
 calcEfficiency.C:1061
 calcEfficiency.C:1062
 calcEfficiency.C:1063
 calcEfficiency.C:1064
 calcEfficiency.C:1065
 calcEfficiency.C:1066
 calcEfficiency.C:1067
 calcEfficiency.C:1068
 calcEfficiency.C:1069
 calcEfficiency.C:1070
 calcEfficiency.C:1071
 calcEfficiency.C:1072
 calcEfficiency.C:1073
 calcEfficiency.C:1074
 calcEfficiency.C:1075
 calcEfficiency.C:1076
 calcEfficiency.C:1077
 calcEfficiency.C:1078
 calcEfficiency.C:1079
 calcEfficiency.C:1080
 calcEfficiency.C:1081
 calcEfficiency.C:1082
 calcEfficiency.C:1083
 calcEfficiency.C:1084
 calcEfficiency.C:1085
 calcEfficiency.C:1086
 calcEfficiency.C:1087
 calcEfficiency.C:1088
 calcEfficiency.C:1089
 calcEfficiency.C:1090
 calcEfficiency.C:1091
 calcEfficiency.C:1092
 calcEfficiency.C:1093
 calcEfficiency.C:1094
 calcEfficiency.C:1095
 calcEfficiency.C:1096
 calcEfficiency.C:1097
 calcEfficiency.C:1098
 calcEfficiency.C:1099
 calcEfficiency.C:1100
 calcEfficiency.C:1101
 calcEfficiency.C:1102
 calcEfficiency.C:1103
 calcEfficiency.C:1104
 calcEfficiency.C:1105
 calcEfficiency.C:1106
 calcEfficiency.C:1107
 calcEfficiency.C:1108
 calcEfficiency.C:1109
 calcEfficiency.C:1110
 calcEfficiency.C:1111
 calcEfficiency.C:1112
 calcEfficiency.C:1113
 calcEfficiency.C:1114
 calcEfficiency.C:1115
 calcEfficiency.C:1116
 calcEfficiency.C:1117
 calcEfficiency.C:1118
 calcEfficiency.C:1119
 calcEfficiency.C:1120
 calcEfficiency.C:1121
 calcEfficiency.C:1122
 calcEfficiency.C:1123
 calcEfficiency.C:1124
 calcEfficiency.C:1125
 calcEfficiency.C:1126
 calcEfficiency.C:1127
 calcEfficiency.C:1128
 calcEfficiency.C:1129
 calcEfficiency.C:1130
 calcEfficiency.C:1131
 calcEfficiency.C:1132
 calcEfficiency.C:1133
 calcEfficiency.C:1134
 calcEfficiency.C:1135
 calcEfficiency.C:1136
 calcEfficiency.C:1137
 calcEfficiency.C:1138
 calcEfficiency.C:1139
 calcEfficiency.C:1140
 calcEfficiency.C:1141
 calcEfficiency.C:1142
 calcEfficiency.C:1143
 calcEfficiency.C:1144
 calcEfficiency.C:1145
 calcEfficiency.C:1146
 calcEfficiency.C:1147
 calcEfficiency.C:1148
 calcEfficiency.C:1149
 calcEfficiency.C:1150
 calcEfficiency.C:1151
 calcEfficiency.C:1152
 calcEfficiency.C:1153
 calcEfficiency.C:1154
 calcEfficiency.C:1155
 calcEfficiency.C:1156
 calcEfficiency.C:1157
 calcEfficiency.C:1158
 calcEfficiency.C:1159
 calcEfficiency.C:1160
 calcEfficiency.C:1161
 calcEfficiency.C:1162
 calcEfficiency.C:1163
 calcEfficiency.C:1164
 calcEfficiency.C:1165
 calcEfficiency.C:1166
 calcEfficiency.C:1167
 calcEfficiency.C:1168
 calcEfficiency.C:1169
 calcEfficiency.C:1170
 calcEfficiency.C:1171
 calcEfficiency.C:1172
 calcEfficiency.C:1173
 calcEfficiency.C:1174
 calcEfficiency.C:1175
 calcEfficiency.C:1176
 calcEfficiency.C:1177
 calcEfficiency.C:1178
 calcEfficiency.C:1179
 calcEfficiency.C:1180
 calcEfficiency.C:1181
 calcEfficiency.C:1182
 calcEfficiency.C:1183
 calcEfficiency.C:1184
 calcEfficiency.C:1185
 calcEfficiency.C:1186
 calcEfficiency.C:1187
 calcEfficiency.C:1188
 calcEfficiency.C:1189
 calcEfficiency.C:1190
 calcEfficiency.C:1191
 calcEfficiency.C:1192
 calcEfficiency.C:1193
 calcEfficiency.C:1194
 calcEfficiency.C:1195
 calcEfficiency.C:1196
 calcEfficiency.C:1197
 calcEfficiency.C:1198
 calcEfficiency.C:1199
 calcEfficiency.C:1200
 calcEfficiency.C:1201
 calcEfficiency.C:1202
 calcEfficiency.C:1203
 calcEfficiency.C:1204
 calcEfficiency.C:1205
 calcEfficiency.C:1206
 calcEfficiency.C:1207
 calcEfficiency.C:1208
 calcEfficiency.C:1209
 calcEfficiency.C:1210
 calcEfficiency.C:1211
 calcEfficiency.C:1212
 calcEfficiency.C:1213
 calcEfficiency.C:1214
 calcEfficiency.C:1215
 calcEfficiency.C:1216
 calcEfficiency.C:1217
 calcEfficiency.C:1218
 calcEfficiency.C:1219
 calcEfficiency.C:1220
 calcEfficiency.C:1221
 calcEfficiency.C:1222
 calcEfficiency.C:1223
 calcEfficiency.C:1224
 calcEfficiency.C:1225
 calcEfficiency.C:1226
 calcEfficiency.C:1227
 calcEfficiency.C:1228
 calcEfficiency.C:1229
 calcEfficiency.C:1230
 calcEfficiency.C:1231
 calcEfficiency.C:1232
 calcEfficiency.C:1233
 calcEfficiency.C:1234
 calcEfficiency.C:1235
 calcEfficiency.C:1236
 calcEfficiency.C:1237
 calcEfficiency.C:1238
 calcEfficiency.C:1239
 calcEfficiency.C:1240
 calcEfficiency.C:1241
 calcEfficiency.C:1242
 calcEfficiency.C:1243
 calcEfficiency.C:1244
 calcEfficiency.C:1245
 calcEfficiency.C:1246
 calcEfficiency.C:1247
 calcEfficiency.C:1248
 calcEfficiency.C:1249
 calcEfficiency.C:1250
 calcEfficiency.C:1251
 calcEfficiency.C:1252
 calcEfficiency.C:1253
 calcEfficiency.C:1254
 calcEfficiency.C:1255
 calcEfficiency.C:1256
 calcEfficiency.C:1257
 calcEfficiency.C:1258
 calcEfficiency.C:1259
 calcEfficiency.C:1260
 calcEfficiency.C:1261
 calcEfficiency.C:1262
 calcEfficiency.C:1263
 calcEfficiency.C:1264
 calcEfficiency.C:1265
 calcEfficiency.C:1266
 calcEfficiency.C:1267
 calcEfficiency.C:1268
 calcEfficiency.C:1269
 calcEfficiency.C:1270
 calcEfficiency.C:1271
 calcEfficiency.C:1272
 calcEfficiency.C:1273
 calcEfficiency.C:1274
 calcEfficiency.C:1275
 calcEfficiency.C:1276
 calcEfficiency.C:1277
 calcEfficiency.C:1278
 calcEfficiency.C:1279
 calcEfficiency.C:1280
 calcEfficiency.C:1281
 calcEfficiency.C:1282
 calcEfficiency.C:1283
 calcEfficiency.C:1284
 calcEfficiency.C:1285
 calcEfficiency.C:1286
 calcEfficiency.C:1287
 calcEfficiency.C:1288
 calcEfficiency.C:1289
 calcEfficiency.C:1290
 calcEfficiency.C:1291
 calcEfficiency.C:1292
 calcEfficiency.C:1293
 calcEfficiency.C:1294
 calcEfficiency.C:1295
 calcEfficiency.C:1296
 calcEfficiency.C:1297
 calcEfficiency.C:1298
 calcEfficiency.C:1299
 calcEfficiency.C:1300
 calcEfficiency.C:1301
 calcEfficiency.C:1302
 calcEfficiency.C:1303
 calcEfficiency.C:1304
 calcEfficiency.C:1305
 calcEfficiency.C:1306
 calcEfficiency.C:1307
 calcEfficiency.C:1308
 calcEfficiency.C:1309
 calcEfficiency.C:1310
 calcEfficiency.C:1311
 calcEfficiency.C:1312
 calcEfficiency.C:1313
 calcEfficiency.C:1314
 calcEfficiency.C:1315
 calcEfficiency.C:1316
 calcEfficiency.C:1317
 calcEfficiency.C:1318
 calcEfficiency.C:1319
 calcEfficiency.C:1320
 calcEfficiency.C:1321
 calcEfficiency.C:1322
 calcEfficiency.C:1323
 calcEfficiency.C:1324
 calcEfficiency.C:1325
 calcEfficiency.C:1326
 calcEfficiency.C:1327
 calcEfficiency.C:1328
 calcEfficiency.C:1329
 calcEfficiency.C:1330
 calcEfficiency.C:1331
 calcEfficiency.C:1332
 calcEfficiency.C:1333
 calcEfficiency.C:1334
 calcEfficiency.C:1335
 calcEfficiency.C:1336
 calcEfficiency.C:1337
 calcEfficiency.C:1338
 calcEfficiency.C:1339
 calcEfficiency.C:1340
 calcEfficiency.C:1341
 calcEfficiency.C:1342
 calcEfficiency.C:1343
 calcEfficiency.C:1344
 calcEfficiency.C:1345
 calcEfficiency.C:1346
 calcEfficiency.C:1347
 calcEfficiency.C:1348
 calcEfficiency.C:1349
 calcEfficiency.C:1350
 calcEfficiency.C:1351
 calcEfficiency.C:1352
 calcEfficiency.C:1353
 calcEfficiency.C:1354
 calcEfficiency.C:1355
 calcEfficiency.C:1356
 calcEfficiency.C:1357
 calcEfficiency.C:1358
 calcEfficiency.C:1359
 calcEfficiency.C:1360
 calcEfficiency.C:1361
 calcEfficiency.C:1362
 calcEfficiency.C:1363
 calcEfficiency.C:1364
 calcEfficiency.C:1365
 calcEfficiency.C:1366
 calcEfficiency.C:1367
 calcEfficiency.C:1368
 calcEfficiency.C:1369
 calcEfficiency.C:1370
 calcEfficiency.C:1371
 calcEfficiency.C:1372
 calcEfficiency.C:1373
 calcEfficiency.C:1374
 calcEfficiency.C:1375
 calcEfficiency.C:1376
 calcEfficiency.C:1377
 calcEfficiency.C:1378
 calcEfficiency.C:1379
 calcEfficiency.C:1380
 calcEfficiency.C:1381
 calcEfficiency.C:1382
 calcEfficiency.C:1383
 calcEfficiency.C:1384
 calcEfficiency.C:1385
 calcEfficiency.C:1386
 calcEfficiency.C:1387
 calcEfficiency.C:1388
 calcEfficiency.C:1389
 calcEfficiency.C:1390
 calcEfficiency.C:1391
 calcEfficiency.C:1392
 calcEfficiency.C:1393
 calcEfficiency.C:1394
 calcEfficiency.C:1395
 calcEfficiency.C:1396
 calcEfficiency.C:1397
 calcEfficiency.C:1398
 calcEfficiency.C:1399
 calcEfficiency.C:1400
 calcEfficiency.C:1401
 calcEfficiency.C:1402
 calcEfficiency.C:1403
 calcEfficiency.C:1404
 calcEfficiency.C:1405
 calcEfficiency.C:1406
 calcEfficiency.C:1407
 calcEfficiency.C:1408
 calcEfficiency.C:1409
 calcEfficiency.C:1410
 calcEfficiency.C:1411
 calcEfficiency.C:1412
 calcEfficiency.C:1413
 calcEfficiency.C:1414
 calcEfficiency.C:1415
 calcEfficiency.C:1416
 calcEfficiency.C:1417
 calcEfficiency.C:1418
 calcEfficiency.C:1419
 calcEfficiency.C:1420
 calcEfficiency.C:1421
 calcEfficiency.C:1422
 calcEfficiency.C:1423
 calcEfficiency.C:1424
 calcEfficiency.C:1425
 calcEfficiency.C:1426
 calcEfficiency.C:1427
 calcEfficiency.C:1428
 calcEfficiency.C:1429
 calcEfficiency.C:1430
 calcEfficiency.C:1431
 calcEfficiency.C:1432
 calcEfficiency.C:1433
 calcEfficiency.C:1434
 calcEfficiency.C:1435
 calcEfficiency.C:1436
 calcEfficiency.C:1437
 calcEfficiency.C:1438
 calcEfficiency.C:1439
 calcEfficiency.C:1440
 calcEfficiency.C:1441
 calcEfficiency.C:1442
 calcEfficiency.C:1443
 calcEfficiency.C:1444
 calcEfficiency.C:1445
 calcEfficiency.C:1446
 calcEfficiency.C:1447
 calcEfficiency.C:1448
 calcEfficiency.C:1449
 calcEfficiency.C:1450
 calcEfficiency.C:1451
 calcEfficiency.C:1452
 calcEfficiency.C:1453
 calcEfficiency.C:1454
 calcEfficiency.C:1455
 calcEfficiency.C:1456
 calcEfficiency.C:1457
 calcEfficiency.C:1458
 calcEfficiency.C:1459
 calcEfficiency.C:1460
 calcEfficiency.C:1461
 calcEfficiency.C:1462
 calcEfficiency.C:1463
 calcEfficiency.C:1464
 calcEfficiency.C:1465
 calcEfficiency.C:1466
 calcEfficiency.C:1467
 calcEfficiency.C:1468
 calcEfficiency.C:1469
 calcEfficiency.C:1470
 calcEfficiency.C:1471
 calcEfficiency.C:1472
 calcEfficiency.C:1473
 calcEfficiency.C:1474
 calcEfficiency.C:1475
 calcEfficiency.C:1476
 calcEfficiency.C:1477
 calcEfficiency.C:1478
 calcEfficiency.C:1479
 calcEfficiency.C:1480
 calcEfficiency.C:1481
 calcEfficiency.C:1482
 calcEfficiency.C:1483
 calcEfficiency.C:1484
 calcEfficiency.C:1485
 calcEfficiency.C:1486
 calcEfficiency.C:1487
 calcEfficiency.C:1488
 calcEfficiency.C:1489
 calcEfficiency.C:1490
 calcEfficiency.C:1491
 calcEfficiency.C:1492
 calcEfficiency.C:1493
 calcEfficiency.C:1494
 calcEfficiency.C:1495
 calcEfficiency.C:1496
 calcEfficiency.C:1497
 calcEfficiency.C:1498
 calcEfficiency.C:1499
 calcEfficiency.C:1500
 calcEfficiency.C:1501
 calcEfficiency.C:1502
 calcEfficiency.C:1503
 calcEfficiency.C:1504
 calcEfficiency.C:1505
 calcEfficiency.C:1506
 calcEfficiency.C:1507
 calcEfficiency.C:1508
 calcEfficiency.C:1509
 calcEfficiency.C:1510
 calcEfficiency.C:1511
 calcEfficiency.C:1512
 calcEfficiency.C:1513
 calcEfficiency.C:1514
 calcEfficiency.C:1515
 calcEfficiency.C:1516
 calcEfficiency.C:1517
 calcEfficiency.C:1518
 calcEfficiency.C:1519
 calcEfficiency.C:1520
 calcEfficiency.C:1521
 calcEfficiency.C:1522
 calcEfficiency.C:1523
 calcEfficiency.C:1524
 calcEfficiency.C:1525
 calcEfficiency.C:1526
 calcEfficiency.C:1527
 calcEfficiency.C:1528
 calcEfficiency.C:1529
 calcEfficiency.C:1530
 calcEfficiency.C:1531
 calcEfficiency.C:1532
 calcEfficiency.C:1533
 calcEfficiency.C:1534
 calcEfficiency.C:1535
 calcEfficiency.C:1536
 calcEfficiency.C:1537
 calcEfficiency.C:1538
 calcEfficiency.C:1539
 calcEfficiency.C:1540
 calcEfficiency.C:1541
 calcEfficiency.C:1542
 calcEfficiency.C:1543
 calcEfficiency.C:1544
 calcEfficiency.C:1545
 calcEfficiency.C:1546
 calcEfficiency.C:1547
 calcEfficiency.C:1548
 calcEfficiency.C:1549
 calcEfficiency.C:1550
 calcEfficiency.C:1551
 calcEfficiency.C:1552
 calcEfficiency.C:1553
 calcEfficiency.C:1554
 calcEfficiency.C:1555
 calcEfficiency.C:1556
 calcEfficiency.C:1557
 calcEfficiency.C:1558
 calcEfficiency.C:1559
 calcEfficiency.C:1560
 calcEfficiency.C:1561
 calcEfficiency.C:1562
 calcEfficiency.C:1563
 calcEfficiency.C:1564
 calcEfficiency.C:1565
 calcEfficiency.C:1566
 calcEfficiency.C:1567
 calcEfficiency.C:1568
 calcEfficiency.C:1569
 calcEfficiency.C:1570
 calcEfficiency.C:1571
 calcEfficiency.C:1572
 calcEfficiency.C:1573
 calcEfficiency.C:1574
 calcEfficiency.C:1575
 calcEfficiency.C:1576
 calcEfficiency.C:1577
 calcEfficiency.C:1578
 calcEfficiency.C:1579
 calcEfficiency.C:1580
 calcEfficiency.C:1581
 calcEfficiency.C:1582
 calcEfficiency.C:1583
 calcEfficiency.C:1584
 calcEfficiency.C:1585
 calcEfficiency.C:1586
 calcEfficiency.C:1587
 calcEfficiency.C:1588
 calcEfficiency.C:1589
 calcEfficiency.C:1590
 calcEfficiency.C:1591
 calcEfficiency.C:1592
 calcEfficiency.C:1593
 calcEfficiency.C:1594
 calcEfficiency.C:1595
 calcEfficiency.C:1596
 calcEfficiency.C:1597
 calcEfficiency.C:1598
 calcEfficiency.C:1599
 calcEfficiency.C:1600
 calcEfficiency.C:1601
 calcEfficiency.C:1602
 calcEfficiency.C:1603
 calcEfficiency.C:1604
 calcEfficiency.C:1605
 calcEfficiency.C:1606
 calcEfficiency.C:1607
 calcEfficiency.C:1608
 calcEfficiency.C:1609
 calcEfficiency.C:1610
 calcEfficiency.C:1611
 calcEfficiency.C:1612
 calcEfficiency.C:1613
 calcEfficiency.C:1614
 calcEfficiency.C:1615
 calcEfficiency.C:1616
 calcEfficiency.C:1617
 calcEfficiency.C:1618
 calcEfficiency.C:1619
 calcEfficiency.C:1620
 calcEfficiency.C:1621
 calcEfficiency.C:1622
 calcEfficiency.C:1623
 calcEfficiency.C:1624
 calcEfficiency.C:1625
 calcEfficiency.C:1626
 calcEfficiency.C:1627
 calcEfficiency.C:1628
 calcEfficiency.C:1629
 calcEfficiency.C:1630
 calcEfficiency.C:1631
 calcEfficiency.C:1632
 calcEfficiency.C:1633
 calcEfficiency.C:1634
 calcEfficiency.C:1635
 calcEfficiency.C:1636
 calcEfficiency.C:1637
 calcEfficiency.C:1638
 calcEfficiency.C:1639
 calcEfficiency.C:1640
 calcEfficiency.C:1641
 calcEfficiency.C:1642
 calcEfficiency.C:1643
 calcEfficiency.C:1644
 calcEfficiency.C:1645
 calcEfficiency.C:1646
 calcEfficiency.C:1647
 calcEfficiency.C:1648
 calcEfficiency.C:1649
 calcEfficiency.C:1650
 calcEfficiency.C:1651
 calcEfficiency.C:1652
 calcEfficiency.C:1653
 calcEfficiency.C:1654
 calcEfficiency.C:1655
 calcEfficiency.C:1656
 calcEfficiency.C:1657
 calcEfficiency.C:1658
 calcEfficiency.C:1659
 calcEfficiency.C:1660
 calcEfficiency.C:1661
 calcEfficiency.C:1662
 calcEfficiency.C:1663
 calcEfficiency.C:1664
 calcEfficiency.C:1665
 calcEfficiency.C:1666
 calcEfficiency.C:1667
 calcEfficiency.C:1668
 calcEfficiency.C:1669
 calcEfficiency.C:1670
 calcEfficiency.C:1671
 calcEfficiency.C:1672
 calcEfficiency.C:1673
 calcEfficiency.C:1674
 calcEfficiency.C:1675
 calcEfficiency.C:1676
 calcEfficiency.C:1677
 calcEfficiency.C:1678
 calcEfficiency.C:1679
 calcEfficiency.C:1680
 calcEfficiency.C:1681
 calcEfficiency.C:1682
 calcEfficiency.C:1683
 calcEfficiency.C:1684
 calcEfficiency.C:1685
 calcEfficiency.C:1686
 calcEfficiency.C:1687
 calcEfficiency.C:1688
 calcEfficiency.C:1689
 calcEfficiency.C:1690
 calcEfficiency.C:1691
 calcEfficiency.C:1692
 calcEfficiency.C:1693
 calcEfficiency.C:1694
 calcEfficiency.C:1695
 calcEfficiency.C:1696
 calcEfficiency.C:1697
 calcEfficiency.C:1698
 calcEfficiency.C:1699
 calcEfficiency.C:1700
 calcEfficiency.C:1701
 calcEfficiency.C:1702
 calcEfficiency.C:1703
 calcEfficiency.C:1704
 calcEfficiency.C:1705
 calcEfficiency.C:1706
 calcEfficiency.C:1707
 calcEfficiency.C:1708
 calcEfficiency.C:1709
 calcEfficiency.C:1710
 calcEfficiency.C:1711
 calcEfficiency.C:1712
 calcEfficiency.C:1713
 calcEfficiency.C:1714
 calcEfficiency.C:1715
 calcEfficiency.C:1716
 calcEfficiency.C:1717
 calcEfficiency.C:1718
 calcEfficiency.C:1719
 calcEfficiency.C:1720
 calcEfficiency.C:1721
 calcEfficiency.C:1722
 calcEfficiency.C:1723
 calcEfficiency.C:1724
 calcEfficiency.C:1725
 calcEfficiency.C:1726
 calcEfficiency.C:1727
 calcEfficiency.C:1728
 calcEfficiency.C:1729
 calcEfficiency.C:1730
 calcEfficiency.C:1731
 calcEfficiency.C:1732
 calcEfficiency.C:1733
 calcEfficiency.C:1734
 calcEfficiency.C:1735
 calcEfficiency.C:1736
 calcEfficiency.C:1737
 calcEfficiency.C:1738
 calcEfficiency.C:1739
 calcEfficiency.C:1740
 calcEfficiency.C:1741
 calcEfficiency.C:1742
 calcEfficiency.C:1743
 calcEfficiency.C:1744
 calcEfficiency.C:1745
 calcEfficiency.C:1746
 calcEfficiency.C:1747
 calcEfficiency.C:1748
 calcEfficiency.C:1749
 calcEfficiency.C:1750
 calcEfficiency.C:1751
 calcEfficiency.C:1752
 calcEfficiency.C:1753
 calcEfficiency.C:1754
 calcEfficiency.C:1755
 calcEfficiency.C:1756
 calcEfficiency.C:1757
 calcEfficiency.C:1758
 calcEfficiency.C:1759
 calcEfficiency.C:1760
 calcEfficiency.C:1761
 calcEfficiency.C:1762
 calcEfficiency.C:1763
 calcEfficiency.C:1764
 calcEfficiency.C:1765
 calcEfficiency.C:1766
 calcEfficiency.C:1767
 calcEfficiency.C:1768
 calcEfficiency.C:1769
 calcEfficiency.C:1770
 calcEfficiency.C:1771
 calcEfficiency.C:1772
 calcEfficiency.C:1773
 calcEfficiency.C:1774
 calcEfficiency.C:1775
 calcEfficiency.C:1776
 calcEfficiency.C:1777
 calcEfficiency.C:1778
 calcEfficiency.C:1779
 calcEfficiency.C:1780
 calcEfficiency.C:1781
 calcEfficiency.C:1782
 calcEfficiency.C:1783
 calcEfficiency.C:1784
 calcEfficiency.C:1785
 calcEfficiency.C:1786
 calcEfficiency.C:1787
 calcEfficiency.C:1788
 calcEfficiency.C:1789
 calcEfficiency.C:1790
 calcEfficiency.C:1791
 calcEfficiency.C:1792
 calcEfficiency.C:1793
 calcEfficiency.C:1794
 calcEfficiency.C:1795
 calcEfficiency.C:1796
 calcEfficiency.C:1797
 calcEfficiency.C:1798
 calcEfficiency.C:1799
 calcEfficiency.C:1800
 calcEfficiency.C:1801
 calcEfficiency.C:1802
 calcEfficiency.C:1803
 calcEfficiency.C:1804
 calcEfficiency.C:1805
 calcEfficiency.C:1806
 calcEfficiency.C:1807
 calcEfficiency.C:1808
 calcEfficiency.C:1809
 calcEfficiency.C:1810
 calcEfficiency.C:1811
 calcEfficiency.C:1812
 calcEfficiency.C:1813
 calcEfficiency.C:1814
 calcEfficiency.C:1815
 calcEfficiency.C:1816
 calcEfficiency.C:1817
 calcEfficiency.C:1818
 calcEfficiency.C:1819
 calcEfficiency.C:1820
 calcEfficiency.C:1821
 calcEfficiency.C:1822
 calcEfficiency.C:1823
 calcEfficiency.C:1824
 calcEfficiency.C:1825
 calcEfficiency.C:1826
 calcEfficiency.C:1827
 calcEfficiency.C:1828
 calcEfficiency.C:1829
 calcEfficiency.C:1830
 calcEfficiency.C:1831
 calcEfficiency.C:1832
 calcEfficiency.C:1833
 calcEfficiency.C:1834
 calcEfficiency.C:1835
 calcEfficiency.C:1836
 calcEfficiency.C:1837
 calcEfficiency.C:1838
 calcEfficiency.C:1839
 calcEfficiency.C:1840
 calcEfficiency.C:1841
 calcEfficiency.C:1842
 calcEfficiency.C:1843
 calcEfficiency.C:1844
 calcEfficiency.C:1845
 calcEfficiency.C:1846
 calcEfficiency.C:1847
 calcEfficiency.C:1848
 calcEfficiency.C:1849
 calcEfficiency.C:1850
 calcEfficiency.C:1851
 calcEfficiency.C:1852
 calcEfficiency.C:1853
 calcEfficiency.C:1854
 calcEfficiency.C:1855
 calcEfficiency.C:1856
 calcEfficiency.C:1857
 calcEfficiency.C:1858
 calcEfficiency.C:1859
 calcEfficiency.C:1860
 calcEfficiency.C:1861
 calcEfficiency.C:1862
 calcEfficiency.C:1863
 calcEfficiency.C:1864
 calcEfficiency.C:1865
 calcEfficiency.C:1866
 calcEfficiency.C:1867
 calcEfficiency.C:1868
 calcEfficiency.C:1869
 calcEfficiency.C:1870
 calcEfficiency.C:1871
 calcEfficiency.C:1872
 calcEfficiency.C:1873
 calcEfficiency.C:1874
 calcEfficiency.C:1875
 calcEfficiency.C:1876
 calcEfficiency.C:1877
 calcEfficiency.C:1878
 calcEfficiency.C:1879
 calcEfficiency.C:1880
 calcEfficiency.C:1881
 calcEfficiency.C:1882
 calcEfficiency.C:1883
 calcEfficiency.C:1884
 calcEfficiency.C:1885
 calcEfficiency.C:1886
 calcEfficiency.C:1887
 calcEfficiency.C:1888
 calcEfficiency.C:1889
 calcEfficiency.C:1890
 calcEfficiency.C:1891
 calcEfficiency.C:1892
 calcEfficiency.C:1893
 calcEfficiency.C:1894
 calcEfficiency.C:1895
 calcEfficiency.C:1896
 calcEfficiency.C:1897
 calcEfficiency.C:1898
 calcEfficiency.C:1899
 calcEfficiency.C:1900
 calcEfficiency.C:1901
 calcEfficiency.C:1902
 calcEfficiency.C:1903
 calcEfficiency.C:1904
 calcEfficiency.C:1905
 calcEfficiency.C:1906
 calcEfficiency.C:1907
 calcEfficiency.C:1908
 calcEfficiency.C:1909
 calcEfficiency.C:1910
 calcEfficiency.C:1911
 calcEfficiency.C:1912
 calcEfficiency.C:1913
 calcEfficiency.C:1914
 calcEfficiency.C:1915
 calcEfficiency.C:1916
 calcEfficiency.C:1917
 calcEfficiency.C:1918
 calcEfficiency.C:1919
 calcEfficiency.C:1920
 calcEfficiency.C:1921
 calcEfficiency.C:1922
 calcEfficiency.C:1923
 calcEfficiency.C:1924
 calcEfficiency.C:1925
 calcEfficiency.C:1926
 calcEfficiency.C:1927
 calcEfficiency.C:1928
 calcEfficiency.C:1929
 calcEfficiency.C:1930
 calcEfficiency.C:1931
 calcEfficiency.C:1932
 calcEfficiency.C:1933
 calcEfficiency.C:1934
 calcEfficiency.C:1935
 calcEfficiency.C:1936
 calcEfficiency.C:1937
 calcEfficiency.C:1938
 calcEfficiency.C:1939
 calcEfficiency.C:1940
 calcEfficiency.C:1941
 calcEfficiency.C:1942
 calcEfficiency.C:1943
 calcEfficiency.C:1944
 calcEfficiency.C:1945
 calcEfficiency.C:1946
 calcEfficiency.C:1947
 calcEfficiency.C:1948
 calcEfficiency.C:1949
 calcEfficiency.C:1950
 calcEfficiency.C:1951
 calcEfficiency.C:1952
 calcEfficiency.C:1953
 calcEfficiency.C:1954
 calcEfficiency.C:1955
 calcEfficiency.C:1956
 calcEfficiency.C:1957
 calcEfficiency.C:1958
 calcEfficiency.C:1959
 calcEfficiency.C:1960
 calcEfficiency.C:1961
 calcEfficiency.C:1962
 calcEfficiency.C:1963
 calcEfficiency.C:1964
 calcEfficiency.C:1965
 calcEfficiency.C:1966
 calcEfficiency.C:1967
 calcEfficiency.C:1968
 calcEfficiency.C:1969
 calcEfficiency.C:1970
 calcEfficiency.C:1971
 calcEfficiency.C:1972
 calcEfficiency.C:1973
 calcEfficiency.C:1974
 calcEfficiency.C:1975
 calcEfficiency.C:1976
 calcEfficiency.C:1977
 calcEfficiency.C:1978
 calcEfficiency.C:1979
 calcEfficiency.C:1980
 calcEfficiency.C:1981
 calcEfficiency.C:1982
 calcEfficiency.C:1983
 calcEfficiency.C:1984
 calcEfficiency.C:1985
 calcEfficiency.C:1986
 calcEfficiency.C:1987
 calcEfficiency.C:1988
 calcEfficiency.C:1989
 calcEfficiency.C:1990
 calcEfficiency.C:1991
 calcEfficiency.C:1992
 calcEfficiency.C:1993
 calcEfficiency.C:1994
 calcEfficiency.C:1995
 calcEfficiency.C:1996
 calcEfficiency.C:1997
 calcEfficiency.C:1998
 calcEfficiency.C:1999
 calcEfficiency.C:2000
 calcEfficiency.C:2001
 calcEfficiency.C:2002
 calcEfficiency.C:2003
 calcEfficiency.C:2004
 calcEfficiency.C:2005
 calcEfficiency.C:2006
 calcEfficiency.C:2007
 calcEfficiency.C:2008
 calcEfficiency.C:2009
 calcEfficiency.C:2010
 calcEfficiency.C:2011
 calcEfficiency.C:2012
 calcEfficiency.C:2013
 calcEfficiency.C:2014
 calcEfficiency.C:2015
 calcEfficiency.C:2016
 calcEfficiency.C:2017
 calcEfficiency.C:2018
 calcEfficiency.C:2019
 calcEfficiency.C:2020
 calcEfficiency.C:2021
 calcEfficiency.C:2022
 calcEfficiency.C:2023
 calcEfficiency.C:2024
 calcEfficiency.C:2025
 calcEfficiency.C:2026
 calcEfficiency.C:2027
 calcEfficiency.C:2028
 calcEfficiency.C:2029
 calcEfficiency.C:2030
 calcEfficiency.C:2031
 calcEfficiency.C:2032
 calcEfficiency.C:2033
 calcEfficiency.C:2034
 calcEfficiency.C:2035
 calcEfficiency.C:2036
 calcEfficiency.C:2037
 calcEfficiency.C:2038
 calcEfficiency.C:2039
 calcEfficiency.C:2040
 calcEfficiency.C:2041
 calcEfficiency.C:2042
 calcEfficiency.C:2043
 calcEfficiency.C:2044
 calcEfficiency.C:2045
 calcEfficiency.C:2046
 calcEfficiency.C:2047
 calcEfficiency.C:2048
 calcEfficiency.C:2049
 calcEfficiency.C:2050
 calcEfficiency.C:2051
 calcEfficiency.C:2052
 calcEfficiency.C:2053
 calcEfficiency.C:2054
 calcEfficiency.C:2055
 calcEfficiency.C:2056
 calcEfficiency.C:2057
 calcEfficiency.C:2058
 calcEfficiency.C:2059
 calcEfficiency.C:2060
 calcEfficiency.C:2061
 calcEfficiency.C:2062
 calcEfficiency.C:2063
 calcEfficiency.C:2064
 calcEfficiency.C:2065
 calcEfficiency.C:2066
 calcEfficiency.C:2067
 calcEfficiency.C:2068
 calcEfficiency.C:2069
 calcEfficiency.C:2070
 calcEfficiency.C:2071
 calcEfficiency.C:2072
 calcEfficiency.C:2073
 calcEfficiency.C:2074
 calcEfficiency.C:2075
 calcEfficiency.C:2076
 calcEfficiency.C:2077
 calcEfficiency.C:2078
 calcEfficiency.C:2079
 calcEfficiency.C:2080
 calcEfficiency.C:2081
 calcEfficiency.C:2082
 calcEfficiency.C:2083
 calcEfficiency.C:2084
 calcEfficiency.C:2085
 calcEfficiency.C:2086
 calcEfficiency.C:2087
 calcEfficiency.C:2088
 calcEfficiency.C:2089
 calcEfficiency.C:2090
 calcEfficiency.C:2091
 calcEfficiency.C:2092
 calcEfficiency.C:2093
 calcEfficiency.C:2094
 calcEfficiency.C:2095
 calcEfficiency.C:2096
 calcEfficiency.C:2097
 calcEfficiency.C:2098
 calcEfficiency.C:2099
 calcEfficiency.C:2100
 calcEfficiency.C:2101
 calcEfficiency.C:2102
 calcEfficiency.C:2103
 calcEfficiency.C:2104
 calcEfficiency.C:2105
 calcEfficiency.C:2106
 calcEfficiency.C:2107
 calcEfficiency.C:2108
 calcEfficiency.C:2109
 calcEfficiency.C:2110
 calcEfficiency.C:2111
 calcEfficiency.C:2112
 calcEfficiency.C:2113
 calcEfficiency.C:2114
 calcEfficiency.C:2115
 calcEfficiency.C:2116
 calcEfficiency.C:2117
 calcEfficiency.C:2118
 calcEfficiency.C:2119
 calcEfficiency.C:2120
 calcEfficiency.C:2121
 calcEfficiency.C:2122
 calcEfficiency.C:2123
 calcEfficiency.C:2124
 calcEfficiency.C:2125
 calcEfficiency.C:2126
 calcEfficiency.C:2127
 calcEfficiency.C:2128
 calcEfficiency.C:2129
 calcEfficiency.C:2130
 calcEfficiency.C:2131
 calcEfficiency.C:2132
 calcEfficiency.C:2133
 calcEfficiency.C:2134
 calcEfficiency.C:2135
 calcEfficiency.C:2136
 calcEfficiency.C:2137
 calcEfficiency.C:2138
 calcEfficiency.C:2139
 calcEfficiency.C:2140
 calcEfficiency.C:2141
 calcEfficiency.C:2142
 calcEfficiency.C:2143
 calcEfficiency.C:2144
 calcEfficiency.C:2145
 calcEfficiency.C:2146
 calcEfficiency.C:2147
 calcEfficiency.C:2148
 calcEfficiency.C:2149
 calcEfficiency.C:2150
 calcEfficiency.C:2151
 calcEfficiency.C:2152
 calcEfficiency.C:2153
 calcEfficiency.C:2154
 calcEfficiency.C:2155
 calcEfficiency.C:2156
 calcEfficiency.C:2157
 calcEfficiency.C:2158
 calcEfficiency.C:2159
 calcEfficiency.C:2160
 calcEfficiency.C:2161
 calcEfficiency.C:2162
 calcEfficiency.C:2163
 calcEfficiency.C:2164
 calcEfficiency.C:2165
 calcEfficiency.C:2166
 calcEfficiency.C:2167
 calcEfficiency.C:2168
 calcEfficiency.C:2169
 calcEfficiency.C:2170
 calcEfficiency.C:2171
 calcEfficiency.C:2172
 calcEfficiency.C:2173
 calcEfficiency.C:2174
 calcEfficiency.C:2175
 calcEfficiency.C:2176
 calcEfficiency.C:2177
 calcEfficiency.C:2178
 calcEfficiency.C:2179
 calcEfficiency.C:2180
 calcEfficiency.C:2181
 calcEfficiency.C:2182
 calcEfficiency.C:2183
 calcEfficiency.C:2184
 calcEfficiency.C:2185
 calcEfficiency.C:2186
 calcEfficiency.C:2187
 calcEfficiency.C:2188
 calcEfficiency.C:2189
 calcEfficiency.C:2190
 calcEfficiency.C:2191
 calcEfficiency.C:2192
 calcEfficiency.C:2193
 calcEfficiency.C:2194
 calcEfficiency.C:2195
 calcEfficiency.C:2196
 calcEfficiency.C:2197
 calcEfficiency.C:2198
 calcEfficiency.C:2199
 calcEfficiency.C:2200
 calcEfficiency.C:2201
 calcEfficiency.C:2202
 calcEfficiency.C:2203
 calcEfficiency.C:2204
 calcEfficiency.C:2205
 calcEfficiency.C:2206
 calcEfficiency.C:2207
 calcEfficiency.C:2208
 calcEfficiency.C:2209
 calcEfficiency.C:2210
 calcEfficiency.C:2211
 calcEfficiency.C:2212
 calcEfficiency.C:2213
 calcEfficiency.C:2214
 calcEfficiency.C:2215
 calcEfficiency.C:2216
 calcEfficiency.C:2217
 calcEfficiency.C:2218
 calcEfficiency.C:2219
 calcEfficiency.C:2220
 calcEfficiency.C:2221
 calcEfficiency.C:2222
 calcEfficiency.C:2223
 calcEfficiency.C:2224
 calcEfficiency.C:2225
 calcEfficiency.C:2226
 calcEfficiency.C:2227
 calcEfficiency.C:2228
 calcEfficiency.C:2229
 calcEfficiency.C:2230
 calcEfficiency.C:2231
 calcEfficiency.C:2232
 calcEfficiency.C:2233
 calcEfficiency.C:2234
 calcEfficiency.C:2235
 calcEfficiency.C:2236
 calcEfficiency.C:2237
 calcEfficiency.C:2238
 calcEfficiency.C:2239
 calcEfficiency.C:2240
 calcEfficiency.C:2241
 calcEfficiency.C:2242
 calcEfficiency.C:2243
 calcEfficiency.C:2244
 calcEfficiency.C:2245
 calcEfficiency.C:2246
 calcEfficiency.C:2247
 calcEfficiency.C:2248
 calcEfficiency.C:2249
 calcEfficiency.C:2250
 calcEfficiency.C:2251
 calcEfficiency.C:2252
 calcEfficiency.C:2253
 calcEfficiency.C:2254
 calcEfficiency.C:2255
 calcEfficiency.C:2256
 calcEfficiency.C:2257
 calcEfficiency.C:2258
 calcEfficiency.C:2259
 calcEfficiency.C:2260
 calcEfficiency.C:2261
 calcEfficiency.C:2262
 calcEfficiency.C:2263
 calcEfficiency.C:2264
 calcEfficiency.C:2265
 calcEfficiency.C:2266
 calcEfficiency.C:2267
 calcEfficiency.C:2268
 calcEfficiency.C:2269
 calcEfficiency.C:2270
 calcEfficiency.C:2271
 calcEfficiency.C:2272
 calcEfficiency.C:2273
 calcEfficiency.C:2274
 calcEfficiency.C:2275
 calcEfficiency.C:2276
 calcEfficiency.C:2277
 calcEfficiency.C:2278
 calcEfficiency.C:2279
 calcEfficiency.C:2280
 calcEfficiency.C:2281
 calcEfficiency.C:2282
 calcEfficiency.C:2283
 calcEfficiency.C:2284
 calcEfficiency.C:2285
 calcEfficiency.C:2286
 calcEfficiency.C:2287
 calcEfficiency.C:2288
 calcEfficiency.C:2289
 calcEfficiency.C:2290
 calcEfficiency.C:2291
 calcEfficiency.C:2292
 calcEfficiency.C:2293
 calcEfficiency.C:2294
 calcEfficiency.C:2295
 calcEfficiency.C:2296
 calcEfficiency.C:2297
 calcEfficiency.C:2298
 calcEfficiency.C:2299
 calcEfficiency.C:2300
 calcEfficiency.C:2301
 calcEfficiency.C:2302
 calcEfficiency.C:2303
 calcEfficiency.C:2304
 calcEfficiency.C:2305
 calcEfficiency.C:2306
 calcEfficiency.C:2307
 calcEfficiency.C:2308
 calcEfficiency.C:2309
 calcEfficiency.C:2310
 calcEfficiency.C:2311
 calcEfficiency.C:2312
 calcEfficiency.C:2313
 calcEfficiency.C:2314
 calcEfficiency.C:2315
 calcEfficiency.C:2316
 calcEfficiency.C:2317
 calcEfficiency.C:2318
 calcEfficiency.C:2319
 calcEfficiency.C:2320
 calcEfficiency.C:2321
 calcEfficiency.C:2322
 calcEfficiency.C:2323
 calcEfficiency.C:2324
 calcEfficiency.C:2325
 calcEfficiency.C:2326
 calcEfficiency.C:2327
 calcEfficiency.C:2328
 calcEfficiency.C:2329
 calcEfficiency.C:2330
 calcEfficiency.C:2331
 calcEfficiency.C:2332
 calcEfficiency.C:2333
 calcEfficiency.C:2334
 calcEfficiency.C:2335
 calcEfficiency.C:2336
 calcEfficiency.C:2337
 calcEfficiency.C:2338
 calcEfficiency.C:2339
 calcEfficiency.C:2340
 calcEfficiency.C:2341
 calcEfficiency.C:2342
 calcEfficiency.C:2343
 calcEfficiency.C:2344
 calcEfficiency.C:2345
 calcEfficiency.C:2346
 calcEfficiency.C:2347
 calcEfficiency.C:2348
 calcEfficiency.C:2349
 calcEfficiency.C:2350
 calcEfficiency.C:2351
 calcEfficiency.C:2352
 calcEfficiency.C:2353
 calcEfficiency.C:2354
 calcEfficiency.C:2355
 calcEfficiency.C:2356
 calcEfficiency.C:2357
 calcEfficiency.C:2358
 calcEfficiency.C:2359
 calcEfficiency.C:2360
 calcEfficiency.C:2361
 calcEfficiency.C:2362
 calcEfficiency.C:2363
 calcEfficiency.C:2364
 calcEfficiency.C:2365
 calcEfficiency.C:2366
 calcEfficiency.C:2367
 calcEfficiency.C:2368
 calcEfficiency.C:2369
 calcEfficiency.C:2370
 calcEfficiency.C:2371
 calcEfficiency.C:2372
 calcEfficiency.C:2373
 calcEfficiency.C:2374
 calcEfficiency.C:2375
 calcEfficiency.C:2376
 calcEfficiency.C:2377
 calcEfficiency.C:2378
 calcEfficiency.C:2379
 calcEfficiency.C:2380
 calcEfficiency.C:2381
 calcEfficiency.C:2382
 calcEfficiency.C:2383
 calcEfficiency.C:2384
 calcEfficiency.C:2385
 calcEfficiency.C:2386
 calcEfficiency.C:2387
 calcEfficiency.C:2388
 calcEfficiency.C:2389
 calcEfficiency.C:2390
 calcEfficiency.C:2391
 calcEfficiency.C:2392
 calcEfficiency.C:2393
 calcEfficiency.C:2394
 calcEfficiency.C:2395
 calcEfficiency.C:2396
 calcEfficiency.C:2397
 calcEfficiency.C:2398
 calcEfficiency.C:2399
 calcEfficiency.C:2400
 calcEfficiency.C:2401
 calcEfficiency.C:2402
 calcEfficiency.C:2403
 calcEfficiency.C:2404
 calcEfficiency.C:2405
 calcEfficiency.C:2406
 calcEfficiency.C:2407
 calcEfficiency.C:2408
 calcEfficiency.C:2409
 calcEfficiency.C:2410
 calcEfficiency.C:2411
 calcEfficiency.C:2412
 calcEfficiency.C:2413
 calcEfficiency.C:2414
 calcEfficiency.C:2415
 calcEfficiency.C:2416
 calcEfficiency.C:2417
 calcEfficiency.C:2418
 calcEfficiency.C:2419
 calcEfficiency.C:2420
 calcEfficiency.C:2421
 calcEfficiency.C:2422
 calcEfficiency.C:2423
 calcEfficiency.C:2424
 calcEfficiency.C:2425
 calcEfficiency.C:2426
 calcEfficiency.C:2427
 calcEfficiency.C:2428
 calcEfficiency.C:2429
 calcEfficiency.C:2430
 calcEfficiency.C:2431
 calcEfficiency.C:2432
 calcEfficiency.C:2433
 calcEfficiency.C:2434
 calcEfficiency.C:2435
 calcEfficiency.C:2436
 calcEfficiency.C:2437
 calcEfficiency.C:2438
 calcEfficiency.C:2439
 calcEfficiency.C:2440
 calcEfficiency.C:2441
 calcEfficiency.C:2442
 calcEfficiency.C:2443
 calcEfficiency.C:2444
 calcEfficiency.C:2445
 calcEfficiency.C:2446
 calcEfficiency.C:2447
 calcEfficiency.C:2448
 calcEfficiency.C:2449
 calcEfficiency.C:2450
 calcEfficiency.C:2451
 calcEfficiency.C:2452
 calcEfficiency.C:2453
 calcEfficiency.C:2454
 calcEfficiency.C:2455
 calcEfficiency.C:2456
 calcEfficiency.C:2457
 calcEfficiency.C:2458
 calcEfficiency.C:2459
 calcEfficiency.C:2460
 calcEfficiency.C:2461
 calcEfficiency.C:2462
 calcEfficiency.C:2463
 calcEfficiency.C:2464
 calcEfficiency.C:2465
 calcEfficiency.C:2466
 calcEfficiency.C:2467
 calcEfficiency.C:2468
 calcEfficiency.C:2469
 calcEfficiency.C:2470
 calcEfficiency.C:2471
 calcEfficiency.C:2472
 calcEfficiency.C:2473
 calcEfficiency.C:2474
 calcEfficiency.C:2475
 calcEfficiency.C:2476
 calcEfficiency.C:2477
 calcEfficiency.C:2478
 calcEfficiency.C:2479
 calcEfficiency.C:2480
 calcEfficiency.C:2481
 calcEfficiency.C:2482
 calcEfficiency.C:2483
 calcEfficiency.C:2484
 calcEfficiency.C:2485
 calcEfficiency.C:2486
 calcEfficiency.C:2487
 calcEfficiency.C:2488
 calcEfficiency.C:2489
 calcEfficiency.C:2490
 calcEfficiency.C:2491
 calcEfficiency.C:2492
 calcEfficiency.C:2493
 calcEfficiency.C:2494
 calcEfficiency.C:2495
 calcEfficiency.C:2496
 calcEfficiency.C:2497
 calcEfficiency.C:2498
 calcEfficiency.C:2499
 calcEfficiency.C:2500
 calcEfficiency.C:2501
 calcEfficiency.C:2502
 calcEfficiency.C:2503
 calcEfficiency.C:2504
 calcEfficiency.C:2505
 calcEfficiency.C:2506
 calcEfficiency.C:2507
 calcEfficiency.C:2508
 calcEfficiency.C:2509
 calcEfficiency.C:2510
 calcEfficiency.C:2511
 calcEfficiency.C:2512
 calcEfficiency.C:2513
 calcEfficiency.C:2514
 calcEfficiency.C:2515
 calcEfficiency.C:2516
 calcEfficiency.C:2517
 calcEfficiency.C:2518
 calcEfficiency.C:2519
 calcEfficiency.C:2520
 calcEfficiency.C:2521
 calcEfficiency.C:2522
 calcEfficiency.C:2523
 calcEfficiency.C:2524
 calcEfficiency.C:2525
 calcEfficiency.C:2526
 calcEfficiency.C:2527
 calcEfficiency.C:2528
 calcEfficiency.C:2529
 calcEfficiency.C:2530
 calcEfficiency.C:2531
 calcEfficiency.C:2532
 calcEfficiency.C:2533
 calcEfficiency.C:2534
 calcEfficiency.C:2535
 calcEfficiency.C:2536
 calcEfficiency.C:2537
 calcEfficiency.C:2538
 calcEfficiency.C:2539
 calcEfficiency.C:2540
 calcEfficiency.C:2541
 calcEfficiency.C:2542
 calcEfficiency.C:2543
 calcEfficiency.C:2544
 calcEfficiency.C:2545
 calcEfficiency.C:2546
 calcEfficiency.C:2547
 calcEfficiency.C:2548
 calcEfficiency.C:2549
 calcEfficiency.C:2550
 calcEfficiency.C:2551
 calcEfficiency.C:2552
 calcEfficiency.C:2553
 calcEfficiency.C:2554
 calcEfficiency.C:2555
 calcEfficiency.C:2556
 calcEfficiency.C:2557
 calcEfficiency.C:2558
 calcEfficiency.C:2559
 calcEfficiency.C:2560
 calcEfficiency.C:2561
 calcEfficiency.C:2562
 calcEfficiency.C:2563
 calcEfficiency.C:2564
 calcEfficiency.C:2565
 calcEfficiency.C:2566
 calcEfficiency.C:2567
 calcEfficiency.C:2568
 calcEfficiency.C:2569
 calcEfficiency.C:2570
 calcEfficiency.C:2571
 calcEfficiency.C:2572
 calcEfficiency.C:2573
 calcEfficiency.C:2574
 calcEfficiency.C:2575
 calcEfficiency.C:2576
 calcEfficiency.C:2577
 calcEfficiency.C:2578
 calcEfficiency.C:2579
 calcEfficiency.C:2580
 calcEfficiency.C:2581
 calcEfficiency.C:2582
 calcEfficiency.C:2583
 calcEfficiency.C:2584
 calcEfficiency.C:2585
 calcEfficiency.C:2586
 calcEfficiency.C:2587
 calcEfficiency.C:2588
 calcEfficiency.C:2589
 calcEfficiency.C:2590
 calcEfficiency.C:2591
 calcEfficiency.C:2592
 calcEfficiency.C:2593
 calcEfficiency.C:2594
 calcEfficiency.C:2595
 calcEfficiency.C:2596
 calcEfficiency.C:2597
 calcEfficiency.C:2598
 calcEfficiency.C:2599
 calcEfficiency.C:2600
 calcEfficiency.C:2601
 calcEfficiency.C:2602
 calcEfficiency.C:2603
 calcEfficiency.C:2604
 calcEfficiency.C:2605
 calcEfficiency.C:2606
 calcEfficiency.C:2607
 calcEfficiency.C:2608
 calcEfficiency.C:2609
 calcEfficiency.C:2610
 calcEfficiency.C:2611
 calcEfficiency.C:2612
 calcEfficiency.C:2613
 calcEfficiency.C:2614
 calcEfficiency.C:2615
 calcEfficiency.C:2616
 calcEfficiency.C:2617
 calcEfficiency.C:2618
 calcEfficiency.C:2619
 calcEfficiency.C:2620
 calcEfficiency.C:2621
 calcEfficiency.C:2622
 calcEfficiency.C:2623
 calcEfficiency.C:2624
 calcEfficiency.C:2625
 calcEfficiency.C:2626
 calcEfficiency.C:2627
 calcEfficiency.C:2628
 calcEfficiency.C:2629
 calcEfficiency.C:2630
 calcEfficiency.C:2631
 calcEfficiency.C:2632
 calcEfficiency.C:2633
 calcEfficiency.C:2634
 calcEfficiency.C:2635
 calcEfficiency.C:2636
 calcEfficiency.C:2637
 calcEfficiency.C:2638
 calcEfficiency.C:2639
 calcEfficiency.C:2640
 calcEfficiency.C:2641
 calcEfficiency.C:2642
 calcEfficiency.C:2643
 calcEfficiency.C:2644
 calcEfficiency.C:2645
 calcEfficiency.C:2646
 calcEfficiency.C:2647
 calcEfficiency.C:2648
 calcEfficiency.C:2649
 calcEfficiency.C:2650
 calcEfficiency.C:2651
 calcEfficiency.C:2652
 calcEfficiency.C:2653
 calcEfficiency.C:2654
 calcEfficiency.C:2655
 calcEfficiency.C:2656
 calcEfficiency.C:2657
 calcEfficiency.C:2658
 calcEfficiency.C:2659
 calcEfficiency.C:2660
 calcEfficiency.C:2661
 calcEfficiency.C:2662
 calcEfficiency.C:2663
 calcEfficiency.C:2664
 calcEfficiency.C:2665
 calcEfficiency.C:2666
 calcEfficiency.C:2667
 calcEfficiency.C:2668
 calcEfficiency.C:2669
 calcEfficiency.C:2670
 calcEfficiency.C:2671
 calcEfficiency.C:2672
 calcEfficiency.C:2673
 calcEfficiency.C:2674
 calcEfficiency.C:2675
 calcEfficiency.C:2676
 calcEfficiency.C:2677
 calcEfficiency.C:2678
 calcEfficiency.C:2679
 calcEfficiency.C:2680
 calcEfficiency.C:2681
 calcEfficiency.C:2682
 calcEfficiency.C:2683
 calcEfficiency.C:2684
 calcEfficiency.C:2685
 calcEfficiency.C:2686
 calcEfficiency.C:2687
 calcEfficiency.C:2688
 calcEfficiency.C:2689
 calcEfficiency.C:2690
 calcEfficiency.C:2691
 calcEfficiency.C:2692
 calcEfficiency.C:2693
 calcEfficiency.C:2694
 calcEfficiency.C:2695
 calcEfficiency.C:2696
 calcEfficiency.C:2697
 calcEfficiency.C:2698
 calcEfficiency.C:2699
 calcEfficiency.C:2700
 calcEfficiency.C:2701
 calcEfficiency.C:2702
 calcEfficiency.C:2703
 calcEfficiency.C:2704
 calcEfficiency.C:2705
 calcEfficiency.C:2706
 calcEfficiency.C:2707
 calcEfficiency.C:2708
 calcEfficiency.C:2709
 calcEfficiency.C:2710
 calcEfficiency.C:2711
 calcEfficiency.C:2712
 calcEfficiency.C:2713
 calcEfficiency.C:2714
 calcEfficiency.C:2715
 calcEfficiency.C:2716
 calcEfficiency.C:2717
 calcEfficiency.C:2718
 calcEfficiency.C:2719
 calcEfficiency.C:2720
 calcEfficiency.C:2721
 calcEfficiency.C:2722
 calcEfficiency.C:2723
 calcEfficiency.C:2724
 calcEfficiency.C:2725
 calcEfficiency.C:2726
 calcEfficiency.C:2727
 calcEfficiency.C:2728
 calcEfficiency.C:2729
 calcEfficiency.C:2730
 calcEfficiency.C:2731
 calcEfficiency.C:2732
 calcEfficiency.C:2733
 calcEfficiency.C:2734
 calcEfficiency.C:2735
 calcEfficiency.C:2736
 calcEfficiency.C:2737
 calcEfficiency.C:2738
 calcEfficiency.C:2739
 calcEfficiency.C:2740
 calcEfficiency.C:2741
 calcEfficiency.C:2742
 calcEfficiency.C:2743
 calcEfficiency.C:2744
 calcEfficiency.C:2745
 calcEfficiency.C:2746
 calcEfficiency.C:2747
 calcEfficiency.C:2748
 calcEfficiency.C:2749
 calcEfficiency.C:2750
 calcEfficiency.C:2751
 calcEfficiency.C:2752
 calcEfficiency.C:2753
 calcEfficiency.C:2754
 calcEfficiency.C:2755
 calcEfficiency.C:2756
 calcEfficiency.C:2757
 calcEfficiency.C:2758
 calcEfficiency.C:2759
 calcEfficiency.C:2760
 calcEfficiency.C:2761
 calcEfficiency.C:2762
 calcEfficiency.C:2763
 calcEfficiency.C:2764
 calcEfficiency.C:2765
 calcEfficiency.C:2766
 calcEfficiency.C:2767
 calcEfficiency.C:2768
 calcEfficiency.C:2769
 calcEfficiency.C:2770
 calcEfficiency.C:2771
 calcEfficiency.C:2772
 calcEfficiency.C:2773
 calcEfficiency.C:2774
 calcEfficiency.C:2775
 calcEfficiency.C:2776
 calcEfficiency.C:2777
 calcEfficiency.C:2778
 calcEfficiency.C:2779
 calcEfficiency.C:2780
 calcEfficiency.C:2781
 calcEfficiency.C:2782
 calcEfficiency.C:2783
 calcEfficiency.C:2784
 calcEfficiency.C:2785
 calcEfficiency.C:2786
 calcEfficiency.C:2787
 calcEfficiency.C:2788
 calcEfficiency.C:2789
 calcEfficiency.C:2790
 calcEfficiency.C:2791
 calcEfficiency.C:2792
 calcEfficiency.C:2793
 calcEfficiency.C:2794
 calcEfficiency.C:2795
 calcEfficiency.C:2796
 calcEfficiency.C:2797
 calcEfficiency.C:2798
 calcEfficiency.C:2799
 calcEfficiency.C:2800
 calcEfficiency.C:2801
 calcEfficiency.C:2802
 calcEfficiency.C:2803
 calcEfficiency.C:2804
 calcEfficiency.C:2805
 calcEfficiency.C:2806
 calcEfficiency.C:2807
 calcEfficiency.C:2808
 calcEfficiency.C:2809
 calcEfficiency.C:2810
 calcEfficiency.C:2811
 calcEfficiency.C:2812
 calcEfficiency.C:2813
 calcEfficiency.C:2814
 calcEfficiency.C:2815
 calcEfficiency.C:2816
 calcEfficiency.C:2817
 calcEfficiency.C:2818
 calcEfficiency.C:2819
 calcEfficiency.C:2820
 calcEfficiency.C:2821
 calcEfficiency.C:2822
 calcEfficiency.C:2823
 calcEfficiency.C:2824
 calcEfficiency.C:2825
 calcEfficiency.C:2826
 calcEfficiency.C:2827
 calcEfficiency.C:2828
 calcEfficiency.C:2829
 calcEfficiency.C:2830
 calcEfficiency.C:2831
 calcEfficiency.C:2832
 calcEfficiency.C:2833
 calcEfficiency.C:2834
 calcEfficiency.C:2835
 calcEfficiency.C:2836
 calcEfficiency.C:2837
 calcEfficiency.C:2838
 calcEfficiency.C:2839
 calcEfficiency.C:2840
 calcEfficiency.C:2841
 calcEfficiency.C:2842
 calcEfficiency.C:2843
 calcEfficiency.C:2844
 calcEfficiency.C:2845
 calcEfficiency.C:2846
 calcEfficiency.C:2847
 calcEfficiency.C:2848
 calcEfficiency.C:2849
 calcEfficiency.C:2850
 calcEfficiency.C:2851
 calcEfficiency.C:2852
 calcEfficiency.C:2853
 calcEfficiency.C:2854
 calcEfficiency.C:2855
 calcEfficiency.C:2856
 calcEfficiency.C:2857
 calcEfficiency.C:2858
 calcEfficiency.C:2859
 calcEfficiency.C:2860
 calcEfficiency.C:2861
 calcEfficiency.C:2862
 calcEfficiency.C:2863
 calcEfficiency.C:2864
 calcEfficiency.C:2865
 calcEfficiency.C:2866
 calcEfficiency.C:2867
 calcEfficiency.C:2868
 calcEfficiency.C:2869
 calcEfficiency.C:2870
 calcEfficiency.C:2871
 calcEfficiency.C:2872
 calcEfficiency.C:2873
 calcEfficiency.C:2874
 calcEfficiency.C:2875
 calcEfficiency.C:2876
 calcEfficiency.C:2877
 calcEfficiency.C:2878
 calcEfficiency.C:2879
 calcEfficiency.C:2880
 calcEfficiency.C:2881
 calcEfficiency.C:2882
 calcEfficiency.C:2883
 calcEfficiency.C:2884
 calcEfficiency.C:2885
 calcEfficiency.C:2886
 calcEfficiency.C:2887
 calcEfficiency.C:2888
 calcEfficiency.C:2889
 calcEfficiency.C:2890
 calcEfficiency.C:2891
 calcEfficiency.C:2892
 calcEfficiency.C:2893
 calcEfficiency.C:2894
 calcEfficiency.C:2895
 calcEfficiency.C:2896
 calcEfficiency.C:2897
 calcEfficiency.C:2898
 calcEfficiency.C:2899
 calcEfficiency.C:2900
 calcEfficiency.C:2901
 calcEfficiency.C:2902
 calcEfficiency.C:2903
 calcEfficiency.C:2904
 calcEfficiency.C:2905
 calcEfficiency.C:2906
 calcEfficiency.C:2907
 calcEfficiency.C:2908
 calcEfficiency.C:2909
 calcEfficiency.C:2910
 calcEfficiency.C:2911
 calcEfficiency.C:2912
 calcEfficiency.C:2913
 calcEfficiency.C:2914
 calcEfficiency.C:2915
 calcEfficiency.C:2916
 calcEfficiency.C:2917
 calcEfficiency.C:2918
 calcEfficiency.C:2919
 calcEfficiency.C:2920
 calcEfficiency.C:2921
 calcEfficiency.C:2922
 calcEfficiency.C:2923
 calcEfficiency.C:2924
 calcEfficiency.C:2925
 calcEfficiency.C:2926
 calcEfficiency.C:2927
 calcEfficiency.C:2928
 calcEfficiency.C:2929
 calcEfficiency.C:2930
 calcEfficiency.C:2931
 calcEfficiency.C:2932
 calcEfficiency.C:2933
 calcEfficiency.C:2934
 calcEfficiency.C:2935
 calcEfficiency.C:2936
 calcEfficiency.C:2937
 calcEfficiency.C:2938
 calcEfficiency.C:2939
 calcEfficiency.C:2940
 calcEfficiency.C:2941
 calcEfficiency.C:2942
 calcEfficiency.C:2943
 calcEfficiency.C:2944
 calcEfficiency.C:2945
 calcEfficiency.C:2946
 calcEfficiency.C:2947
 calcEfficiency.C:2948
 calcEfficiency.C:2949
 calcEfficiency.C:2950
 calcEfficiency.C:2951
 calcEfficiency.C:2952
 calcEfficiency.C:2953
 calcEfficiency.C:2954
 calcEfficiency.C:2955
 calcEfficiency.C:2956
 calcEfficiency.C:2957
 calcEfficiency.C:2958
 calcEfficiency.C:2959
 calcEfficiency.C:2960
 calcEfficiency.C:2961
 calcEfficiency.C:2962
 calcEfficiency.C:2963
 calcEfficiency.C:2964
 calcEfficiency.C:2965
 calcEfficiency.C:2966
 calcEfficiency.C:2967
 calcEfficiency.C:2968
 calcEfficiency.C:2969
 calcEfficiency.C:2970
 calcEfficiency.C:2971
 calcEfficiency.C:2972
 calcEfficiency.C:2973
 calcEfficiency.C:2974
 calcEfficiency.C:2975
 calcEfficiency.C:2976
 calcEfficiency.C:2977
 calcEfficiency.C:2978
 calcEfficiency.C:2979
 calcEfficiency.C:2980
 calcEfficiency.C:2981
 calcEfficiency.C:2982
 calcEfficiency.C:2983
 calcEfficiency.C:2984
 calcEfficiency.C:2985
 calcEfficiency.C:2986
 calcEfficiency.C:2987
 calcEfficiency.C:2988
 calcEfficiency.C:2989
 calcEfficiency.C:2990
 calcEfficiency.C:2991
 calcEfficiency.C:2992
 calcEfficiency.C:2993
 calcEfficiency.C:2994
 calcEfficiency.C:2995
 calcEfficiency.C:2996
 calcEfficiency.C:2997
 calcEfficiency.C:2998
 calcEfficiency.C:2999
 calcEfficiency.C:3000
 calcEfficiency.C:3001
 calcEfficiency.C:3002
 calcEfficiency.C:3003
 calcEfficiency.C:3004
 calcEfficiency.C:3005
 calcEfficiency.C:3006
 calcEfficiency.C:3007
 calcEfficiency.C:3008
 calcEfficiency.C:3009
 calcEfficiency.C:3010
 calcEfficiency.C:3011
 calcEfficiency.C:3012
 calcEfficiency.C:3013
 calcEfficiency.C:3014
 calcEfficiency.C:3015
 calcEfficiency.C:3016
 calcEfficiency.C:3017
 calcEfficiency.C:3018
 calcEfficiency.C:3019
 calcEfficiency.C:3020
 calcEfficiency.C:3021
 calcEfficiency.C:3022
 calcEfficiency.C:3023
 calcEfficiency.C:3024
 calcEfficiency.C:3025
 calcEfficiency.C:3026
 calcEfficiency.C:3027
 calcEfficiency.C:3028
 calcEfficiency.C:3029
 calcEfficiency.C:3030
 calcEfficiency.C:3031
 calcEfficiency.C:3032
 calcEfficiency.C:3033
 calcEfficiency.C:3034
 calcEfficiency.C:3035
 calcEfficiency.C:3036
 calcEfficiency.C:3037
 calcEfficiency.C:3038
 calcEfficiency.C:3039
 calcEfficiency.C:3040
 calcEfficiency.C:3041
 calcEfficiency.C:3042
 calcEfficiency.C:3043
 calcEfficiency.C:3044
 calcEfficiency.C:3045
 calcEfficiency.C:3046
 calcEfficiency.C:3047
 calcEfficiency.C:3048
 calcEfficiency.C:3049
 calcEfficiency.C:3050
 calcEfficiency.C:3051
 calcEfficiency.C:3052
 calcEfficiency.C:3053
 calcEfficiency.C:3054
 calcEfficiency.C:3055
 calcEfficiency.C:3056
 calcEfficiency.C:3057
 calcEfficiency.C:3058
 calcEfficiency.C:3059
 calcEfficiency.C:3060
 calcEfficiency.C:3061
 calcEfficiency.C:3062
 calcEfficiency.C:3063
 calcEfficiency.C:3064
 calcEfficiency.C:3065
 calcEfficiency.C:3066
 calcEfficiency.C:3067
 calcEfficiency.C:3068
 calcEfficiency.C:3069
 calcEfficiency.C:3070
 calcEfficiency.C:3071
 calcEfficiency.C:3072
 calcEfficiency.C:3073
 calcEfficiency.C:3074
 calcEfficiency.C:3075
 calcEfficiency.C:3076
 calcEfficiency.C:3077
 calcEfficiency.C:3078
 calcEfficiency.C:3079
 calcEfficiency.C:3080
 calcEfficiency.C:3081
 calcEfficiency.C:3082
 calcEfficiency.C:3083
 calcEfficiency.C:3084
 calcEfficiency.C:3085
 calcEfficiency.C:3086
 calcEfficiency.C:3087
 calcEfficiency.C:3088
 calcEfficiency.C:3089
 calcEfficiency.C:3090
 calcEfficiency.C:3091
 calcEfficiency.C:3092
 calcEfficiency.C:3093
 calcEfficiency.C:3094
 calcEfficiency.C:3095
 calcEfficiency.C:3096
 calcEfficiency.C:3097
 calcEfficiency.C:3098
 calcEfficiency.C:3099
 calcEfficiency.C:3100
 calcEfficiency.C:3101
 calcEfficiency.C:3102
 calcEfficiency.C:3103
 calcEfficiency.C:3104
 calcEfficiency.C:3105
 calcEfficiency.C:3106
 calcEfficiency.C:3107
 calcEfficiency.C:3108
 calcEfficiency.C:3109
 calcEfficiency.C:3110
 calcEfficiency.C:3111
 calcEfficiency.C:3112
 calcEfficiency.C:3113
 calcEfficiency.C:3114
 calcEfficiency.C:3115
 calcEfficiency.C:3116
 calcEfficiency.C:3117
 calcEfficiency.C:3118
 calcEfficiency.C:3119
 calcEfficiency.C:3120
 calcEfficiency.C:3121
 calcEfficiency.C:3122
 calcEfficiency.C:3123
 calcEfficiency.C:3124
 calcEfficiency.C:3125
 calcEfficiency.C:3126
 calcEfficiency.C:3127
 calcEfficiency.C:3128
 calcEfficiency.C:3129
 calcEfficiency.C:3130
 calcEfficiency.C:3131
 calcEfficiency.C:3132
 calcEfficiency.C:3133
 calcEfficiency.C:3134
 calcEfficiency.C:3135
 calcEfficiency.C:3136
 calcEfficiency.C:3137
 calcEfficiency.C:3138
 calcEfficiency.C:3139
 calcEfficiency.C:3140
 calcEfficiency.C:3141
 calcEfficiency.C:3142
 calcEfficiency.C:3143
 calcEfficiency.C:3144
 calcEfficiency.C:3145
 calcEfficiency.C:3146
 calcEfficiency.C:3147
 calcEfficiency.C:3148
 calcEfficiency.C:3149
 calcEfficiency.C:3150
 calcEfficiency.C:3151
 calcEfficiency.C:3152
 calcEfficiency.C:3153
 calcEfficiency.C:3154
 calcEfficiency.C:3155
 calcEfficiency.C:3156
 calcEfficiency.C:3157
 calcEfficiency.C:3158
 calcEfficiency.C:3159
 calcEfficiency.C:3160
 calcEfficiency.C:3161
 calcEfficiency.C:3162
 calcEfficiency.C:3163
 calcEfficiency.C:3164
 calcEfficiency.C:3165
 calcEfficiency.C:3166
 calcEfficiency.C:3167
 calcEfficiency.C:3168
 calcEfficiency.C:3169
 calcEfficiency.C:3170
 calcEfficiency.C:3171
 calcEfficiency.C:3172
 calcEfficiency.C:3173
 calcEfficiency.C:3174
 calcEfficiency.C:3175
 calcEfficiency.C:3176
 calcEfficiency.C:3177
 calcEfficiency.C:3178
 calcEfficiency.C:3179
 calcEfficiency.C:3180
 calcEfficiency.C:3181
 calcEfficiency.C:3182
 calcEfficiency.C:3183
 calcEfficiency.C:3184
 calcEfficiency.C:3185
 calcEfficiency.C:3186
 calcEfficiency.C:3187
 calcEfficiency.C:3188
 calcEfficiency.C:3189
 calcEfficiency.C:3190
 calcEfficiency.C:3191
 calcEfficiency.C:3192
 calcEfficiency.C:3193
 calcEfficiency.C:3194
 calcEfficiency.C:3195
 calcEfficiency.C:3196
 calcEfficiency.C:3197
 calcEfficiency.C:3198
 calcEfficiency.C:3199
 calcEfficiency.C:3200
 calcEfficiency.C:3201
 calcEfficiency.C:3202
 calcEfficiency.C:3203
 calcEfficiency.C:3204
 calcEfficiency.C:3205
 calcEfficiency.C:3206
 calcEfficiency.C:3207
 calcEfficiency.C:3208
 calcEfficiency.C:3209
 calcEfficiency.C:3210
 calcEfficiency.C:3211
 calcEfficiency.C:3212
 calcEfficiency.C:3213
 calcEfficiency.C:3214
 calcEfficiency.C:3215
 calcEfficiency.C:3216
 calcEfficiency.C:3217
 calcEfficiency.C:3218
 calcEfficiency.C:3219
 calcEfficiency.C:3220
 calcEfficiency.C:3221
 calcEfficiency.C:3222
 calcEfficiency.C:3223
 calcEfficiency.C:3224
 calcEfficiency.C:3225
 calcEfficiency.C:3226
 calcEfficiency.C:3227
 calcEfficiency.C:3228
 calcEfficiency.C:3229
 calcEfficiency.C:3230
 calcEfficiency.C:3231
 calcEfficiency.C:3232
 calcEfficiency.C:3233
 calcEfficiency.C:3234
 calcEfficiency.C:3235
 calcEfficiency.C:3236
 calcEfficiency.C:3237
 calcEfficiency.C:3238
 calcEfficiency.C:3239
 calcEfficiency.C:3240
 calcEfficiency.C:3241
 calcEfficiency.C:3242
 calcEfficiency.C:3243
 calcEfficiency.C:3244
 calcEfficiency.C:3245
 calcEfficiency.C:3246
 calcEfficiency.C:3247
 calcEfficiency.C:3248
 calcEfficiency.C:3249
 calcEfficiency.C:3250
 calcEfficiency.C:3251
 calcEfficiency.C:3252
 calcEfficiency.C:3253
 calcEfficiency.C:3254
 calcEfficiency.C:3255
 calcEfficiency.C:3256
 calcEfficiency.C:3257
 calcEfficiency.C:3258
 calcEfficiency.C:3259
 calcEfficiency.C:3260
 calcEfficiency.C:3261
 calcEfficiency.C:3262
 calcEfficiency.C:3263
 calcEfficiency.C:3264
 calcEfficiency.C:3265
 calcEfficiency.C:3266
 calcEfficiency.C:3267
 calcEfficiency.C:3268
 calcEfficiency.C:3269
 calcEfficiency.C:3270
 calcEfficiency.C:3271
 calcEfficiency.C:3272
 calcEfficiency.C:3273
 calcEfficiency.C:3274
 calcEfficiency.C:3275
 calcEfficiency.C:3276
 calcEfficiency.C:3277
 calcEfficiency.C:3278
 calcEfficiency.C:3279
 calcEfficiency.C:3280
 calcEfficiency.C:3281
 calcEfficiency.C:3282
 calcEfficiency.C:3283
 calcEfficiency.C:3284
 calcEfficiency.C:3285
 calcEfficiency.C:3286
 calcEfficiency.C:3287
 calcEfficiency.C:3288
 calcEfficiency.C:3289
 calcEfficiency.C:3290
 calcEfficiency.C:3291
 calcEfficiency.C:3292
 calcEfficiency.C:3293
 calcEfficiency.C:3294
 calcEfficiency.C:3295