ROOT logo
/* $Id$ */

//
// script to correct the multiplicity spectrum + helpers
//

Bool_t is900GeV = 1;
Bool_t is2360TeV = 0;

// 900 GeV, MC
const Int_t kBinLimits[]   = { 42, 57, 60 };
const Int_t kTrustLimits[] = { 26, 42, 54 };

// 2.36 TeV
//const Int_t kBinLimits[]   = { 43, 67, 83 };
//const Int_t kTrustLimits[] = { 33, 57, 73 };

// 7 TeV
//const Int_t kBinLimits[]   = { 60, 120, 60 };
//const Int_t kTrustLimits[] = { 26, 70, 54 };

void SetTPC()
{
  gSystem->Load("libPWG0base");
  AliMultiplicityCorrection::SetQualityRegions(kFALSE);
}

const char* GetMultLabel(Int_t etaR = -1, Bool_t trueM = kTRUE)
{
	if (etaR == -1)
		etaR = etaRange;
		
	TString tmpStr((trueM) ? "True " : "Measured ");
		
	if (etaR == 4)
	{
		tmpStr += "multiplicity (full phase space)";
	}
	else
		tmpStr += Form("multiplicity in |#eta| < %.1f", (etaR+1)* 0.5);
	return Form("%s", tmpStr.Data());
}

void draw(const char* fileName = "multiplicity.root", const char* folder = "Multiplicity")
{
  loadlibs();

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);

  TFile::Open(fileName);
  mult->LoadHistograms();
  mult->DrawHistograms();

  TH2* hist = (TH2*) gROOT->FindObject("fCorrelation2_zy");
  canvas = new TCanvas("c1", "c1", 600, 500);
  canvas->SetTopMargin(0.05);
  hist->SetStats(kFALSE);
  hist->Draw("COLZ");
  hist->SetTitle(";true multiplicity in |#eta| < 1.5;measured multiplicity in |#eta| < 1.5");
  hist->GetYaxis()->SetTitleOffset(1.1);
  gPad->SetRightMargin(0.12);
  gPad->SetLogz();

  canvas->SaveAs("responsematrix.eps");
}

void loadlibs()
{
  gSystem->Load("libTree");
  gSystem->Load("libVMC");

  gSystem->Load("libSTEERBase");
  gSystem->Load("libESD.so");
  gSystem->Load("libAOD.so");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libPWG0base");
}

void LoadAndInitialize(void* multVoid, void* esdVoid, void* multTriggerVoid, Int_t histID, Bool_t fullPhaseSpace, Int_t* geneLimits)
{
  AliMultiplicityCorrection* mult = (AliMultiplicityCorrection*) multVoid;
  AliMultiplicityCorrection* esd = (AliMultiplicityCorrection*) esdVoid;
  AliMultiplicityCorrection* multTrigger = (AliMultiplicityCorrection*) multTriggerVoid;
  
  for (Int_t i=0; i<3; i++)
    geneLimits[i] = kBinLimits[i];
  
  // REBINNING
  if (1)
  {
    // 900 GeV
    if (is900GeV)
    {
      if (1)
      {
        Int_t bins05 = 31;
        Double_t newBinsEta05[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
                  10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
                  20.5, 22.5, 24.5, 26.5, 28.5, 30.5, 34.5, 38.5, 42.5, 50.5, 
                  100.5 };
      }

      if (0)
      {
        Int_t bins05 = 29;
        Double_t newBinsEta05[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
                10.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
                20.5, 22.5, 24.5, 26.5, 28.5, 30.5, 34.5, 38.5, 42.5, 50.5, 
                100.5 };
      }
      
      if (0)
      {
        Int_t bins05 = 25;
        Double_t* newBinsEta05 = new Double_t[bins05+1];
      
        //newBinsEta05[0] = -0.5;
        //newBinsEta05[1] = 0.5;
        //newBinsEta05[2] = 1.5;
        //newBinsEta05[3] = 2.5;
        
        for (Int_t i=0; i<bins05+1; i++)
          newBinsEta05[i] = -0.5 + i*2;
          //newBinsEta05[i] = 4.5 + (i-4)*2;
      }

      Int_t bins10 = 54;
      Double_t newBinsEta10[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
                                  10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
                                  20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5,
                                  30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5,
                                  40.5, 42.5, 44.5, 46.5, 48.5, 50.5, 52.5, 54.5, 56.5, 58.5, 
                                  60.5, 65.5, 70.5, 100.5 };
                        
      geneLimits[0] = bins05;
      geneLimits[1] = bins10;
      geneLimits[2] = bins10;
    }
    
    // 2.36 TeV
    if (is2360TeV)
    {
      Int_t bins05 = 36;
      Double_t newBinsEta05[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
				  10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
				  20.5, 22.5, 24.5, 26.5, 28.5, 30.5, 32.5, 34.5, 36.5, 38.5, 
				  40.5, 45.5, 50.5, 55.5, 60.5, 100.5 };
      Int_t bins10 = 64;
      Double_t newBinsEta10[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
				  10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
				  20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5,
				  30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5,
				  40.5, 42.5, 44.5, 46.5, 48.5, 50.5, 52.5, 54.5, 56.5, 58.5, 
				  60.5, 62.5, 64.5, 66.5, 68.5, 70.5, 72.5, 74.5, 76.5, 78.5, 
				  80.5, 85.5, 90.5, 100.5 };

      geneLimits[0] = bins05;
      geneLimits[1] = bins10;
      geneLimits[2] = bins10;
    }
    
    // 7 TeV
    if (!is900GeV && !is2360TeV)
    {
      Int_t bins05 = 36;
      Double_t newBinsEta05[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
				  10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
				  20.5, 22.5, 24.5, 26.5, 28.5, 30.5, 32.5, 34.5, 36.5, 38.5, 
				  40.5, 45.5, 50.5, 55.5, 60.5, 100.5 };
      
      Int_t bins10 = 85;
      Double_t newBinsEta10[] = { 
          -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
				  10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
				  20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5,
				  30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5,
				  40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, 49.5, 
				  50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5, 
				  60.5, 62.5, 64.5, 66.5, 68.5, 70.5, 72.5, 74.5, 76.5, 78.5, 
				  80.5, 82.5, 84.5, 86.5, 88.5, 90.5, 92.5, 94.5, 96.5, 98.5, 
				  100.5, 105.5, 110.5, 115.5, 120.5 };
      
      geneLimits[0] = bins05;
      geneLimits[1] = bins10;
      geneLimits[2] = bins10;
    }

    esd->RebinGenerated(bins05, newBinsEta05, bins10, newBinsEta10, bins10, newBinsEta10);
    mult->RebinGenerated(bins05, newBinsEta05, bins10, newBinsEta10, bins10, newBinsEta10);
    multTrigger->RebinGenerated(bins05, newBinsEta05, bins10, newBinsEta10, bins10, newBinsEta10);
  }
  
  for (Int_t hID = ((histID == -1) ? 0 : histID); hID <= ((histID == -1) ? 2 : histID); hID++)
  {
    TH2F* hist = esd->GetMultiplicityESD(hID);
  
    mult->SetMultiplicityESD(hID, hist);
    mult->SetTriggeredEvents(hID, esd->GetTriggeredEvents(hID));
    
    // insert trigger efficiency in flat response matrix
    for (Int_t evType = AliMultiplicityCorrection::kTrVtx; evType <= AliMultiplicityCorrection::kNSD; evType++)
      mult->SetMultiplicityMC(hID, evType, multTrigger->GetMultiplicityMC(hID, evType));
    
    mult->SetNoVertexEvents(hID, multTrigger->GetNoVertexEvents(hID));
    mult->FixTriggerEfficiencies(10);
      
    // small hack to get around charge conservation for full phase space ;-)
    if (fullPhaseSpace)
    {
      TH1* corr = mult->GetCorrelation(histID + 4);
  
      for (Int_t i=2; i<=corr->GetNbinsX(); i+=2)
        for (Int_t j=1; j<=corr->GetNbinsY(); ++j)
        {
          corr->SetBinContent(i, j, corr->GetBinContent(i-1, j));
          corr->SetBinError(i, j, corr->GetBinError(i-1, j));
        }
    }
  }
}

void correct(const char* fileNameMC = "multiplicityMC.root", const char* folder = "Multiplicity", const char* fileNameESD = "multiplicityESD.root", Bool_t chi2 = 1, Int_t histID = 1, Bool_t fullPhaseSpace = kFALSE, Float_t beta = -25, Int_t eventType = 2 /* AliMultiplicityCorrection::kTrVtx */, const char* targetFile = "unfolded.root", const char* folderESD = "Multiplicity", Bool_t calcBias = kFALSE)
{
  loadlibs();
  
  Int_t geneLimits[] = { 0, 0, 0 };
  
  AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
  AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
  AliMultiplicityCorrection* multTrigger = AliMultiplicityCorrection::Open("multiplicityTrigger.root");

  LoadAndInitialize(mult, esd, multTrigger, histID, fullPhaseSpace, geneLimits);
  
  //AliUnfolding::SetDebug(1);

  for (Int_t hID = ((histID == -1) ? 0 : histID); hID <= ((histID == -1) ? 2 : histID); hID++)
  {
    AliUnfolding::SetNbins(kBinLimits[hID], geneLimits[hID]);
  
    TH2F* hist2 = esd->GetMultiplicityMC(hID, eventType);

    if (chi2)
    {
      if (is900GeV)
      {
        //Float_t regParamPol0[] = { 2, 2, 10 };   // TPCITS
        Float_t regParamPol0[] = { 5, 15, 25 }; // SPD
        Float_t regParamPol1[] =  { 0.15, 0.25, 0.5 };
      }
      else if (is2360TeV)
      {
        Float_t regParamPol0[] = { 10, 12, 40 };
        Float_t regParamPol1[] =  { 0.25, 0.25, 2 };
      }
      else
      {
        Float_t regParamPol0[] = { 1, 25, 10 };
        Float_t regParamPol1[] =  { 0.15, 0.5, 0.5 };
        AliUnfolding::SetSkipBinsBegin(3);
      }
      
      Int_t reg = AliUnfolding::kPol0;
      if (beta > 0)
        reg = AliUnfolding::kPol1;
        
      Float_t regParam = TMath::Abs(beta);
      if (histID == -1)
      {
        if (beta > 0)
          regParam = regParamPol1[hID];
        else
          regParam = regParamPol0[hID];
      }
      AliUnfolding::SetChi2Regularization(reg, regParam);
      
      //AliUnfolding::SetChi2Regularization(AliUnfolding::kLog, 1000000);
      //AliUnfolding::SetChi2Regularization(AliUnfolding::kRatio, 10);
      //TVirtualFitter::SetDefaultFitter("Minuit2");
      
      //AliUnfolding::SetCreateOverflowBin(kFALSE);
      //mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0); //mult->SetCreateBigBin(kFALSE);
      //mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0, 125); mult->SetCreateBigBin(kFALSE);
     // AliUnfolding::SetChi2Regularization(AliUnfolding::kEntropy, beta);
      //mult->SetRegularizationParameters(AliMultiplicityCorrection::kLog, 1e5);
      
      if (0)
      {
        // part for checking
        TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
        mcCompare->Sumw2();
        mult->ApplyMinuitFit(hID, fullPhaseSpace, AliMultiplicityCorrection::kMB, 0, kTRUE, mcCompare);
        mult->SetMultiplicityESDCorrected(hID, (TH1F*) mcCompare);
      }
      else
      {
        // Zero Bin
        Int_t zeroBin = 0;
        if (is900GeV) // from data
        {
          // background subtraction
          Int_t background = 0;
          
          //background = 1091 + 4398; // MB1 for run 104824 - 52 (SPD)
          //background = 1087 + 4398; // MB1 for run 104824 - 52 (TPCITS)
          
          background = 417 + 1758; // MB1 for run 104867 - 92 (SPD)
          //background = 1162+422;     // MB1 for run 104892 (TPCITS)
          //background = 5830 + 1384;    // MB1 for run 104824,25,45,52,67,92 (TPC runs) (TPCITS)
          
          //background = 20 + 0; // V0AND for run 104824 - 52
          //background = 10 + 0; // V0AND for run 104867 - 92
          
          Printf("NOTE: Subtracting %d background events", background);
          gSystem->Sleep(1000);
      
          zeroBin = mult->GetTriggeredEvents(hID)->GetBinContent(1) - background - mult->GetMultiplicityESD(hID)->Integral(0, 2, 1, 1);
        }
        else if (is2360TeV)
        {
          // from MC
          Float_t fractionZeroBin = (multTrigger->GetTriggeredEvents(hID)->GetBinContent(1) - multTrigger->GetMultiplicityESD(hID)->Integral(0, 2, 1, 1)) / multTrigger->GetMultiplicityESD(hID)->Integral(1, 1, 1, mult->GetMultiplicityESD(hID)->GetNbinsY());
          zeroBin = fractionZeroBin * mult->GetMultiplicityESD(hID)->Integral(1, 1, 1, mult->GetMultiplicityESD(hID)->GetNbinsY());
          
          Printf("Zero bin from MC: Estimating %d events with trigger but without vertex", zeroBin);
          gSystem->Sleep(1000);
        }
        else
        {
          AliUnfolding::SetSkip0BinInChi2(kTRUE);
        }
      
        //mult->SetVertexRange(3, 4);
        mult->ApplyMinuitFit(hID, fullPhaseSpace, eventType, zeroBin, kFALSE, 0, calcBias);
      }
    }
    else
    {
      // HACK
      //mult->GetMultiplicityESD(hID)->SetBinContent(1, 1, 0);
      //for (Int_t bin=1; bin<=mult->GetCorrelation(hID)->GetNbinsY(); bin++)
      //  mult->GetCorrelation(hID)->SetBinContent(1, bin, 1, 0);
      AliUnfolding::SetChi2Regularization(AliUnfolding::kNone, 0);
      mult->ApplyBayesianMethod(hID, fullPhaseSpace, eventType, 1, beta, 0, kTRUE);
      //mult->ApplyBayesianMethod(hID, fullPhaseSpace, eventType, 1, 5, 0, kFALSE);
    }
  }
  
  Printf("Writing result to %s", targetFile);
  TFile* file = TFile::Open(targetFile, "RECREATE");
  mult->SaveHistograms("Multiplicity");
  file->Write();
  file->Close();

  if (histID == -1)
    return;

  for (hID = ((histID == -1) ? 0 : histID); hID <= ((histID == -1) ? 2 : histID); hID++)
  {
    TH2F* hist2 = esd->GetMultiplicityMC(hID, eventType);
    TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
    mult->DrawComparison(Form("%s_%d_%f", (chi2) ? "MinuitChi2" : "Bayesian", hID, beta), hID, fullPhaseSpace, kTRUE, mcCompare, kFALSE, eventType);

    Printf("<n> = %f", mult->GetMultiplicityESDCorrected(hID)->GetMean());
  }
}

void correctAll(Int_t eventType)
{
  const char* suffix = "";
  switch (eventType)
  {
    case 0: suffix = "trvtx"; break;
    case 1: suffix = "mb"; break;
    case 2: suffix = "inel"; break;
    case 3: suffix = "nsd"; break;
  }

  correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 1, -1, 0, -1, eventType, TString(Form("chi2a_%s.root", suffix)));
  correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 1, -1, 0,  1, eventType, TString(Form("chi2b_%s.root", suffix)));
  correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 0, -1, 0, 40, eventType, TString(Form("bayes_%s.root", suffix)));
  
  if (eventType == 3)
    drawAll(1);
  else if (eventType == 2)
    drawAllINEL();
}

void drawAll(Bool_t showUA5 = kFALSE)
{
  const char* files[] = { "chi2a_nsd.root", "chi2b_nsd.root", "bayes_nsd.root" };
  drawAll(files, showUA5);
}

void drawAllINEL()
{
  const char* files[] = { "chi2a_inel.root", "chi2b_inel.root", "bayes_inel.root" };
  drawAll(files);
}

void drawAllMB()
{
  const char* files[] = { "chi2a_mb.root", "chi2b_mb.root", "bayes_mb.root" };
  drawAll(files);
}

