ROOT logo
#include "TF2.h"
#include "TH2F.h"
#include "TH3.h"
#include "TPad.h"
#include "TCanvas.h"
#include "TMath.h"
#include "TGraphErrors.h"
#include "TGraphAsymmErrors.h"
#include "TFile.h"
#include "TLatex.h"
#include "TROOT.h"
#include "TLegend.h"
#include "TLegendEntry.h"
#include "TMultiGraph.h"
#include "TPaveText.h"
#include "TRandom.h"
#include "TSystem.h"
#include "TASImage.h"
#include "TObjString.h"
#include "TFitResult.h"
#include "fstream"
#include "TMatrixTBase.h"

void AddPoint(TGraphErrors* graph, Float_t x, Float_t y, Float_t xe, Float_t ye)
{
	graph->SetPoint(graph->GetN(), x, y);
	graph->SetPointError(graph->GetN() - 1, xe, ye);
}

void DrawLatex(Float_t x, Float_t y, Int_t color, const char* text, Float_t textSize = 0.06)
{
  TLatex* latex = new TLatex(x, y, text);
  latex->SetNDC();
  latex->SetTextSize(textSize);
  latex->SetTextColor(color);
  latex->Draw();
}

// 0    1    2    3     4     5     6      7      8          9          10     11     12         13         14          15
// norm,dphi,deta,norm2,dphi2,deta2,chi2_1,chi2_2,moment2phi,moment2eta,phirms,etarms,moment4phi,moment4eta,kurtosisphi,kurtosiseta,
//            16   17   18   19    20    21    22     23     24         25         26     27     28         29         30          31         
// second fit:norm,dphi,deta,norm2,dphi2,deta2,chi2_1,chi2_2,moment2phi,moment2eta,phirms,etarms,moment4phi,moment4eta,kurtosisphi,kurtosiseta,
// 32     33              34      
// IAAFit,Yield(integral),IAAHist,
//        35      36       37    38    39      40       41    42    43       44
// 1D fit:normphi,norm2phi,dphi1,dphi2,normeta,norm2eta,deta1,deta2,chi2phi,chi2eta
// if fitting two 1D Gaussians phi rms is stored in 37 and eta rms in 41 without calling the CalculateRMS function
const Int_t NGraphs = 45;
const Int_t NHists = 6*4; // pt index
TGraphErrors*** graphs = 0;
const char* kCorrFuncTitle = "1/N_{trig} dN_{assoc}/d#Delta#etad#Delta#varphi (1/rad.)";
const char* kProjYieldTitlePhi = "1/N_{trig} dN_{assoc}/d#Delta#varphi (1/rad.)";
const char* kProjYieldTitleEta = "1/N_{trig} dN_{assoc}/d#Delta#eta";
const char* kProjYieldTitlePhiOrEta = "1/N_{trig} dN_{assoc}/d#Delta#varphi (1/rad.) , dN_{assoc}/d#Delta#eta";
TString fgFolder = "tmpresults";
const char* fitLabel = "fit";

void CreateGraphStructure()
{
  graphs = new TGraphErrors**[NGraphs];
  for (Int_t i=0; i<NGraphs; i++)
  {
    graphs[i] = new TGraphErrors*[NHists];
    for (Int_t j=0; j<NHists; j++)
      graphs[i][j] = new TGraphErrors;
  }
}

void WriteGraphs(const char* outputFileName = "graphs.root")
{
  TFile::Open(outputFileName, "RECREATE");
  for (Int_t i=0; i<NGraphs; i++)
    for (Int_t j=0; j<NHists; j++)
      graphs[i][j]->Write(Form("graph_%d_%d", i, j));

  gFile->Close();
}

void ReadGraphs(const char* fileName = "graphs.root")
{
  CreateGraphStructure();
  TFile* file = TFile::Open(fileName);
  for (Int_t i=0; i<NGraphs; i++)
    for (Int_t j=0; j<NHists; j++)
      graphs[i][j] = (TGraphErrors*) file->Get(Form("graph_%d_%d", i, j));
}

void DivideGraphs(TGraphErrors* graph1, TGraphErrors* graph2)
{
//   graph1->Print();
//   graph2->Print();

  for (Int_t bin1 = 0; bin1 < graph1->GetN(); bin1++)
  {
    Float_t x = graph1->GetX()[bin1];

    Int_t bin2 = 0;
    for (bin2 = 0; bin2<graph2->GetN(); bin2++)
      if (graph2->GetX()[bin2] >= x)
        break;

    if (bin2 == graph2->GetN())
            bin2--;

    if (bin2 > 0)
      if (TMath::Abs(graph2->GetX()[bin2-1] - x) < TMath::Abs(graph2->GetX()[bin2] - x))
        bin2--;

    if (graph1->GetY()[bin1] == 0 || graph2->GetY()[bin2] == 0 || bin2 == graph2->GetN())
    {
      Printf("%d %d removed", bin1, bin2);
      graph1->RemovePoint(bin1--);
      continue;
    }

    Float_t graph2Extrapolated = graph2->GetY()[bin2];
    if (TMath::Abs(x - graph2->GetX()[bin2]) > 0.0001)
    {
      Printf("%f %f %d %d not found", x, graph2->GetX()[bin2], bin1, bin2);
      graph1->RemovePoint(bin1--);
      continue;
    }

    Float_t value = graph1->GetY()[bin1] / graph2Extrapolated;
    Float_t error = value * TMath::Sqrt(TMath::Power(graph1->GetEY()[bin1] / graph1->GetY()[bin1], 2) + TMath::Power(graph2->GetEY()[bin2] / graph2->GetY()[bin2], 2));

    graph1->GetY()[bin1] = value;
    graph1->GetEY()[bin1] = error;

//     Printf("%d %d %f %f %f %f", bin1, bin2, x, graph2Extrapolated, value, error);
  }
}

void SubtractGraphs(TGraphErrors* graph1, TGraphErrors* graph2)
{
//   graph1->Print();
//   graph2->Print();

  for (Int_t bin1 = 0; bin1 < graph1->GetN(); bin1++)
  {
    Float_t x = graph1->GetX()[bin1];

    Int_t bin2 = 0;
    for (bin2 = 0; bin2<graph2->GetN(); bin2++)
      if (graph2->GetX()[bin2] >= x)
        break;

    if (bin2 == graph2->GetN())
            bin2--;

    if (bin2 > 0)
      if (TMath::Abs(graph2->GetX()[bin2-1] - x) < TMath::Abs(graph2->GetX()[bin2] - x))
        bin2--;

    if (graph1->GetY()[bin1] == 0 || graph2->GetY()[bin2] == 0 || bin2 == graph2->GetN())
    {
      Printf("%d %d removed", bin1, bin2);
      graph1->RemovePoint(bin1--);
      continue;
    }

    Float_t graph2Extrapolated = graph2->GetY()[bin2];
    if (TMath::Abs(x - graph2->GetX()[bin2]) > 0.0001)
    {
      Printf("%f %f %d %d not found", x, graph2->GetX()[bin2], bin1, bin2);
      graph1->RemovePoint(bin1--);
      continue;
    }

    Float_t value = graph1->GetY()[bin1] - graph2Extrapolated;
    Float_t error = TMath::Sqrt(TMath::Power(graph1->GetEY()[bin1], 2) + TMath::Power(graph2->GetEY()[bin2], 2));

    graph1->GetY()[bin1] = value;
    graph1->GetEY()[bin1] = error;

//     Printf("%d %d %f %f %f %f", bin1, bin2, x, graph2Extrapolated, value, error);
  }
}

/* 
// old one with 1 Gaussian
Double_t DeltaPhiWidth2DFitFunction(Double_t *x, Double_t *par)
{
  // params: 0: gaussian amplitude, 1: phi width, 2: eta width
  //         3..bins+2 constants as fct of phi
  
  Float_t phi = x[0];
  if (phi < 0)
    phi = -phi;
  if (phi > TMath::Pi())
    phi = TMath::TwoPi() - phi;
  Int_t phiBin = (Int_t) (phi / TMath::Pi() * 36);
//   phiBin = 0;
  
  return par[3+phiBin]+par[0]*TMath::Exp(-0.5*((x[0]/par[1])*(x[0]/par[1])+(x[1]/par[2])*(x[1]/par[2])));
}*/

void DrawALICELogo(Bool_t prel, Float_t x1, Float_t y1, Float_t x2, Float_t y2, Bool_t debug = kFALSE)
{
  // correct for aspect ratio of figure plus aspect ratio of pad (coordinates are NDC!)
//   Printf("%d %f %d %f", gPad->GetCanvas()->GetWindowHeight(), gPad->GetHNDC(), gPad->GetCanvas()->GetWindowWidth(), gPad->GetWNDC());
//   x2 = x1 + (y2 - y1) * (620. / 671) * gPad->GetCanvas()->GetWindowHeight() * gPad->GetHNDC() / (gPad->GetWNDC() * gPad->GetCanvas()->GetWindowWidth());
  x2 = x1 + (y2 - y1) * (466. / 523) * gPad->GetWh() * gPad->GetHNDC() / (gPad->GetWNDC() * gPad->GetWw());
//   x2 = x1 + (y2 - y1) * (620. / 671) * gPad->GetWh() / gPad->GetWw();

//   Printf("%f %f %f %f", x1, x2, y1, y2);
  
  TPad *myPadLogo = new TPad("myPadLogo", "Pad for ALICE Logo", x1, y1, x2, y2);
  if (debug)
    myPadLogo->SetFillColor(2); // color to first figure out where is the pad then comment !
  myPadLogo->SetLeftMargin(0);
  myPadLogo->SetTopMargin(0);
  myPadLogo->SetRightMargin(0);
  myPadLogo->SetBottomMargin(0);
  myPadLogo->Draw();
  myPadLogo->cd();
//   TASImage *myAliceLogo = new TASImage("~/alice_logo_transparent.png");
  TASImage *myAliceLogo = new TASImage((prel) ? "~/alice_logo_preliminary.eps" : "~/alice_logo_performance.eps");
  myAliceLogo->Draw();
}

void logotest()
{
  TCanvas* c = new TCanvas("c", "c", 800, 200);
  c->Divide(3, 1);
  c->cd(1);
  DrawALICELogo(1, 0.1, 0.1, 0.9, 0.9);
  c->SaveAs("test.eps");  
}

const Double_t k1OverSqrtTwoPi = 1.0 / TMath::Sqrt(TMath::TwoPi());

Double_t DeltaPhiWidth2DFitFunction(Double_t *x, Double_t *par)
{
  // params: 0: gaussian amplitude, 1: phi width I, 2: eta width I
  //         3: fraction for first Gaussian, 4: phi width II, 5: eta width II
  //         6..bins+5 constants as fct of phi
  
  Float_t phi = x[0];
  if (phi < 0)
    phi = -phi;
  if (phi > TMath::Pi())
    phi = TMath::TwoPi() - phi;
  Int_t phiBin = (Int_t) (phi / TMath::Pi() * 36);
//   phiBin = 0;
  
  return par[6+phiBin] + par[0]*( 
      par[3]/TMath::TwoPi()/par[1]/par[2] * 
	TMath::Exp(-0.5*((x[0]/par[1])*(x[0]/par[1])+(x[1]/par[2])*(x[1]/par[2]))) 
      + (1-par[3])/TMath::TwoPi()/par[4]/par[5] 
	* TMath::Exp(-0.5*((x[0]/par[4])*(x[0]/par[4])+(x[1]/par[5])*(x[1]/par[5]))) 
    );
}

TH2* SubtractEtaGap(TH2* hist, Float_t etaLimit, Float_t outerLimit, Bool_t scale, Bool_t drawEtaGapDist = kFALSE)
{
  TString histName(hist->GetName());
  Int_t etaBins = 0;

  TH1D* etaGap = hist->ProjectionX(histName + "_1", TMath::Max(1, hist->GetYaxis()->FindBin(-outerLimit + 0.01)), hist->GetYaxis()->FindBin(-etaLimit - 0.01));
//   Printf("%f", etaGap->GetEntries());
  if (etaGap->GetEntries() > 0)
    etaBins += hist->GetYaxis()->FindBin(-etaLimit - 0.01) - TMath::Max(1, hist->GetYaxis()->FindBin(-outerLimit + 0.01)) + 1;

  TH1D* tracksTmp = hist->ProjectionX(histName + "_2", hist->GetYaxis()->FindBin(etaLimit + 0.01), TMath::Min(hist->GetYaxis()->GetNbins(), hist->GetYaxis()->FindBin(outerLimit - 0.01)));
//   Printf("%f", tracksTmp->GetEntries());
  if (tracksTmp->GetEntries() > 0)
    etaBins += TMath::Min(hist->GetYaxis()->GetNbins(), hist->GetYaxis()->FindBin(outerLimit - 0.01)) - hist->GetYaxis()->FindBin(etaLimit + 0.01) + 1;
  
  etaGap->Add(tracksTmp);

  // get per bin result
  if (etaBins > 0)
    etaGap->Scale(1.0 / etaBins);
 
  if (drawEtaGapDist)
  {
    TH1D* centralRegion = hist->ProjectionX(histName + "_3", hist->GetYaxis()->FindBin(-etaLimit + 0.01), hist->GetYaxis()->FindBin(etaLimit - 0.01));
    
//    centralRegion->Scale(1.0 / (hist->GetYaxis()->FindBin(etaLimit - 0.01) - hist->GetYaxis()->FindBin(-etaLimit + 0.01) + 1));
    centralRegion->Scale(hist->GetXaxis()->GetBinWidth(1));

    TCanvas* c = new TCanvas("SubtractEtaGap", "SubtractEtaGap", 800, 800);
    gPad->SetLeftMargin(0.13);
    centralRegion->SetStats(0);
    TString label(centralRegion->GetTitle());
    label.ReplaceAll(".00", " GeV/c");
    label.ReplaceAll(".0", " GeV/c");
    centralRegion->SetTitle(label);
    centralRegion->SetLineColor(3);
    centralRegion->Draw();
    centralRegion->GetYaxis()->SetTitle(kProjYieldTitlePhi);
    centralRegion->GetYaxis()->SetTitleOffset(1.6);
    TH1* copy = etaGap->DrawCopy("SAME");
    copy->Scale(hist->GetXaxis()->GetBinWidth(1));
    copy->Scale((hist->GetYaxis()->FindBin(etaLimit - 0.01) - hist->GetYaxis()->FindBin(-etaLimit + 0.01) + 1));
    copy->SetLineColor(2);
    TLegend* legend = new TLegend(0.41, 0.73, 0.69, 0.85);
    legend->SetFillColor(0);
    legend->AddEntry(centralRegion, Form("|#Delta#eta| < %.1f", etaLimit), "L");
    legend->AddEntry(copy, Form("%.1f < |#Delta#eta| < %.1f (scaled)", etaLimit, outerLimit), "L");
    legend->Draw();
    
    DrawLatex(0.705, 0.62, 1, "Pb-Pb 2.76 TeV", 0.025);
    DrawLatex(0.705, 0.58, 1, "Stat. unc. only", 0.025);
    
    DrawALICELogo(kTRUE, 0.7, 0.65, 0.9, 0.85);
    
    c->SaveAs("note/etagap_proj.eps");
    c->SaveAs("note/etagap_proj.png");
  }
  
//   new TCanvas; etaGap->DrawCopy();
  
  TH2* histTmp2D = (TH2*) hist->Clone("histTmp2D");
  histTmp2D->Reset();
  
  for (Int_t xbin=1; xbin<=histTmp2D->GetNbinsX(); xbin++)
    for (Int_t y=1; y<=histTmp2D->GetNbinsY(); y++)
      histTmp2D->SetBinContent(xbin, y, etaGap->GetBinContent(xbin));
    
  if (scale)
  {
    // mixed event does not reproduce away-side perfectly
    // --> extract scaling factor on the away-side from ratios of eta gap and central region
    TH1D* centralRegion = hist->ProjectionX(histName + "_3", hist->GetYaxis()->FindBin(-etaLimit + 0.01), hist->GetYaxis()->FindBin(etaLimit - 0.01));
    etaBins = hist->GetYaxis()->FindBin(etaLimit - 0.01) - hist->GetYaxis()->FindBin(-etaLimit + 0.01) + 1;
    centralRegion->Scale(1.0 / etaBins);
    
//     new TCanvas; centralRegion->DrawCopy(); etaGap->SetLineColor(2); etaGap->DrawCopy("SAME");
    centralRegion->Divide(etaGap);
//     new TCanvas; centralRegion->Draw();
    centralRegion->Fit("pol0", "0", "", TMath::Pi() - 1, TMath::Pi() + 1);
    Float_t scalingFactor = centralRegion->GetFunction("pol0")->GetParameter(0);
    Printf("  scalingFactor = %f", scalingFactor);
    histTmp2D->Scale(scalingFactor);
  }
    
//   new TCanvas; hist->DrawCopy("SURF1");

  hist->Add(histTmp2D, -1);  
  return histTmp2D;
}

void SubtractEtaGap1D(TH1* projPhi, TH1* projPhiSubtractPositive, TH1* projPhiSubtractNegative, TH1* projEta, Float_t etaLimit, Float_t outerLimit, Bool_t draw = kFALSE )
{
  if (draw)
  {
    TCanvas* c1 = new TCanvas("c1", "eta", 800, 600);
    c1->cd();
    projEta->GetYaxis()->SetRangeUser(0,1.1);
    projEta->DrawCopy(); 
  }
  Float_t background = 0;
  Float_t backgroundError = 0;
  Int_t nBins = 0;

  for (Int_t i=projEta->FindBin(-outerLimit + 0.01); i<=projEta->FindBin(-etaLimit - 0.01); i++)
  {
    nBins++;
    background += projEta->GetBinContent(i);
    backgroundError += TMath::Power(projEta->GetBinError(i),2);
  }
  for (Int_t i=projEta->FindBin(etaLimit + 0.01); i<=projEta->FindBin(outerLimit - 0.01); i++)
  { 
    nBins++;
    background += projEta->GetBinContent(i);
    backgroundError += TMath::Power(projEta->GetBinError(i),2);
  }
  background = background/nBins;
  backgroundError = TMath::Sqrt(backgroundError)/nBins;
  for (Int_t i=1; i<=projEta->GetNbinsX(); i++)
  {
    Float_t content = projEta->GetBinContent(i);
    Float_t contentError = projEta->GetBinError(i);
    projEta->SetBinContent(i,content-background);
    projEta->SetBinError(i,TMath::Sqrt(TMath::Power(contentError,2)+TMath::Power(backgroundError,2)));
  }
  if (draw) projEta->DrawCopy("SAME");
  background = 0;
  backgroundError = 0;
  if (draw)
  {
    TCanvas* c2 = new TCanvas("c2", "phi", 800, 600);
    c2->cd();
    projPhi->GetYaxis()->SetRangeUser(0,1.5);
    projPhi->DrawCopy();
    projPhiSubtractPositive->DrawCopy("SAME");
    projPhiSubtractNegative->DrawCopy("SAME");
  }
  projPhiSubtractNegative->Add(projPhiSubtractPositive);
  projPhiSubtractNegative->Scale(1.0/2.0);
  projPhi->Add(projPhiSubtractNegative,-1);
  if (draw) projPhi->DrawCopy("SAME");
}

/*void FitDeltaPhiEtaGap2D(TH2* hist, Bool_t scale,  TCanvas* canvas, Int_t canvasPos, TGraphErrors** width, Float_t x, Float_t yPosChi2, TGraphErrors* chi2_1, TGraphErrors* chi2_2)
{
  Float_t etaLimit = 1.0;
  Float_t outerLimit = 1.6;
  
  SubtractEtaGap(hist, etaLimit, outerLimit, scale);

//   new TCanvas; hist->DrawCopy("SURF1");

  hist->GetYaxis()->SetRangeUser(-outerLimit+0.01, outerLimit-0.01);
  hist->GetXaxis()->SetRangeUser(-TMath::Pi() / 2 + 0.01, TMath::Pi() * 0.5 - 0.01);
  
  canvas->cd(canvasPos);
  hist->SetStats(0);
  hist->DrawCopy("SURF1");
  
  Float_t min = hist->GetMinimum();
  Float_t max = hist->GetMaximum();
  
  // ranges are to exclude eta gap region from fit
  TF2* func = new TF2("func", "[0]+[1]*exp(-0.5*((x/[2])**2+(y/[3])**2))", -0.5 * TMath::Pi(), 0.5 * TMath::Pi(), -outerLimit, outerLimit);
  func->SetParameters(0, 1, 0.3, 0.3);
  func->SetParLimits(1, 0, 10);
  func->SetParLimits(2, 0.05, 1);
  func->SetParLimits(3, 0.05, 1);
  func->FixParameter(0, 0);

//   TF2* func = new TF2("func", DeltaPhiWidth2DFitFunction, -TMath::Pi() / 2, TMath::Pi() * 1.5, -1, 1, 4);
//   func->SetParameters(1, 0.3, 0.3, 0);
//   func->SetParLimits(0, 0, 10);
//   func->SetParLimits(1, 0.1, 10);
//   func->SetParLimits(2, 0.1, 10);
  
  hist->Fit(func, "0R", "");
  hist->Fit(func, "I0R", "");

//   func->SetRange(-0.5 * TMath::Pi(), 0.5 * TMath::Pi(), -outerLimit, outerLimit);
  
  canvas->cd(canvasPos + 1);
  TH2* funcHist = (TH2*) hist->Clone("funcHist");
  funcHist->Reset();
  funcHist->Add(func);
  funcHist->SetMinimum(min);
  funcHist->SetMaximum(max);
  funcHist->Draw("SURF1");
  
  canvas->cd(canvasPos + 2);
  hist->Add(func, -1);
  hist->SetMinimum(min);
  hist->SetMaximum(max);
  hist->DrawCopy("SURF1");
  
  width[0]->SetPoint(width[0]->GetN(), x, TMath::Abs(func->GetParameter(2)));
  width[0]->SetPointError(width[0]->GetN()-1, 0, func->GetParError(2));
    
  width[1]->SetPoint(width[1]->GetN(), x, TMath::Abs(func->GetParameter(3)));
  width[1]->SetPointError(width[1]->GetN()-1, 0, func->GetParError(3));

  Float_t chi2 = 0;
  Int_t ndf = 0;
  for (Int_t i=hist->GetXaxis()->FindBin(-0.8); i<=hist->GetXaxis()->FindBin(0.8); i++)
    for (Int_t j=hist->GetYaxis()->FindBin(-0.8); j<=hist->GetYaxis()->FindBin(0.8); j++)
    {
      if (hist->GetBinError(i, j) > 0)
      {
	chi2 += TMath::Power(hist->GetBinContent(i, j) / hist->GetBinError(i, j), 2);
	ndf++;
      }
    }
  ndf -= func->GetNumberFreeParameters();
  
  printf("#chi^{2}/ndf = %.1f/%d = %.1f  ", func->GetChisquare(), func->GetNDF(), func->GetChisquare() / func->GetNDF());
  Printf("#chi^{2}/ndf = %.1f/%d = %.1f", chi2, ndf, chi2 / ndf);

  DrawLatex(0.5, yPosChi2, 1, Form("#chi^{2}/ndf = %.1f/%d = %.1f", func->GetChisquare(), func->GetNDF(), func->GetChisquare() / func->GetNDF()));
  DrawLatex(0.5, yPosChi2 - 0.05, 1, Form("#chi^{2}/ndf = %.1f/%d = %.1f", chi2, ndf, chi2 / ndf));

  chi2_1->SetPoint(chi2_1->GetN(), x, func->GetChisquare() / func->GetNDF());
  chi2_2->SetPoint(chi2_2->GetN(), x, chi2 / ndf);
}
*/

void CalculateMomentsKurtosis(Float_t momentCalcLimit, TH1* proj, Int_t graphIDStart, Int_t histId, Float_t x, Float_t xE)
{
  //   momentCalcLimit = 0.6;
  for (Int_t n=2; n <= 4; n+=2) // skipping moment 3
  {
    Float_t moment = 0;
    Float_t sum = 0;
    for (Int_t bin = proj->GetXaxis()->FindBin(-momentCalcLimit); bin <= proj->GetXaxis()->FindBin(momentCalcLimit); bin++)
    {
      moment += proj->GetBinContent(bin) * TMath::Power(proj->GetMean() - proj->GetXaxis()->GetBinCenter(bin), n);
      sum += proj->GetBinContent(bin);
    }
    Printf("%f %f", moment, sum);
    moment /= sum;
    
    Float_t error = 0;
    for (Int_t bin = proj->GetXaxis()->FindBin(-momentCalcLimit); bin <= proj->GetXaxis()->FindBin(momentCalcLimit); bin++)
    {
      error += proj->GetBinError(bin) * proj->GetBinError(bin) * 
	TMath::Power(TMath::Power(proj->GetMean() - proj->GetXaxis()->GetBinCenter(bin), n) / sum 
	  - moment / sum, 2);
    }
    AddPoint(graphs[graphIDStart+(n-2)*2][histId], x, moment, xE, TMath::Sqrt(error));
    Printf("%d %d %f +- %f <-> %f +- %f", n, graphIDStart+(n-2)*2, moment, TMath::Sqrt(error), proj->GetRMS() * proj->GetRMS(), 2 * proj->GetRMSError() / proj->GetRMS() * proj->GetRMS() * proj->GetRMS());
  }
  
  proj->GetXaxis()->SetRangeUser(-momentCalcLimit, momentCalcLimit);
  AddPoint(graphs[graphIDStart+6][histId], x, proj->GetKurtosis(1), xE, proj->GetKurtosis(11));
}

void AddRMS(TGraphErrors* graph, Float_t x, Float_t xE, TF1* func, TMatrixDSym& cov, Int_t sigma1, Int_t sigma2, Int_t weight)
{
  Float_t a = TMath::Abs(func->GetParameter(sigma1));
  Float_t b = TMath::Abs(func->GetParameter(sigma2));
  Float_t w = func->GetParameter(weight);

  Float_t rms = a * w + b * (1.0 - w);

  /*
  func->Print(); Printf("%f %f %f", a, b, w); cov.Print();
  Printf("%f %f %f %f %f %f", TMath::Power(w * func->GetParError(sigma1), 2),
    TMath::Power((1.0 - w) * func->GetParError(sigma2), 2),
    TMath::Power((a - b) * func->GetParError(weight), 2),
    2 * (a - b) * w * cov(weight, sigma1),
    2 * (a - b) * (1.0 - w) * cov(weight, sigma2),
    2 * w * (1.0 - w) * cov(sigma1, sigma2));
  */
  
  Float_t sigma_rms = 
    TMath::Power(w * func->GetParError(sigma1), 2) + 
    TMath::Power((1.0 - w) * func->GetParError(sigma2), 2) + 
    TMath::Power((a - b) * func->GetParError(weight), 2) + 
    2 * (a - b) * w * cov(weight, sigma1) +
    2 * (a - b) * (1.0 - w) * cov(weight, sigma2) +
    2 * w * (1.0 - w) * cov(sigma1, sigma2);
    
   if (sigma_rms < 0)
   {
     Printf("WARNING: error is negative!");
     
     sigma_rms = TMath::Power(w * func->GetParError(sigma1), 2) + 
     TMath::Power((1.0 - w) * func->GetParError(sigma2), 2) + 
     TMath::Power((a - b) * func->GetParError(weight), 2);
   }
    
  sigma_rms = TMath::Sqrt(sigma_rms);
  
  Printf("RMS: %f +- %f", rms, sigma_rms);
  AddPoint(graph, x, rms, xE, sigma_rms);
}

void AddKurtosis(TGraphErrors* graph, Float_t x, Float_t xE, TF1* func, TMatrixDSym& cov, Int_t sigma1, Int_t sigma2, Int_t weight)
{
  Float_t a = TMath::Abs(func->GetParameter(sigma1));
  Float_t b = TMath::Abs(func->GetParameter(sigma2));
  Float_t w = func->GetParameter(weight);

  Float_t rms = a * w + b * (1.0 - w);
  Float_t kurtosis = 3 * (w * TMath::Power(a, 4) + (1.0 - w) * TMath::Power(b, 4)) / rms / rms - 3;
  
  Float_t der_a = 12*a*a*a*w / TMath::Power(b*b+(a*a-b*b)*w, 2) - (12*a*w*(b*b*b*b+(a*a*a*a-b*b*b*b)*w))/TMath::Power(b*b+(a*a-b*b)*w, 3);
  Float_t der_b = (3*(4*b*b*b-4*b*b*b*w))/TMath::Power((b*b+(a*a-b*b)*w), 2) - (6*(2*b-2*b*w)*(b*b*b*b+(a*a*a*a-b*b*b*b)* w))/TMath::Power(b*b+(a*a-b*b)*w, 3);
  Float_t der_w = (3*(a*a*a*a-b*b*b*b))/TMath::Power(b*b+(a*a-b*b)*w, 2) - (6*(a*a-b*b)*(b*b*b*b+(a*a*a*a-b*b*b*b)*w))/TMath::Power(b*b+(a*a-b*b)*w,3);
  
  Float_t sigma_kurtosis = 
    TMath::Power(der_a * func->GetParError(sigma1), 2) + 
    TMath::Power(der_b * func->GetParError(sigma2), 2) + 
    TMath::Power(der_w * func->GetParError(weight), 2) + 
    2 * der_w * der_a * cov(weight, sigma1) +
    2 * der_w * der_b * cov(weight, sigma2) +
    2 * der_a * der_b * cov(sigma1, sigma2);
    
//   if (sigma_rms < 0)
//   {
//     Printf("WARNING: error is negative!");
//     
//     sigma_rms = TMath::Power(w * func->GetParError(sigma1), 2) + 
//     TMath::Power((1.0 - w) * func->GetParError(sigma2), 2) + 
//     TMath::Power((a - b) * func->GetParError(weight), 2);
//   }
    
  sigma_kurtosis = TMath::Sqrt(sigma_kurtosis);
  
  Printf("Kurtosis: %f +- %f", kurtosis, sigma_kurtosis);
  AddPoint(graph, x, kurtosis, xE, sigma_kurtosis);
}

Float_t kEtaLimit = 1.0;
Float_t kOuterLimit = 1.59;


