ROOT logo
void Load();
TList *GetResults(Char_t *testfile,char* listName);
TObject* GetMeasuredSpectrum(TList *fContainer);
TObject* GetGeneratedSpectrum(TList *fContainer);
TObject* GetEfficiency(TList *fContainer,Int_t iCase = 44);
THnSparse* GetResponseMatrix(TList *fContainer);
THnSparse* CreateEmptyResponseMatrix();
Float_t GetNTrials(TList *fContainer);
THnSparse* CreateGuessed(const THnSparse* h);
void PrintErrors(THnSparse *h);

Int_t fDebug = 10;

int iRebin = 8; // 

// *************************************************************************************************************
// Macro for unfolding jet spectra:
// * First Unfolding is always the MC itself 
// * if bMCtest we take a second MC which is unfolded with the first MC otherwise real data is unfolded with first MC
// * bMC2 controls wether we correct to charged particle jets or not
// ############### CHANGELOG ################
// 23.11. added method to create an empty response matrix
 
void runUnfoldingCF( int gIterations = 10, bool bMC2 = true,bool bNoPrior = true,bool bMCtest = true, int iJetF = 0) {
  Load();

  const bool bPreSmooth = false;

  // can be different depeding on the prior
  Int_t fIterations = gIterations;
  Int_t fIterations2 = gIterations;
  Int_t fIterations3 = gIterations;

  // the first one is usually MC only
  TString cJetF;
  TString listName;
  TString testfile;
  if(bMCtest) testfile = "allpt_lhc10e14_100903_Chunk1.root"; // the higher stats chunck  
  else testfile = "allpt_lhc10e14_100903.root";  
  TList *results = 0;
  if(iJetF == 0){
    cJetF = "anti-k_{T}";
    listName = "spec2_jetsAOD_FASTJET04_jetsAODMC%s_FASTJET04_0000000000";  
  }
  else if(iJetF == 1){
    cJetF = "k_{T}";
    listName = "spec2_jetsAOD_FASTKT04_jetsAODMC%s_FASTKT04_0000000000"; 
  }
  else if(iJetF == 2){
    cJetF = "UA1";
    listName = "spec2_jets_jetsAODMC%s_UA104_0000000000";
  }
  TList *results =  GetResults(testfile.Data(),Form(listName.Data(),(bMC2?"2":"")));
  
  // here comes the real data
  TString cJetF2;
  TString listName2;
  TString testfile2;
  
  if(bMCtest)testfile2 = "allpt_lhc10e14_100903_Chunk0.root";  // the smalle stats
  else testfile2 = "/Users/kleinb/alice/jets/train/100910/PWG4_JetTasksOutput_Merge_bcd.root";
  if(iJetF == 0){
    cJetF = "anti-k_{T}";
    if(bMCtest)listName2 = "spec2_jetsAOD_FASTJET04_jetsAODMC%s_FASTJET04_0000000000";  
    else listName2 = "spec2_jetsAOD_FASTJET04__0000000000";  

  }
  else if(iJetF == 1){
    cJetF = "k_{T}";
    if(bMCtest)listName2 = "spec2_jetsAOD_FASTKT04_jetsAODMC%s_FASTKT04_0000000000"; 
    else listName2 = "spec2_jetsAOD_FASTKT04__0000000000"; 

  }
  else if(iJetF == 2){
    cJetF = "k_{T}";
    if(bMCtest)listName2 = "spec2_jets_jetsAODMC%s_UA104_0000000000";
    else listName2 = "spec2_jets__0000000000";

  }
  TList *results2 = GetResults(testfile2.Data(),Form(listName2.Data(),(bMC2?"2":"")));bool bScale = false;
  


  if(!results){
    Error("No output objects: Calculation will terminate here");
    return;
  }

  bool b1D = true;
  const Float_t kMaxPt = 140; //  only for drawin... 
  const Float_t kMaxPt2 = 140;


  char cString[] = Form("unfolded/101010_unfolding%s_MC%s%s%%s_%sIter%04d_Rebin%02d_jet%d",(bNoPrior?"_NoPrior":""),(bMC2?"2":""),(bPreSmooth?"_PreSmooth":""),(bMCtest?"MCtest_":""),gIterations,iRebin,iJetF);
  char cPrintMask[] = Form("%s.png",cString);
  
  TF3 *fSmooth = new TF3("fSmooth","[0]*pow(x,[1])+[2]*y+[3]*z",5.,150,-10,10,-10,10);
  fSmooth = 0;
  TF3 *fSmooth2 = 0;
  TF3 *fSmooth3 = 0;

  //  fSmooth = 0;
  AliLog::SetGlobalLogLevel(AliLog::kDebug);
  // get the essential
  if(fSmooth){
    fSmooth->SetParameters(1,-8,0,0);
    fSmooth2 = (TF3*)fSmooth->Clone("fSmooth2");
    fSmooth3 = (TF3*)fSmooth->Clone("fSmooth3");
  }

  


  THnSparseF *efficiency  = (THnSparseF*)  GetEfficiency(results,41);
  THnSparseF *efficiencyRecMatch  = (THnSparseF*)  GetEfficiency(results,131);
  THnSparseF *response    = (THnSparseF*)  GetResponseMatrix(results);



  THnSparseF *measuredIn2    = (THnSparseF*) GetMeasuredSpectrum(results2);
  measuredIn2->Multiply(efficiencyRecMatch);
  THnSparseF *measuredIn    = (THnSparseF*) GetMeasuredSpectrum(results);
  measuredIn->Multiply(efficiencyRecMatch);
  THnSparseF *generatedOut   = (THnSparseF*) GetGeneratedSpectrum(results);
  THnSparseF *generatedOut2   = (THnSparseF*) GetGeneratedSpectrum(results2);
 
  Float_t fTrials =  GetNTrials(results);
  Float_t fTrials2 = GetNTrials(results2);
  if(bScale){
    Printf("Trials %.3E %.3E",fTrials,fTrials2);
    measuredIn2->Scale(1./fTrials2);
    measuredIn->Scale(1./fTrials);
  }

  // set the content to zero above threshold
  /*
  const float lastPt = 250;
  Int_t ibxyz[3];
  for(int ibx = 1;ibx<=measuredIn2->GetAxis(0)->GetNbins();ibx++){
    float pt = measuredIn2->GetAxis(0)->GetBinCenter(ibx);

    if(pt<lastPt)continue;
    ibxyz[0] = ibx;
    for(int iby = 1;iby<=measuredIn2->GetAxis(1)->GetNbins();iby++){
      ibxyz[1] = iby;
      for(int ibz = 1;ibz<=measuredIn2->GetAxis(2)->GetNbins();ibz++){
	ibxyz[2] = ibz;
	measuredIn2->SetBinContent(ibxyz,0);
	measuredIn2->SetBinError(ibxyz,0);
      }
    }
  }
  */


  // for testing
  const int nDim = 3;
  const int dimrec[nDim] = {0,1,2}; 
  const int dimgen[nDim] = {3,4,5}; 
 

  /* 
  THnSparseF *generated = response->Projection(nDim,dimgen);
  THnSparseF *measured = response->Projection(nDim,dimrec);
  */

  // create a guessed "a priori" distribution using binning of MC
  THnSparse* guessed2 = CreateGuessed(generatedOut) ; // can at best take the measured?
  THnSparse* guessed = CreateGuessed(generatedOut) ; // can at best take the measured?
  Printf("%s:%d %d",(char*)__FILE__,__LINE__,guessed2->GetNbins()); 
  Printf("%s:%d %d",(char*)__FILE__,__LINE__,guessed->GetNbins()); 

  //---- Dbug show the errrors
  //  PrintErrors(guessed);
  //  PrintErrors(response);
  //  PrintErrors(efficiency);
  //   PrintErrors(measuredIn);
  //  PrintErrors(generatedOut);
 
  Bool_t bCorrelatedErrors = true;
  AliCFUnfolding unfolding("unfolding","title",3,response,efficiency,measuredIn,(bNoPrior?0:guessed));
  unfolding.SetMaxNumberOfIterations(fIterations); // regulate flutuations...
  unfolding.SetMaxChi2PerDOF(0);
  if(fSmooth)unfolding.UseSmoothing(fSmooth);
  if(bCorrelatedErrors){
    unfolding.SetUseCorrelatedErrors(kTRUE);
    unfolding.SetMaxConvergencePerDOF(0.01*0.01);
  }

  unfolding.Unfold();

  THnSparse* result = unfolding.GetUnfolded();
  THnSparse* estMeasured = unfolding.GetEstMeasured();


  //----
  AliCFUnfolding unfolding2("unfolding2","title",3,response,efficiency,measuredIn2,(bNoPrior?0:guessed));
  //  AliCFUnfolding unfolding2("unfolding2","title",3,response,efficiency,measuredIn2,0);
  unfolding2.SetMaxNumberOfIterations(fIterations2);
  unfolding2.SetMaxChi2PerDOF(0);
  // carefull with 0x0 pointer neighbouring bin smoothing is switched on...
  if(fSmooth2)unfolding2.UseSmoothing(fSmooth2);
  if(bCorrelatedErrors){
    unfolding2.SetUseCorrelatedErrors(kTRUE);
    unfolding2.SetMaxConvergencePerDOF(0.01*0.01);
  }
  unfolding2.Unfold();



  THnSparse* estMeasuredTmp = unfolding2.GetEstMeasured();
  THnSparse* result2 = 0;
  THnSparse* estMeasured2 = 0;
  if(bPreSmooth){
    // use the result of the previous as smoothed input...
    AliCFUnfolding unfolding3("unfolding3","title",3,response,efficiency,estMeasuredTmp,(bNoPrior?0:guessed));
    unfolding3.SetMaxNumberOfIterations(fIterations3);
    unfolding3.SetMaxChi2PerDOF(0);
    unfolding3.UseSmoothing(fSmooth3);
    unfolding3.Unfold();
    result2 = unfolding3.GetUnfolded();
    estMeasured2 = unfolding3.GetEstMeasured();
  }
  else{
    result2 = unfolding2.GetUnfolded();
    estMeasured2 = estMeasuredTmp;
  }



  TCanvas * canvas = new TCanvas("canvas","",1200,900);
  canvas->Divide(2,3);
  TCanvas * cPrint = new TCanvas("cPrint","");



  TFile *f1 = new TFile(Form("%s.root",Form(cString,"")),"RECREATE");
  TParameter<Long_t>* fIterationsPara =  new TParameter<Long_t> ("fIterations", 0);
  fIterationsPara->SetVal((Long_t)gIterations);
  fIterationsPara->Write();
 
  TDirectory *dMC = f1->mkdir("unfoldMC");
  TDirectory *dReal = f1->mkdir("unfoldReal");

  gROOT->cd();
  // color code black is unfolded
  // blue is measured 
  // red  is generated
  // kGreen is guessed



  if(b1D){

    TH1* h_gen = generatedOut->Projection(0);

    h_gen->SetMarkerColor(kRed);
    h_gen->SetMarkerStyle(kFullSquare);
    h_gen->SetName("generated");
    h_gen->SetTitle("generated");
    TH1* h_meas = measuredIn->Projection(0);
    h_meas->SetMarkerColor(kBlue);
    h_meas->SetMarkerStyle(kFullSquare);
    h_meas->SetName("measured");
    h_meas->SetTitle("measured");
    TH1* h_guess = guessed->Projection(0);
    h_guess->SetMarkerColor(kGreen);
    h_guess->SetMarkerStyle(kFullSquare);
    h_guess->SetName("guessed");
    h_guess->SetTitle("guesse");
    TH1* h_unf = result->Projection(0);
    h_unf->SetMarkerColor(kBlack);
    h_unf->SetMarkerStyle(kFullSquare);
    h_unf->SetName("unfolded");
    h_unf->SetTitle("unfolded");
    TH1* h_estmeas = estMeasured->Projection(0);
    h_estmeas->SetMarkerColor(kGray);
    h_estmeas->SetMarkerStyle(kFullSquare);
    h_estmeas->SetName("estmeas");
    h_estmeas->SetTitle("estmeas");

    TLegend *leg = new TLegend(0.6,0.6,0.85,0.8);
    leg->SetFillColor(0);
    leg->SetTextFont(gStyle->GetTextFont());
    leg->SetBorderSize(0);
    leg->AddEntry(h_meas,"measured","P");
    leg->AddEntry(h_gen,"generated","P");
    leg->AddEntry(h_unf,"unfolded","P");
    leg->AddEntry(h_estmeas,"R * u","P");



    canvas->cd(1)->SetLogy();
    h_gen->SetAxisRange(0,kMaxPt);
    h_meas->SetAxisRange(0,kMaxPt);
    h_meas->SetXTitle("p_{T} (GeV)");
    h_meas->SetYTitle("yield (arb. units)");
    h_meas->DrawCopy("P");
    h_gen->DrawCopy("Psame");
    h_unf->DrawCopy("Psame");
    h_estmeas->DrawCopy("Psame");
    leg->Draw("");
    cPrint->cd()->SetLogy();
    h_meas->DrawCopy("P");
    h_gen->DrawCopy("Psame");
    h_unf->DrawCopy("Psame");
    h_estmeas->DrawCopy("Psame");
    leg->Draw("");
    canvas->Update();
    cPrint->Update();
    cPrint->SaveAs(Form(cPrintMask,"spectrum_mc"));
    if(!gROOT->IsBatch()){
      if(getchar()=='q')return;
    }
    // the same for the real data
    TH1* h_gen2 = generatedOut2->Projection(0);

    h_gen2->SetMarkerColor(kRed);
    h_gen2->SetMarkerStyle(kFullCircle);
    h_gen2->SetName("generated2");
    h_gen2->SetTitle("generated2");
    TH1* h_meas2 = measuredIn2->Projection(0);
    h_meas2->SetMarkerColor(kBlue);
    h_meas2->SetMarkerStyle(kFullCircle);
    h_meas2->SetName("measured2");
    h_meas2->SetTitle("measured2");
    TH1* h_guess2 = guessed2->Projection(0);
    h_guess2->SetMarkerColor(kGreen);
    h_guess2->SetMarkerStyle(kFullCircle);
    h_guess2->SetName("guessed2");
    h_guess2->SetTitle("guesse2");
    TH1* h_unf2 = result2->Projection(0);
    PrintErrors(result2);
    h_unf2->SetMarkerColor(kBlack);
    h_unf2->SetMarkerStyle(kFullCircle);
    h_unf2->SetName("unfolded2");
    h_unf2->SetTitle("unfolded2");
    TH1* h_estmeas2 = estMeasured2->Projection(0);
    h_estmeas2->SetMarkerColor(kGray);
    h_estmeas2->SetMarkerStyle(kFullCircle);
    h_estmeas2->SetName("estmeas2");
    h_estmeas2->SetTitle("estmeas2");

    TLegend *leg2 = new TLegend(0.6,0.6,0.85,0.8);
    leg2->SetFillColor(0);
    leg2->SetTextFont(gStyle->GetTextFont());
    leg2->SetBorderSize(0);
    leg2->AddEntry(h_meas2,"measured","P");
    leg2->AddEntry(h_gen2,"generated","P");
    leg2->AddEntry(h_unf2,"unfolded","P");
    leg2->AddEntry(h_estmeas2,"R * u","P");
    
    Printf("Integral Measured: %E Unfolded %E R*U %E",h_meas2->Integral(),h_unf2->Integral(),h_estmeas2->Integral());



    canvas->cd(2)->SetLogy();
    //

    h_meas2->SetXTitle("p_{T} (GeV)");
    h_meas2->SetYTitle("yield (arb. units)");
    //    h_gen2->DrawCopy("P");
    h_unf2->SetAxisRange(0,kMaxPt2);
    h_meas2->SetAxisRange(0,kMaxPt2);
    h_meas2->DrawCopy("P");
    h_unf2->DrawCopy("Psame");
    h_estmeas2->DrawCopy("Psame");
    leg2->Draw();
    cPrint->cd()->SetLogy();
    h_unf2->SetAxisRange(0,kMaxPt2);
    h_meas2->SetAxisRange(0,kMaxPt2);
    h_meas2->DrawCopy("P");
    h_unf2->DrawCopy("Psame");
    h_estmeas2->DrawCopy("Psame");
    canvas->Update();
    cPrint->Update();
    leg2->Draw();
    cPrint->SaveAs(Form(cPrintMask,"spectrum_real"));
    if(!gROOT->IsBatch()){
      if(getchar()=='q')return;
    }



    // residuals

    TH1D *hResiduals = (TH1D*) h_meas->Clone("hResiduals");
    hResiduals->Reset();
    for(int ib = 1;ib <  hResiduals->GetNbinsX();ib++){
      float val1 =  h_meas->GetBinContent(ib);
      float err1 =  h_meas->GetBinError(ib);
      float val2 =  h_estmeas->GetBinContent(ib);
      if(err1>0){
	Float_t res = (val1-val2)/err1;
	Float_t res_err = (val1-val2)/err1*0.01; // error bars of 1%
	hResiduals->SetBinContent(ib,res);
	hResiduals->SetBinError(ib,0.01);
      }
      
    }
    hResiduals->SetXTitle("p_{T} (GeV)");
    hResiduals->SetYTitle("#frac{m - R * u}{e_{m}}");
    hResiduals->SetMaximum(4.5);
    hResiduals->SetMinimum(-4.5);


    canvas->cd(3);
    //    hRatioGenUnf->DrawCopy("p");
    hResiduals->SetAxisRange(0,kMaxPt);
    hResiduals->DrawCopy("P");
    cPrint->cd();
    gPad->SetLogy(0);
    hResiduals->DrawCopy("P");
    canvas->Update();
    cPrint->Update();
    cPrint->SaveAs(Form(cPrintMask,"residuals_mc"));
    if(!gROOT->IsBatch()){
      if(getchar()=='q')return;
    }

    TH1D *hResiduals2 =  (TH1D*)h_meas2->Clone("hResiduals2");
    hResiduals2->Reset();
    for(int ib = 1;ib <  hResiduals2->GetNbinsX();ib++){
      float val1 =  h_meas2->GetBinContent(ib);
      float err1 =  h_meas2->GetBinError(ib);
      float val2 =  h_estmeas2->GetBinContent(ib);
      if(err1>0){
	Float_t res = (val1-val2)/err1;
	Float_t res_err = (val1-val2)/err1*0.01; // error bars of 1%
	hResiduals2->SetBinContent(ib,res);
	hResiduals2->SetBinError(ib,0.01);
      }
      
    }
    hResiduals2->SetMaximum(4.5);
    hResiduals2->SetMinimum(-4.5);
    hResiduals2->SetYTitle("#frac{m - R * u}{e_{m}}");
    hResiduals2->SetAxisRange(0,kMaxPt2);
    cPrint->cd();
    gPad->SetLogy(0);
    hResiduals2->DrawCopy("P");
    canvas->Update();
    cPrint->Update();
    cPrint->SaveAs(Form(cPrintMask,"residuals_real"));
    if(!gROOT->IsBatch()){
      if(getchar()=='q')return;
    }

    canvas->Update();
    cPrint->Update();

    if(!gROOT->IsBatch()){
      if(getchar()=='q')return;
    }
    hResiduals2->DrawCopy("P");
    canvas->Update();
    cPrint->Update();
    if(!gROOT->IsBatch()){
      if(getchar()=='q')return;
    }

    TH1D *hRatioGenUnf2 = (TH1D*) h_gen2->Clone("hRatioGenUnf2");
    hRatioGenUnf2->Divide(h_unf2);
    canvas->cd(4);
    //    hRatioGenUnf2->DrawCopy("p");

    hResiduals2->DrawCopy("P");

    TH1D *hRatioUnfMeas = (TH1D*) h_unf->Clone("hRatioUnfMeas");
    hRatioUnfMeas->SetXTitle("p_{T} (GeV)");
    hRatioUnfMeas->SetYTitle("unfolded/meas");
    hRatioUnfMeas->Divide(h_meas);
    hRatioUnfMeas->SetMaximum(15);
    if(bMC2)hRatioUnfMeas->SetMaximum(5);
    hRatioUnfMeas->SetMinimum(0);
    TH1D *hRatioGenMeas =  (TH1D*)h_gen->Clone("hRatioGenMeas");
    hRatioGenMeas->Divide(h_meas);

    canvas->cd(5);
 
    hRatioUnfMeas->SetAxisRange(0.,kMaxPt);
    hRatioUnfMeas->DrawCopy("p");
    hRatioGenMeas->DrawCopy("psame");




    TH1D *hRatioUnfMeas2 =  (TH1D*) h_unf2->Clone("hRatioUnfMeas2");
    hRatioUnfMeas2->Divide(h_meas2);
    canvas->cd(6);
    hRatioUnfMeas2->SetXTitle("p_{T} (GeV)");
    hRatioUnfMeas2->SetYTitle("unfolded/meas");
    hRatioUnfMeas2->SetAxisRange(0.,kMaxPt2);
    hRatioUnfMeas2->SetMaximum(15);
    if(bMC2)hRatioUnfMeas2->SetMaximum(5);
    hRatioUnfMeas2->SetMinimum(0);
    hRatioUnfMeas2->DrawCopy("p");
    hRatioUnfMeas->DrawCopy("psame");

    // plot the effieciencies 
    cPrint->cd();
    TH1* hEffGen = efficiency->Projection(0);
    hEffGen->SetName("hEffGen");
    TH1* hEffRec = efficiencyRecMatch->Projection(0);
    hEffRec->SetName("hEffRec");

    hEffGen->SetAxisRange(0,kMaxPt2);
    hEffRec->SetAxisRange(0,kMaxPt2);

    hEffRec->SetXTitle("p_{T,gen/rec} (GeV/c)");
    hEffRec->SetYTitle("Efficiency");
    hEffGen->SetXTitle("p_{T,gen/rec} (GeV/c)");
    hEffGen->SetYTitle("Efficiency");

    hEffGen->SetMarkerColor(kBlue);
    hEffGen->SetMarkerStyle(kFullCircle);
    hEffRec->SetMarkerColor(kBlue);
    hEffRec->SetMarkerStyle(kOpenCircle);
    hEffGen->SetMaximum(1.2);
    hEffGen->SetMinimum(0.3);
    hEffGen->DrawCopy("p");
    hEffRec->DrawCopy("psame");
    cPrint->Update();
    cPrint->SaveAs(Form(cPrintMask,"effs"));

    h_unf->SetDirectory(dMC);
    h_meas->SetDirectory(dMC);
    hResiduals->SetDirectory(dMC);
    h_estmeas->SetDirectory(dMC);
    h_gen->SetDirectory(dMC);

 
    // put the used effs and response to the unfolded of the MC 

    hEffGen->SetDirectory(dMC);
    hEffRec->SetDirectory(dMC);
    //    response->SetDirectory(dMC);
    dMC->cd();
    guessed->Write();
    response->Write();
    measuredIn->Write();
    gROOT->cd();
   

    h_unf2->SetDirectory(dReal);
    h_meas2->SetDirectory(dReal);
    hResiduals2->SetDirectory(dReal);
    h_estmeas2->SetDirectory(dReal);
    h_gen2->SetDirectory(dReal); // will be empty if we use real data, but can check with different data set as well...

    dReal->cd();
    guessed2->Write();
    measuredIn2->Write();
    gROOT->cd();
    // store the parameters of the unfloding with tparamter...
    

  }
  canvas->cd();
  canvas->Modified();
  canvas->SaveAs(Form(cPrintMask,"all"));

  f1->Write();
  f1->Close();


  return;
  if(fDebug)Printf("Line:%d %s Entries %f",__LINE__,h_gen->GetName(),h_gen->GetEntries());
  //printf("c1\n");
  if(b1D)h_gen->DrawCopy("P");
  else h_gen->DrawCopy("lego2");

  


  if(b1D) canvas->cd(2)->SetLogy();
  else canvas->cd(2)->SetLogz();
  TH1* h_meas = 0;
  if(b1D) h_meas = measuredIn->Projection(0);
  else h_guessed = measuredIn->Projection(0,1);
  h_meas->SetName("measured");
  h_meas->SetTitle("measured");
  if(fDebug)Printf("Line:%d %s Entries %f",__LINE__,h_meas->GetName(),h_meas->GetEntries());

  //printf("c2\n");
  if(b1D) h_meas->Draw("hist");
  else h_meas->Draw("lego2");
  

  if(b1D) canvas->cd(3)->SetLogy();
  else canvas->cd(3)->SetLogz();

  TH1* h_guessed = 0;
  if(b1D) h_guessed = guessed2->Projection(0);
  else h_guessed = guessed2->Projection(0,1);

  h_guessed->SetTitle("a priori");
  h_guessed->SetName("apriori");
  if(fDebug)Printf("Line:%d %s Entries %f",__LINE__,h_guessed->GetName(),h_guessed->GetEntries());
  //printf("c3\n");
  if(b1D) h_guessed->Draw("hist");
  else h_guessed->Draw("lego2");

  canvas->cd(4);
  TH1* h_eff = 0;
  if(b1D) h_eff = efficiency->Projection(0);
  else h_eff = efficiency->Projection(0,1);

  h_eff->SetTitle("efficiency");
  h_eff->SetName("efficiency");
  if(fDebug)Printf("Line:%d %s Entries %f",__LINE__,h_eff->GetName(),h_eff->GetEntries());
  //printf("c4\n");
  if(b1D) h_eff->Draw("hist");
  else h_eff->Draw("lego2");


  if(b1D) canvas->cd(5)->SetLogy();
  else canvas->cd(5)->SetLogz();
  TH1* h_unf = 0;
  if(b1D) h_unf = result->Projection(0);
  else h_unf = result->Projection(0,1);
    
  h_unf->SetName("unfolded");
  h_unf->SetTitle("unfolded");
  //printf("c5\n");
  if(b1D) h_unf->Draw("hist");
  else h_unf->Draw("lego2");

  canvas->cd(6);
  TH1* ratio = 0;
  if(b1D){
    ratio = (TH1D*)h_unf->Clone("ratio");
    ratio->SetTitle("unfolded / generated");
    ratio->Divide(h_unf,h_gen,1,1);
  }
  else{
    ratio = (TH2D*)h_unf->Clone("ratio");
    ratio->SetTitle("unfolded / generated");
    ratio->Divide(h_unf,h_gen,1,1);
  }
//   ratio->Draw("cont4z");
//   ratio->Draw("surf2");
  //printf("c6\n");
  if(b1D)ratio->Draw("hist");
  else ratio->Draw("colz");

  return;

  canvas->cd(7);
  TH2* orig = unfolding.GetOriginalPrior()->Projection(1,0);
  orig->SetName("originalprior");
  orig->SetTitle("original prior");
  //printf("c7\n");
  orig->Draw("lego2");

  canvas->cd(8);
  THnSparseF* corrected = (THnSparseF*)measured->Clone("corrected");
  //corrected->ApplyEffCorrection(*efficiency);
  TH2D* corr = corrected->Projection(0,1);
  corr->SetTitle("simple correction");
  corr->SetName("simplecorrection");
  //printf("c8\n");
  corr->Draw("lego2");

  canvas->cd(9);
  TH2D* ratio2 = (TH2D*) corr->Clone();
  ratio2->Divide(corr,h_gen,1,1);
  ratio2->SetTitle("simple correction / generated");
  //printf("c9\n");
  ratio2->Draw("lego2");

  return;
}