void drawAll(const char** files, Bool_t showUA5 = kFALSE, Bool_t normalize = kFALSE)
{
  loadlibs();
  
  Int_t colors[] = { 1, 2, 4 };
  
  c = new TCanvas(Form("c%d", gRandom->Uniform(100)), "c", 1800, 600);
  c->Divide(3, 1);
  
  l = new TLegend(0.6, 0.6, 0.99, 0.99);
  l->SetFillColor(0);
  
  TH1* hist0 = 0;
  
  for (Int_t hID=0; hID<3; hID++)
  {
    c->cd(hID+1)->SetLogy();
    gPad->SetGridx();
    gPad->SetGridy();
    for (Int_t i=0; i<3; i++)
    {
      TFile::Open(files[i]);
      
      hist = (TH1*) gFile->Get(Form("Multiplicity/fMultiplicityESDCorrected%d", hID));

      Float_t average0 = hist->GetMean();
      hist2 = (TH1*) hist->Clone("temp");
      hist2->SetBinContent(1, 0);
      Float_t average1 = hist2->GetMean();
      Printf("%d: <N> = %.2f <N>/(eta) = %.2f | without 0: <N> = %.2f <N>/(eta) = %.2f", hID, average0, average0 / ((hID+1) - 0.4 * (hID / 2)), average1, average1 / ((hID+1) - 0.4 * (hID / 2)));
      
      hist->SetLineColor(colors[i]);
      
      hist->SetStats(0);
      hist->GetXaxis()->SetRangeUser(0, kBinLimits[hID]);
      
      Float_t min = 0.1;
      Float_t max = hist->GetMaximum() * 1.5;
      
      if (normalize)
        min = 1e-6;
      
      hist->GetYaxis()->SetRangeUser(min, max);
      hist->SetTitle(";unfolded multiplicity;events");
      
      if (hID == 0)
      {
        l->AddEntry(hist, files[i]);
      }
      
      if (hist->Integral() <= 0)
        continue;
      
      if (normalize)
        hist->Scale(1.0 / hist->Integral());
      
      AliPWG0Helper::NormalizeToBinWidth(hist);
      
      hist->DrawCopy((i == 0) ? "" : "SAME");
      
      if (!hist0)
        hist0 = (TH1*) hist->Clone("hist0");
    }
      
    if (hist0)
    {
      line = new TLine(kTrustLimits[hID], hist0->GetMinimum(), kTrustLimits[hID], hist0->GetMaximum());
      line->SetLineWidth(3);
      line->Draw();
    }
  }
  
  c->cd(1);
  l->Draw();
  
  if (showUA5)
  {
    TGraphErrors *gre = new TGraphErrors(23);
    gre->SetName("Graph");
    gre->SetTitle("UA5");
    gre->SetFillColor(1);
    gre->SetMarkerStyle(24);
    gre->SetPoint(0,0,0.15);
    gre->SetPointError(0,0.5,0.01);
    gre->SetPoint(1,1,0.171);
    gre->SetPointError(1,0.5,0.007);
    gre->SetPoint(2,2,0.153);
    gre->SetPointError(2,0.5,0.007);
    gre->SetPoint(3,3,0.124);
    gre->SetPointError(3,0.5,0.006);
    gre->SetPoint(4,4,0.099);
    gre->SetPointError(4,0.5,0.005);
    gre->SetPoint(5,5,0.076);
    gre->SetPointError(5,0.5,0.005);
    gre->SetPoint(6,6,0.057);
    gre->SetPointError(6,0.5,0.004);
    gre->SetPoint(7,7,0.043);
    gre->SetPointError(7,0.5,0.004);
    gre->SetPoint(8,8,0.032);
    gre->SetPointError(8,0.5,0.003);
    gre->SetPoint(9,9,0.024);
    gre->SetPointError(9,0.5,0.003);
    gre->SetPoint(10,10,0.018);
    gre->SetPointError(10,0.5,0.002);
    gre->SetPoint(11,11,0.013);
    gre->SetPointError(11,0.5,0.002);
    gre->SetPoint(12,12,0.01);
    gre->SetPointError(12,0.5,0.002);
    gre->SetPoint(13,13,0.007);
    gre->SetPointError(13,0.5,0.001);
    gre->SetPoint(14,14,0.005);
    gre->SetPointError(14,0.5,0.001);
    gre->SetPoint(15,15,0.004);
    gre->SetPointError(15,0.5,0.001);
    gre->SetPoint(16,16,0.0027);
    gre->SetPointError(16,0.5,0.0009);
    gre->SetPoint(17,17,0.0021);
    gre->SetPointError(17,0.5,0.0008);
    gre->SetPoint(18,18,0.0015);
    gre->SetPointError(18,0.5,0.0007);
    gre->SetPoint(19,19,0.0011);
    gre->SetPointError(19,0.5,0.0006);
    gre->SetPoint(20,20,0.0008);
    gre->SetPointError(20,0.5,0.0005);
    gre->SetPoint(21,22,0.00065);
    gre->SetPointError(21,1,0.0003);
    gre->SetPoint(22,27.5,0.00013);
    gre->SetPointError(22,3.5,7.1e-05);
    
    for (Int_t i=0; i<gre->GetN(); i++)
    {
      gre->GetY()[i] *= hist0->Integral();
      gre->GetEY()[i] *= hist0->Integral();
    }
    
    gre->Draw("P");
    
    ratio = (TGraphErrors*) gre->Clone("ratio");
    
    for (Int_t i=0; i<gre->GetN(); i++)
    {
      //Printf("%f %d", hist0->GetBinContent(hist0->FindBin(ratio->GetX()[i])), hist0->FindBin(ratio->GetX()[i]));
      Int_t bin = hist0->FindBin(gre->GetX()[i]);
      if (hist0->GetBinContent(bin) > 0)
      {
        ratio->GetEY()[i] = TMath::Sqrt((ratio->GetEY()[i] / ratio->GetY()[i])**2 + (hist0->GetBinError(bin) / hist0->GetBinContent(bin))**2);
        ratio->GetY()[i] /= hist0->GetBinContent(bin);
        ratio->GetEY()[i] *= ratio->GetY()[i];
      }
    }
    new TCanvas;
    gPad->SetGridx();
    gPad->SetGridy();
    //ratio->Print();
    ratio->Draw("AP");
    ratio->GetYaxis()->SetRangeUser(0.5, 1.5);
  }
  
  c->SaveAs("draw_all.png");
}

TH1* GetChi2Bias(Float_t alpha = -5)
{
  loadlibs();

  AliMultiplicityCorrection::EventType eventType = AliMultiplicityCorrection::kMB;
  Int_t hID = 1;
  
  correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 1, hID, 0, alpha, eventType, "nobias.root", "Multiplicity", kFALSE);

  correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 1, hID, 0, alpha, eventType, "withbias.root", "Multiplicity", kTRUE);

  // without bias calculation
  mult = AliMultiplicityCorrection::Open("nobias.root");
  baseold = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("baseold");
  
  // with bias calculation
  mult = AliMultiplicityCorrection::Open("withbias.root");
  base = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("base");
 
  // relative error plots
  ratio1 = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("hist1");
  ratio1->SetStats(0);
  ratio1->SetTitle(";unfolded multiplicity;relative error");
  ratio1->Reset();
  ratio2 = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("hist1");
  ratio2->Reset();

  for (Int_t t = 0; t<baseold->GetNbinsX(); t++)
  {
    Printf("Bin %d; Content: %f; Chi2 Error: %f; Bias: %f; In percent: %.2f %.2f", t+1, base->GetBinContent(t+1), baseold->GetBinError(t+1), base->GetBinError(t+1), (base->GetBinContent(t+1) > 0) ? 100.0 * baseold->GetBinError(t+1) / base->GetBinContent(t+1) : -1, (base->GetBinContent(t+1) > 0) ? 100.0 * base->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
    if (base->GetBinContent(t+1) <= 0)
      continue;
    ratio1->SetBinContent(t+1, baseold->GetBinError(t+1) / base->GetBinContent(t+1));
    ratio2->SetBinContent(t+1, base->GetBinError(t+1) / base->GetBinContent(t+1));
  }
  
  //new TCanvas; base->Draw(); gPad->SetLogy();

  c = new TCanvas;
  ratio1->GetYaxis()->SetRangeUser(0, 1);
  ratio1->GetXaxis()->SetRangeUser(0, 50);
  ratio1->Draw();
  ratio2->SetLineColor(2);
  ratio2->Draw("SAME");
  
  return base;
}