Bool_t FitDeltaPhi2DOneFunction(TH2* hist, TCanvas* canvas, Int_t canvasPos, Int_t graphID, Float_t x, Float_t xE, Float_t yPosChi2, Bool_t quick, Int_t histId, Int_t limits, Bool_t /*twoTrack*/)
{
  Bool_t success = kTRUE;
  Float_t etaLimit = kEtaLimit;
  Float_t outerLimit = kOuterLimit;

  // for pt,T < 3
  if (graphID <= 10)
    etaLimit = 1.4;
  if (graphID <= 15)
    etaLimit = 1.2;
  
  // for pT,a > 4
  if (graphID == 18 || graphID == 23 || graphID == 24)
  {
    etaLimit = 0.5;
    outerLimit = 0.99;
  }
  Float_t sigmaFitLimit = 0.1 - limits * 0.05;
  Float_t etaFitUpperLimit = 0.8;
  Float_t initSigma = 0.6;
  if (histId == 2) // pp
  {
    etaFitUpperLimit = 0.6;
    initSigma = 0.4;
  }
  if ((graphID == 10 && histId == 4) || (graphID == 5 && histId == 0))
    etaFitUpperLimit += 0.1;
  
  Printf("Limits: etaLimit = %f outerLimit = %f sigmaFitLimit = %f etaFitUpperLimit = %f initSigma = %f", etaLimit, outerLimit, sigmaFitLimit, etaFitUpperLimit, initSigma);

  // set errors large for bins around (0,0)
  if (1 && graphID <= 12)
  {
    Float_t exclusionRegion = 0.19;
    if (graphID == 0)
      exclusionRegion = 0.29;
    if (graphID == 10 || graphID == 11 || graphID == 12)
      exclusionRegion = 0.075;
    
    Printf("NOTE : Skipping bins at (0, 0)");
    for (Int_t binx = hist->GetXaxis()->FindBin(-exclusionRegion); binx <= hist->GetXaxis()->FindBin(exclusionRegion); binx++)
      for (Int_t biny = hist->GetYaxis()->FindBin(-exclusionRegion); biny <= hist->GetYaxis()->FindBin(exclusionRegion); biny++)
      {
// 	hist->SetBinContent(binx, biny,  0);
	hist->SetBinError(binx, biny,  1e5);
      }
  }

  hist->GetYaxis()->SetRangeUser(-outerLimit+0.01, outerLimit-0.01);
  hist->GetXaxis()->SetRangeUser(-TMath::Pi() / 2 + 0.01, TMath::Pi() * 0.5 - 0.01);
  
  Float_t mean = hist->Integral(hist->GetYaxis()->FindBin(-TMath::Pi() / 2), hist->GetYaxis()->FindBin(TMath::Pi() / 2), hist->GetYaxis()->FindBin(etaLimit), hist->GetYaxis()->FindBin(outerLimit)) / (hist->GetYaxis()->FindBin(TMath::Pi() / 2) - hist->GetYaxis()->FindBin(-TMath::Pi() / 2)) / (hist->GetYaxis()->FindBin(outerLimit) - hist->GetYaxis()->FindBin(etaLimit) + 1);
//   Printf("%f", mean);

  // sums
  TGraphErrors* sumSummary = new TGraphErrors;
  TGraphErrors* phiWidthSummary = new TGraphErrors;
  TGraphErrors* etaWidthSummary = new TGraphErrors;
  
  canvas->cd(canvasPos++);
  hist->SetStats(0);
  hist->DrawCopy("SURF1");
  sumSummary->SetPoint(sumSummary->GetN(), sumSummary->GetN(), hist->Integral());
  
  Float_t min = hist->GetMinimum();
  Float_t max = hist->GetMaximum();

  Int_t bins = hist->GetNbinsX() / 2 / 2;
    
  TF2* func = new TF2("func", DeltaPhiWidth2DFitFunction, -TMath::Pi() / 2, TMath::Pi() * 0.5, -outerLimit, outerLimit, bins+6);
  func->SetParameters(hist->GetBinContent(hist->GetXaxis()->FindBin(0.0), hist->GetYaxis()->FindBin(0.0)) - mean, 0.3, 0.3, 0.25, initSigma, initSigma);
  for (Int_t i=6; i<bins+6; i++)
    func->SetParameter(i, mean);
 
 
  if (1)
  {
    // STEP 1: fit only flow using one delta eta side
    for (Int_t i=0; i<6; i++)
      func->FixParameter(i, func->GetParameter(i));
    hist->GetYaxis()->SetRangeUser(etaLimit+0.01, outerLimit-0.01);
    Int_t fitResult = hist->Fit(func, "0", "");
    Printf("Fit result: %d; Chi2/ndf: %f/%d", fitResult, func->GetChisquare(), func->GetNDF());
    if (fitResult != 0)
      success = kFALSE;

    // STEP2 : fit only Gaussian in central region
    for (Int_t i=0; i<6; i++)
      func->ReleaseParameter(i);
    //   func->SetParameters(1, 0.3, 0.3, 0.25, initSigma, initSigma);
    func->SetParLimits(0, 0, 10);
    func->SetParLimits(1, sigmaFitLimit, 0.6);
    func->SetParLimits(2, sigmaFitLimit, etaFitUpperLimit);
    func->SetParLimits(3, 0.05, 0.95);
    func->SetParLimits(4, sigmaFitLimit, 0.601);
    func->SetParLimits(5, sigmaFitLimit, etaFitUpperLimit);
    for (Int_t i=6; i<bins+6; i++)
      func->FixParameter(i, func->GetParameter(i));
    hist->GetYaxis()->SetRangeUser(-etaLimit+0.01, etaLimit-0.01);
    fitResult = hist->Fit(func, "0", "");
    Printf("Fit result: %d; Chi2/ndf: %f/%d", fitResult, func->GetChisquare(), func->GetNDF());
    if (fitResult != 0)
      success = kFALSE;

    // STEP3: fit everything, with limits
    for (Int_t i=6; i<bins+6; i++)
    {
      func->ReleaseParameter(i);
      func->SetParLimits(i, func->GetParameter(i) * 0.8, func->GetParameter(i) * 1.2);
    }
    hist->GetYaxis()->SetRangeUser(-outerLimit+0.01, outerLimit-0.01);

    // STEP4: fit everything, without limits
    for (Int_t i=6; i<bins+6; i++)
      func->SetParLimits(i, 0, 0);
    fitResult = hist->Fit(func, "0", "");
    Printf("Fit result: %d; Chi2/ndf: %f/%d", fitResult, func->GetChisquare(), func->GetNDF());
    if (fitResult != 0)
      success = kFALSE;
  }
  TFitResultPtr fitResultPtr = hist->Fit(func, "S0", "");
  TMatrixDSym cov = fitResultPtr->GetCovarianceMatrix();
  Printf("Fit result: %d; Chi2/ndf: %f/%d", (Int_t) fitResultPtr, func->GetChisquare(), func->GetNDF());
  if (fitResultPtr != 0)
    success = kFALSE;

  Printf("Trying 1 Gaussian...");
  TF2* func_clone = new TF2("func_clone", DeltaPhiWidth2DFitFunction, -TMath::Pi() / 2, TMath::Pi() * 0.5, -outerLimit, outerLimit, bins+6);
  for (Int_t i=0; i<bins+6; i++)
  {
    func_clone->SetParameter(i, func->GetParameter(i));
    Double_t parmin, parmax;
    func->GetParLimits(i, parmin, parmax);
    func_clone->SetParLimits(i, parmin, parmax);
  }
  func_clone->SetParLimits(3, 1, 1);
  func_clone->FixParameter(3, 1);
  func_clone->FixParameter(4, sigmaFitLimit);
  func_clone->FixParameter(5, sigmaFitLimit);
  TFitResultPtr fitResultPtr2 = hist->Fit(func_clone, "S0R", "");
  Printf("Fit result: %d", (Int_t) fitResultPtr2);
  
  // if both parameters are within 1%, refit with 1 Gaussian only
  if (TMath::Abs(1.0 - func->GetParameter(1) / func->GetParameter(4)) < 0.01 && TMath::Abs(1.0 - func->GetParameter(2) / func->GetParameter(5)) < 0.01)
  {
    Printf("Parameters within 1%%. Using result from 1 Gaussian...");
    
    func = func_clone;
    cov = fitResultPtr2->GetCovarianceMatrix();
    
    if (fitResultPtr2 != 0)
      success = kFALSE;
  }
  else if (func_clone->GetChisquare() * 0.99 < func->GetChisquare())
  {
    Printf("1 Gaussian fit has a at maximum 1%% (%f %f) larger chi2. Using results from 1 Gaussian...", func_clone->GetChisquare(), func->GetChisquare());
    
    func = func_clone;
    cov = fitResultPtr2->GetCovarianceMatrix();
    
    if (fitResultPtr2 != 0)
      success = kFALSE;
  } 
  
  Int_t first = 1;
  Int_t second = 4;
  if (func->GetParameter(1) < func->GetParameter(4))
  {
    first = 4;
    second = 1;
  }
  //dphi
  AddPoint(graphs[1+16][graphID], x, TMath::Abs(func->GetParameter(first)), xE, func->GetParError(first));
  AddPoint(graphs[4+16][graphID], x, TMath::Abs(func->GetParameter(second)), xE, func->GetParError(second));

  //deta
  AddPoint(graphs[2+16][graphID], x, TMath::Abs(func->GetParameter(first+1)), xE, func->GetParError(first+1));
  AddPoint(graphs[5+16][graphID], x, TMath::Abs(func->GetParameter(second+1)), xE, func->GetParError(second+1));
  
  // norm
  AddPoint(graphs[0+16][graphID], x, func->GetParameter(0), xE, func->GetParError(0));
  if (first < second)
    AddPoint(graphs[3+16][graphID], x, func->GetParameter(3), xE, func->GetParError(3));
  else
    AddPoint(graphs[3+16][graphID], x, 1.0 - func->GetParameter(3), xE, func->GetParError(3));    
  
  //rms
  AddRMS(graphs[10+16][graphID], x, xE, func, cov, 1, 4, 3);
  AddRMS(graphs[11+16][graphID], x, xE, func, cov, 1+1, 4+1, 3);
  AddKurtosis(graphs[14+16][graphID], x, xE, func, cov, 1, 4, 3);
  AddKurtosis(graphs[15+16][graphID], x, xE, func, cov, 1+1, 4+1, 3);
  
  //   hist->Fit(func, "0RI", "");

  //   width[0]->SetPoint(width[0]->GetN(), x, TMath::Abs(func->GetParameter(1)));
  //   width[0]->SetPointError(width[0]->GetN()-1, 0, func->GetParError(1));
  //     
  //   width[1]->SetPoint(width[1]->GetN(), x, TMath::Abs(func->GetParameter(2)));
  //   width[1]->SetPointError(width[1]->GetN()-1, 0, func->GetParError(2));

  AddPoint(phiWidthSummary, phiWidthSummary->GetN(), func->GetParameter(1), 0, func->GetParError(1));
  AddPoint(phiWidthSummary, phiWidthSummary->GetN(), func->GetParameter(4), 0, func->GetParError(4));
  
  AddPoint(etaWidthSummary, etaWidthSummary->GetN(), func->GetParameter(2), 0, func->GetParError(2));
  AddPoint(etaWidthSummary, etaWidthSummary->GetN(), func->GetParameter(5), 0, func->GetParError(5));

  canvas->cd(canvasPos++);
  TH2* funcHist = (TH2*) hist->Clone("funcHist");
  funcHist->Reset();
  funcHist->Add(func);
  funcHist->SetMinimum(min);
  funcHist->SetMaximum(max);
  funcHist->Draw("SURF1");
  
  sumSummary->SetPoint(sumSummary->GetN(), sumSummary->GetN(), funcHist->Integral());
  
  canvas->cd(canvasPos++);
  TH2* residuals = (TH2*) hist->Clone("residuals");
  residuals->Add(func, -1);
  residuals->SetMinimum(-(max - min) / 2);
  residuals->SetMaximum((max - min) / 2);
  residuals->Draw("SURF1");

  Double_t chi2 = 0;
  Int_t ndf = 0;
  for (Int_t i=hist->GetXaxis()->FindBin(-0.8); i<=hist->GetXaxis()->FindBin(0.8); i++)
    for (Int_t j=hist->GetYaxis()->FindBin(-etaLimit); j<=hist->GetYaxis()->FindBin(etaLimit); j++)
    {
      if (residuals->GetBinError(i, j) > 0)
      {
	chi2 += TMath::Power(residuals->GetBinContent(i, j) / residuals->GetBinError(i, j), 2);
	ndf++;
      }
    }
  ndf -= func->GetNumberFreeParameters();
  
  if (func->GetNDF() > 0)
  {
    printf("#chi^{2}/ndf = %.1f/%d = %.1f  ", func->GetChisquare(), func->GetNDF(), func->GetChisquare() / func->GetNDF());
    DrawLatex(0.2, yPosChi2, 1, Form("#chi^{2}/ndf = %.1f/%d = %.1f", func->GetChisquare(), func->GetNDF(), func->GetChisquare() / func->GetNDF()));
    AddPoint(graphs[6+16][graphID], x, func->GetChisquare() / func->GetNDF(), xE, 0);
  }
  if (ndf)
  {
    Printf("#chi^{2}/ndf = %.1f/%d = %.1f", chi2, ndf, chi2 / ndf);
    DrawLatex(0.2, yPosChi2 - 0.05, 1, Form("#chi^{2}/ndf = %.1f/%d = %.1f", chi2, ndf, chi2 / ndf));
    AddPoint(graphs[7+16][graphID], x, chi2 / ndf, xE, 0);
  }
  
  // draw gaussian only
  TF2* funcClone = new TF2("funcClone", DeltaPhiWidth2DFitFunction, -TMath::Pi() / 2, TMath::Pi() * 0.5, -outerLimit, outerLimit, bins+6);
  for (Int_t i=0; i<6; i++)
    funcClone->SetParameter(i, func->GetParameter(i));
  for (Int_t i=6; i<bins+6; i++)
    funcClone->SetParameter(i, 0);
//   funcClone->Print();
  canvas->cd(canvasPos++);
  funcHist = (TH2*) hist->Clone("funcHistb");
  funcHist->Reset();
  funcHist->Add(funcClone);
  funcHist->SetMinimum(0);
  funcHist->SetMaximum(max - min);
  funcHist->Draw("SURF1");
  
  // eta gap subtraction
  canvas->cd(canvasPos++);
  func->SetParameter(0, 0);
  TH2* subtractFlow = (TH2*) hist->Clone("subtractFlow");
  subtractFlow->Add(func, -1);
  subtractFlow->SetMinimum(0);
  subtractFlow->SetMaximum(max - min);
  subtractFlow->DrawCopy("SURF1");
  sumSummary->SetPoint(sumSummary->GetN(), sumSummary->GetN(), subtractFlow->Integral());
/*
  Float_t etaLimitSubtract = 0;
  Float_t outerLimitSubtract = 0;
  if (graphID >= 15)
  {
    etaLimitSubtract = 0.5;
    outerLimitSubtract = 0.99;
  }
  else 
  {
    etaLimitSubtract = etaLimit;
    outerLimitSubtract = outerLimit;
  }
*/

  Float_t momentFitLimit = 0.8 - 1e-4;
  if (graphID >= 20)
    momentFitLimit = 0.4 - 1e-4;

  TH1* projx3 = hist->ProjectionX(Form("%s_projx3", hist->GetName()), hist->GetYaxis()->FindBin(-etaLimit+0.01), hist->GetYaxis()->FindBin(etaLimit-0.01));
  Float_t nBins = hist->GetYaxis()->FindBin(etaLimit-0.01) - hist->GetYaxis()->FindBin(-etaLimit+0.01)+1;
  projx3->Scale(1.0/nBins);
  
  TH1* projx3SubtractNegative = hist->ProjectionX(Form("%s_projx3SubtractPositive", hist->GetName()), hist->GetYaxis()->FindBin(-outerLimit+0.01), hist->GetYaxis()->FindBin(-etaLimit-0.01));
  nBins = hist->GetYaxis()->FindBin(-etaLimit-0.01) - hist->GetYaxis()->FindBin(-outerLimit+0.01)+1;
  projx3SubtractNegative->Scale(1.0/nBins);

  TH1* projx3SubtractPositive = hist->ProjectionX(Form("%s_projx3SubtractNegative ", hist->GetName()), hist->GetYaxis()->FindBin(etaLimit+0.01), hist->GetYaxis()->FindBin(outerLimit-0.01));
  nBins = hist->GetYaxis()->FindBin(outerLimit-0.01) - hist->GetYaxis()->FindBin(etaLimit+0.01)+1;
  projx3SubtractPositive->Scale(1.0/nBins);

  TH1* projy3 = hist->ProjectionY(Form("%s_projy3", hist->GetName()), hist->GetXaxis()->FindBin(-momentFitLimit+0.01), hist->GetXaxis()->FindBin(momentFitLimit-0.01));
  nBins = hist->GetXaxis()->FindBin(momentFitLimit-0.01) - hist->GetXaxis()->FindBin(-momentFitLimit+0.01)+1;
  projy3->Scale(1.0/nBins);

  SubtractEtaGap1D(projx3, projx3SubtractPositive, projx3SubtractNegative, projy3, etaLimit, outerLimit);
  projy3->GetXaxis()->SetRangeUser(-momentFitLimit+0.01,momentFitLimit-0.01);
  projx3->GetXaxis()->SetRangeUser(-momentFitLimit+0.01, momentFitLimit-0.01);
  SubtractEtaGap(hist, etaLimit, outerLimit, kFALSE);
//  return 0;
  canvas->cd(canvasPos++);
  hist->SetMinimum(-(max - min) / 2);
  hist->SetMaximum((max - min) / 2);
  hist->DrawCopy("SURF1");
  sumSummary->SetPoint(sumSummary->GetN(), sumSummary->GetN(), hist->Integral());

  if (!quick)
  {
    canvas->cd(canvasPos++);
    TH2* difference = (TH2*) hist->Clone("difference");
    difference->Add(subtractFlow, -1);
    difference->SetMinimum(-(max - min) / 2);
    difference->SetMaximum((max - min) / 2);
    difference->DrawCopy("SURF1");

    canvas->cd(canvasPos++);
    TF2* func2 = new TF2("func2", "[0]+[1]*exp(-0.5*((x/[2])**2+(y/[3])**2))", -0.5 * TMath::Pi(), 0.5 * TMath::Pi(), -outerLimit, outerLimit);
    func2->SetParameters(0, 1, 0.3, 0.3);
    func2->SetParLimits(1, 0, 10);
    func2->SetParLimits(2, sigmaFitLimit, 1);
    func2->SetParLimits(3, sigmaFitLimit, 1);
    func2->FixParameter(0, 0);
    
    hist->Fit(func2, "0R", "");
    //   hist->Fit(func2, "I0R", "");
    
    AddPoint(phiWidthSummary, phiWidthSummary->GetN(), func2->GetParameter(2), 0, func2->GetParError(2));
    AddPoint(etaWidthSummary, etaWidthSummary->GetN(), func2->GetParameter(3), 0, func2->GetParError(3));
  
    TH2* funcHist2 = (TH2*) hist->Clone("funcHist2");
    funcHist2->Reset();
    funcHist2->Add(func2);
    funcHist2->SetMinimum(-(max - min) / 2);
    funcHist2->SetMaximum((max - min) / 2);
    funcHist2->Draw("SURF1");
    sumSummary->SetPoint(sumSummary->GetN(), sumSummary->GetN(), funcHist2->Integral());
    
    if (func2->GetNDF() > 0)
    {
      Printf("#chi^{2}/ndf = %.1f/%d = %.1f", func2->GetChisquare(), func2->GetNDF(), func2->GetChisquare() / func2->GetNDF());
      DrawLatex(0.2, yPosChi2, 1, Form("#chi^{2}/ndf = %.1f/%d = %.1f", func2->GetChisquare(), func2->GetNDF(), func2->GetChisquare() / func2->GetNDF()));
    }

    canvas->cd(canvasPos++);
    TH2* residuals2 = (TH2*) hist->Clone("residuals");
    residuals2->Add(funcHist2, -1);
    residuals2->SetMinimum(-(max - min) / 2);
    residuals2->SetMaximum((max - min) / 2);
    residuals2->Draw("SURF1");
  }


  TH1* projx2 = hist->ProjectionX(Form("%s_projx2", hist->GetName()), hist->GetYaxis()->FindBin(-etaLimit+0.01), hist->GetYaxis()->FindBin(etaLimit-0.01));
  projx2->GetXaxis()->SetRangeUser(-momentFitLimit, momentFitLimit);
  nBins = hist->GetYaxis()->FindBin(etaLimit-0.01) - hist->GetYaxis()->FindBin(-etaLimit+0.01)+1;
  projx2->Scale(1.0/nBins);
  
  TH1* projy2 = hist->ProjectionY(Form("%s_projy2", hist->GetName()), hist->GetXaxis()->FindBin(-momentFitLimit+0.01), hist->GetXaxis()->FindBin(momentFitLimit-0.01));
  projy2->GetXaxis()->SetRangeUser(-momentFitLimit, momentFitLimit);
  nBins = hist->GetXaxis()->FindBin(momentFitLimit-0.01) - hist->GetXaxis()->FindBin(-momentFitLimit+0.01)+1;
  projy2->Scale(1.0/nBins);
  
//   CalculateMomentsKurtosis(momentFitLimit, projx2, 8, graphID, x, xE);
//   CalculateMomentsKurtosis(momentFitLimit, projy2, 9, graphID, x, xE);

//     return success;
  
  TH1* projx1 = subtractFlow->ProjectionX(Form("%s_projx1", hist->GetName()), hist->GetYaxis()->FindBin(-0.79), hist->GetYaxis()->FindBin(0.79));
  projx1->GetXaxis()->SetRangeUser(-momentFitLimit, momentFitLimit);

  TH1* projy1 = subtractFlow->ProjectionY(Form("%s_projy1", hist->GetName()), hist->GetXaxis()->FindBin(-0.79), hist->GetXaxis()->FindBin(0.79));
  projy1->GetXaxis()->SetRangeUser(-momentFitLimit, momentFitLimit);

//   CalculateMomentsKurtosis(momentFitLimit, projx1, 8+16, graphID, x, xE);
//   CalculateMomentsKurtosis(momentFitLimit, projy1, 9+16, graphID, x, xE);

//   TF1* twoGauss = new TF1("twoGauss", "gaus(0)+gaus(3)", -2, 2);
//   twoGauss->SetParameters(1, 0, 0.3, 1, 0, 0.6);
//   twoGauss->FixParameter(1, 0);
//   twoGauss->FixParameter(4, 0);
//   twoGauss->SetLineColor(4);
//   projx1->Fit("twoGauss", "I+", "SAME");
  
  canvas->cd(canvasPos++);
  projx1->Draw();
  projx1->Fit("gaus", "I");
  projx1->GetFunction("gaus")->SetLineColor(1);
  projx1->GetYaxis()->SetRangeUser(0, projx1->GetMaximum() * 1.05);

  projx2->SetLineColor(2);
  projx2->Draw("SAME");
  projx2->Fit("gaus", "I+0", "SAME");
  projx2->GetFunction("gaus")->SetLineColor(2);

  canvas->cd(canvasPos--);
  projy1->Draw();
  projy1->Fit("gaus", "I");
  projy1->GetFunction("gaus")->SetLineColor(1);
  projy1->GetYaxis()->SetRangeUser(0, projy1->GetMaximum() * 1.05);
  
  projy2->SetLineColor(2);
  projy2->Draw("SAME");
  projy2->Fit("gaus", "I+0", "SAME");
  projy2->GetFunction("gaus")->SetLineColor(2);
  
  // 1d fit (eta gap subtraction)
  AddPoint(phiWidthSummary, phiWidthSummary->GetN(), projx2->GetFunction("gaus")->GetParameter(2), 0, projx2->GetFunction("gaus")->GetParError(2));
  
  // 1d fit (lots of params)
  AddPoint(phiWidthSummary, phiWidthSummary->GetN(), projx1->GetFunction("gaus")->GetParameter(2), 0, projx1->GetFunction("gaus")->GetParError(2));

  // 1d fit (eta gap subtraction)
  AddPoint(etaWidthSummary, etaWidthSummary->GetN(), projy2->GetFunction("gaus")->GetParameter(2), 0, projy2->GetFunction("gaus")->GetParError(2));
  
  // 1d fit (lots of params)
  AddPoint(etaWidthSummary, etaWidthSummary->GetN(), projy1->GetFunction("gaus")->GetParameter(2), 0, projy1->GetFunction("gaus")->GetParError(2));

  Float_t etaFitLimit = outerLimit;

  Bool_t oneGaussian = kTRUE;

  if (!oneGaussian) cout << endl << "Fitting two 1D Gaussians" << endl;
  else cout << endl << "Fitting one 1D Gaussians" << endl;

  TF1* func4phi = new TF1("func4phi", "[0]+[1]*([4]/TMath::Sqrt(TMath::TwoPi())/[2]*exp(-0.5*((x/[2])**2))+(1-[4])/TMath::Sqrt(TMath::TwoPi())/[3]*exp(-0.5*((x/[3])**2)))", -0.5 * TMath::Pi()+0.01, 0.5 * TMath::Pi()-0.01);
  TF1* func4eta = new TF1("func4eta", "[0]+[1]*([4]/TMath::Sqrt(TMath::TwoPi())/[2]*exp(-0.5*((x/[2])**2))+(1-[4])/TMath::Sqrt(TMath::TwoPi())/[3]*exp(-0.5*((x/[3])**2)))", -etaFitLimit+0.01, etaFitLimit-0.01);

  func4phi->SetParLimits(1, 0, 10);
  func4phi->SetParLimits(3, sigmaFitLimit, 0.7);
  func4phi->FixParameter(0, 0);
  if (!oneGaussian)
  {
    func4phi->SetParLimits(4, 0, 1);
    func4phi->SetParLimits(2, sigmaFitLimit, 0.7);
  }
  else
  {
    func4phi->FixParameter(4, 0);
    func4phi->FixParameter(2, 0);
  }

  func4eta->SetParLimits(1, 0, 10);
  func4eta->SetParLimits(3, sigmaFitLimit, etaFitUpperLimit);
  func4eta->FixParameter(0, 0);
  if (!oneGaussian)
  {
    func4eta->SetParLimits(4, 0, 1);
    func4eta->SetParLimits(2, sigmaFitLimit, etaFitUpperLimit);
  }
  else
  {
    func4eta->FixParameter(4, 0);
    func4eta->FixParameter(2, 0);
  }
  canvas->cd(canvasPos++);
  func4phi->SetLineColor(4);
  fitResultPtr = projx3->Fit(func4phi, "SIR", "SAME");
  TMatrixDSym cov2 = fitResultPtr->GetCovarianceMatrix();

  projx3->Draw("SAME");
  projx3->SetLineColor(4);

  if (func4phi->GetNDF() > 0)
  {
    printf("#chi^{2}/ndf = %.1f/%d = %.1f  ", func4phi->GetChisquare(), func4phi->GetNDF(), func4phi->GetChisquare() / func4phi->GetNDF());
    AddPoint(graphs[43][graphID], x, func4phi->GetChisquare() / func4phi->GetNDF(), xE, 0);
  }
  chi2 = 0;
  ndf = 0;

  for (Int_t i=projx3->FindBin(-momentFitLimit); i<=projx3->FindBin(momentFitLimit);i++)
  {
//    Float_t temp = chi2;
    if (projx3->GetBinError(i) > 0)
    {
      chi2 += TMath::Power((projx3->GetBinContent(i)-func4phi->Eval(projx3->GetBinCenter(i)))/projx3->GetBinError(i),2);
      //    cerr << i << "\t" << projx3->GetBinCenter(i) << "\t" << chi2-temp << endl;
      ndf++;
    }
  }
  if (!oneGaussian) ndf = ndf - 4;
  else ndf = ndf - 2;
  printf("Calculated #chi^{2}/ndf = %.1f/%d = %.1f  ", chi2, ndf, chi2/ndf);

  first = 2;
  second = 3;
  if (func4phi->GetParameter(2) < func4phi->GetParameter(3))
  {
    first = 3;
    second = 2;
  }
  
  if (!oneGaussian)
  {
    Float_t vector[3];
    for (Int_t i=2; i<5;i++)
      vector[i-2] = cov2[i][2]*func4phi->GetParameter(4) + cov2[i][3]*(1-func4phi->GetParameter(4))+cov2[i][4]*(TMath::Abs(func4phi->GetParameter(2))-TMath::Abs(func4phi->GetParameter(3)));

    Float_t sigma = TMath::Sqrt(vector[0]*func4phi->GetParameter(4) + vector[1]*(1-func4phi->GetParameter(4))+ vector[2]*(TMath::Abs(func4phi->GetParameter(2))-TMath::Abs(func4phi->GetParameter(3))));
    Float_t rms = TMath::Abs(func4phi->GetParameter(2))*func4phi->GetParameter(4)+TMath::Abs(func4phi->GetParameter(3))*(1-func4phi->GetParameter(4));
    AddPoint(graphs[37][graphID], x, rms, xE, sigma);
  }
  else AddPoint(graphs[37][graphID], x, TMath::Abs(func4phi->GetParameter(first)), xE, func4phi->GetParError(first));
  AddPoint(graphs[38][graphID], x, 0, xE, 0);
  AddPoint(graphs[36][graphID], x, 1, xE, 0);

  AddPoint(graphs[35][graphID], x, func4phi->GetParameter(1), xE, func4phi->GetParError(1));

  AddPoint(phiWidthSummary, phiWidthSummary->GetN(), TMath::Abs(func4phi->GetParameter(first)), 0, func4phi->GetParError(first));
  AddPoint(phiWidthSummary, phiWidthSummary->GetN(), TMath::Abs(func4phi->GetParameter(second)), 0, func4phi->GetParError(second));

  Float_t scale = func4phi->GetParameter(1);
  Float_t weighting = func4phi->GetParameter(4);
  func4phi->SetParameter(1, scale * weighting);
  func4phi->SetParameter(4, 1);
  func4phi->SetLineStyle(2);
  func4phi->DrawCopy("SAME");

  func4phi->SetParameter(1, scale * (1.0-weighting));
  func4phi->SetParameter(4, 0);
  func4phi->SetLineStyle(3);
  func4phi->DrawCopy("SAME");

  fitResultPtr->Print("V");
  if (fitResultPtr != 0)
    success = kFALSE;

  canvas->cd(canvasPos++);
  func4eta->SetLineColor(4);
  fitResultPtr = projy3->Fit(func4eta, "SIR", "SAME");
  cov2 = fitResultPtr->GetCovarianceMatrix();

  projy3->Draw("SAME");
  projy3->SetLineColor(4);

  chi2 = 0;
  ndf = 0;
  if (func4eta->GetNDF() > 0)
  {
    printf("#chi^{2}/ndf = %.1f/%d = %.1f  ", func4eta->GetChisquare(), func4eta->GetNDF(), func4eta->GetChisquare() / func4eta->GetNDF());
    AddPoint(graphs[44][graphID], x, func4eta->GetChisquare() / func4eta->GetNDF(), xE, 0);
  }
  for (Int_t i=projy3->FindBin(-momentFitLimit); i<=projy3->FindBin(momentFitLimit);i++)
  {
//    Float_t temp = chi2;
    if (projy3->GetBinError(i) <= 0)
      continue;
    
    chi2 += TMath::Power((projy3->GetBinContent(i)-func4eta->Eval(projy3->GetBinCenter(i)))/projy3->GetBinError(i),2);
//    cerr << i << "\t" << projy3->GetBinCenter(i) << "\t" << chi2-temp << endl;
    ndf++;
  }
  if (!oneGaussian) ndf = ndf - 4;
  else ndf = ndf - 2;
  printf("Calculated #chi^{2}/ndf = %.1f/%d = %.1f  ", chi2, ndf, chi2/ndf);

  first = 2;
  second = 3;
  if (func4eta->GetParameter(2) < func4eta->GetParameter(3))
  {
    first = 3;
    second = 2;
  }

  AddPoint(graphs[39][graphID], x, func4eta->GetParameter(1), xE, func4eta->GetParError(1));
  if (!oneGaussian)
  {
    Float_t vector[3];
    for (Int_t i=2; i<5;i++)
      vector[i-2] = cov2[i][2]*func4eta->GetParameter(4) + cov2[i][3]*(1-func4eta->GetParameter(4))+cov2[i][4]*(TMath::Abs(func4eta->GetParameter(2))-TMath::Abs(func4eta->GetParameter(3)));

    Float_t sigma = TMath::Sqrt(vector[0]*func4eta->GetParameter(4) + vector[1]*(1-func4eta->GetParameter(4))+ vector[2]*(TMath::Abs(func4eta->GetParameter(2))-TMath::Abs(func4eta->GetParameter(3))));
    Float_t rms = TMath::Abs(func4eta->GetParameter(2))*func4eta->GetParameter(4)+TMath::Abs(func4eta->GetParameter(3))*(1-func4eta->GetParameter(4));
    AddPoint(graphs[41][graphID], x, rms, xE, sigma);
  }
  else AddPoint(graphs[41][graphID], x, TMath::Abs(func4eta->GetParameter(first)), xE, func4eta->GetParError(first));
  AddPoint(graphs[42][graphID], x, 0, xE, 0);
  AddPoint(graphs[40][graphID], x, 1, xE, 0);

  AddPoint(etaWidthSummary, etaWidthSummary->GetN(), TMath::Abs(func4eta->GetParameter(first)), 0, func4eta->GetParError(first));
  AddPoint(etaWidthSummary, etaWidthSummary->GetN(), TMath::Abs(func4eta->GetParameter(second)), 0, func4eta->GetParError(second));

  scale = func4eta->GetParameter(1);
  weighting = func4eta->GetParameter(4);
  func4eta->SetParameter(1, scale * weighting);
  func4eta->SetParameter(4, 1);
  func4eta->SetLineStyle(2);
  func4eta->DrawCopy("SAME");

  func4eta->SetParameter(1, scale * (1.0-weighting));
  func4eta->SetParameter(4, 0);
  func4eta->SetLineStyle(3);
  func4eta->DrawCopy("SAME");
  
  fitResultPtr->Print("V");
  if (fitResultPtr != 0)
    success = kFALSE;

//  return 0;

  // 2d fit with two gaussians
  canvas->cd(canvasPos++);
//   TF2* func3 = new TF2("func3", "[0]+[1]*exp(-0.5*((x/[2])**2+(y/[3])**2))+[4]*exp(-0.5*((x/[5])**2+(y/[6])**2))", -0.5 * TMath::Pi(), 0.5 * TMath::Pi(), -outerLimit, outerLimit);
//   func3->SetParameters(0, 1, 0.3, 0.3, 1, 0.6, 0.6);
//   func3->SetParLimits(4, 0, 10);
//   Float_t etaFitLimit = 0.5;
  TF2* func3 = new TF2("func3", "[0]+[1]*([4]/TMath::TwoPi()/[2]/[3]*exp(-0.5*((x/[2])**2+(y/[3])**2))+(1-[4])/TMath::TwoPi()/[5]/[6]*exp(-0.5*((x/[5])**2+(y/[6])**2)))", -0.5 * TMath::Pi(), 0.5 * TMath::Pi(), -etaFitLimit, etaFitLimit);

  func3->SetParameters(0, hist->GetBinContent(hist->GetXaxis()->FindBin(0.0), hist->GetYaxis()->FindBin(0.0)), 0.3, 0.3, 0.25, initSigma, initSigma);

  func3->FixParameter(0, 0);

  func3->SetParLimits(4, 0.05, 0.95);
  func3->SetParLimits(1, 0, 10);
  func3->SetParLimits(2, sigmaFitLimit, 0.6);
  func3->SetParLimits(3, sigmaFitLimit, etaFitUpperLimit);
  func3->SetParLimits(5, sigmaFitLimit, 0.601);
  func3->SetParLimits(6, sigmaFitLimit, etaFitUpperLimit);

/*
  sigmaFitLimit = 0.09;
  etaFitUpperLimit = 0.12;
  func3->SetParLimits(4, 0.1, 0.9);
  func3->SetParLimits(1, 0, 10);
  func3->SetParLimits(2, sigmaFitLimit, 0.12);
  func3->SetParLimits(3, sigmaFitLimit, etaFitUpperLimit);
  func3->SetParLimits(5, sigmaFitLimit, 0.12);
  func3->SetParLimits(6, sigmaFitLimit, etaFitUpperLimit);
  func3->FixParameter(0, 0);
*/
//   for (Int_t i=0; i<6; i++)
//     func3->SetParameter(i+1, func->GetParameter(i));

  fitResultPtr = hist->Fit(func3, "0RS", "");
  Printf("Fit result: %d", (Int_t) fitResultPtr);
//   return 0;
  if (fitResultPtr != 0)
    success = kFALSE;
  TMatrixDSym cov3 = fitResultPtr->GetCovarianceMatrix();
  cov3.Print();
  
  Printf("Testing 1 Gaussian...");

  TF2* func3_clone = (TF2*) func3->Clone("func3_clone");
  
  func3_clone->SetParLimits(4, 1, 1);
  func3_clone->FixParameter(4, 1);
  func3_clone->FixParameter(5, sigmaFitLimit);
  func3_clone->FixParameter(6, sigmaFitLimit);
  
  fitResultPtr2 = hist->Fit(func3_clone, "0RS", "");
  Printf("Fit result: %d", (Int_t) fitResultPtr2);
  
  // if both parameters were within 1%, use 1 Gaussian parameters
  if (TMath::Abs(1.0 - func3->GetParameter(2) / func3->GetParameter(5)) < 0.01 && TMath::Abs(1.0 - func3->GetParameter(3) / func3->GetParameter(6)) < 0.01)
  {
    Printf("Parameters within 1%%. Using results from 1 Gaussian...");
    
    if (fitResultPtr2 != 0)
      success = kFALSE;
    func3 = func3_clone;
    cov3 = fitResultPtr2->GetCovarianceMatrix();
//     cov3.Print();
  }
  else if (func3_clone->GetChisquare() * 0.99 < func3->GetChisquare())
  {
    Printf("1 Gaussian fit has a at maximum 1%% (%f/%d %f/%d) larger chi2. Using results from 1 Gaussian...", func3_clone->GetChisquare(), func3_clone->GetNDF(), func3->GetChisquare(), func3_clone->GetNDF());
    
    if (fitResultPtr2 != 0)
      success = kFALSE;
    func3 = func3_clone;
    cov3 = fitResultPtr2->GetCovarianceMatrix();
  }
  
//   hist->Fit(func3, "I0R", "");

  first = 2;
  second = 5;
  if (func3->GetParameter(2) < func3->GetParameter(5))
  {
    first = 5;
    second = 2;
  }
  //dphi
  AddPoint(graphs[1][graphID], x, TMath::Abs(func3->GetParameter(first)), xE, func3->GetParError(first));
  AddPoint(graphs[4][graphID], x, TMath::Abs(func3->GetParameter(second)), xE, func3->GetParError(second));

  AddPoint(phiWidthSummary, phiWidthSummary->GetN(), TMath::Abs(func3->GetParameter(first)), 0, func3->GetParError(first));
  AddPoint(phiWidthSummary, phiWidthSummary->GetN(), TMath::Abs(func3->GetParameter(second)), 0, func3->GetParError(second));
    
  //deta
  AddPoint(graphs[2][graphID], x, TMath::Abs(func3->GetParameter(first+1)), xE, func3->GetParError(first+1));
  AddPoint(graphs[5][graphID], x, TMath::Abs(func3->GetParameter(second+1)), xE, func3->GetParError(second+1));
  
  AddPoint(etaWidthSummary, etaWidthSummary->GetN(), TMath::Abs(func3->GetParameter(first+1)), 0, func3->GetParError(first+1));
  AddPoint(etaWidthSummary, etaWidthSummary->GetN(), TMath::Abs(func3->GetParameter(second+1)), 0, func3->GetParError(second+1));
  
  // norm
  AddPoint(graphs[0][graphID], x, func3->GetParameter(1), xE, func3->GetParError(1));
  if (first < second)
    AddPoint(graphs[3][graphID], x, func3->GetParameter(4), xE, func3->GetParError(4));
  else
    AddPoint(graphs[3][graphID], x, 1.0 - func3->GetParameter(4), xE, func3->GetParError(4));

  AddRMS(graphs[10][graphID], x, xE, func3, cov3, 2, 5, 4);
  AddRMS(graphs[11][graphID], x, xE, func3, cov3, 2+1, 5+1, 4);
  
  TH2* funcHist3 = (TH2*) hist->Clone("funcHist3");
  funcHist3->Reset();
  funcHist3->Add(func3);
  funcHist3->SetMinimum(-(max - min) / 2);
  funcHist3->SetMaximum((max - min) / 2);
  funcHist3->Draw("SURF1");
  sumSummary->SetPoint(sumSummary->GetN(), sumSummary->GetN(), funcHist3->Integral());
  
  canvas->cd(canvasPos++);
  TH2* residuals3 = (TH2*) hist->Clone("residuals");
  residuals3->Add(funcHist3, -1);
  residuals3->SetMinimum(-(max - min) / 2);
  residuals3->SetMaximum((max - min) / 2);
  residuals3->Draw("SURF1");

  chi2 = 0;
  ndf = 0;
  for (Int_t i=hist->GetXaxis()->FindBin(-0.8); i<=hist->GetXaxis()->FindBin(0.8); i++)
    for (Int_t j=hist->GetYaxis()->FindBin(-etaLimit); j<=hist->GetYaxis()->FindBin(etaLimit); j++)
    {
      if (residuals3->GetBinError(i, j) > 0)
      {
	chi2 += TMath::Power(residuals3->GetBinContent(i, j) / residuals3->GetBinError(i, j), 2);
	ndf++;
      }
    }
  ndf -= func3->GetNumberFreeParameters();
  
  if (func3->GetNDF() > 0)
  {
    printf("#chi^{2}/ndf = %.1f/%d = %.1f  ", func3->GetChisquare(), func3->GetNDF(), func3->GetChisquare() / func3->GetNDF());
    DrawLatex(0.2, yPosChi2, 1, Form("#chi^{2}/ndf = %.1f/%d = %.1f", func3->GetChisquare(), func3->GetNDF(), func3->GetChisquare() / func3->GetNDF()));
    AddPoint(graphs[6][graphID], x, func3->GetChisquare() / func3->GetNDF(), xE, 0);
  }
  if (ndf)
  {
    Printf("#chi^{2}/ndf = %.1f/%d = %.1f", chi2, ndf, chi2 / ndf);
    DrawLatex(0.2, yPosChi2 - 0.05, 1, Form("#chi^{2}/ndf = %.1f/%d = %.1f", chi2, ndf, chi2 / ndf));
    AddPoint(graphs[7][graphID], x, chi2 / ndf, xE, 0);
  }

  canvas->cd(canvasPos++);
  phiWidthSummary->SetMarkerStyle(20);
  phiWidthSummary->Draw("AP");
  gPad->SetGridy();
    
  etaWidthSummary->SetMarkerStyle(21);
  etaWidthSummary->SetLineColor(2);
  etaWidthSummary->SetMarkerColor(2);
  etaWidthSummary->Draw("PSAME");  
  
  phiWidthSummary->GetYaxis()->SetRangeUser(0, 0.9);
  
  canvas->cd(canvasPos++);
  sumSummary->Draw("*A");
  gPad->SetGridy();
  
  Printf("Finished with %d", success);

  return success;
}