// ====================================================================


void Load(){
  gSystem->Load("libTree");
  gSystem->Load("libPhysics");
  gSystem->Load("libHist");
  gSystem->Load("libVMC");
  gSystem->Load("libSTEERBase");
  gSystem->Load("libAOD");
  gSystem->Load("libESD");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libJETAN");
  gSystem->Load("libCORRFW");
  gSystem->Load("libPWG4JetTasks");
  gStyle->SetPalette(1);
  gStyle->SetOptStat(0);
}

TList *GetResults( Char_t *testfile, Char_t *cName){
  //
  // read output
  //
  TFile *f = TFile::Open(testfile);
  if(!f || f->IsZombie()){
    Error("File not readable");
    return 0x0;
  }
  TDirectory *dir = dynamic_cast<TDirectory*>(f->Get(Form("PWG4_%s",cName)));
  if(!dir){
    Printf("%s:%d: Output directory %s not found",(char*)__FILE__,__LINE__,Form("PWG4_%s",cName));
    f->ls();
    f->Close(); delete f;
    return 0x0;
  } 
  TList *l = dynamic_cast<TList *>(dir->Get(Form("pwg4%s",cName)));
  if(!l){
    Printf("%s:%d: Output list %s not found",(char*)__FILE__,__LINE__,Form("pwg4%s",cName));
    dir->ls();
    f->Close(); delete f;
    return 0x0;
  } 
  //  TList *returnlist = dynamic_cast<TList *>(l->Clone());
  // f->Close(); delete f;
  return l;
}