void CheckBayesianBias()
{
  loadlibs();
  
  const char* fileNameMC = "multiplicityMC.root";
  const char* folder = "Multiplicity";
  const char* fileNameESD = "multiplicityESD.root";
  const char* folderESD = "Multiplicity";

  AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
  AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
  
  const Int_t kMaxBins = 35;
  AliUnfolding::SetNbins(kMaxBins, kMaxBins);
  //AliUnfolding::SetDebug(1);
  
  Int_t hID = 0;
  
  TH2F* hist = esd->GetMultiplicityESD(hID);
  mult->SetMultiplicityESD(hID, hist);  
  
  // without bias calculation
  mult->ApplyBayesianMethod(hID, kFALSE, 0, 1, 10, 0, 1);
  baseold = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("baseold");
  
  // with bias calculation
  mult->ApplyBayesianMethod(hID, kFALSE, 0, 1, 10, 0, 2);
  base = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("base");
  
  TH1* hist1 = new TH1F("hist1", "", 100, 0, 20);
  TH1* hist2 = new TH1F("hist2", "", 100, 0, 20);
  
  for (Int_t t = 0; t<kMaxBins; t++)
  {
    Printf("Bin %d; Content: %f; Randomization Error: %f; Bias: %f; In percent: %.2f %.2f", t+1, base->GetBinContent(t+1), baseold->GetBinError(t+1), base->GetBinError(t+1), (base->GetBinContent(t+1) > 0) ? 100.0 * baseold->GetBinError(t+1) / base->GetBinContent(t+1) : -1, (base->GetBinContent(t+1) > 0) ? 100.0 * base->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
    
    hist1->Fill((base->GetBinContent(t+1) > 0) ? 100.0 * baseold->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
    hist2->Fill((base->GetBinContent(t+1) > 0) ? 100.0 * base->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
  }
  
  new TCanvas;
  hist1->Draw();
  hist2->SetLineColor(2);
  hist2->Draw("SAME");
}

void DrawUnfoldingLimit(Int_t hID, Float_t min, Float_t max)
{
  line = new TLine(kTrustLimits[hID], min, kTrustLimits[hID], max);
  line->SetLineWidth(2);
  line->Draw();
}

void DataScan(Int_t hID, Bool_t redo = kTRUE)
{
  // makes a set of unfolded spectra and compares
  // don't forget FindUnfoldedLimit in plots.C

  loadlibs();

  // files...
  Bool_t mc = 1;
  const char* fileNameMC = "multiplicityMC.root";
  const char* folder = "Multiplicity";
  const char* fileNameESD = "multiplicityESD.root";
  const char* folderESD = "Multiplicity";
  const Int_t kMaxBins = kBinLimits[hID];
  
  AliMultiplicityCorrection::EventType eventType = AliMultiplicityCorrection::kTrVtx;
  Bool_t evaluteBias = kFALSE;
  
  Int_t referenceCase = 2; // all results are shown as ratio to this case
  
  // chi2 range
  AliUnfolding::RegularizationType regBegin = AliUnfolding::kPol0;
  AliUnfolding::RegularizationType regEnd = AliUnfolding::kPol1;
  Float_t regParamBegin[] = { 0, 1, 0.2, 3 }; 
  Float_t regParamEnd[] = { 0, 11, 0.5, 31 }; 
  Float_t regParamStep[] = { 0, 2, 2, TMath::Sqrt(10) }; 

  // bayesian range
  Int_t iterBegin = 40;
  Int_t iterEnd = 41;
  Int_t iterStep = 20;
  
  TList labels;
  
  AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
  AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
  
  mult->SetMultiplicityESD(hID, esd->GetMultiplicityESD(hID));
  
  // insert trigger efficiency in flat response matrix
  AliMultiplicityCorrection* multTrigger = AliMultiplicityCorrection::Open("multiplicityTrigger.root");
  for (Int_t evType = AliMultiplicityCorrection::kTrVtx; evType <= AliMultiplicityCorrection::kNSD; evType++)
    mult->SetMultiplicityMC(hID, evType, multTrigger->GetMultiplicityMC(hID, evType));
  
  mult->SetNoVertexEvents(hID, multTrigger->GetNoVertexEvents(hID));
  mult->FixTriggerEfficiencies(10);
  
  Float_t fraction0Generated = multTrigger->GetFraction0Generated(hID);
  
  if (mc)
    mult->SetMultiplicityMC(hID, eventType, esd->GetMultiplicityMC(hID, eventType));
  
  AliUnfolding::SetNbins(kMaxBins, kMaxBins);
  //AliUnfolding::SetDebug(1);
  
  Int_t count = -1;
  
  for (AliUnfolding::RegularizationType reg = regBegin; reg <= regEnd; reg++)
  {
    for (Float_t regParam = regParamBegin[reg]; regParam < regParamEnd[reg]; regParam *= regParamStep[reg])
    {
      count++;
      labels.Add(new TObjString(Form("#chi^{2} Reg %d #beta = %.2f", (Int_t) reg, regParam)));
      
      if (!redo)
        continue;
    
      AliUnfolding::SetChi2Regularization(reg, regParam);
      
      mult->ApplyMinuitFit(hID, kFALSE, eventType, fraction0Generated, kFALSE, 0, evaluteBias);
      
      file = TFile::Open(Form("datascan_%d.root", count), "RECREATE");
      mult->SaveHistograms();
      file->Close();
    }
  }
  
  for (Int_t iter = iterBegin; iter <= iterEnd; iter += iterStep)
  {
    count++;
    labels.Add(new TObjString(Form("Bayesian Iter = %d", iter)));
    
    if (!redo)
      continue;
    
    mult->ApplyBayesianMethod(hID, kFALSE, eventType, 1, iter, 0, kTRUE);
    
    file = TFile::Open(Form("datascan_%d.root", count), "RECREATE");
    mult->SaveHistograms();
    file->Close();
  }
      
  // 1) all distributions
  // 2) ratio to MC
  // 3) ratio to ref point
  // 4) relative error
  // 5) residuals
  c = new TCanvas("c", "c", 1200, 800);
  c->Divide(3, 2);
  
  c->cd(1)->SetLogy();
  
  // get reference point
  mult = AliMultiplicityCorrection::Open(Form("datascan_%d.root", referenceCase));
  if (!mult)
    return;
  refPoint = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("refPoint");
  
  legend = new TLegend(0.5, 0.5, 0.99, 0.99);
  legend->SetFillColor(0);
  
  TH1* residualSum = new TH1F("residualSum", ";;residual squared sum", count + 1, 0.5, count + 1.5);
  
  Int_t allowedCount = count;
  count = 0;
  while (1)
  {
    mult = AliMultiplicityCorrection::Open(Form("datascan_%d.root", count++));
    if (!mult)
      break;
    if (count > allowedCount+1)
      break;
      
    hist = (TH1*) mult->GetMultiplicityESDCorrected(hID);
    hist->SetLineColor((count-1) % 4 + 1);
    hist->SetLineStyle((count-1) / 4 + 1);
    hist->GetXaxis()->SetRangeUser(0, kMaxBins);
    hist->GetYaxis()->SetRangeUser(0.1, hist->GetMaximum() * 1.5);
    hist->SetStats(kFALSE);
    hist->SetTitle("");
    
    legend->AddEntry(hist->Clone(), labels.At(count-1)->GetName());
    
    c->cd(1);
    hist->DrawCopy((count == 1) ? "HIST" : "HISTSAME");
    
    DrawUnfoldingLimit(hID, 0.1, hist->GetMaximum());
    
    if (mc)
    {
      TH2* mcHist2d = mult->GetMultiplicityMC(hID, eventType);
      mcHist = mcHist2d->ProjectionY("mcmchist", 1, mcHist2d->GetNbinsX());
      
      c->cd(1);
      mcHist->SetMarkerStyle(24);
      mcHist->Draw("P SAME");
      
      c->cd(2);
      // calculate ratio using only the error on the mc bin
      ratio = (TH1*) hist->Clone("ratio");
      for (Int_t bin=1; bin<=ratio->GetNbinsX(); bin++)
      {
        if (mcHist->GetBinContent(bin) <= 0)
          continue;
        ratio->SetBinContent(bin, hist->GetBinContent(bin) / mcHist->GetBinContent(bin));
        ratio->SetBinError(bin, mcHist->GetBinError(bin) / mcHist->GetBinContent(bin) * ratio->GetBinContent(bin));
      }
      
      ratio->GetYaxis()->SetRangeUser(0.5, 1.5);
      ratio->GetYaxis()->SetTitle("Ratio unfolded / MC");
      ratio->DrawCopy((count == 1) ? "HIST" : "HISTSAME");
    
      DrawUnfoldingLimit(hID, 0.5, 1.5);
    }
    
    c->cd(3);
    // calculate ratio using no errors for now
    ratio = (TH1*) hist->Clone("ratio");
    for (Int_t bin=1; bin<=ratio->GetNbinsX(); bin++)
    {
      if (refPoint->GetBinContent(bin) <= 0)
        continue;
      ratio->SetBinContent(bin, hist->GetBinContent(bin) / refPoint->GetBinContent(bin));
      ratio->SetBinError(bin, 0);
    }
    
    ratio->GetYaxis()->SetRangeUser(0.5, 1.5);
    ratio->GetYaxis()->SetTitle("Ratio unfolded / unfolded reference case");
    ratio->DrawCopy((count == 1) ? "" : "SAME");
    
    DrawUnfoldingLimit(hID, 0.5, 1.5);
    
    c->cd(4);
    ratio = (TH1*) hist->Clone("ratio");
    for (Int_t bin=1; bin<=ratio->GetNbinsX(); bin++)
    {
      if (ratio->GetBinContent(bin) <= 0)
        continue;
      ratio->SetBinContent(bin, ratio->GetBinError(bin) / ratio->GetBinContent(bin));
      ratio->SetBinError(bin, 0);
    }
    ratio->GetYaxis()->SetRangeUser(0, 1);
    ratio->GetYaxis()->SetTitle("Relative error");
    ratio->DrawCopy((count == 1) ? "" : "SAME");
    
    DrawUnfoldingLimit(hID, 0, 1);
    
    c->cd(5);
    Float_t sum;
    residuals = mult->GetResiduals(hID, AliMultiplicityCorrection::kTrVtx, sum);
    residuals->SetStats(0);
    residuals->GetXaxis()->SetRangeUser(0, kMaxBins);
    residuals->SetStats(kFALSE);
    residuals->SetLineColor((count-1) % 4 + 1);
    residuals->SetLineStyle((count-1) / 4 + 1);
    residuals->GetYaxis()->SetRangeUser(-5, 5);
    residuals->DrawCopy((count == 1) ? "" : "SAME");
    
    residualSum->Fill(count, sum);
    residualSum->GetXaxis()->SetBinLabel(count, labels.At(count-1)->GetName());
  }
  
  c->cd(6);
  residualSum->Draw();
  legend->Draw();
}

void DrawBayesianIterations(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", Int_t histID = 1, Int_t eventType = 0 /* AliMultiplicityCorrection::kTrVtx */)
{
  loadlibs();
  
  const char* folder = "Multiplicity";

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);
  TFile::Open(fileNameMC);
  mult->LoadHistograms();

  AliMultiplicityCorrection* esd = new AliMultiplicityCorrection(folder, folder);
  TFile::Open(fileNameESD);
  esd->LoadHistograms();

  TH2F* hist = esd->GetMultiplicityESD(histID);
  TH2F* hist2 = esd->GetMultiplicityMC(histID, eventType);
  
  mult->SetMultiplicityESD(histID, hist);
  mult->SetMultiplicityMC(histID, eventType, hist2);
  
  TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
  //mcCompare->Scale(1.0 / mcCompare->Integral());

  TH1* esdHist = (TH1*) hist->ProjectionY("myesd", 1, 1)->Clone("myesd");
  //esdHist->Scale(1.0 / esdHist->Integral());
  
  c = new TCanvas("c", "c", 1200, 600);
  c->Divide(2, 1);
  
  c->cd(1);
  gPad->SetLeftMargin(0.12);
  gPad->SetTopMargin(0.05);
  gPad->SetRightMargin(0.05);
  gPad->SetLogy();
  gPad->SetGridx();
  gPad->SetGridy();
    
  mcCompare->GetXaxis()->SetRangeUser(0, 80);
  mcCompare->SetStats(0);
  mcCompare->SetFillColor(5);
  mcCompare->SetLineColor(5);
  mcCompare->SetTitle(Form(";%s;Entries", GetMultLabel(1)));
  mcCompare->GetYaxis()->SetRangeUser(2, esdHist->GetMaximum() * 2);
  mcCompare->GetYaxis()->SetTitleOffset(1.3);
  mcCompare->Draw("HIST");
  esdHist->SetMarkerStyle(5);
  esdHist->Draw("P HIST SAME");
  
  c->cd(2);
  gPad->SetTopMargin(0.05);
  gPad->SetRightMargin(0.05);
  gPad->SetGridx();
  gPad->SetGridy();
  
  trueMeasuredRatio = (TH1*) mcCompare->Clone("trueMeasuredRatio");
  trueMeasuredRatio->Divide(esdHist);
  trueMeasuredRatio->SetStats(0);
  trueMeasuredRatio->SetTitle(Form(";%s;Ratio", GetMultLabel(1)));
  trueMeasuredRatio->GetYaxis()->SetTitleOffset(1.3);
  trueMeasuredRatio->GetYaxis()->SetRangeUser(0, 2);
  // ROOT displays all values > 2 at 2 which looks weird
  for (Int_t i=1; i<=trueMeasuredRatio->GetNbinsX(); i++)
    if (trueMeasuredRatio->GetBinContent(i) > 2)
      trueMeasuredRatio->SetBinContent(i, 0);
  trueMeasuredRatio->SetMarkerStyle(5);
  trueMeasuredRatio->Draw("P");

  Int_t colors[] = {1, 2, 4, 6};
  
  legend = new TLegend(0.15, 0.13, 0.5, 0.5);
  legend->SetFillColor(0);
  legend->SetTextSize(0.04);
  
  legend->AddEntry(mcCompare, "True", "F");
  legend->AddEntry(esdHist, "Measured", "P");

  legend2 = new TLegend(0.15, 0.13, 0.5, 0.4);
  legend2->SetFillColor(0);
  legend2->SetTextSize(0.04);
    
  legend2->AddEntry(trueMeasuredRatio, "Measured", "P");
  
  Int_t iters[] = {1, 3, 10, -1};
  for (Int_t i = 0; i<4; i++)
  {
    Int_t iter = iters[i];
    mult->ApplyBayesianMethod(histID, kFALSE, eventType, 1, iter, 0, 0);
    corr = mult->GetMultiplicityESDCorrected(histID);
    corr->Scale(1.0 / corr->Integral());
    corr->Scale(mcCompare->Integral());
    corr->GetXaxis()->SetRangeUser(0, 80);
    //corr->SetMarkerStyle(20+iter);
    corr->SetLineColor(colors[i]);
    corr->SetLineStyle(i+1);
    corr->SetLineWidth(2);
    
    c->cd(1);
    corr->DrawCopy("SAME HIST");
    
    c->cd(2);
    clone = (TH1*) corr->Clone("clone");
    clone->Divide(mcCompare, corr);
    clone->GetYaxis()->SetRangeUser(0, 2);
    clone->DrawCopy("SAME HIST");
    
    legend->AddEntry((TH1*) corr->Clone(), (iter > -1) ? Form("%d iteration%s", iter, (iter == 1) ? "" : "s") : "Convergence", "L");
    legend2->AddEntry((TH1*) corr->Clone(), (iter > -1) ? Form("%d iteration%s", iter, (iter == 1) ? "" : "s") : "Convergence", "L");
  }
  
  c->cd(1);
  legend->Draw();
  
  c->cd(2);
  legend2->Draw();
  
  c->SaveAs("bayesian_iterations.eps");
}

void CompareChi2Bayesian(Int_t histID = 2, const char* chi2File = "chi2.root", const char* bayesianFile = "bayesian.root", const char* label1 = "Chi2", const char* label2 = "Bayesian", const char* mcFile = 0, Float_t simpleCorrect = 0)
{
  const char* folder = "Multiplicity";

  loadlibs();

  AliMultiplicityCorrection* chi2 = new AliMultiplicityCorrection(folder, folder);
  TFile::Open(chi2File);
  chi2->LoadHistograms();

  AliMultiplicityCorrection* bayesian = new AliMultiplicityCorrection(folder, folder);
  TFile::Open(bayesianFile);
  bayesian->LoadHistograms();

  histRAW = chi2->GetMultiplicityESD(histID)->ProjectionY("raw", 1, chi2->GetMultiplicityESD(histID)->GetNbinsX());
  histRAW->Scale(1.0 / histRAW->Integral());

  histC = chi2->GetMultiplicityESDCorrected(histID);
  histB = bayesian->GetMultiplicityESDCorrected(histID);

  c = new TCanvas("CompareChi2Bayesian", "CompareChi2Bayesian", 800, 600);
  c->SetRightMargin(0.05);
  c->SetTopMargin(0.05);
  c->SetLogy();
  c->SetGridx();
  c->SetGridy();

  histC->SetTitle(";N;P(N)");
  histC->SetStats(kFALSE);
  histC->GetXaxis()->SetRangeUser(0, 100);

  histC->SetLineColor(1);
  histB->SetLineColor(2);
  histRAW->SetLineColor(3);

  histC->DrawCopy("HISTE");
  histB->DrawCopy("HISTE SAME");
  histRAW->DrawCopy("SAME");

  legend = new TLegend(0.2, 0.2, 0.4, 0.4);
  legend->SetFillColor(0);

  legend->AddEntry(histC, label1);
  legend->AddEntry(histB, label2);
  legend->AddEntry(histRAW, "raw ESD");

  histGraph = 0;
  if (simpleCorrect > 0)
  {
    graph = new TGraph;
    graph->SetMarkerStyle(25);
    graph->SetFillColor(0);
    for (Int_t bin=1; bin<=histRAW->GetNbinsX(); bin++)
      graph->SetPoint(graph->GetN(), histRAW->GetXaxis()->GetBinCenter(bin) * simpleCorrect, histRAW->GetBinContent(bin));

    graph->Draw("PSAME");
    legend->AddEntry(graph, "weighting");

    // now create histogram from graph and normalize
    histGraph = (TH1*) histRAW->Clone();
    histGraph->Reset();
    for (Int_t bin=1; bin<=histGraph->GetNbinsX(); bin++)
    {
      Int_t j=1;
      for (j=1; j<graph->GetN(); j++)
        if (graph->GetX()[j] > histGraph->GetXaxis()->GetBinCenter(bin))
	  break;
      if (j == graph->GetN())
        continue;
      if (histGraph->GetXaxis()->GetBinCenter(bin) - graph->GetX()[j] < graph->GetX()[j-1] - histGraph->GetXaxis()->GetBinCenter(bin))
        j--;
      histGraph->SetBinContent(bin, graph->GetY()[j]);
    }

    Printf("Integral = %f", histGraph->Integral());
    histGraph->Scale(1.0 / histGraph->Integral());

    histGraph->SetLineColor(6);
    histGraph->DrawCopy("SAME");
    legend->AddEntry(histGraph, "weighting normalized");
  }

  if (mcFile)
  {
    AliMultiplicityCorrection* mc = new AliMultiplicityCorrection(folder, folder);
    TFile::Open(mcFile);
    mc->LoadHistograms();

    histMC = mc->GetMultiplicityVtx(histID)->ProjectionY("mc", 1, mc->GetMultiplicityVtx(histID)->GetNbinsX());
    histMC->Sumw2();
    histMC->Scale(1.0 / histMC->Integral());

    histMC->Draw("HISTE SAME");
    histMC->SetLineColor(4);
    legend->AddEntry(histMC, "MC");
  }

  legend->Draw();

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

  if (!mcFile)
    return;

  // build ratios

  c = new TCanvas("CompareChi2BayesianRatio", "CompareChi2BayesianRatio", 800, 600);
  c->SetRightMargin(0.05);
  c->SetTopMargin(0.05);
  c->SetGridx();
  c->SetGridy();

  for (Int_t bin=1; bin<=histC->GetNbinsX(); bin++)
  {
    if (histMC->GetBinContent(bin) > 0)
    {
      histC->SetBinContent(bin, histC->GetBinContent(bin) / histMC->GetBinContent(bin));
      histB->SetBinContent(bin, histB->GetBinContent(bin) / histMC->GetBinContent(bin));

      /*
      if (histGraph)
      {
        histGraph->SetBinContent(bin, histGraph->GetBinContent(bin) / histMC->GetBinContent(bin));
        histGraph->SetBinError(bin, 0);
      }
      */

      // TODO errors?
      histC->SetBinError(bin, 0);
      histB->SetBinError(bin, 0);
    }
  }

  histC->GetYaxis()->SetRangeUser(0.5, 2);
  histC->GetYaxis()->SetTitle("Unfolded / MC");

  histC->Draw("HIST");
  histB->Draw("HIST SAME");
  /*
  if (histGraph)
    histGraph->Draw("HIST SAME");
  */

  /*
  if (simpleCorrect > 0)
  {
    graph2 = new TGraph;
    graph2->SetMarkerStyle(25);
    graph2->SetFillColor(0);
    for (Int_t i=0; i<graph->GetN(); i++)
    {
      Float_t mcValue = histMC->GetBinContent(histMC->FindBin(graph->GetX()[i]));
      Float_t mcError = histMC->GetBinError(histMC->FindBin(graph->GetX()[i]));
      if (mcValue > 0)
        graph2->SetPoint(graph2->GetN(), graph->GetX()[i], graph->GetY()[i] / mcValue);
    }
    graph2->Draw("PSAME");
  }
  */
  
  c->SaveAs(Form("%s.png", c->GetName()));
  c->SaveAs(Form("%s.eps", c->GetName()));
}


void CompareMC(Int_t histID, Int_t eventType, const char* file1, const char* file2, const char* label1, const char* label2)
{
  const char* folder = "Multiplicity";

  loadlibs();

  AliMultiplicityCorrection* mc1 = new AliMultiplicityCorrection(folder, folder);
  TFile::Open(file1);
  mc1->LoadHistograms();
  histMC1 = mc1->GetMultiplicityMC(histID, eventType)->ProjectionY("mc1", 1, mc1->GetMultiplicityMC(histID, eventType)->GetNbinsX());
  histMC1->Scale(1.0 / histMC1->Integral());

  AliMultiplicityCorrection* mc2 = new AliMultiplicityCorrection(folder, folder);
  TFile::Open(file2);
  mc2->LoadHistograms();
  histMC2 = mc2->GetMultiplicityMC(histID, eventType)->ProjectionY("mc2", 1, mc2->GetMultiplicityMC(histID, eventType)->GetNbinsX());
  histMC2->Scale(1.0 / histMC2->Integral());

  c = new TCanvas("CompareMC", "CompareMC", 800, 600);
  c->SetRightMargin(0.05);
  c->SetTopMargin(0.05);
  c->SetLogy();

  histMC1->SetTitle(";N;P(N)");
  histMC1->SetStats(kFALSE);
  histMC1->GetXaxis()->SetRangeUser(0, 100);

  histMC1->SetLineColor(1);
  histMC2->SetLineColor(2);

  histMC1->Draw();
  histMC2->Draw("SAME");

  legend = new TLegend(0.2, 0.2, 0.4, 0.4);
  legend->SetFillColor(0);

  legend->AddEntry(histMC1, label1);
  legend->AddEntry(histMC2, label2);

  legend->Draw();

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

void* fit2Step(const char* fileNameMC = "multiplicityMC_2M.root", const char* fileNameESD = "multiplicityMC_1M_3.root", Int_t histID = 3, Bool_t fullPhaseSpace = kFALSE)
{
  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileNameMC);
  mult->LoadHistograms("Multiplicity");

  TFile::Open(fileNameESD);
  TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", histID));
  TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", ((fullPhaseSpace) ? 4 : histID)));
  //hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityINEL%d", histID));

  mult->SetMultiplicityESD(histID, hist);

  // small hack to get around charge conservation for full phase space ;-)
  if (fullPhaseSpace)
  {
    TH1* corr = mult->GetCorrelation(histID + 4);

    for (Int_t i=2; i<=corr->GetNbinsX(); i+=2)
      for (Int_t j=1; j<=corr->GetNbinsY(); ++j)
      {
        corr->SetBinContent(i, j, corr->GetBinContent(i-1, j));
        corr->SetBinError(i, j, corr->GetBinError(i-1, j));
      }
  }

  mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
  mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
  mult->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, hist2->ProjectionY("mymchist"));

  TH1* result = (TH1*) mult->GetMultiplicityESDCorrected((fullPhaseSpace) ? 4 : histID))->Clone("firstresult");

  mult->SetRegularizationParameters(AliMultiplicityCorrection::kEntropy, 100000);
  mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE, result);
  mult->DrawComparison("MinuitChi2_Step2", histID, fullPhaseSpace, kTRUE, hist2->ProjectionY("mymchist"));

  return mult;
}