void AnalyzeDeltaPhiEtaGap2D(const char* fileName, const char* outputFileName = "graphs.root")
{
  gROOT->SetBatch(kTRUE);
  if (!gROOT->IsBatch())
  {
    Printf("Not in batch mode. Exiting!");
    return;
  }
  
  CreateGraphStructure();

  TFile::Open(fileName);
  TList checkList;
  
  Int_t maxLeadingPt = 4;
  Int_t maxAssocPt = 6;


  for (Int_t i=0; i<maxLeadingPt; i++)
  {
    for (Int_t j=1; j<maxAssocPt; j++)
    {
      // only process when first is filled
      TH2* hist1 = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", i, j+1, 0));
      if (!hist1)
      {
        cout << "Hist1 does not exist." << endl;
	continue;
      }
//      if (hist1->GetEntries() < 1e4)
      if (hist1->GetEntries() < 10)
      {
	Printf("%d %d Only %f entries. Skipping...", i, j, hist1->GetEntries());
	continue;
      }
      
      for (Int_t histId = 0; histId < 8; histId++)
      {
// 	if (i != 1 || j != 2)
// 	  continue;

	// skip 4.0 < p_{T,trig} < 8.0 - 6.00 < p_{T,assoc} < 8.00 above 40% and pp
	if (i == 2 && j == 5 && (histId == 1 || histId == 2 || histId == 5))
	  continue;
	
	hist1 = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
	if (!hist1)
        {
          cout << "Hist1 does not exist." << endl;
          continue;
        }
	
//	if (hist1->GetEntries() < 1e4)
	if (hist1->GetEntries() < 10)
	{
	  Printf("%d %d %d Only %f entries. Skipping...", i, j, histId, hist1->GetEntries());
	  continue;
	}
	
	TCanvas* canvas = new TCanvas(Form("DeltaPhi_%d_%d_%d_%d", histId, i, j, 1), Form("DeltaPhi_%d_%d_%d_%d", histId, i, j, 1), 1400, 1100);
	canvas->Divide(5, 3);
	
	for (Int_t k=1; k<=3; k++)
	{
	  canvas->cd(3 * j + k);
	  gPad->SetLeftMargin(0.15);
	  gPad->SetBottomMargin(0.2);
	  gPad->SetTopMargin(0.01);
	  gPad->SetRightMargin(0.01);
	}
	
	Int_t graphID = i * (maxAssocPt - 1) + j - 1;

	Printf("\n\n>>> %d %d %d %d", i, j, histId, graphID);
	
	if (histId == 0)
	  for (Int_t k=0; k<NGraphs; k++)
	    graphs[k][graphID]->SetTitle(hist1->GetTitle());
	
	Float_t centralityAxisMapping[] = { 5, 70, 100, 30, 15, 50 };
	Float_t centralityAxisMappingE[] = { 5, 10, 0, 10, 5, 10 };

	Bool_t success = FitDeltaPhi2DOneFunction((TH2*) hist1, canvas, 1, graphID, centralityAxisMapping[histId], centralityAxisMappingE[histId], 0.9, kTRUE, histId, (i > 0) ? 1 : 0, (j <= 2 && histId != 2));
	if (!success)
	  checkList.Add(new TObjString(Form("AnalyzeDeltaPhiEtaGap2DExample(\"%s\", %d, %d, %d)", fileName, i, j, histId)));
	
// 	canvas->SaveAs(Form("%s.png", canvas->GetName()));
// 	delete canvas;
// 	break;
// return;
      }
      
//       break;
    }
    
//     break;
  }
  
  WriteGraphs(outputFileName);

  for (Int_t i=0; i<checkList.GetEntries(); i++)
    Printf("%s", checkList.At(i)->GetName());
}

void AnalyzeDeltaPhiEtaGap2DExample(const char* fileName, Int_t i, Int_t j, Int_t histId, Bool_t drawDetails = kFALSE)
{
  CreateGraphStructure();

  TFile::Open(fileName);
  
  TH2* hist1 = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
  if (!hist1)
    return;
  
  Printf("Entries: %f %s", hist1->GetEntries(), hist1->GetTitle());

  TString label(hist1->GetTitle());
  if (drawDetails)
    hist1->SetTitle("");
  hist1->GetYaxis()->SetRangeUser(-1.79, 1.79);
  hist1->GetXaxis()->SetTitleOffset(1.5);
  hist1->GetYaxis()->SetTitleOffset(2);
  hist1->GetZaxis()->SetTitle(kCorrFuncTitle);
  hist1->GetZaxis()->SetTitleOffset(1.8);
  hist1->SetStats(kFALSE);

//  if (hist1->GetEntries() < 1e4)
  if (hist1->GetEntries() < 10)
    return;
  
  // NOTE fix normalization. these 2d correlations come out of AliUEHist normalized by dphi bin width, but not deta
  if (drawDetails)
    hist1->Scale(1.0 / hist1->GetYaxis()->GetBinWidth(1));

  TCanvas* canvas = new TCanvas(Form("DeltaPhi_%d_%d_%d_%d", histId, i, j, 1), Form("DeltaPhi_%d_%d_%d_%d", histId, i, j, 1), 1400, 1100);
  canvas->Divide(5, 3);
  
  Int_t graphID = i * (6 - 1) + j - 1;
  FitDeltaPhi2DOneFunction((TH2*) hist1, canvas, 1, graphID, 0, 0, 0.9, kFALSE, histId, (i > 0) ? 1 : 0, (j <= 2 && histId != 2));
  
  if (!drawDetails)
    return;
  
  TVirtualPad* pad = canvas->cd(6);
  TCanvas* c = new TCanvas("c", "c", 1500, 1000);
  c->Divide(3, 2);
  c->cd(1);
  pad->SetPad(0, 0, 1, 1);
  pad->SetLeftMargin(0.15);
  pad->Draw();
  pad->cd();

  label.ReplaceAll(".00", " GeV/c");
  label.ReplaceAll(".0", " GeV/c");
  TObjArray* objArray = label.Tokenize("-");
  TPaveText* paveText = new TPaveText(0.52, 0.72, 0.95, 0.95, "BRNDC");
  paveText->SetTextSize(0.035);
  paveText->SetFillColor(0);
  paveText->SetShadowColor(0);
  paveText->AddText(objArray->At(0)->GetName());
  paveText->AddText(objArray->At(1)->GetName());
  if (objArray->GetEntries() == 4)
    paveText->AddText(Form("Pb-Pb 2.76 TeV %s-%s", objArray->At(2)->GetName(), objArray->At(3)->GetName()));
  else
    paveText->AddText(Form("%s 2.76 TeV", objArray->At(2)->GetName()));
  paveText->AddText("|#eta| < 0.9");
  paveText->Draw();
  
  c->cd(1);
//   DrawALICELogo(kTRUE, 0.2, 0.7, 0.4, 0.9);
  
//   return;
    
  //   c->SaveAs("fit_subtracted.eps");

  pad = canvas->cd(12);
  c->cd(2);
  pad->SetPad(0, 0, 1, 1);
  pad->SetLeftMargin(0.15);
  pad->Draw();
//   c->SaveAs("fit_fit1.eps");
  
  pad = canvas->cd(13);
  c->cd(3);
  gPad->SetLeftMargin(0.15);
  pad->SetPad(0, 0, 1, 1);
  pad->SetLeftMargin(0.15);
  pad->Draw();
  c->SaveAs("fit_residual1.eps");
  
  TCanvas* c2 = new TCanvas("c3b", "c3b", 800, 800);
  gPad->SetLeftMargin(0.15);
  gPad->SetGridy();
  hist1 = (TH2*) pad->GetListOfPrimitives()->First();
  for (i=0; i<10; i++)
  {
    TH1* proj = hist1->ProjectionX(Form("p_%d", i), 11+i*2, 12+i*2);
    proj->Scale(0.5);
    
    proj->Add(new TF1("func", "1", -10, 10), -0.5 + 0.1 * i);
    proj->SetStats(0);
    proj->GetXaxis()->SetTitleOffset(1.0);
    proj->GetYaxis()->SetTitleOffset(1.4);
    proj->GetYaxis()->SetNdivisions(512);
    proj->SetYTitle("Residuals (projected / shifted)");
    proj->GetYaxis()->SetRangeUser(-0.59, 0.49);
    proj->Draw((i == 0) ? "" : "SAME");    
  }
  c2->SaveAs("fit_residual1_proj.eps");

  pad = canvas->cd(4);
  c->cd(4);
  pad->SetPad(0, 0, 1, 1);
  pad->SetLeftMargin(0.15);
  pad->Draw();
//   c->SaveAs("fit_fit2.eps");

  pad = canvas->cd(3);
  c->cd(5);
  pad->SetPad(0, 0, 1, 1);
  pad->SetLeftMargin(0.15);
  pad->Draw();
//   c->SaveAs("fit_residual2.eps");

  c2 = new TCanvas("c5b", "c5b", 800, 800);
  gPad->SetLeftMargin(0.15);
  gPad->SetGridy();
  hist1 = (TH2*) pad->GetListOfPrimitives()->First();
  for (i=0; i<10; i++)
  {
    TH1* proj = hist1->ProjectionX(Form("p2_%d", i), 11+i*2, 12+i*2);
    proj->Scale(0.5);
    
    proj->Add(new TF1("func", "1", -10, 10), -0.5 + 0.1 * i);
    proj->SetStats(0);
    proj->GetXaxis()->SetTitleOffset(1.0);
    proj->GetYaxis()->SetTitleOffset(1.4);
    proj->GetYaxis()->SetNdivisions(512);
    proj->SetYTitle("Residuals (projected / shifted)");
    proj->GetYaxis()->SetRangeUser(-0.59, 0.49);
    proj->Draw((i == 0) ? "" : "SAME");    
  }
  c2->SaveAs("fit_residual2_proj.eps");

  pad = canvas->cd(7);
  c->cd(6);
  pad->SetPad(0, 0, 1, 1);
  pad->SetLeftMargin(0.15);
  pad->Draw();
  
  c->SaveAs("fit_example.eps");
  c->SaveAs("fit_example.png");
}

void SqrtAll(Int_t nHists, TGraphErrors** graph)
{
  for (Int_t histId = 0; histId < nHists; histId++)
  {
    for (Int_t i=0; i<graph[histId]->GetN(); i++)
    {
      if (graph[histId]->GetY()[i] > 0)
      {
	graph[histId]->GetEY()[i] *= 0.5 / TMath::Sqrt(graph[histId]->GetY()[i]);
	graph[histId]->GetY()[i] = TMath::Sqrt(graph[histId]->GetY()[i]);
      }
      else
      {
	Printf("WARNING negative value %d %d, removing from histogram", histId, i);
	graph[histId]->RemovePoint(i);
	i--;
      }
    }
  }
}

void SqrtAll2(Int_t nHists, TGraphErrors** graph, TGraphErrors** graph2)
{
  for (Int_t histId = 0; histId < nHists; histId++)
  {
    if (!graph[histId])
      continue;
 
    for (Int_t i=0; i<graph[histId]->GetN(); i++)
    {
      if (graph[histId]->GetY()[i] > 0 && graph2[histId]->GetY()[i] > 0)
      {
	graph[histId]->GetEY()[i] *= 0.5 / TMath::Sqrt(graph[histId]->GetY()[i]);
	graph[histId]->GetY()[i] = TMath::Sqrt(graph[histId]->GetY()[i]);

	graph2[histId]->GetEY()[i] *= 0.5 / TMath::Sqrt(graph2[histId]->GetY()[i]);
	graph2[histId]->GetY()[i] = TMath::Sqrt(graph2[histId]->GetY()[i]);
      }
      else
      {
	Printf("WARNING negative value %d %d, removing from histogram", histId, i);
	graph[histId]->RemovePoint(i);
	graph2[histId]->RemovePoint(i);
	i--;
      }
    }
  }
}

Int_t marker[6] = { 24, 25, 26, 30, 27, 28 };
Int_t marker2[6] = { 20, 21, 22, 29, 33, 34 };
const char* labels[6] = { "0-10%", "60-70%", "pp", "20-40%", "10-20%", "40-60%" };

void CalculateRMS(Int_t nHists, TGraphErrors** graph, TGraphErrors** graph2, TGraphErrors** weight)
{
  // rms
  for (Int_t histId = 0; histId < nHists; histId++)
  {
    if (!graph[histId])
      continue;
    
    if (graph[histId]->GetN() != graph2[histId]->GetN() || graph[histId]->GetN() != weight[histId]->GetN())
    {
      Printf("E-CalculateRMS: Different number of points for hist %d: %d %d %d", histId, graph[histId]->GetN(), graph2[histId]->GetN(), weight[histId]->GetN());
      continue;
    }
    
    for (Int_t i=0; i<graph[histId]->GetN(); i++)
    {
      Float_t rms = graph[histId]->GetY()[i] * weight[histId]->GetY()[i] + graph2[histId]->GetY()[i] * (1.0 - weight[histId]->GetY()[i]);
      graph[histId]->GetY()[i] = rms;
      // error**2 = weight**2 * error_sigma**2 + (weight-1)**2 * error_sigma2**2 + (sigma1 + sigma2)**2 * error_weight**2
      // TODO this neglects some correlations
      graph[histId]->GetEY()[i] = TMath::Sqrt(
	TMath::Power(weight[histId]->GetY()[i] * graph[histId]->GetEY()[i], 2) + 
	TMath::Power((weight[histId]->GetY()[i] - 1) * graph2[histId]->GetEY()[i], 2) + 
	TMath::Power((graph[histId]->GetY()[i] - graph2[histId]->GetY()[i]) * weight[histId]->GetEY()[i], 2)
      );
    }
  }
}

Bool_t SkipGraph(Int_t i)
{
  return (i == 14);
//  return (i == 1 || i == 7 || i == 9 || i == 13 || i == 14);
//   return (i == 7 || i == 9 || i == 13 || i == 14); //For the STAR comparison
}

Int_t skipGraphList[] =  { -1, -1, -1 };
Bool_t SkipGraphForThisPlot(Int_t graphId)
{
  for (Int_t i=0; i<3; i++)
    if (skipGraphList[i] == graphId)
      return kTRUE;
  return kFALSE;
}

TGraphAsymmErrors* FixGraph(TGraphErrors* graph, Float_t shift)
{
  graph->Sort();
//   graph->Print();
  
  if (graph->GetN() > 4 && graph->GetX()[4] == 75)
  {
    graph->GetX()[4] = 65;
    graph->GetEX()[4] = 5;
  }
  
  TGraphAsymmErrors* res = new TGraphAsymmErrors;
  res->SetTitle(graph->GetTitle());
  res->GetXaxis()->SetTitle(graph->GetXaxis()->GetTitle());
  res->GetYaxis()->SetTitle(graph->GetYaxis()->GetTitle());

  for (Int_t i=0; i<graph->GetN(); i++)
  {
    res->SetPoint(res->GetN(), graph->GetX()[i] + shift, graph->GetY()[i]);
    res->SetPointError(res->GetN()-1, graph->GetEX()[i], graph->GetEX()[i], graph->GetEY()[i], graph->GetEY()[i]);
    
    // asymmetric if space
    if (graph->GetEX()[i] > TMath::Abs(shift))
    {
      res->GetEXlow()[i] += shift;
      res->GetEXhigh()[i] -= shift;
    }
  }
  
  return res;
}

void GraphRemovePoint(TGraphAsymmErrors* graph1, TGraphAsymmErrors* graph2)
{
  if (graph1->GetN() != graph2->GetN())
  {
    graph1->Sort();
    graph2->Sort();
    Int_t Nbin = 0;
    if (graph1->GetN() < graph2->GetN()) Nbin = graph1->GetN();
    else Nbin = graph2->GetN();
    for (Int_t bin1 = 0; bin1 < Nbin; bin1++)
    {
      Float_t x1 = graph1->GetX()[bin1]; 
      Float_t x2 = graph2->GetX()[bin1];
      if (x1 != x2)
      {
        if (x1<x2) {graph1->RemovePoint(bin1--);cout << x1 << "\t" << x2 << "\t" << bin1 << "\t" << graph1->GetN() << "\t" << graph2->GetN()<< endl;}
        else {graph2->RemovePoint(bin1--);cout << x1 << "\t" << x2 << "\t" << bin1 << "\t" << graph1->GetN() << "\t" << graph2->GetN()<< endl;}
      }
    }
  }
}

void PrepareGraphs(Int_t nHists, TGraphErrors** graph, TGraphErrors** systematicA, TGraphErrors** systematicB, TMultiGraph** multiGraph, TMultiGraph** multiGraphSyst, Int_t uncertaintyID, Float_t offset = 0)
{
  Int_t colors[16] =  { 1, 3, 2, 6, 4, 7, 8, 9, 11, 12, 28, 30, 36, 40, 46 };
  Int_t markers[16] = { 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 2, 5};
//  Int_t fillStyle[11] = { 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003 };
  Int_t fillStyle[11] = { 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011 };
  Int_t count = 0;
  
  if (*multiGraph == 0)
    *multiGraph = new TMultiGraph;
  if (*multiGraphSyst == 0)
    *multiGraphSyst = new TMultiGraph;
  
  Float_t shift = -2 + offset;
  for (Int_t i=0; i<nHists; i++)
  {
    if (SkipGraph(i))
      continue;
    
    if (SkipGraphForThisPlot(i))
    {
      count++;
      continue;
    }
    
    TGraphAsymmErrors* graphcentrality = FixGraph((TGraphErrors*) graph[i]->Clone(), shift);
    if (graphcentrality->GetN() <= 0)
      continue;
    
    if (systematicA)
    {
      TGraphAsymmErrors* graphsystematicsA = FixGraph((TGraphErrors*) systematicA[i]->Clone(), shift);
      
      if (graphcentrality->GetN() != graphsystematicsA->GetN())
      {
	Printf("Different number of points %d %d: %s", graphcentrality->GetN(), graphsystematicsA->GetN(), graphcentrality->GetTitle());
        if (graphcentrality->GetN() == 0 || graphsystematicsA->GetN() == 0) continue;
        GraphRemovePoint(graphcentrality,graphsystematicsA);
      }
      
      TGraphErrors* graphsystematicsB = 0;
      if (systematicB)
      {
	graphsystematicsB = (TGraphErrors*) systematicB[i]->Clone();
	graphsystematicsB->Sort();
      
	if (graphcentrality->GetN() != graphsystematicsB->GetN())
	{
	  Printf("Different number of points %d %d", graphcentrality->GetN(), graphsystematicsB->GetN());
          continue;
	}
      }
      
      for (Int_t j=0; j<graphsystematicsA->GetN(); j++)
      {
	// uncertaintyID
	Double_t yMin = graphcentrality->GetY()[j];
	Double_t yMax = graphcentrality->GetY()[j];
	
	if (uncertaintyID == 1)
	{
	  // 5%
	  yMin *= 0.95;
	  yMax *= 1.05;
	}
	else if (uncertaintyID == 2)
	{
	  yMin -= 0.20;
	  yMax += 0.20;
	}
	
	if (graphsystematicsA->GetY()[j] < graphcentrality->GetY()[j])
	  yMin = graphcentrality->GetY()[j] - TMath::Sqrt(TMath::Power(yMin - graphcentrality->GetY()[j], 2) + TMath::Power(graphsystematicsA->GetY()[j] - graphcentrality->GetY()[j], 2));
	if (graphsystematicsA->GetY()[j] > graphcentrality->GetY()[j])
	  yMax = graphcentrality->GetY()[j] + TMath::Sqrt(TMath::Power(yMax - graphcentrality->GetY()[j], 2) + TMath::Power(graphsystematicsA->GetY()[j] - graphcentrality->GetY()[j], 2));
	
	if (graphsystematicsB)
	{
	  if (graphsystematicsB->GetY()[j] < graphcentrality->GetY()[j])
	    yMin = graphcentrality->GetY()[j] - TMath::Sqrt(TMath::Power(yMin - graphcentrality->GetY()[j], 2) + TMath::Power(graphsystematicsB->GetY()[j] - graphcentrality->GetY()[j], 2));
	  if (graphsystematicsB->GetY()[j] > graphcentrality->GetY()[j])
	    yMax = graphcentrality->GetY()[j] + TMath::Sqrt(TMath::Power(yMax - graphcentrality->GetY()[j], 2) + TMath::Power(graphsystematicsB->GetY()[j] - graphcentrality->GetY()[j], 2));
	}

	graphsystematicsA->GetEYlow()[j] = graphcentrality->GetY()[j] - yMin;
	graphsystematicsA->GetEYhigh()[j] = yMax - graphcentrality->GetY()[j];
	graphsystematicsA->GetY()[j]  = graphcentrality->GetY()[j];
	
	graphsystematicsA->GetEXlow()[j] = 1;
	graphsystematicsA->GetEXhigh()[j] = graphsystematicsA->GetEXlow()[j];
      }
      
//       graphsystematicsA->SetFillColor(kGray);
      graphsystematicsA->SetFillColor(colors[count]);
//       graphsystematicsA->SetFillStyle(1001);
      graphsystematicsA->SetFillStyle(fillStyle[count]);
      graphsystematicsA->SetMarkerStyle(0);
      graphsystematicsA->SetLineColor(0);
      (*multiGraphSyst)->Add(graphsystematicsA, "2");
    }
    
    TString label = graphcentrality->GetTitle();
    if (label.Length() > 0)
    {
      TObjArray* tokens = label.Tokenize("-");
      label.Form("%s-%s", tokens->At(0)->GetName(),tokens->At(1)->GetName());
      label.ReplaceAll(".00", "");
      label.ReplaceAll(".0", "");
      label.ReplaceAll("p_{T,trig}", "p_{T,t}");
      label.ReplaceAll("p_{T,assoc}", "p_{T,a}");
    }
    label += " GeV/c";
    graphcentrality->SetTitle(label);
    Printf("%d %s %d", i, label.Data(), colors[count]);
    
    graphcentrality->SetMarkerStyle(markers[count]);
    graphcentrality->SetMarkerColor(colors[count]);
    graphcentrality->SetLineColor(colors[count]);
    
    (*multiGraph)->Add(graphcentrality);
    shift += 1;
   
    count++;
  }
}


Bool_t drawLogo = kFALSE;
const char* MCLabel = 0;

void DrawCentrality(const char* canvasName, Int_t nHists, TGraphErrors** graph, Float_t min = 0, Float_t max = 0, const char* yLabel = "", TGraphErrors** systematicA = 0, TGraphErrors** systematicB = 0, TGraphErrors** graph2 = 0, TGraphErrors** systematic2 = 0, TGraphErrors** graph3 = 0, Int_t uncertaintyID = -1)
{
//   Bool_t found = kTRUE;
  TCanvas* c1 = 0;//(TCanvas*) gROOT->GetListOfCanvases()->FindObject(canvasName);
  if (!c1)
  {
    c1 = new TCanvas(canvasName, canvasName, 800, 600);
//     found = kFALSE;
  }
  c1->cd();
  
  TMultiGraph* multiGraph = 0;
  TMultiGraph* multiGraph2 = 0;
  TMultiGraph* multiGraphSyst = 0;
  
  PrepareGraphs(nHists, graph, systematicA, systematicB, &multiGraph, &multiGraphSyst, uncertaintyID);
  if (!multiGraph->GetListOfGraphs())
    return;

  if (graph2)
  {
    PrepareGraphs(nHists, graph2, systematic2, 0, &multiGraph2, &multiGraphSyst, uncertaintyID, 0.5);
    for (Int_t i=0; i<multiGraph2->GetListOfGraphs()->GetEntries(); i++)
      ((TGraph*)multiGraph2->GetListOfGraphs()->At(i))->SetLineWidth(2);
    
    while (multiGraph2->GetListOfGraphs()->GetEntries() > multiGraph->GetListOfGraphs()->GetEntries())
      multiGraph2->GetListOfGraphs()->RemoveAt(multiGraph->GetListOfGraphs()->GetEntries());
    
    TMultiGraph* multiGraph3 = 0;
    if (graph3)
    {
      PrepareGraphs(nHists, graph3, 0, 0, &multiGraph3, &multiGraphSyst, uncertaintyID);
      if (multiGraph3->GetListOfGraphs())
      {
	for (Int_t i=0; i<multiGraph3->GetListOfGraphs()->GetEntries(); i++)
	{
	  ((TGraph*)multiGraph3->GetListOfGraphs()->At(i))->SetLineWidth(2);
	  ((TGraph*)multiGraph3->GetListOfGraphs()->At(i))->SetLineStyle(2);
	}
	
	while (multiGraph3->GetListOfGraphs()->GetEntries() > multiGraph->GetListOfGraphs()->GetEntries())
	  multiGraph3->GetListOfGraphs()->RemoveAt(multiGraph->GetListOfGraphs()->GetEntries());
      }
    }
      
//     multiGraphSyst->Add(multiGraph2, "LX");
    
//     multiGraph->Add(multiGraph2);
    
    if (graph3)
      multiGraph2->Add(multiGraph3, "LX");
  }

//   multiGraphSyst->Add(multiGraph, (found) ? "LX" : "P");
  
  // draw by hand, multigraph draw spoils the pngs for some reason, same thing happens with this long code, have changed to gif below...
  
  TGraphErrors* first = (TGraphErrors*) multiGraph->GetListOfGraphs()->First();
  TH2* dummy = new TH2F("dummy", ";Centrality", 100, -2, 115, 100, min, max);
  dummy->SetStats(0);
  dummy->GetYaxis()->SetTitle(yLabel);
  dummy->GetYaxis()->SetTitleOffset(1.2);
  dummy->DrawCopy();
  
  if (multiGraphSyst->GetListOfGraphs())
  {
    multiGraphSyst->GetListOfGraphs()->First()->Draw((!first) ? "A2" : "2SAME");
    if (!first)
      first = (TGraphErrors*) multiGraphSyst->GetListOfGraphs()->First();
    
    for (Int_t i=1; i<multiGraphSyst->GetListOfGraphs()->GetEntries(); i++)
      multiGraphSyst->GetListOfGraphs()->At(i)->Draw("2SAME");
  }
  
  if (multiGraph2 && multiGraph2->GetListOfGraphs())
  {
    for (Int_t i=0; i<multiGraph2->GetListOfGraphs()->GetEntries(); i++)
    {
      TGraphAsymmErrors* graphTmp = (TGraphAsymmErrors*) multiGraph2->GetListOfGraphs()->At(i);
      for (Int_t j=0; j<graphTmp->GetN(); j++)
      {
	graphTmp->GetEXlow()[j] = 0;
	graphTmp->GetEXhigh()[j] = 0;
      }
      graphTmp->SetMarkerSize(0);
    }

    multiGraph2->GetListOfGraphs()->First()->Draw((!first) ? "ALZ" : "LXSAME");
    if (!first)
      first = (TGraphErrors*) multiGraph2->GetListOfGraphs()->First();
    
    for (Int_t i=1; i<multiGraph2->GetListOfGraphs()->GetEntries(); i++)
      multiGraph2->GetListOfGraphs()->At(i)->Draw("LZSAME");
  }

  if (multiGraph && multiGraph->GetListOfGraphs())
  {
    multiGraph->GetListOfGraphs()->First()->Draw((!first) ? "AP" : "PSAME");
    if (!first)
      first = (TGraphErrors*) multiGraph->GetListOfGraphs()->First();
    
    for (Int_t i=1; i<multiGraph->GetListOfGraphs()->GetEntries(); i++)
      multiGraph->GetListOfGraphs()->At(i)->Draw("PSAME");
  }

//  TPaveText* paveText = new TPaveText(0.826, 0.059, 0.895, 0.094, "BRNDC");
  TPaveText* paveText = new TPaveText(0.77, 0.059, 0.84, 0.094, "BRNDC");
  paveText->SetTextSize(0.04);
  paveText->SetFillColor(0);
  paveText->SetShadowColor(0);
  paveText->SetLineColor(0);
  paveText->AddText("pp");
  paveText->Draw();
    
  TLegend* legend = new TLegend(0.55, 0.65, 0.95, 0.95);
  legend->SetFillColor(0);
  legend->SetTextSize(0.03);
  
  if (graph2)
  {
    legend->SetNColumns(2);
    legend->SetHeader(MCLabel);
  }
  
  for (Int_t i=0; i<multiGraph->GetListOfGraphs()->GetEntries(); i++)
  {
    if (graph2)
    {
      legend->AddEntry(multiGraph->GetListOfGraphs()->At(i), " ", "P");
      legend->AddEntry(multiGraph2->GetListOfGraphs()->At(i), 0, "L");
    }
    else
      legend->AddEntry(multiGraph->GetListOfGraphs()->At(i), 0, "P");
  }
  legend->Draw();
  
  gPad->SetGridx();
  gPad->SetGridy();
  
  DrawLatex(0.13, 0.85,  1, "Pb-Pb #sqrt{s_{NN}} = 2.76 TeV", 0.03);
  DrawLatex(0.13, 0.81,  1, "pp #sqrt{s} = 2.76 TeV", 0.03);
  DrawLatex(0.13, 0.77, 1, "|#eta| < 0.9", 0.03);
  TString text;
  TString text2;
  if (TString(canvasName).BeginsWith("sigma_phi") || TString(canvasName).BeginsWith("kurtosisphi"))
  {
    text = "Projected within |#Delta#eta| < 0.80";
    text2 = "Calculated within |#Delta#varphi| < 0.87";
  }
  if (TString(canvasName).BeginsWith("sigma_eta") || TString(canvasName).BeginsWith("kurtosiseta"))
  {
    text = "Projected within |#Delta#varphi| < 0.87";
    text2 = "Calculated within |#Delta#eta| < 0.80";
  }
  if (text.Length() > 0)
  {
    DrawLatex(0.13, 0.73, 1, text, 0.03);
    DrawLatex(0.13, 0.69, 1, text2, 0.03);
  }
  
  if (0 && MCLabel)
  {
    DrawLatex(0.13, 0.18, 1, "Points: Data", 0.03);
    DrawLatex(0.13, 0.14, 1, Form("Lines: %s", MCLabel), 0.03);
  }
  
  if (drawLogo)
    DrawALICELogo(kTRUE, 0.41, 0.75, 0.54, 0.95);
  
  gSystem->mkdir(fgFolder, kTRUE);
  c1->SaveAs(Form("%s/%s.png", fgFolder.Data(), canvasName));
//   c1->SaveAs(Form("%s/%s.eps", fgFolder.Data(), canvasName));
}

void CalculateRMSSigma(TGraphErrors*** graphsTmp = 0)
{
  if (!graphsTmp)
    graphsTmp = graphs;
  
  CalculateRMS(NHists, graphsTmp[1], graphsTmp[4], graphsTmp[3]);
  CalculateRMS(NHists, graphsTmp[2], graphsTmp[5], graphsTmp[3]);

  CalculateRMS(NHists, graphsTmp[1+16], graphsTmp[4+16], graphsTmp[3+16]);
  CalculateRMS(NHists, graphsTmp[2+16], graphsTmp[5+16], graphsTmp[3+16]);

  // sqrt(moment2) = sigma
  SqrtAll2(NHists, graphsTmp[8], graphsTmp[8+16]);
  SqrtAll2(NHists, graphsTmp[9], graphsTmp[9+16]);
}

// void CombineSyst(const char* systFile)
// {
//   TGraphErrors*** current = graphs;
//   
//   ReadGraphs(systFile);
//   CalculateRMSSigma();
//   TGraphErrors*** graphsSyst = graphs;
//   graphs = current;
//   
//   const Int_t NGraphList = 6;
//   Int_t graphList[] = { 1, 2, 8, 9, 14, 15 };
//   for (Int_t i=0; i<NGraphList; i++)
//   {
//     for (Int_t j=0; j<NHists; j++)
//     {
//       
//     graphs[i+16][j]
//     graphsSyst[i][j]
//     }
//   }
//   
// 
// }

void DrawResultsCentrality(const char* fileName = "graphs.root", const char* fileNameWingRemoved = 0, Int_t offset = 0)
{
  TGraphErrors*** graphsWingRemoved = 0;
  if (fileNameWingRemoved)
  {
    ReadGraphs(fileNameWingRemoved);
    graphsWingRemoved = graphs;
  }
  
  ReadGraphs(fileName);
  
  Int_t nHists = 24; //NHists;
  
  if (1)
  {
/*    DrawCentrality("norm", nHists, graphs[0+offset], 0, 0.2, "N (a.u.)", (graphsWingRemoved) ? graphsWingRemoved[0+offset] : 0);
    
//     return;
    
    DrawCentrality("width_phi1_centrality", nHists, graphs[1+offset], 0, 0.8, "#sigma_{#Delta#varphi, 1} (rad.)", (graphsWingRemoved) ? graphsWingRemoved[1+offset] : 0);
//     return;
    DrawCentrality("width_phi2_centrality", nHists, graphs[4+offset], 0, 0.8, "#sigma_{#Delta#varphi, 2} (rad.)", (graphsWingRemoved) ? graphsWingRemoved[4+offset] : 0);
    DrawCentrality("width_eta1_centrality", nHists, graphs[2+offset], 0, 0.8, "#sigma_{#Delta#eta, 1} (rad.)", (graphsWingRemoved) ? graphsWingRemoved[2+offset] : 0);
    DrawCentrality("width_eta2_centrality", nHists, graphs[5+offset], 0, 0.8, "#sigma_{#Delta#eta, 2} (rad.)", (graphsWingRemoved) ? graphsWingRemoved[5+offset] : 0);
*/    
/*    DrawCentrality("norm_phi(1D)", nHists, graphs[35], 0, 1, "N (a.u.)", (graphsWingRemoved) ? graphsWingRemoved[0+offset] : 0);
    DrawCentrality("norm_eta(1D)", nHists, graphs[39], 0, 1, "N (a.u.)", (graphsWingRemoved) ? graphsWingRemoved[0+offset] : 0);
*/    
//     DrawCentrality("width_phi1_centrality(1D)", nHists, graphs[37], 0, 0.8, "#sigma_{#Delta#varphi, 1} (rad.)", (graphsWingRemoved) ? graphsWingRemoved[1+offset] : 0);
//    DrawCentrality("width_phi2_centrality(1D)", nHists, graphs[38], 0, 0.8, "#sigma_{#Delta#varphi, 2} (rad.)", (graphsWingRemoved) ? graphsWingRemoved[4+offset] : 0);
//     DrawCentrality("width_eta1_centrality(1D)", nHists, graphs[41], 0, 0.8, "#sigma_{#Delta#eta, 1} (rad.)", (graphsWingRemoved) ? graphsWingRemoved[2+offset] : 0);
//    DrawCentrality("width_eta2_centrality(1D)", nHists, graphs[42], 0, 0.8, "#sigma_{#Delta#eta, 2} (rad.)", (graphsWingRemoved) ? graphsWingRemoved[5+offset] : 0);
//    DrawCentrality("norm2phi(1D)", nHists, graphs[36], 0, 1.5, "N (a.u.)", (graphsWingRemoved) ? graphsWingRemoved[0+offset] : 0);
//    DrawCentrality("norm2eta(1D)", nHists, graphs[40], 0, 1.5, "N (a.u.)", (graphsWingRemoved) ? graphsWingRemoved[0+offset] : 0);

    
    Bool_t uncertainties = kFALSE;

    CalculateRMSSigma();
    if (graphsWingRemoved)
      CalculateRMSSigma(graphsWingRemoved);
//     DrawCentrality("phi_rms_centrality_old", nHists, graphs[1+offset], 0, 0.8, Form("#sigma_{#Delta#varphi} (%s) (rad.)", fitLabel), (graphsWingRemoved) ? graphsWingRemoved[1+offset] : 0, 0, 0, 0, 0, (uncertainties) ? 1 : -1);
//     DrawCentrality("eta_rms_centrality_old", nHists, graphs[2+offset], 0, 0.8 + 0.4 / 16 * offset, Form("#sigma_{#Delta#eta} (%s)", fitLabel), (graphsWingRemoved) ? graphsWingRemoved[2+offset] : 0, 0, 0, 0, 0, (uncertainties) ? 1 : -1);

    DrawCentrality("phi_rms_centrality", nHists, graphs[10+offset], 0, 0.8, Form("#sigma_{#Delta#varphi} (%s) (rad.)", fitLabel), (graphsWingRemoved) ? graphsWingRemoved[10+offset] : 0, 0, 0, 0, 0, (uncertainties) ? 1 : -1);
    DrawCentrality("eta_rms_centrality", nHists, graphs[11+offset], 0, 0.8 + 0.4 / 16 * offset, Form("#sigma_{#Delta#eta} (%s)", fitLabel), (graphsWingRemoved) ? graphsWingRemoved[11+offset] : 0, 0, 0, 0, 0, (uncertainties) ? 1 : -1);

//     return;
//   DrawCentrality("phi_rms_centrality(1D)", nHists, graphs[37], 0, 0.8, Form("#sigma_{#Delta#varphi} (%s) (rad.)", fitLabel), (graphsWingRemoved) ? graphsWingRemoved[1+offset] : 0, 0, 0, 0, 0, 1);

//   DrawCentrality("eta_rms_centrality(1D)", nHists, graphs[41], 0, 0.8 + 0.4 / 16 * offset, Form("#sigma_{#Delta#eta} (%s)", fitLabel), (graphsWingRemoved) ? graphsWingRemoved[2+offset] : 0, 0, 0, 0, 0, 1);
//   DrawCentrality("chi2_phi(1D)", nHists, graphs[43], 0, 150, "#chi^{2}/ndf");
//   DrawCentrality("chi2_eta(1D)", nHists, graphs[44], 0, 150, "#chi^{2}/ndf");
    DrawCentrality("chi2_1", nHists, graphs[6+offset], 0.5, 5, "#chi^{2}/ndf (full region)", (graphsWingRemoved) ? graphsWingRemoved[6+offset] : 0);
    DrawCentrality("chi2_2", nHists, graphs[7+offset], 0.5, 5, "#chi^{2}/ndf (peak region)", (graphsWingRemoved) ? graphsWingRemoved[7+offset] : 0);
    
    DrawCentrality("sigma_phi", nHists, graphs[8+offset], 0, 1, "#sigma_{#Delta#varphi} (rad.)", (graphsWingRemoved) ? graphsWingRemoved[8+offset] : 0, 0, 0, 0, 0, (uncertainties) ? 1 : -1);
    DrawCentrality("sigma_eta", nHists, graphs[9+offset], 0, 1, "#sigma_{#Delta#eta}", (graphsWingRemoved) ? graphsWingRemoved[9+offset] : 0, 0, 0, 0, 0, (uncertainties) ? 1 : -1);

/*    
//     DrawCentrality("moment3_phi", nHists, graphs[10+offset], -0.5, 0.5, "moment3 #varphi (rad.)", (graphsWingRemoved) ? graphsWingRemoved[10+offset] : 0, 0, 0, 0, 0, 0);
//     DrawCentrality("moment3_eta", nHists, graphs[11+offset], -0.5, 0.5, "moment3 #eta", (graphsWingRemoved) ? graphsWingRemoved[11+offset] : 0, 0, 0, 0, 0, 0);
*/
/*    DrawCentrality("IAAFit", nHists, graphs[32+offset], 0, 20, "I_AA", (graphsWingRemoved) ? graphsWingRemoved[32+offset] : 0);
    DrawCentrality("Yield", nHists, graphs[33+offset], 0, 20, "Yield", (graphsWingRemoved) ? graphsWingRemoved[33+offset] : 0);
    DrawCentrality("IAAHist", nHists, graphs[34+offset], 0, 20, "I_AA", (graphsWingRemoved) ? graphsWingRemoved[34+offset] : 0);
    DrawCentrality("IAA", nHists, graphs[34+offset], 0, 20, "I_AA", graphs[32+offset]);
*/
  }
  
 DrawCentrality("kurtosisphi_centrality", 12, graphs[14+offset], -1.5, 2.5, "Kurtosis #Delta#varphi", (graphsWingRemoved) ? graphsWingRemoved[14+offset] : 0, 0, 0, 0, 0, 2);
 DrawCentrality("kurtosiseta_centrality", 12, graphs[15+offset], -1.5, 2.5, "Kurtosis #Delta#eta", (graphsWingRemoved) ? graphsWingRemoved[15+offset] : 0, 0, 0, 0, 0, 2);
}