TObject* GetMeasuredSpectrum(TList *fContainer) {
  THnSparseF* htmp = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kMaxStep+AliAnalysisTaskJetSpectrum2::kStep1));
  THnSparseF* hm = (THnSparseF*)htmp->Clone("measured");
  hm->SetName("measured");
  hm->SetTitle("measured");
  if(iRebin==1)return hm;
  Int_t fRebin[3];
  fRebin[0] = iRebin;
  fRebin[1] = 1;
  fRebin[2] = 1;
  THnSparse *hm2 = hm->Rebin(fRebin); // this creates a new histo...
  //  hm2->Scale(iRebin);
  if(fDebug)Printf("Line: %d %s Entries %f",__LINE__,hm->GetName(),hm->GetEntries()); 
  return hm2;
}

Float_t GetNTrials(TList *fContainer){
  TH1F* htmp = (TH1F*)fContainer->FindObject("fh1Trials");
  return htmp->Integral();
}

TObject* GetGeneratedSpectrum(TList *fContainer) {
  // the generated jet spectrum within eta < 0.5
  THnSparseF* htmp = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kStep1));
  THnSparseF* hg = (THnSparseF*)htmp->Clone("generated");
  hg->SetName("generated");
  hg->SetTitle("generated");

  if(iRebin==1)return hg;
  Int_t fRebin[3];
  fRebin[0] = iRebin;
  fRebin[1] = 1;
  fRebin[2] = 1; 
  THnSparse* hg2 = hg->Rebin(fRebin);
  // hg2->Scale(iRebin);
  if(fDebug)Printf("Line: %d %s Entries %f",__LINE__,hg->GetName(),hg->GetEntries()); 
  return hg2;
}