const char* GetRegName(Int_t type)
{
  switch (type)
  {
    case AliMultiplicityCorrection::kNone:      return "None"; break;
    case AliMultiplicityCorrection::kPol0:      return "Pol0"; break;
    case AliMultiplicityCorrection::kPol1:      return "Pol1"; break;
    case AliMultiplicityCorrection::kCurvature: return "TotalCurvature"; break;
    case AliMultiplicityCorrection::kEntropy:   return "Reduced cross-entropy"; break;
    case AliMultiplicityCorrection::kLog   :    return "Log"; break;
  }
  return 0;
}

const char* GetEventTypeName(Int_t type)
{
  switch (type)
  {
    case AliMultiplicityCorrection::kTrVtx:   return "trigger, vertex"; break;
    case AliMultiplicityCorrection::kMB:      return "minimum bias"; break;
    case AliMultiplicityCorrection::kINEL:    return "inelastic"; break;
  }
  return 0;
}

void EvaluateBayesianMethodIterationsSmoothing(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", const char* targetDir = "bayesian", Int_t histID = 1)
{
  gSystem->mkdir(targetDir);

  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
  TFile::Open(fileNameMC);
  mult->LoadHistograms("Multiplicity");

  AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
  TFile::Open(fileNameESD);
  multESD->LoadHistograms("Multiplicity");
  mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));

  Int_t count = 0; // just to order the saved images...

  TFile* graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir), "RECREATE");

  Int_t colors[] =  {1, 2, 3, 4, 6};
  Int_t markers[] = {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3, 4, 5, 6};

  for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kTrVtx; ++type)
  //for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kINEL; ++type)
  {
    TString tmp;
    tmp.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));

    TCanvas* canvas = new TCanvas(tmp, tmp, 800, 600);

    for (Int_t i = 1; i <= 5; i++)
    {
      Int_t iterArray[5] = {2, 5, 10, 20, -1};
      Int_t iter = iterArray[i-1];

      TGraph* fitResultsMC[3];
      for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
      {
        fitResultsMC[region] = new TGraph;
        fitResultsMC[region]->SetTitle(Form("%d iterations - reg. %d", iter, region+1));
        fitResultsMC[region]->GetXaxis()->SetTitle("smoothing parameter #alpha");
        fitResultsMC[region]->GetYaxis()->SetTitle(Form("P_{1} in region %d", region));
        fitResultsMC[region]->SetName(Form("%s_MC_%d", tmp.Data(), i * AliMultiplicityCorrection::kQualityRegions + region - 2));
        fitResultsMC[region]->SetFillColor(0);
        //fitResultsMC[region]->SetMarkerStyle(markers[(i-1) * AliMultiplicityCorrection::kQualityRegions + region]);
        fitResultsMC[region]->SetMarkerStyle(markers[i-1]);
        fitResultsMC[region]->SetLineColor(colors[i-1]);
        fitResultsMC[region]->SetMarkerColor(colors[i-1]);
      }

      TGraph* fitResultsRes = new TGraph;
      fitResultsRes->SetTitle(Form("%d iterations", iter));
      fitResultsRes->SetName(Form("%s_Res_%d", tmp.Data(), i));
      fitResultsRes->GetXaxis()->SetTitle("smoothing parameter");
      fitResultsRes->GetYaxis()->SetTitle("P_{2}");

      fitResultsRes->SetFillColor(0);
      fitResultsRes->SetMarkerStyle(markers[i-1]);
      fitResultsRes->SetMarkerColor(colors[i-1]);
      fitResultsRes->SetLineColor(colors[i-1]);

      for (Float_t weight = 0.0; weight < 1.01; weight += 0.2)
      {
        Float_t chi2MC = 0;
        Float_t residuals = 0;

        mult->ApplyBayesianMethod(histID, kFALSE, type, weight, iter, 0, kFALSE);
        mult->DrawComparison(Form("%s/BayesianIterSmooth_%03d_%d_%d_%f", targetDir, count++, type, iter, weight), histID, kFALSE, kTRUE, multESD->GetMultiplicityMC(histID, type)->ProjectionY());
        mult->GetComparisonResults(&chi2MC, 0, &residuals);

        for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
          fitResultsMC[region]->SetPoint(fitResultsMC[region]->GetN(), weight, mult->GetQuality(region));

        fitResultsRes->SetPoint(fitResultsRes->GetN(), weight, residuals);
      }

      graphFile->cd();
      for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
        fitResultsMC[region]->Write();

      fitResultsRes->Write();
    }
  }

  graphFile->Close();
}

void EvaluateDrawResult(const char* targetDir, Int_t type = 0, Bool_t plotRes = kTRUE)
{
  gSystem->Load("libPWG0base");

  TString name;
  TFile* graphFile = 0;
  if (type == -1)
  {
    name = "EvaluateChi2Method";
    graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir));
  }
  else
  {
    name.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
    graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir));
  }

  TCanvas* canvas = new TCanvas(name, name, 800, 500);
  if (type == -1)
  {
    canvas->SetLogx();
    canvas->SetLogy();
  }
  canvas->SetTopMargin(0.05);
  canvas->SetGridx();
  canvas->SetGridy();

  TLegend* legend = new TLegend(0.8, 0.15, 0.98, 0.98);
  legend->SetFillColor(0);

  Int_t count = 1;

  Float_t xMin = 1e20;
  Float_t xMax = 0;

  Float_t yMin = 1e20;
  Float_t yMax = 0;

  Float_t yMinRegion[3];
  for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
    yMinRegion[i] = 1e20;

  TString xaxis, yaxis;

  while (1)
  {
    TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
    TGraph* res = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));

    if (!mc)
      break;

    xaxis = mc->GetXaxis()->GetTitle();
    yaxis = mc->GetYaxis()->GetTitle();

    mc->Print();

    if (res)
      res->Print();

    xMin = TMath::Min(xMin, mc->GetXaxis()->GetXmin());
    yMin = TMath::Min(yMin, mc->GetYaxis()->GetXmin());

    xMax = TMath::Max(xMax, mc->GetXaxis()->GetXmax());
    yMax = TMath::Max(yMax, mc->GetYaxis()->GetXmax());

    if (plotRes && res)
    {
      xMin = TMath::Min(xMin, res->GetXaxis()->GetXmin());
      yMin = TMath::Min(yMin, res->GetYaxis()->GetXmin());

      xMax = TMath::Max(xMax, res->GetXaxis()->GetXmax());
      yMax = TMath::Max(yMax, res->GetYaxis()->GetXmax());
    }

    for (Int_t i=0; i<mc->GetN(); ++i)
      yMinRegion[(count-1) % 3] = TMath::Min(yMinRegion[(count-1) % 3], mc->GetY()[i]);

    count++;
  }

  for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
    Printf("Minimum for region %d is %f", i, yMinRegion[i]);

  if (type >= 0)
  {
    xaxis = "smoothing parameter";
  }
  else if (type == -1)
  {
    xaxis = "weight parameter";
    xMax *= 5;
  }
  //yaxis = "P_{1} (2 <= t <= 150)";

  printf("%f %f %f %f\n", xMin, xMax, yMin, yMax);

  TGraph* dummy = new TGraph;
  dummy->SetPoint(0, xMin, yMin);
  dummy->SetPoint(1, xMax, yMax);
  dummy->SetTitle(Form(";%s;%s", xaxis.Data(), yaxis.Data()));

  dummy->SetMarkerColor(0);
  dummy->Draw("AP");
  dummy->GetYaxis()->SetMoreLogLabels(1);

  count = 1;

  while (1)
  {
    TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
    TGraph* res = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));

    //printf("%s_MC_%d %p %p\n", name.Data(), count, mc, res);

    if (!mc)
      break;

    printf("Loaded %d sucessful.\n", count);

    if (type == -1)
    {
      legend->AddEntry(mc, Form("Eq. (%d) - reg. %d", 10 + (count-1) / 3, 1+ (count-1) % 3));
    }
    else
      legend->AddEntry(mc);

    mc->Draw("SAME PC");

    if (plotRes && res)
    {
      legend->AddEntry(res);
      res->Draw("SAME PC");
    }

    count++;
  }

  legend->Draw();

  canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
  canvas->SaveAs(Form("%s/%s.eps", targetDir, canvas->GetName()));
}

void EvaluateDrawResultRegions(const char* targetDir, Int_t type = 0)
{
  loadlibs();

  TString name;
  TFile* graphFile = 0;
  if (type == -1)
  {
    name = "EvaluateChi2Method";
    graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir));
  }
  else
  {
    name.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
    graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir));
  }

  TCanvas* canvas = new TCanvas(name, name, 1200, 800);
  //canvas->Divide(1, AliMultiplicityCorrection::kQualityRegions, 0, 0);
  canvas->SetTopMargin(0);
  canvas->SetBottomMargin(0);
  canvas->SetRightMargin(0.05);
  canvas->Range(0, 0, 1, 1);

  TPad* pad[4];
  pad[3] = new TPad(Form("%s_pad1", name.Data()), "", 0, 0, 0.5, 0.5); pad[3]->SetTopMargin(0); pad[3]->SetBottomMargin(0.15);
  pad[1] = new TPad(Form("%s_pad2", name.Data()), "", 0, 0.5, 0.5, 1); pad[1]->SetBottomMargin(0); 
  pad[0] = new TPad(Form("%s_pad3", name.Data()), "", 0.5, 0, 1, 0.5); pad[0]->SetTopMargin(0); pad[0]->SetBottomMargin(0.15);
  pad[2] = new TPad(Form("%s_pad4", name.Data()), "", 0.5, 0.5, 1, 1); pad[2]->SetBottomMargin(0); 

  Float_t yMinRegion[3];
  for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
    yMinRegion[i] = 1e20;

  for (Int_t region = 0; region <= AliMultiplicityCorrection::kQualityRegions; region++)
  {
    canvas->cd();
    pad[region]->Draw();
    pad[region]->cd();
    pad[region]->SetRightMargin(0.05);
    
    if (type == -1)
    {
      pad[region]->SetLogx();
    }
    pad[region]->SetLogy();
    
    pad[region]->SetGridx();
    pad[region]->SetGridy();

    TLegend* legend = new TLegend(0.5, 0.4, 0.85, 0.85);
    legend->SetFillColor(0);
    //legend->SetNColumns(3);
    legend->SetTextSize(0.06);
    Int_t count = 0;

    Float_t xMin = 1e20;
    Float_t xMax = 0;

    Float_t yMin = 1e20;
    Float_t yMax = 0;

    TString xaxis, yaxis;

    while (1)
    {
      count++;

      if (region > 0)
      {
        TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
        if (!mc)
          break;
  
        if (TString(mc->GetTitle()).Contains(Form("reg. %d", region)) == kFALSE)
          continue;
      
        for (Int_t i=0; i<mc->GetN(); ++i)
          yMinRegion[(count-1) % 3] = TMath::Min(yMinRegion[(count-1) % 3], mc->GetY()[i]);
      }
      else
      {
        TGraph* mc = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
        if (!mc)
          break;
      }

      xaxis = mc->GetXaxis()->GetTitle();
      yaxis = mc->GetYaxis()->GetTitle();

      //mc->Print();

      xMin = TMath::Min(xMin, mc->GetXaxis()->GetXmin());
      yMin = TMath::Min(yMin, TMath::MinElement(mc->GetN(), mc->GetY()));

      xMax = TMath::Max(xMax, mc->GetXaxis()->GetXmax());
      yMax = TMath::Max(yMax, mc->GetYaxis()->GetXmax());
      
      //Printf("%f %f %f %f", xMin, xMax, yMin, yMax);
    }

    if (type >= 0)
    {
      xaxis = "Smoothing parameter #alpha";
    }
    else if (type == -1)
    {
      xaxis = "Weight parameter #beta";
      //xMax *= 5;
    }
    if (region > 0)
    {
      yaxis = Form("Q_{1} in region %d ", region); // (2 <= t <= 150)";
    }
    else
      yaxis = "Q_{2} ";

    printf("%f %f %f %f\n", xMin, xMax, yMin, yMax);

    if (region > 0)
    {
      if (type == -1)
      {
        yMin = 0.534622;
        yMax = 19.228941;
      }
      else
      {
        yMin = 0.759109;
        yMax = 10;
      }
    }
    
    if (type != -1)
      xMax = 1.0;

    TH1* dummy = new TH2F("dummy", "dummy", 100, xMin, xMax, 100, yMin * 0.9, yMax * 1.1);
    dummy->SetTitle(Form(";%s;%s", xaxis.Data(), yaxis.Data()));

    if (region == 0 && type != -1)
      dummy->GetYaxis()->SetMoreLogLabels(1);
    dummy->SetLabelSize(0.06, "xy");
    dummy->SetTitleSize(0.06, "xy");
    dummy->GetXaxis()->SetTitleOffset(1.2);
    dummy->GetYaxis()->SetTitleOffset(0.8);
    dummy->SetStats(0);
    
    dummy->DrawCopy();
   

    count = 0;

    while (1)
    {
      count++;

      if (region > 0)
      {
        TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
        if (mc && TString(mc->GetTitle()).Contains(Form("reg. %d", region)) == kFALSE)
          continue;
      }
      else
        TGraph* mc = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));

      if (!mc)
        break;
      //printf("Loaded %d sucessful.\n", count);

      if (type == -1)
      {
        //legend->AddEntry(mc, Form("Eq. (%d) - reg. %d", 10 + (count-1) / 3, 1+ (count-1) % 3));
        //legend->AddEntry(mc, Form("Eq. (7.%d)", 11 + (count-1) / 3));
        const char* names[] = { "Const", "Linear", "Log" };
        legend->AddEntry(mc, names[(count-1) / 3], "PL");
      }
      else
      {
        TString label(mc->GetTitle());
        TString newLabel(label(0, label.Index(" ")));
        //Printf("%s", newLabel.Data());
        if (newLabel.Atoi() == -1)
        {
          newLabel = "Convergence";
        }
        else
          newLabel = label(0, label.Index("iterations") + 10);
          
        legend->AddEntry(mc, newLabel, "PL");
      }

      mc->Draw("SAME PC");

    }

    if (region == 2)
      legend->Draw();
  }

  for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
    Printf("Minimum for region %d is %f", i, yMinRegion[i]);

  canvas->Modified();
  canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
  canvas->SaveAs(Form("%s/%s.eps", targetDir, canvas->GetName()));
}