/*
void DrawResultsCentrality(const char* fileName = "graphs.root", const char* fileNameWingRemoved = 0, Int_t offset = 0)
{
  TGraphErrors*** graphsWingRemoved = 0;
  if (fileNameWingRemoved)
  {
    ReadGraphs(fileNameWingRemoved);
    graphsWingRemoved = graphs;
  }
  
  ReadGraphs(fileName);
  
  Int_t nHists = 13; //NHists;
  
  if (1)
  {
    DrawCentrality("norm", nHists, graphs[0], 0, 0.2, "N (a.u.)", graphs[0+16], (graphsWingRemoved) ? graphsWingRemoved[0] : 0);
    
//     return;
    
    DrawCentrality("width_phi1_centrality", nHists, graphs[1], 0, 0.8, "#sigma_{#varphi, 1} (rad.)", graphs[1+16], (graphsWingRemoved) ? graphsWingRemoved[1] : 0);
//     return;
    DrawCentrality("width_phi2_centrality", nHists, graphs[4], 0, 0.8, "#sigma_{#varphi, 2} (rad.)", graphs[4+16], (graphsWingRemoved) ? graphsWingRemoved[4] : 0);
    DrawCentrality("width_eta1_centrality", nHists, graphs[2], 0, 0.8, "#sigma_{#eta, 1} (rad.)", graphs[2+16], (graphsWingRemoved) ? graphsWingRemoved[2] : 0);
    DrawCentrality("width_eta2_centrality", nHists, graphs[5], 0, 0.8, "#sigma_{#eta, 2} (rad.)", graphs[5+16], (graphsWingRemoved) ? graphsWingRemoved[5] : 0);
    
    CalculateRMSSigma();
    if (graphsWingRemoved)
      CalculateRMSSigma(graphsWingRemoved);

    DrawCentrality("phi_rms_centrality", nHists, graphs[1], 0, 0.8, "#sigma_{#varphi} (fit) (rad.)", graphs[1+16], (graphsWingRemoved) ? graphsWingRemoved[1] : 0, 0, 0, 0, 1);

    DrawCentrality("eta_rms_centrality", nHists, graphs[2], 0, 0.8, "#sigma_{#eta} (fit)", graphs[2+16], (graphsWingRemoved) ? graphsWingRemoved[2] : 0, 0, 0, 0, 1);

    DrawCentrality("chi2_1", nHists, graphs[6], 0.5, 2.5, "#chi^{2}/ndf (full region)");
    DrawCentrality("chi2_2", nHists, graphs[7], 0.5, 2.5, "#chi^{2}/ndf (peak region)");
    
    DrawCentrality("sigma_phi", nHists, graphs[8], 0.1, 0.5, "#sigma_{#varphi} (rad.)", graphs[8+16], (graphsWingRemoved) ? graphsWingRemoved[8] : 0, 0, 0, 0, 1);
    DrawCentrality("sigma_eta", nHists, graphs[9], 0.1, 0.5, "#sigma_{#eta}", graphs[9+16], (graphsWingRemoved) ? graphsWingRemoved[9] : 0, 0, 0, 0, 1);
  }
  
  DrawCentrality("kurtosisphi_centrality", 12, graphs[14], -2, 2, "Kurtosis #varphi", graphs[14+16], (graphsWingRemoved) ? graphsWingRemoved[14] : 0, 0, 0, 0, 2);
  DrawCentrality("kurtosiseta_centrality", 12, graphs[15], -2, 2, "Kurtosis #eta", graphs[15+16], (graphsWingRemoved) ? graphsWingRemoved[15] : 0, 0, 0, 0, 2);
}
*/

void MCComparison(const char* fileNameData, const char* fileNameWingRemoved, const char* fileNameHijing, const char* fileNameAMPT, Int_t offset = 0)
{
  Int_t nHists = 14; //NHists;

  ReadGraphs(fileNameWingRemoved);
  CalculateRMSSigma();
  TGraphErrors*** graphsWingRemoved = graphs;

  ReadGraphs(fileNameHijing);
  CalculateRMSSigma();
  TGraphErrors*** graphs1 = graphs;

  CreateGraphStructure();
  TGraphErrors*** graphs2 = graphs;
  if (fileNameAMPT)
  {
    ReadGraphs(fileNameAMPT);
    CalculateRMSSigma();
    graphs2 = graphs;
  }

  ReadGraphs(fileNameData);
  CalculateRMSSigma();

  if (0)
  {
    Int_t graphList[] = { 10, 11, 8, 9, 14, 15 };
    for (Int_t i=0; i<6; i++)
    {
      graphs[graphList[i]+offset][5] = new TGraphErrors;
      graphs[graphList[i]+offset][10] = new TGraphErrors;
      graphs1[graphList[i]+offset][5] = new TGraphErrors;
      graphs1[graphList[i]+offset][10] = new TGraphErrors;
    }
  }
  
  DrawCentrality("phi_rms_centrality_mc", nHists, graphs[10+offset], 0, 0.8, Form("#sigma_{#Delta#varphi} (%s) (rad.)", fitLabel), graphsWingRemoved[1+offset], 0, graphs1[10+offset], 0, graphs2[10+offset], 1);
  
//   return;
  
  DrawCentrality("eta_rms_centrality_mc", nHists, graphs[11+offset], 0, 0.8 + 0.4 / 16 * offset, Form("#sigma_{#Delta#eta} (%s)", fitLabel), graphsWingRemoved[11+offset], 0, graphs1[11+offset], 0, graphs2[2+offset], 1);
  
  DrawCentrality("sigma_phi_mc", nHists, graphs[8+offset], 0, 0.6, "#sigma_{#Delta#varphi} (rad.)", graphsWingRemoved[8+offset], 0, graphs1[8+offset], 0, graphs2[8+offset], 1);
  DrawCentrality("sigma_eta_mc", nHists, graphs[9+offset], 0, 0.6, "#sigma_{#Delta#eta}", graphsWingRemoved[9+offset], 0, graphs1[9+offset], 0, graphs2[9+offset], 1);

  DrawCentrality("kurtosisphi_centrality_mc", nHists, graphs[14+offset], -1.5, 3.5, "Kurtosis #Delta#varphi", graphsWingRemoved[14+offset], 0, graphs1[14+offset], 0, graphs2[14+offset], 2);
  DrawCentrality("kurtosiseta_centrality_mc", nHists, graphs[15+offset], -1.5, 3.5, "Kurtosis #Delta#eta", graphsWingRemoved[15+offset], 0, graphs1[15+offset], 0, graphs2[15+offset], 2);

/*  DrawCentrality("phi_rms_centrality_mc", nHists, graphs[1], 0, 0.8, "#sigma_{#varphi} (fit) (rad.)", graphs[1+16], graphsWingRemoved[1],  graphs1[1], 0, graphs2[1], 1);
  DrawCentrality("eta_rms_centrality_mc", nHists, graphs[2], 0, 0.8, "#sigma_{#eta} (fit)", graphs[2+16], graphsWingRemoved[2], graphs1[2], 0, graphs2[2], 1);

  DrawCentrality("sigma_phi", nHists, graphs[8], 0.1, 0.5, "#sigma_{#varphi} (rad.)", graphs[8+16], graphsWingRemoved[8], graphs1[8], 0, graphs2[8], 1);
  DrawCentrality("sigma_eta", nHists, graphs[9], 0.1, 0.5, "#sigma_{#eta}", graphs[9+16], graphsWingRemoved[9], graphs1[9], 0, graphs2[9], 1);

  DrawCentrality("kurtosisphi_centrality_mc", nHists, graphs[14], -2, 2, "Kurtosis #varphi", graphs[14+16], graphsWingRemoved[14], graphs1[14], 0, graphs2[14], 2);
  DrawCentrality("kurtosiseta_centrality_mc", nHists, graphs[15], -2, 2, "Kurtosis #eta", graphs[15+16], graphsWingRemoved[15], graphs1[15], 0, graphs2[15], 2);*/
}

void ShowWingEffect(const char* fileNameData, const char* fileNameWingRemoved, Int_t offset = 0)
{
  Int_t nHists = 24; //NHists;

  ReadGraphs(fileNameWingRemoved);
  CalculateRMSSigma();
  TGraphErrors*** graphs1 = graphs;

  ReadGraphs(fileNameData);
  CalculateRMSSigma();
  
  DrawCentrality("phi_rms_centrality_mc", nHists, graphs[1+offset], 0, 0.8, "#sigma_{#varphi} (fit) (rad.)", graphs1[1+offset]);
  DrawCentrality("eta_rms_centrality_mc", nHists, graphs[2+offset], 0, 0.8, "#sigma_{#eta} (fit)", graphs1[2+offset]);

  DrawCentrality("sigma_phi", nHists, graphs[8+offset], 0, 0.8, "#sigma_{#varphi} (rad.)", graphs1[8+offset]);
  DrawCentrality("sigma_eta", nHists, graphs[9+offset], 0, 0.8, "#sigma_{#eta}", graphs1[9+offset]);

  DrawCentrality("kurtosisphi_centrality_mc", nHists, graphs[14+offset], -2, 4, "Kurtosis #varphi", graphs1[14+offset]);
  DrawCentrality("kurtosiseta_centrality_mc", nHists, graphs[15+offset], -2, 4, "Kurtosis #eta", graphs1[15+offset]);
}

void ShowFitEffect(const char* fileNameData)
{
  Int_t nHists = NHists;

  ReadGraphs(fileNameData);
  CalculateRMSSigma();
  
  DrawCentrality("phi_rms_centrality_mc", nHists, graphs[1], 0, 0.8, "#sigma_{#varphi} (fit) (rad.)", graphs[1+16]);
  DrawCentrality("eta_rms_centrality_mc", nHists, graphs[2], 0, 0.8, "#sigma_{#eta} (fit)", graphs[2+16]);

  DrawCentrality("sigma_phi", nHists, graphs[8], 0, 0.8, "#sigma_{#varphi} (rad.)", graphs[8+16]);
  DrawCentrality("sigma_eta", nHists, graphs[9], 0, 0.8, "#sigma_{#eta}", graphs[9+16]);

  DrawCentrality("kurtosisphi_centrality_mc", nHists, graphs[14], -2, 4, "Kurtosis #varphi", graphs[14+16]);
  DrawCentrality("kurtosiseta_centrality_mc", nHists, graphs[15], -2, 4, "Kurtosis #eta", graphs[15+16]);

  DrawCentrality("chi2_1", nHists, graphs[6], 0.5, 5, "chi2_1", graphs[6+16]);
  DrawCentrality("chi2_2", nHists, graphs[7], 0.5, 5, "chi2_2", graphs[7+16]);
}

void CompareSigmas(const char* fileNameData)
{
  // compare sigma from fit with sigma from direct calculation but taking for the first the limited range of 0.8 into account
  
  Int_t nHists = 12; //NHists;

  ReadGraphs(fileNameData);
  CalculateRMSSigma();
  TGraphErrors*** graphsOriginal = graphs;
  
  ReadGraphs(fileNameData);
  
  // rms
  for (Int_t histId = 0; histId < nHists; histId++)
  {
    if (!graphs[0][histId])
      continue;
    
    for (Int_t i=0; i<graphs[0][histId]->GetN(); i++)
    {
      // phi
      TF1* func = new TF1("func", "[0]+[1]*([4]/[2]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[2])**2)*TMath::Erf([7]/TMath::Sqrt(2)/[3])+(1-[4])/[5]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[5])**2)*TMath::Erf([7]/TMath::Sqrt(2)/[6]))", -0.5 * TMath::Pi(), 0.5 * TMath::Pi());
      func->SetParameter(0, 0);
      for (Int_t k=0; k<6; k++)
	func->SetParameter(k+1, graphs[k][histId]->GetY()[i]);
      func->SetParameter(7, 0.8); // project Limit
      
      graphs[8][histId]->GetY()[i] = TMath::Sqrt(func->CentralMoment(2, -0.87, 0.87));
      
      // eta
      func = new TF1("func", "[0]+[1]*([4]/[3]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[3])**2)*TMath::Erf([7]/TMath::Sqrt(2)/[2])+(1-[4])/[6]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[6])**2)*TMath::Erf([7]/TMath::Sqrt(2)/[5]))", -kOuterLimit, kOuterLimit);
      func->SetParameter(0, 0);
      for (Int_t k=0; k<6; k++)
	func->SetParameter(k+1, graphs[k][histId]->GetY()[i]);
      func->SetParameter(7, 0.87); // project Limit
      
      graphs[9][histId]->GetY()[i] = TMath::Sqrt(func->CentralMoment(2, -0.8, 0.8));
    }
  }
  
  DrawCentrality("phi_comparison1", nHists, graphsOriginal[1], 0.2, 0.8, "#sigma_{#Delta#varphi} (fit)", 0, 0, graphs[8]);
  DrawCentrality("phi_comparison2", nHists, graphsOriginal[8], 0.2, 0.5, "#sigma_{#Delta#varphi} (fit)", 0, 0, graphs[8]);
  DrawCentrality("eta_comparison1", nHists, graphsOriginal[2], 0.2, 0.8, "#sigma_{#Delta#eta} (fit)", 0, 0, graphs[9]);
  DrawCentrality("eta_comparison2", nHists, graphsOriginal[9], 0.2, 0.5, "#sigma_{#Delta#eta} (fit)", 0, 0, graphs[9]);
}  

Float_t** ExtractSystematics(const char* baseFile, const char* systFile, Int_t offset)
{
  ReadGraphs(baseFile);
  CalculateRMSSigma();
 
  TGraphErrors*** graphsBase = graphs;
  if (systFile)
  {
    ReadGraphs(systFile);
    CalculateRMSSigma();
  }
  
  // calculate syst unc for these graphs
  const Int_t NGraphList = 6;
  Int_t graphList[] = { 1, 2, 8, 9, 14, 15 };

  Float_t** results = new Float_t*[NGraphList];

  for (Int_t i=0; i<NGraphList; i++)
  {
    results[i] = new Float_t[2];

    Bool_t kurtosis = kFALSE;
    if (graphList[i] == 14 || graphList[i] == 15)
      kurtosis = kTRUE;
    
    TH1* hist = 0;
    if (!kurtosis)
      hist = new TH1F(Form("hist_%d", i), "", 50, 0.5, 1.5);  
    else
      hist = new TH1F(Form("hist_%d", i), "", 50, -1, 1);  
  
    TCanvas* c = new TCanvas(Form("%s_%d_%d", systFile, i, 0), Form("%s_%d_%d", systFile, i, 0), 1000, 1000);
    c->Divide(4, 4);

    Int_t count = 1;
    for (Int_t j=0; j<NHists; j++)
    {
      if (SkipGraph(j))
	continue;
      
      // for kurtosis we show only up to 12
      if (kurtosis)
	if (j >= 12)
	  continue;
      
      TGraphErrors* graph1 = graphsBase[graphList[i]+offset][j];
      TGraphErrors* graph2 = (systFile) ? graphs[graphList[i]+offset][j] : graphsBase[graphList[i]+16][j];
      
      if (graph1->GetN() == 0)
	continue;
      
      graph1->Sort();
      graph2->Sort();
      
      c->cd(count++);
      gPad->SetGridx();
      gPad->SetGridy();
      graph1->SetMarkerStyle(24);
      graph1->DrawClone("AP");
      graph2->SetLineColor(2);
      graph2->SetMarkerColor(2);
      graph2->SetMarkerStyle(25);
      graph2->DrawClone("LSAME");
      
      c->cd(count++);
      gPad->SetGridx();
      gPad->SetGridy();
      
      // reset errors on graph2 
/*      for (Int_t k=0; k<graph2->GetN(); k++)
	graph2->GetEY()[k] = 0;*/
      
      if (!kurtosis)
      {
	DivideGraphs(graph1, graph2);
	((TGraphErrors*) graph1->DrawClone("AP"))->GetYaxis()->SetRangeUser(0.8, 1.2);
      }
      else
      {
	SubtractGraphs(graph1, graph2);
	((TGraphErrors*) graph1->DrawClone("AP"));
      }	
      
      for (Int_t k=0; k<graph1->GetN(); k++)
      {
// 	hist->Fill(graph1->GetY()[k], 1.0 / (graph1->GetEY()[k] / graph1->GetY()[k]));
	if (kurtosis)
	  hist->Fill(TMath::Abs(graph1->GetY()[k]));
	else
	  hist->Fill(graph1->GetY()[k]);
      }
      
      if (count == 37)
	break;
    }
    
    c->SaveAs(Form("syst/%s_%d.eps", systFile, i));
    
    new TCanvas;
    hist->Draw();
    hist->Sumw2();
    
    Float_t mean = -1;
    Float_t sigma = -1;
    if (0)
    {
      hist->Fit("gaus", "Q");
      mean = hist->GetFunction("gaus")->GetParameter(1);
      sigma = hist->GetFunction("gaus")->GetParameter(2);
      
      Printf("%d: %.3f +- %.3f %.3f | %.3f +- %.3f", i, mean, sigma, sigma / TMath::Sqrt(hist->GetEntries()), hist->GetMean(), hist->GetMean(11));
    }
    else
    {
      mean = hist->GetMean(1);
      sigma = hist->GetMean(11);

      Printf("%d: %.3f +- %.3f", i, hist->GetMean(), hist->GetMean(11));
    }
    
    if (!kurtosis)
    {
      mean -= 1;
      mean *= 100;
      sigma *= 100;
    }
    results[i][0] = mean;
    results[i][1] = sigma / TMath::Sqrt(hist->GetEntries());
  }
  
  return results;
}

void GetProjections(TH2* hist, TH1** projPhi, TH1** projEta, Int_t k)
{
  Float_t projectLimit = 0.8;

  *projPhi = hist->ProjectionX(Form("%s_proj1%d", hist->GetName(), k), hist->GetYaxis()->FindBin(-projectLimit+0.01), hist->GetYaxis()->FindBin(projectLimit-0.01));
    
  *projEta = hist->ProjectionY(Form("%s_proj2_%d", hist->GetName(), k), hist->GetXaxis()->FindBin(-projectLimit+0.01), hist->GetXaxis()->FindBin(projectLimit-0.01));
}

// uncorrected ones
const char* systBaseFile = "dphi_corr_2d_120429.root";
const char* systTrackCuts1 = "dphi_corr_120425_hybrid.root";
const char* systTrackCuts2 = "dphi_corr_120430_raa.root";
const char* systVertex = "dphi_corr_2d_120425_vertex.root";
const char* systResonances = "dphi_corr_120502_resonances.root";
const char* systTTR = "dphi_corr_2d_120430_widettr.root";

// corrected ones
const char* systBaseFileCorrected = "dphi_corr_2d_120508.root";
const char* systTrackCuts1Corrected = "dphi_corr_120507_hybrid.root";
const char* systTrackCuts2Corrected = "dphi_corr_120507_raa.root";
const char* systWingRemovedCorrected = "dphi_corr_2d_120508_wingremoved.root";

void ExtractSystematicsProjections(Int_t mode, Float_t rangeBegin = -0.4, Float_t rangeEnd = 0.4, Bool_t draw = kFALSE)
{
  if (!draw)
    gROOT->SetBatch(kTRUE);
  
  Int_t maxLeadingPt = 4;
  Int_t maxAssocPt = 6;

  Int_t NEffects = 3;
  
  TFile* file1 = 0;
  const char** systFiles = 0;
  if (mode == 2)
  {
    NEffects = 5;
    file1 = TFile::Open(systBaseFile);
    static const char* systFilesTmp[5] = { systVertex, systResonances, systTTR, systTrackCuts1Corrected, systTrackCuts2Corrected };
    systFiles = systFilesTmp;
  }
  else if (mode == 0)
  {
    file1 = TFile::Open(systBaseFile);
    static const char* systFilesTmp[3] = { systVertex, systResonances, systTTR };
    systFiles = (const char**) systFilesTmp;
  }
  else if (mode == 1)
  {
    NEffects = 3;
    file1 = TFile::Open(systBaseFileCorrected);
    static const char* systFilesTmp[3] = { systTrackCuts1Corrected, systTrackCuts2Corrected, systWingRemovedCorrected };
    systFiles = systFilesTmp;
  }
  else if (mode == 3)
  {
    NEffects = 3;
    file1 = TFile::Open(systBaseFileCorrected);
    static const char* systFilesTmp[3] = { systBaseFileCorrected, systBaseFileCorrected, systBaseFileCorrected };
    systFiles = systFilesTmp;
  }
  
  TH2* uncertainty[4];
  for (Int_t i=0; i<4; i++)
    uncertainty[i] = new TH2F(Form("uncertainty_%d", i), Form("%s %s;ptbin;centrality", (i % 2 == 0) ? "#varphi" : "#eta", (i < 2) ?"average" : "deviation"), 30, 0, 30, 6, 0, 6);
  
  Int_t count = 0;
  Int_t ptBin = 0;
  for (Int_t i=0; i<maxLeadingPt-1; i++)
  {
    for (Int_t j=1; j<maxAssocPt-1; j++)
    {
      if (i == 0 && j == 2)
	continue;
      if (i == 1 && j == 3)
	continue;
      if (i == 2 && j == 4)
	continue;
      
      ptBin++;
      for (Int_t histId = 0; histId < NHists; histId++)
      {
	TH2* hist1 = (TH2*) file1->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
	if (!hist1)
	  continue;
	
	if (hist1->GetEntries() < 1e4)
	{
	  Printf("Only %f entries. Skipping...", hist1->GetEntries());
	  continue;
	}
	
	Printf("%d %d %d %s", i, j, histId, hist1->GetTitle());
	
	TH1* proj1[2];
	TH1* proj2[10][2];
	
	SubtractEtaGap(hist1, kEtaLimit, kOuterLimit, kFALSE);
	GetProjections(hist1, &proj1[0], &proj1[1], count++);

	TCanvas* c = new TCanvas(Form("c_%d_%d_%d", mode, ptBin, histId), Form("c_%d_%d_%d", mode, ptBin, histId), 1200, 1000);
	c->Divide(3, 2);
	  
	for (Int_t k=0; k<2; k++)
	{
	  c->cd(1+k*3);
	  proj1[k]->SetStats(0);
	  proj1[k]->GetXaxis()->SetRangeUser(-1.5, 1.5);
	  proj1[k]->GetYaxis()->SetRangeUser(proj1[k]->GetMinimum() * 1.1, proj1[k]->GetMaximum() * 1.4);
	  proj1[k]->DrawCopy();
	}
	
	Double_t maxAverage[2] = { 0, 0 };
	Double_t maxDev[2] = { 0, 0 };
  
	for (Int_t n=0; n<NEffects; n++)
	{
	  if (histId == 2 && mode == 0 && n > 0)
	    continue;
	  if (histId == 2 && mode == 1 && n > 0)
	    continue;
// 	  Printf("%d %s", n, systFiles[n]);
	  TFile* file2 = TFile::Open(systFiles[n]);
	  hist1 = (TH2*) file2->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
	  if (!hist1)
	    continue;
	  
	  if (mode == 3 && n == 0) // change eta limits
	    SubtractEtaGap(hist1, kEtaLimit-0.2, kOuterLimit, kFALSE);
	  if (mode == 3 && n == 1) // change eta limits
	    SubtractEtaGap(hist1, kEtaLimit+0.2, kOuterLimit, kFALSE);
	  if (mode == 3 && n == 2) // change eta limits
	    SubtractEtaGap(hist1, kEtaLimit, kOuterLimit-0.2, kFALSE);
	  else
	    SubtractEtaGap(hist1, kEtaLimit, kOuterLimit, kFALSE);
	  GetProjections(hist1, &proj2[n][0], &proj2[n][1], count++);
	  
	  for (Int_t k=0; k<2; k++)
	  {
	    c->cd(1+k*3);
	    proj2[n][k]->SetLineColor(n+2);
	    /* TH1* copy = */ proj2[n][k]->DrawCopy("SAME");
	    
	    c->cd(2+k*3);
	    gPad->SetGridx();
	    gPad->SetGridy();
	    TH1* ratio = (TH1*) proj2[n][k]->Clone(Form("%s_ratio", proj2[n][k]->GetName()));
	    ratio->SetStats(0);
	    ratio->Divide(proj1[k]);
	    ratio->GetXaxis()->SetRangeUser(-1.5, 1.5);
	    ratio->Fit("pol0", "0Q", "", -1, 1);
	    Double_t average = ratio->GetFunction("pol0")->GetParameter(0);
// 	    Printf("Average is %f", average);
	    maxAverage[k] = TMath::Max(maxAverage[k], TMath::Abs(average - 1));
// 	    ratio->Scale(1.0 / average);
// 	    copy->Scale(1.0 / average);
	    ratio->GetYaxis()->SetRangeUser(0.5, 1.5);
	    ratio->DrawCopy((n == 0) ? "" : "SAME");
	    
	    if (0)
	    {
	      Double_t sum = 0;
	      Double_t sumCount = 0;
	      for (Int_t bin = ratio->FindBin(rangeBegin); bin <= ratio->FindBin(rangeEnd); bin++)
	      {
		sum += TMath::Abs(ratio->GetBinContent(bin) - 1);
		sumCount++;
	      }
	      maxDev[k] = TMath::Max(maxDev[k], sum / sumCount);
	    }

	    c->cd(3+k*3);
	    gPad->SetGridx();
	    gPad->SetGridy();
	    TH1* diff = (TH1*) proj2[n][k]->Clone(Form("%s_diff", proj2[n][k]->GetName()));
	    diff->Scale(1.0 / average);
	    diff->Add(proj1[k], -1);
	    diff->SetStats(0);
	    diff->GetXaxis()->SetRangeUser(-1.5, 1.5);
	    diff->GetYaxis()->SetRangeUser(-0.05, 0.05);
	    diff->DrawCopy((n == 0) ? "" : "SAME");
	    
	    if (0)
	    {
	      for (Int_t bin = diff->FindBin(rangeBegin); bin <= diff->FindBin(rangeEnd); bin++)
		maxDev[k] = TMath::Max(maxDev[k], TMath::Abs(diff->GetBinContent(bin)));
	    }
	    else
	    {
	      Double_t sum = 0;
	      Double_t sumCount = 0;
	      for (Int_t bin = diff->FindBin(rangeBegin); bin <= diff->FindBin(rangeEnd); bin++)
	      {
		sum += TMath::Abs(diff->GetBinContent(bin));
		sumCount++;
	      }
	      maxDev[k] = TMath::Max(maxDev[k], sum / sumCount);
	    }
	  }
	  
	  delete file2;
	}
	
	// normalize to peak strength
/*	for (Int_t k=0; k<2; k++)
	  maxDev[k] /= proj1[k]->Integral(proj1[k]->GetXaxis()->FindBin(-0.2), proj1[k]->GetXaxis()->FindBin(0.2)) / (proj1[k]->GetXaxis()->FindBin(0.2) - proj1[k]->GetXaxis()->FindBin(-0.2) + 1);*/
	
	Int_t centralityAxisMapping[] = { 0, 4, 3, 5, 1, 2 };
	uncertainty[0]->SetBinContent(ptBin, centralityAxisMapping[histId]+1, maxAverage[0]);
	uncertainty[1]->SetBinContent(ptBin, centralityAxisMapping[histId]+1, maxAverage[1]);
	uncertainty[2]->SetBinContent(ptBin, centralityAxisMapping[histId]+1, maxDev[0]);
	uncertainty[3]->SetBinContent(ptBin, centralityAxisMapping[histId]+1, maxDev[1]);
	
	c->SaveAs(Form("syst_corr/%s.eps", c->GetName()));
      }
      
      if (draw)
	break;
    }
    if (draw)
      break;
  }
  
  TFile::Open("uncertainty.root", "RECREATE");
  for (Int_t i=0; i<4; i++)
    uncertainty[i]->Write();
  gFile->Close();
}

void DrawSystematicsProjections()
{
  TH2* uncertainty[4];
  
  TFile::Open("uncertainty.root");
  for (Int_t i=0; i<4; i++)
    uncertainty[i] = (TH2*) gFile->Get(Form("uncertainty_%d", i));
  
  TCanvas* cResult = new TCanvas("cResult", "cResult", 1000, 1000);
  cResult->Divide(2, 2);
  for (Int_t i=0; i<4; i++)
  {
    cResult->cd(i+1);
    gPad->SetRightMargin(0.15);
    uncertainty[i]->SetStats(0);
    uncertainty[i]->Draw("colz");
  }

  TCanvas* cResult2 = new TCanvas("cResult2", "cResult2", 1000, 1000);
  cResult2->Divide(2, 2);
  for (Int_t i=0; i<4; i++)
  {
    cResult2->cd(i+1);
    gPad->SetRightMargin(0.15);
    Int_t color = 1;
    for (Int_t j=1; j<=uncertainty[i]->GetNbinsX(); j++)
    {
      TH1* proj = uncertainty[i]->ProjectionY(Form("p_%d_%d", i, j), j, j);
      if (proj->Integral() > 0)
      {
	proj->SetLineColor(color++);
	proj->SetStats(0);
	proj->GetYaxis()->SetRangeUser(0, 0.5);
	proj->Draw((color == 2) ? "" : "SAME");
	
	Printf("%d %d: %.3f %.3f", i, color, proj->GetBinContent(1), proj->Integral(2, 6) / 5);
      }
    }
  }
}

void BuildSystematicFiles()
{
  Printf("Hope you know what you are doing... 5 seconds to abort...");
  gSystem->Sleep(5000);

  AnalyzeDeltaPhiEtaGap2D(systBaseFile, "syst_base.root");

  kEtaLimit = 0.8;
  AnalyzeDeltaPhiEtaGap2D(systBaseFile, "syst_eta08.root");
  
  kEtaLimit = 1.2;
  AnalyzeDeltaPhiEtaGap2D(systBaseFile, "syst_eta12.root");
  kEtaLimit = 1.0;
  
  kOuterLimit = 1.39;
  AnalyzeDeltaPhiEtaGap2D(systBaseFile, "syst_outer14.root");
  kOuterLimit = 1.59;
  
  AnalyzeDeltaPhiEtaGap2D(systTrackCuts1, "syst_hybrid.root");
  AnalyzeDeltaPhiEtaGap2D(systTrackCuts2, "syst_raa.root");
  AnalyzeDeltaPhiEtaGap2D(systVertex, "syst_vertex.root");
  AnalyzeDeltaPhiEtaGap2D(systResonances, "syst_resonances.root");
  AnalyzeDeltaPhiEtaGap2D(systTTR, "syst_widettr.root");
}

void ExtractSystematicsAll(Int_t offset = 0)
{
  gROOT->SetBatch(kTRUE);
  
  const Int_t NEffects = 9;
  
//   const char* defaultFile = "graphs_120425.root";
//   const char* systFiles[] = { "graphs_120425_eta08.root", "graphs_120425_eta12.root", "graphs_120425_outer14.root", "graphs_hybrid_120427.root", "graphs_120430_raa.root", "graphs_120425_vertex.root", "graphs_120502_resonances.root", "graphs_120502_widettr.root", "graphs_120425_wingremoved.root" };
  const char* defaultFile = "syst_base.root";
  const char* systFiles[] = { "syst_eta08.root", "syst_eta12.root", "syst_outer14.root", "syst_hybrid.root", "syst_raa.root", "syst_vertex.root", "syst_resonances.root", "syst_widettr.root", "graphs_120429_wingremoved.root" };
  const char* effectIdString[] = { "1a", "1b", "1c", "2a", "2b", "3", "4", "5", "6" };

  Float_t** results[NEffects+3];
  
  for (Int_t i=0; i<NEffects; i++)
  {
    results[i] = ExtractSystematics(defaultFile, systFiles[i], offset);
  }
  
  const Int_t NParameters = 6;
  const char* names[] = { "$\\sigma_{\\Dphi}$ (fit)", "$\\sigma_{\\Deta}$ (fit)", "$\\sigma_{\\Dphi}$", "$\\sigma_{\\Deta}$", "Kurtosis $\\Dphi$", "Kurtosis $\\Deta$" };
  
  for (Int_t j=0; j<NParameters; j++)
  {
    printf("%s \t & ", names[j]);
    for (Int_t i=0; i<NEffects; i++)
    {
      if (j < 4)
	printf("$%.1f\\%% \\pm %.1f\\%%$ \t & ", results[i][j][0], results[i][j][1]);
      else
	printf("$%.2f \\pm %.2f$ \t & ", results[i][j][0], results[i][j][1]);
    }
    Printf("\\\\");
  }

  // put together 0-2 (into NEffects)
  results[NEffects] = new Float_t*[NParameters];
  for (Int_t j=0; j<NParameters; j++)
  {
    results[NEffects][j] = new Float_t[2];
    Float_t mean = 0;
    Float_t sigma = 0;
    
    printf("%s \t:", names[j]);
    for (Int_t i=0; i<=2; i++)
    {
      mean = TMath::Max(mean, TMath::Abs(results[i][j][0]));
      printf("%.1f%% ", results[i][j][0]);
    }
    printf("--> %.1f%% \t", mean);
    results[NEffects][j][0] = mean;
      
    for (Int_t i=0; i<=2; i++)
    {
      sigma = TMath::Max(sigma, TMath::Abs(results[i][j][1]));
      printf("%.1f%% ", results[i][j][1]);
    }
    Printf("--> %.1f%% \t", sigma);
    results[NEffects][j][1] = sigma;
  }

  // put together 3-4 (into NEffects+1)
  results[NEffects+1] = new Float_t*[NParameters];
  for (Int_t j=0; j<NParameters; j++)
  {
    results[NEffects+1][j] = new Float_t[2];
    
    Float_t mean = 0;
    Float_t sigma = 0;
    
    printf("%s \t:", names[j]);
    for (Int_t i=3; i<=4; i++)
    {
      mean = TMath::Max(mean, TMath::Abs(results[i][j][0]));
      printf("%.1f%% ", results[i][j][0]);
    }
    printf("--> %.1f%% \t", mean);
    results[NEffects+1][j][0] = mean;
      
    for (Int_t i=3; i<=4; i++)
    {
      sigma = TMath::Max(sigma, TMath::Abs(results[i][j][1]));
      printf("%.1f%% ", results[i][j][1]);
    }
    Printf("--> %.1f%% \t", sigma);
    results[NEffects+1][j][1] = sigma;
  }
  
  // combine in quadrature (only mean)
  results[NEffects+2] = new Float_t*[NParameters];
  for (Int_t j=0; j<NParameters; j++)
  {
    results[NEffects+2][j] = new Float_t[2];
    Float_t mean = 0;
  
    printf("%s \t:", names[j]);
    for (Int_t i=5; i<NEffects+2; i++)
    {
      mean += results[i][j][0] * results[i][j][0];
      printf("%.1f%% ", results[i][j][0]);
    }
    mean = TMath::Sqrt(mean);
    Printf("--> %.1f%% \t", mean);
    results[NEffects+2][j][0] = mean;
  }
    
  for (Int_t j=0; j<NParameters; j++)
  {
    printf("%s \t & ", names[j]);
    for (Int_t i=0; i<NEffects+3; i++)
    {
      if (i == NEffects || i == NEffects+1)
	continue;
      if (j < 4)
	printf("$%.1f\\%%$ \t ", results[i][j][0]);
      else
	printf("$%.2f$ \t ", results[i][j][0]);
      if (i < NEffects+2)
	printf("& ");
    }
    Printf("\\\\");
  }
  
  // generate LaTeX code
  for (Int_t i=0; i<NEffects; i++)
  {
    for (Int_t j=0; j<NParameters; j++)
    {
      Printf("\\bfig[ht]");
      Printf("  \\includegraphics[width=\\linewidth]{syst/%s_%d.eps}", systFiles[i], j);
      Printf("  \\caption{Systematic effect (%s) - Parameter %s}", effectIdString[i], names[j]);
      Printf("\\efig");
    }
    Printf("\\clearpage");
  }
}

