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

#include "AliPID.h"

#include <iostream>

#include "THnSparseDefinitions.h"

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

//___________________________________________________________________
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);
  }
}


//___________________________________________________________________
Int_t extractGenMCtruth(TString pathNameData, TString listName,
                        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*/)
{
  if (listName == "") {
    listName = pathNameData;
    listName.Replace(0, listName.Last('/') + 1, "");
    listName.ReplaceAll(".root", "");
  }
  
  TString titles[kNtypes];
  titles[kTrackPt] = "trackPt";
  titles[kZ] = "z";
  titles[kXi] = "xi";
  
  TString pathData = pathNameData;
  pathData.Replace(pathData.Last('/'), pathData.Length(), "");
  
  
  TH2D* hNjetsGenData = 0x0;
  TH2D* hNjetsRecData = 0x0;
  
  TH1D* hMCgenPrimYieldPt[AliPID::kSPECIES] = {0x0, };
  TH1D* hMCgenPrimYieldZ[AliPID::kSPECIES] = {0x0, };
  TH1D* hMCgenPrimYieldXi[AliPID::kSPECIES] = {0x0, };

  TFile* fileData = TFile::Open(pathNameData.Data());
  if (!fileData) {
    printf("Failed to open data file \"%s\"\n", pathNameData.Data());
    return -1;
  }
  
  TObjArray* histList = (TObjArray*)(fileData->Get(listName.Data()));
  THnSparse* hMCgeneratedYieldsPrimaries = (THnSparse*)histList->FindObject("fhMCgeneratedYieldsPrimaries");
  
  if (!hMCgeneratedYieldsPrimaries) {
    printf("Failed to load generated primary yields!\n");
    return -1;
  }
  
  // Set proper errors, if not yet calculated
  if (!hMCgeneratedYieldsPrimaries->GetCalculateErrors()) {
    std::cout << "Re-calculating errors of " << hMCgeneratedYieldsPrimaries->GetName() << "..." << std::endl;
    
    hMCgeneratedYieldsPrimaries->Sumw2();
    
    Long64_t nBinsTHnSparseGenYield = hMCgeneratedYieldsPrimaries->GetNbins();
    Double_t binContentGenYield = 0;
    for (Long64_t bin = 0; bin < nBinsTHnSparseGenYield; bin++) {
      binContentGenYield = hMCgeneratedYieldsPrimaries->GetBinContent(bin);
      hMCgeneratedYieldsPrimaries->SetBinError(bin, TMath::Sqrt(binContentGenYield));
    }
  }
  
  hNjetsGenData = (TH2D*)histList->FindObject("fh2FFJetPtGen");
  
  hNjetsRecData = (TH2D*)histList->FindObject("fh2FFJetPtRec");
  
  Bool_t restrictJetPtAxis = (lowerJetPt >= 0 && upperJetPt >= 0);
  
  if (restrictJetPtAxis && (!hNjetsRecData || !hNjetsGenData)) {
    printf("Failed to load numJet histo for data!\n");
    
    // 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 pathBackward = Form("%s/AnalysisResults.root", pathData.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");
      
      hNjetsRecData = new TH2D("fh2FFJetPtRec", "", 1, -1, 1, hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->GetNbins(),
                               hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->GetXbins()->GetArray());
      
      for (Int_t iJet = 1; iJet <= hNjetsRecData->GetNbinsY(); iJet++) {
        Int_t lowerBin = hFFJetPtRec->FindBin(hNjetsRecData->GetYaxis()->GetBinLowEdge(iJet) + 1e-3);
        Int_t upperBin = hFFJetPtRec->FindBin(hNjetsRecData->GetYaxis()->GetBinUpEdge(iJet) - 1e-3);
        hNjetsRecData->SetBinContent(1, iJet, hFFJetPtRec->Integral(lowerBin, upperBin));
      }
      
      hNjetsGenData = new TH2D("fh2FFJetPtGen", "", 1, -1, 1,  hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->GetNbins(),
                               hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->GetXbins()->GetArray());
      
      for (Int_t iJet = 1; iJet <= hNjetsGenData->GetNbinsY(); iJet++) {
        Int_t lowerBin = hFFJetPtGen->FindBin(hNjetsGenData->GetYaxis()->GetBinLowEdge(iJet) + 1e-3);
        Int_t upperBin = hFFJetPtGen->FindBin(hNjetsGenData->GetYaxis()->GetBinUpEdge(iJet) - 1e-3);
        hNjetsGenData->SetBinContent(1, iJet, hFFJetPtGen->Integral(lowerBin, upperBin));
      }
    }
    
    if (!hNjetsRecData || ! hNjetsGenData)
      return -1;
  }
  
  const Bool_t restrictCentralityData = ((lowerCentrality >= -1) && (upperCentrality >= -1));
  // Integral(lowerCentBinLimitData, uppCentBinLimitData) will not be restricted if these values are kept
  const Int_t lowerCentralityBinLimitData = restrictCentralityData ? hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldCentrality)->FindBin(lowerCentrality + 0.001) 
                                                                   : -1;
  const Int_t upperCentralityBinLimitData = restrictCentralityData ? hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldCentrality)->FindBin(upperCentrality - 0.001) 
                                                                   : -2;
  
  const Double_t actualLowerCentralityData = hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldCentrality)->GetBinLowEdge(lowerCentralityBinLimitData);
  
  const Double_t actualUpperCentralityData = hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldCentrality)->GetBinLowEdge(upperCentralityBinLimitData);
  
  // Integral(lowerJetBinLimitData, uppJetBinLimitData) will not be restricted if these values are kept
  const Int_t lowerJetPtBinLimitData = restrictJetPtAxis 
                                       ? hNjetsRecData->GetYaxis()->FindBin(lowerJetPt + 0.001) : -1;
  const Int_t upperJetPtBinLimitData  = restrictJetPtAxis 
                                       ? hNjetsRecData->GetYaxis()->FindBin(upperJetPt - 0.001) : -2;
  
  const Double_t actualLowerJetPtData = restrictJetPtAxis ? hNjetsRecData->GetYaxis()->GetBinLowEdge(lowerJetPtBinLimitData) : -1;
  const Double_t actualUpperJetPtData = restrictJetPtAxis ? hNjetsRecData->GetYaxis()->GetBinUpEdge(upperJetPtBinLimitData)  : -1;
  
  if (restrictCentralityData)
    hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldCentrality)->SetRange(lowerCentralityBinLimitData, upperCentralityBinLimitData);
  
  const Bool_t restrictCharge = (chargeMode != kAllCharged);
  
  Int_t lowerChargeBinLimitGenYield = -1;
  Int_t upperChargeBinLimitGenYield = -2;
    
  if (restrictCharge) {
    const Int_t indexChargeAxisGenYield = GetAxisByTitle(hMCgeneratedYieldsPrimaries, "Charge (e_{0})");
    if (indexChargeAxisGenYield < 0) {
      std::cout << "Error: Charge axis not found for gen yield histogram!" << std::endl;
      return -1;
    }

    // Add subtract a very small number to avoid problems with values right on the border between to bins
    if (chargeMode == kNegCharge) {
      lowerChargeBinLimitGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->FindBin(-1. + 0.001);
      upperChargeBinLimitGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->FindBin(0. - 0.001);
    }
    else if (chargeMode == kPosCharge) {
      lowerChargeBinLimitGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->FindBin(0. + 0.001);
      upperChargeBinLimitGenYield = hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->FindBin(1. - 0.001);
    }
    
    // Check if the values look reasonable
    if (lowerChargeBinLimitGenYield <= upperChargeBinLimitGenYield && lowerChargeBinLimitGenYield >= 1
        && upperChargeBinLimitGenYield <= hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->GetNbins()) {
      // OK
    }
    else {
      std::cout << std::endl;
      std::cout << "Requested charge range (gen yield) out of limits or upper and lower limit are switched!" << std::endl;
      return -1;
    }
    
    hMCgeneratedYieldsPrimaries->GetAxis(indexChargeAxisGenYield)->SetRange(lowerChargeBinLimitGenYield, upperChargeBinLimitGenYield);
  }
  
  // If desired, restrict jetPt axis
  Int_t lowerJetPtBinLimit = -1;
  Int_t upperJetPtBinLimit = -1;
  Double_t actualLowerJetPt = -1.;
  Double_t actualUpperJetPt = -1.;
  
  if (restrictJetPtAxis) {
    // Add subtract a very small number to avoid problems with values right on the border between to bins
    lowerJetPtBinLimit = hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->FindBin(lowerJetPt + 0.001);
    upperJetPtBinLimit = hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->FindBin(upperJetPt - 0.001);
    
    // Check if the values look reasonable
    if (lowerJetPtBinLimit <= upperJetPtBinLimit && lowerJetPtBinLimit >= 1 &&
        upperJetPtBinLimit <= hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->GetNbins()) {
      actualLowerJetPt = hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->GetBinLowEdge(lowerJetPtBinLimit);
      actualUpperJetPt = hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->GetBinUpEdge(upperJetPtBinLimit);

      restrictJetPtAxis = kTRUE;
    
      if (TMath::Abs(actualLowerJetPt - actualLowerJetPtData) > 1e-3 || TMath::Abs(actualUpperJetPt - actualUpperJetPtData) > 1e-3) {
        std::cout << std::endl;
        std::cout << "Mismatch between jet pT range of gen histo and num jet histo!" << std::endl;
        return -1;
      }
    }
    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;
    hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldJetPt)->SetRange(lowerJetPtBinLimit, upperJetPtBinLimit);
  }
  else {
    std::cout << "All" << std::endl;
  }
  
  
  
  for (Int_t MCid = 0; MCid < AliPID::kSPECIES; MCid++) {
    hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldMCpid)->SetRange(MCid + 1, MCid + 1);
    
    hMCgenPrimYieldPt[MCid] = hMCgeneratedYieldsPrimaries->Projection(kPidGenYieldPt, "e");
    hMCgenPrimYieldPt[MCid]->SetName(Form("hMCgenYieldsPrimPt_%s", AliPID::ParticleShortName(MCid)));
    hMCgenPrimYieldPt[MCid]->SetTitle(Form("MC truth generated primary yield, %s", AliPID::ParticleName(MCid)));
    hMCgenPrimYieldPt[MCid]->GetYaxis()->SetTitle("1/N_{Jets} dN/dP_{T} (GeV/c)^{-1}");
    hMCgenPrimYieldPt[MCid]->SetStats(kFALSE);
    
    if (hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldZ)) { // For backward compatibility
      hMCgenPrimYieldZ[MCid] = hMCgeneratedYieldsPrimaries->Projection(kPidGenYieldZ, "e");
      hMCgenPrimYieldZ[MCid]->SetName(Form("hMCgenYieldsPrimZ_%s", AliPID::ParticleShortName(MCid)));
      hMCgenPrimYieldZ[MCid]->SetTitle(Form("MC truth generated primary yield, %s", AliPID::ParticleName(MCid)));
      hMCgenPrimYieldZ[MCid]->GetYaxis()->SetTitle("1/N_{Jets} dN/dz");
      hMCgenPrimYieldZ[MCid]->SetStats(kFALSE);
    }

    if (hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldXi)) {
      hMCgenPrimYieldXi[MCid] = hMCgeneratedYieldsPrimaries->Projection(kPidGenYieldXi, "e");
      hMCgenPrimYieldXi[MCid]->SetName(Form("hMCgenYieldsPrimXi_%s", AliPID::ParticleShortName(MCid)));
      hMCgenPrimYieldXi[MCid]->SetTitle(Form("MC truth generated primary yield, %s", AliPID::ParticleName(MCid)));
      hMCgenPrimYieldXi[MCid]->GetYaxis()->SetTitle("1/N_{Jets} dN/d#xi");
      hMCgenPrimYieldXi[MCid]->SetStats(kFALSE);
    }
    
    hMCgeneratedYieldsPrimaries->GetAxis(kPidGenYieldMCpid)->SetRange(0, -1);
  }
  
  // Obtain uncorrected fractions
  THnSparse* hPIDdata = dynamic_cast<THnSparse*>(histList->FindObject("hPIDdataAll"));
  if (!hPIDdata) {
    std::cout << std::endl;
    std::cout << "Failed to load data histo!" << std::endl;
    return -1;
  }
  
  // Set proper errors, if not yet calculated
  if (!hPIDdata->GetCalculateErrors()) {
    std::cout << "Re-calculating errors of " << hPIDdata->GetName() << "..." << std::endl;
    hPIDdata->Sumw2();
    Long64_t nBinsTHnSparse = hPIDdata->GetNbins();
    Double_t binContent = 0;
    
    for (Long64_t bin = 0; bin < nBinsTHnSparse; bin++) {
      binContent = hPIDdata->GetBinContent(bin);
      hPIDdata->SetBinError(bin, TMath::Sqrt(binContent));
    }
  }
  
  // Bin limits are the same as in gen yield histo
  if (restrictCentralityData) 
    hPIDdata->GetAxis(kPidCentrality)->SetRange(lowerCentralityBinLimitData, upperCentralityBinLimitData);
  
  if (restrictJetPtAxis)
    hPIDdata->GetAxis(kPidJetPt)->SetRange(lowerJetPtBinLimit, upperJetPtBinLimit);
  
  const Int_t indexChargeAxisData = GetAxisByTitle(hPIDdata, "Charge (e_{0})");
  if (indexChargeAxisData < 0 && restrictCharge) {
    std::cout << "Error: Charge axis not found for data histogram!" << std::endl;
    return -1;
  }
  
  if (restrictCharge)
    hPIDdata->GetAxis(indexChargeAxisData)->SetRange(lowerChargeBinLimitGenYield, upperChargeBinLimitGenYield);
  
  
  hPIDdata->GetAxis(kPidSelectSpecies)->SetRange(1, 1); // Do not count each particle more than once
  
  
  TH1D* hMCuncorrYieldPt[AliPID::kSPECIES] = {0x0, };
  TH1D* hMCuncorrYieldZ[AliPID::kSPECIES] = {0x0, };
  TH1D* hMCuncorrYieldXi[AliPID::kSPECIES] = {0x0, };
  
  for (Int_t MCid = 0; MCid < AliPID::kSPECIES; MCid++) {
    // Unfortunately, different MC bins than AliPID
    Int_t MCbinInHisto = 0;
    
    switch (MCid) {
      case AliPID::kElectron:
        MCbinInHisto = 1;
        break;
      case AliPID::kKaon:
        MCbinInHisto = 2;
        break;
      case AliPID::kMuon:
        MCbinInHisto = 3;
        break;
      case AliPID::kPion:
        MCbinInHisto = 4;
        break;
      case AliPID::kProton:
        MCbinInHisto = 5;
        break;
      default:
        break;
    }
    
    hPIDdata->GetAxis(kPidMCpid)->SetRange(MCbinInHisto, MCbinInHisto);
    
    hMCuncorrYieldPt[MCid] = hPIDdata->Projection(kPidPt, "e");
    hMCuncorrYieldPt[MCid]->SetName(Form("hMCuncorrYieldsPt%s", AliPID::ParticleShortName(MCid)));
    hMCuncorrYieldPt[MCid]->SetTitle(Form("MC truth uncorrected yield, %s", AliPID::ParticleName(MCid)));
    hMCuncorrYieldPt[MCid]->GetYaxis()->SetTitle("1/N_{Jets} dN/dP_{T} (GeV/c)^{-1}");
    hMCuncorrYieldPt[MCid]->SetStats(kFALSE);
    
    if (hPIDdata->GetAxis(kPidZ)) { // For backward compatibility
      hMCuncorrYieldZ[MCid] = hPIDdata->Projection(kPidZ, "e");
      hMCuncorrYieldZ[MCid]->SetName(Form("hMCuncorrYieldsPrimZ_%s", AliPID::ParticleShortName(MCid)));
      hMCuncorrYieldZ[MCid]->SetTitle(Form("MC truth uncorrected yield, %s", AliPID::ParticleName(MCid)));
      hMCuncorrYieldZ[MCid]->GetYaxis()->SetTitle("1/N_{Jets} dN/dz");
      hMCuncorrYieldZ[MCid]->SetStats(kFALSE);
    }

    if (hPIDdata->GetAxis(kPidXi)) {
      hMCuncorrYieldXi[MCid] = hPIDdata->Projection(kPidXi, "e");
      hMCuncorrYieldXi[MCid]->SetName(Form("hMCuncorrYieldsPrimXi_%s", AliPID::ParticleShortName(MCid)));
      hMCuncorrYieldXi[MCid]->SetTitle(Form("MC truth uncorrected yield, %s", AliPID::ParticleName(MCid)));
      hMCuncorrYieldXi[MCid]->GetYaxis()->SetTitle("1/N_{Jets} dN/d#xi");
      hMCuncorrYieldXi[MCid]->SetStats(kFALSE);
    }
    
    hPIDdata->GetAxis(kPidMCpid)->SetRange(0, -1);
  }
  
  // Save results to file
  TString chargeString = "";
  if (chargeMode == kPosCharge)
    chargeString = "_posCharge";
  else if (chargeMode == kNegCharge)
    chargeString = "_negCharge";
  
  TString saveFileName = pathNameData;
  saveFileName.Replace(0, pathNameData.Last('/') + 1, "");
  
  TString savePath = pathNameData;
  savePath.ReplaceAll(Form("/%s", saveFileName.Data()), "");
  
  saveFileName.Prepend("output_extractedGenPrimYields_");
  TString centralityString = restrictCentralityData ? Form("_centrality_%.0f_%.0f.root", actualLowerCentralityData,
                                                           actualUpperCentralityData)
                                                    : "_centrality_all";
  TString jetPtString = restrictJetPtAxis ? Form("_jetPt_%.0f_%.0f.root", actualLowerJetPt, actualUpperJetPt)
                                          : "";  
  saveFileName.ReplaceAll(".root", Form("%s%s%s.root", centralityString.Data(), jetPtString.Data(), chargeString.Data()));
  
  TString saveFilePathName = Form("%s/%s", savePath.Data(), saveFileName.Data());
  TFile* saveFile = TFile::Open(saveFilePathName.Data(), "RECREATE");
  
  if (!saveFile) {
    printf("Failed to save results to file \"%s\"!\n", saveFilePathName.Data());
    return -1;
  }
  
  saveFile->cd();
  
  
  
  // Calculate the fractions and do the normalisation
  
  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 type = 0; type < kNtypes; type++) {
    TH1D** hMCgenPrimYield;
    TH1D** hMCuncorrYield;
    
    if (type == kTrackPt) {
      hMCgenPrimYield = &hMCgenPrimYieldPt[0];
      hMCuncorrYield = &hMCuncorrYieldPt[0];
    }
    else if (type == kZ) {
      hMCgenPrimYield = &hMCgenPrimYieldZ[0];
      hMCuncorrYield = &hMCuncorrYieldZ[0];
    }
    else if (type == kXi) {
      hMCgenPrimYield = &hMCgenPrimYieldXi[0];
      hMCuncorrYield = &hMCuncorrYieldXi[0];
    }
    else
      continue;
    
    // Gen yields
    if (hMCgenPrimYield[0]) {
      for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
        normaliseHist(hMCgenPrimYield[species], (nJetsGenData > 0) ? 1. / nJetsGenData : 0.);
        hMCgenPrimYield[species]->SetStats(kFALSE);

        hMCgenPrimYield[species]->SetTitle(Form("%s (MC)", AliPID::ParticleLatexName(species)));
        hMCgenPrimYield[species]->SetMarkerStyle(24);
        hMCgenPrimYield[species]->SetLineColor(getLineColorAliPID(species));
        hMCgenPrimYield[species]->SetMarkerColor(getLineColorAliPID(species));
      }
      
      TH1D* hMCgenPrimYieldTotal = 0x0;
      TH1D* hMCgenPrimFraction[AliPID::kSPECIES];
      for (Int_t i = 0; i < AliPID::kSPECIES; i++)
        hMCgenPrimFraction[i] = 0x0;
      
      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)");
      //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)", 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());
        hMCgenPrimFraction[species]->GetYaxis()->SetTitle("Particle Fraction");

        // 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"); 
        hMCgenPrimFraction[species]->GetYaxis()->SetRangeUser(0., 1.);
      }
      
      if (hMCgenPrimYieldTotal) {
        hMCgenPrimYieldTotal->GetYaxis()->SetTitleOffset(1.4);
        hMCgenPrimYieldTotal->GetXaxis()->SetMoreLogLabels(kTRUE);
        hMCgenPrimYieldTotal->GetXaxis()->SetNoExponent(kTRUE);
      }
      
      TCanvas* cGenYield = new TCanvas(Form("cGenYield_%s", titles[type].Data()), "Generated Yield", 0, 300, 900, 900);
      cGenYield->SetLogx(1);
      cGenYield->SetLogy(1);
      
      hMCgenPrimYieldTotal->Draw("E1");
      
      for (Int_t i = 0; i < AliPID::kSPECIES; i++) 
        hMCgenPrimYield[i]->Draw("E1 same");
      
      TLegend* legTemp = cGenYield->BuildLegend();//0.25, 0.16, 0.65, 0.51);
      legTemp->SetFillColor(kWhite);
      
      ClearTitleFromHistoInCanvas(cGenYield);
      

      TCanvas* cGenFractions = new TCanvas(Form("cGenFractions_%s", titles[type].Data()), "Generated Fractions", 0, 300, 900, 900);
      cGenFractions->SetLogx(1);
      
      hMCgenPrimFraction[0]->Draw("E1");
      
      for (Int_t i = 1; i < AliPID::kSPECIES; i++)
        hMCgenPrimFraction[i]->Draw("E1 same");
      
      cGenFractions->BuildLegend()->SetFillColor(kWhite);
      
      ClearTitleFromHistoInCanvas(cGenFractions);
      
      // Save results
      saveFile->cd();
      
      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 (hMCgenPrimFraction[i])
          hMCgenPrimFraction[i]->Write();
      }
      
      if (cGenYield)
        cGenYield->Write();
      
      if (cGenFractions)
        cGenFractions->Write();
    }
    
    
    // Uncorr gen yields
    if (hMCuncorrYield[0]) {
      for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
        normaliseHist(hMCuncorrYield[species], (nJetsGenData > 0) ? 1. / nJetsGenData : 0.);
        hMCuncorrYield[species]->SetStats(kFALSE);

        hMCuncorrYield[species]->SetTitle(Form("%s (MC)", AliPID::ParticleLatexName(species)));
        hMCuncorrYield[species]->SetMarkerStyle(24);
        hMCuncorrYield[species]->SetLineColor(getLineColorAliPID(species));
        hMCuncorrYield[species]->SetMarkerColor(getLineColorAliPID(species));
      }
      
      TH1D* hMCuncorrYieldTotal = 0x0;
      TH1D* hMCuncorrFraction[AliPID::kSPECIES];
      for (Int_t i = 0; i < AliPID::kSPECIES; i++)
        hMCuncorrFraction[i] = 0x0;
      
      hMCuncorrYieldTotal = new TH1D(*hMCuncorrYield[0]);
      hMCuncorrYieldTotal->SetLineColor(kBlack);
      hMCuncorrYieldTotal->SetMarkerColor(kBlack);
      hMCuncorrYieldTotal->SetMarkerStyle(24);
      hMCuncorrYieldTotal->SetName(Form("hMCuncorrYieldTotal%s", titles[type].Data()));
      hMCuncorrYieldTotal->SetTitle("Total (MC)");
      //hMCuncorrYieldTotal->SetTitle("Total uncorrected yield (MC truth)");
      
      for (Int_t i = 1; i < AliPID::kSPECIES; i++)
        hMCuncorrYieldTotal->Add(hMCuncorrYield[i], 1.);
      
      // Calculate the MC fractions
      for (Int_t species = 0; species < AliPID::kSPECIES; species++) {
        hMCuncorrYield[species]->SetLineColor(getLineColorAliPID(species));
        hMCuncorrYield[species]->SetMarkerColor(getLineColorAliPID(species));
        hMCuncorrYield[species]->SetMarkerStyle(24);
      
        hMCuncorrYield[species]->SetTitle(Form("%s (MC)", AliPID::ParticleLatexName(species)));
        
        hMCuncorrFraction[species] = new TH1D(*hMCuncorrYield[species]);
        TString oldName = hMCuncorrYield[species]->GetName();
        TString newName = oldName.ReplaceAll("Yield", "Fraction");
        hMCuncorrFraction[species]->SetName(newName.Data());
        hMCuncorrFraction[species]->GetYaxis()->SetTitle("Particle Fraction");

        // Binomial error as for efficiencies (numerator and denominator are statistically not independent) for correct error calculation
        // (numerator is a "selected" subset of the denominator).
        hMCuncorrFraction[species]->Divide(hMCuncorrFraction[species], hMCuncorrYieldTotal, 1., 1., "B"); 
        hMCuncorrFraction[species]->GetYaxis()->SetRangeUser(0., 1.);
      }
      
      if (hMCuncorrYieldTotal) {
        hMCuncorrYieldTotal->GetYaxis()->SetTitleOffset(1.4);
        hMCuncorrYieldTotal->GetXaxis()->SetMoreLogLabels(kTRUE);
        hMCuncorrYieldTotal->GetXaxis()->SetNoExponent(kTRUE);
      }
      
      TCanvas* cGenUncorrYield = new TCanvas(Form("cGenUncorrYield_%s", titles[type].Data()), "Generated Uncorrected Yield",
                                             0, 300, 900, 900);
      cGenUncorrYield->SetLogx(1);
      cGenUncorrYield->SetLogy(1);
      
      hMCuncorrYieldTotal->Draw("E1");
      
      for (Int_t i = 0; i < AliPID::kSPECIES; i++) 
        hMCuncorrYield[i]->Draw("E1 same");
      
      TLegend* legTemp = cGenUncorrYield->BuildLegend();//0.25, 0.16, 0.65, 0.51);
      legTemp->SetFillColor(kWhite);
      
      ClearTitleFromHistoInCanvas(cGenUncorrYield);
      

      TCanvas* cGenUncorrFractions = new TCanvas(Form("cGenUncorrFractions_%s", titles[type].Data()), "Generated Uncorrected Fractions",
                                           0, 300, 900, 900);
      cGenUncorrFractions->SetLogx(1);
      
      hMCuncorrFraction[0]->Draw("E1");
      
      for (Int_t i = 1; i < AliPID::kSPECIES; i++)
        hMCuncorrFraction[i]->Draw("E1 same");
      
      cGenUncorrFractions->BuildLegend()->SetFillColor(kWhite);
      
      ClearTitleFromHistoInCanvas(cGenUncorrFractions);
      
      // Save results
      saveFile->cd();
      
      for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
        if (hMCuncorrYield[i])
          hMCuncorrYield[i]->Write();
      }
      
      if (hMCuncorrYieldTotal)
          hMCuncorrYieldTotal->Write();
      
      for (Int_t i = 0; i < AliPID::kSPECIES; i++) {
        if (hMCuncorrFraction[i])
          hMCuncorrFraction[i]->Write();
      }
      
      if (cGenUncorrYield)
        cGenUncorrYield->Write();
      
      if (cGenUncorrFractions)
        cGenUncorrFractions->Write();
    }
  }
  
  saveFile->cd();
  
  TNamed* settings = new TNamed(
      Form("Settings: Data file \"%s\", lowerCentrality %.3f, upperCentrality %.3f, lowerJetPt %.1f, upperJetPt %.1f\n",
           pathNameData.Data(), lowerCentrality, upperCentrality, lowerJetPt, upperJetPt), "");
  settings->Write();
  
  saveFile->Close();
  
  
  return 0;
 extractGenMCtruth.C:1
 extractGenMCtruth.C:2
 extractGenMCtruth.C:3
 extractGenMCtruth.C:4
 extractGenMCtruth.C:5
 extractGenMCtruth.C:6
 extractGenMCtruth.C:7
 extractGenMCtruth.C:8
 extractGenMCtruth.C:9
 extractGenMCtruth.C:10
 extractGenMCtruth.C:11
 extractGenMCtruth.C:12
 extractGenMCtruth.C:13
 extractGenMCtruth.C:14
 extractGenMCtruth.C:15
 extractGenMCtruth.C:16
 extractGenMCtruth.C:17
 extractGenMCtruth.C:18
 extractGenMCtruth.C:19
 extractGenMCtruth.C:20
 extractGenMCtruth.C:21
 extractGenMCtruth.C:22
 extractGenMCtruth.C:23
 extractGenMCtruth.C:24
 extractGenMCtruth.C:25
 extractGenMCtruth.C:26
 extractGenMCtruth.C:27
 extractGenMCtruth.C:28
 extractGenMCtruth.C:29
 extractGenMCtruth.C:30
 extractGenMCtruth.C:31
 extractGenMCtruth.C:32
 extractGenMCtruth.C:33
 extractGenMCtruth.C:34
 extractGenMCtruth.C:35
 extractGenMCtruth.C:36
 extractGenMCtruth.C:37
 extractGenMCtruth.C:38
 extractGenMCtruth.C:39
 extractGenMCtruth.C:40
 extractGenMCtruth.C:41
 extractGenMCtruth.C:42
 extractGenMCtruth.C:43
 extractGenMCtruth.C:44
 extractGenMCtruth.C:45
 extractGenMCtruth.C:46
 extractGenMCtruth.C:47
 extractGenMCtruth.C:48
 extractGenMCtruth.C:49
 extractGenMCtruth.C:50
 extractGenMCtruth.C:51
 extractGenMCtruth.C:52
 extractGenMCtruth.C:53
 extractGenMCtruth.C:54
 extractGenMCtruth.C:55
 extractGenMCtruth.C:56
 extractGenMCtruth.C:57
 extractGenMCtruth.C:58
 extractGenMCtruth.C:59
 extractGenMCtruth.C:60
 extractGenMCtruth.C:61
 extractGenMCtruth.C:62
 extractGenMCtruth.C:63
 extractGenMCtruth.C:64
 extractGenMCtruth.C:65
 extractGenMCtruth.C:66
 extractGenMCtruth.C:67
 extractGenMCtruth.C:68
 extractGenMCtruth.C:69
 extractGenMCtruth.C:70
 extractGenMCtruth.C:71
 extractGenMCtruth.C:72
 extractGenMCtruth.C:73
 extractGenMCtruth.C:74
 extractGenMCtruth.C:75
 extractGenMCtruth.C:76
 extractGenMCtruth.C:77
 extractGenMCtruth.C:78
 extractGenMCtruth.C:79
 extractGenMCtruth.C:80
 extractGenMCtruth.C:81
 extractGenMCtruth.C:82
 extractGenMCtruth.C:83
 extractGenMCtruth.C:84
 extractGenMCtruth.C:85
 extractGenMCtruth.C:86
 extractGenMCtruth.C:87
 extractGenMCtruth.C:88
 extractGenMCtruth.C:89
 extractGenMCtruth.C:90
 extractGenMCtruth.C:91
 extractGenMCtruth.C:92
 extractGenMCtruth.C:93
 extractGenMCtruth.C:94
 extractGenMCtruth.C:95
 extractGenMCtruth.C:96
 extractGenMCtruth.C:97
 extractGenMCtruth.C:98
 extractGenMCtruth.C:99
 extractGenMCtruth.C:100
 extractGenMCtruth.C:101
 extractGenMCtruth.C:102
 extractGenMCtruth.C:103
 extractGenMCtruth.C:104
 extractGenMCtruth.C:105
 extractGenMCtruth.C:106
 extractGenMCtruth.C:107
 extractGenMCtruth.C:108
 extractGenMCtruth.C:109
 extractGenMCtruth.C:110
 extractGenMCtruth.C:111
 extractGenMCtruth.C:112
 extractGenMCtruth.C:113
 extractGenMCtruth.C:114
 extractGenMCtruth.C:115
 extractGenMCtruth.C:116
 extractGenMCtruth.C:117
 extractGenMCtruth.C:118
 extractGenMCtruth.C:119
 extractGenMCtruth.C:120
 extractGenMCtruth.C:121
 extractGenMCtruth.C:122
 extractGenMCtruth.C:123
 extractGenMCtruth.C:124
 extractGenMCtruth.C:125
 extractGenMCtruth.C:126
 extractGenMCtruth.C:127
 extractGenMCtruth.C:128
 extractGenMCtruth.C:129
 extractGenMCtruth.C:130
 extractGenMCtruth.C:131
 extractGenMCtruth.C:132
 extractGenMCtruth.C:133
 extractGenMCtruth.C:134
 extractGenMCtruth.C:135
 extractGenMCtruth.C:136
 extractGenMCtruth.C:137
 extractGenMCtruth.C:138
 extractGenMCtruth.C:139
 extractGenMCtruth.C:140
 extractGenMCtruth.C:141
 extractGenMCtruth.C:142
 extractGenMCtruth.C:143
 extractGenMCtruth.C:144
 extractGenMCtruth.C:145
 extractGenMCtruth.C:146
 extractGenMCtruth.C:147
 extractGenMCtruth.C:148
 extractGenMCtruth.C:149
 extractGenMCtruth.C:150
 extractGenMCtruth.C:151
 extractGenMCtruth.C:152
 extractGenMCtruth.C:153
 extractGenMCtruth.C:154
 extractGenMCtruth.C:155
 extractGenMCtruth.C:156
 extractGenMCtruth.C:157
 extractGenMCtruth.C:158
 extractGenMCtruth.C:159
 extractGenMCtruth.C:160
 extractGenMCtruth.C:161
 extractGenMCtruth.C:162
 extractGenMCtruth.C:163
 extractGenMCtruth.C:164
 extractGenMCtruth.C:165
 extractGenMCtruth.C:166
 extractGenMCtruth.C:167
 extractGenMCtruth.C:168
 extractGenMCtruth.C:169
 extractGenMCtruth.C:170
 extractGenMCtruth.C:171
 extractGenMCtruth.C:172
 extractGenMCtruth.C:173
 extractGenMCtruth.C:174
 extractGenMCtruth.C:175
 extractGenMCtruth.C:176
 extractGenMCtruth.C:177
 extractGenMCtruth.C:178
 extractGenMCtruth.C:179
 extractGenMCtruth.C:180
 extractGenMCtruth.C:181
 extractGenMCtruth.C:182
 extractGenMCtruth.C:183
 extractGenMCtruth.C:184
 extractGenMCtruth.C:185
 extractGenMCtruth.C:186
 extractGenMCtruth.C:187
 extractGenMCtruth.C:188
 extractGenMCtruth.C:189
 extractGenMCtruth.C:190
 extractGenMCtruth.C:191
 extractGenMCtruth.C:192
 extractGenMCtruth.C:193
 extractGenMCtruth.C:194
 extractGenMCtruth.C:195
 extractGenMCtruth.C:196
 extractGenMCtruth.C:197
 extractGenMCtruth.C:198
 extractGenMCtruth.C:199
 extractGenMCtruth.C:200
 extractGenMCtruth.C:201
 extractGenMCtruth.C:202
 extractGenMCtruth.C:203
 extractGenMCtruth.C:204
 extractGenMCtruth.C:205
 extractGenMCtruth.C:206
 extractGenMCtruth.C:207
 extractGenMCtruth.C:208
 extractGenMCtruth.C:209
 extractGenMCtruth.C:210
 extractGenMCtruth.C:211
 extractGenMCtruth.C:212
 extractGenMCtruth.C:213
 extractGenMCtruth.C:214
 extractGenMCtruth.C:215
 extractGenMCtruth.C:216
 extractGenMCtruth.C:217
 extractGenMCtruth.C:218
 extractGenMCtruth.C:219
 extractGenMCtruth.C:220
 extractGenMCtruth.C:221
 extractGenMCtruth.C:222
 extractGenMCtruth.C:223
 extractGenMCtruth.C:224
 extractGenMCtruth.C:225
 extractGenMCtruth.C:226
 extractGenMCtruth.C:227
 extractGenMCtruth.C:228
 extractGenMCtruth.C:229
 extractGenMCtruth.C:230
 extractGenMCtruth.C:231
 extractGenMCtruth.C:232
 extractGenMCtruth.C:233
 extractGenMCtruth.C:234
 extractGenMCtruth.C:235
 extractGenMCtruth.C:236
 extractGenMCtruth.C:237
 extractGenMCtruth.C:238
 extractGenMCtruth.C:239
 extractGenMCtruth.C:240
 extractGenMCtruth.C:241
 extractGenMCtruth.C:242
 extractGenMCtruth.C:243
 extractGenMCtruth.C:244
 extractGenMCtruth.C:245
 extractGenMCtruth.C:246
 extractGenMCtruth.C:247
 extractGenMCtruth.C:248
 extractGenMCtruth.C:249
 extractGenMCtruth.C:250
 extractGenMCtruth.C:251
 extractGenMCtruth.C:252
 extractGenMCtruth.C:253
 extractGenMCtruth.C:254
 extractGenMCtruth.C:255
 extractGenMCtruth.C:256
 extractGenMCtruth.C:257
 extractGenMCtruth.C:258
 extractGenMCtruth.C:259
 extractGenMCtruth.C:260
 extractGenMCtruth.C:261
 extractGenMCtruth.C:262
 extractGenMCtruth.C:263
 extractGenMCtruth.C:264
 extractGenMCtruth.C:265
 extractGenMCtruth.C:266
 extractGenMCtruth.C:267
 extractGenMCtruth.C:268
 extractGenMCtruth.C:269
 extractGenMCtruth.C:270
 extractGenMCtruth.C:271
 extractGenMCtruth.C:272
 extractGenMCtruth.C:273
 extractGenMCtruth.C:274
 extractGenMCtruth.C:275
 extractGenMCtruth.C:276
 extractGenMCtruth.C:277
 extractGenMCtruth.C:278
 extractGenMCtruth.C:279
 extractGenMCtruth.C:280
 extractGenMCtruth.C:281
 extractGenMCtruth.C:282
 extractGenMCtruth.C:283
 extractGenMCtruth.C:284
 extractGenMCtruth.C:285
 extractGenMCtruth.C:286
 extractGenMCtruth.C:287
 extractGenMCtruth.C:288
 extractGenMCtruth.C:289
 extractGenMCtruth.C:290
 extractGenMCtruth.C:291
 extractGenMCtruth.C:292
 extractGenMCtruth.C:293
 extractGenMCtruth.C:294
 extractGenMCtruth.C:295
 extractGenMCtruth.C:296
 extractGenMCtruth.C:297
 extractGenMCtruth.C:298
 extractGenMCtruth.C:299
 extractGenMCtruth.C:300
 extractGenMCtruth.C:301
 extractGenMCtruth.C:302
 extractGenMCtruth.C:303
 extractGenMCtruth.C:304
 extractGenMCtruth.C:305
 extractGenMCtruth.C:306
 extractGenMCtruth.C:307
 extractGenMCtruth.C:308
 extractGenMCtruth.C:309
 extractGenMCtruth.C:310
 extractGenMCtruth.C:311
 extractGenMCtruth.C:312
 extractGenMCtruth.C:313
 extractGenMCtruth.C:314
 extractGenMCtruth.C:315
 extractGenMCtruth.C:316
 extractGenMCtruth.C:317
 extractGenMCtruth.C:318
 extractGenMCtruth.C:319
 extractGenMCtruth.C:320
 extractGenMCtruth.C:321
 extractGenMCtruth.C:322
 extractGenMCtruth.C:323
 extractGenMCtruth.C:324
 extractGenMCtruth.C:325
 extractGenMCtruth.C:326
 extractGenMCtruth.C:327
 extractGenMCtruth.C:328
 extractGenMCtruth.C:329
 extractGenMCtruth.C:330
 extractGenMCtruth.C:331
 extractGenMCtruth.C:332
 extractGenMCtruth.C:333
 extractGenMCtruth.C:334
 extractGenMCtruth.C:335
 extractGenMCtruth.C:336
 extractGenMCtruth.C:337
 extractGenMCtruth.C:338
 extractGenMCtruth.C:339
 extractGenMCtruth.C:340
 extractGenMCtruth.C:341
 extractGenMCtruth.C:342
 extractGenMCtruth.C:343
 extractGenMCtruth.C:344
 extractGenMCtruth.C:345
 extractGenMCtruth.C:346
 extractGenMCtruth.C:347
 extractGenMCtruth.C:348
 extractGenMCtruth.C:349
 extractGenMCtruth.C:350
 extractGenMCtruth.C:351
 extractGenMCtruth.C:352
 extractGenMCtruth.C:353
 extractGenMCtruth.C:354
 extractGenMCtruth.C:355
 extractGenMCtruth.C:356
 extractGenMCtruth.C:357
 extractGenMCtruth.C:358
 extractGenMCtruth.C:359
 extractGenMCtruth.C:360
 extractGenMCtruth.C:361
 extractGenMCtruth.C:362
 extractGenMCtruth.C:363
 extractGenMCtruth.C:364
 extractGenMCtruth.C:365
 extractGenMCtruth.C:366
 extractGenMCtruth.C:367
 extractGenMCtruth.C:368
 extractGenMCtruth.C:369
 extractGenMCtruth.C:370
 extractGenMCtruth.C:371
 extractGenMCtruth.C:372
 extractGenMCtruth.C:373
 extractGenMCtruth.C:374
 extractGenMCtruth.C:375
 extractGenMCtruth.C:376
 extractGenMCtruth.C:377
 extractGenMCtruth.C:378
 extractGenMCtruth.C:379
 extractGenMCtruth.C:380
 extractGenMCtruth.C:381
 extractGenMCtruth.C:382
 extractGenMCtruth.C:383
 extractGenMCtruth.C:384
 extractGenMCtruth.C:385
 extractGenMCtruth.C:386
 extractGenMCtruth.C:387
 extractGenMCtruth.C:388
 extractGenMCtruth.C:389
 extractGenMCtruth.C:390
 extractGenMCtruth.C:391
 extractGenMCtruth.C:392
 extractGenMCtruth.C:393
 extractGenMCtruth.C:394
 extractGenMCtruth.C:395
 extractGenMCtruth.C:396
 extractGenMCtruth.C:397
 extractGenMCtruth.C:398
 extractGenMCtruth.C:399
 extractGenMCtruth.C:400
 extractGenMCtruth.C:401
 extractGenMCtruth.C:402
 extractGenMCtruth.C:403
 extractGenMCtruth.C:404
 extractGenMCtruth.C:405
 extractGenMCtruth.C:406
 extractGenMCtruth.C:407
 extractGenMCtruth.C:408
 extractGenMCtruth.C:409
 extractGenMCtruth.C:410
 extractGenMCtruth.C:411
 extractGenMCtruth.C:412
 extractGenMCtruth.C:413
 extractGenMCtruth.C:414
 extractGenMCtruth.C:415
 extractGenMCtruth.C:416
 extractGenMCtruth.C:417
 extractGenMCtruth.C:418
 extractGenMCtruth.C:419
 extractGenMCtruth.C:420
 extractGenMCtruth.C:421
 extractGenMCtruth.C:422
 extractGenMCtruth.C:423
 extractGenMCtruth.C:424
 extractGenMCtruth.C:425
 extractGenMCtruth.C:426
 extractGenMCtruth.C:427
 extractGenMCtruth.C:428
 extractGenMCtruth.C:429
 extractGenMCtruth.C:430
 extractGenMCtruth.C:431
 extractGenMCtruth.C:432
 extractGenMCtruth.C:433
 extractGenMCtruth.C:434
 extractGenMCtruth.C:435
 extractGenMCtruth.C:436
 extractGenMCtruth.C:437
 extractGenMCtruth.C:438
 extractGenMCtruth.C:439
 extractGenMCtruth.C:440
 extractGenMCtruth.C:441
 extractGenMCtruth.C:442
 extractGenMCtruth.C:443
 extractGenMCtruth.C:444
 extractGenMCtruth.C:445
 extractGenMCtruth.C:446
 extractGenMCtruth.C:447
 extractGenMCtruth.C:448
 extractGenMCtruth.C:449
 extractGenMCtruth.C:450
 extractGenMCtruth.C:451
 extractGenMCtruth.C:452
 extractGenMCtruth.C:453
 extractGenMCtruth.C:454
 extractGenMCtruth.C:455
 extractGenMCtruth.C:456
 extractGenMCtruth.C:457
 extractGenMCtruth.C:458
 extractGenMCtruth.C:459
 extractGenMCtruth.C:460
 extractGenMCtruth.C:461
 extractGenMCtruth.C:462
 extractGenMCtruth.C:463
 extractGenMCtruth.C:464
 extractGenMCtruth.C:465
 extractGenMCtruth.C:466
 extractGenMCtruth.C:467
 extractGenMCtruth.C:468
 extractGenMCtruth.C:469
 extractGenMCtruth.C:470
 extractGenMCtruth.C:471
 extractGenMCtruth.C:472
 extractGenMCtruth.C:473
 extractGenMCtruth.C:474
 extractGenMCtruth.C:475
 extractGenMCtruth.C:476
 extractGenMCtruth.C:477
 extractGenMCtruth.C:478
 extractGenMCtruth.C:479
 extractGenMCtruth.C:480
 extractGenMCtruth.C:481
 extractGenMCtruth.C:482
 extractGenMCtruth.C:483
 extractGenMCtruth.C:484
 extractGenMCtruth.C:485
 extractGenMCtruth.C:486
 extractGenMCtruth.C:487
 extractGenMCtruth.C:488
 extractGenMCtruth.C:489
 extractGenMCtruth.C:490
 extractGenMCtruth.C:491
 extractGenMCtruth.C:492
 extractGenMCtruth.C:493
 extractGenMCtruth.C:494
 extractGenMCtruth.C:495
 extractGenMCtruth.C:496
 extractGenMCtruth.C:497
 extractGenMCtruth.C:498
 extractGenMCtruth.C:499
 extractGenMCtruth.C:500
 extractGenMCtruth.C:501
 extractGenMCtruth.C:502
 extractGenMCtruth.C:503
 extractGenMCtruth.C:504
 extractGenMCtruth.C:505
 extractGenMCtruth.C:506
 extractGenMCtruth.C:507
 extractGenMCtruth.C:508
 extractGenMCtruth.C:509
 extractGenMCtruth.C:510
 extractGenMCtruth.C:511
 extractGenMCtruth.C:512
 extractGenMCtruth.C:513
 extractGenMCtruth.C:514
 extractGenMCtruth.C:515
 extractGenMCtruth.C:516
 extractGenMCtruth.C:517
 extractGenMCtruth.C:518
 extractGenMCtruth.C:519
 extractGenMCtruth.C:520
 extractGenMCtruth.C:521
 extractGenMCtruth.C:522
 extractGenMCtruth.C:523
 extractGenMCtruth.C:524
 extractGenMCtruth.C:525
 extractGenMCtruth.C:526
 extractGenMCtruth.C:527
 extractGenMCtruth.C:528
 extractGenMCtruth.C:529
 extractGenMCtruth.C:530
 extractGenMCtruth.C:531
 extractGenMCtruth.C:532
 extractGenMCtruth.C:533
 extractGenMCtruth.C:534
 extractGenMCtruth.C:535
 extractGenMCtruth.C:536
 extractGenMCtruth.C:537
 extractGenMCtruth.C:538
 extractGenMCtruth.C:539
 extractGenMCtruth.C:540
 extractGenMCtruth.C:541
 extractGenMCtruth.C:542
 extractGenMCtruth.C:543
 extractGenMCtruth.C:544
 extractGenMCtruth.C:545
 extractGenMCtruth.C:546
 extractGenMCtruth.C:547
 extractGenMCtruth.C:548
 extractGenMCtruth.C:549
 extractGenMCtruth.C:550
 extractGenMCtruth.C:551
 extractGenMCtruth.C:552
 extractGenMCtruth.C:553
 extractGenMCtruth.C:554
 extractGenMCtruth.C:555
 extractGenMCtruth.C:556
 extractGenMCtruth.C:557
 extractGenMCtruth.C:558
 extractGenMCtruth.C:559
 extractGenMCtruth.C:560
 extractGenMCtruth.C:561
 extractGenMCtruth.C:562
 extractGenMCtruth.C:563
 extractGenMCtruth.C:564
 extractGenMCtruth.C:565
 extractGenMCtruth.C:566
 extractGenMCtruth.C:567
 extractGenMCtruth.C:568
 extractGenMCtruth.C:569
 extractGenMCtruth.C:570
 extractGenMCtruth.C:571
 extractGenMCtruth.C:572
 extractGenMCtruth.C:573
 extractGenMCtruth.C:574
 extractGenMCtruth.C:575
 extractGenMCtruth.C:576
 extractGenMCtruth.C:577
 extractGenMCtruth.C:578
 extractGenMCtruth.C:579
 extractGenMCtruth.C:580
 extractGenMCtruth.C:581
 extractGenMCtruth.C:582
 extractGenMCtruth.C:583
 extractGenMCtruth.C:584
 extractGenMCtruth.C:585
 extractGenMCtruth.C:586
 extractGenMCtruth.C:587
 extractGenMCtruth.C:588
 extractGenMCtruth.C:589
 extractGenMCtruth.C:590
 extractGenMCtruth.C:591
 extractGenMCtruth.C:592
 extractGenMCtruth.C:593
 extractGenMCtruth.C:594
 extractGenMCtruth.C:595
 extractGenMCtruth.C:596
 extractGenMCtruth.C:597
 extractGenMCtruth.C:598
 extractGenMCtruth.C:599
 extractGenMCtruth.C:600
 extractGenMCtruth.C:601
 extractGenMCtruth.C:602
 extractGenMCtruth.C:603
 extractGenMCtruth.C:604
 extractGenMCtruth.C:605
 extractGenMCtruth.C:606
 extractGenMCtruth.C:607
 extractGenMCtruth.C:608
 extractGenMCtruth.C:609
 extractGenMCtruth.C:610
 extractGenMCtruth.C:611
 extractGenMCtruth.C:612
 extractGenMCtruth.C:613
 extractGenMCtruth.C:614
 extractGenMCtruth.C:615
 extractGenMCtruth.C:616
 extractGenMCtruth.C:617
 extractGenMCtruth.C:618
 extractGenMCtruth.C:619
 extractGenMCtruth.C:620
 extractGenMCtruth.C:621
 extractGenMCtruth.C:622
 extractGenMCtruth.C:623
 extractGenMCtruth.C:624
 extractGenMCtruth.C:625
 extractGenMCtruth.C:626
 extractGenMCtruth.C:627
 extractGenMCtruth.C:628
 extractGenMCtruth.C:629
 extractGenMCtruth.C:630
 extractGenMCtruth.C:631
 extractGenMCtruth.C:632
 extractGenMCtruth.C:633
 extractGenMCtruth.C:634
 extractGenMCtruth.C:635
 extractGenMCtruth.C:636
 extractGenMCtruth.C:637
 extractGenMCtruth.C:638
 extractGenMCtruth.C:639
 extractGenMCtruth.C:640
 extractGenMCtruth.C:641
 extractGenMCtruth.C:642
 extractGenMCtruth.C:643
 extractGenMCtruth.C:644
 extractGenMCtruth.C:645
 extractGenMCtruth.C:646