void EvaluateChi2Method(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", const char* targetDir = "chi2compare", Int_t histID = 1)
{
  gSystem->mkdir(targetDir);

  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileNameMC);
  mult->LoadHistograms("Multiplicity");

  TFile::Open(fileNameESD);
  TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", histID));
  TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", histID));

  mult->SetMultiplicityESD(histID, hist);

  Int_t count = 0; // just to order the saved images...
  Int_t colors[] = {1, 2, 4, 3};
  Int_t markers[] = {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3};

  TGraph* fitResultsRes = 0;

  TFile* graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir), "RECREATE");

  //for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kPol0; type <= AliMultiplicityCorrection::kLog; ++type)
  //for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kEntropy; type <= AliMultiplicityCorrection::kEntropy; ++type)
  for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kPol1; type <= AliMultiplicityCorrection::kPol1; ++type)
  {
    TGraph* fitResultsMC[3];
    for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
    {
      fitResultsMC[region] = new TGraph;
      fitResultsMC[region]->SetTitle(Form("Eq. (%d) - reg. %d", type+9, region+1));
      fitResultsMC[region]->GetXaxis()->SetTitle("weight parameter #alpha");
      fitResultsMC[region]->GetYaxis()->SetTitle(Form("P_{1} in region %d", region));
      fitResultsMC[region]->SetName(Form("EvaluateChi2Method_MC_%d", type * AliMultiplicityCorrection::kQualityRegions + region - 2));
      fitResultsMC[region]->SetFillColor(0);
      //fitResultsMC[region]->SetMarkerStyle(markers[(type-1) * AliMultiplicityCorrection::kQualityRegions + region]);
      //fitResultsMC[region]->SetLineColor(colors[region]);
      fitResultsMC[region]->SetMarkerStyle(markers[type-1]);
      fitResultsMC[region]->SetMarkerColor(colors[type-1]);
      fitResultsMC[region]->SetLineColor(colors[type-1]);
    }

    fitResultsRes = new TGraph;
    fitResultsRes->SetTitle(Form("%s residual chi2", GetRegName(type)));
    fitResultsRes->SetName(Form("EvaluateChi2Method_Res_%d", type));
    fitResultsRes->GetXaxis()->SetTitle("Weight Parameter");

    fitResultsRes->SetFillColor(0);
    fitResultsRes->SetMarkerStyle(markers[type-1]);
    fitResultsRes->SetMarkerColor(colors[type-1]);
    fitResultsRes->SetLineColor(colors[type-1]);

    for (Int_t i=0; i<15; ++i)
    {
      Float_t weight = TMath::Power(TMath::Sqrt(10), i+1);
      //Float_t weight = TMath::Power(10, i+2);

      //if (type == AliMultiplicityCorrection::kEntropy) weight = 1e4 * (i+1) * 1.5;

      Float_t chi2MC = 0;
      Float_t residuals = 0;
      Float_t chi2Limit = 0;

      TString runName;
      runName.Form("MinuitChi2_%02d_%d_%f", count++, type, weight);

      mult->SetRegularizationParameters(type, weight);
      Int_t status = mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx);
      mult->DrawComparison(Form("%s/%s", targetDir, runName.Data()), histID, kFALSE, kTRUE, hist2->ProjectionY("mymc", 1, hist2->GetNbinsX()));
      if (status != 0)
      {
        printf("MINUIT did not succeed. Skipping...\n");
        continue;
      }

      mult->GetComparisonResults(&chi2MC, 0, &residuals);
      TH1* result = mult->GetMultiplicityESDCorrected(histID);
      result->SetName(runName);
      result->Write();

      for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
        fitResultsMC[region]->SetPoint(fitResultsMC[region]->GetN(), weight, mult->GetQuality(region));

      fitResultsRes->SetPoint(fitResultsRes->GetN(), weight, residuals);
    }

    graphFile->cd();
    for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
      fitResultsMC[region]->Write();
    fitResultsRes->Write();
  }

  graphFile->Close();
}

void EvaluateChi2MethodAll()
{
  EvaluateChi2Method("multiplicityMC_3M.root", "multiplicityMC_3M.root", "eval-3M-3M");
  EvaluateChi2Method("multiplicityMC_2M.root", "multiplicityMC_1M_3.root", "eval-2M-1M");
  EvaluateChi2Method("multiplicityMC_3M.root", "multiplicityMC_3M_NBD.root", "eval-3M-NBD");
  EvaluateChi2Method("multiplicityMC_2M_smoothed.root", "multiplicityMC_1M_3.root", "eval-2MS-1M");
  EvaluateChi2Method("multiplicityMC_2M_smoothed.root", "multiplicityMC_3M_NBD.root", "eval-2MS-NBD");
}

void EvaluateBayesianMethodAll()
{
  EvaluateBayesianMethod("multiplicityMC_3M.root", "multiplicityMC_3M.root", "eval-3M-3M");
  EvaluateBayesianMethod("multiplicityMC_2M.root", "multiplicityMC_1M_3.root", "eval-2M-1M");
  EvaluateBayesianMethod("multiplicityMC_3M.root", "multiplicityMC_3M_NBD.root", "eval-3M-NBD");
  EvaluateBayesianMethod("multiplicityMC_2M_smoothed.root", "multiplicityMC_1M_3.root", "eval-2MS-1M");
  EvaluateBayesianMethod("multiplicityMC_2M_smoothed.root", "multiplicityMC_3M_NBD.root", "eval-2MS-NBD");
}

void CompareMethods(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityMC.root", const char* targetDir, Int_t histID = 3)
{
  gSystem->mkdir(targetDir);

  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileNameMC);
  mult->LoadHistograms("Multiplicity");

  TFile::Open(fileNameESD);
  AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
  multESD->LoadHistograms("Multiplicity");

  mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));

  TCanvas* canvas = new TCanvas("CompareMethods", "CompareMethods", 1200, 1200);
  canvas->Divide(3, 3);

  Int_t count = 0;

  for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kTrVtx; ++type)
  {
    TH1* mc = multESD->GetMultiplicityMC(histID, type)->ProjectionY("mymc");
    mc->Sumw2();

    mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
    mult->ApplyMinuitFit(histID, kFALSE, type);
    mult->DrawComparison(Form("%s/CompareMethods_%d_MinuitChi2", targetDir, type), histID, kFALSE, kTRUE, mc);
    TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone("chi2Result");

    mult->ApplyBayesianMethod(histID, kFALSE, type, 0.1);
    mult->DrawComparison(Form("%s/CompareMethods_%d_Bayesian", targetDir, type), histID, kFALSE, kTRUE, mc);
    TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone("bayesResult");

    mc->GetXaxis()->SetRangeUser(0, 150);
    chi2Result->GetXaxis()->SetRangeUser(0, 150);

/*    // skip errors for now
    for (Int_t i=1; i<=chi2Result->GetNbinsX(); ++i)
    {
      chi2Result->SetBinError(i, 0);
      bayesResult->SetBinError(i, 0);
    }*/

    canvas->cd(++count);
    mc->SetFillColor(kYellow);
    mc->DrawCopy();
    chi2Result->SetLineColor(kRed);
    chi2Result->DrawCopy("SAME");
    bayesResult->SetLineColor(kBlue);
    bayesResult->DrawCopy("SAME");
    gPad->SetLogy();

    canvas->cd(count + 3);
    chi2ResultRatio = (TH1*) chi2Result->Clone("chi2ResultRatio");
    bayesResultRatio = (TH1*) bayesResult->Clone("bayesResultRatio");
    chi2ResultRatio->Divide(chi2Result, mc, 1, 1, "");
    bayesResultRatio->Divide(bayesResult, mc, 1, 1, "");

    chi2ResultRatio->GetYaxis()->SetRangeUser(0.5, 1.5);

    chi2ResultRatio->DrawCopy("HIST");
    bayesResultRatio->DrawCopy("SAME HIST");

    canvas->cd(count + 6);
    chi2Result->Divide(chi2Result, bayesResult, 1, 1, "");
    chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
    chi2Result->DrawCopy("HIST");
  }

  canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
  canvas->SaveAs(Form("%s/%s.C", targetDir, canvas->GetName()));
}

void StatisticsPlot(const char* fileNameMC = "multiplicityMC_2M.root", Int_t histID = 3)
{
  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileNameMC);
  mult->LoadHistograms("Multiplicity");

  const char* files[] = { "multiplicityMC_100k_1.root", "multiplicityMC_200k.root", "multiplicityMC_400k.root", "multiplicityMC_600k.root", "multiplicityMC_800k.root" };

  TGraph* fitResultsChi2[3];
  TGraph* fitResultsBayes[3];

  for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
  {
    fitResultsChi2[region] = new TGraph;
    fitResultsChi2[region]->SetTitle(";Nevents;Chi2");
    fitResultsChi2[region]->SetName(Form("fitResultsChi2_%d", region));
    fitResultsChi2[region]->SetMarkerStyle(20+region);

    fitResultsBayes[region] = new TGraph;
    fitResultsBayes[region]->SetTitle(";Nevents;Chi2");
    fitResultsBayes[region]->SetName(Form("fitResultsBayes_%d", region));
    fitResultsBayes[region]->SetMarkerStyle(20+region);
    fitResultsBayes[region]->SetMarkerColor(2);
  }

  TGraph* fitResultsChi2Limit = new TGraph;  fitResultsChi2Limit->SetTitle(";Nevents;Multiplicity reach");
  TGraph* fitResultsBayesLimit = new TGraph; fitResultsBayesLimit->SetTitle(";Nevents;Multiplicity reach");
  TGraph* fitResultsChi2Res = new TGraph;       fitResultsChi2Res->SetTitle(";Nevents;Chi2");
  TGraph* fitResultsBayesRes = new TGraph;      fitResultsBayesRes->SetTitle(";Nevents;Chi2");

  fitResultsChi2Limit->SetName("fitResultsChi2Limit");
  fitResultsBayesLimit->SetName("fitResultsBayesLimit");
  fitResultsChi2Res->SetName("fitResultsChi2Res");
  fitResultsBayesRes->SetName("fitResultsBayesRes");

  TCanvas* canvas = new TCanvas("StatisticsPlot", "StatisticsPlot", 1200, 600);
  canvas->Divide(5, 2);

  Float_t min = 1e10;
  Float_t max = 0;

  TFile* file = TFile::Open("StatisticsPlot.root", "RECREATE");
  file->Close();

  for (Int_t i=0; i<5; ++i)
  {
    TFile::Open(files[i]);
    AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
    multESD->LoadHistograms("Multiplicity");

    mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
    Int_t nEntries = multESD->GetMultiplicityESD(histID)->GetEntries();
    TH1* mc = multESD->GetMultiplicityMC(histID, AliMultiplicityCorrection::kTrVtx)->ProjectionY(Form("mc_%d", i));

    mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
    mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx);
    mult->DrawComparison(Form("StatisticsPlot_%d_MinuitChi2", i), histID, kFALSE, kTRUE, mc);

    Int_t chi2MCLimit = 0;
    Float_t chi2Residuals = 0;
    mult->GetComparisonResults(0, &chi2MCLimit, &chi2Residuals);
    for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
    {
      fitResultsChi2[region]->SetPoint(fitResultsChi2[region]->GetN(), nEntries, mult->GetQuality(region));
      min = TMath::Min(min, mult->GetQuality(region));
      max = TMath::Max(max, mult->GetQuality(region));
    }
    fitResultsChi2Limit->SetPoint(fitResultsChi2Limit->GetN(), nEntries, chi2MCLimit);
    fitResultsChi2Res->SetPoint(fitResultsChi2Res->GetN(), nEntries, chi2Residuals);

    TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("chi2Result_%d", i));

    mult->ApplyBayesianMethod(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100, 0, kFALSE);
    mult->DrawComparison(Form("StatisticsPlot_%d_Bayesian", i), histID, kFALSE, kTRUE, mc);
    TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("bayesResult_%d", i));
    mult->GetComparisonResults(0, &chi2MCLimit, &chi2Residuals);
    for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
    {
      fitResultsBayes[region]->SetPoint(fitResultsBayes[region]->GetN(), nEntries, mult->GetQuality(region));
      min = TMath::Min(min, mult->GetQuality(region));
      max = TMath::Max(max, mult->GetQuality(region));
    }
    fitResultsBayesLimit->SetPoint(fitResultsBayesLimit->GetN(), nEntries, chi2MCLimit);
    fitResultsBayesRes->SetPoint(fitResultsBayesRes->GetN(), nEntries, chi2Residuals);

    mc->GetXaxis()->SetRangeUser(0, 150);
    chi2Result->GetXaxis()->SetRangeUser(0, 150);

    // skip errors for now
    for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
    {
      chi2Result->SetBinError(j, 0);
      bayesResult->SetBinError(j, 0);
    }

    canvas->cd(i+1);
    mc->SetFillColor(kYellow);
    mc->DrawCopy();
    chi2Result->SetLineColor(kRed);
    chi2Result->DrawCopy("SAME");
    bayesResult->SetLineColor(kBlue);
    bayesResult->DrawCopy("SAME");
    gPad->SetLogy();

    canvas->cd(i+6);
    chi2Result->Divide(chi2Result, mc, 1, 1, "B");
    bayesResult->Divide(bayesResult, mc, 1, 1, "B");

    // skip errors for now
    for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
    {
      chi2Result->SetBinError(j, 0);
      bayesResult->SetBinError(j, 0);
    }

    chi2Result->SetTitle("Ratios;Npart;unfolded measured/MC");
    chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);

    chi2Result->DrawCopy("");
    bayesResult->DrawCopy("SAME");

    TFile* file = TFile::Open("StatisticsPlot.root", "UPDATE");
    mc->Write();
    chi2Result->Write();
    bayesResult->Write();
    file->Close();
  }

  canvas->SaveAs(Form("%s.gif", canvas->GetName()));
  canvas->SaveAs(Form("%s.C", canvas->GetName()));

  TCanvas* canvas2 = new TCanvas("StatisticsPlot2", "StatisticsPlot2", 800, 400);
  canvas2->Divide(2, 1);

  canvas2->cd(1);

  for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
  {
    fitResultsChi2[region]->GetYaxis()->SetRangeUser(0.5 * min, 1.5 * max);
    fitResultsChi2[region]->Draw(((region == 0) ? "AP" : "P SAME"));

    fitResultsBayes[region]->Draw("P SAME");
  }

  gPad->SetLogy();

  canvas2->cd(2);
  fitResultsChi2Limit->SetMarkerStyle(20);
  fitResultsChi2Limit->GetYaxis()->SetRangeUser(0.9 * TMath::Min(fitResultsChi2Limit->GetYaxis()->GetXmin(), fitResultsBayesLimit->GetYaxis()->GetXmin()), 1.1 * TMath::Max(fitResultsChi2Limit->GetYaxis()->GetXmax(), fitResultsBayesLimit->GetYaxis()->GetXmax()));
  fitResultsChi2Limit->Draw("AP");

  fitResultsBayesLimit->SetMarkerStyle(3);
  fitResultsBayesLimit->SetMarkerColor(2);
  fitResultsBayesLimit->Draw("P SAME");

  canvas2->SaveAs(Form("%s.gif", canvas2->GetName()));
  canvas2->SaveAs(Form("%s.C", canvas2->GetName()));

  TFile* file = TFile::Open("StatisticsPlot.root", "UPDATE");

  for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
  {
    fitResultsChi2[region]->Write();
    fitResultsBayes[region]->Write();
  }
  fitResultsChi2Limit->Write();
  fitResultsBayesLimit->Write();
  fitResultsChi2Res->Write();
  fitResultsBayesRes->Write();
  file->Close();
}