TObject* GetEfficiency(TList *fContainer,Int_t iCase) {

  static int count = 0;
  THnSparseF* hn1 = 0;
  THnSparseF* hn2 = 0;
  THnSparseF* he = 0;
  if(iCase==44){
    // Unitiy efficiency...
    hn1 = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kStep4));
    hn2 = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kStep4));
   }
  else if(iCase==14){
    // eficiency Generated with gen < 0.5 --> gen with Rec partner in 0.5
    hn1 = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kStep1));
     hn2 = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kStep4));
   }
  else if(iCase==41){
    // eficiency Generated with gen < 0.5 --> gen with Rec partner in 0.5
    hn1 = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kStep4));
    hn2 = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kStep1));
   }
  else if(iCase==131){
    // eficiency reconstruted with < 0.5 --> with partner
    hn1 = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kMaxStep+AliAnalysisTaskJetSpectrum2::kStep3));
   hn2 = (THnSparseF*)fContainer->FindObject(Form("fhnJetContainer%d",AliAnalysisTaskJetSpectrum2::kMaxStep+AliAnalysisTaskJetSpectrum2::kStep1));
   }

  if(iRebin==1){
    he = (THnSparseF*)hn1->Clone("efficiency");
    he->Divide(hn1,hn2,1.,1.,"B");
    he->SetName(Form("efficiency_%d_%d",iCase,count));
    he->SetTitle(Form("efficiency_%d_%d",iCase,count));
    count++;
    return he;
  }
  Int_t fRebin[3];
  fRebin[0] = iRebin;
  fRebin[1] = 1;
  fRebin[2] = 1;  

  THnSparseF* hn1_2 = hn1->Rebin(fRebin);  
  THnSparseF* hn2_2 = hn2->Rebin(fRebin);  
  he = (THnSparseF*)hn1_2->Clone("efficiency");
  he->Divide(hn1_2,hn2_2,1.,1.,"B");
  he->SetName(Form("efficiency_%d_%d",iCase,count));
  he->SetTitle(Form("efficiency_%d_%d",iCase,count));
  return he;
}