void CompareEtaPhi(const char* fileName, const char* fileNameWingRemoved)
{
  Int_t offset = 0;
  
  TGraphErrors*** graphsWingRemoved = 0;
  if (fileNameWingRemoved)
  {
    ReadGraphs(fileNameWingRemoved);
    CalculateRMSSigma();
    graphsWingRemoved = graphs;
  }
  
  ReadGraphs(fileName);
  
  Int_t nHists = 12; //NHists;
  skipGraphList[0] = 5;
  skipGraphList[1] = 6;
  skipGraphList[2] = 10;
  
  CalculateRMSSigma();
  
  drawLogo = 1;
  
  MCLabel = "#sigma_{#Delta#varphi}     #sigma_{#Delta#eta}";

  DrawCentrality("rms_centrality", nHists, graphs[1+offset], 0.2, 0.8, "#sigma_{#Delta#varphi} (fit) (rad.) , #sigma_{#Delta#eta} (fit)", graphsWingRemoved[1+offset], 0, graphs[2+offset], graphsWingRemoved[2+offset], 0, 1);
//   DrawCentrality("rms_centrality_nosyst", nHists, graphs[1], 0, 0.8, "#sigma_{#varphi} (fit) (rad.) / #sigma_{#eta}", 0, 0,  graphs[2], 0);
}

void DrawExamples(const char* histFileName, const char* graphFileName, Int_t i = 0, Int_t j = 1, Bool_t drawFunc = kTRUE)
{
  Float_t etaLimit = kEtaLimit;
  Float_t outerLimit = kOuterLimit;
  Float_t projectLimit = 0.8;

  ReadGraphs(graphFileName);

  TFile::Open(histFileName);
  
  Int_t exColors[] = { 1, 2, 4, 3, 5, 6 };
  
  Int_t graphID = i * (6 - 1) + j - 1;

  TCanvas* c = new TCanvas(Form("c_%d", i), Form("c_%d", i), 1200, 600);
  c->Divide(2, 1);
  Int_t nHists = 3;
  for (Int_t histId = 0; histId < nHists; histId++)
  {
    TH2* hist = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
    if (!hist)
      continue;

    if (graphs[0][graphID]->GetN() < histId)
    {
      Printf("ERROR: Pos in graph not found: %d %d", i, histId);
      continue;
    }
    
    SubtractEtaGap(hist, etaLimit, outerLimit, kFALSE, kFALSE);
  
    c->cd(1);
    TH1* proj = hist->ProjectionX(Form("%s_proj1", hist->GetName()), hist->GetYaxis()->FindBin(-projectLimit+0.01), hist->GetYaxis()->FindBin(projectLimit-0.01));
    proj->SetLineColor(exColors[histId]);
    proj->SetStats(0);
    proj->GetXaxis()->SetRangeUser(-1.49, 1.49);
    proj->GetYaxis()->SetRangeUser(proj->GetMinimum() * 1.2, proj->GetMaximum() * 1.5);
    proj->GetYaxis()->SetTitle(kProjYieldTitlePhi);
    TString label(proj->GetTitle());
    TObjArray* objArray = label.Tokenize("-");
    proj->SetTitle(Form("%s-%s", objArray->At(0)->GetName(), objArray->At(1)->GetName()));
    proj->Draw((histId == 0) ? "" : "SAME");
  
    if (drawFunc)
    {
      // integral over y
      TF1* func = new TF1("func", "[0]+[1]*([4]/[2]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[2])**2)+(1-[4])/[5]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[5])**2))", -0.5 * TMath::Pi(), 0.5 * TMath::Pi());
      func->SetParameter(0, 0);
      for (Int_t k=0; k<6; k++)
	func->SetParameter(k+1, graphs[k][graphID]->GetY()[histId]);
      // scale by bin width (to compare with projection)
      func->SetParameter(1, func->GetParameter(1) / hist->GetYaxis()->GetBinWidth(1));
      func->SetLineColor(exColors[histId]);
      func->SetLineWidth(1);
      func->DrawCopy("SAME");
      
      // draw contributions
      Float_t scale = func->GetParameter(1);
      Float_t weighting = func->GetParameter(4);
      func->SetParameter(1, scale * weighting);
      func->SetParameter(4, 1);
      func->SetLineStyle(2);
      func->DrawCopy("SAME");

      func->SetParameter(1, scale * (1.0-weighting));
      func->SetParameter(4, 0);
      func->SetLineStyle(3);
      func->DrawCopy("SAME");
    }

    DrawLatex(0.15, 0.8 - 0.05 * histId, exColors[histId], labels[histId]);

    c->cd(2);
    proj = hist->ProjectionY(Form("%s_proj2b", hist->GetName()), hist->GetXaxis()->FindBin(-projectLimit+0.01), hist->GetXaxis()->FindBin(projectLimit-0.01));
    proj->SetLineColor(exColors[histId]);
    proj->GetXaxis()->SetRangeUser(-1.49, 1.49);
    proj->GetYaxis()->SetRangeUser(proj->GetMinimum() * 1.2, proj->GetMaximum() * 2);
    proj->GetYaxis()->SetTitle(kProjYieldTitleEta);
    proj->SetStats(0);
    proj->SetTitle(Form("%s-%s", objArray->At(0)->GetName(), objArray->At(1)->GetName()));
    proj->Draw((histId == 0) ? "" : "SAME");
    
    if (0)
    {
      proj = hist->ProjectionY(Form("%s_proj2", hist->GetName()), hist->GetXaxis()->FindBin(-0.5 * TMath::Pi()), hist->GetXaxis()->FindBin(0.5 * TMath::Pi()));
      proj->SetLineColor(exColors[histId]);
      proj->GetXaxis()->SetRangeUser(-1.2, 1.2);
      proj->GetYaxis()->SetRangeUser(proj->GetMinimum() * 1.2, proj->GetMaximum() * 2);
      proj->SetLineStyle(2);
      proj->Draw("SAME");
    }

    if (drawFunc)
    {
      // integral over x
      TF1* func = new TF1("func", "[0]+[1]*([4]/[3]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[3])**2)+(1-[4])/[6]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[6])**2))", -outerLimit, outerLimit);
      func->SetParameter(0, 0);
      for (Int_t k=0; k<6; k++)
	func->SetParameter(k+1, graphs[k][graphID]->GetY()[histId]);
      // scale by bin width (to compare with projection)
      func->SetParameter(1, func->GetParameter(1) / hist->GetXaxis()->GetBinWidth(1));
      func->SetLineColor(exColors[histId]);
      func->SetLineWidth(1);
      func->DrawCopy("SAME");

      // draw contributions
      Float_t scale = func->GetParameter(1);
      Float_t weighting = func->GetParameter(4);
      func->SetParameter(1, scale * weighting);
      func->SetParameter(4, 1);
      func->SetLineStyle(2);
      func->DrawCopy("SAME");

      func->SetParameter(1, scale * (1.0-weighting));
      func->SetParameter(4, 0);
      func->SetLineStyle(3);
      func->DrawCopy("SAME");   
    }

    DrawLatex(0.15, 0.8 - 0.05 * histId, exColors[histId], labels[histId]);
  }
}

TH1* GetSystUnc(TH1* hist, Int_t i, Int_t j, Int_t histId, Int_t etaPhi)
{
//   Float_t uncertainty = (histId == 0) ? 0.1 : 0.08;

  // track cuts
  //   2 2: 0.048 0.020
  //   2 3: 0.078 0.031
  //   2 4: 0.023 0.008
  //   2 5: 0.159 0.056
  //   2 6: 0.043 0.015
  //   2 7: 0.011 0.006
  //   3 2: 0.050 0.022
  //   3 3: 0.089 0.033
  //   3 4: 0.020 0.008
  //   3 5: 0.183 0.056
  //   3 6: 0.042 0.013
  //   3 7: 0.010 0.005
  
  // others
  //   2 2: 0.023 0.007
  //   2 3: 0.024 0.015
  //   2 4: 0.008 0.005
  //   2 5: 0.075 0.024
  //   2 6: 0.019 0.010
  //   2 7: 0.007 0.004
  //   3 2: 0.029 0.009
  //   3 3: 0.032 0.012
  //   3 4: 0.005 0.003
  //   3 5: 0.086 0.013
  //   3 6: 0.015 0.006
  //   3 7: 0.008 0.003

  Float_t uncertainty = 1;
  if (i == 0 && j == 1)
    uncertainty = 0.021;
  if (i == 1 && j == 1)
    uncertainty = 0.032;
  if (i == 1 && j == 2)
    uncertainty = 0.008;
  if (i == 2 && j == 1)
    uncertainty = 0.056;
  if (i == 2 && j == 2)
    uncertainty = 0.014;
  if (i == 2 && j == 3)
    uncertainty = 0.006;
  
  if (histId == 0)
    uncertainty *= 2;
  
  TH1* systUnc = (TH1*) hist->Clone(Form("%s_syst", hist->GetName()));
  for (Int_t n=1; n<=systUnc->GetNbinsX(); n++)
    systUnc->SetBinError(n, uncertainty);
  
  systUnc->SetFillColor(hist->GetLineColor());
  systUnc->SetFillStyle((etaPhi == 0) ? 3004 : 3005);
  systUnc->SetMarkerStyle(0);
  systUnc->SetLineColor(0);
  
  return systUnc;
}

void Draw2DExamples(const char* histFileName)
{
  Int_t is[] = { 0, 0, 1, 1, 2, 2, 3 };
  Int_t js[] = { 1, 2, 2, 3, 4, 5, 6 };
  Int_t cs[] = { 0, 3, 5, 1 };
  Float_t outerLimit = kOuterLimit;

  TFile::Open(histFileName);

  TCanvas* canvas = new TCanvas("2d", "2d", 1800, 600);
  canvas->Divide(7, 4);
  Int_t cID = 1;

  for (Int_t c=0; c<4; c++)
  {
    for (Int_t i=0; i<7; i++)
    {
      canvas->cd(cID++);

      TH2* hist = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", is[i], js[i], cs[c]));
      if (!hist)
	continue;

      // NOTE fix normalization. these 2d correlations come out of AliUEHist normalized by dphi bin width, but not deta
      hist->Scale(1.0 / hist->GetYaxis()->GetBinWidth(1));
      hist->GetZaxis()->SetTitle(kCorrFuncTitle);
      hist->GetZaxis()->SetTitleOffset(1.9);
      
      hist->Rebin2D(2, 2);
      hist->Scale(0.25);
  
      TString label(hist->GetTitle());
      label.ReplaceAll(".00", " GeV/c");
      label.ReplaceAll(".0", " GeV/c");
      TObjArray* objArray = label.Tokenize("-");
      TPaveText* paveText = new TPaveText(0.52, 0.72, 0.95, 0.95, "BRNDC");
      paveText->SetTextSize(0.035);
      paveText->SetFillColor(0);
      paveText->SetShadowColor(0);
      paveText->AddText(objArray->At(0)->GetName());
      paveText->AddText(objArray->At(1)->GetName());
      if (objArray->GetEntries() == 4)
	paveText->AddText(Form("Pb-Pb 2.76 TeV %s-%s", objArray->At(2)->GetName(), objArray->At(3)->GetName()));
      else
	paveText->AddText(Form("%s 2.76 TeV", objArray->At(2)->GetName()));
      paveText->AddText("|#eta| < 0.9");
      
      gPad->SetLeftMargin(0.15);
      hist->GetYaxis()->SetRangeUser(-outerLimit, outerLimit);
      hist->GetXaxis()->SetTitleOffset(1.5);
      hist->GetYaxis()->SetTitleOffset(1.7);
      hist->SetStats(0);
      hist->SetTitle("a) Correlation");
      TH2* clone = (TH2*) hist->Clone(Form("%s_clone", hist->GetName()));
    //   clone->GetXaxis()->SetRangeUser(-TMath::Pi() / 2, TMath::Pi() / 2);
      clone->Draw("SURF1");
      paveText->Draw();
    }
  }
}

Bool_t disableUncertainties = kTRUE;

void DrawExample(const char* histFileName, Int_t i, Int_t j, Int_t histId, TH1** projPhi = 0, TH1** projEta = 0, TH1** projPhiSyst = 0 , TH1** projEtaSyst = 0, Bool_t Ratio = kFALSE)
{
  Float_t etaLimit = kEtaLimit;
  Float_t outerLimit = kOuterLimit;
  Float_t projectLimit = 0.8;
  Int_t maxAssocPt = 6;
  Int_t graphID = i * (maxAssocPt - 1) + j - 1;

  TFile::Open(histFileName);
  
  TCanvas* c = new TCanvas(Form("ex_%d_%d_%d", i, j, histId), Form("ex_%d_%d_%d", i, j, histId), 1800, 600);
  c->Divide(3, 1);

  TH2* hist = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
  if (!hist)
    return;
  // NOTE fix normalization. these 2d correlations come out of AliUEHist normalized by dphi bin width, but not deta
  hist->Scale(1.0 / hist->GetYaxis()->GetBinWidth(1));
  hist->GetZaxis()->SetTitle(kCorrFuncTitle);
  hist->GetZaxis()->SetTitleOffset(1.9);
  
  if (graphID >= 20)
  {
    etaLimit = 0.5;
    outerLimit = 0.99;
  }
//   hist->Rebin2D(2, 2); hist->Scale(0.25);
  
  TString label(hist->GetTitle());
  label.ReplaceAll(".00", " GeV/c");
  label.ReplaceAll(".0", " GeV/c");
  TObjArray* objArray = label.Tokenize("-");
  TPaveText* paveText = new TPaveText(0.52, 0.72, 0.95, 0.95, "BRNDC");
  paveText->SetTextSize(0.035);
  paveText->SetFillColor(0);
  paveText->SetShadowColor(0);
  paveText->AddText(objArray->At(0)->GetName());
  paveText->AddText(objArray->At(1)->GetName());
  if (objArray->GetEntries() == 4)
    paveText->AddText(Form("Pb-Pb 2.76 TeV %s-%s", objArray->At(2)->GetName(), objArray->At(3)->GetName()));
  else
    paveText->AddText(Form("%s 2.76 TeV", objArray->At(2)->GetName()));
  paveText->AddText("|#eta| < 0.9");
  
  c->cd(1);
  gPad->SetLeftMargin(0.15);
  hist->GetYaxis()->SetRangeUser(-outerLimit, outerLimit);
  hist->GetXaxis()->SetTitleOffset(1.5);
  hist->GetYaxis()->SetTitleOffset(1.7);
  hist->SetStats(0);
  hist->SetTitle("a) Correlation");
  TH2* clone = (TH2*) hist->Clone(Form("%s_clone", hist->GetName()));
//   clone->GetXaxis()->SetRangeUser(-TMath::Pi() / 2, TMath::Pi() / 2);
  clone->Draw("SURF1");
  paveText->Draw();
  
  SubtractEtaGap(hist, etaLimit, outerLimit, kFALSE, kFALSE);
  c->cd(2);
  gPad->SetLeftMargin(0.15);
  hist->SetTitle("b) #eta-gap subtracted");
  hist->GetXaxis()->SetRangeUser(-TMath::Pi() / 2, TMath::Pi() / 2);
  hist->DrawCopy("SURF1");
  if (!disableUncertainties)
    DrawALICELogo(kTRUE, 0.7, 0.7, 0.9, 0.9);
    
  c->cd(3);
  gPad->SetLeftMargin(0.13);
  TH1* proj = hist->ProjectionX(Form("%s_proj1", hist->GetName()), hist->GetYaxis()->FindBin(-projectLimit+0.01), hist->GetYaxis()->FindBin(projectLimit-0.01));
  TH1* proj2 = hist->ProjectionY(Form("%s_proj2b", hist->GetName()), hist->GetXaxis()->FindBin(-projectLimit+0.01), hist->GetXaxis()->FindBin(projectLimit-0.01));
  // normalization
  proj->Scale(hist->GetYaxis()->GetBinWidth(1));
  proj2->Scale(hist->GetXaxis()->GetBinWidth(1));

  proj->SetStats(0);
  proj->SetTitle("c) Projections");
  proj->GetXaxis()->SetRangeUser(-1.49, 1.49);
  proj->GetYaxis()->SetTitle(kProjYieldTitlePhi);
  proj->GetYaxis()->SetTitleOffset(1.3);
  proj->GetXaxis()->SetTitleOffset(1);
  proj->GetYaxis()->SetRangeUser(proj->GetMinimum(), proj->GetMaximum() * 1.6);
  TH1* systUncPhi = GetSystUnc(proj, i, j, histId, 0);
  TH1* copy = systUncPhi->DrawCopy("E2 ][");
  copy->GetXaxis()->SetTitle(Form("%s , %s", proj->GetXaxis()->GetTitle(), proj2->GetXaxis()->GetTitle()));
  copy->GetYaxis()->SetTitle(kProjYieldTitlePhiOrEta);
    
  proj2->SetLineColor(2);
  proj2->SetStats(0);
  proj2->GetYaxis()->SetTitle(kProjYieldTitleEta);
  proj2->GetYaxis()->SetTitleOffset(1.2);
  proj2->GetXaxis()->SetTitleOffset(1);
  proj2->GetYaxis()->SetRangeUser(proj2->GetMinimum(), proj2->GetMaximum() * 1.6);
  TH1* systUncEta = GetSystUnc(proj2, i, j, histId, 1);
  systUncEta->Draw("E2 ][ SAME");
  proj->DrawCopy((disableUncertainties) ? "" : "SAME");
  proj2->DrawCopy("SAME");
  if (!disableUncertainties)
  {
    if (histId == 0)
      DrawLatex(0.3, 0.85, 1, "Scale uncertainty: 20%", 0.04);
    else
      DrawLatex(0.3, 0.85, 1, "Scale uncertainty: 10%", 0.04);
  }
  DrawLatex(0.3, 0.80, 1, Form("#Delta#varphi projection in |#Delta#eta| < %.2f", hist->GetYaxis()->GetBinUpEdge(hist->GetYaxis()->FindBin(projectLimit-0.01))), 0.04);
  DrawLatex(0.3, 0.75, 2, Form("#Delta#eta projection in |#Delta#varphi| < %.2f", hist->GetXaxis()->GetBinUpEdge(hist->GetXaxis()->FindBin(projectLimit-0.01))), 0.04);
  
  proj->SetTitle(label);
  proj2->SetTitle(label);
  systUncPhi->SetTitle(label);
  systUncEta->SetTitle(label);
  
  TH1* etaRatio = (TH1*) proj2->Clone("etaRatio");
  etaRatio->GetXaxis()->SetRangeUser(0,2);
  etaRatio->GetYaxis()->SetRangeUser(etaRatio->GetMinimum(), etaRatio->GetMaximum() * 1.6);
  TH1* phiRatio = (TH1*) proj->Clone("phiRatio");
  phiRatio->GetXaxis()->SetRangeUser(0,2);
  phiRatio->GetYaxis()->SetRangeUser(phiRatio->GetMinimum(), phiRatio->GetMaximum() * 1.6);

  for (Int_t x=1; x<=proj->GetNbinsX(); x++)
    if (proj->GetBinCenter(x)>=0)
    {
      phiRatio->SetBinContent(x,proj->GetBinContent(proj->FindBin(proj->GetBinCenter(x)))+proj->GetBinContent(proj->FindBin(-1*proj->GetBinCenter(x))));
      phiRatio->SetBinError(x,sqrt((proj->GetBinError(proj->FindBin(proj->GetBinCenter(x)))*proj->GetBinError(proj->FindBin(proj->GetBinCenter(x)))+proj->GetBinError(proj->FindBin(-1*proj->GetBinCenter(x)))*proj->GetBinError(proj->FindBin(-1*proj->GetBinCenter(x))))));
    }
  for (Int_t x=1; x<=proj2->GetNbinsX(); x++)
    if (proj2->GetBinCenter(x)>=0)
    {
      etaRatio->SetBinContent(x,proj2->GetBinContent(proj2->FindBin(proj2->GetBinCenter(x)))+proj2->GetBinContent(proj2->FindBin(-1*proj2->GetBinCenter(x))));
      etaRatio->SetBinError(x,sqrt((proj2->GetBinError(proj2->FindBin(proj2->GetBinCenter(x)))*proj2->GetBinError(proj2->FindBin(proj2->GetBinCenter(x)))+proj2->GetBinError(proj2->FindBin(-1*proj2->GetBinCenter(x)))*proj2->GetBinError(proj2->FindBin(-1*proj2->GetBinCenter(x))))));
    }
    
  if (!projPhi || ! projEta)
    return;

  if (Ratio)
  {
    *projEta = etaRatio;
    *projPhi = phiRatio;
  }
  else
  {
    *projPhi = proj;
    *projEta = proj2;
  }
  *projPhiSyst = systUncPhi;
  *projEtaSyst = systUncEta;

  c->SaveAs(Form("ex/%s.png", c->GetName()));
  c->SaveAs(Form("ex/%s.eps", c->GetName()));

  if (0)
  {
    c = new TCanvas(Form("ex_%d_%d_%d_a", i, j, histId), Form("ex_%d_%d_%d_a", i, j, histId), 800, 800);
    gPad->SetLeftMargin(0.15);
    hist->SetTitle("");
    hist->DrawCopy("SURF1");
    paveText->Draw();
    DrawALICELogo(kTRUE, 0.2, 0.75, 0.4, 0.95);
    c->SaveAs(Form("ex/%s.png", c->GetName()));
    c->SaveAs(Form("ex/%s.eps", c->GetName()));

    c = new TCanvas(Form("ex_%d_%d_%d_b", i, j, histId), Form("ex_%d_%d_%d_b", i, j, histId), 800, 800);
    gPad->SetLeftMargin(0.15);
    clone->SetTitle("");
    clone->DrawCopy("SURF1");
    paveText->Draw();
    DrawALICELogo(kTRUE, 0.2, 0.75, 0.4, 0.95);
    c->SaveAs(Form("ex/%s.png", c->GetName()));
    c->SaveAs(Form("ex/%s.eps", c->GetName()));
  }
}

void DrawExampleAll(const char* histFileName, const char* graphFileName = 0)
{
  if (graphFileName)
    ReadGraphs(graphFileName);
  
  Int_t colors[] = { 1, 2, 4 };
  
  //Float_t exampleI[] = { 0, 2, 2 };
  //Float_t exampleJ[] = { 1, 1, 2 };
  //Int_t exampleI[] = { 0, 1, 2 };
  //Int_t exampleJ[] = { 1, 1, 1 };
  Float_t exampleI[] = { 3, 3, 3 };
  Float_t exampleJ[] = { 3, 4, 5 };
  
  TH1* projectionsPhi[9];
  TH1* projectionsEta[9];
  TH1* projectionsPhiSyst[9];
  TH1* projectionsEtaSyst[9];

  Bool_t Ratio = kFALSE;
  //if Ratio is true it divides by the 60-70% centrality bin the other two 
  //the label on the Y axis is wrong

  disableUncertainties = 1;
  
  Int_t count = 0;
  for (Int_t i=0; i<3; i++)
  {
    for (Int_t histId = 0; histId<3; histId++)
    {
      //it is using the 0-10%, the 20-40% and the 60-70% centrality bins
      DrawExample(histFileName, exampleI[i], exampleJ[i], (histId==2) ? 3 : histId, &projectionsPhi[count], &projectionsEta[count], &projectionsPhiSyst[count], &projectionsEtaSyst[count], Ratio);
      count++;
    }
    
    TCanvas* c = new TCanvas(Form("centralities_%d", i), Form("centralities_%d", i), 1200, 600);
    c->Divide(2, 1);
    
    TLegend* legend = new TLegend(0.62, 0.7, 0.88, 0.88);
    legend->SetFillColor(0);

    // syst first
    for (Int_t histId = 0; histId<3; histId++)
    {
      if (Ratio)
      {
        projectionsPhi[count-3+histId]->Divide(projectionsPhi[count-3+1]);
        projectionsEta[count-3+histId]->Divide(projectionsEta[count-3+1]);

      }
      if(!Ratio || (Ratio && histId!=1))
      {
      c->cd(1);
      TH1* clone;
      gPad->SetLeftMargin(0.12);
      projectionsPhiSyst[count-3+histId]->SetFillStyle(3003+histId);
      if (!disableUncertainties) clone = projectionsPhiSyst[count-3+histId]->DrawCopy((histId > 0) ? "E2 ][ SAME" : "E2 ][");
      else clone = projectionsPhi[count-3+histId]->DrawCopy((histId > 0) ? "E ][ SAME" : "E ][");
      clone->SetFillColor(colors[histId]);
      TString label(clone->GetTitle());
      TObjArray* objArray = label.Tokenize("-");
      clone->SetTitle(Form("%s-%s", objArray->At(0)->GetName(), objArray->At(1)->GetName()));
    
      c->cd(2);
      gPad->SetLeftMargin(0.12);
      projectionsEtaSyst[count-3+histId]->SetFillStyle(3003+histId);
      if (!disableUncertainties) clone = projectionsEtaSyst[count-3+histId]->DrawCopy((histId > 0) ? "E2 ][ SAME" : "E2 ][");
      else clone = projectionsEta[count-3+histId]->DrawCopy((histId > 0) ? "E ][ SAME" : "E ][");
      clone->SetFillColor(colors[histId]);
      clone->SetTitle(Form("%s-%s", objArray->At(0)->GetName(), objArray->At(1)->GetName()));
      }
    }
    
    for (Int_t histId = 0; histId<3; histId++)
    {
      if(!Ratio || (Ratio && histId!=1))
      {
      c->cd(1);
      TH1* clone = projectionsPhi[count-3+histId]->DrawCopy("SAME");
      clone->SetLineColor(colors[histId]);
      TString label(clone->GetTitle());
      TObjArray* objArray = label.Tokenize("-");
      legend->AddEntry(clone, (objArray->GetEntries() == 4) ? Form("%s-%s", objArray->At(2)->GetName(), objArray->At(3)->GetName()) : objArray->At(2)->GetName(), "L");
      
      c->cd(2);
      clone = projectionsEta[count-3+histId]->DrawCopy("SAME");
      clone->SetLineColor(colors[histId]);
      }
    }
    
    c->cd(1);
    legend->Draw();
    DrawLatex(0.15, 0.86,  1, "Pb-Pb #sqrt{s_{NN}} = 2.76 TeV", 0.03);
    DrawLatex(0.15, 0.82,  1, "pp #sqrt{s} = 2.76 TeV", 0.03);
    DrawLatex(0.15, 0.78, 1, "|#eta| < 0.9", 0.03);
    DrawLatex(0.15, 0.74, 1, "Projected within |#Delta#eta| < 0.80", 0.03);

    c->cd(2);
    DrawLatex(0.15, 0.86, 1, "Scale uncertainty: 20% (for 0-10%) / 10% (other bins)", 0.03);
    DrawLatex(0.15, 0.82, 1, "Projected within |#Delta#varphi| < 0.87", 0.03);
    if (!disableUncertainties) DrawALICELogo(kTRUE, 0.75, 0.62, 0.95, 0.78);
    
    c->SaveAs(Form("ex/%s.png", c->GetName()));
    c->SaveAs(Form("ex/%s.eps", c->GetName()));
 
//     return;

    if (graphFileName)
    {
      // fit curves
      Int_t graphID = exampleI[i] * (6 - 1) + exampleJ[i] - 1;
      for (Int_t histId = 0; histId<3; histId++)
      {
	c->cd(1);
	// integral over y
// 	TF1* func = new TF1("func", "[0]+[1]*([4]/[2]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[2])**2)+(1-[4])/[5]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[5])**2))", -0.5 * TMath::Pi(), 0.5 * TMath::Pi());
	// see /home/jgrosseo/limited2dgaussianintegration.nb
	TF1* func = new TF1("func", "[0]+[1]*([4]/[2]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[2])**2)*TMath::Erf([7]/TMath::Sqrt(2)/[3])+(1-[4])/[5]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[5])**2)*TMath::Erf([7]/TMath::Sqrt(2)/[6]))", -0.5 * TMath::Pi(), 0.5 * TMath::Pi());

	func->SetParameter(0, 0);
/*	if (histId == 0) func->SetParameter(0, -0.00129472);
	if (histId == 1) func->SetParameter(0, -0.00025859);
	if (histId == 2) func->SetParameter(0, -0.000833301);
*/
	for (Int_t k=0; k<6; k++)
	  func->SetParameter(k+1, graphs[k][graphID]->GetY()[(histId==2) ? 3 : histId]);
	// scale by bin width (to compare with projection)
	// NOTE this scaling looks inconsistent, but is OK. See normalization in DrawExample
	func->SetParameter(1, func->GetParameter(1) / projectionsEta[count-3+histId]->GetXaxis()->GetBinWidth(1));
	func->SetParameter(7, 0.8); // project Limit
	func->SetLineColor(colors[histId]);
	func->SetLineWidth(1);
	func->DrawCopy("SAME");
	
	// draw contributions
	Float_t scale = func->GetParameter(1);
	Float_t weighting = func->GetParameter(4);
	func->SetParameter(1, scale * weighting);
	func->SetParameter(4, 1);
	func->SetLineStyle(2);
	if (weighting > 0.01)
	  func->DrawCopy("SAME");

	func->SetParameter(1, scale * (1.0-weighting));
	func->SetParameter(4, 0);
	func->SetLineStyle(3);
	if (1.0-weighting > 0.01)
	  func->DrawCopy("SAME");
	
	c->cd(2);
	// integral over x
	func = new TF1("func", "[0]+[1]*([4]/[3]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[3])**2)*TMath::Erf([7]/TMath::Sqrt(2)/[2])+(1-[4])/[6]/TMath::Sqrt(TMath::TwoPi())*exp(-0.5*(x/[6])**2)*TMath::Erf([7]/TMath::Sqrt(2)/[5]))", -kOuterLimit, kOuterLimit);
	func->SetParameter(0, 0);
	for (Int_t k=0; k<6; k++)
	  func->SetParameter(k+1, graphs[k][graphID]->GetY()[(histId==2) ? 3 : histId]);
	// scale by bin width (to compare with projection)
	// NOTE this scaling looks inconsistent, but is OK. See normalization in DrawExample
	func->SetParameter(1, func->GetParameter(1) / projectionsEta[count-3+histId]->GetXaxis()->GetBinWidth(1));
	func->SetParameter(7, 0.87); // project Limit
	func->SetLineColor(colors[histId]);
	func->SetLineWidth(1);
	func->DrawCopy("SAME");

	// draw contributions
	scale = func->GetParameter(1);
	weighting = func->GetParameter(4);
	func->SetParameter(1, scale * weighting);
	func->SetParameter(4, 1);
	func->SetLineStyle(2);
	if (weighting > 0.01)
	  func->DrawCopy("SAME");

	func->SetParameter(1, scale * (1.0-weighting));
	func->SetParameter(4, 0);
	func->SetLineStyle(3);
	if (1.0-weighting > 0.01)
	  func->DrawCopy("SAME");
      }
      
      c->SaveAs(Form("ex/%s_fits.png", c->GetName()));
      c->SaveAs(Form("ex/%s_fits.eps", c->GetName()));
      
//       return;
    }
  }

  return;
  // TODO implement syst uncertainty plotting
  
  for (Int_t histId = 0; histId<3; histId++)
  {
    TCanvas* c = new TCanvas(Form("pt_%d", histId), Form("pt_%d", histId), 1200, 600);
    c->Divide(2, 1);
    
    TLegend* legend = new TLegend(0.15, 0.7, 0.88, 0.88);
    legend->SetFillColor(0);
    
    for (Int_t i=2; i>=0; i--)
    {
      c->cd(1);
      TH1* clone = projectionsPhi[i*3+histId]->DrawCopy((i < 2) ? "SAME" : "");
      clone->SetLineColor(colors[i]);
      clone->GetYaxis()->SetRangeUser(clone->GetMinimum(), clone->GetMaximum() * 1.2);
      
      TString label(clone->GetTitle());
      TObjArray* objArray = label.Tokenize("-");
      clone->SetTitle((objArray->GetEntries() == 4) ? Form("%s-%s", objArray->At(2)->GetName(), objArray->At(3)->GetName()) : objArray->At(2)->GetName());
      
      legend->GetListOfPrimitives()->AddFirst(new TLegendEntry(clone, Form("%s-%s", objArray->At(0)->GetName(), objArray->At(1)->GetName()), "L"));
      
      c->cd(2);
      clone = projectionsEta[i*3+histId]->DrawCopy((i < 2) ? "SAME" : "");
      clone->SetTitle((objArray->GetEntries() == 4) ? Form("%s-%s", objArray->At(2)->GetName(), objArray->At(3)->GetName()) : objArray->At(2)->GetName());
      clone->SetLineColor(colors[i]);
//       clone->GetYaxis()->SetRangeUser(clone->GetMinimum(), clone->GetMaximum() * 1.2);

      if (!disableUncertainties) DrawALICELogo(kTRUE, 0.65, 0.65, 0.85, 0.85);
    }
    
    c->cd(1);
    legend->Draw();

    c->SaveAs(Form("ex/%s.png", c->GetName()));
    c->SaveAs(Form("ex/%s.eps", c->GetName()));
  }
}