void StartingConditions(const char* fileNameMC = "multiplicityMC.root", Int_t histID = 1)
{
  loadlibs();

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileNameMC);
  mult->LoadHistograms("Multiplicity");

  const char* files[] = { "multiplicityESD.root", "multiplicityESD_100k_1.root", "multiplicityESD_100k_2.root", "multiplicityESD_100k_1.root", "multiplicityESD_100k_2.root" }

  // this one we try to unfold
  TFile::Open(files[0]);
  AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
  multESD->LoadHistograms("Multiplicity");
  mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
  TH1* mc = multESD->GetMultiplicityMC(histID, AliMultiplicityCorrection::kTrVtx)->ProjectionY("mc", 1, 1);

  TGraph* fitResultsChi2 = new TGraph;
  fitResultsChi2->SetTitle(";Input Dist ID;Chi2");
  TGraph* fitResultsBayes = new TGraph;
  fitResultsBayes->SetTitle(";Input Dist ID;Chi2");
  TGraph* fitResultsChi2Limit = new TGraph;
  fitResultsChi2Limit->SetTitle(";Input Dist ID;Multiplicity reach");
  TGraph* fitResultsBayesLimit = new TGraph;
  fitResultsBayesLimit->SetTitle(";Input Dist ID;Multiplicity reach");

  TCanvas* canvas = new TCanvas("StartingConditions", "StartingConditions", 1200, 600);
  canvas->Divide(8, 2);

  TCanvas* canvas3 = new TCanvas("StartingConditions3", "StartingConditions3", 1000, 400);
  canvas3->Divide(2, 1);

  Float_t min = 1e10;
  Float_t max = 0;

  TH1* firstChi = 0;
  TH1* firstBayesian = 0;
  TH1* startCond = multESD->GetMultiplicityESD(histID)->ProjectionY("startCond");

  TLegend* legend = new TLegend(0.7, 0.7, 1, 1);

  TFile* file = TFile::Open("StartingConditions.root", "RECREATE");
  mc->Write();
  file->Close();

  for (Int_t i=0; i<8; ++i)
  {
    if (i == 0)
    {
      startCond = (TH1*) mc->Clone("startCond2");
    }
    else if (i < 6)
    {
      TFile::Open(files[i-1]);
      AliMultiplicityCorrection* multESD2 = new AliMultiplicityCorrection("MultiplicityESD2", "MultiplicityESD2");
      multESD2->LoadHistograms("Multiplicity");
      startCond = multESD2->GetMultiplicityESD(histID)->ProjectionY("startCond");
    }
    else if (i == 6)
    {
      func = new TF1("nbd", "exp(log([0]) + TMath::LnGamma([2]+x) - TMath::LnGamma([2]) - TMath::LnGamma(x+1) + log([1] / ([1]+[2])) * x + log(1.0 + [1]/[2]) * -[2])", 0, 50);
      
      func->SetParNames("scaling", "averagen", "k");
      func->SetParLimits(0, 1e-3, 1e10);
      func->SetParLimits(1, 0.001, 1000);
      func->SetParLimits(2, 0.001, 1000);

      func->SetParameters(1, 10, 2);
      for (Int_t j=2; j<=startCond->GetNbinsX(); j++)
        startCond->SetBinContent(j, func->Eval(j-1));
    }
    else if (i == 7)
    {
      for (Int_t j=1; j<=startCond->GetNbinsX(); j++)
        startCond->SetBinContent(j, 1);
    }

    mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol0, 1e5);
    mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE, startCond);
    //mult->DrawComparison(Form("StartingConditions_%d_MinuitChi2", i), histID, kFALSE, kTRUE, mc);

    Float_t chi2MC = 0;
    Int_t chi2MCLimit = 0;
    mult->GetComparisonResults(&chi2MC, &chi2MCLimit, 0);
    fitResultsChi2->SetPoint(fitResultsChi2->GetN(), i, chi2MC);
    fitResultsChi2Limit->SetPoint(fitResultsChi2Limit->GetN(), i, chi2MCLimit);
    min = TMath::Min(min, chi2MC);
    max = TMath::Max(max, chi2MC);

    TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("chi2Result_%d", i));
    if (!firstChi)
      firstChi = (TH1*) chi2Result->Clone("firstChi");

    mult->ApplyBayesianMethod(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 10, startCond);
    //mult->DrawComparison(Form("StartingConditions_%d_Bayesian", i), histID, kFALSE, kTRUE, mc);
    TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("bayesResult_%d", i));
    if (!firstBayesian)
      firstBayesian = (TH1*) bayesResult->Clone("firstBayesian");

    mult->GetComparisonResults(&chi2MC, &chi2MCLimit, 0);
    fitResultsBayes->SetPoint(fitResultsBayes->GetN(), i, chi2MC);
    fitResultsBayesLimit->SetPoint(fitResultsBayesLimit->GetN(), i, chi2MCLimit);

    TFile* file = TFile::Open("StartingConditions.root", "UPDATE");
    chi2Result->Write();
    bayesResult->Write();
    file->Close();

    min = TMath::Min(min, chi2MC);
    max = TMath::Max(max, chi2MC);
    mc->GetXaxis()->SetRangeUser(0, 150);
    chi2Result->GetXaxis()->SetRangeUser(0, 150);

    // skip errors for now
    for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
    {
      chi2Result->SetBinError(j, 0);
      bayesResult->SetBinError(j, 0);
    }

    canvas3->cd(1);
    TH1* tmp = (TH1*) chi2Result->Clone("tmp");
    tmp->SetTitle("Difference to best initial conditions;Npart;Ratio");
    tmp->Divide(firstChi);
    tmp->GetYaxis()->SetRangeUser(0.5, 1.5);
    tmp->GetXaxis()->SetRangeUser(0, 200);
    tmp->SetLineColor(i+1);
    legend->AddEntry(tmp, Form("%d", i));
    tmp->DrawCopy((i > 0) ? "SAME HIST" : "HIST");

    canvas3->cd(2);
    tmp = (TH1*) bayesResult->Clone("tmp");
    tmp->SetTitle("Difference to best initial conditions;Npart;Ratio");
    tmp->Divide(firstBayesian);
    tmp->SetLineColor(i+1);
    tmp->GetYaxis()->SetRangeUser(0.5, 1.5);
    tmp->GetXaxis()->SetRangeUser(0, 200);
    tmp->DrawCopy((i > 0) ? "SAME HIST" : "HIST");

    canvas->cd(i+1);
    mc->SetFillColor(kYellow);
    mc->DrawCopy();
    chi2Result->SetLineColor(kRed);
    chi2Result->DrawCopy("SAME");
    bayesResult->SetLineColor(kBlue);
    bayesResult->DrawCopy("SAME");
    gPad->SetLogy();

    canvas->cd(i+9);
    chi2Result->Divide(chi2Result, mc, 1, 1, "B");
    bayesResult->Divide(bayesResult, mc, 1, 1, "B");

    // skip errors for now
    for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
    {
      chi2Result->SetBinError(j, 0);
      bayesResult->SetBinError(j, 0);
    }

    chi2Result->SetTitle("Ratios;Npart;unfolded measured/MC");
    chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);

    chi2Result->DrawCopy("");
    bayesResult->DrawCopy("SAME");
  }

  canvas3->cd(1);
  legend->Draw();

  canvas->SaveAs(Form("%s.gif", canvas->GetName()));

  TCanvas* canvas2 = new TCanvas("StartingConditions2", "StartingConditions2", 800, 400);
  canvas2->Divide(2, 1);

  canvas2->cd(1);
  fitResultsChi2->SetMarkerStyle(20);
  fitResultsChi2->GetYaxis()->SetRangeUser(0.5 * min, 1.5 * max);
  fitResultsChi2->Draw("AP");

  fitResultsBayes->SetMarkerStyle(3);
  fitResultsBayes->SetMarkerColor(2);
  fitResultsBayes->Draw("P SAME");

  gPad->SetLogy();

  canvas2->cd(2);
  fitResultsChi2Limit->SetMarkerStyle(20);
  fitResultsChi2Limit->GetYaxis()->SetRangeUser(0.9 * TMath::Min(fitResultsChi2Limit->GetYaxis()->GetXmin(), fitResultsBayesLimit->GetYaxis()->GetXmin()), 1.1 * TMath::Max(fitResultsChi2Limit->GetYaxis()->GetXmax(), fitResultsBayesLimit->GetYaxis()->GetXmax()));
  fitResultsChi2Limit->Draw("AP");

  fitResultsBayesLimit->SetMarkerStyle(3);
  fitResultsBayesLimit->SetMarkerColor(2);
  fitResultsBayesLimit->Draw("P SAME");

  canvas2->SaveAs(Form("%s.gif", canvas2->GetName()));
  canvas3->SaveAs(Form("%s.gif", canvas3->GetName()));
}

void Merge(Int_t n, const char** files, const char* output)
{
  // const char* files[] = { "multiplicityMC_100k_1.root",  "multiplicityMC_100k_2.root",  "multiplicityMC_100k_3.root", "multiplicityMC_100k_4.root",  "multiplicityMC_100k_5.root",  "multiplicityMC_100k_6.root",  "multiplicityMC_100k_7.root",  "multiplicityMC_100k_8.root" };


  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection** data = new AliMultiplicityCorrection*[n];
  TList list;
  for (Int_t i=0; i<n; ++i)
  {
    TString name("Multiplicity");
    if (i > 0)
      name.Form("Multiplicity%d", i);

    TFile::Open(files[i]);
    Printf("Loading from file %s", files[i]);
    data[i] = new AliMultiplicityCorrection(name, name);
    data[i]->LoadHistograms("Multiplicity");
    if (i > 0)
      list.Add(data[i]);
  }

  data[0]->Merge(&list);

  //data[0]->DrawHistograms();

  TFile::Open(output, "RECREATE");
  data[0]->SaveHistograms();
  gFile->Close();
}

void testMethod(Int_t caseNo, const char* fileName = "multiplicityMC.root")
{
  loadlibs();

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileName);
  mult->LoadHistograms("Multiplicity");

  TF1* func = 0;

  if (caseNo >= 4)
  {
    TF1* func = new TF1("nbd", "exp(log([0]) + TMath::LnGamma([2]+x) - TMath::LnGamma([2]) - TMath::LnGamma(x+1) + log([1] / ([1]+[2])) * x + log(1.0 + [1]/[2]) * -[2])", 0, 200);
    //func = new TF1("nbd", "[0] * TMath::Binomial([2]+TMath::Nint(x)-1, [2]-1) * pow([1] / ([1]+[2]), TMath::Nint(x)) * pow(1 + [1]/[2], -[2])", 0, 200);
    func->SetParNames("scaling", "averagen", "k");
  }

  switch (caseNo)
  {
    case 0: func = new TF1("flat", "1000"); break;
    case 1: func = new TF1("flat", "501-x"); break;
    case 2: func = new TF1("flat", "1000 * 1/(x+1)"); break;
    case 3: func = new TF1("flat", "1000 * TMath::Landau(x, 10, 5)"); break;
    case 4: func->SetParameters(2e5, 15, 2); break;
    case 5: func->SetParameters(1, 13, 7); break;
    case 6: func->SetParameters(1e7, 30, 4); break;
    case 7: func->SetParameters(1e7, 30, 2); break; // ***
    case 8: func = new TF1("testlaszlo", "10*1000*x*exp(-0.1*x)"); break;

    default: return;
  }

  new TCanvas;
  func->Draw();

  mult->SetGenMeasFromFunc(func, 1);

  TFile::Open("out.root", "RECREATE");
  mult->SaveHistograms();

  new TCanvas; mult->GetMultiplicityESD(1)->ProjectionY()->DrawCopy();
  new TCanvas; mult->GetMultiplicityVtx(1)->ProjectionY("mc", 1, mult->GetMultiplicityVtx(1)->GetNbinsX())->DrawCopy();

  //mult->ApplyBayesianMethod(2, kFALSE);
  //mult->ApplyMinuitFit(2, kFALSE);
  //mult->ApplyGaussianMethod(2, kFALSE);
  //mult->ApplyLaszloMethod(2, kFALSE, AliMultiplicityCorrection::kTrVtx);
}