THnSparse* CreateEmptyResponseMatrix(){
  // Creates an empty response matrix as in the Spectrum2 Task

  const Int_t kNvar   = 3 ; //number of variables on the grid:pt,eta, phi
  const Double_t kPtmin = 0.0, kPtmax = 320.; 
  const Double_t kEtamin = -3.0, kEtamax = 3.0;
  const Double_t kPhimin = 0., kPhimax = 2. * TMath::Pi();
  const Double_t kZmin = 0., kZmax = 1;

  //arrays for the number of bins in each dimension
  Int_t iBin[kNvar];
  iBin[0] = 320; //bins in pt
  iBin[1] =  1; //bins in eta 
  iBin[2] = 1; // bins in phi

  //arrays for lower bounds :
  Double_t* binEdges[kNvar];
  for(Int_t ivar = 0; ivar < kNvar; ivar++)
    binEdges[ivar] = new Double_t[iBin[ivar] + 1];

  //values for bin lower bounds
  //  for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)TMath::Power(10,TMath::Log10(kPtmin) + (TMath::Log10(kPtmax)-TMath::Log10(kPtmin))/iBin[0]*(Double_t)i);  
  for(Int_t i=0; i<=iBin[0]; i++) binEdges[0][i]=(Double_t)kPtmin  + (kPtmax-kPtmin)/(Double_t)iBin[0]*(Double_t)i;
  for(Int_t i=0; i<=iBin[1]; i++) binEdges[1][i]=(Double_t)kEtamin  + (kEtamax-kEtamin)/iBin[1]*(Double_t)i;
  for(Int_t i=0; i<=iBin[2]; i++) binEdges[2][i]=(Double_t)kPhimin  + (kPhimax-kPhimin)/iBin[2]*(Double_t)i;

  Int_t thnDim[2*kNvar];
  for (int k=0; k<kNvar; k++) {
    //first half  : reconstructed 
    //second half : MC
    thnDim[k]      = iBin[k];
    thnDim[k+kNvar] = iBin[k];
  }

  THnSparseF* fhnCorrelation = new THnSparseF("fhnCorrelation","THnSparse with correlations",2*kNvar,thnDim);
  for (int k=0; k<kNvar; k++) {
    fhnCorrelation->SetBinEdges(k,binEdges[k]);
    fhnCorrelation->SetBinEdges(k+kNvar,binEdges[k]);
  }
  fhnCorrelation->Sumw2();
  return  fhnCorrelation;

}