void DrawDoubleHump(const char* histFileName)
{
  Int_t exampleI[] = { 0, 1, 2, 0, 1, 2};
  Int_t exampleJ[] = { 1, 1, 1, 2, 2, 2};
  
  TH1* projectionsPhi[9];
  TH1* projectionsEta[9];
  TH1* projectionsPhiSyst[9];
  TH1* projectionsEtaSyst[9];
  
  TCanvas* c = new TCanvas("DrawDoubleHump", "DrawDoubleHump", 1200, 800);
  c->Divide(3, 2);
  
  TLegend* legend = new TLegend(0.15, 0.7, 0.88, 0.88);
  legend->SetFillColor(0);
  
  for (Int_t i=0; i<6; i++)
  {
    if (i == 3)
      continue;
    
    DrawExample(histFileName, exampleI[i], exampleJ[i], 0, &projectionsPhi[i], &projectionsEta[i], &projectionsPhiSyst[i], &projectionsEtaSyst[i]);

    c->cd(i+1);
    gPad->SetLeftMargin(0.15);
    projectionsPhiSyst[i]->GetXaxis()->SetTitle(Form("%s , %s", "#Delta#varphi (rad.)", "#Delta#eta"));
    projectionsPhiSyst[i]->GetYaxis()->SetTitle(kProjYieldTitlePhiOrEta);
    projectionsPhiSyst[i]->GetYaxis()->SetTitleOffset(1.8);
//     projectionsPhiSyst[i]->SetTitleSize(0.035);
    
    TString label(projectionsPhiSyst[i]->GetTitle());
    TObjArray* objArray = label.Tokenize("-");
    projectionsPhiSyst[i]->SetTitle(Form("%s-%s", objArray->At(0)->GetName(), objArray->At(1)->GetName()));
    
    projectionsPhiSyst[i]->Draw("E2 ][");
    projectionsEtaSyst[i]->Draw("E2 ][ SAME");
    TH1* clone = projectionsPhi[i]->DrawCopy((disableUncertainties) ? "" : "SAME");
    clone->SetLineColor(1);
    clone->GetYaxis()->SetRangeUser(clone->GetMinimum(), clone->GetMaximum() * 1.2);
//     clone->GetXaxis()->SetTitle(Form("%s , %s", clone->GetXaxis()->GetTitle(), "#Delta#eta"));
    clone->GetXaxis()->SetTitle(Form("%s , %s", "#Delta#varphi (rad.)", "#Delta#eta"));
    clone->GetYaxis()->SetTitle(kProjYieldTitlePhiOrEta);
    
    clone = projectionsEta[i]->DrawCopy("SAME");
    clone->SetLineColor(2);

    if (!disableUncertainties)
      DrawLatex(0.3, 0.85, 1, "Scale uncertainty: 20%", 0.04);
    
    DrawLatex(0.3, 0.81, 1, Form("#Delta#varphi projection in |#Delta#eta| < %.2f", 0.8), 0.04);
    DrawLatex(0.3, 0.77, 2, Form("#Delta#eta projection in |#Delta#varphi| < %.2f", 0.87), 0.04);
//     DrawLatex(0.3, 0.75, 1, Form("%s-%s centrality", objArray->At(2)->GetName(), objArray->At(3)->GetName()), 0.04);
    DrawLatex(0.3, 0.73, 1, "0-10% centrality", 0.04);
    
//     return;
  }
  
  if (!disableUncertainties)
    DrawALICELogo(kTRUE, 0.65, 0.5, 0.85, 0.7);
  
  c->SaveAs(Form("ex/%s.png", c->GetName()));
  c->SaveAs(Form("ex/%s.eps", c->GetName()));
}

void DrawFullCentralityDependence(const char* histFileName)
{
  Int_t colors[] = { 1, 2, 5, 4, 3, 6 };
  
  TH1* projectionsPhi[9];
  TH1* projectionsEta[9];
  TH1* projectionsPhiSyst[9];
  TH1* projectionsEtaSyst[9];
  
  Int_t count = 0;
  for (Int_t histId = 0; histId<6; histId++)
  {
    projectionsPhi[count] = 0;
    DrawExample(histFileName, 1, 1, histId, &projectionsPhi[count], &projectionsEta[count], &projectionsPhiSyst[count], &projectionsEtaSyst[count]);
    count++;
  }
  
  TCanvas* c = new TCanvas(Form("centralities_%d", 0), Form("centralities_%d", 0), 800, 400);
  c->Divide(2, 1);
  
  TLegend* legend = new TLegend(0.62, 0.7, 0.88, 0.88);
  legend->SetFillColor(0);
  
  for (Int_t histId = 0; histId<6; histId++)
  {
    if (histId == 2)
      continue;
    
    if (!projectionsPhi[count-6+histId])
      continue;
    
    c->cd(1);
    TH1* clone = projectionsPhi[count-6+histId]->DrawCopy((histId > 0) ? "SAME" : "");
    clone->SetLineColor(colors[histId]);
    
    TString label(clone->GetTitle());
    TObjArray* objArray = label.Tokenize("-");
    clone->SetTitle(Form("%s-%s", objArray->At(0)->GetName(), objArray->At(1)->GetName()));
    
    legend->AddEntry(clone, (objArray->GetEntries() == 4) ? Form("%s-%s", objArray->At(2)->GetName(), objArray->At(3)->GetName()) : objArray->At(2)->GetName(), "L");

    c->cd(2);
    clone = projectionsEta[count-6+histId]->DrawCopy((histId > 0) ? "SAME" : "");
    clone->SetTitle(Form("%s-%s", objArray->At(0)->GetName(), objArray->At(1)->GetName()));
    clone->SetLineColor(colors[histId]);
  }
    
  c->cd(1);
  legend->Draw();
  c->SaveAs(Form("ex/%s.png", c->GetName()));
  c->SaveAs(Form("ex/%s.eps", c->GetName()));
}

void CompareExamples(const char* histFileName1, const char* histFileName2, Int_t i, Int_t j, Int_t histId)
{
  Int_t exColors[] = { 1, 2, 4, 6 };
  
  TCanvas* c = new TCanvas(Form("c_%d", i), Form("c_%d", i), 1000, 600);
  c->Divide(2, 1);
  
  TCanvas* c2 = new TCanvas(Form("c_%d_ratio", i), Form("c_%d_ratio", i), 1000, 600);
  c2->Divide(2, 1);
  
  TH1* projFirst[2];
  
  for (Int_t k=0; k<2; k++)
  {
    if (k == 0)
      TFile::Open(histFileName1);
    else
      TFile::Open(histFileName2);
  
    TH2* hist = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
    if (!hist)
      continue;
//     if (k == 1)
//       hist->Scale(2);
//     hist->Rebin2D(2, 2);

//     new TCanvas; hist->DrawCopy("COLZ"); return;

    
    SubtractEtaGap(hist, kEtaLimit, kOuterLimit, kFALSE);
    
    // new TCanvas; hist->DrawCopy("COLZ");

    TH1* proj1 = 0;
    TH1* proj2 = 0;
    GetProjections(hist, &proj1, &proj2, k);
    
    c->cd(1);
    proj1->SetLineColor(exColors[k]);
    proj1->GetXaxis()->SetRangeUser(-1.49, 1.49);
    proj1->GetYaxis()->SetRangeUser(proj1->GetMinimum() * 1.2, proj1->GetMaximum() * 1.5);
    proj1->DrawCopy((k == 0) ? "" : "SAME");
  
    if (k == 1)
    {
      c2->cd(1);
      proj1->Divide(projFirst[0]);
      proj1->Draw();
      proj1->GetYaxis()->SetRangeUser(0.5, 1.5);
    }
    else
      projFirst[0] = proj1;

    c->cd(2);
    proj2->SetLineColor(exColors[k]);
    proj2->GetXaxis()->SetRangeUser(-1.49, 1.49);
    proj2->GetYaxis()->SetRangeUser(proj2->GetMinimum() * 1.2, proj2->GetMaximum() * 2);
    
    if (0 && k == 1)
    {
      Printf("Scaling!");
      proj2->Scale(projFirst[1]->Integral(projFirst[1]->FindBin(-0.5), projFirst[1]->FindBin(0.5)) / proj2->Integral(projFirst[1]->FindBin(-0.5), projFirst[1]->FindBin(0.5)));
    }
    
    proj2->DrawCopy((k == 0) ? "" : "SAME");

    if (k == 1)
    {
      c2->cd(2);
      proj2->Divide(projFirst[1]);
      proj2->Draw();
      proj2->GetYaxis()->SetRangeUser(0.5, 1.5);
    }
    else
      projFirst[1] = proj2;
  }
}

void TestMomentCode()
{
  Float_t momentLimit = 1;
  TH1* proj = new TH1F("hist", "", 100, -momentLimit, momentLimit);
  TF1* func = new TF1("func", "gaus(0)", -momentLimit, momentLimit);
  func->SetParameters(1, 0, 0.2);
  proj->FillRandom("func", 100000);
  proj->Sumw2();
  proj->Draw();
  
  for (Int_t n=2; n <= 4; n++)
  {
    Float_t moment = 0;
    Float_t sum = 0;
    for (Int_t bin = proj->GetXaxis()->FindBin(-momentLimit); bin <= proj->GetXaxis()->FindBin(momentLimit); bin++)
    {
      moment += proj->GetBinContent(bin) * TMath::Power(proj->GetMean() - proj->GetXaxis()->GetBinCenter(bin), n);
      sum += proj->GetBinContent(bin);
    }
    moment /= sum;
    
    Float_t error = 0;
    for (Int_t bin = proj->GetXaxis()->FindBin(-momentLimit); bin <= proj->GetXaxis()->FindBin(momentLimit); bin++)
    {
      error += proj->GetBinError(bin) * proj->GetBinError(bin) * 
	TMath::Power(TMath::Power(proj->GetMean() - proj->GetXaxis()->GetBinCenter(bin), n) / sum 
	  - moment / sum, 2);
    }
    
    Printf("%d %f +- %f <-> %f +- %f", n, moment, TMath::Sqrt(error), proj->GetRMS() * proj->GetRMS(), 2 * proj->GetRMSError() / proj->GetRMS() * proj->GetRMS() * proj->GetRMS());
  }
}

void CompareGraph(const char* fileName1, const char* fileName2, Int_t graph, Int_t centrality)
{
  ReadGraphs(fileName1);
  TGraphErrors* graph1 = (TGraphErrors*) graphs[graph][centrality]->Clone("graph1");
  
  ReadGraphs(fileName2);
  TGraphErrors* graph2 = (TGraphErrors*) graphs[graph][centrality]->Clone("graph2");
  
  graph1->Sort();
  graph2->Sort();
  
  TCanvas* c = new TCanvas(Form("%s_%s", fileName1, fileName2), Form("%s_%s", fileName1, fileName2), 800, 800);
  c->Divide(1, 2);
  
  c->cd(1);
  gPad->SetGridx();
  gPad->SetGridy();
  graph1->SetMarkerStyle(24);
  graph1->GetXaxis()->SetRangeUser(7, 38);
  graph1->DrawClone("AP");
  graph2->SetLineColor(2);
  graph2->SetMarkerColor(2);
  graph2->SetMarkerStyle(25);
  graph2->DrawClone("PSAME");
  
  c->cd(2);
  gPad->SetGridx();
  gPad->SetGridy();
  DivideGraphs(graph1, graph2);
  graph1->DrawClone("AP");
}

void Compare2D(const char* fileName1, const char* fileName2, const char* histName)
{
  TFile::Open(fileName1);
  TH1* hist1 = (TH1*) gFile->Get(histName);

  TFile::Open(fileName2);
  TH1* hist2 = (TH1*) gFile->Get(histName);
  
  hist1->Divide(hist2);
  hist1->GetZaxis()->SetRangeUser(0.5, 1.5);
  hist1->Draw("COLZ");
}

void TestTwoGaussian()
{
//   TF1* func = new TF1("func", "[0]/TMath::Sqrt(TMath::TwoPi())/[2]*exp(-0.5*((x-[1])/[2])**2) + [3]/TMath::Sqrt(TMath::TwoPi())/[5]*exp(-0.5*((x-[4])/[5])**2)", -2, 2);
  TF1* func = new TF1("func", "[0]*exp(-0.5*((x-[1])/[2])**2) + [3]*exp(-0.5*((x-[4])/[5])**2)", -2, 2);
  func->SetParameters(0.25, 0, 0.5, 0.75, 0, 0.2);
  
  TH1* hist = new TH1F("hist", "", 100, -2, 2);
  hist->FillRandom("func", 10000000);
  
  hist->Draw();
  
  TH1* proj = hist;
  
  Float_t momentLimit = 1.99;
  for (Int_t n=2; n <= 4; n++)
  {
    Float_t moment = 0;
    Float_t sum = 0;
    for (Int_t bin = proj->GetXaxis()->FindBin(-momentLimit); bin <= proj->GetXaxis()->FindBin(momentLimit); bin++)
    {
      moment += proj->GetBinContent(bin) * TMath::Power(proj->GetMean() - proj->GetXaxis()->GetBinCenter(bin), n);
      sum += proj->GetBinContent(bin);
    }
    moment /= sum;
    
    Float_t error = 0;
    for (Int_t bin = proj->GetXaxis()->FindBin(-momentLimit); bin <= proj->GetXaxis()->FindBin(momentLimit); bin++)
    {
      error += proj->GetBinError(bin) * proj->GetBinError(bin) * 
	TMath::Power(TMath::Power(proj->GetMean() - proj->GetXaxis()->GetBinCenter(bin), n) / sum 
	  - moment / sum, 2);
    }
    
    Printf("%d %f %f", n, moment, TMath::Sqrt(error));
  }
}

void DrawEtaGapExample(const char* histFileName, Int_t i = 2, Int_t j = 2, Int_t histId = 0)
{
  Float_t etaLimit = kEtaLimit;
  Float_t outerLimit = kOuterLimit;
  Float_t projectLimit = 0.8;

  TFile::Open(histFileName);

  TH2* hist = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", i, j, histId));
  if (!hist)
    return;
  hist->GetZaxis()->SetTitle(kCorrFuncTitle);
  hist->GetZaxis()->SetTitleOffset(1.8);
  // NOTE fix normalization. these 2d correlations come out of AliUEHist normalized by dphi bin width, but not deta
  hist->Scale(1.0 / hist->GetYaxis()->GetBinWidth(1));
  
  TCanvas* c = new TCanvas("c", "c", 800, 800);
  gPad->SetLeftMargin(0.15);
  TH2* clone = (TH2*) hist->DrawCopy("SURF1");
  clone->SetTitle("");
  clone->GetYaxis()->SetRangeUser(-1.59, 1.59);
  clone->GetXaxis()->SetTitleOffset(1.5);
  clone->GetYaxis()->SetTitleOffset(2);
  clone->SetStats(kFALSE);
//   clone->Rebin2D(2, 2);
//   clone->Scale(0.25);
//   DrawALICELogo(kTRUE, 0.7, 0.7, 0.9, 0.9);
  c->SaveAs("note/etagap_raw.eps");
  c->SaveAs("note/etagap_raw.png");
  
  SubtractEtaGap(hist, etaLimit, outerLimit, kFALSE, kTRUE);
  
  c = new TCanvas("c3", "c3", 800, 800);
  gPad->SetLeftMargin(0.13);
  TH1* proj = hist->ProjectionX(Form("%s_proj1%d", hist->GetName(), 0), hist->GetYaxis()->FindBin(-projectLimit+0.01), hist->GetYaxis()->FindBin(projectLimit-0.01));
  proj->GetXaxis()->SetRangeUser(-1.49, 1.49);
  proj->SetStats(0);
  proj->GetXaxis()->SetTitle(Form("%s , %s", proj->GetXaxis()->GetTitle(), "#Delta#eta"));
  proj->GetYaxis()->SetRangeUser(proj->GetMinimum() * 1.2, proj->GetMaximum() * 1.5);
  proj->GetYaxis()->SetTitle(kProjYieldTitlePhiOrEta);
  proj->GetYaxis()->SetTitleOffset(1.6);
  proj->Draw("");

  proj = hist->ProjectionY(Form("%s_proj2_%d", hist->GetName(), 0), hist->GetXaxis()->FindBin(-projectLimit+0.01), hist->GetXaxis()->FindBin(projectLimit-0.01));
  proj->GetXaxis()->SetRangeUser(-1.49, 1.49);
  proj->GetYaxis()->SetRangeUser(proj->GetMinimum() * 1.2, proj->GetMaximum() * 2);
  proj->SetLineColor(2);
  proj->Draw("SAME");
  DrawLatex(0.2, 0.85, 1, Form("#Delta#varphi projection in |#Delta#eta| < %.2f", projectLimit), 0.04);
  DrawLatex(0.2, 0.80, 2, Form("#Delta#eta projection in |#Delta#varphi| < %.2f", projectLimit), 0.04);
//   DrawALICELogo(kTRUE, 0.7, 0.65, 0.9, 0.85);
  c->SaveAs("note/etagap_subtracted_proj.eps");
  c->SaveAs("note/etagap_subtracted_proj.png");

  c = new TCanvas("c2", "c2", 800, 800);
  gPad->SetLeftMargin(0.15);
  hist->SetTitle("");
  hist->GetYaxis()->SetRangeUser(-1.59, 1.59);
  hist->GetXaxis()->SetTitleOffset(1.5);
  hist->GetYaxis()->SetTitleOffset(2);
  hist->SetStats(kFALSE);
//   hist->Rebin2D(2, 2);
//   hist->Scale(0.25);
  hist->Draw("SURF1");
//   DrawALICELogo(kTRUE, 0.7, 0.7, 0.9, 0.9);
  c->SaveAs("note/etagap_subtracted.eps");
  c->SaveAs("note/etagap_subtracted.png");
}

void WingToy(Float_t centralityBegin, Float_t centralityEnd, Float_t trigBegin, Float_t trigEnd, Float_t assocBegin, Float_t assocEnd)
{
  // calculate same/mixed event in absence of physical correlations
  
  TFile::Open("yields_120501.root");
  TH3* hist = (TH3*) gFile->Get("fYields");
  hist->Scale(1.0 / 8891e3);
  
  TH1* same = new TH1D("same", "", 41, -2.05, 2.05);
  TH1* mixed = new TH1D("mixed", "", 41, -2.05, 2.05);
  
  TH1* etaDistArrTrig[hist->GetNbinsX()+1];
  TH1* etaDistArrAssoc[hist->GetNbinsX()+1];
  for (Int_t i=1; i<=hist->GetNbinsX(); i++)
  {
    hist->GetXaxis()->SetRange(i, i);
    hist->GetYaxis()->SetRangeUser(trigBegin+0.01, trigEnd-0.01);
    etaDistArrTrig[i] = hist->Project3D(Form("z%d", i*2));
    hist->GetYaxis()->SetRangeUser(assocBegin+0.01, assocEnd-0.01);
    etaDistArrAssoc[i] = hist->Project3D(Form("z%d", i*2+1));
  }
  
  new TCanvas;
  etaDistArrTrig[1]->DrawCopy()->Scale(1.0 / etaDistArrTrig[1]->Integral());
  etaDistArrTrig[20]->SetLineColor(2); etaDistArrTrig[20]->DrawCopy("SAME")->Scale(1.0 / etaDistArrTrig[20]->Integral());
  etaDistArrTrig[70]->SetLineColor(4); etaDistArrTrig[70]->DrawCopy("SAME")->Scale(1.0 / etaDistArrTrig[70]->Integral());
  
  TH1* lastEtaDist = 0;
//   Float_t lastFactor = 0;
  Int_t nEvents = 5000;
  for (Int_t i=0; i<nEvents; i++)
  {
    if (i % 1000 == 0)
      Printf("%d", i);
    Float_t centrality = gRandom->Uniform(centralityBegin, centralityEnd);
//     Printf("centrality %f", centrality);
    
    TH1* etaDistTrig = etaDistArrTrig[hist->GetYaxis()->FindBin(centrality)];
    TH1* etaDistAssoc = etaDistArrAssoc[hist->GetYaxis()->FindBin(centrality)];
//     TH1* etaDist = etaDistArr[1];
//     Float_t factor = etaDistArr[hist->GetYaxis()->FindBin(centrality)]->Integral() / etaDistArr[1]->Integral();
//     Printf("%f", factor);
//     new TCanvas; etaDistTrig->Draw(); etaDistAssoc->Draw("SAME"); etaDistAssoc->SetLineColor(2); return;
    
    // convolution, same
    for (Int_t j=1; j<=etaDistTrig->GetNbinsX(); j++)
      for (Int_t k=1; k<=etaDistAssoc->GetNbinsX(); k++)
      {
	Double_t weight = etaDistTrig->GetBinContent(j) * etaDistAssoc->GetBinContent(k);
	Double_t deltaEta = etaDistTrig->GetBinCenter(j) - etaDistAssoc->GetBinCenter(k);
// 	Printf("%f", deltaEta);
	
	same->Fill(deltaEta, weight);
      }
      
    // convolution, mixed
    if (lastEtaDist)
    {
      for (Int_t j=1; j<=etaDistTrig->GetNbinsX(); j++)
	for (Int_t k=1; k<=lastEtaDist->GetNbinsX(); k++)
	{
	  Double_t weight = etaDistTrig->GetBinContent(j) * lastEtaDist->GetBinContent(k);
	  Double_t deltaEta = etaDistTrig->GetBinCenter(j) - lastEtaDist->GetBinCenter(k);
	  
	  mixed->Fill(deltaEta, weight);
	}
    }
    lastEtaDist = etaDistAssoc;
//     lastFactor = factor;
    
//     break;
  }
  
  same->Scale(1.0 / nEvents);
  mixed->Scale(1.0 / (nEvents - 1));
  
  same->GetXaxis()->SetRangeUser(-1.6, 1.6);
  new TCanvas; same->DrawCopy(); mixed->SetLineColor(2); mixed->DrawCopy("SAME");
  new TCanvas; same->Divide(mixed); same->Draw();
}

void WingToyUntriggered(Float_t centralityBegin, Float_t centralityEnd)
{
  // calculate same/mixed event in absence of physical correlations
  
  TFile::Open("EtaCent.root");
  TH2* hist = (TH2*) gFile->Get("hist");
  hist->Scale(1e-7 * 500);
  
/*  TH1* same = new TH1D("same", "", 201, -2.01, 2.01);
  TH1* mixed = new TH1D("mixed", "", 201, -2.01, 2.01);*/
  TH1* same = new TH1D("same", "", 41, -2.05, 2.05);
  TH1* mixed = new TH1D("mixed", "", 41, -2.05, 2.05);
  
  TH1* etaDistArr[hist->GetNbinsY()+1];
  for (Int_t i=1; i<=hist->GetNbinsY(); i++)
  {
    etaDistArr[i] = hist->ProjectionX(Form("etaDist_%d", i), i, i);
    etaDistArr[i]->Rebin(5);
  }
  
  TH1* lastEtaDist = 0;
//   Float_t lastFactor = 0;
  Int_t nEvents = 1000;
  for (Int_t i=0; i<nEvents; i++)
  {
    if (i % 1000 == 0)
      Printf("%d", i);
    Float_t centrality = gRandom->Uniform(centralityBegin, centralityEnd);
//     Printf("centrality %f", centrality);
    
    TH1* etaDist = etaDistArr[hist->GetYaxis()->FindBin(centrality)];
//     TH1* etaDist = etaDistArr[1];
//     Float_t factor = etaDistArr[hist->GetYaxis()->FindBin(centrality)]->Integral() / etaDistArr[1]->Integral();
//     Printf("%f", factor);
//     new TCanvas; etaDist->Draw();
    
    // convolution, same
    for (Int_t j=1; j<=etaDist->GetNbinsX(); j++)
      for (Int_t k=1; k<=etaDist->GetNbinsX(); k++)
      {
	Double_t weight = etaDist->GetBinContent(j) * etaDist->GetBinContent(k);
	Double_t deltaEta = etaDist->GetBinCenter(j) - etaDist->GetBinCenter(k);
// 	Printf("%f", deltaEta);
	
	same->Fill(deltaEta, weight);
      }
      
    // convolution, mixed
    if (lastEtaDist)
    {
      for (Int_t j=1; j<=etaDist->GetNbinsX(); j++)
	for (Int_t k=1; k<=etaDist->GetNbinsX(); k++)
	{
	  Double_t weight = etaDist->GetBinContent(j) * lastEtaDist->GetBinContent(k);
	  Double_t deltaEta = etaDist->GetBinCenter(j) - lastEtaDist->GetBinCenter(k);
	  
	  mixed->Fill(deltaEta, weight);
	}
    }
    lastEtaDist = etaDist;
//     lastFactor = factor;
    
//     break;
  }
  
  same->Scale(1.0 / nEvents);
  mixed->Scale(1.0 / (nEvents - 1));
  
  same->GetXaxis()->SetRangeUser(-1.8, 1.8);
  new TCanvas; same->DrawCopy(); mixed->SetLineColor(2); mixed->DrawCopy("SAME");
  new TCanvas; same->Divide(mixed); same->Draw();
}

void RapidityToy()
{
  // calculate effect on same and mixed event due to pseudorapidity dip at 0 from flat rapidity
  
  TH1* same = new TH1D("same", "", 201, -2.01, 2.01);
  TH1* mixed = new TH1D("mixed", "", 201, -2.01, 2.01);
  
  TH1* etaDist = new TH1D("etaDist", "", 201, -2.01, 2.01);

  TF1* yToEta = new TF1("yToEta", "acosh((exp(-x)*sqrt([0]^4 - 2*exp(2*x)*[0]^4 + exp(4*x)*[0]^4 + 2*[0]^2*[1]^2 + 2*exp(4*x)*[0]^2*[1]^2 + [1]^4 + 2*exp(2*x)*[1]^4 + exp(4*x)*[1]^4))/([1]*sqrt(4*[0]^2 + 4*[1]^2)))");
  Double_t pt = 1.5;
//   Double_t mass = 1;
    Double_t mass = 0.140;
  yToEta->SetParameters(mass, pt);
    
  Int_t nEvents = 1000000;
  Double_t lastEta = 0;
  for (Int_t i=0; i<nEvents; i++)
  {
    if (i % 10000 == 0)
      Printf("%d", i);
    
    Double_t y = gRandom->Uniform(-3, 3);
    
    Double_t eta = yToEta->Eval(y);
    if (y < 0)
      eta *= -1;
    etaDist->Fill(eta);
    
    Double_t y2 = y + gRandom->Gaus(0, 0.5);
    Double_t eta2 = yToEta->Eval(y2);
    if (y2 < 0)
      eta2 *= -1;
    
    if (abs(eta) < 1 && abs(eta2) < 1)
      same->Fill(eta - eta2);
    if (i > 0 && abs(lastEta) < 1 && abs(eta2) < 1)
      mixed->Fill(lastEta - eta2);
    lastEta = eta;
  }

  new TCanvas; etaDist->Draw();

  same->Scale(1.0 / nEvents);
  mixed->Scale(1.0 / (nEvents - 1));
  
  same->GetXaxis()->SetRangeUser(-1.8, 1.8);
  new TCanvas; same->DrawCopy(); mixed->SetLineColor(2); mixed->DrawCopy("SAME");
  new TCanvas; same->Divide(mixed); same->Draw();
}

void v2DependencyToy(const char* outputFileName = "hist.root")
{
  TCanvas* c1 = new TCanvas("c1", "Fit", 800, 600);
  TCanvas* c2 = new TCanvas("c2", "Correlation", 1400, 1600);
  TCanvas* c3 = new TCanvas("c3", "dphi", 1400, 1600);
  TCanvas* c4 = new TCanvas("c4", "deta", 1400, 1600);
  c2->Divide(3,3);
  c3->Divide(3,3);
  c4->Divide(3,3);
  TFile::Open(outputFileName, "RECREATE");

  Double_t eta[] = { -3.25, -2.75, -2.25, -1.75, -1.25, -0.75, -0.25, 0.25, 0.75, 1.25, 1.75, 2.25, 2.75, 3.25, 3.75, 4.25, 4.75 };
  Double_t v20[] = { 0.0178046, 0.0210719, 0.0241588, 0.0228301, 0.0224484, 0.0224698, 0.0228943, 0.0228137, 0.0226188, 0.0220402, 0.0225268, 0.0231524, 0.0209274, 0.0190223, 0.0171396, 0.015942, 0.01385 } ;
  Double_t v2_err0[] = { 0.00188915, 0.00223662, 0.00256323, 0.00153577, 0.00158735, 0.00158886, 0.00161888, 0.00161319, 0.00159943, 0.00155848, 0.00155241, 0.00245647, 0.00222054, 0.00201772, 0.00181847, 0.00169292, 0.00147159 };
  Double_t v21[] = { 0.0289574, 0.0329946, 0.0376679, 0.0359883, 0.0357591, 0.0363211, 0.037169, 0.037344, 0.0365328, 0.0352206, 0.0360468, 0.036063, 0.03326, 0.0310704, 0.0278479, 0.0260765, 0.0233602 };
  Double_t v2_err1[] = { 0.00307179, 0.00350245, 0.0039966, 0.00246431, 0.00252859, 0.00256839, 0.00262837, 0.00264062, 0.00258332, 0.0024905, 0.00242361, 0.00382609, 0.00352801, 0.00329574, 0.00295455, 0.00276704, 0.00247998 };
  Double_t v22[] = { 0.0421916, 0.046932, 0.0529053, 0.0505833, 0.0507496, 0.0521991, 0.0535482, 0.0533636, 0.0525199, 0.0505711, 0.0501678, 0.0510414, 0.0470683, 0.0445314, 0.0399421, 0.0372192, 0.0335714 };
  Double_t v2_err2[] = { 0.00447529, 0.00498069, 0.00561346, 0.00350182, 0.00358878, 0.00369109, 0.00378656, 0.00377339, 0.00371389, 0.00357593, 0.00345671, 0.00541562, 0.00499257, 0.00472346, 0.00423742, 0.00394818, 0.00356289 };
  Double_t v23[] = { 0.0535116, 0.0592228, 0.0667268, 0.0643815, 0.0648137, 0.0671077, 0.0689489, 0.0688137, 0.0674753, 0.0649329, 0.064237, 0.0644013, 0.0597028, 0.0561042, 0.0504783, 0.0469539, 0.0432138 };
  Double_t v2_err3[] = { 0.00567636, 0.00628471, 0.0070801, 0.0044467, 0.00458304, 0.00474525, 0.0048755, 0.00486587, 0.00477138, 0.00459154, 0.00440783, 0.00683316, 0.00633296, 0.00595079, 0.00535544, 0.00498189, 0.00458449 };
  Double_t v24[] = { 0.0601229, 0.0657066, 0.0732884, 0.0714449, 0.0732558, 0.0757839, 0.0775992, 0.0777084, 0.0759983, 0.072938, 0.07129, 0.0714013, 0.0660398, 0.0622241, 0.0556125, 0.0515049, 0.0467412 };
  Double_t v2_err4[] = { 0.0063779, 0.00697181, 0.00777585, 0.00498088, 0.00518037, 0.00535884, 0.00548712, 0.00549488, 0.00537406, 0.00515754, 0.00498184, 0.00757661, 0.00700521, 0.00660028, 0.00590042, 0.00546399, 0.00495893 };
  Double_t v25[] = { 0.0606421, 0.0666128, 0.0747658, 0.0732977, 0.0758675, 0.0785067, 0.0804069, 0.0804495, 0.078766, 0.0756848, 0.0737924, 0.0727082, 0.0669812, 0.0627843, 0.0550477, 0.0503637, 0.0455578 };
  Double_t v2_err5[] = { 0.00643316, 0.00706748, 0.0079338, 0.00510717, 0.00536486, 0.00555131, 0.00568569, 0.00568868, 0.00556979, 0.00535181, 0.00512039, 0.00771524, 0.00710494, 0.00665958, 0.005842, 0.00534359, 0.00483393 };
  Double_t v26[] = { 0.0558427, 0.0622843, 0.069759, 0.0699102, 0.0726565, 0.0752472, 0.0772998, 0.0769496, 0.0747283, 0.0731016, 0.0692551, 0.0687594, 0.0630636, 0.0587596, 0.0476679, 0.0433981, 0.0384033 };
  Double_t v2_err6[] = { 0.00592555, 0.00660726, 0.00740837, 0.00497262, 0.00513763, 0.00532121, 0.00546618, 0.00544116, 0.00528409, 0.00516934, 0.0047711, 0.00730395, 0.00668902, 0.0062329, 0.00506006, 0.00460362, 0.00407592 };
  Double_t v27[] = { 0.0485678, 0.0522194, 0.0614082, 0.0617957, 0.067403, 0.069292, 0.0694255, 0.071401, 0.0675572, 0.0677939, 0.0619343, 0.0545356, 0.0462625, 0.0492458, 0.0383392, 0.0321335, 0.0300904 } ;
  Double_t v2_err7[] = { 0.00549521, 0.00590814, 0.0069551, 0.00481929, 0.00524359, 0.00538968, 0.00540076, 0.00555398, 0.00525709, 0.00527562, 0.00471932, 0.0062522, 0.0052376, 0.00557231, 0.00435881, 0.0036367, 0.00340626 };
  Double_t v28[] = { 0.0376917, 0.0425199, 0.0485303, 0.0491033, 0.0579609, 0.0625405, 0.0625229, 0.0626231, 0.0624147, 0.0586143, 0.0527063, 0.0536474, 0.0399211, 0.0385768, 0.0259235, 0.0213431, 0.019931 };
  Double_t v2_err8[] = { 0.00432739, 0.00481277, 0.0054979, 0.00406909, 0.00451077, 0.00486628, 0.00486314, 0.00487131, 0.00485474, 0.00455912, 0.00385339, 0.00611525, 0.00451861, 0.00436453, 0.0029794, 0.00241472, 0.00229507 };
  Double_t v2[9][17];
  Double_t v2_err[9][17];
  for (Int_t i=0;i<17;i++)
  { 
    v2[0][i]=v20[i];
    v2[1][i]=v21[i];
    v2[2][i]=v22[i];
    v2[3][i]=v23[i];
    v2[4][i]=v24[i];
    v2[5][i]=v25[i];
    v2[6][i]=v26[i];
    v2[7][i]=v27[i];
    v2[8][i]=v28[i];
    v2_err[0][i]=v2_err0[i];
    v2_err[1][i]=v2_err1[i];
    v2_err[2][i]=v2_err2[i];
    v2_err[3][i]=v2_err3[i];
    v2_err[4][i]=v2_err4[i];
    v2_err[5][i]=v2_err5[i];
    v2_err[6][i]=v2_err6[i];
    v2_err[7][i]=v2_err7[i];
    v2_err[8][i]=v2_err8[i];
  }
  TH2D* hist = new TH2D("hist","hist",30,-TMath::Pi(),TMath::Pi(),30,-1.8,1.8);
  TH2D* hist2 = new TH2D("hist2","hist2",30,-TMath::Pi(),TMath::Pi(),30,-1.8,1.8);
  for(Int_t i=0; i<9; i++)
  {
    cerr << i << ". entrality bin" << endl;
    TGraphErrors* gr = new TGraphErrors(17, eta, v2[i], 0, v2_err[i]);
    gr->SetMarkerStyle(28-i);
    gr->SetMarkerColor((i==4) ? 15 :9-i);
    gr->SetLineColor((i==4) ? 15 :9-i);
    gr->GetXaxis()->SetRangeUser(-1.3,1.3);
    gr->GetYaxis()->SetRangeUser(0,0.1);
    c1->cd();
    gr->DrawClone((i==0) ? "AP" : "PSAME");
    for (Int_t j=0;j<17;j++)
    {
      if (TMath::Abs(gr->GetX()[j])>1)
        gr->SetPoint(j,gr->GetX()[j],gr->GetY()[j]-gr->GetErrorY(j));
      else if (TMath::Abs(gr->GetX()[j])<0.5)
        gr->SetPoint(j,gr->GetX()[j],gr->GetY()[j]+gr->GetErrorY(j));
      gr->SetPointError(j,0,0);
    }
    gr->DrawClone("PSAME");
    TF1* func = new TF1("func","[0]+[1]*x+[2]*x**2", -1.3,1.3);
    gr->Fit(func,"R","");  
    func->SetLineColor(gr->GetLineColor());
    func->Draw("SAME");
    hist->Reset();
    hist2->Reset();
    TF1* funcArray[30];
    for (Int_t j=0;j<30;j++)
    {
      TF1* func2 = new TF1("func2","1+[0]*2*TMath::Cos(2*x)",-TMath::Pi(),TMath::Pi());
      func2->FixParameter(0,func->Eval(-0.9+j*0.06));
      funcArray[j] = func2;
    }
    Int_t nPart = 10;
    Double_t eta1[nPart];
    Double_t phi1[nPart];
    Double_t phi1m[nPart];
    for (Int_t j=0; j<nPart;j++)
    {
      eta1[j] = gRandom->Uniform(-0.9, 0.9);
      Int_t funcIndex = (Int_t) ((eta1[j]+0.9)/1.8*30);
      phi1[j] = funcArray[(funcIndex!=30) ? funcIndex: 29]->GetRandom();
      phi1m[j] = gRandom->Uniform(-TMath::Pi(),TMath::Pi());
    }
    for (Int_t j=0; j<nPart;j++)
    {
      if (j%1000==0) cerr << j << "\t";
      for (Int_t k=j+1; k<nPart;k++)
      {
        Double_t dphi = phi1[j]-phi1[k];
        Double_t dphim = phi1m[j]-phi1m[k];
        if (dphi > TMath::Pi()) dphi = dphi - TMath::TwoPi();
        else if (dphi < -TMath::Pi()) dphi = dphi + TMath::TwoPi();
        if (dphim > TMath::Pi()) dphim = dphim - TMath::TwoPi();
        else if (dphim < -TMath::Pi()) dphim = dphim + TMath::TwoPi();
        Double_t deta = eta1[j]-eta1[k];
        hist->Fill(dphi,deta);
        hist2->Fill(dphim,deta);
      }
    }
    hist->Sumw2();
    hist2->Sumw2();
    hist->Divide(hist2);
    hist->GetXaxis()->SetTitle(Form("#Delta#varphi"));
    hist->GetYaxis()->SetTitle(Form("#Delta#eta"));
    cout << endl;
    c2->cd(i+1);
    hist->DrawCopy("SURF1");
    hist->Write(Form("hist_%d", i));
    c3->cd(i+1);
    TH1* projPhi = hist->ProjectionX("dphi projection");
    projPhi->Scale(1.0/projPhi->GetNbinsX());
    projPhi->DrawCopy();
    projPhi->Write(Form("projPhi_%d", i));
    c4->cd(i+1);
    TH1D* projEta = hist->ProjectionY("deta projection",hist->GetXaxis()->FindBin(-1),hist->GetXaxis()->FindBin(1));
    Float_t etaBins = hist->GetXaxis()->FindBin(1) - hist->GetXaxis()->FindBin(-1) + 1;
    projEta->Scale(1.0/etaBins);
    projEta->DrawCopy();
    projEta->Write(Form("projEta_%d", i));
  }
  gFile->Close();
}