void smoothCorrelationMap(const char* fileName = "multiplicity.root", Int_t corrMatrix = 1)
{
  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileName);
  mult->LoadHistograms("Multiplicity");

  // empty under/overflow bins in x, otherwise Project3D takes them into account
  TH3* corr = mult->GetCorrelation(corrMatrix);
  for (Int_t j=1; j<=corr->GetYaxis()->GetNbins(); ++j)
  {
    for (Int_t k=1; k<=corr->GetZaxis()->GetNbins(); ++k)
    {
      corr->SetBinContent(0, j, k, 0);
      corr->SetBinContent(corr->GetXaxis()->GetNbins()+1, j, k, 0);
    }
  }

  TH2* proj = (TH2*) corr->Project3D("zy");

  // normalize correction for given nPart
  for (Int_t i=1; i<=proj->GetNbinsX(); ++i)
  {
    Double_t sum = proj->Integral(i, i, 1, proj->GetNbinsY());
    if (sum <= 0)
      continue;

    for (Int_t j=1; j<=proj->GetNbinsY(); ++j)
    {
      // npart sum to 1
      proj->SetBinContent(i, j, proj->GetBinContent(i, j) / sum);
      proj->SetBinError(i, j, proj->GetBinError(i, j) / sum);
    }
  }

  new TCanvas;
  proj->DrawCopy("COLZ");

  TH1* scaling = proj->ProjectionY("scaling", 1, 1);
  scaling->Reset();
  scaling->SetMarkerStyle(3);
  //scaling->GetXaxis()->SetRangeUser(0, 50);
  TH1* mean = (TH1F*) scaling->Clone("mean");
  TH1* width = (TH1F*) scaling->Clone("width");

  TF1* lognormal = new TF1("lognormal", "[0]*exp(-(log(x)-[1])^2/(2*[2]^2))/(x*[2]*TMath::Sqrt(2*TMath::Pi()))", 0.01, 500);
  lognormal->SetParNames("scaling", "mean", "sigma");
  lognormal->SetParameters(1, 1, 1);
  lognormal->SetParLimits(0, 1, 1);
  lognormal->SetParLimits(1, 0, 100);
  lognormal->SetParLimits(2, 1e-3, 1);

  TF1* nbd = new TF1("nbd", "[0] * TMath::Binomial([2]+TMath::Nint(x)-1, [2]-1) * pow([1] / ([1]+[2]), TMath::Nint(x)) * pow(1 + [1]/[2], -[2])", 0, 50);
  nbd->SetParNames("scaling", "averagen", "k");
  nbd->SetParameters(1, 13, 5);
  nbd->SetParLimits(0, 1, 1);
  nbd->SetParLimits(1, 1, 100);
  nbd->SetParLimits(2, 1, 1e8);

  TF1* poisson = new TF1("poisson", "[0] * exp(-(x+[2])) * (x+[2])**[1] / TMath::Factorial([1])", 0.01, 50);
  poisson->SetParNames("scaling", "k", "deltax");
  poisson->SetParameters(1, 1, 0);
  poisson->SetParLimits(0, 0, 10);
  poisson->SetParLimits(1, 0.01, 100);
  poisson->SetParLimits(2, 0, 10);

  TF1* mygaus = new TF1("mygaus", "[0] * exp(-(x-[1])**2 / 2 / [2] - [3] * log(x + [4]) / [5])", 0.01, 50);
  mygaus->SetParNames("scaling", "mean", "width", "scale2log", "logmean", "logwidth");
  mygaus->SetParameters(1, 0, 1, 1, 0, 1);
  mygaus->SetParLimits(2, 1e-5, 10);
  mygaus->SetParLimits(4, 1, 1);
  mygaus->SetParLimits(5, 1e-5, 10);

  //TF1* sqrt = new TF1("sqrt", "[0] + [1] * sqrt((x + [3]) * [2])", 0, 50);
  TF1* sqrt = new TF1("sqrt", "[0] + (x + [1])**[2]", 0, 50);
  sqrt->SetParNames("ydelta", "exp", "xdelta");
  sqrt->SetParameters(0, 0, 1);
  sqrt->SetParLimits(1, 0, 10);

  const char* fitWith = "gaus";

  for (Int_t i=1; i<=80; ++i)
  {
    printf("Fitting %d...\n", i);

    TH1* hist = proj->ProjectionY(Form("proj%d", i), i, i, "e");

    //hist->GetXaxis()->SetRangeUser(0, 50);
    //lognormal->SetParameter(0, hist->GetMaximum());
    hist->Fit(fitWith, "0 M", "");

    TF1* func = hist->GetListOfFunctions()->FindObject(fitWith);

    if (0 && (i % 5 == 0))
    {
      pad = new TCanvas;
      hist->Draw();
      func->Clone()->Draw("SAME");
      pad->SetLogy();
    }

    scaling->SetBinContent(i, func->GetParameter(0));
    mean->SetBinContent(i, func->GetParameter(1));
    width->SetBinContent(i, func->GetParameter(2));
    
    scaling->SetBinError(i, func->GetParError(0));
    mean->SetBinError(i, func->GetParError(1));
    width->SetBinError(i, func->GetParError(2));
  }

  TF1* log = new TF1("log", "[0] + [1] * log([2] * x)", 0.01, 500);
  log->SetParameters(0, 1, 1);
  log->SetParLimits(1, 0, 100);
  log->SetParLimits(2, 1e-3, 10);

  TF1* over = new TF1("over", "[0] + [1] / (x+[2])", 0.01, 500);
  over->SetParameters(0, 1, 0);
  //over->SetParLimits(0, 0, 100);
  over->SetParLimits(1, 1e-3, 10);
  over->SetParLimits(2, 0, 100);

  c1 = new TCanvas("fitparams", "fitparams", 1200, 400);
  c1->Divide(3, 1);

  c1->cd(1);
  scaling->Draw("P");

  //TF1* scalingFit = new TF1("mypol0", "[0]");
  TF1* scalingFit = over;
  scaling->Fit(scalingFit, "", "", 3, 140);
  scalingFit->SetRange(0, 200);
  scalingFit->Draw("SAME");
  
  c1->cd(2);
  mean->Draw("P");

  //TF1* meanFit = log;
  TF1* meanFit = new TF1("mypol1", "[0]+[1]*x");
  mean->Fit(meanFit, "", "", 3, 140);
  meanFit->SetRange(0, 200);
  meanFit->Draw("SAME");

  c1->cd(3);
  width->Draw("P");

  //TF1* widthFit = over;
  TF1* widthFit = new TF1("mypol", "[0]+[1]*TMath::Sqrt([2]*x)");
  widthFit->SetParLimits(2, 1e-5, 1e5);
  width->Fit(widthFit, "", "", 5, 140);
  widthFit->SetRange(0, 200);
  widthFit->Draw("SAME");
  
  // build new correction matrix
  TH2* new = (TH2*) proj->Clone("new");
  new->Reset();
  Float_t x, y;
  for (Int_t i=1; i<=new->GetXaxis()->GetNbins(); i+=1)
  {
    TF1* func = (TF1*) gROOT->FindObject(fitWith);
    x = new->GetXaxis()->GetBinCenter(i);
    //if (i == 1)
    //  x = 0.1;
    x++;
    func->SetParameters(scalingFit->Eval(x), meanFit->Eval(x), widthFit->Eval(x));
    printf("%f %f %f %f\n", x, scalingFit->Eval(x), meanFit->Eval(x), widthFit->Eval(x));

    for (Int_t j=1; j<=new->GetYaxis()->GetNbins(); j+=1)
    {
      if (i < 11)
      {
        // leave bins 1..20 untouched
        new->SetBinContent(i, j, corr->Integral(1, corr->GetNbinsX(), i, i, j, j));
      }
      else
      {
        y = new->GetYaxis()->GetBinCenter(j);
        if (j == 1)
          y = 0.1;
        if (func->Eval(y) > 1e-4)
          new->SetBinContent(i, j, func->Eval(y));
      }
    }
  }

  // fill 0 multiplicity bins, this cannot be done with the function because it does not accept 0
  // we take the values from the old response matrix
  //for (Int_t i=1; i<=new->GetXaxis()->GetNbins(); i+=1)
  //  new->SetBinContent(i, 1, proj->GetBinContent(i, 1));

  //for (Int_t j=1; j<=new->GetYaxis()->GetNbins(); j+=1)
  //  new->SetBinContent(1, j, proj->GetBinContent(1, j));

  // normalize correction for given nPart
  for (Int_t i=1; i<=new->GetNbinsX(); ++i)
  {
    Double_t sum = new->Integral(i, i, 1, proj->GetNbinsY());
    if (sum <= 0)
      continue;

    for (Int_t j=1; j<=new->GetNbinsY(); ++j)
    {
      // npart sum to 1
      new->SetBinContent(i, j, new->GetBinContent(i, j) / sum);
      new->SetBinError(i, j, new->GetBinError(i, j) / sum);
    }
  }

  new TCanvas;
  new->Draw("COLZ");

  TH2* diff = (TH2*) new->Clone("diff");
  diff->Add(proj, -1);

  new TCanvas;
  diff->Draw("COLZ");
  diff->SetMinimum(-0.05);
  diff->SetMaximum(0.05);

  corr->Reset();

  for (Int_t i=1; i<=new->GetNbinsX(); ++i)
    for (Int_t j=1; j<=new->GetNbinsY(); ++j)
      corr->SetBinContent(corr->GetXaxis()->GetNbins() / 2 + 1, i, j, new->GetBinContent(i, j));

  new TCanvas;
  corr->Project3D("zy")->Draw("COLZ");

  TFile::Open("out.root", "RECREATE");
  mult->SaveHistograms();

  TH1* proj1 = proj->ProjectionY("proj1", 36, 36);
  TH1* proj2 = new->ProjectionY("proj2", 36, 36);
  proj2->SetLineColor(2);

  new TCanvas;
  proj1->Draw();
  proj2->Draw("SAME");
}

void buildCorrelationMap(const char* fileName = "multiplicityMC_2M.root", Int_t corrMatrix = 3)
{
  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileName);
  mult->LoadHistograms("Multiplicity");

  TH3F* new = mult->GetCorrelation(corrMatrix);
  new->Reset();

  TF1* func = new TF1("func", "gaus(0)");

  Int_t vtxBin = new->GetNbinsX() / 2;
  if (vtxBin == 0)
    vtxBin = 1;

  Float_t sigma = 2;
  for (Int_t i=1; i<=new->GetYaxis()->GetNbins(); i+=1)
  {
    Float_t x = new->GetYaxis()->GetBinCenter(i);
    func->SetParameters(1, x * 0.8, sigma);
    //func->SetParameters(1, x, sigma);

    for (Int_t j=1; j<=new->GetZaxis()->GetNbins(); j+=1)
    {
      Float_t y = new->GetYaxis()->GetBinCenter(j);

      // cut at 1 sigma
      if (TMath::Abs(y-x*0.8) < sigma)
        new->SetBinContent(vtxBin, i, j, func->Eval(y));

      // test only bin 40 has smearing
      //if (x != 40)
      //  new->SetBinContent(vtxBin, i, j, (i == j));
    }
  }

  new TCanvas;
  new->Project3D("zy")->DrawCopy("COLZ");

  TFile* file = TFile::Open("out.root", "RECREATE");
  mult->SetCorrelation(corrMatrix, new);
  mult->SaveHistograms();
  file->Close();
}

void GetCrossSections(const char* fileName)
{
  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileName);
  mult->LoadHistograms("Multiplicity");

  TH1* xSection2 = mult->GetCorrelation(3)->Project3D("y")->Clone("xSection2");
  xSection2->Sumw2();
  xSection2->Scale(1.0 / xSection2->Integral());

  TH1* xSection15 = mult->GetCorrelation(2)->Project3D("y")->Clone("xSection15");
  xSection15->Sumw2();
  xSection15->Scale(1.0 / xSection15->Integral());

  TFile::Open("crosssection.root", "RECREATE");
  xSection2->Write();
  xSection15->Write();
  gFile->Close();
}

void AnalyzeSpeciesTree(const char* fileName)
{
  //
  // prints statistics about fParticleSpecies
  //

  gSystem->Load("libPWG0base");

  TFile::Open(fileName);
  TNtuple* fParticleSpecies = (TNtuple*) gFile->Get("fParticleSpecies");

  const Int_t nFields = 8;
  Long_t totals[8];
  for (Int_t i=0; i<nFields; i++)
    totals[i] = 0;

  for (Int_t i=0; i<fParticleSpecies->GetEntries(); i++)
  {
    fParticleSpecies->GetEvent(i);

    Float_t* f = fParticleSpecies->GetArgs();

    for (Int_t j=0; j<nFields; j++)
      totals[j] += f[j+1];
  }

  for (Int_t i=0; i<nFields; i++)
    Printf("%d --> %ld", i, totals[i]);
}

void BuildResponseFromTree(const char* fileName, const char* target)
{
  //
  // builds several response matrices with different particle ratios (systematic study)
  // particle-species study
  // 
  // WARNING doesn't work uncompiled, see test.C

  loadlibs();

  TFile::Open(fileName);
  TNtuple* fParticleSpecies = (TNtuple*) gFile->Get("fParticleSpecies");

  TFile* file = TFile::Open(target, "RECREATE");
  file->Close();

  Int_t tracks = 0; // control variables
  Int_t noLabel = 0;
  Int_t secondaries = 0;
  Int_t doubleCount = 0;

  for (Int_t num = 0; num < 7; num++)
  {
    Printf("%d", num);
  
    TString name;
    name.Form("Multiplicity_%d", num);
    AliMultiplicityCorrection* fMultiplicity = new AliMultiplicityCorrection(name, name);

    Float_t ratio[4]; // pi, K, p, other
    for (Int_t i = 0; i < 4; i++)
      ratio[i] = 1;

    if (num == 1)
      ratio[1] = 0.7;
    if (num == 2)
      ratio[1] = 1.3;
    
    if (num == 3)
      ratio[2] = 0.7;
    if (num == 4)
      ratio[2] = 1.3;
    
    if (num == 5)
      ratio[3] = 0.7;
    if (num == 6)
      ratio[3] = 1.3;
      
    for (Int_t i=0; i<fParticleSpecies->GetEntries(); i++)
    {
      fParticleSpecies->GetEvent(i);
      

      Float_t* f = fParticleSpecies->GetArgs();

      Float_t gene = 0;
      Float_t meas = 0;

      for (Int_t j = 0; j < 4; j++)
      {
        if (ratio[j] == 1)
        {
          gene += f[j+1];
        }
        else
        {
          for (Int_t k=0; k<f[j+1]; k++)
          {
            if (ratio[j] < 1 && gRandom->Uniform() < ratio[j])
            {
              gene += 1;
            }
            else if (ratio[j] > 1)
            {
              gene += 1;
              if (gRandom->Uniform() < ratio[j] - 1)
                gene += 1;
            }
          }
        }
          
        if (ratio[j] == 1)
        {
          meas += f[j+1+4];
        }
        else
        {
          for (Int_t k=0; k<f[j+1+4]; k++)
          {
            if (ratio[j] < 1 && gRandom->Uniform() < ratio[j])
            {
              meas += 1;
            }
            else if (ratio[j] > 1)
            {
              meas += 1;
              if (gRandom->Uniform() < ratio[j] - 1)
                meas += 1;
            }
          }
        }
        
        tracks += f[j+1+4];
      }

      // add the ones w/o label
      tracks += f[9];
      noLabel += f[9];

      // secondaries are already part of meas!
      secondaries += f[10];

      // double counted are already part of meas!
      doubleCount += f[11];

      // ones w/o label are added without weighting to allow comparison to default analysis. however this is only valid when their fraction is low enough!
      meas += f[9];

      //Printf("%.f %.f %.f %.f %.f", f[5], f[6], f[7], f[8], f[9]);

      fMultiplicity->FillCorrection(f[0], gene, gene, gene, gene, meas, meas, meas);
      // HACK all as kND = 1
      fMultiplicity->FillGenerated(f[0], kTRUE, kTRUE, 1, gene, gene, gene, gene);
      fMultiplicity->FillMeasured(f[0], meas, meas, meas);
    }

    //fMultiplicity->DrawHistograms();

    TFile* file = TFile::Open(target, "UPDATE");
    fMultiplicity->SaveHistograms();
    file->Close();

    if (num == 0)
    {
      Printf("%d total tracks, %d w/o label = %.2f %%, %d double counted = %.2f %%, secondaries = %.2f %%", tracks, noLabel, 100.0 * noLabel / tracks, doubleCount, 100.0 * doubleCount / tracks, 100.0 * secondaries / tracks);
      if ((Float_t) noLabel / tracks > 0.02)
        Printf("WARNING: More than 2%% of tracks without label, this might bias the study!");
    }
  }
}

void ParticleRatioStudy()
{
  loadlibs();

  for (Int_t num = 0; num < 7; num++)
  {
    TString target;
    target.Form("chi2a_inel_species_%d.root", num);
    
    correct("compositions.root", Form("Multiplicity_%d", num), "multiplicityESD.root", 1, -1, 0, -1, 2, target);
  }
}

void MergeCrossSection(Int_t xsectionID, const char* output = "multiplicityMC_xsection.root")
{
  const char* files[] = { "multiplicitySD.root", "multiplicityDD.root", "multiplicityND.root" };

  loadlibs();

  TFile::Open(output, "RECREATE");
  gFile->Close();

  AliMultiplicityCorrection* data[3];
  TList list;

  Float_t ref_SD = -1;
  Float_t ref_DD = -1;
  Float_t ref_ND = -1;

  Float_t error_SD = -1;
  Float_t error_DD = -1;
  Float_t error_ND = -1;

  gROOT->ProcessLine(gSystem->ExpandPathName(".L $ALICE_ROOT/PWG0/dNdEta/drawSystematics.C"));
  GetRelativeFractions(xsectionID, ref_SD, ref_DD, ref_ND, error_SD, error_DD, error_ND);
  
  for (Int_t i=0; i<3; ++i)
  {
    TString name;
    name.Form("Multiplicity");
    if (i > 0)
      name.Form("Multiplicity_%d", i);

    TFile::Open(files[i]);
    data[i] = new AliMultiplicityCorrection(name, name);
    data[i]->LoadHistograms("Multiplicity");
  }
  
  // TODO is the under/overflow bin scaled as well? --> seems like, verify anyway!

  // calculating relative
  Float_t sd = data[0]->GetMultiplicityINEL(0)->Integral(0, data[0]->GetMultiplicityINEL(0)->GetNbinsX()+1);
  Float_t dd = data[1]->GetMultiplicityINEL(0)->Integral(0, data[1]->GetMultiplicityINEL(0)->GetNbinsX()+1);
  Float_t nd = data[2]->GetMultiplicityINEL(0)->Integral(0, data[2]->GetMultiplicityINEL(0)->GetNbinsX()+1);
  Float_t total = nd + dd + sd;
  
  nd /= total;
  sd /= total;
  dd /= total;
  
  Printf("Ratios in the correction map are: ND=%f, DD=%f, SD=%f", nd, dd, sd);
  
  Float_t ratio[3];
  ratio[0] = ref_SD / sd;
  ratio[1] = ref_DD / dd;
  ratio[2] = ref_ND / nd;
  
  Printf("SD=%.2f, DD=%.2f, ND=%.2f",ratio[0], ratio[1], ratio[2]);
  
  for (Int_t i=0; i<3; ++i)
  {
    // modify x-section
    for (Int_t j=0; j<AliMultiplicityCorrection::kMCHists; j++)
    {
      data[i]->GetMultiplicityVtx(j)->Scale(ratio[i]);
      data[i]->GetMultiplicityMB(j)->Scale(ratio[i]);
      data[i]->GetMultiplicityINEL(j)->Scale(ratio[i]);
      data[i]->GetMultiplicityNSD(j)->Scale(ratio[i]);
    }

    for (Int_t j=0; j<AliMultiplicityCorrection::kESDHists; j++)
    {
      data[i]->GetMultiplicityESD(j)->Scale(ratio[i]);
      data[i]->GetTriggeredEvents(j)->Scale(ratio[i]);
      data[i]->GetNoVertexEvents(j)->Scale(ratio[i]);
    }
    
    for (Int_t j=0; j<AliMultiplicityCorrection::kCorrHists; j++)
      data[i]->GetCorrelation(j)->Scale(ratio[i]);

    if (i > 0)
      list.Add(data[i]);
  }

  printf("Case %d, %s: Entries in response matrix: SD: %.2f DD: %.2f ND: %.2f", xsectionID, data[0]->GetName(), data[0]->GetCorrelation(0)->Integral(), data[1]->GetCorrelation(0)->Integral(), data[2]->GetCorrelation(0)->Integral());

  data[0]->Merge(&list);

  Printf(" Total: %.2f", data[0]->GetCorrelation(0)->Integral());

  TFile::Open(output, "RECREATE");
  data[0]->SaveHistograms();
  gFile->Close();

  list.Clear();

  for (Int_t i=0; i<3; ++i)
    delete data[i];
}

