ROOT logo
#include "TTree.h"
#include "TH2D.h"
#include "TH3D.h"
#include "TH3F.h"
#include "TCanvas.h"
#include "TStyle.h"
#include "TList.h"
#include "TString.h"
#include "TFile.h"
#include "TMath.h"
#include "TDatime.h"
#include "TRandom3.h"
#include "TSpline.h"

#include "TF1.h" //TODO NOW

#include <iostream>
#include <iomanip>

#include "THnSparseDefinitions.h"

//__________________________________________________________________________________________
void normaliseHisto(TH2D* h)
{
  h->Sumw2();
  //TODO NOW: Disabled normalisation (doesn't make sense here)
  /*
  for (Int_t x = 1; x <= h->GetXaxis()->GetNbins(); x++) {
    Double_t binWidth = h->GetXaxis()->GetBinWidth(x);
    for (Int_t y = 1; y <= h->GetYaxis()->GetNbins(); y++) {
      Double_t binError = h->GetBinError(x,y);
      h->SetBinContent(x, y, h->GetBinContent(x, y) / binWidth);
      h->SetBinError(x, y, binError / binWidth);
    }
  }*/
}


//_________________________________________________________________________________________
Int_t getBinX(TH2D* h, Double_t tanTheta)
{
  Int_t binX = h->GetXaxis()->FindBin(tanTheta);
  
  if (binX <= 0)
    binX = 1;
  if (binX > h->GetXaxis()->GetNbins())
    binX = h->GetXaxis()->GetNbins();

    return binX;
}


//_________________________________________________________________________________________
Int_t getBinY(TH2D* h, Double_t dEdxInv)
{
  Int_t binY = h->GetYaxis()->FindBin(dEdxInv);
  
  if (binY <= 0)
    binY = 1;
  if (binY > h->GetYaxis()->GetNbins())
    binY = h->GetYaxis()->GetNbins();

  return binY;
}