void v2DependencyToy2(const char* DataFileName, const char* ToyFileName, const char* outputFileName = "hist1.root")
{
  Int_t ptId = 0;
  Int_t maxLeadingPt = 4;
  Int_t maxAssocPt = 6;

  new TCanvas("c1", "", 800, 600);

  TFile* inputToy = TFile::Open(ToyFileName);
  TFile* inputData = TFile::Open(DataFileName);
  TFile* output = TFile::Open(outputFileName, "RECREATE");

  TH2* histToy = (TH2*) inputToy->Get(Form("projEta_6"));
  histToy->GetYaxis()->SetRangeUser(0.9994,1.006);
  histToy->Draw();
  histToy->Fit("pol2","I","SAME");
  TF1* func = new TF1("func","pol2",-1.8,1.8);
  func->SetParameter(0,1-(histToy->GetFunction("pol2")->GetParameter(0)-1));
  func->SetParameter(1,-histToy->GetFunction("pol2")->GetParameter(1));
  func->SetParameter(2,-histToy->GetFunction("pol2")->GetParameter(2));
  func->Draw("SAME");
  for (Int_t i=0; i<maxLeadingPt; i++)
  {
    for (Int_t j=1; j<maxAssocPt; j++)
    {
      // only process when first is filled
      TH2* histData = (TH2*) inputData->Get(Form("dphi_%d_%d_%d", i, j+1, 0));
      if (!histData)
        continue;
      if (histData->GetEntries() < 1e4)
      {
        Printf("%d %d Only %f entries. Skipping...", i, j, histData->GetEntries());
        continue;
      }
      ptId = i*(maxAssocPt-1)+j-1;
      if (SkipGraph(ptId))
        continue;
      for (Int_t histId = 0; histId < NHists; histId++)
      {
        histData = (TH2*) inputData->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
        if (!histData)
          continue;

        if (histData->GetEntries() < 1e4)
        {
          Printf("%d %d %d Only %f entries. Skipping...", i, j, histId, histData->GetEntries());
          continue;
        }
        for (Int_t x=1; x<=histData->GetNbinsX();x++)
        {
          for (Int_t y=1; y<=histData->GetNbinsY();y++)
          {
            Float_t content = histData->GetBinContent(x,y);
            histData->SetBinContent(x,y,content*func->Eval(histData->GetYaxis()->GetBinCenter(y)));
          }
        }
        histData->Write(Form("dphi_%d_%d_%d", i, j+1, histId));
      }
    }
  }
  output->Close();
}

void DrawResults()
{
  const char* mainFile = "graphs_131112.root";
  const char* wingFile = "graphs_131112_wingremoved.root";
  const char* hijing = "graphs_hijing_120515.root";
  const char* ampt = "graph_ampt_120516.root";
  
  drawLogo = 1;
//   DrawResultsCentrality(mainFile, wingFile); return;
//   MCLabel = "Data  HIJING 1.36 / Pythia 6 P-0"; MCComparison(mainFile, wingFile, hijing, 0); return;

  gROOT->SetBatch(kTRUE);

  const char* folder = "";
  for (Int_t i=0; i<2; i++)
  {
    if (i == 1)
    {
      skipGraphList[0] = 5;
      skipGraphList[1] = 10;
      folder = "reduced/";
    }

    fitLabel = "fit";
    fgFolder.Form("results/%s%s", folder, "results");
    DrawResultsCentrality(mainFile, wingFile);
    
    fitLabel = "2^{nd} fit";
    fgFolder.Form("results/%s%s", folder, "results-method2");
    DrawResultsCentrality(mainFile, wingFile, 16);

    fitLabel = "fit";
    MCLabel = "Data  HIJING 1.36 / Pythia 6 P-0";
    fgFolder.Form("results/%s%s", folder, "hijing");
    MCComparison(mainFile, wingFile, hijing, 0);

    fitLabel = "2^{nd} fit";
    fgFolder.Form("results/%s%s", folder, "hijing-method2");
    MCComparison(mainFile, wingFile, hijing, 0, 16);
    
    fitLabel = "fit";
    MCLabel = "Data  AMPT 2.25 / Pythia 6 P-0";
    fgFolder.Form("results/%s%s", folder, "ampt");
    MCComparison(mainFile, wingFile, ampt, 0);
    
    fitLabel = "2^{nd} fit";
    fgFolder.Form("results/%s%s", folder, "ampt-method2");
    MCComparison(mainFile, wingFile, ampt, 0, 16);
  }
}

void DrawAllMCComparisons()
{
  const char* mainFile = "graphs_131112.root";
  const char* wingFile = "graphs_131112_wingremoved.root";
  const char* hijing = "graphs_hijing_131122.root";
  const char* ampt2 = "graphs_ampt_norescattering_131115.root";
  const char* ampt3 = "graphs_ampt_default_131115.root";
  const char* ampt4 = "graphs_ampt_nostringmelting_131115.root";
  const char* ampt5 = "graphs_ampt_tuned_131115.root";

//   drawLogo = 1;
//   DrawResultsCentrality(mainFile, wingFile); return;
//   MCLabel = "Data  HIJING 1.36 / Pythia 6 P-0"; MCComparison(mainFile, wingFile, hijing, 0); return;

  gROOT->SetBatch(kTRUE);

//   skipGraphList[0] = 5;
//   skipGraphList[1] = 10;

  MCLabel = "Data  HIJING / Pythia 6 P-0";
  fgFolder.Form("results/%s", "hijing");
  MCComparison(mainFile, wingFile, hijing, 0);

  MCLabel = "Data  AMPT melting / Pythia 6 P-0";
  fgFolder.Form("results/%s", "ampt-norescattering");
  MCComparison(mainFile, wingFile, ampt2, 0);

  MCLabel = "Data  AMPT melting + resc / Pythia 6 P-0";
  fgFolder.Form("results/%s", "ampt-default");
  MCComparison(mainFile, wingFile, ampt3, 0);

  MCLabel = "Data  AMPT resc / Pythia 6 P-0";
  fgFolder.Form("results/%s", "ampt-nostringmelting");
  MCComparison(mainFile, wingFile, ampt4, 0);

  MCLabel = "Data  AMPT melting + resc 50% flow / Pythia 6 P-0";
  fgFolder.Form("results/%s", "ampt-tuned");
  MCComparison(mainFile, wingFile, ampt5, 0);
  
}

void CalculateIAA(const char* GraphFileName, const char* HistFileName, const char* outputFileName = "graphs.root")
{
  CreateGraphStructure();
  TFile* GraphFile = TFile::Open(GraphFileName);
  for (Int_t i=0; i<NGraphs; i++)
    for (Int_t j=0; j<NHists; j++)
    {
      if (i >= 32) continue;
      graphs[i][j] = (TGraphErrors*) GraphFile->Get(Form("graph_%d_%d", i, j));
    }

  Float_t IAA = 0;
  Float_t normP = 0;
  Float_t YerrorP = 0;
  Int_t ptId = 0;

  bool protonPoint = false;

  for (ptId = 0; ptId < NHists; ptId++)
  {
    if (SkipGraph(ptId))
      continue;
    for (Int_t i=0; i<graphs[0][ptId]->GetN(); i++)
      if (graphs[0][ptId]->GetX()[i] == 100)
      {
        normP = graphs[0][ptId]->GetY()[i];
        YerrorP = graphs[0][ptId]->GetErrorY(i);
        protonPoint = true;
      }
    for (Int_t i=0; i<graphs[0][ptId]->GetN() && protonPoint == true; i++)
    {
      IAA = (graphs[0][ptId]->GetY()[i])/normP;
      AddPoint(graphs[32][ptId], graphs[0][ptId]->GetX()[i], IAA, graphs[0][ptId]->GetErrorX(i), sqrt(graphs[0][ptId]->GetErrorY(i)/graphs[0][ptId]->GetY()[i]*graphs[0][ptId]->GetErrorY(i)/graphs[0][ptId]->GetY()[i]+YerrorP/normP*YerrorP/normP)*graphs[0][ptId]->GetY()[i]/normP);
    }
    protonPoint = false;
    graphs[32][ptId]->SetTitle(graphs[0][ptId]->GetTitle());
  }
  cout << "IAAFit graph created." << endl;



  TFile::Open(HistFileName);
  Int_t maxLeadingPt = 4;
  Int_t maxAssocPt = 6;

  Float_t etaLimit = kEtaLimit;
  Float_t outerLimit = kOuterLimit;

  Double_t integral = 0;
  Double_t error = 0;

  Float_t centralityAxisMapping[] = { 5, 65, 100, 30, 15, 50 };
  Float_t centralityAxisMappingE[] = { 5, 5, 0, 10, 5, 10 };

  for (Int_t i=0; i<maxLeadingPt; i++)
  {
    for (Int_t j=1; j<maxAssocPt; j++)
    {
      // only process when first is filled
      TH2* hist = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", i, j+1, 0));
      if (!hist)
        continue;
//      if (hist->GetEntries() < 10)
      if (hist->GetEntries() < 1e4)
      {
        Printf("%d %d Only %f entries. Skipping...", i, j, hist->GetEntries());
//        continue;
      }
      ptId = i*(maxAssocPt-1)+j-1;
      if (SkipGraph(ptId))
        continue;
      Int_t k=0;
      for (Int_t histId = 0; histId < NHists; histId++)
      {
        hist = (TH2*) gFile->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
        if (!hist)
          continue;

        if (hist->GetEntries() < 1e4)
//        if (hist->GetEntries() < 10)
        {
          Printf("%d %d %d Only %f entries. Skipping...", i, j, histId, hist->GetEntries());
//          continue;
        }

        if (ptId >= 15)
        {
          etaLimit = 0.5;
          outerLimit = 0.99;
        }
        SubtractEtaGap(hist, etaLimit, outerLimit, kFALSE);
        Int_t bin1 = hist->FindBin(-etaLimit+0.01,-TMath::Pi() / 2 + 0.01);
        Int_t x1 = 0;
        Int_t y1 = 0;
        Int_t z1 = 0;
        hist->GetBinXYZ(bin1,x1,y1,z1);
        Int_t bin2 = hist->FindBin(etaLimit-0.01,TMath::Pi() / 2 - 0.01);
        Int_t x2 = 0;
        Int_t y2 = 0;
        Int_t z2 = 0;
        hist->GetBinXYZ(bin2,x2,y2,z2);
        integral = hist->IntegralAndError(x1,x2,y1,x2, error);

        AddPoint(graphs[33][ptId], centralityAxisMapping[histId], integral, centralityAxisMappingE[histId], error);
       k++;
        if (histId == 0)
          graphs[33][ptId]->SetTitle(hist->GetTitle());
      }
      for (k=0; k<graphs[33][ptId]->GetN(); k++)
        if (graphs[33][ptId]->GetX()[k] == 100) 
        {
          normP = graphs[33][ptId]->GetY()[k];
          YerrorP = graphs[33][ptId]->GetErrorY(k);
          protonPoint = true;
        }
      for (k=0; k<graphs[33][ptId]->GetN() && protonPoint == true; k++)
      {
        IAA = (graphs[33][ptId]->GetY()[k])/normP;
        AddPoint(graphs[34][ptId], graphs[33][ptId]->GetX()[k], IAA, graphs[33][ptId]->GetErrorX(k),sqrt(graphs[33][ptId]->GetErrorY(k)/graphs[33][ptId]->GetY()[k]*graphs[33][ptId]->GetErrorY(k)/graphs[33][ptId]->GetY()[k]+YerrorP/normP*YerrorP/normP)*graphs[33][ptId]->GetY()[k]/normP);
      }
      protonPoint = false;
      graphs[34][ptId]->SetTitle(graphs[33][ptId]->GetTitle());
    }
  }
  cout << "IAAHist graph created." << endl;
  WriteGraphs(outputFileName);
}


void CalculateSignificance(const char* HistFileName, const char* outputFileNameSignalBackgroundRatio = "hist1.root",const char* outputFileNameSignificance = "hist2.root")
{
  Int_t ptId = 0;
  Float_t etaLimit = kEtaLimit;
  Float_t outerLimit = kOuterLimit;

  TFile* output1 = TFile::Open(outputFileNameSignalBackgroundRatio, "RECREATE");
  TFile* output2 = TFile::Open(outputFileNameSignificance, "RECREATE");
  TFile* input = TFile::Open(HistFileName);
  Int_t maxLeadingPt = 4;
  Int_t maxAssocPt = 6;

//  TCanvas *c = new TCanvas("c", "", 1400, 1100);
//  c->Divide(2,2);

  for (Int_t i=0; i<maxLeadingPt; i++)
  {
    for (Int_t j=1; j<maxAssocPt; j++)
    {
      // only process when first is filled
      TH2* hist = (TH2*) input->Get(Form("dphi_%d_%d_%d", i, j+1, 0));
      if (!hist)
        continue;
      TH2* signal = (TH2*) hist->Clone("signal");
      TH2* background = (TH2*) hist->Clone("background");
      TH2* significance = (TH2*) hist->Clone("significance");
      TH2* signalBackground = (TH2*) hist->Clone("signalBackground");
      if (hist->GetEntries() < 1e4)
      {
        Printf("%d %d Only %f entries. Skipping...", i, j, hist->GetEntries());
        continue;
      }
      ptId = i*(maxAssocPt-1)+j-1;
      if (SkipGraph(ptId))
        continue;
      for (Int_t histId = 0; histId < NHists; histId++)
      {
        hist = (TH2*) input->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
        if (!hist)
          continue;
        hist->Scale(1.0 / hist->GetYaxis()->GetBinWidth(1));
        signal = (TH2*) hist->Clone("signal");
        background = (TH2*) hist->Clone("background");
        significance = (TH2*) hist->Clone("significance");
        signalBackground = (TH2*) hist->Clone("signalBackground");

        if (hist->GetEntries() < 1e4)
        {
          Printf("%d %d %d Only %f entries. Skipping...", i, j, histId, hist->GetEntries());
          continue;
        }

        if (ptId >= 15)
        {
          etaLimit = 0.5;
          outerLimit = 0.99;
        }
        background = SubtractEtaGap(signal, etaLimit, outerLimit, kFALSE);
        for (Int_t x = 0; x<=hist->GetNbinsX();x++)
        {
          for (Int_t y = 0; y<=hist->GetNbinsY();y++)
          {
              signalBackground->SetBinContent(x,y,signal->GetBinContent(x,y)/background->GetBinContent(x,y));
              significance->SetBinContent(x,y,signal->GetBinContent(x,y)/sqrt(signal->GetBinContent(x,y)+background->GetBinContent(x,y)));

          }
        }
/*        if (i==2 && j==1 && histId==0)
        {
          c->cd(1);
          hist->Draw("colz");
          c->cd(2);
          signal->Draw("colz");
          c->cd(3);
          background->Draw("colz");
          c->cd(4);
          significance->Draw("colz");
        }
*/
        output1->cd();
        signalBackground->Write(Form("dphi_signal_backgroung_ratio_%d_%d_%d", i, j+1, histId));
        output2->cd();
        significance->Write(Form("dphi_significance_%d_%d_%d", i, j+1, histId));
      }
    }
  }
  output1->Close();
  output2->Close();
}

void CompareGraphsDraw(const char* GraphFile1, const char* GraphFile2, Int_t offset = 0)
{
  Int_t nHists = 24; //NHists;

  ReadGraphs(GraphFile2);
  CalculateRMSSigma();
  TGraphErrors*** graphs1 = graphs;

  ReadGraphs(GraphFile1);
  CalculateRMSSigma();

  //used for 2011 data, where there is not enough data in the most periferal bin
/*  for (Int_t ptId=0; ptId<NHists; ptId++)
    for (Int_t i=0; i<graphs[0][ptId]->GetN(); i++)
      if (graphs[0][ptId]->GetX()[i] == 65)
      {
        graphs[1][ptId]->RemovePoint(i);
        graphs[2][ptId]->RemovePoint(i);
        graphs1[1][ptId]->RemovePoint(i);
        graphs1[2][ptId]->RemovePoint(i);
        cout << "Removing point" << endl;
      }
*/
  DrawCentrality("phi_rms_centrality_compare", nHists, graphs[1+offset], 0, 0.8, Form("#sigma_{#Delta#varphi} (%s) (rad.)", fitLabel), graphs1[1+offset]);
  DrawCentrality("eta_rms_centrality_compare", nHists, graphs[2+offset], 0, 0.8, Form("#sigma_{#Delta#eta} (%s)", fitLabel), graphs1[2+offset]);

  DrawCentrality("kurtosisphi_centrality_compare", 12, graphs[14+offset], -1.5, 2.5, "Kurtosis #Delta#varphi", graphs1[14+offset]);
  DrawCentrality("kurtosiseta_centrality_compare", 12, graphs[15+offset], -1.5, 2.5, "Kurtosis #Delta#eta", graphs1[15+offset]);

  DrawCentrality("chi2_phi(1D)", nHists, graphs[43], 0, 140, "#chi^{2}/ndf", graphs1[43]);
  DrawCentrality("chi2_eta(1D)", nHists, graphs[44], 0, 140, "#chi^{2}/ndf", graphs1[44]);

//  DrawCentrality("IAAHist", nHists, graphs[34+offset], 0, 20, "I_{AA} (Hist)", graphs1[34+offset]);
//  DrawCentrality("IAAFit", nHists, graphs[32+offset], 0, 20, "I_{AA} (Fit)", graphs1[32+offset]);
}

Int_t canvasCount = 0;
void CompareHistDraw(const char* HistFileName1, const char* HistFileName2, Int_t i, Int_t j, Int_t histId, Float_t scaling = 1, Bool_t swapAxis = kFALSE)
{
  Int_t ptId = 0;
  Int_t maxAssocPt = 6;

  TFile* input1 = TFile::Open(HistFileName1);
  TFile* input2 = TFile::Open(HistFileName2);

  TH2* hist1 = (TH2*) input1->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
  if (!hist1)
  {
    cout << "Hist1 does not exist." << endl;
    return;
  }

  TH2* hist2 = (TH2*) input2->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
  if (!hist2)
  {
    cout << "Hist2 does not exist." << endl;
    return;
  }
  // NOTE fix normalization. these 2d correlations come out of AliUEHist normalized by dphi bin width, but not deta
  hist1->Scale(1.0 / hist1->GetYaxis()->GetBinWidth(1));
  hist2->Scale(1.0 / hist2->GetYaxis()->GetBinWidth(1));
  
//   hist2->Scale(1.0 / hist2->GetXaxis()->GetBinWidth(1)); hist1->Rebin2D(4, 2); hist1->Scale(1.0 / 8);

  hist2->Scale(scaling);
  
//   hist1->Rebin2D(2, 2); hist1->Scale(0.25);
//   hist2->Rebin2D(2, 2); hist2->Scale(0.25);
  
  Printf("Integrals: %f %f", hist1->Integral(1, hist1->GetNbinsX(), hist1->GetYaxis()->FindBin(-1.19), hist1->GetYaxis()->FindBin(1.19)), hist2->Integral(1, hist1->GetNbinsX(), hist1->GetYaxis()->FindBin(-1.19), hist1->GetYaxis()->FindBin(1.19)));

  TCanvas *c = new TCanvas(Form("c%d", canvasCount), Form("c%d", canvasCount), 600, 900);
  c->Divide(1,3);
  canvasCount++;

  TH2* ratio = (TH2*) hist1->Clone("ratio");
  if (hist1->GetEntries() < 1e4 || hist2->GetEntries() < 1e4)
  {
    cout << "Hist1: " << hist1->GetEntries() << " entries" << endl << "Hist2: " << hist2->GetEntries() << " entries" << endl;
  }
  ptId = i*(maxAssocPt-1)+j-1;

  if (0) //SubtractEtaGap
  {
    Float_t etaLimit = kEtaLimit;
    Float_t outerLimit = kOuterLimit;
    if (ptId >= 15)
    {
      etaLimit = 0.5;
      outerLimit = 0.99;
    }
    SubtractEtaGap(hist1, etaLimit, outerLimit, kFALSE);
    SubtractEtaGap(hist2, etaLimit, outerLimit, kFALSE);
  }

  if (SkipGraph(ptId))
  {
    cout << "SkipGraph called." << endl;
  }
  for (Int_t x = 1; x<=hist1->GetNbinsX();x++)
  {
    for (Int_t y = 1; y<=hist1->GetNbinsY();y++)
    {
      Int_t binx = hist2->GetXaxis()->FindBin(hist1->GetXaxis()->GetBinCenter(x));
      Int_t biny = hist2->GetYaxis()->FindBin(hist1->GetYaxis()->GetBinCenter(y));
      if (swapAxis)
      {
	biny = hist2->GetYaxis()->FindBin(hist1->GetXaxis()->GetBinCenter(x));
	binx = hist2->GetXaxis()->FindBin(hist1->GetYaxis()->GetBinCenter(y));
      }
      if (hist2->GetBinContent(binx,biny) > 0)
	ratio->SetBinContent(x,y,hist1->GetBinContent(x,y)/hist2->GetBinContent(binx,biny));
    }
  }
  
  hist1->GetYaxis()->SetRangeUser(-1.79, 1.79);
  hist2->GetYaxis()->SetRangeUser(-1.79, 1.79);
  ratio->GetYaxis()->SetRangeUser(-1.79, 1.79);
  
  c->cd(1);
  hist1->Draw("surf1");
  c->cd(2);
  hist2->Draw("surf1");
  c->cd(3);
  ratio->Draw("colz");
  
  return;
  
  new TCanvas;
  hist1->ProjectionX("p1", hist1->GetYaxis()->FindBin(-1.5), hist1->GetYaxis()->FindBin(1.5))->Draw();
  hist2->ProjectionY("p2", hist2->GetXaxis()->FindBin(-1.5), hist2->GetXaxis()->FindBin(1.5))->DrawCopy("SAME")->SetLineColor(2);
}

void CompareHistDraw(const char* HistFileName1, Int_t i, Int_t j, Int_t histId, Int_t i2, Int_t j2, Int_t histId2)
{
  TFile* input1 = TFile::Open(HistFileName1);

  TH2* hist1 = (TH2*) input1->Get(Form("dphi_%d_%d_%d", i, j+1, histId));
  if (!hist1)
  {
    cout << "Hist1 does not exist." << endl;
    return;
  }

  TH2* hist2 = (TH2*) input1->Get(Form("dphi_%d_%d_%d", i2, j2+1, histId2));
  if (!hist2)
  {
    cout << "Hist2 does not exist." << endl;
    return;
  }
  // NOTE fix normalization. these 2d correlations come out of AliUEHist normalized by dphi bin width, but not deta
  hist1->Scale(1.0 / hist1->GetYaxis()->GetBinWidth(1));
  hist2->Scale(1.0 / hist2->GetYaxis()->GetBinWidth(1));
  
  Printf("Integrals: %f %f", hist1->Integral(1, hist1->GetNbinsX(), hist1->GetYaxis()->FindBin(-1.19), hist1->GetYaxis()->FindBin(1.19)), hist2->Integral(1, hist1->GetNbinsX(), hist1->GetYaxis()->FindBin(-1.19), hist1->GetYaxis()->FindBin(1.19)));

  if (1) //SubtractEtaGap
  {
    Float_t etaLimit = kEtaLimit;
    Float_t outerLimit = kOuterLimit;

    SubtractEtaGap(hist1, etaLimit, outerLimit, kFALSE);
    SubtractEtaGap(hist2, etaLimit, outerLimit, kFALSE);
  }
  
  TCanvas *c = new TCanvas(Form("c%d", canvasCount), Form("c%d", canvasCount), 600, 900);
  c->Divide(1,3);
  canvasCount++;

  TH2* ratio = (TH2*) hist1->Clone("ratio");
  ratio->Divide(hist2);
  
  if (hist1->GetEntries() < 1e4 || hist2->GetEntries() < 1e4)
  {
    cout << "Hist1: " << hist1->GetEntries() << " entries" << endl << "Hist2: " << hist2->GetEntries() << " entries" << endl;
  }

  hist1->GetYaxis()->SetRangeUser(-1.79, 1.79);
  hist2->GetYaxis()->SetRangeUser(-1.79, 1.79);
  ratio->GetYaxis()->SetRangeUser(-1.79, 1.79);
  
  c->cd(1);
  hist1->Draw("surf1");
  c->cd(2);
  hist2->Draw("surf1");
  c->cd(3);
  ratio->Draw("colz");
}

void CompareSTARpTa(const char* STARFileName, const char* GraphFileName)
{
  TCanvas *c1 = new TCanvas("c1", "STAR comparison in dphi, pTa", 800, 600);
  TCanvas *c2 = new TCanvas("c2", "STAR comparison in deta, pTa", 800, 600);
  TMultiGraph *mg1 = new TMultiGraph();
  TMultiGraph *mg2 = new TMultiGraph();

  c1->SetGrid();
  c2->SetGrid();

  Float_t pTa = 0;
  Float_t dphi[8] = {0};
  Float_t deta[8] = {0};
  Float_t dphierror[8] = {0};
  Float_t detaerror[8] = {0};
  const char* title[8] = {"PYTHIA 62","Cu+Cu 62 0-60%","Au+Au 62 0-80%","PYTHIA 200","d+Au 200 0-95%","Cu+Cu 200 0-60%","Au+Au 200 40-80%","Au+Au 200 0-12%"};

  CreateGraphStructure();
  TFile* GraphFile = TFile::Open(GraphFileName);
  for (Int_t i=0; i<NGraphs; i++)
    for (Int_t j=0; j<NHists; j++)
    {
      if (i == 32 || i == 33 || i == 34) continue;
      graphs[i][j] = (TGraphErrors*) GraphFile->Get(Form("graph_%d_%d", i, j));
    }

  TGraphErrors*** STARgraphs = new TGraphErrors**[2];
  for (Int_t i=0; i<4; i++)
  {
    STARgraphs[i] = new TGraphErrors*[8];
    for (Int_t j=0; j<8; j++)
      STARgraphs[i][j] = new TGraphErrors;
  }

  ifstream infile(STARFileName);

  TLegend* legend = new TLegend(0.55, 0.65, 0.95, 0.95);
  legend->SetFillColor(0);
  legend->SetTextSize(0.03);

  for (Int_t i=0; i<3; i++)
  {
    infile >> pTa >> dphi[0] >> dphi[1] >> dphierror[1] >> dphi[2] >> dphierror[2] >> dphi[3] >> dphi[4] >> dphierror[4] >> dphi[5] >> dphierror[5] >> dphi[6] >> dphierror[6] >> dphi[7] >> dphierror[7];
    for (Int_t j=0; j<8;j++)
    {
      AddPoint(STARgraphs[0][j], pTa, dphi[j], 0, dphierror[j]); 
      if (i==0)
      {
        if (j==7) 
        {
          STARgraphs[0][j]->SetMarkerStyle(24);
          STARgraphs[0][j]->SetMarkerColor(2);
          STARgraphs[0][j]->SetLineColor(2);
          STARgraphs[0][j]->SetMarkerSize(1.5);
        }
        else 
        {
          STARgraphs[0][j]->SetMarkerStyle(20+j);
          STARgraphs[0][j]->SetMarkerColor(j);
          STARgraphs[0][j]->SetLineColor(j);
          STARgraphs[0][j]->SetMarkerSize(1.5);
        }
        if (j==7 || j==6) mg1->Add(STARgraphs[0][j]);
        STARgraphs[0][j]->SetTitle(title[j]);
      }
    }
  }

  for (Int_t i=0; i<3; i++)
  {
    infile >> pTa >> deta[0] >> deta[1] >> detaerror[1] >> deta[2] >> detaerror[2] >> deta[3] >> deta[4] >> detaerror[4] >> deta[5] >> detaerror[5] >> deta[6] >> detaerror[6] >> deta[7] >> detaerror[7];
    for (Int_t j=0; j<8;j++) 
    {
      AddPoint(STARgraphs[2][j], pTa, deta[j], 0, detaerror[j]);
      if (i==0)
      {
        if (j==7) 
        {
          STARgraphs[2][j]->SetMarkerStyle(24);
          STARgraphs[2][j]->SetMarkerColor(2);
          STARgraphs[2][j]->SetLineColor(2);
          STARgraphs[2][j]->SetMarkerSize(1.5);
        }
        else 
        {
          STARgraphs[2][j]->SetMarkerStyle(20+j);
          STARgraphs[2][j]->SetMarkerColor(j);
          STARgraphs[2][j]->SetLineColor(j);
          STARgraphs[2][j]->SetMarkerSize(1.5);
        }
        if (j==7 || j==6) mg2->Add(STARgraphs[2][j]);
        STARgraphs[2][j]->SetTitle(title[j]);
      }
    }
  }

  Float_t pTaAxisMapping[] = { 1.25, 1.75, 2.25, 2.75 };
  Float_t pTaAxisMappingE[] = { 0.25, 0.25, 0.25, 0.25 };

  CalculateRMSSigma();

//  for 1D fits:
  Int_t graphPhi = 37;
  Int_t graphEta = 41;
//  for 2D fits:
//  Int_t graphPhi = 1;
//  Int_t graphEta = 2;

  Int_t ptId = 0;
  for (ptId = 0; ptId < 4; ptId++)
  {
    AddPoint(STARgraphs[1][0],pTaAxisMapping[ptId],graphs[graphPhi][ptId]->GetY()[0],pTaAxisMappingE[ptId],graphs[graphPhi][ptId]->GetErrorY(0));
    STARgraphs[1][0]->SetMarkerStyle(20);
    STARgraphs[1][0]->SetMarkerColor(3);
    STARgraphs[1][0]->SetLineColor(3);
    STARgraphs[1][0]->SetMarkerSize(1.5);
    STARgraphs[1][0]->SetTitle(graphs[graphPhi][ptId]->GetTitle());
    AddPoint(STARgraphs[1][1],pTaAxisMapping[ptId],graphs[graphPhi][ptId]->GetY()[1],pTaAxisMappingE[ptId],graphs[graphPhi][ptId]->GetErrorY(1));
    STARgraphs[1][1]->SetMarkerStyle(22);
    STARgraphs[1][1]->SetMarkerColor(4);
    STARgraphs[1][1]->SetLineColor(4);
    STARgraphs[1][1]->SetMarkerSize(1.5);
    STARgraphs[1][1]->SetTitle(graphs[graphPhi][ptId]->GetTitle());
    AddPoint(STARgraphs[1][2],pTaAxisMapping[ptId],graphs[graphPhi][ptId]->GetY()[5],pTaAxisMappingE[ptId],graphs[graphPhi][ptId]->GetErrorY(5));
    STARgraphs[1][2]->SetMarkerStyle(23);
    STARgraphs[1][2]->SetMarkerColor(1);
    STARgraphs[1][2]->SetLineColor(1);
    STARgraphs[1][2]->SetMarkerSize(1.5);
    STARgraphs[1][2]->SetTitle(graphs[graphPhi][ptId]->GetTitle());

    AddPoint(STARgraphs[3][0],pTaAxisMapping[ptId],graphs[graphEta][ptId]->GetY()[0],pTaAxisMappingE[ptId],graphs[graphEta][ptId]->GetErrorY(0));
    STARgraphs[3][0]->SetMarkerStyle(20);
    STARgraphs[3][0]->SetMarkerColor(3);
    STARgraphs[3][0]->SetLineColor(3);
    STARgraphs[3][0]->SetMarkerSize(1.5);
    STARgraphs[3][0]->SetTitle(graphs[graphEta][ptId]->GetTitle());
    AddPoint(STARgraphs[3][1],pTaAxisMapping[ptId],graphs[graphEta][ptId]->GetY()[1],pTaAxisMappingE[ptId],graphs[graphEta][ptId]->GetErrorY(1));
    STARgraphs[3][1]->SetMarkerStyle(22);
    STARgraphs[3][1]->SetMarkerColor(4);
    STARgraphs[3][1]->SetLineColor(4);
    STARgraphs[3][1]->SetMarkerSize(1.5);
    STARgraphs[3][1]->SetTitle(graphs[graphEta][ptId]->GetTitle());
    AddPoint(STARgraphs[3][2],pTaAxisMapping[ptId],graphs[graphEta][ptId]->GetY()[5],pTaAxisMappingE[ptId],graphs[graphEta][ptId]->GetErrorY(5));
    STARgraphs[3][2]->SetMarkerStyle(23);
    STARgraphs[3][2]->SetMarkerColor(1);
    STARgraphs[3][2]->SetLineColor(1);
    STARgraphs[3][2]->SetMarkerSize(1.5);
    STARgraphs[3][2]->SetTitle(graphs[graphEta][ptId]->GetTitle());
  }
  mg1->Add(STARgraphs[1][0]);
  mg1->Add(STARgraphs[1][1]);
  mg1->Add(STARgraphs[1][2]);

  mg2->Add(STARgraphs[3][0]);
  mg2->Add(STARgraphs[3][1]);
  mg2->Add(STARgraphs[3][2]);

  legend->AddEntry(mg1->GetListOfGraphs()->At(2), "3.0 < P_Tt < 6.0 GeV, 0-10%", "P");
  legend->AddEntry(mg1->GetListOfGraphs()->At(4), "3.0 < P_Tt < 6.0 GeV, 40-60%", "P");
  legend->AddEntry(mg1->GetListOfGraphs()->At(3), "3.0 < P_Tt < 6.0 GeV, 60-70%", "P");

  for (Int_t j=0; j<8;j++)
  {
    if (j==6) legend->AddEntry(mg1->GetListOfGraphs()->At(0), STARgraphs[0][j]->GetTitle(), "P");
    if (j==7) legend->AddEntry(mg1->GetListOfGraphs()->At(1), STARgraphs[0][j]->GetTitle(), "P");
  }
  c1->cd();
  mg1->Draw("AP");
  mg1->GetXaxis()->SetTitle("p_{T,a} (GeV)");
  mg1->GetYaxis()->SetTitle(Form("#sigma_{#Delta#varphi} (%s) (rad.)", fitLabel));
  legend->Draw();

  c2->cd();
  mg2->Draw("AP");
  mg2->GetXaxis()->SetTitle("p_{T,a} (GeV)");
  mg2->GetYaxis()->SetTitle(Form("#sigma_{#Delta#eta} (%s) (rad.)", fitLabel));
  legend->Draw();
}