void Rebin(const char* fileName = "multiplicityMC_3M.root", Int_t corrMatrix = 3)
{
  // rebins MC axis of correlation map, MC and histogram for corrected (for evaluation of effect of regularization)
  // rebin does not exist for 3D hists, so we convert to 2D and then back to 3D (loosing the vertex information)

  Printf("WARNING: Vertex information is lost in this process. Use result only for evaluation of errors.");

  gSystem->Load("libPWG0base");

  AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");

  TFile::Open(fileName);
  mult->LoadHistograms("Multiplicity");

  // rebin correlation
  TH3* old = mult->GetCorrelation(corrMatrix);

  // empty under/overflow bins in x, otherwise Project3D takes them into account
  for (Int_t y=1; y<=old->GetYaxis()->GetNbins(); ++y)
  {
    for (Int_t z=1; z<=old->GetZaxis()->GetNbins(); ++z)
    {
      old->SetBinContent(0, y, z, 0);
      old->SetBinContent(old->GetXaxis()->GetNbins()+1, y, z, 0);
    }
  }

  TH2* response = (TH2*) old->Project3D("zy");
  response->RebinX(2);

  TH3F* new = new TH3F(old->GetName(), old->GetTitle(),
    old->GetXaxis()->GetNbins(), old->GetXaxis()->GetBinLowEdge(1), old->GetXaxis()->GetBinUpEdge(old->GetXaxis()->GetNbins()),
    old->GetYaxis()->GetNbins() / 2, old->GetYaxis()->GetBinLowEdge(1), old->GetYaxis()->GetBinUpEdge(old->GetYaxis()->GetNbins()),
    old->GetZaxis()->GetNbins(), old->GetZaxis()->GetBinLowEdge(1), old->GetZaxis()->GetBinUpEdge(old->GetZaxis()->GetNbins()));
  new->Reset();

  Int_t vtxBin = new->GetNbinsX() / 2;
  if (vtxBin == 0)
    vtxBin = 1;

  for (Int_t i=1; i<=new->GetYaxis()->GetNbins(); i+=1)
    for (Int_t j=1; j<=new->GetZaxis()->GetNbins(); j+=1)
      new->SetBinContent(vtxBin, i, j, response->GetBinContent(i, j));

  // rebin MC + hist for corrected
  for (AliMultiplicityCorrection::EventType eventType = AliMultiplicityCorrection::kTrVtx; eventType <= AliMultiplicityCorrection::kINEL; eventType++)
    mult->GetMultiplicityMC(corrMatrix, eventType)->RebinY(2);

  mult->GetMultiplicityESDCorrected(corrMatrix)->Rebin(2);

  // recreate measured from correlation matrix to get rid of vertex shift effect
  TH2* newMeasured = (TH2*) old->Project3D("zx");
  TH2* esd = mult->GetMultiplicityESD(corrMatrix);
  esd->Reset();

  // transfer from TH2D to TH2F
  for (Int_t i=0; i<=new->GetXaxis()->GetNbins()+1; i+=1)
    for (Int_t j=0; j<=new->GetYaxis()->GetNbins()+1; j+=1)
      esd->SetBinContent(i, j, newMeasured->GetBinContent(i, j));

  new TCanvas;
  new->Project3D("zy")->DrawCopy("COLZ");

  TFile* file = TFile::Open("out.root", "RECREATE");
  mult->SetCorrelation(corrMatrix, new);
  mult->SaveHistograms();
  file->Close();
}

void EvaluateRegularizationEffect(Int_t step, const char* fileNameRebinned = "multiplicityMC_3M_rebinned.root", const char* fileNameNormal = "multiplicityMC_3M.root", Int_t histID = 3)
{
  // due to some static members in AliMultiplicityCorrection, the session has to be restarted after changing the number of parameters, to be fixed
  // that is why this is done in 2 steps

  gSystem->Load("libPWG0base");

  Bool_t fullPhaseSpace = kFALSE;

  if (step == 1)
  {
    // first step: unfold without regularization and rebinned histogram ("N=M")
    AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
    TFile::Open(fileNameRebinned);
    mult->LoadHistograms();

    mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0, 125);
    mult->SetCreateBigBin(kFALSE);

    mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
    mult->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, mult->GetMultiplicityVtx(histID)->ProjectionY("mymchist"));

    TFile* file = TFile::Open("EvaluateRegularizationEffect1.root", "RECREATE");
    mult->SaveHistograms();
    file->Close();
  }
  else if (step == 2)
  {
    // second step: unfold with regularization and normal histogram
    AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
    TFile::Open(fileNameNormal);
    mult2->LoadHistograms();

    mult2->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 1e4);
    mult2->SetCreateBigBin(kTRUE);
    mult2->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
    mult2->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, mult2->GetMultiplicityVtx(histID)->ProjectionY("mymchist"));

    TH1* result2 = mult2->GetMultiplicityESDCorrected(histID);

    AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
    TFile* file = TFile::Open("EvaluateRegularizationEffect1.root");
    mult->LoadHistograms();

    TH1* result1 = mult->GetMultiplicityESDCorrected(histID);

    // compare results
    TCanvas* canvas = new TCanvas("EvaluateRegularizationEffect", "EvaluateRegularizationEffect", 1000, 800);
    canvas->Divide(2, 2);

    canvas->cd(1);
    result1->SetLineColor(1);
    result1->DrawCopy();
    result2->SetLineColor(2);
    result2->DrawCopy("SAME");
    gPad->SetLogy();

    result2->Rebin(2);
    result1->Scale(1.0 / result1->Integral());
    result2->Scale(1.0 / result2->Integral());

    canvas->cd(2);
    result1->DrawCopy();
    result2->DrawCopy("SAME");
    gPad->SetLogy();

    TH1* diff = (TH1*) result1->Clone("diff");
    diff->Add(result2, -1);

    canvas->cd(3);
    diff->DrawCopy("HIST");

    canvas->cd(4);
    diff->Divide(result1);
    diff->GetYaxis()->SetRangeUser(-0.3, 0.3);
    diff->DrawCopy("HIST");

    Double_t chi2 = 0;
    for (Int_t i=1; i<=diff->GetNbinsX(); i++)
      chi2 += diff->GetBinContent(i) * diff->GetBinContent(i);

    Printf("Chi2 is %e", chi2);

    canvas->SaveAs(Form("%s.eps", canvas->GetName()));
  }
}

void MergeDistributions()
{
  loadlibs();

  const char* dir1 = "run000104824-52_pass4";
  const char* dir2 = "run000104867_90_92_pass4";
  
  for (Int_t evType = 0; evType < 2; evType++)
  {
    Printf("%d", evType);
    
    const char* evTypeStr = ((evType == 0) ? "inel" : "nsd");

    const char* id = "chi2a";
    //const char* id = "bayes";
    
    TString suffix;
    suffix.Form("/all/spd/%s_", id);
    if (evType == 1)
      suffix.Form("/v0and/spd/%s_", id);
  
    TString file1, file2;
    file1.Form("%s%s%%s.root", dir1, suffix.Data());
    file2.Form("%s%s%%s.root", dir2, suffix.Data());
    
    if (1)
    {
      const char* files[] = { Form(file1.Data(), evTypeStr), Form(file2.Data(), evTypeStr) };
      Merge(2, files, Form("merged/%s_%s.root", id, evTypeStr));
    }
    else
    {
      AliMultiplicityCorrection* mult1 = AliMultiplicityCorrection::Open(Form(file1.Data(), evTypeStr));
      AliMultiplicityCorrection* mult2 = AliMultiplicityCorrection::Open(Form(file2.Data(), evTypeStr));
      
      AliMultiplicityCorrection* target = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
      
      for (Int_t etaRange = 0; etaRange < 3; etaRange++)
      {
        hist1 = mult1->GetMultiplicityESDCorrected(etaRange);
        hist2 = mult2->GetMultiplicityESDCorrected(etaRange);
        targetHist = target->GetMultiplicityESDCorrected(etaRange);
        
        //hist1->Scale(1.0 / hist1->Integral());
        //hist2->Scale(1.0 / hist2->Integral());
        
        //targetHist->SetBinContent(1, hist1->GetBinContent(1) * 0.5 + hist2->GetBinContent(1) * 0.5);
        targetHist->SetBinContent(1, hist1->GetBinContent(1) + hist2->GetBinContent(1));
        for (Int_t i=1; i<=hist1->GetNbinsX(); i++)
        {
          if (hist1->GetBinError(i) > 0 && hist2->GetBinError(i) > 0)
          {
            Float_t w1 = 1.0 / hist1->GetBinError(i) / hist1->GetBinError(i);
            Float_t w2 = 1.0 / hist2->GetBinError(i) / hist2->GetBinError(i);
            
            Float_t average = (hist1->GetBinContent(i) * w1 + hist2->GetBinContent(i) * w2) / (w1 + w2);
            
            //targetHist->SetBinContent(i, average);
            //targetHist->SetBinError(i, TMath::Max(mult1->GetBinError(i), mult2->GetBinError(i)));
            
            targetHist->SetBinContent(i, hist1->GetBinContent(i) + hist2->GetBinContent(i));
            targetHist->SetBinError(i, hist1->GetBinError(i) + hist2->GetBinError(i));
          }
        }
      }
      
      file = TFile::Open(Form("merged/%s_%s.root", id, evTypeStr), "RECREATE");
      target->SaveHistograms();
      file->Close();
    }

    const char* files2[] = { Form(file1.Data(), evTypeStr), Form(file2.Data(), evTypeStr), Form("merged/%s_%s.root", id, evTypeStr) };
    drawAll(files2, (evType == 1), kTRUE);
  }
}

void CompareDistributions(Int_t evType)
{
  loadlibs();
  gROOT->ProcessLine(gSystem->ExpandPathName(".L $ALICE_ROOT/PWG0/dNdEta/drawPlots.C"));

  const char* dir1 = "run000104824-52_pass4";
  const char* dir2 = "run000104867_90_92_pass4";
  
  const char* evTypeStr = (evType == 0) ? "inel" : "nsd";

  const char* suffix = "/all/spd/chi2a_";
  if (evType == 1)
    suffix = "/v0and/spd/chi2a_";
  
  TString file1, file2;
  file1.Form("%s%s%s.root", dir1, suffix, evTypeStr);
  file2.Form("%s%s%s.root", dir2, suffix, evTypeStr);
    
  for (Int_t hID = 0; hID < 3; hID++)
    CompareQualityHists(file1, file2, Form("Multiplicity/fMultiplicityESDCorrected%d", hID), 1, 1);
}

void StatisticalUncertainty(Int_t methodType, Int_t etaRange, Bool_t mc = kFALSE)
{
  loadlibs();
  
  AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open("multiplicityMC.root");
  AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open("multiplicityESD.root");
  AliMultiplicityCorrection* multTrigger = AliMultiplicityCorrection::Open("multiplicityTrigger.root");

  TH1* mcHist = esd->GetMultiplicityMB(etaRange)->ProjectionY("mymc", 1, 1);

  Int_t geneLimits[] = { 0, 0, 0 };

  LoadAndInitialize(mult, esd, multTrigger, etaRange, kFALSE, geneLimits);

  AliUnfolding::SetNbins(kBinLimits[etaRange], geneLimits[etaRange]);
  AliUnfolding::SetChi2Regularization(AliUnfolding::kPol0, 5);
  AliUnfolding::SetBayesianParameters(1, 10);

  // background subtraction
  Int_t background = 0;
  
  //background = 1091 + 4398; // MB1 for run 104824 - 52
  background = 417 + 1758; // MB1 for run 104867 - 92
  
  //background = 20 + 0; // V0AND for run 104824 - 52
  //background = 10 + 0; // V0AND for run 104867 - 92
  
  Printf("NOTE: Subtracting %d background events", background);

  Int_t zeroBin = mult->GetTriggeredEvents(etaRange)->GetBinContent(1) - background - mult->GetMultiplicityESD(etaRange)->Integral(0, 2, 1, 1);
  
  TH1* errorMeasured = (TH1*) mult->StatisticalUncertainty((AliUnfolding::MethodType) methodType, etaRange, kFALSE, AliMultiplicityCorrection::kMB, zeroBin, kTRUE, kFALSE, ((mc) ? mcHist : 0))->Clone("errorMeasured");
  
  new TCanvas; errorMeasured->Draw();
  new TCanvas; 

  AliPWG0Helper::NormalizeToBinWidth(mult->GetMultiplicityESDCorrected(etaRange));
  mult->GetMultiplicityESDCorrected(etaRange)->Draw();
  
  if (mc)
  {
    AliPWG0Helper::NormalizeToBinWidth(mcHist);
    mcHist->Scale(mult->GetMultiplicityESDCorrected(etaRange)->Integral() / mcHist->Integral()); 
    mcHist->SetLineColor(2);
    mcHist->Draw("SAME");
  }
  gPad->SetLogy();
  
  TH1* errorResponse = (TH1*) mult->StatisticalUncertainty((AliUnfolding::MethodType) methodType, etaRange, kFALSE, AliMultiplicityCorrection::kMB, zeroBin, kFALSE, kTRUE, ((mc) ? mcHist : 0))->Clone("errorResponse");

  TH1* errorBoth = (TH1*) mult->StatisticalUncertainty((AliUnfolding::MethodType) methodType, etaRange, kFALSE, AliMultiplicityCorrection::kMB, zeroBin, kTRUE, kTRUE, ((mc) ? mcHist : 0))->Clone("errorBoth");

  if (mc)
  {
    TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
    DrawResultRatio(mcHist, result, "StatisticalUncertainty2.eps");
  }

  TFile* file = new TFile(Form("StatisticalUncertaintySPD%s.root", (methodType == 0) ? "Chi2" : "Bayesian"), "RECREATE");
  errorResponse->Write();
  errorMeasured->Write();
  errorBoth->Write();
  file->Close();
}

void ChangeResponseMatrixEfficiency(Bool_t reduceEff = kTRUE, Float_t factor = 0.01625)
{
  loadlibs();
  
  AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open("multiplicity.root");
  
  for (Int_t etaR = 0; etaR < 3; etaR++)
  {
    TH3* corr = mult->GetCorrelation(etaR);
    TH3* corrOld = (TH3*) corr->Clone("corrOld");
    
    corr->Reset();
    
    Int_t total = 0;
    Int_t change = 0;
    for (Int_t x=0; x<=corr->GetNbinsX()+1; x++)
    {
      for (Int_t y=0; y<=corr->GetNbinsY()+1; y++)
      {
        Printf("%d", y);
        for (Int_t z=0; z<=corr->GetNbinsZ()+1; z++)
        {
          Float_t tracklets = corr->GetZaxis()->GetBinCenter(z);
          
          for (Int_t n=0; n<corrOld->GetBinContent(x, y, z); n++)
          {
            total += tracklets;
            Float_t trackletsNew = tracklets;
            
            for (Int_t i=0; i<tracklets; i++)
            {
              if (gRandom->Uniform() < factor)
              {
                trackletsNew += (reduceEff) ? -1 : 1;
                change += (reduceEff) ? -1 : 1;
              }
            }
                
            corr->Fill(corr->GetXaxis()->GetBinCenter(x), corr->GetYaxis()->GetBinCenter(y), trackletsNew);
          }
        }
      }
    }
    
    Printf("%d: Changed %d out of %d total tracklets", etaR, change, total);
  }

  file = TFile::Open("out.root", "RECREATE");
  mult->SaveHistograms();
  file->Close();
}

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