//_________________________________________________________________________________________
Int_t checkPullTree(TString pathTree,  TString pathNameThetaMap, TString pathNameSigmaMap,
                    TString mapSuffix, const Int_t collType /*0: pp, 1: pPb, 2: PbPb*/, const Bool_t plotPull = kTRUE,
                    const Double_t downScaleFactor = 1,
                    TString pathNameSplinesFile = "", TString prSplinesName = "",
                    TString fileNameTree = "bhess_PIDetaTree.root", TString treeName = "fTree")
{
  const Bool_t isNonPP = collType != 0;
  const Double_t massProton = AliPID::ParticleMass(AliPID::kProton);
  
  Bool_t recalculateExpecteddEdx = pathNameSplinesFile != "";
  
  TFile* f = 0x0;
	
  f = TFile::Open(Form("%s/%s", pathTree.Data(), fileNameTree.Data()));
  if (!f)  {
    std::cout << "Failed to open tree file \"" << Form("%s/%s", pathTree.Data(), fileNameTree.Data()) << "\"!" << std::endl;
    return -1;
  }
      
  // Extract the data Tree
  TTree* tree = dynamic_cast<TTree*>(f->Get(treeName.Data()));
  if (!tree) {
    std::cout << "Failed to load data tree!" << std::endl;
    return -1;
  }
  
  // Extract the splines, if desired
  TSpline3* splPr = 0x0;
  if (recalculateExpecteddEdx) {
    std::cout << "Loading splines to recalculate expected dEdx!" << std::endl << std::endl;
    
    TFile* fSpl = TFile::Open(pathNameSplinesFile.Data());
    if (!fSpl) {
      std::cout << "Failed to open spline file \"" << pathNameSplinesFile.Data() << "\"!" << std::endl;
      return 0x0;
    }
    
    TObjArray* TPCPIDResponse = (TObjArray*)fSpl->Get("TPCPIDResponse");
    if (!TPCPIDResponse) {
      splPr = (TSpline3*)fSpl->Get(prSplinesName.Data());
      
      // If splines are in file directly, without TPCPIDResponse object, try to load them
      if (!splPr) {
        std::cout << "Failed to load object array from spline file \"" << pathNameSplinesFile.Data() << "\"!" << std::endl;
        return 0x0;
      }
    }
    else {
      splPr = (TSpline3*)TPCPIDResponse->FindObject(prSplinesName.Data());
      
      if (!splPr) {
        std::cout << "Failed to load splines from file \"" << pathNameSplinesFile.Data() << "\"!" << std::endl;
        return 0x0;
      }
    }
  }
  else
    std::cout << "Taking dEdxExpected from Tree..." << std::endl << std::endl;

  // Extract the correction maps
  TFile* fMap = TFile::Open(pathNameThetaMap.Data());
  if (!fMap)  {
    std::cout << "Failed to open thetaMap file \"" << pathNameThetaMap.Data() << "\"! Will not additionally correct data...." << std::endl;
  }

  TH2D* hMap = 0x0;
  
  if (fMap) {
    hMap = dynamic_cast<TH2D*>(fMap->Get(Form("hRefined%s", mapSuffix.Data())));
    if (!hMap) {
      std::cout << "Failed to load theta map!" << std::endl;
      return -1;
    }
  }

  TFile* fSigmaMap = TFile::Open(pathNameSigmaMap.Data());
  if (!fSigmaMap)  {
    std::cout << "Failed to open simgaMap file \"" << pathNameSigmaMap.Data() << "\"!" << std::endl;
    return -1;
  }

  TH2D* hThetaMapSigmaPar1 = dynamic_cast<TH2D*>(fSigmaMap->Get("hThetaMapSigmaPar1"));
  if (!hThetaMapSigmaPar1) {
    std::cout << "Failed to load sigma map for par 1!" << std::endl;
    return -1;
  }

  Double_t c0 = -1;
  TNamed* c0Info = dynamic_cast<TNamed*>(fSigmaMap->Get("c0"));
  if (!c0Info) {
    std::cout << "Failed to extract c0 from file with sigma map!" << std::endl;
    return -1;
  }

  TString c0String = c0Info->GetTitle();
  c0 = c0String.Atof();
  printf("Loaded parameter 0 for sigma: %f\n\n", c0);

  if (plotPull)
    std::cout << "Plotting pull..." << std::endl << std::endl;
  else
    std::cout << "Plotting delta'..." << std::endl << std::endl;

  Long64_t nTreeEntries = tree->GetEntriesFast();

  Double_t dEdx = 0.; // Measured dE/dx
  Double_t dEdxExpected = 0.; // Expected dE/dx according to parametrisation
  Double_t tanTheta = 0.; // Tangens of (local) theta at TPC inner wall
  Double_t pTPC = 0.; // Momentum at TPC inner wall
  UShort_t tpcSignalN = 0; // Number of clusters used for dEdx
  UChar_t  pidType = 0;
  Int_t    fMultiplicity = 0;
  //Double_t phiPrime = 0;

  // Only activate the branches of interest to save processing time
  tree->SetBranchStatus("*", 0); // Disable all branches
  tree->SetBranchStatus("pTPC", 1);
  tree->SetBranchStatus("dEdx", 1);
  tree->SetBranchStatus("dEdxExpected", 1);
  tree->SetBranchStatus("tanTheta", 1);
  tree->SetBranchStatus("tpcSignalN", 1);
  tree->SetBranchStatus("pidType", 1);
  //tree->SetBranchStatus("phiPrime", 1);
  if (isNonPP)
    tree->SetBranchStatus("fMultiplicity", 1);

  
  tree->SetBranchAddress("dEdx", &dEdx);
  tree->SetBranchAddress("dEdxExpected", &dEdxExpected);
  tree->SetBranchAddress("tanTheta", &tanTheta);
  tree->SetBranchAddress("tpcSignalN", &tpcSignalN);
  tree->SetBranchAddress("pTPC", &pTPC);
  tree->SetBranchAddress("pidType", &pidType);
  //tree->SetBranchAddress("phiPrime", &phiPrime);
  if (isNonPP)
    tree->SetBranchAddress("fMultiplicity", &fMultiplicity);

  
  // Output file
  TDatime daTime;
  TString savefileName = Form("%s%s_checkPullSigma_%04d_%02d_%02d__%02d_%02d.root", fileNameTree.ReplaceAll(".root", "").Data(),
                              recalculateExpecteddEdx ? "_recalcdEdx" : "",
                              daTime.GetYear(), daTime.GetMonth(), daTime.GetDay(), daTime.GetHour(), daTime.GetMinute());

  TFile* fSave = TFile::Open(Form("%s/%s", pathTree.Data(), savefileName.Data()), "recreate");
  if (!fSave) {
    std::cout << "Failed to open save file \"" << Form("%s/%s", pathTree.Data(), savefileName.Data()) << "\"!" << std::endl;
    return -1;
  }
  
  const Double_t pBoundLow = 0.1;
  const Double_t pBoundUp = 5;

  const Int_t nBins1 = TMath::Ceil(180 / downScaleFactor);
  const Int_t nBins2 = TMath::Ceil(100 / downScaleFactor);
  const Int_t nBins3 = TMath::Ceil(60 / downScaleFactor);
  
  const Int_t nPbinsForMap = nBins1 + nBins2 + nBins3;
  Double_t binsPforMap[nPbinsForMap + 1];
  
  Double_t binWidth1 = (1.0 - pBoundLow) / nBins1;
  Double_t binWidth2 = (2.0 - 1.0 ) / nBins2;
  Double_t binWidth3 = (pBoundUp - 2.0) / nBins3;
  
  for (Int_t i = 0; i < nBins1; i++)  {
    binsPforMap[i] = pBoundLow + i * binWidth1;
  }
  for (Int_t i = nBins1, j = 0; i < nBins1 + nBins2; i++, j++)  {
    binsPforMap[i] = 1.0 + j * binWidth2;
  }
  for (Int_t i = nBins1 + nBins2, j = 0; i < nBins1 + nBins2 + nBins3; i++, j++)  {
    binsPforMap[i] = 2.0 + j * binWidth3;
  }
  binsPforMap[nPbinsForMap] = pBoundUp;

  TH2D* hPull = new TH2D("hPull", "Pull vs. p_{TPC} integrated over tan(#Theta);p_{TPC} (GeV/c);Pull", nPbinsForMap, binsPforMap, 
                         plotPull ? 120 : 240, plotPull ? -6 : -0.6, plotPull ? 6 : 0.6);
  TH2D* hPullAdditionalCorr = (TH2D*)hPull->Clone("hPullAdditionalCorr");
  hPullAdditionalCorr->SetTitle("Pull vs. p_{TPC} integrated over tan(#Theta) with additional dEdx correction w.r.t. tan(#Theta)");
  /*
  const Int_t nThetaHistos = 3;
  TH2D* hPullTheta[nThetaHistos];
  TH2D* hPullAdditionalCorrTheta[nThetaHistos];
  Double_t tThetaLow[nThetaHistos] = { 0.0, 0.4, 0.9 };
  Double_t tThetaHigh[nThetaHistos] = { 0.1, 0.5, 1.0 };
  */
  const Int_t nThetaHistos = 10;
  TH2D* hPullTheta[nThetaHistos];
  TH2D* hPullAdditionalCorrTheta[nThetaHistos];
  Double_t tThetaLow[nThetaHistos] = { 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 };
  Double_t tThetaHigh[nThetaHistos] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 };
  

  for (Int_t i = 0; i < nThetaHistos; i++)    {
    hPullTheta[i] = new TH2D(Form("hPullTheta_%d", i),
                             Form("Pull vs. p_{TPC} for %.2f <= |tan(#Theta)| < %.2f;p_{TPC} (GeV/c);Pull", tThetaLow[i], tThetaHigh[i]),
                             nPbinsForMap, binsPforMap, plotPull ? 120 : 240, plotPull ? -6 : -0.6, plotPull ? 6 : 0.6);

    hPullAdditionalCorrTheta[i] =
      new TH2D(Form("hPullAdditionalCorrTheta_%d", i),
               Form("Pull vs. p_{TPC} for %.2f <= |tan(#Theta)| < %.2f with additional dEdx correction w.r.t. tan(#Theta);p_{TPC} (GeV/c);Pull",
                    tThetaLow[i], tThetaHigh[i]),
               nPbinsForMap, binsPforMap, plotPull ? 120 : 240, plotPull ? -6 : -0.6, plotPull ? 6 : 0.6);
  }

  
  
  
  
  
  TF1 corrFuncMult("corrFuncMult", "[0] + [1]*TMath::Max([4], TMath::Min(x, [3])) + [2] * TMath::Power(TMath::Max([4], TMath::Min(x, [3])), 2)",
                   0., 0.2);
  TF1 corrFuncMultTanTheta("corrFuncMultTanTheta", "[0] * (x -[2]) + [1] * (x * x - [2] * [2])", -1.5, 1.5);
  TF1 corrFuncSigmaMult("corrFuncSigmaMul", "TMath::Max(0, [0] + [1]*TMath::Min(x, [3]) + [2] * TMath::Power(TMath::Min(x, [3]), 2))", 0., 0.2);
  
  
  // LHC13b.pass2
  if (isNonPP)
    printf("Using corr Parameters for 13b.pass2\n!");
  
  corrFuncMult.SetParameter(0, -5.906e-06);
  corrFuncMult.SetParameter(1, -5.064e-04);
  corrFuncMult.SetParameter(2, -3.521e-02);
  corrFuncMult.SetParameter(3,  2.469e-02);
  corrFuncMult.SetParameter(4, 0);
  
  corrFuncMultTanTheta.SetParameter(0, -5.32e-06);
  corrFuncMultTanTheta.SetParameter(1,  1.177e-05);
  corrFuncMultTanTheta.SetParameter(2, -0.5);
  
  corrFuncSigmaMult.SetParameter(0, 0.);
  corrFuncSigmaMult.SetParameter(1, 0.);
  corrFuncSigmaMult.SetParameter(2, 0.);
  corrFuncSigmaMult.SetParameter(3, 0.);
  
  
  /* OK, but PID task was not very satisfying
  corrFuncMult.SetParameter(0, -6.27187e-06);
  corrFuncMult.SetParameter(1, -4.60649e-04);
  corrFuncMult.SetParameter(2, -4.26450e-02);
  corrFuncMult.SetParameter(3, 2.40590e-02);
  corrFuncMult.SetParameter(4, 0);
  
  corrFuncMultTanTheta.SetParameter(0, -5.338e-06);
  corrFuncMultTanTheta.SetParameter(1,  1.220e-05);
  corrFuncMultTanTheta.SetParameter(2, -0.5);
  
  corrFuncSigmaMult.SetParameter(0, 7.89237e-05);
  corrFuncSigmaMult.SetParameter(1, -1.30662e-02);
  corrFuncSigmaMult.SetParameter(2, 8.91548e-01);
  corrFuncSigmaMult.SetParameter(3, 1.47931e-02);
  */
  
  
  /*
  // LHC11a10a
  if (isNonPP)
    printf("Using corr Parameters for 11a10a\n!");
  
  corrFuncMult.SetParameter(0, 6.90133e-06);
  corrFuncMult.SetParameter(1, -1.22123e-03);
  corrFuncMult.SetParameter(2, 1.80220e-02);
  corrFuncMult.SetParameter(3, 0.1);
  corrFuncMult.SetParameter(4, 6.45306e-03);
  
  corrFuncMultTanTheta.SetParameter(0, -2.85505e-07);
  corrFuncMultTanTheta.SetParameter(1, -1.31911e-06);
  corrFuncMultTanTheta.SetParameter(2, -0.5);
  
  corrFuncSigmaMult.SetParameter(0, -4.29665e-05);
  corrFuncSigmaMult.SetParameter(1, 1.37023e-02);
  corrFuncSigmaMult.SetParameter(2, -6.36337e-01);
  corrFuncSigmaMult.SetParameter(3, 1.13479e-02);
  */
  
  /* OLD without saturation and large error for negative slopes
  corrFuncSigmaMult.SetParameter(0, -4.79684e-05);
  corrFuncSigmaMult.SetParameter(1, 1.49938e-02);
  corrFuncSigmaMult.SetParameter(2, -7.15269e-01);
  corrFuncSigmaMult.SetParameter(3, 1.06855e-02);
  */
  
  /* OLD very good try, but with fewer pBins for the fitting
  corrFuncMult.SetParameter(0, 6.88365e-06);
  corrFuncMult.SetParameter(1, -1.22324e-03);
  corrFuncMult.SetParameter(2, 1.81625e-02);
  corrFuncMult.SetParameter(3, 0.1);
  corrFuncMult.SetParameter(4, 6.36890e-03);
  
  corrFuncMultTanTheta.SetParameter(0, -2.85505e-07);
  corrFuncMultTanTheta.SetParameter(1, -1.31911e-06);
  corrFuncMultTanTheta.SetParameter(2, -0.5);
  
  corrFuncSigmaMult.SetParameter(0, -4.28401e-05);
  corrFuncSigmaMult.SetParameter(1, 1.24812e-02);
  corrFuncSigmaMult.SetParameter(2, -5.28531e-01);
  corrFuncSigmaMult.SetParameter(3, 1.25147e-02);
  */
  /*OLD good try
  corrFuncMult.SetParameter(0, 7.50321e-06);
  corrFuncMult.SetParameter(1, -1.25250e-03);
  corrFuncMult.SetParameter(2, 1.85437e-02);
  corrFuncMult.SetParameter(3, 0.1);
  corrFuncMult.SetParameter(4, 6.21192e-03);
  
  corrFuncMultTanTheta.SetParameter(0, -1.43112e-07);
  corrFuncMultTanTheta.SetParameter(1, -1.53e-06);
  corrFuncMultTanTheta.SetParameter(2, 0.3);
  
  corrFuncSigmaMult.SetParameter(0, -2.54019e-05);
  corrFuncSigmaMult.SetParameter(1, 8.68883e-03);
  corrFuncSigmaMult.SetParameter(2, -3.36176e-01);
  corrFuncSigmaMult.SetParameter(3, 1.29230e-02);
  */
  
  /*
  // LHC10h.pass2
  if (isNonPP)
    printf("Using corr Parameters for 10h.pass2\n!");
  
  corrFuncMult.SetParameter(0, 3.21636e-07);
  corrFuncMult.SetParameter(1, -6.65876e-04);
  corrFuncMult.SetParameter(2, 1.28786e-03);
  corrFuncMult.SetParameter(3, 1.47677e-02);
  corrFuncMult.SetParameter(4, 0.);
  
  corrFuncMultTanTheta.SetParameter(0, 7.23591e-08);
  corrFuncMultTanTheta.SetParameter(1, 2.7469e-06);
  corrFuncMultTanTheta.SetParameter(2, -0.5);
  
  corrFuncSigmaMult.SetParameter(0, -1.22590e-05);
  corrFuncSigmaMult.SetParameter(1, 6.88888e-03);
  corrFuncSigmaMult.SetParameter(2, -3.20788e-01);
  corrFuncSigmaMult.SetParameter(3, 1.07345e-02);
  */
  
  /*OLD bad try
  corrFuncMult.SetParameter(0, 2.71514e-07);
  corrFuncMult.SetParameter(1, -6.92031e-04);
  corrFuncMult.SetParameter(2, 3.56042e-03);
  corrFuncMult.SetParameter(3, 1.47497e-02);
  corrFuncMult.SetParameter(4, 0.);
  
  corrFuncMultTanTheta.SetParameter(0, 8.53204e-08);
  corrFuncMultTanTheta.SetParameter(1, 2.85591e-06);
  corrFuncMultTanTheta.SetParameter(2, -0.5);
  
  corrFuncSigmaMult.SetParameter(0, -6.82477e-06);
  corrFuncSigmaMult.SetParameter(1, 4.97051e-03);
  corrFuncSigmaMult.SetParameter(2, -1.64954e-01);
  corrFuncSigmaMult.SetParameter(3, 9.21061e-03);
  */
  

  //TODO NOW
  TF1* fShapeSmallP = new TF1("fShapeSmallP", "pol5", -0.4, 0.4);
  fShapeSmallP->SetParameters(1.01712, -0.0202725, -0.260692, 0.261623, 0.671854, -1.14014);
    
  for (Long64_t i = 0; i < nTreeEntries; i++) {
    tree->GetEntry(i);

    if (dEdx <= 0 || dEdxExpected <= 0 || tpcSignalN <= 10)
      continue;
    /*
    Double_t pT = pTPC*TMath::Sin(-TMath::ATan(tanTheta)+TMath::Pi()/2.0);
    if ((phiPrime > 0.072/pT+TMath::Pi()/18.0-0.035 && phiPrime < 0.07/pT/pT+0.1/pT+TMath::Pi()/18.0+0.035)) 
      continue;
    */
      
    if (pidType != kMCid) {
      if (pidType == kTPCid && pTPC > 0.6)
        continue;
      if (pidType == kTPCandTOFid && (pTPC < 0.6 || pTPC > 2.0))
        continue;
      if ((collType == 2) && pidType == kTPCandTOFid && pTPC > 1.0)
        continue;// Only V0's in case of PbPb above 1.0 GeV/c
      if (pidType == kV0idPlusTOFrejected) //TODO NOW NEW
        continue;
    }
    
    if (recalculateExpecteddEdx) {
      dEdxExpected = 50. * splPr->Eval(pTPC / massProton); //WARNING: What, if MIP is different from 50.? Seems not to be used (tested for pp, MC_pp, PbPb and MC_PbPb), but can in principle happen
    }
      
    //TODO NOW
    /*
    if (TMath::Abs(tanTheta) <= 0.4) {
      Double_t p0 = fShapeSmallP->Eval(tanTheta) - 1.0; // Strength of the correction
      Double_t p1 = -9.0; // How fast the correction is turned off
      Double_t p2 = -0.209; // Turn off correction around 0.2 GeV/c
      Double_t p3 = 1.0; // Delta' for large p should be 1

      Double_t corrFactor = TMath::Erf((pTPC + p2) * p1) * p0 + p3 + p0; // Add p0 to have 1 for p3 = 1 and large pTPC
      dEdxExpected *= corrFactor;
    }*/
    
     /*TODO old unsuccessful try 
    Double_t thetaGlobalTPC = -TMath::ATan(tanTheta) + TMath::Pi() / 2.;
    Double_t pTtpc = pTPC * TMath::Sin(thetaGlobalTPC);
    Double_t pTtpcInv = (pTtpc > 0) ? 1. / pTtpc : 0;
    Double_t p0 = 1.0;
    Double_t p1 = 1./ 0.5;//TODO 2.0;
    Double_t p2 = -0.2;//TODO 0.1
    Double_t pTcorrFactor = p0 + (pTtpcInv > p1) * p2 * (pTtpcInv - p1);
    
    dEdxExpected *= pTcorrFactor;
    */
    
      
    // From the momentum (via dEdxExpected) and the tanTheta of the track, the expected dEdx can be calculated (correctedDeDxExpected).
    // If the splines are correct, this should give in average the same value as dEdx. 
    // Now valid: Maps created from corrected data with splines adopted to corrected data, so lookup should be for dEdxExpected=dEdxSplines (no further
    // eta correction) or the corrected dEdx from the track (which should ideally be = dEdxSplines)
    
    // Tested with corrected data for LHC10d.pass2: using dEdx for the lookup (which is the corrected value and should ideally be = dEdxSplines):
    // Results almost the same. Maybe slightly better for dEdxExpected.
    
    // No longer valid: Note that the maps take always the uncorrected dEdx w.r.t.
    // tanTheta, so that correctedDeDxExpected is needed here normally. However, the information for the correction will be lost at some point.
    // Therefore, dEdxExpected can be used instead and should provide a good approximation.
    Double_t c1FromSigmaMap = hThetaMapSigmaPar1->GetBinContent(getBinX(hThetaMapSigmaPar1, tanTheta), getBinY(hThetaMapSigmaPar1, 1./dEdxExpected));
    
    Double_t expectedSigma = dEdxExpected * TMath::Sqrt( c0 * c0 + (c1FromSigmaMap * c1FromSigmaMap) / tpcSignalN);
    Double_t pull = (dEdx - dEdxExpected) / (plotPull ? expectedSigma: dEdxExpected);

    // Fill pull histo
    hPull->Fill(pTPC, pull);

    Double_t tanThetaAbs = TMath::Abs(tanTheta);
    
    for (Int_t j = 0; j < nThetaHistos; j++)    {
      if (tanThetaAbs  >= tThetaLow[j] && tanThetaAbs < tThetaHigh[j])  {
        hPullTheta[j]->Fill(pTPC, pull);
      }
    }

    if (!hMap)
      continue;

    Double_t correctionFactor = 1.;
    
    if (isNonPP) {
      // 1. Correct eta dependence
      correctionFactor = hMap->GetBinContent(getBinX(hMap, tanTheta), getBinY(hMap, 1./dEdxExpected));
      
      // 2. Correct for multiplicity dependence:
      Double_t multCorrectionFactor = 1.;
      
      if (fMultiplicity > 0) {
        Double_t relSlope = corrFuncMult.Eval(1. / (dEdxExpected * correctionFactor));
        relSlope += corrFuncMultTanTheta.Eval(tanTheta);

        multCorrectionFactor = 1. + relSlope * fMultiplicity;
      }

      c1FromSigmaMap = hThetaMapSigmaPar1->GetBinContent(getBinX(hThetaMapSigmaPar1, tanTheta), getBinY(hThetaMapSigmaPar1, 1./dEdxExpected));
      
      // Multiplicity dependence of sigma depends on the real dEdx at zero multiplicity, i.e. the eta (only) corrected dEdxExpected value has to be used
      // since all maps etc. have been created for ~zero multiplicity
      Double_t relSigmaSlope = corrFuncSigmaMult.Eval(1. / (dEdxExpected * correctionFactor));
      Double_t multSigmaCorrectionFactor = 1. + relSigmaSlope * fMultiplicity;
      
      dEdxExpected *= correctionFactor * multCorrectionFactor; 
      
      expectedSigma = dEdxExpected * TMath::Sqrt( c0 * c0 + (c1FromSigmaMap * c1FromSigmaMap) / tpcSignalN);
      expectedSigma *= multSigmaCorrectionFactor;
      
      pull = (dEdx - dEdxExpected) / (plotPull ? expectedSigma: dEdxExpected);
    }
    else {
      correctionFactor = hMap->GetBinContent(getBinX(hMap, tanTheta), getBinY(hMap, 1./dEdxExpected));
      
      c1FromSigmaMap = hThetaMapSigmaPar1->GetBinContent(getBinX(hThetaMapSigmaPar1, tanTheta), getBinY(hThetaMapSigmaPar1, 1./dEdxExpected));
   
      dEdxExpected *= correctionFactor; // If data is not corrected, but the sigma map is for corrected data, re-do analysis with corrected dEdx
      
      expectedSigma = dEdxExpected * TMath::Sqrt( c0 * c0 + (c1FromSigmaMap * c1FromSigmaMap) / tpcSignalN);
      pull = (dEdx - dEdxExpected) / (plotPull ? expectedSigma: dEdxExpected);
    }

    pull = (dEdx - dEdxExpected) / (plotPull ? expectedSigma: dEdxExpected);

    hPullAdditionalCorr->Fill(pTPC, pull);

    for (Int_t j = 0; j < nThetaHistos; j++)    {
      if (tanThetaAbs  >= tThetaLow[j] && tanThetaAbs < tThetaHigh[j])  {
        hPullAdditionalCorrTheta[j]->Fill(pTPC, pull);
      }
    }
  }