void CompareSTARpTt(const char* STARFileName, const char* GraphFileName)
{
  TCanvas *c1 = new TCanvas("c1", "STAR comparison in dphi, pTt", 800, 600);
  TCanvas *c2 = new TCanvas("c2", "STAR comparison in deta, pTt", 800, 600);
  TMultiGraph *mg1 = new TMultiGraph();
  TMultiGraph *mg2 = new TMultiGraph();

  c1->SetGrid();
  c2->SetGrid();

  Float_t pTt = 0;
  Float_t dphi[8] = {0};
  Float_t deta[8] = {0};
  Float_t dphierror[8] = {0};
  Float_t detaerror[8] = {0};
  const char* title[8] = {"PYTHIA 62","Cu+Cu 62 0-60%","Au+Au 62 0-80%","PYTHIA 200","d+Au 200 0-95%","Cu+Cu 200 0-60%","Au+Au 200 40-80%","Au+Au 200 0-12%"};

  CreateGraphStructure();
  TFile* GraphFile = TFile::Open(GraphFileName);
  for (Int_t i=0; i<NGraphs; i++)
    for (Int_t j=0; j<NHists; j++)
    {
      if (i == 32 || i == 33 || i == 34) continue;
      graphs[i][j] = (TGraphErrors*) GraphFile->Get(Form("graph_%d_%d", i, j));
    }

  TGraphErrors*** STARgraphs = new TGraphErrors**[2];
  for (Int_t i=0; i<4; i++)
  {
    STARgraphs[i] = new TGraphErrors*[8];
    for (Int_t j=0; j<8; j++)
      STARgraphs[i][j] = new TGraphErrors;
  }

  ifstream infile(STARFileName);

  TLegend* legend = new TLegend(0.55, 0.65, 0.95, 0.95);
  legend->SetFillColor(0);
  legend->SetTextSize(0.03);

  for (Int_t i=0; i<3; i++)
  {
    infile >> pTt >> dphi[0] >> dphi[1] >> dphierror[1] >> dphi[2] >> dphierror[2] >> dphi[3] >> dphi[4] >> dphierror[4] >> dphi[5] >> dphierror[5] >> dphi[6] >> dphierror[6] >> dphi[7] >> dphierror[7];
    for (Int_t j=0; j<8;j++)
    {
      AddPoint(STARgraphs[0][j], pTt, dphi[j], 0, dphierror[j]); 
      if (i==0)
      {
        if (j==7) 
        {
          STARgraphs[0][j]->SetMarkerStyle(24);
          STARgraphs[0][j]->SetMarkerColor(2);
          STARgraphs[0][j]->SetLineColor(2);
          STARgraphs[0][j]->SetMarkerSize(1.5);
        }
        else 
        {
          STARgraphs[0][j]->SetMarkerStyle(20+j);
          STARgraphs[0][j]->SetMarkerColor(j);
          STARgraphs[0][j]->SetLineColor(j);
          STARgraphs[0][j]->SetMarkerSize(1.5);
        }
        if (j==7 || j==6) mg1->Add(STARgraphs[0][j]);
        STARgraphs[0][j]->SetTitle(title[j]);
      }
    }
  }

  for (Int_t i=0; i<4; i++)
  {
    infile >> pTt >> dphi[0] >> dphi[1] >> dphierror[1] >> dphi[3] >> dphi[4] >> dphierror[4] >> dphi[5] >> dphierror[5] >> dphi[6] >> dphierror[6] >> dphi[7] >> dphierror[7];
    for (Int_t j=0; j<8;j++)
    {
      if (j==2) continue;
      AddPoint(STARgraphs[0][j], pTt, dphi[j], 0, dphierror[j]);
    }
  }

  for (Int_t i=0; i<3; i++)
  {
    infile >> pTt >> deta[0] >> deta[1] >> detaerror[1] >> deta[2] >> detaerror[2] >> deta[3] >> deta[4] >> detaerror[4] >> deta[5] >> detaerror[5] >> deta[6] >> detaerror[6] >> deta[7] >> detaerror[7];
    for (Int_t j=0; j<8;j++) 
    {
      AddPoint(STARgraphs[2][j], pTt, deta[j], 0, detaerror[j]);
      if (i==0)
      {
        if (j==7) 
        {
          STARgraphs[2][j]->SetMarkerStyle(24);
          STARgraphs[2][j]->SetMarkerColor(2);
          STARgraphs[2][j]->SetLineColor(2);
          STARgraphs[2][j]->SetMarkerSize(1.5);
        }
        else 
        {
          STARgraphs[2][j]->SetMarkerStyle(20+j);
          STARgraphs[2][j]->SetMarkerColor(j);
          STARgraphs[2][j]->SetLineColor(j);
          STARgraphs[2][j]->SetMarkerSize(1.5);
        }
        if (j==7 || j==6) mg2->Add(STARgraphs[2][j]);
        STARgraphs[2][j]->SetTitle(title[j]);
      }
    }
  }

  for (Int_t i=0; i<4; i++)
  {
    infile >> pTt >> deta[0] >> deta[1] >> detaerror[1] >> deta[3] >> deta[4] >> detaerror[4] >> deta[5] >> detaerror[5] >> deta[6] >> detaerror[6] >> deta[7] >> detaerror[7];
    for (Int_t j=0; j<8;j++)
    {
      if (j==2) continue;
      AddPoint(STARgraphs[2][j], pTt, deta[j], 0, detaerror[j]);
    }
  }

  Float_t pTtAxisMapping[] = { 2.5, 3.5, 4.5, 5.5 };
  Float_t pTtAxisMappingE[] = { 0.5, 0.5, 0.5, 0.5 };

  CalculateRMSSigma();

//  for 1D fits:
  Int_t graphPhi = 37;
  Int_t graphEta = 41;
//  for 2D fits:
//  Int_t graphPhi = 1;
//  Int_t graphEta = 2;

  for (Int_t i = 0; i < 4; i++)
  {
    Int_t ptId = i * (6 - 1) + 1 - 1;
    AddPoint(STARgraphs[1][0],pTtAxisMapping[i],graphs[graphPhi][ptId]->GetY()[0],pTtAxisMappingE[i],graphs[graphPhi][ptId]->GetErrorY(0));
    STARgraphs[1][0]->SetMarkerStyle(20);
    STARgraphs[1][0]->SetMarkerColor(3);
    STARgraphs[1][0]->SetLineColor(3);
    STARgraphs[1][0]->SetMarkerSize(1.5);
    STARgraphs[1][0]->SetTitle(graphs[graphPhi][ptId]->GetTitle());
    AddPoint(STARgraphs[1][1],pTtAxisMapping[i],graphs[graphPhi][ptId]->GetY()[1],pTtAxisMappingE[i],graphs[graphPhi][ptId]->GetErrorY(1));
    STARgraphs[1][1]->SetMarkerStyle(22);
    STARgraphs[1][1]->SetMarkerColor(4);
    STARgraphs[1][1]->SetLineColor(4);
    STARgraphs[1][1]->SetMarkerSize(1.5);
    STARgraphs[1][1]->SetTitle(graphs[graphPhi][ptId]->GetTitle());
    AddPoint(STARgraphs[1][2],pTtAxisMapping[i],graphs[graphPhi][ptId]->GetY()[5],pTtAxisMappingE[i],graphs[graphPhi][ptId]->GetErrorY(5));
    STARgraphs[1][2]->SetMarkerStyle(23);
    STARgraphs[1][2]->SetMarkerColor(1);
    STARgraphs[1][2]->SetLineColor(1);
    STARgraphs[1][2]->SetMarkerSize(1.5);
    STARgraphs[1][2]->SetTitle(graphs[graphPhi][ptId]->GetTitle());

    AddPoint(STARgraphs[3][0],pTtAxisMapping[i],graphs[graphEta][ptId]->GetY()[0],pTtAxisMappingE[i],graphs[graphEta][ptId]->GetErrorY(0));
    STARgraphs[3][0]->SetMarkerStyle(20);
    STARgraphs[3][0]->SetMarkerColor(3);
    STARgraphs[3][0]->SetLineColor(3);
    STARgraphs[3][0]->SetMarkerSize(1.5);
    STARgraphs[3][0]->SetTitle(graphs[graphEta][ptId]->GetTitle());
    AddPoint(STARgraphs[3][1],pTtAxisMapping[i],graphs[graphEta][ptId]->GetY()[1],pTtAxisMappingE[i],graphs[graphEta][ptId]->GetErrorY(1));
    STARgraphs[3][1]->SetMarkerStyle(22);
    STARgraphs[3][1]->SetMarkerColor(4);
    STARgraphs[3][1]->SetLineColor(4);
    STARgraphs[3][1]->SetMarkerSize(1.5);
    STARgraphs[3][1]->SetTitle(graphs[graphEta][ptId]->GetTitle());
    AddPoint(STARgraphs[3][2],pTtAxisMapping[i],graphs[graphEta][ptId]->GetY()[5],pTtAxisMappingE[i],graphs[graphEta][ptId]->GetErrorY(5));
    STARgraphs[3][2]->SetMarkerStyle(23);
    STARgraphs[3][2]->SetMarkerColor(1);
    STARgraphs[3][2]->SetLineColor(1);
    STARgraphs[3][2]->SetMarkerSize(1.5);
    STARgraphs[3][2]->SetTitle(graphs[graphEta][ptId]->GetTitle());
   }

  mg1->Add(STARgraphs[1][0]);
  mg1->Add(STARgraphs[1][1]);
  mg1->Add(STARgraphs[1][2]);

  mg2->Add(STARgraphs[3][0]);
  mg2->Add(STARgraphs[3][1]);
  mg2->Add(STARgraphs[3][2]);

  legend->AddEntry(mg1->GetListOfGraphs()->At(2), "1.5 GeV < p_{T,a} < p_{T,t}, 0-10%", "P");
  legend->AddEntry(mg1->GetListOfGraphs()->At(4), "1.5 GeV < p_{T,a} < p_{T,t}, 40-60%", "P");
  legend->AddEntry(mg1->GetListOfGraphs()->At(3), "1.5 GeV < p_{T,a} < p_{T,t}, 60-70%", "P");

  for (Int_t j=0; j<8;j++)
  {
    if (j==6) legend->AddEntry(mg1->GetListOfGraphs()->At(0), STARgraphs[0][j]->GetTitle(), "P");
    if (j==7) legend->AddEntry(mg1->GetListOfGraphs()->At(1), STARgraphs[0][j]->GetTitle(), "P");
  }
  c1->cd();
  mg1->Draw("AP");
  mg1->GetXaxis()->SetTitle("p_{T,t} (GeV)");
  mg1->GetYaxis()->SetTitle(Form("#sigma_{#Delta#varphi} (%s) (rad.)", fitLabel));
  legend->Draw();

  c2->cd();
  mg2->Draw("AP");
  mg2->GetXaxis()->SetTitle("p_{T,t} (GeV)");
  mg2->GetYaxis()->SetTitle(Form("#sigma_{#Delta#eta} (%s) (rad.)", fitLabel));
  legend->Draw();
}

void AcceptanceEfficiencyToy()
{
  // toy MC to study the intermix of a detector efficiency as fct of eta and the mixed event correction
  
//     TF1* eff = new TF1("eff", "0.9 - 0.3 * abs(x)", -1, 1);

  // pA efficiency
  Double_t xAxis1[51] = {-2.5, -2.4, -2.3, -2.2, -2.1, -2, -1.9, -1.8, -1.7, -1.6, -1.5, -1.4, -1.3, -1.2, -1.1, -1, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5}; 
  TH1D *effHist = new TH1D("effHist","step1: projection on #Delta#eta",50, xAxis1);
  effHist->SetBinContent(13,0.271338);
  effHist->SetBinContent(14,0.334383);
  effHist->SetBinContent(15,0.4399013);
  effHist->SetBinContent(16,0.6723888);
  effHist->SetBinContent(17,0.8022655);
  effHist->SetBinContent(18,0.809605);
  effHist->SetBinContent(19,0.8145845);
  effHist->SetBinContent(20,0.817339);
  effHist->SetBinContent(21,0.8210758);
  effHist->SetBinContent(22,0.8228529);
  effHist->SetBinContent(23,0.8246998);
  effHist->SetBinContent(24,0.8249083);
  effHist->SetBinContent(25,0.8162804);
  effHist->SetBinContent(26,0.8148814);
  effHist->SetBinContent(27,0.8237724);
  effHist->SetBinContent(28,0.8247403);
  effHist->SetBinContent(29,0.822931);
  effHist->SetBinContent(30,0.8220786);
  effHist->SetBinContent(31,0.8195946);
  effHist->SetBinContent(32,0.8159786);
  effHist->SetBinContent(33,0.812606);
  effHist->SetBinContent(34,0.8080089);
  effHist->SetBinContent(35,0.6991395);
  effHist->SetBinContent(36,0.4702392);
  effHist->SetBinContent(37,0.3467974);
  effHist->SetBinContent(38,0.2798031);
  effHist->SetBinError(13,0.000586557);
  effHist->SetBinError(14,0.0006215941);
  effHist->SetBinError(15,0.0006542189);
  effHist->SetBinError(16,0.0006190971);
  effHist->SetBinError(17,0.0005263518);
  effHist->SetBinError(18,0.0005197939);
  effHist->SetBinError(19,0.0005148436);
  effHist->SetBinError(20,0.0005131777);
  effHist->SetBinError(21,0.0005095525);
  effHist->SetBinError(22,0.000508042);
  effHist->SetBinError(23,0.0005058743);
  effHist->SetBinError(24,0.0005058348);
  effHist->SetBinError(25,0.000514767);
  effHist->SetBinError(26,0.0005161097);
  effHist->SetBinError(27,0.0005054953);
  effHist->SetBinError(28,0.0005028134);
  effHist->SetBinError(29,0.0005030626);
  effHist->SetBinError(30,0.0005016751);
  effHist->SetBinError(31,0.0005036153);
  effHist->SetBinError(32,0.0005049182);
  effHist->SetBinError(33,0.0005063787);
  effHist->SetBinError(34,0.0005090265);
  effHist->SetBinError(35,0.0005904377);
  effHist->SetBinError(36,0.0006403924);
  effHist->SetBinError(37,0.0006090749);
  effHist->SetBinError(38,0.0005733178);

  //   eff = new TF1("eff", "0.9 - 0.05 * abs(x) - 0.6 * TMath::Floor(abs(x) + 0.2)", -1, 1);
//   eff = new TF1("eff", "0.9 - 0.6 * TMath::Floor(abs(x) + 0.2)", -1, 1);
//   eff = new TF1("eff", "0.9", -1, 1);

//   for (Int_t i=1; i<=50; i++)
//     effHist->SetBinContent(i, 0.2);

  Float_t etaAcceptance = 1.2;

  new TCanvas; effHist->Draw(); effHist->Fit("pol0", "", "", -etaAcceptance+0.01, etaAcceptance-0.01);
  
  Int_t bins = 200;
  TH1D* same = new TH1D("same", "", bins, -2.5, 2.5);
  TH1D* mixed = new TH1D("mixed", "", bins, -2.5, 2.5);
  TH1D* eta =  new TH1D("eta", "", bins, -2.5, 2.5);
  
  TH1D* sameEff = new TH1D("sameEff", "", bins, -2.5, 2.5);
  TH1D* mixedEff = new TH1D("mixedEff", "", bins, -2.5, 2.5);
  TH1D* etaEff =  new TH1D("etaEff", "", bins, -2.5, 2.5);
  TH1D* allEtaEff =  new TH1D("allEtaEff", "", bins, -2.5, 2.5);

  TH1D* etaSource =  new TH1D("etaSource", "", bins, -2.5, 2.5);
  TH1D* etaSourceEff =  new TH1D("etaSourceEff", "", bins, -2.5, 2.5);

  Float_t sigma = 0.5;
  Float_t assoc = 0;
  Bool_t assocTracked = kFALSE;
  
  same->Sumw2();
  mixed->Sumw2();
  eta->Sumw2();
  sameEff->Sumw2();
  mixedEff->Sumw2();
  etaEff->Sumw2();
  allEtaEff->Sumw2();
  etaSource->Sumw2();
  etaSourceEff->Sumw2();
  
  for (Int_t i=0; i<1000000; i++)
  {
    // randomize mean
    Float_t mean = gRandom->Uniform(-5, 5);
    
    Float_t trig = gRandom->Gaus(mean, sigma);
    Bool_t trigTracked = (gRandom->Uniform() < effHist->GetBinContent(effHist->FindBin(trig))); // eff->Eval(trig)
    if (TMath::Abs(trig) < etaAcceptance)
    {
      eta->Fill(trig);
      if (trigTracked)
	etaEff->Fill(trig);
    }
    
    // mixed event
    if (i > 0 && TMath::Abs(trig) < etaAcceptance && TMath::Abs(assoc) < etaAcceptance)
    {
      mixed->Fill(trig - assoc);
    
      if (trigTracked && assocTracked)
	mixedEff->Fill(trig - assoc);
// 	mixedEff->Fill(trig - assoc, 1.0 / effHist->GetBinContent(effHist->FindBin(assoc)));
    }
    
//     mean = gRandom->Uniform(-5, 5);
    assoc = gRandom->Gaus(mean, sigma);
    
    assocTracked = (gRandom->Uniform() < effHist->GetBinContent(effHist->FindBin(assoc)));
    
    if (TMath::Abs(trig) < etaAcceptance && trigTracked)
      allEtaEff->Fill(trig);
    if (TMath::Abs(assoc) < etaAcceptance && assocTracked)
      allEtaEff->Fill(assoc);
    
    // same event
    if (TMath::Abs(trig) < etaAcceptance && TMath::Abs(assoc) < etaAcceptance)
    {
      same->Fill(trig - assoc);
      
//       if (trigTracked)
	etaSource->Fill(assoc);
      
      if (trigTracked && assocTracked)
      {
	sameEff->Fill(trig - assoc);
	etaSourceEff->Fill(assoc);
/*	sameEff->Fill(trig - assoc, 1.0 / effHist->GetBinContent(effHist->FindBin(assoc)));
	etaSourceEff->Fill(assoc, 1.0 / effHist->GetBinContent(effHist->FindBin(assoc)));*/
      }
    }
  }
  
  Float_t mixedConstant = 0;
  if (1)
  {
    new TCanvas;
    TF1* pol1 = new TF1("pol", "pol1(0)", -10, 10);
    mixed->Fit(pol1, "+", "", -1, -0.0001);
    Float_t mixedConstant1 = pol1->Eval(0);
    pol1 = new TF1("pol", "pol1(0)", -10, 10);
    mixed->Fit(pol1, "+", "", 0.0001, 1);
    Float_t mixedConstant2 = pol1->Eval(0);
    mixedConstant = (mixedConstant1 + mixedConstant2) / 2;
    Printf("%f %f %f", mixedConstant1, mixedConstant2, mixedConstant);
  }
  else
    mixedConstant = mixed->Integral(bins / 2, bins / 2 + 1) / 2;

  mixed = (TH1D*) mixed->Clone();
  mixed->Scale(1.0 / mixedConstant);
  
  new TCanvas; same->DrawCopy(); mixed->SetLineColor(2); mixed->DrawCopy("SAME");
  
  same->Divide(mixed);
  same->Scale(1.0 / eta->Integral());
  new TCanvas; same->DrawCopy();

  new TCanvas; eta->DrawCopy(); etaEff->SetLineColor(2); etaEff->DrawCopy("SAME");
  
  new TCanvas; etaSource->DrawCopy(); etaSourceEff->SetLineColor(2); etaSourceEff->DrawCopy("SAME"); allEtaEff->SetLineColor(4); allEtaEff->DrawCopy("SAME");
  
//   etaSource->Multiply(effHist);
  
  if (0)
  {
    new TCanvas;
    TF1* pol1 = new TF1("pol", "pol1(0)", -10, 10);
    mixedEff->Fit(pol1, "+", "", -1, -0.0001);
    Float_t mixedConstant1 = pol1->Eval(0);
    pol1 = new TF1("pol", "pol1(0)", -10, 10);
    mixedEff->Fit(pol1, "+", "", 0.0001, 1);
    Float_t mixedConstant2 = pol1->Eval(0);
    mixedConstant = (mixedConstant1 + mixedConstant2) / 2;
    Printf("%f %f %f", mixedConstant1, mixedConstant2, mixedConstant);
  }
  else
    mixedConstant = mixedEff->Integral(bins / 2, bins / 2 + 1) / 2;
  
  mixedEff = (TH1D*) mixedEff->Clone();
  mixedEff->Scale(1.0 / mixedConstant);
  
  new TCanvas; sameEff->DrawCopy(); mixedEff->SetLineColor(2); mixedEff->DrawCopy("SAME");

  sameEff->Divide(mixedEff);
  sameEff->Scale(1.0 / etaEff->Integral());
  new TCanvas; sameEff->DrawCopy();
  
  new TCanvas; same->DrawCopy(); sameEff->SetLineColor(2); sameEff->DrawCopy("SAME");
  
  sameEff->Divide(same);
  new TCanvas; sameEff->DrawCopy(); sameEff->Fit("pol0");
}

void Acceptance2DToy(Float_t etaAcceptance = 1.0)
{
  // toy MC to study the effect of acceptance on the correlation function

  Int_t bins = 40;
  TH2D* same = new TH2D("same", "", bins, -2.5, 2.5, bins, -TMath::Pi(), TMath::Pi());
  TH2D* mixed = new TH2D("mixed", "", bins, -2.5, 2.5, bins,  -TMath::Pi(), TMath::Pi());
  TH1D* eta =  new TH1D("eta", "", bins, -2.5, 2.5);
  TH1D* phi =  new TH1D("phi", "", bins, -TMath::Pi(), TMath::Pi());
  
  Float_t sigma = 0.4;
  const Int_t nParticles = 8;
  Float_t etas[nParticles];
  Float_t phis[nParticles];
  Float_t lastetas[nParticles];
  Float_t lastphis[nParticles];
  
  TF2* func = new TF2("func", "[0]*exp(-0.5*((x/[1])**2+(y/[2])**2))", -5, 5, -5, 5);
  func->SetParameters(1, sigma, sigma);

  same->Sumw2();
  mixed->Sumw2();
  eta->Sumw2();
  
  for (Int_t i=0; i<1000000; i++)
  {
    for (Int_t j=0; j<nParticles/2; j++)
    {
      // randomize mean
      Float_t meanEta = gRandom->Uniform(-5, 5);
      Float_t meanPhi = gRandom->Uniform(0, TMath::TwoPi());
      
      Double_t gausEta, gausPhi;
      func->GetRandom2(gausEta, gausPhi);
      
      Float_t trigEta = meanEta + gausEta;
      Float_t trigPhi = meanPhi + gausPhi;
      
      if (trigPhi > TMath::Pi())
	trigPhi -= TMath::TwoPi();
      if (trigPhi < -TMath::Pi())
	trigPhi += TMath::TwoPi();

      func->GetRandom2(gausEta, gausPhi);
      
      Float_t assocEta = meanEta + gausEta;
      Float_t assocPhi = meanPhi + gausPhi;
      
      if (assocPhi > TMath::Pi())
	assocPhi -= TMath::TwoPi();
      if (assocPhi < -TMath::Pi())
	assocPhi += TMath::TwoPi();
      
      etas[j*2] = trigEta;
      etas[j*2+1] = assocEta;
      phis[j*2] = trigPhi;
      phis[j*2+1] = assocPhi;
    }
    
    // same event
    for (Int_t j=0; j<nParticles; j++)
    {
      if (TMath::Abs(etas[j]) > etaAcceptance)
	continue;

      eta->Fill(etas[j]);
      phi->Fill(phis[j]);

      for (Int_t k=j+1; k<nParticles; k++)
      {
	if (TMath::Abs(etas[k]) > etaAcceptance)
	  continue;
	
	Float_t deltaEta = etas[j] - etas[k];
	Float_t deltaPhi = phis[j] - phis[k];
      
	if (deltaPhi > TMath::Pi())
	  deltaPhi -= TMath::TwoPi();
	if (deltaPhi < -TMath::Pi())
	  deltaPhi += TMath::TwoPi();
    
	same->Fill(deltaEta, deltaPhi);
      }
    }
    
    // mixed event
    if (i > 0)
    {
      for (Int_t j=0; j<nParticles; j++)
      {
	if (TMath::Abs(etas[j]) > etaAcceptance)
	  continue;

	for (Int_t k=0; k<nParticles; k++)
	{
	  if (TMath::Abs(lastetas[k]) > etaAcceptance)
	    continue;
	  
	  Float_t deltaEta = etas[j] - lastetas[k];
	  Float_t deltaPhi = phis[j] - lastphis[k];
	
	  if (deltaPhi > TMath::Pi())
	    deltaPhi -= TMath::TwoPi();
	  if (deltaPhi < -TMath::Pi())
	    deltaPhi += TMath::TwoPi();
      
	  mixed->Fill(deltaEta, deltaPhi);
	}
      }
      
      for (Int_t j=0; j<nParticles; j++)
      {
	lastetas[j] = etas[j];
	lastphis[j] = phis[j];
      }
    }
/*    // add an uncorrelated particle
    Float_t assocEta2 = gRandom->Uniform(-5, 5);
    Float_t assocPhi2 = gRandom->Uniform(0, TMath::TwoPi());

    deltaEta = trigEta - assocEta2;
    deltaPhi = trigPhi - assocPhi2;

    if (deltaPhi > TMath::Pi())
      deltaPhi -= TMath::TwoPi();
    if (deltaPhi < -TMath::Pi())
      deltaPhi += TMath::TwoPi();

    // same event
    if (TMath::Abs(trigEta) < etaAcceptance && TMath::Abs(assocEta) < etaAcceptance)
      same->Fill(deltaEta, deltaPhi);*/
  }
  
  Float_t mixedConstant = 0;
  if (1)
  {
    TH1* mixedProj = mixed->ProjectionX();
    mixedProj->Scale(1.0 / mixed->GetNbinsY());
    new TCanvas;
    TF1* pol1 = new TF1("pol", "pol1(0)", -10, 10);
    mixedProj->Fit(pol1, "+", "", -1, -0.0001);
    Float_t mixedConstant1 = pol1->Eval(0);
    pol1 = new TF1("pol", "pol1(0)", -10, 10);
    mixedProj->Fit(pol1, "+", "", 0.0001, 1);
    Float_t mixedConstant2 = pol1->Eval(0);
    mixedConstant = (mixedConstant1 + mixedConstant2) / 2;
    Printf("%f %f %f", mixedConstant1, mixedConstant2, mixedConstant);
  }
  else
    mixedConstant = mixed->Integral(bins / 2, bins / 2 + 1) / 2;

  mixed = (TH2D*) mixed->Clone();
  mixed->Scale(1.0 / mixedConstant);
  
  new TCanvas; same->DrawCopy("SURF1"); 
  new TCanvas; mixed->DrawCopy("SURF1");
  
  same->Divide(mixed);
  same->Scale(1.0 / eta->Integral());
  new TCanvas; same->DrawCopy("SURF1");

  new TCanvas; eta->DrawCopy();
  new TCanvas; phi->DrawCopy();
  
  Printf("%f", same->Integral());
  
  TH1* projSame = (TH1*) same->ProjectionX("projSame");

  TF1* func1 = new TF1("func1", "[0]+gaus(1)", -5, 5);
  func1->SetParameters(0.01, 0.01, 0, sigma*2);
  func1->FixParameter(2, 0);
  
  projSame->Fit(func1);
  func1->SetParameter(0, 0);
  Printf("%f", func1->Integral(-2, 2) / projSame->GetBinWidth(1));
}

void Convolute()
{
  TFile::Open("phi.root");
  TH1* phi = (TH1*) gFile->Get("phi");

  phi->SetFillColor(0);
  //TH1* phi = new TH1F("phi", "", 20, 0, 2); phi->SetBinContent(9, 1);  phi->SetBinContent(10, 1); phi->SetBinContent(11, 1); phi->SetBinContent(12, 1);
  
//   TH1* phi = new TH1F("phi", "", 20, 0, TMath::TwoPi()); 
//   for (Int_t x=0; x<phi->GetNbinsX(); x++)    phi->SetBinContent(x+1, 1);
//   phi->SetBinContent(10, 0);
//   phi->SetBinContent(11, 0);
  
//   
//   TH1* phi = new TH1F("phi", "", 4, -1, 1); phi->SetBinContent(1, 1);  phi->SetBinContent(2, 1); phi->SetBinContent(3, 1); phi->SetBinContent(4, 1);
  
  new TCanvas; phi->Draw();
  
  TH1* conv = (TH1*) phi->Clone("conv");
  conv->Reset();
  
  for (Int_t delta=0; delta<phi->GetNbinsX(); delta++)
  {
    Double_t value = 0;
    for (Int_t x=1; x<=phi->GetNbinsX(); x++)
    {
      Int_t y = x + delta;
      if (y < 1)
	y += phi->GetNbinsX();
      if (y > phi->GetNbinsX())
	y -= phi->GetNbinsX();
      value += phi->GetBinContent(x) * phi->GetBinContent(y);
    }
    conv->SetBinContent(delta+1, value);
  }
  
  conv->Scale(1.0 / conv->Integral());
  new TCanvas; conv->Draw();
  
//   return;
  
  // random approach
  
  TH1* rand = (TH1*) phi->Clone("rand");
  rand->Reset();
  
  for (Int_t i=0; i<1000000000; i++)
  {
    Float_t value1 = phi->GetRandom();
    Float_t value2 = phi->GetRandom();
    
    Int_t x = rand->FindBin(value1);
    Int_t y = rand->FindBin(value2);
    
    Int_t bin = x - y;
    if (bin < 0)
      bin += phi->GetNbinsX();
    if (bin >= phi->GetNbinsX())
      bin -= phi->GetNbinsX();
    
    rand->SetBinContent(bin+1, rand->GetBinContent(bin+1) + 1);
  }
  
  rand->Scale(1.0 / rand->Integral());
  rand->SetLineColor(2);
  rand->Draw("SAME");
}

void TwoPlusOneCorrelations_Draw(TH2* hist)
{
  // get rid of triangle
  for (Int_t i=1; i<=hist->GetNbinsX(); i++)
  {
    Float_t weight = 1.0 / (1.0 - TMath::Abs(hist->GetXaxis()->GetBinCenter(i)) / 2.0);
    for (Int_t j=1; j<=hist->GetNbinsY(); j++)
      hist->SetBinContent(i, j, hist->GetBinContent(i, j) * weight);
  }

  TCanvas* c = new TCanvas(Form("%s_c", hist->GetName()), Form("%s_c", hist->GetName()), 600, 1000);
  c->Divide(1, 3);
  
  c->cd(1);
  hist->Draw("SURF1");
  hist->GetXaxis()->SetRangeUser(-1.59, 1.59);
  
  Int_t eta1 = hist->GetXaxis()->FindBin(-1.59);
  Int_t eta2 = hist->GetXaxis()->FindBin(-1.01);
  Int_t eta3 = eta2+1;
  Int_t eta4 = hist->GetXaxis()->FindBin(0.99);
  Int_t eta5 = eta4+1;
  Int_t eta6 = hist->GetXaxis()->FindBin(1.59);
  
  TH1* nsProj1 = hist->ProjectionY(Form("%s_Proj1", hist->GetName()), eta1, eta2);
  TH1* nsProj2 = hist->ProjectionY(Form("%s_Proj2", hist->GetName()), eta3, eta4);
  TH1* nsProj3 = hist->ProjectionY(Form("%s_Proj3", hist->GetName()), eta5, eta6);
  
  nsProj1->Add(nsProj3);
  nsProj1->Scale(1.0 / (eta2 - eta1 + 1 + eta6 - eta5 + 1));
  nsProj2->Scale(1.0 / (eta4 - eta3 + 1));
  
  c->cd(2);
  nsProj2->DrawCopy(); 
  nsProj1->SetLineColor(2); 
  nsProj1->Draw("SAME");
  
  c->cd(3);
  nsProj2->Add(nsProj1, -1);
  nsProj2->DrawCopy(); 
}

void TwoPlusOneCorrelations()
{
  // Check 2 plus 1 correlations for NS and AS and eta gap flow subtraction

  Int_t bins = 40;
  TH2D* ns =  new TH2D("ns", ";delta eta; delta phi", bins, -2, 2, bins, -0.5 * TMath::Pi(), 1.5 * TMath::Pi());
  TH2D* ns2 = new TH2D("ns2", ";delta eta; delta phi", bins, -2, 2, bins, -0.5 * TMath::Pi(), 1.5 * TMath::Pi());
  TH2D* as2 = new TH2D("as2", ";delta eta; delta phi", bins, -2, 2, bins, -0.5 * TMath::Pi(), 1.5 * TMath::Pi());
  TH2D* ns2Same = new TH2D("ns2Same", ";delta eta; delta phi", bins, -2, 2, bins, -0.5 * TMath::Pi(), 1.5 * TMath::Pi());
  TH2D* as2Same = new TH2D("as2Same", ";delta eta; delta phi", bins, -2, 2, bins, -0.5 * TMath::Pi(), 1.5 * TMath::Pi());
//   TH2D* as2AllSame = new TH2D("as2AllSame", ";delta eta; delta phi", bins, -2, 2, bins, -0.5 * TMath::Pi(), 1.5 * TMath::Pi());
  TH2D* ns2Diff = new TH2D("ns2Diff", ";delta eta; delta phi", bins, -2, 2, bins, -0.5 * TMath::Pi(), 1.5 * TMath::Pi());
  TH2D* as2Diff = new TH2D("as2Diff", ";delta eta; delta phi", bins, -2, 2, bins, -0.5 * TMath::Pi(), 1.5 * TMath::Pi());

  Float_t v2 = 0.2;
  
  const Double_t kPi = TMath::Pi();
  const Double_t kTwoPi = 2 * kPi;
  
  // event loop
  for (Int_t i=0; i<500; i++)
  {
    if (i % 10 == 0)
      Printf("%d", i);
    Float_t rpangle = gRandom->Uniform(-kPi, kPi);
    
    const Int_t nParticles = 500;
    Float_t etas[nParticles];
    Float_t phis[nParticles];
    Float_t weights[nParticles];
    Int_t   ids[nParticles];
    Int_t nP = 0;
    
    // some particles from the continuum
    if (0)
    {
      for (Int_t j=0; j<nParticles/2; j++)
      {
	etas[nP] = gRandom->Uniform(-1, 1);
	phis[nP] = gRandom->Uniform(-kPi, kPi);
	ids[nP] = -1;
	if (TMath::Abs(etas[nP]) < 1.0)
	  nP++;
      }
    }
    
    // jets
    if (1)
    {
      Float_t width = 0.15;
      Float_t width2 = 0.3;
      for (Int_t j=0; j<20; j++)
      {
	Float_t jetEta = gRandom->Uniform(-1.5, 1.5);
	Float_t jetPhi = gRandom->Uniform(-kPi, kPi);
	
	Float_t jetASEta = gRandom->Uniform(-1.5, 1.5);
	Float_t jetASPhi = jetPhi + kPi;
	
	// kt
// 	jetASPhi += gRandom->Uniform(-0.2, 0.2);
	
	for (Int_t k=0; k<5; k++)
	{
	  etas[nP] = gRandom->Gaus(jetEta, width);
	  phis[nP] = gRandom->Gaus(jetPhi, width);
	  ids[nP] = j;
	  if (TMath::Abs(etas[nP]) < 1.0)
	    nP++;
	}
	  
	for (Int_t k=0; k<5; k++)
	{
	  etas[nP] = gRandom->Gaus(jetASEta, width2);
	  phis[nP] = gRandom->Gaus(jetASPhi, width2);
	  ids[nP] = j;
	  if (TMath::Abs(etas[nP]) < 1.0)
	    nP++;
	}
      }
    }
    
    // calculate flow weights
    for (Int_t j=0; j<nP; j++)
      weights[j] = 1.0 + v2 * TMath::Cos(2*(rpangle - phis[j]));
    
    // fill, two particle correlation
    for (Int_t j=0; j<nP; j++)
    {
      for (Int_t k=0; k<nP; k++)
      {
	if (j == k)
	  continue;
	Float_t deltaPhi = phis[j] - phis[k];
	while (deltaPhi > 1.5 * kPi)
	  deltaPhi -= kTwoPi;
	while (deltaPhi < -0.5 * kPi)
	  deltaPhi += kTwoPi;
	
	Float_t deltaEta = etas[j] - etas[k];

	Float_t weight = 1;
	// apply flow
	weight *= weights[j] * weights[k];
	
	ns->Fill(deltaEta, deltaPhi, weight);
      }
    }
    
    // fill, two plus one particle correlation
    Float_t alpha = 0.2;
    for (Int_t j=0; j<nP; j++)
    {
      for (Int_t k=0; k<nP; k++)
      {
	if (j == k)
	  continue;
	Float_t deltaPhi = phis[j] - phis[k];
	while (deltaPhi > 1.5 * kPi)
	  deltaPhi -= kTwoPi;
	while (deltaPhi < -0.5 * kPi)
	  deltaPhi += kTwoPi;

	// back to back trigger
	if (TMath::Abs(deltaPhi - kPi) < alpha)
	{
	  for (Int_t l=0; l<nP; l++)
	  {
	    if (j == l || k == l)
	      continue;
	    
	    // NS
	    deltaPhi = phis[j] - phis[l];
	    while (deltaPhi > 1.5 * kPi)
	      deltaPhi -= kTwoPi;
	    while (deltaPhi < -0.5 * kPi)
	      deltaPhi += kTwoPi;
	    
	    Float_t deltaEta = etas[j] - etas[l];

	    Float_t weight = 1;
	    // apply flow
// 	    weight *= weights[j] * weights[k] * weights[l];
	    
	    ns2->Fill(deltaEta, deltaPhi, weight);
	    if (ids[j] == ids[l] && ids[j] == ids[k])
	      ns2Same->Fill(deltaEta, deltaPhi, weight);
	    else
	      ns2Diff->Fill(deltaEta, deltaPhi, weight);
	    
	    // AS
	    deltaPhi = phis[k] - phis[l];
	    while (deltaPhi > 1.5 * kPi)
	      deltaPhi -= kTwoPi;
	    while (deltaPhi < -0.5 * kPi)
	      deltaPhi += kTwoPi;
	    
	    deltaEta = etas[k] - etas[l];

	    weight = 1;
	    // apply flow
// 	    weight *= weights[j] * weights[k] * weights[l];
	    
	    as2->Fill(deltaEta, deltaPhi, weight);
	    if (ids[j] == ids[l] && ids[j] == ids[k])
	      as2Same->Fill(deltaEta, deltaPhi, weight);
	    else
	      as2Diff->Fill(deltaEta, deltaPhi, weight);

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