THnSparse* GetResponseMatrix(TList *fContainer) {
  THnSparse* h = (THnSparse*)fContainer->FindObject("fhnCorrelation");
  if(fDebug)Printf("Line: %d %s Entries %f",__LINE__,h->GetName(),h->GetEntries());
  if(iRebin==1)return h;
  Int_t fRebin[6];
  fRebin[0] = iRebin;
  fRebin[1] = 1;
  fRebin[2] = 1; 
  fRebin[3] = iRebin;
  fRebin[4] = 1;
  fRebin[5] = 1; 

  THnSparse* h2 = h->Rebin(fRebin);
  return h2;
}

THnSparse* CreateGuessed(const THnSparse* h) {

  // is already rebinned
  THnSparse* guessed = (THnSparse*) h->Clone();
  static int icount = 0;
  guessed->SetName(Form("%s_guess_%d",h->GetName(),icount++));
  

  return guessed;
 
}

void PrintErrors(THnSparse *h){

  for(Long_t i = 0; i< h->GetNbins();i++){
    Double_t val = h->GetBinContent(i);
    Double_t err = h->GetBinError  (i);
    if(val>0){
      Printf("%s %ld %1.3E +- %1.3E rel Error: %1.3E",h->GetName(),i,val,err,err/val);
    }
  }

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