/*
  // Mean, Sigma, chi^2/NDF of pull of different theta bins and all in one plot
  TCanvas* canvPullMean = new TCanvas("canvPullMean", "canvPullMean", 100,10,1380,800);
  canvPullMean->SetLogx(kTRUE);
  canvPullMean->SetGridx(kTRUE);
  canvPullMean->SetGridy(kTRUE);
  TCanvas* canvPullSigma = new TCanvas("canvPullSigma", "canvPullSigma", 100,10,1380,800);
  canvPullSigma->SetLogx(kTRUE);
  canvPullSigma->SetGridx(kTRUE);
  canvPullSigma->SetGridy(kTRUE);
  TCanvas* canvPullChi2 = new TCanvas("canvPullChi2", "canvPullChi2", 100,10,1380,800);
  canvPullChi2->SetLogx(kTRUE);
  canvPullChi2->SetGridx(kTRUE);
  canvPullChi2->SetGridy(kTRUE);
  

  TCanvas* canvPull[nThetaHistos + 1];
  for (Int_t i = 0, j = nThetaHistos; i < nThetaHistos + 1; i++, j--)  {
    canvPull[i] = new TCanvas(Form("canvPull_%d", i), "canvPull", 100,10,1380,800);
    canvPull[i]->cd();
    canvPull[i]->SetLogx(kTRUE);
    canvPull[i]->SetLogz(kTRUE);
    canvPull[i]->SetGrid(kTRUE, kTRUE);

    TH2D* hTemp = 0x0;
    TString thetaString = "";
    if (i == nThetaHistos)  {
      hTemp = hPull;
      thetaString = "tan(#Theta) integrated";
    }
    else {
      hTemp = hPullTheta[i];
      thetaString = Form("%.2f #leq |tan(#Theta)| < %.2f", tThetaLow[i], tThetaHigh[i]);
    }
    
    normaliseHisto(hTemp);
    hTemp->FitSlicesY();
    hTemp->GetYaxis()->SetNdivisions(12);
    hTemp->GetXaxis()->SetMoreLogLabels(kTRUE);
    TH1D* hTempMean = (TH1D*)gDirectory->Get(Form("%s_1", hTemp->GetName()));
    hTempMean->SetTitle(Form("mean(pull), %s", thetaString.Data()));
    hTempMean->GetXaxis()->SetMoreLogLabels(kTRUE);
    hTempMean->SetLineWidth(2);
    hTempMean->SetMarkerStyle(20);
    TH1D* hTempSigma = (TH1D*)gDirectory->Get(Form("%s_2", hTemp->GetName()));
    hTempSigma->SetTitle(Form("#sigma(pull), %s", thetaString.Data()));
    hTempSigma->GetXaxis()->SetMoreLogLabels(kTRUE);
    hTempSigma->SetLineColor(kMagenta);
    hTempSigma->SetMarkerStyle(20);
    hTempSigma->SetMarkerColor(kMagenta);
    hTempSigma->SetLineWidth(2);
    TH1D* hTempChi2 = (TH1D*)gDirectory->Get(Form("%s_chi2", hTemp->GetName()));
    hTempChi2->SetTitle(Form("#chi^{2} / NDF (pull), %s", thetaString.Data()));
    hTempChi2->GetXaxis()->SetMoreLogLabels(kTRUE);
    hTempChi2->SetLineColor(kMagenta + 2);
    hTempChi2->SetMarkerStyle(20);
    hTempChi2->SetMarkerColor(kMagenta + 2);
    hTempChi2->SetLineWidth(2);

    hTemp->DrawCopy("colz");
    hTempMean->DrawCopy("same");
    hTempSigma->DrawCopy("same");
    hTempChi2->Scale(-1./10.);
    hTempChi2->DrawCopy("same");
    hTempChi2->Scale(-10.);

    canvPullMean->cd();
    hTempMean->SetLineColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
    hTempMean->SetMarkerColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
    hTempMean->DrawCopy((i == 0 ? "" : "same"));

    canvPullSigma->cd();
    hTempSigma->SetLineColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
    hTempSigma->SetMarkerColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
    hTempSigma->DrawCopy((i == 0 ? "" : "same"));

    canvPullChi2->cd();
    hTempChi2->SetLineColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
    hTempChi2->SetMarkerColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
    hTempChi2->DrawCopy((i == 0 ? "" : "same"));
  }

  canvPullMean->BuildLegend();
  canvPullSigma->BuildLegend();
  canvPullChi2->BuildLegend();
*/
  // Histograms with additional correction
  TCanvas* canvPullMeanCorr = 0x0;
  TCanvas* canvPullSigmaCorr = 0x0;
  TCanvas* canvPullChi2Corr = 0x0;
  TCanvas* canvPullCorr[nThetaHistos + 1];
  for (Int_t i = 0; i < nThetaHistos + 1; i++) 
    canvPullCorr[i] = 0x0;
  
  if (hMap) {
    // Mean, Sigma, chi^2/NDF of pull of different theta bins and all in one plot
    canvPullMeanCorr = new TCanvas("canvPullMeanCorr", "canvPullMeanCorr", 100,10,1380,800);
    canvPullMeanCorr->SetLogx(kTRUE);
    canvPullMeanCorr->SetGridx(kTRUE);
    canvPullMeanCorr->SetGridy(kTRUE);
    canvPullSigmaCorr = new TCanvas("canvPullSigmaCorr", "canvPullSigmaCorr", 100,10,1380,800);
    canvPullSigmaCorr->SetLogx(kTRUE);
    canvPullSigmaCorr->SetGridx(kTRUE);
    canvPullSigmaCorr->SetGridy(kTRUE);
    canvPullChi2Corr = new TCanvas("canvPullChi2Corr", "canvPullChi2Corr", 100,10,1380,800);
    canvPullChi2Corr->SetLogx(kTRUE);
    canvPullChi2Corr->SetGridx(kTRUE);
    canvPullChi2Corr->SetGridy(kTRUE);
    
    for (Int_t i = 0, j = nThetaHistos; i < nThetaHistos + 1; i++, j--)  {
      canvPullCorr[i] = new TCanvas(Form("canvPullCorr_%d", i), "canvPullCorr", 100,10,1380,800);
      canvPullCorr[i]->cd();
      canvPullCorr[i]->SetLogx(kTRUE);
      canvPullCorr[i]->SetLogz(kTRUE);
      canvPullCorr[i]->SetGrid(kTRUE, kTRUE);

      TH2D* hTemp = 0x0;
      TString thetaString = "";
      
      if (i == nThetaHistos)  {
        hTemp = hPullAdditionalCorr;
        thetaString = "tan(#Theta) integrated";
      }
      else    {
        hTemp = hPullAdditionalCorrTheta[i];
        thetaString = Form("%.2f #leq |tan(#Theta)| < %.2f", tThetaLow[i], tThetaHigh[i]);
      }

      normaliseHisto(hTemp);
      hTemp->FitSlicesY();
      hTemp->GetYaxis()->SetNdivisions(12);
      hTemp->GetXaxis()->SetMoreLogLabels(kTRUE);
      TH1D* hTempMean = (TH1D*)gDirectory->Get(Form("%s_1", hTemp->GetName()));
      hTempMean->SetTitle(Form("mean(pull), %s", thetaString.Data()));
      hTempMean->GetXaxis()->SetMoreLogLabels(kTRUE);
      hTempMean->SetLineWidth(2);
      hTempMean->SetMarkerStyle(20);
      TH1D* hTempSigma = (TH1D*)gDirectory->Get(Form("%s_2", hTemp->GetName()));
      hTempSigma->SetTitle(Form("#sigma(pull), %s", thetaString.Data()));
      hTempSigma->GetXaxis()->SetMoreLogLabels(kTRUE);
      hTempSigma->SetLineColor(kMagenta);
      hTempSigma->SetMarkerStyle(20);
      hTempSigma->SetMarkerColor(kMagenta);
      hTempSigma->SetLineWidth(2);
      TH1D* hTempChi2 = (TH1D*)gDirectory->Get(Form("%s_chi2", hTemp->GetName()));
      hTempChi2->SetTitle(Form("#chi^{2} / NDF (pull), %s", thetaString.Data()));
      hTempChi2->GetXaxis()->SetMoreLogLabels(kTRUE);
      hTempChi2->SetLineColor(kMagenta + 2);
      hTempChi2->SetMarkerStyle(20);
      hTempChi2->SetMarkerColor(kMagenta + 2);
      hTempChi2->SetLineWidth(2);

      hTemp->DrawCopy("colz");
      hTempMean->DrawCopy("same");
      hTempSigma->DrawCopy("same");
      hTempChi2->Scale(-1./10.);
      hTempChi2->DrawCopy("same");
      hTempChi2->Scale(-10.);
  
      canvPullMeanCorr->cd();
      hTempMean->SetLineColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
      hTempMean->SetMarkerColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
      hTempMean->DrawCopy((i == 0 ? "" : "same"));
      
      canvPullSigmaCorr->cd();
      hTempSigma->SetLineColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
      hTempSigma->SetMarkerColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
      hTempSigma->DrawCopy((i == 0 ? "" : "same"));
      
      canvPullChi2Corr->cd();
      hTempChi2->SetLineColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
      hTempChi2->SetMarkerColor(1 + ((j >= 9) ? (39 + 2 * (j - 9)) : j));
      hTempChi2->DrawCopy((i == 0 ? "" : "same"));
    }
    
    canvPullMeanCorr->BuildLegend();
    canvPullSigmaCorr->BuildLegend();
    canvPullChi2Corr->BuildLegend();
  }
  
  
  
  
  
  fSave->cd();
  /*canvPullMean->Write();
  canvPullSigma->Write();
  canvPullChi2->Write();
  
  for (Int_t  i = 0; i < nThetaHistos + 1; i++) {
    canvPull[i]->Write();
  }*/
  
  canvPullMeanCorr->Write();
  canvPullSigmaCorr->Write();
  canvPullChi2Corr->Write();
  
  for (Int_t  i = 0; i < nThetaHistos + 1; i++) {
    canvPullCorr[i]->Write();
  }

  TNamed* info = new TNamed(Form("Theta map: %s\n\nSigma map: %s\n\nSplines file: %s\n\nSplines name: %s", pathNameThetaMap.Data(), 
                                 pathNameSigmaMap.Data(), pathNameSplinesFile.Data(), prSplinesName.Data()),
                            "info");
  info->Write();
  fSave->Close();
  
  return 0;
}
 checkPullTree.C:1
 checkPullTree.C:2
 checkPullTree.C:3
 checkPullTree.C:4
 checkPullTree.C:5
 checkPullTree.C:6
 checkPullTree.C:7
 checkPullTree.C:8
 checkPullTree.C:9
 checkPullTree.C:10
 checkPullTree.C:11
 checkPullTree.C:12
 checkPullTree.C:13
 checkPullTree.C:14
 checkPullTree.C:15
 checkPullTree.C:16
 checkPullTree.C:17
 checkPullTree.C:18
 checkPullTree.C:19
 checkPullTree.C:20
 checkPullTree.C:21
 checkPullTree.C:22
 checkPullTree.C:23
 checkPullTree.C:24
 checkPullTree.C:25
 checkPullTree.C:26
 checkPullTree.C:27
 checkPullTree.C:28
 checkPullTree.C:29
 checkPullTree.C:30
 checkPullTree.C:31
 checkPullTree.C:32
 checkPullTree.C:33
 checkPullTree.C:34
 checkPullTree.C:35
 checkPullTree.C:36
 checkPullTree.C:37
 checkPullTree.C:38
 checkPullTree.C:39
 checkPullTree.C:40
 checkPullTree.C:41
 checkPullTree.C:42
 checkPullTree.C:43
 checkPullTree.C:44
 checkPullTree.C:45
 checkPullTree.C:46
 checkPullTree.C:47
 checkPullTree.C:48
 checkPullTree.C:49
 checkPullTree.C:50
 checkPullTree.C:51
 checkPullTree.C:52
 checkPullTree.C:53
 checkPullTree.C:54
 checkPullTree.C:55
 checkPullTree.C:56
 checkPullTree.C:57
 checkPullTree.C:58
 checkPullTree.C:59
 checkPullTree.C:60
 checkPullTree.C:61
 checkPullTree.C:62
 checkPullTree.C:63
 checkPullTree.C:64
 checkPullTree.C:65
 checkPullTree.C:66
 checkPullTree.C:67
 checkPullTree.C:68
 checkPullTree.C:69
 checkPullTree.C:70
 checkPullTree.C:71
 checkPullTree.C:72
 checkPullTree.C:73
 checkPullTree.C:74
 checkPullTree.C:75
 checkPullTree.C:76
 checkPullTree.C:77
 checkPullTree.C:78
 checkPullTree.C:79
 checkPullTree.C:80
 checkPullTree.C:81
 checkPullTree.C:82
 checkPullTree.C:83
 checkPullTree.C:84
 checkPullTree.C:85
 checkPullTree.C:86
 checkPullTree.C:87
 checkPullTree.C:88
 checkPullTree.C:89
 checkPullTree.C:90
 checkPullTree.C:91
 checkPullTree.C:92
 checkPullTree.C:93
 checkPullTree.C:94
 checkPullTree.C:95
 checkPullTree.C:96
 checkPullTree.C:97
 checkPullTree.C:98
 checkPullTree.C:99
 checkPullTree.C:100
 checkPullTree.C:101
 checkPullTree.C:102
 checkPullTree.C:103
 checkPullTree.C:104
 checkPullTree.C:105
 checkPullTree.C:106
 checkPullTree.C:107
 checkPullTree.C:108
 checkPullTree.C:109
 checkPullTree.C:110
 checkPullTree.C:111
 checkPullTree.C:112
 checkPullTree.C:113
 checkPullTree.C:114
 checkPullTree.C:115
 checkPullTree.C:116
 checkPullTree.C:117
 checkPullTree.C:118
 checkPullTree.C:119
 checkPullTree.C:120
 checkPullTree.C:121
 checkPullTree.C:122
 checkPullTree.C:123
 checkPullTree.C:124
 checkPullTree.C:125
 checkPullTree.C:126
 checkPullTree.C:127
 checkPullTree.C:128
 checkPullTree.C:129
 checkPullTree.C:130
 checkPullTree.C:131
 checkPullTree.C:132
 checkPullTree.C:133
 checkPullTree.C:134
 checkPullTree.C:135
 checkPullTree.C:136
 checkPullTree.C:137
 checkPullTree.C:138
 checkPullTree.C:139
 checkPullTree.C:140
 checkPullTree.C:141
 checkPullTree.C:142
 checkPullTree.C:143
 checkPullTree.C:144
 checkPullTree.C:145
 checkPullTree.C:146
 checkPullTree.C:147
 checkPullTree.C:148
 checkPullTree.C:149
 checkPullTree.C:150
 checkPullTree.C:151
 checkPullTree.C:152
 checkPullTree.C:153
 checkPullTree.C:154
 checkPullTree.C:155
 checkPullTree.C:156
 checkPullTree.C:157
 checkPullTree.C:158
 checkPullTree.C:159
 checkPullTree.C:160
 checkPullTree.C:161
 checkPullTree.C:162
 checkPullTree.C:163
 checkPullTree.C:164
 checkPullTree.C:165
 checkPullTree.C:166
 checkPullTree.C:167
 checkPullTree.C:168
 checkPullTree.C:169
 checkPullTree.C:170
 checkPullTree.C:171
 checkPullTree.C:172
 checkPullTree.C:173
 checkPullTree.C:174
 checkPullTree.C:175
 checkPullTree.C:176
 checkPullTree.C:177
 checkPullTree.C:178
 checkPullTree.C:179
 checkPullTree.C:180
 checkPullTree.C:181
 checkPullTree.C:182
 checkPullTree.C:183
 checkPullTree.C:184
 checkPullTree.C:185
 checkPullTree.C:186
 checkPullTree.C:187
 checkPullTree.C:188
 checkPullTree.C:189
 checkPullTree.C:190
 checkPullTree.C:191
 checkPullTree.C:192
 checkPullTree.C:193
 checkPullTree.C:194
 checkPullTree.C:195
 checkPullTree.C:196
 checkPullTree.C:197
 checkPullTree.C:198
 checkPullTree.C:199
 checkPullTree.C:200
 checkPullTree.C:201
 checkPullTree.C:202
 checkPullTree.C:203
 checkPullTree.C:204
 checkPullTree.C:205
 checkPullTree.C:206
 checkPullTree.C:207
 checkPullTree.C:208
 checkPullTree.C:209
 checkPullTree.C:210
 checkPullTree.C:211
 checkPullTree.C:212
 checkPullTree.C:213
 checkPullTree.C:214
 checkPullTree.C:215
 checkPullTree.C:216
 checkPullTree.C:217
 checkPullTree.C:218
 checkPullTree.C:219
 checkPullTree.C:220
 checkPullTree.C:221
 checkPullTree.C:222
 checkPullTree.C:223
 checkPullTree.C:224
 checkPullTree.C:225
 checkPullTree.C:226
 checkPullTree.C:227
 checkPullTree.C:228
 checkPullTree.C:229
 checkPullTree.C:230
 checkPullTree.C:231
 checkPullTree.C:232
 checkPullTree.C:233
 checkPullTree.C:234
 checkPullTree.C:235
 checkPullTree.C:236
 checkPullTree.C:237
 checkPullTree.C:238
 checkPullTree.C:239
 checkPullTree.C:240
 checkPullTree.C:241
 checkPullTree.C:242
 checkPullTree.C:243
 checkPullTree.C:244
 checkPullTree.C:245
 checkPullTree.C:246
 checkPullTree.C:247
 checkPullTree.C:248
 checkPullTree.C:249
 checkPullTree.C:250
 checkPullTree.C:251
 checkPullTree.C:252
 checkPullTree.C:253
 checkPullTree.C:254
 checkPullTree.C:255
 checkPullTree.C:256
 checkPullTree.C:257
 checkPullTree.C:258
 checkPullTree.C:259
 checkPullTree.C:260
 checkPullTree.C:261
 checkPullTree.C:262
 checkPullTree.C:263
 checkPullTree.C:264
 checkPullTree.C:265
 checkPullTree.C:266
 checkPullTree.C:267
 checkPullTree.C:268
 checkPullTree.C:269
 checkPullTree.C:270
 checkPullTree.C:271
 checkPullTree.C:272
 checkPullTree.C:273
 checkPullTree.C:274
 checkPullTree.C:275
 checkPullTree.C:276
 checkPullTree.C:277
 checkPullTree.C:278
 checkPullTree.C:279
 checkPullTree.C:280
 checkPullTree.C:281
 checkPullTree.C:282
 checkPullTree.C:283
 checkPullTree.C:284
 checkPullTree.C:285
 checkPullTree.C:286
 checkPullTree.C:287
 checkPullTree.C:288
 checkPullTree.C:289
 checkPullTree.C:290
 checkPullTree.C:291
 checkPullTree.C:292
 checkPullTree.C:293
 checkPullTree.C:294
 checkPullTree.C:295
 checkPullTree.C:296
 checkPullTree.C:297
 checkPullTree.C:298
 checkPullTree.C:299
 checkPullTree.C:300
 checkPullTree.C:301
 checkPullTree.C:302
 checkPullTree.C:303
 checkPullTree.C:304
 checkPullTree.C:305
 checkPullTree.C:306
 checkPullTree.C:307
 checkPullTree.C:308
 checkPullTree.C:309
 checkPullTree.C:310
 checkPullTree.C:311
 checkPullTree.C:312
 checkPullTree.C:313
 checkPullTree.C:314
 checkPullTree.C:315
 checkPullTree.C:316
 checkPullTree.C:317
 checkPullTree.C:318
 checkPullTree.C:319
 checkPullTree.C:320
 checkPullTree.C:321
 checkPullTree.C:322
 checkPullTree.C:323
 checkPullTree.C:324
 checkPullTree.C:325
 checkPullTree.C:326
 checkPullTree.C:327
 checkPullTree.C:328
 checkPullTree.C:329
 checkPullTree.C:330
 checkPullTree.C:331
 checkPullTree.C:332
 checkPullTree.C:333
 checkPullTree.C:334
 checkPullTree.C:335
 checkPullTree.C:336
 checkPullTree.C:337
 checkPullTree.C:338
 checkPullTree.C:339
 checkPullTree.C:340
 checkPullTree.C:341
 checkPullTree.C:342
 checkPullTree.C:343
 checkPullTree.C:344
 checkPullTree.C:345
 checkPullTree.C:346
 checkPullTree.C:347
 checkPullTree.C:348
 checkPullTree.C:349
 checkPullTree.C:350
 checkPullTree.C:351
 checkPullTree.C:352
 checkPullTree.C:353
 checkPullTree.C:354
 checkPullTree.C:355
 checkPullTree.C:356
 checkPullTree.C:357
 checkPullTree.C:358
 checkPullTree.C:359
 checkPullTree.C:360
 checkPullTree.C:361
 checkPullTree.C:362
 checkPullTree.C:363
 checkPullTree.C:364
 checkPullTree.C:365
 checkPullTree.C:366
 checkPullTree.C:367
 checkPullTree.C:368
 checkPullTree.C:369
 checkPullTree.C:370
 checkPullTree.C:371
 checkPullTree.C:372
 checkPullTree.C:373
 checkPullTree.C:374
 checkPullTree.C:375
 checkPullTree.C:376
 checkPullTree.C:377
 checkPullTree.C:378
 checkPullTree.C:379
 checkPullTree.C:380
 checkPullTree.C:381
 checkPullTree.C:382
 checkPullTree.C:383
 checkPullTree.C:384
 checkPullTree.C:385
 checkPullTree.C:386
 checkPullTree.C:387
 checkPullTree.C:388
 checkPullTree.C:389
 checkPullTree.C:390
 checkPullTree.C:391
 checkPullTree.C:392
 checkPullTree.C:393
 checkPullTree.C:394
 checkPullTree.C:395
 checkPullTree.C:396
 checkPullTree.C:397
 checkPullTree.C:398
 checkPullTree.C:399
 checkPullTree.C:400
 checkPullTree.C:401
 checkPullTree.C:402
 checkPullTree.C:403
 checkPullTree.C:404
 checkPullTree.C:405
 checkPullTree.C:406
 checkPullTree.C:407
 checkPullTree.C:408
 checkPullTree.C:409
 checkPullTree.C:410
 checkPullTree.C:411
 checkPullTree.C:412
 checkPullTree.C:413
 checkPullTree.C:414
 checkPullTree.C:415
 checkPullTree.C:416
 checkPullTree.C:417
 checkPullTree.C:418
 checkPullTree.C:419
 checkPullTree.C:420
 checkPullTree.C:421
 checkPullTree.C:422
 checkPullTree.C:423
 checkPullTree.C:424
 checkPullTree.C:425
 checkPullTree.C:426
 checkPullTree.C:427
 checkPullTree.C:428
 checkPullTree.C:429
 checkPullTree.C:430
 checkPullTree.C:431
 checkPullTree.C:432
 checkPullTree.C:433
 checkPullTree.C:434
 checkPullTree.C:435
 checkPullTree.C:436
 checkPullTree.C:437
 checkPullTree.C:438
 checkPullTree.C:439
 checkPullTree.C:440
 checkPullTree.C:441
 checkPullTree.C:442
 checkPullTree.C:443
 checkPullTree.C:444
 checkPullTree.C:445
 checkPullTree.C:446
 checkPullTree.C:447
 checkPullTree.C:448
 checkPullTree.C:449
 checkPullTree.C:450
 checkPullTree.C:451
 checkPullTree.C:452
 checkPullTree.C:453
 checkPullTree.C:454
 checkPullTree.C:455
 checkPullTree.C:456
 checkPullTree.C:457
 checkPullTree.C:458
 checkPullTree.C:459
 checkPullTree.C:460
 checkPullTree.C:461
 checkPullTree.C:462
 checkPullTree.C:463
 checkPullTree.C:464
 checkPullTree.C:465
 checkPullTree.C:466
 checkPullTree.C:467
 checkPullTree.C:468
 checkPullTree.C:469
 checkPullTree.C:470
 checkPullTree.C:471
 checkPullTree.C:472
 checkPullTree.C:473
 checkPullTree.C:474
 checkPullTree.C:475
 checkPullTree.C:476
 checkPullTree.C:477
 checkPullTree.C:478
 checkPullTree.C:479
 checkPullTree.C:480
 checkPullTree.C:481
 checkPullTree.C:482
 checkPullTree.C:483
 checkPullTree.C:484
 checkPullTree.C:485
 checkPullTree.C:486
 checkPullTree.C:487
 checkPullTree.C:488
 checkPullTree.C:489
 checkPullTree.C:490
 checkPullTree.C:491
 checkPullTree.C:492
 checkPullTree.C:493
 checkPullTree.C:494
 checkPullTree.C:495
 checkPullTree.C:496
 checkPullTree.C:497
 checkPullTree.C:498
 checkPullTree.C:499
 checkPullTree.C:500
 checkPullTree.C:501
 checkPullTree.C:502
 checkPullTree.C:503
 checkPullTree.C:504
 checkPullTree.C:505
 checkPullTree.C:506
 checkPullTree.C:507
 checkPullTree.C:508
 checkPullTree.C:509
 checkPullTree.C:510
 checkPullTree.C:511
 checkPullTree.C:512
 checkPullTree.C:513
 checkPullTree.C:514
 checkPullTree.C:515
 checkPullTree.C:516
 checkPullTree.C:517
 checkPullTree.C:518
 checkPullTree.C:519
 checkPullTree.C:520
 checkPullTree.C:521
 checkPullTree.C:522
 checkPullTree.C:523
 checkPullTree.C:524
 checkPullTree.C:525
 checkPullTree.C:526
 checkPullTree.C:527
 checkPullTree.C:528
 checkPullTree.C:529
 checkPullTree.C:530
 checkPullTree.C:531
 checkPullTree.C:532
 checkPullTree.C:533
 checkPullTree.C:534
 checkPullTree.C:535
 checkPullTree.C:536
 checkPullTree.C:537
 checkPullTree.C:538
 checkPullTree.C:539
 checkPullTree.C:540
 checkPullTree.C:541
 checkPullTree.C:542
 checkPullTree.C:543
 checkPullTree.C:544
 checkPullTree.C:545
 checkPullTree.C:546
 checkPullTree.C:547
 checkPullTree.C:548
 checkPullTree.C:549
 checkPullTree.C:550
 checkPullTree.C:551
 checkPullTree.C:552
 checkPullTree.C:553
 checkPullTree.C:554
 checkPullTree.C:555
 checkPullTree.C:556
 checkPullTree.C:557
 checkPullTree.C:558
 checkPullTree.C:559
 checkPullTree.C:560
 checkPullTree.C:561
 checkPullTree.C:562
 checkPullTree.C:563
 checkPullTree.C:564
 checkPullTree.C:565
 checkPullTree.C:566
 checkPullTree.C:567
 checkPullTree.C:568
 checkPullTree.C:569
 checkPullTree.C:570
 checkPullTree.C:571
 checkPullTree.C:572
 checkPullTree.C:573
 checkPullTree.C:574
 checkPullTree.C:575
 checkPullTree.C:576
 checkPullTree.C:577
 checkPullTree.C:578
 checkPullTree.C:579
 checkPullTree.C:580
 checkPullTree.C:581
 checkPullTree.C:582
 checkPullTree.C:583
 checkPullTree.C:584
 checkPullTree.C:585
 checkPullTree.C:586
 checkPullTree.C:587
 checkPullTree.C:588
 checkPullTree.C:589
 checkPullTree.C:590
 checkPullTree.C:591
 checkPullTree.C:592
 checkPullTree.C:593
 checkPullTree.C:594
 checkPullTree.C:595
 checkPullTree.C:596
 checkPullTree.C:597
 checkPullTree.C:598
 checkPullTree.C:599
 checkPullTree.C:600
 checkPullTree.C:601
 checkPullTree.C:602
 checkPullTree.C:603
 checkPullTree.C:604
 checkPullTree.C:605
 checkPullTree.C:606
 checkPullTree.C:607
 checkPullTree.C:608
 checkPullTree.C:609
 checkPullTree.C:610
 checkPullTree.C:611
 checkPullTree.C:612
 checkPullTree.C:613
 checkPullTree.C:614
 checkPullTree.C:615
 checkPullTree.C:616
 checkPullTree.C:617
 checkPullTree.C:618
 checkPullTree.C:619
 checkPullTree.C:620
 checkPullTree.C:621
 checkPullTree.C:622
 checkPullTree.C:623
 checkPullTree.C:624
 checkPullTree.C:625
 checkPullTree.C:626
 checkPullTree.C:627
 checkPullTree.C:628
 checkPullTree.C:629
 checkPullTree.C:630
 checkPullTree.C:631
 checkPullTree.C:632
 checkPullTree.C:633
 checkPullTree.C:634
 checkPullTree.C:635
 checkPullTree.C:636
 checkPullTree.C:637
 checkPullTree.C:638
 checkPullTree.C:639
 checkPullTree.C:640
 checkPullTree.C:641
 checkPullTree.C:642
 checkPullTree.C:643
 checkPullTree.C:644
 checkPullTree.C:645
 checkPullTree.C:646
 checkPullTree.C:647
 checkPullTree.C:648
 checkPullTree.C:649
 checkPullTree.C:650
 checkPullTree.C:651
 checkPullTree.C:652
 checkPullTree.C:653
 checkPullTree.C:654
 checkPullTree.C:655
 checkPullTree.C:656
 checkPullTree.C:657
 checkPullTree.C:658
 checkPullTree.C:659
 checkPullTree.C:660
 checkPullTree.C:661
 checkPullTree.C:662
 checkPullTree.C:663
 checkPullTree.C:664
 checkPullTree.C:665
 checkPullTree.C:666
 checkPullTree.C:667
 checkPullTree.C:668
 checkPullTree.C:669
 checkPullTree.C:670
 checkPullTree.C:671
 checkPullTree.C:672
 checkPullTree.C:673
 checkPullTree.C:674
 checkPullTree.C:675
 checkPullTree.C:676
 checkPullTree.C:677
 checkPullTree.C:678
 checkPullTree.C:679
 checkPullTree.C:680
 checkPullTree.C:681
 checkPullTree.C:682
 checkPullTree.C:683
 checkPullTree.C:684
 checkPullTree.C:685
 checkPullTree.C:686
 checkPullTree.C:687
 checkPullTree.C:688
 checkPullTree.C:689
 checkPullTree.C:690
 checkPullTree.C:691
 checkPullTree.C:692
 checkPullTree.C:693
 checkPullTree.C:694
 checkPullTree.C:695
 checkPullTree.C:696
 checkPullTree.C:697
 checkPullTree.C:698
 checkPullTree.C:699
 checkPullTree.C:700
 checkPullTree.C:701
 checkPullTree.C:702
 checkPullTree.C:703
 checkPullTree.C:704
 checkPullTree.C:705
 checkPullTree.C:706
 checkPullTree.C:707
 checkPullTree.C:708
 checkPullTree.C:709
 checkPullTree.C:710
 checkPullTree.C:711
 checkPullTree.C:712
 checkPullTree.C:713
 checkPullTree.C:714
 checkPullTree.C:715
 checkPullTree.C:716
 checkPullTree.C:717
 checkPullTree.C:718
 checkPullTree.C:719
 checkPullTree.C:720
 checkPullTree.C:721
 checkPullTree.C:722
 checkPullTree.C:723
 checkPullTree.C:724
 checkPullTree.C:725
 checkPullTree.C:726
 checkPullTree.C:727
 checkPullTree.C:728
 checkPullTree.C:729
 checkPullTree.C:730
 checkPullTree.C:731
 checkPullTree.C:732
 checkPullTree.C:733
 checkPullTree.C:734
 checkPullTree.C:735
 checkPullTree.C:736
 checkPullTree.C:737
 checkPullTree.C:738
 checkPullTree.C:739
 checkPullTree.C:740
 checkPullTree.C:741
 checkPullTree.C:742
 checkPullTree.C:743
 checkPullTree.C:744
 checkPullTree.C:745
 checkPullTree.C:746
 checkPullTree.C:747
 checkPullTree.C:748
 checkPullTree.C:749
 checkPullTree.C:750
 checkPullTree.C:751
 checkPullTree.C:752
 checkPullTree.C:753
 checkPullTree.C:754
 checkPullTree.C:755
 checkPullTree.C:756
 checkPullTree.C:757
 checkPullTree.C:758
 checkPullTree.C:759
 checkPullTree.C:760
 checkPullTree.C:761
 checkPullTree.C:762
 checkPullTree.C:763
 checkPullTree.C:764
 checkPullTree.C:765
 checkPullTree.C:766
 checkPullTree.C:767