ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <iostream>
using std::cout;
using std::endl;

#include "TRandom.h"
#include "TH1D.h"

#include "RooUnfoldResponse.h"
#include "RooUnfoldBayes.h"
//#include "RooUnfoldDagostini.h"
#include "RooUnfoldSvd.h"
//#include "RooUnfoldTUnfold.h"
#include "RooUnfoldErrors.h"
#endif

TF1 *myGaussian = new TF1("Gaussian","1/[0]/TMath::Sqrt(2*TMath::Pi())*exp(-0.5*(x/[0])**2)",-5,5);
//gaus(0) is a substitute for [0]*exp(-0.5*((x-[1])/[2])**2) and (0) means start numbering parameters at 0.
TH1F *hSim;
TH2F *resolutionFull;
TH2F *resolution;
//TClonesArray *histoarrayCopy = new TClonesArray("TH1D",200);
TClonesArray histoarray("TH1D",200);
TString *ytitle;
TH1F *GetReconstructedEt(TF1 *inputfunc, int nevents, char *name, float lowbound, float highbound, int nbins);
TH1F *GetReconstructedEt(TH1 *input, int nevents, char *name, float lowbound, float highbound, int nbins, bool smooth);
TH1F *GetTrueEt(TF1 *inputfunc, int nevents, char *name, float lowbound, float highbound, int nbins);
Float_t GetChi2(TH1F *reconstructed, TH1F *simulated);
TH1F *RestrictAxes(TH1F *old,float minEt,float maxEt);
TH2F *RestrictAxes(TH1F *old,float minEt,float maxEt);
void Smooth(TH1F *, TF1 *,bool);
//variables I had included in arguments but which are now not used
bool zerolowetbins = false;
int minbin = 4;
bool its = false;
int difftype = 0;
int niter = 3;
bool rescaleguess = false;
//For both training and testing cases the code is:
//0 = MC
//1 = reweighted MC
//2 = exponential
//3 = flat distribution
//4 = Straight line
//5 = Half Gaussian
//6 = double exponential
//7 = Levy function
//8 = Power law
//for had =
//0 = tot et
//1 = had et
//2 = pikp et
//3 = raw et
//testmean is
//the mean for an exponential
//A for a Levy function and for a power function
//testn is the input n for the Levy and Power functions
//Bool_t testFunction = kTRUE;//for checking that the input function is not crazy so I can feel out the sanity of input parameters
Bool_t testFunction = kFALSE;//for checking that the input function is not crazy so I can feel out the sanity of input parameters
void Unfoldpp(int simdataset = 2009,int recodataset = 2009, char *outputfilename = "junk", int had = 3, int trainingcase= 0,int neveUsed = 1e7,float minEt = 0.0, float maxEt = 20.0, int varymean=0, bool unfoldData = true, float testmean = 3.0,float testn = -8,bool smooth = true){

int unfoldcase = trainingcase;
myGaussian->SetParameter(0,1.0);
#ifdef __CINT__
  gSystem->Load("~/alicework/RooUnfold-1.1.1/libRooUnfold");
  //gSystem->Load("libRooUnfold");
#endif
  gStyle->SetOptTitle(0);
  gStyle->SetOptStat(0);
  gStyle->SetOptFit(0);
  char *infilename = NULL;
  char *datainfilename = NULL;
  switch(simdataset){
  case 2009://900 GeV pp
    infilename="rootFiles/LHC11b1a/Et.ESD.sim.LHC11b1a.Run118506.root";
    break;
  case 20111://2.76 TeV pp
    infilename="rootFiles/LHC11b10a/Et.ESD.sim.LHC11b10a.Run146805.root";
    break;
  case 2010://7 TeV pp
    infilename="rootFiles/LHC10e20/Et.ESD.sim.LHC10e20.Run130795.root";
    break;
  case 2012://8 TeV pp
    infilename="rootFiles/LHC12c1b/Et.ESD.sim.LHC12c1b.Run178030.root";
    break;
  case 2013://5.5 TeV pPb
    difftype = -1;
    infilename="rootFiles/LHC13b3/Et.ESD.sim.LHC13b3.Run195483.root";
    break;
  }
  switch(recodataset){
  case 2009://900 GeV pp
    datainfilename="rootFiles/LHC10c/Et.ESD.sim.LHC10c.Run118506.root";
    break;
  case 20111://2.76 TeV pp
    datainfilename="rootFiles/LHC11a/Et.ESD.sim.LHC11a.Run146805.root";
    break;
  case 2010://7 TeV pp
    datainfilename="rootFiles/LHC10e/Et.ESD.sim.LHC10e.Run130795.root";
    break;
  case 2012://8 TeV pp
    datainfilename="rootFiles/LHC12b/Et.ESD.sim.LHC12b.Run178030.root";
    break;
  case 2013://5.5 TeV pPb
    datainfilename="rootFiles/LHC13b/Et.ESD.sim.LHC13b.Run195483.root";
    break;
  }

  //================READING IN HISTOGRAMS===========================
  TFile *outfile = new TFile("junk.root","RECREATE");
  TFile *datafile = new TFile(datainfilename);
  TFile *file = new TFile(infilename);
  TList *list = file->FindObject("out2");
  char histoname[200];
  TString *hadStr;
  TString *longHadStr;
  TString *tail;
  TString *detector;
  ytitle = new TString("1/N_{eve}dN/dE_{T}");
  if(had==1){
    hadStr = new TString("Had");
    longHadStr = new TString("E_{T}^{had}");
  }
  if(had==0){
    hadStr = new TString("Tot");
    longHadStr = new TString("E_{T}^{tot}");
  }
  if(had==2){
    hadStr = new TString("PiKP");
    longHadStr = new TString("E_{T}^{#pi,K,p}");
  }
  if(had==3){
    hadStr = new TString("Raw");
    longHadStr = new TString("E_{T}^{#pi,K,p,raw}");
  }
  switch(difftype){
  case 0:
    tail = new TString("ND");//Non-diffractive
    break;
  case 1:
    tail = new TString("SD");//Singly-diffractive
    break;
  case 2:
    tail = new TString("DD");//Doubly-diffractive
    break;
  default:
    tail = new TString("");//none
  }
  if(its) detector = new TString("ITS");
  else{ detector = new TString("TPC");}
  TString *simtail = new TString("");
  if(had==3) simtail = detector;
  sprintf(histoname,"Sim%sEt%s%s",hadStr->Data(),tail->Data(),simtail->Data());
  //sprintf(histoname,"Sim%sEt",hadStr->Data());
  cout<<"Looking for "<<histoname<<endl;
  file->cd();
  hTemp = (TH1F*) out2->FindObject(histoname);
  outfile->cd();
  hSim = (TH1F*) hTemp->Clone(Form("%sCopy",histoname));

  file->cd();
  sprintf(histoname,"Reco%sEtFullAcceptanceITS%s",hadStr->Data(),tail->Data());
  cout<<"Looking for "<<histoname<<endl;
  hTemp = (TH1F*) out2->FindObject(histoname);
  outfile->cd();
  hITS = (TH1F*) hTemp->Clone(Form("%sSim",histoname));

  datafile->cd();
  sprintf(histoname,"Reco%sEtFullAcceptanceITS",hadStr->Data());
  cout<<"Looking for "<<histoname<<endl;
  hTemp = (TH1F*) out2->FindObject(histoname);
  if(unfoldData && !hTemp){ cerr<<"no histogram "<<histoname<<endl; return;}
  outfile->cd();
  hITSData = (TH1F*) hTemp->Clone(Form("%sData",histoname));

  file->cd();
  sprintf(histoname,"Reco%sEtFullAcceptanceTPC%s",hadStr->Data(),tail->Data());
  cout<<"Looking for "<<histoname<<endl;
  //sprintf(histoname,"Reco%sEtFullAcceptanceTPC",hadStr->Data());
  //cout<<"Numerator "<<histoname<<endl;
  hTemp = (TH1F*)  out2->FindObject(histoname);
  outfile->cd();
  cout<<"This histogram has "<<hTemp->GetEntries()<<" entries "<<" and a maximum of "<<hTemp->GetMaximum()<<endl;
  hTPC = (TH1F*) hTemp->Clone(Form("%sSim",histoname));


  datafile->cd();
  sprintf(histoname,"Reco%sEtFullAcceptanceTPC",hadStr->Data());
  cout<<"Looking for "<<histoname<<endl;
  hTemp = (TH1F*) out2->FindObject(histoname);
  if(unfoldData && !hTemp){ cerr<<"no histogram "<<histoname<<endl; return;}
  outfile->cd();
  hTPCData = (TH1F*) hTemp->Clone(Form("%sData",histoname));
  file->cd();


  hSim->Sumw2();
  hITS->Sumw2();
  hTPC->Sumw2();
  hITSData->Sumw2();
  hTPCData->Sumw2();
  int rebin = 1;
  //   if(had==2){
  //     //hSim->Rebin(rebin);
  //     hTPC->Rebin(rebin);
  //     hITS->Rebin(rebin);
  //   }

  outfile->cd();
  //TH1F *hITSClone = (TH1F*)hITS->Clone("hITSClone");
  file->cd();

  //Ex SimTotEtMinusRecoEtFullAcceptanceITS
  //sprintf(histoname,"Sim%sEtMinusReco%sEtFullAcceptance%s",hadStr->Data(),hadStr->Data(),detector->Data());
  sprintf(histoname,"Sim%sEtVsReco%sEtFullAcceptance%s",hadStr->Data(),hadStr->Data(),detector->Data());
  cout<<"Looking for "<<histoname<<endl;
  hTemp2 = (TH2F*)out2->FindObject(histoname);
  outfile->cd();
  resolutionFull = (TH2F*) hTemp2->Clone(Form("%sFull",histoname));
 
   resolutionFull->Rebin2D(rebin,rebin);
   hSim->Rebin(rebin);
   hITS->Rebin(rebin);
   if(hITSData) hITSData->Rebin(rebin);
   hTPC->Rebin(rebin);
   if(hTPCData) hTPCData->Rebin(rebin);
  //cout<<"Rebinning "<<rebin<<"x"<<endl;
  //float minEt = 0.000;
  //float maxEt = 100.00;
  //   hSim->GetXaxis()->SetRange(minbin,maxbin);
  //   hITS->GetXaxis()->SetRange(minbin,maxbin);
  //   hTPC->GetXaxis()->SetRange(minbin,maxbin);
  //   hITSData->GetXaxis()->SetRange(minbin,maxbin);
  //   hTPCData->GetXaxis()->SetRange(minbin,maxbin);
  //   resolution->GetXaxis()->SetRange(minbin,maxbin);
  //   resolution->GetYaxis()->SetRange(minbin,maxbin);

  //cout<<"I run from "<<hSim->GetBinLowEdge(1)<<" to "<<hSim->GetBinLowEdge(hSim->GetNbinsX()+1)<<endl;


  //cout<<"Histo "<<histoname<<endl;
  TCanvas *canvas0 = new TCanvas("canvas0","Resolution",600,600);
  canvas0->SetTopMargin(0.020979);
  canvas0->SetRightMargin(0.0184564);
  canvas0->SetLeftMargin(0.0989933);
  canvas0->SetBottomMargin(0.101399);
  canvas0->SetBorderSize(0);
  canvas0->SetFillColor(0);
  canvas0->SetFillColor(0);
  canvas0->SetBorderMode(0);
  canvas0->SetFrameFillColor(0);
  canvas0->SetFrameBorderMode(0);
//   myGaussian->Draw();
//   return;
  canvas0->SetLogz();
  //cerr<<"239"<<endl;
  if(smooth)resolutionFull->Smooth(5,"R");
  //cerr<<"241"<<endl;
  resolutionFull->Draw("colz");
  //return;
  //if(had==2)  resolution->Rebin2D(rebin,rebin);
  int nbins =  resolutionFull->GetXaxis()->GetNbins();
  if(zerolowetbins){
    for(int j=0;j<minbin;j++){//loop over bins in y=reconstructed et
      for(int i=0;i<nbins;i++){
	resolutionFull->SetBinContent(i,j,0.0);
      }
    }
  }
  for(int i=0;i<nbins;i++){//loop over bins in x
    histoarray[i]=(TH1D*)resolutionFull->ProjectionY(Form("tmp%i",i+1),i+1,i+1);
  }
  float lowrange = 0.0;
  float highrange = 100.0;
  file->cd();
  file->Close();
  outfile->cd();
  //  cerr<<"261"<<endl;
  //================FILLING TRAINING HISTOGRAMS===========================
  int neveUnused = 1e3;
  //int neveUsed = 1e7;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~EXPONENTIAL~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  //TF1 *func = new TF1("func","([0]+x*[2])/[1]*exp(-x/[1])",0,100);
  TF1 *func = new TF1("func","([0])/[1]*exp(-x/[1])",0.0,100);
  //TF1 *func = new TF1("func","([0])/[1]*exp(-x/[1])",0,100);
  func->SetParameter(0,1.0);
  func->SetParameter(0,1);
  // cerr<<"271"<<endl;
  //cerr<<" can I get the mean? "<<endl;
  //cerr<<" does histo exist?" <<hSim<<endl;
  // cerr<< hSim->GetMean()<<endl;
  //func->SetParameter(1,1.0/2.23876e-01);
  float mymean = testmean;//hSim->GetMean();
  //cerr<<"273"<<endl;
  if(unfoldData) mymean = testmean;
  // cerr<<"275"<<endl;
  func->SetParameter(1,TMath::Abs((1.0+varymean*0.3)* mymean));
  func->SetParameter(2,1);
  func->SetLineColor(4);
  //   TF1 *funcLong = new TF1("funcLong","([0]+[1]*x+[2]*x*x+[3]*x*x*x+x^[4])/[5]*exp(-(x**[6])/[5])",lowrange,highrange);
  //   funcLong->SetParameter(0,1.00467e-01);
  //   funcLong->SetParameter(1,-2.82339e-01);
  //   funcLong->SetParameter(2,-7.10366e-02);
  //   funcLong->SetParameter(3,1.22634e-02);
  //   funcLong->SetParameter(4,9.25757e-01);
  //   funcLong->SetParameter(5,6.77688e-01);
  //   funcLong->SetParameter(6,6.30298e-01);
  int nevents = neveUnused;//1e7;
  //cerr<<"287"<<endl;
  if(trainingcase==2 || unfoldcase==2) nevents = neveUsed;
  float lowbound = hITS->GetXaxis()->GetBinLowEdge(1);
  float highbound = hITS->GetXaxis()->GetBinLowEdge(nbins+1);
  // cerr<<"289"<<endl;
  cout<<"Maxing histograms with ranges "<<lowbound<<" - "<<highbound<<endl;
  TH1F *hSimExponential = GetTrueEt(func,nevents,Form("testtrue%i",i),lowbound,highbound,hITS->GetNbinsX());
  TH1F *hMeasuredExponential = GetReconstructedEt(func,nevents,Form("testsmeared%i",i),lowbound,highbound,hITS->GetNbinsX(),smooth);

  // cerr<<"293"<<endl;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~FLAT~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  TF1 *funcFlat = new TF1("funcFlat","[0]",0,100);
  funcFlat->FixParameter(0,0.01);
  nevents = neveUnused;//1e7;
  if(trainingcase==3 || unfoldcase==3) nevents = neveUsed;
  TH1F *hSimFlat = GetTrueEt(funcFlat,nevents,Form("testtrueflat%i",i),lowbound,highbound,hITS->GetNbinsX());
  TH1F *hMeasuredFlat = GetReconstructedEt(funcFlat,nevents,Form("testsmearedflat%i",i),lowbound,highbound,hITS->GetNbinsX(),smooth);

  //cerr<<"302"<<endl;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~STRAIGHT LINE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  TF1 *funcStraight = new TF1("funcStraight","[0]-[1]*x",0.0,maxEt*2);
  funcStraight->FixParameter(0,1.0);
  funcStraight->FixParameter(1,0.01);
  nevents = neveUnused;//1e7;
  if(trainingcase==4 || unfoldcase==4) nevents = neveUsed;
  TH1F *hSimStraight = GetTrueEt(funcStraight,nevents,Form("testtruestraight%i",i),lowbound,highbound,hITS->GetNbinsX());
  TH1F *hMeasuredStraight = GetReconstructedEt(funcStraight,nevents,Form("testsmearedstraight%i",i),lowbound,highbound,hITS->GetNbinsX(),smooth);


  //cerr<<"313"<<endl;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~GAUS LINE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  TF1 *funcGaus = new TF1("funcGaus","[0]*exp(-x*x/[1]/[1]/TMath::Pi())",0.0,maxEt*2);//[1] is the mean x
  funcGaus->FixParameter(0,1.0);
  funcGaus->FixParameter(1,15);
  nevents = neveUnused;//1e7;
  if(trainingcase==5 || unfoldcase==5) nevents = neveUsed;
  TH1F *hSimGaus = GetTrueEt(funcGaus,nevents,Form("testtruegaus%i",i),lowbound,highbound,hITS->GetNbinsX());
  TH1F *hMeasuredGaus = GetReconstructedEt(funcGaus,nevents,Form("testsmearedgaus%i",i),lowbound,highbound,hITS->GetNbinsX(),smooth);

  //cerr<<"323"<<endl;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~DOUBLE EXPONENT LINE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  TF1 *funcDoubleExponential = new TF1("funcDoubleExponential","[0]/[1]*exp(-x/[1])+[2]/[3]*exp(-x/[3])",0.0,maxEt*2);
  //TF1 *funcDoubleExponential = new TF1("funcDoubleExponential","[0]/[1]*exp(-x/[1])",0,100);
  funcDoubleExponential->SetParameter(0,1.0);
  funcDoubleExponential->SetParameter(1,testmean);
  funcDoubleExponential->FixParameter(2,0.1);
  funcDoubleExponential->FixParameter(3,1.0);
  funcDoubleExponential->SetLineColor(5);
  nevents = neveUnused;//1e7;
  if(trainingcase==6 || unfoldcase==6) nevents = neveUsed;
  TH1F *hSimDoubleExponential = GetTrueEt(funcDoubleExponential,nevents,Form("testtruedoubleexponent%i",i),lowbound,highbound,hITS->GetNbinsX());
  TH1F *hMeasuredDoubleExponential = GetReconstructedEt(funcDoubleExponential,nevents,Form("testsmeareddoubleexponent%i",i),lowbound,highbound,hITS->GetNbinsX(),smooth);


  // cerr<<"388"<<endl;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~TRUE SIMULATED~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  //trying to make something which is not identical to hTPC/hITS
  //if(trainingcase==0 || unfoldcase==0) nevents = neveUsed;
  //TH1F *hMeasuredSimMCSmeared =  GetReconstructedEt(hSim,nevents,Form("testtruemcsmeared%i",i),lowbound,highbound,hITS->GetNbinsX());
  if(trainingcase==0 || unfoldcase==0) TH1F *hMeasuredSimMCSmeared =  hTPC;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~REWEIGHTED SIMULATED~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  TH1F *hSimReweighted = (TH1F*) hSim->Clone("hSimReweighted");
  TF1 *fWeight = new TF1("fWeight","1-[0]*([1]-x)+[2]*([3]-x)**2",0.0,2.0*maxEt);
  fWeight->SetParameter(0,0);
  fWeight->SetParameter(1,3);
  fWeight->SetParameter(2,0);
  fWeight->SetParameter(3,3);
  hSimReweighted->Divide(fWeight);
  nevents = neveUnused;//1e7;
  if(trainingcase==1 || unfoldcase==1) nevents = neveUsed;
  TH1F *hMeasReweighted =  GetReconstructedEt(hSimReweighted,nevents,Form("testreweighted%i",i),lowbound,highbound,hITS->GetNbinsX());
  //float chi2 = GetChi2(hITS,test);

  //cerr<<"357"<<endl;

  //~~~~~~~~~~~~~~~~~~~~~~~~~~~LEVY~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  TF1 *funcLevy = new TF1("funcLevy","[0]*x*(1+x/[1])**[2]",0,100);
  //TF1 *funcLevy = new TF1("funcLevy","[0]*x*([1]+x+[3]*x*x)**[2]",0,100);
  funcLevy->SetParameter(0,1.0);
  float n = testn;//-4;
  float A = 2;//- (1.0+varymean*0.3)* mymean *(n+3)/(n*n-4*n+5)*50;
  //cout<<"Mean "<<mymean<<" A "<<A<<" n "<<n<<endl;
  //funcLevy->SetParameter(1,(1.0+varymean*0.3)* mymean);
  funcLevy->SetParameter(1,-mymean*(testn+3)/2);
  //funcLevy->SetParameter(1,A);
  //funcLevy->SetParameter(1,1.0);
  //funcLevy->SetParameter(2,-5.96110e+00);
  funcLevy->SetParameter(2,n);
  //funcLevy->SetParameter(3,1e-1);
  nevents = neveUnused;//1e7;
  if(trainingcase==7 || unfoldcase==7) nevents = neveUsed;
  //   hSim->Fit(funcLevy,"","",1,100);
  //return;
  TH1F *hSimLevy = GetTrueEt(funcLevy,nevents,Form("testtruelevy%i",i),lowbound,highbound,hITS->GetNbinsX());
  TH1F *hMeasuredLevy = GetReconstructedEt(funcLevy,nevents,Form("testsmearedlevy%i",i),lowbound,highbound,hITS->GetNbinsX(),smooth);

  // cerr<<"379"<<endl;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~POWER~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  TF1 *funcPower = new TF1("funcPower","[0]*(1+x/[1])**[2]",0,100);
  funcPower->SetParameter(0,1.0);
  float n = testn;//-100;
  funcPower->SetParameter(1,-mymean*(testn+2));
  //funcPower->SetParameter(1,(1.0+varymean*0.3)* mymean*(-n+2));
  funcPower->SetParameter(2,n);
  nevents = neveUnused;//1e7;
  //cout<<"effective scale for power function "<<funcPower->GetParameter(1)<<endl;
  if(trainingcase==8 || unfoldcase==8) nevents = neveUsed;
  //   hSim->Fit(funcLevy,"","",1,100);
  //   return;
  TH1F *hSimPower = GetTrueEt(funcPower,nevents,Form("testtruepower%i",i),lowbound,highbound,hITS->GetNbinsX());
  //cerr<<__FILE__<<" "<<__LINE__<<endl;
  TH1F *hMeasuredPower = GetReconstructedEt(funcPower,nevents,Form("testsmearedpower%i",i),lowbound,highbound,hITS->GetNbinsX(),smooth);
  // cerr<<__FILE__<<" "<<__LINE__<<endl;

  //================TRAINING===========================
  //  RooUnfoldResponse (const TH1* measured, const TH1* truth, const TH2* response, const char* name= 0, const char* title= 0);  // create from already-filled histograms
  TH1F *hTrainingTruth;
  TH1F *hTrainingReconstructed;
  switch(trainingcase){
  case 0:
    cout<<"Training with pure MC"<<endl;
    hTrainingTruth = hSim;
    hTrainingReconstructed = hMeasuredSimMCSmeared;
    cout<<"Training reconstructed is "<<hMeasuredSimMCSmeared->GetName()<<" entries "<<hMeasuredSimMCSmeared->GetEntries()<<" max "<<hMeasuredSimMCSmeared->GetMaximum()<<endl;
    //     if(its) hTrainingReconstructed = hITS;
    //     else{hTrainingReconstructed = hTPC;}
    break;
  case 1:
    cout<<"Training with reweighted MC"<<endl;
    hTrainingTruth = hSimReweighted;
    hTrainingReconstructed = hMeasReweighted;
    break;
  case 2:
    cout<<"Training with exponential"<<endl;
    hTrainingTruth = hSimExponential;
    hTrainingReconstructed = hMeasuredExponential;
    break;
  case 3:
    cout<<"Training with flat distribution"<<endl;
    hTrainingTruth = hSimFlat       ;
    hTrainingReconstructed = hMeasuredFlat       ;
    break;
  case 4:
    cout<<"Training with straight line distribution"<<endl;
    hTrainingTruth = hSimStraight       ;
    hTrainingReconstructed = hMeasuredStraight    ;
    break;
  case 5:
    cout<<"Training with half Gaussian distribution"<<endl;
    hTrainingTruth = hSimGaus       ;
    hTrainingReconstructed = hMeasuredGaus    ;
    break;
  case 6:
    cout<<"Training with double exponential"<<endl;
    hTrainingTruth = hSimDoubleExponential;
    hTrainingReconstructed = hMeasuredDoubleExponential;
    break;
  case 7:
    cout<<"Training with Levy distribution"<<endl;
    hTrainingTruth = hSimLevy       ;
    hTrainingReconstructed = hMeasuredLevy       ;
    break;
  case 8:
    cout<<"Training with Power law distribution"<<endl;
    hTrainingTruth = hSimPower       ;
    hTrainingReconstructed = hMeasuredPower       ;
    break;
  }
  cout<<"nbins sim "<<hSim->GetNbinsX()<<" data "<<hITS->GetNbinsX()<<" training truth "<<hTrainingTruth->GetNbinsX()<<" training reconstructed "<<hTrainingReconstructed->GetNbinsX()<<endl;
  cout<<"max sim "<<hSim->GetBinLowEdge(401)<<" data "<<hITS->GetBinLowEdge(401)<<" training truth "<<hTrainingTruth->GetBinLowEdge(401)<<" training reconstructed "<<hTrainingReconstructed->GetBinLowEdge(401)<<endl;
  cout<<"min sim "<<hSim->GetBinLowEdge(1)<<" data "<<hITS->GetBinLowEdge(1)<<" training truth "<<hTrainingTruth->GetBinLowEdge(1)<<" training reconstructed "<<hTrainingReconstructed->GetBinLowEdge(1)<<endl;
  //return;
  hSim = RestrictAxes(hSim,minEt,maxEt);
  hITS = RestrictAxes(hITS,minEt,maxEt);
  hTPC = RestrictAxes(hTPC,minEt,maxEt);
  hITSData = RestrictAxes(hITSData,minEt,maxEt);
  hTPCData = RestrictAxes(hTPCData,minEt,maxEt);
  resolution = RestrictAxes(resolutionFull,minEt,maxEt);
  hTrainingReconstructed = RestrictAxes(hTrainingReconstructed,minEt,maxEt);
  hTrainingTruth = RestrictAxes(hTrainingTruth,minEt,maxEt);
//   if(rescaleguess && unfoldData){
//     cout<<"Rescaling the guess by MC reconstructed/data reconstructed"<<endl;
//     TH1F *hScale = hTrainingReconstructed->Clone("hScale");
//     if(its) hScale->Divide(hITSData);
//     else{hScale->Divide(hTPCData);}
//     //hTrainingReconstructed is now ~MC/data
//     //TH1F *hTrainingTruthCopy = (TH1F*)hTrainingTruth->Clone("hTrainingTruthCopy");
//     hTrainingTruth->Divide(hScale);//This is now MC/(MC/data) and in principle is the best guess at data?
//     //hTrainingTruth->Add(hTrainingTruthCopy);
//     float scale = hTrainingTruth->Integral();
//     cout<<"Integral "<<scale<<endl;
//     hTrainingTruth->Scale(1.0/scale);

//     hTrainingReconstructed = GetReconstructedEt(hTrainingTruth,nevents,Form("testMCreweightedbydata%i",i),lowbound,highbound,hITS->GetNbinsX());
//   }

  RooUnfoldResponse response(hTrainingReconstructed,hTrainingTruth,resolution,"UnfoldResponseFromHistograms","MyRooUnfoldResponse");
  //RooUnfoldResponse response(hTPC,hSimReweighted,resolution,"UnfoldResponseFromHistograms","MyRooUnfoldResponse");
  //RooUnfoldResponse response(hSmeared,hTrue,resolution,"UnfoldResponseFromHistograms","MyRooUnfoldResponse");

  //================NORMALIZING===========================
  //cout<<"Normalizing..."<<endl;

  Float_t binwidth = hSim->GetBinWidth(1);
  Float_t neve = hSim->GetEntries();
  if(neve<=1e-5){
    cerr<<"Warning!! simulation histo not filled!  Stopping!"<<endl;
    return;
  }
  if(binwidth<=1e-5){
    cerr<<"Warning!! binwidth!  Stopping!"<<endl;
    return;
  }
  //true MC
  hSim->Scale(1.0/neve/binwidth);
  hSim->Scale(1.0/hSim->Integral());
  neve = hTPC->GetEntries();
  if(neve<=1e-5){
    cerr<<"Warning!! Histo not filled!  Stopping!"<<endl;
    return;
  }
  hTPC->Scale(1.0/neve/binwidth);
  neve = hITS->GetEntries();
  hITS->Scale(1.0/neve/binwidth);
  //Reweighted MC
  neve = hMeasReweighted->GetEntries();
  hMeasReweighted->Scale(1.0/neve/binwidth);
  neve = hSimReweighted->GetEntries();
  hSimReweighted->Scale(1.0/neve/binwidth);
  //Exponential MC
  neve = hMeasuredExponential->GetEntries();
  hMeasuredExponential->Scale(1.0/neve/binwidth);
  neve = hSimExponential->GetEntries();
  hSimExponential->Scale(1.0/neve/binwidth);
  //Flat MC
  neve = hMeasuredFlat->GetEntries();
  hMeasuredFlat->Scale(1.0/neve/binwidth);
  neve = hSimFlat->GetEntries();
  hSimFlat->Scale(1.0/neve/binwidth);
  //Straight MC
  neve = hMeasuredStraight->GetEntries();
  hMeasuredStraight->Scale(1.0/neve/binwidth);
  neve = hSimStraight->GetEntries();
  hSimStraight->Scale(1.0/neve/binwidth);
  //Gaus MC
  neve = hMeasuredGaus->GetEntries();
  hMeasuredGaus->Scale(1.0/neve/binwidth);
  neve = hSimGaus->GetEntries();
  hSimGaus->Scale(1.0/neve/binwidth);
  //DoubleExponential MC
  neve = hMeasuredDoubleExponential->GetEntries();
  hMeasuredDoubleExponential->Scale(1.0/neve/binwidth);
  neve = hSimDoubleExponential->GetEntries();
  hSimDoubleExponential->Scale(1.0/neve/binwidth);
  //Levy MC
  neve = hMeasuredLevy->GetEntries();
  hMeasuredLevy->Scale(1.0/neve/binwidth);
  neve = hSimLevy->GetEntries();
  hSimLevy->Scale(1.0/neve/binwidth);
  if(hITSData){
    neve = hITSData->GetEntries();
    hITSData->Scale(1.0/neve/binwidth);
    hITSData->Scale(1.0/hITSData->Integral());
  }
  if(hITSData){
    neve = hTPCData->GetEntries();
    hTPCData->Scale(1.0/neve/binwidth);
  }
  if(rescaleguess){
    neve = hTrainingReconstructed->GetEntries();
    hTrainingReconstructed->Scale(1.0/neve/binwidth);
    hTPCData->Scale(1.0/hTPCData->Integral());
  }

  //TF1 *funcScale = new TF1("func","([0])/[1]*exp(-x/[1])",0,100);
//   cout<<"integrals plain "<<hSim->Integral("width")<<" "<<hITS->Integral("width")<<" "<<hTPC->Integral("width")<<endl;
//   cout<<"integrals plain "<<hSimReweighted->Integral("width")<<" "<<hMeasReweighted->Integral("width")<<endl;
//   cout<<"integrals plain "<<hSimExponential->Integral("width")<<" "<<hMeasuredExponential->Integral("width")<<endl;
//   cout<<"integrals plain "<<hSimFlat->Integral("width")<<" "<<hMeasuredFlat->Integral("width")<<endl;
//   cout<<"integrals plain "<<hSimStraight->Integral("width")<<" "<<hMeasuredStraight->Integral("width")<<endl;
//   cout<<"integrals plain "<<hSimGaus->Integral("width")<<" "<<hMeasuredGaus->Integral("width")<<endl;
//   cout<<"integrals plain "<<hSimDoubleExponential->Integral("width")<<" "<<hMeasuredDoubleExponential->Integral("width")<<endl;
  //================SETTING TEST CASE========================

  TH1F *hTruth;
  TH1F *hMeasured;
  switch(unfoldcase){
  case 0:
    cout<<"Test case is pure MC"<<endl;
    hTruth = hSim;
    if(its) hMeasured = hITS;
    else{hMeasured = hTPC;}
    break;
  case 1:
    cout<<"Test case is a reweighted MC"<<endl;
    hTruth = hSimReweighted;
    hMeasured = hMeasReweighted;
    break;
  case 2:
    cout<<"Test case is a exponential"<<endl;
    hTruth = hSimExponential;
    hMeasured = hMeasuredExponential;
    break;
  case 3:
    cout<<"Test case is a flat distribution"<<endl;
    hTruth = hSimFlat       ;
    hMeasured = hMeasuredFlat       ;
    break;
  case 4:
    cout<<"Test case is a straight line distribution"<<endl;
    hTruth = hSimStraight       ;
    hMeasured = hMeasuredStraight    ;
    break;
  case 5:
    cout<<"Test case is a half Gaussian distribution"<<endl;
    hTruth = hSimGaus       ;
    hMeasured = hMeasuredGaus    ;
    break;
  case 6:
    cout<<"Test case is a double exponential"<<endl;
    hTruth = hSimDoubleExponential;
    hMeasured = hMeasuredDoubleExponential;
    break;
  case 7:
    cout<<"Test case is a Levy distribution"<<endl;
    hTruth = hSimLevy       ;
    hMeasured = hMeasuredLevy       ;
    break;
  case 8:
    cout<<"Test case is a Power law"<<endl;
    hTruth = hSimPower       ;
    hMeasured = hMeasuredPower       ;
    break;
  }
  if(unfoldData){
    if(its) hMeasured = hITSData;
    else{hMeasured = hTPCData;}
  }
  cout<<"MC truth: "<<hTruth->GetMean()<<" Mean observed "<<hMeasured->GetMean()<<endl;
  hTruth->GetXaxis()->SetTitle(hSim->GetTitle());
  hMeasured->GetXaxis()->SetTitle(hSim->GetTitle());




  //cout<<"Histo "<<histoname<<endl;
  TCanvas *canvasn1 = new TCanvas("canvasn1","Training reconstructed vs data reconstructed",600,600);
  canvasn1->SetTopMargin(0.020979);
  canvasn1->SetRightMargin(0.0184564);
  canvasn1->SetLeftMargin(0.0989933);
  canvasn1->SetBottomMargin(0.101399);
  canvasn1->SetBorderSize(0);
  canvasn1->SetFillColor(0);
  canvasn1->SetFillColor(0);
  canvasn1->SetBorderMode(0);
  canvasn1->SetFrameFillColor(0);
  canvasn1->SetFrameBorderMode(0);
  //canvasn1->Divide(2);
  canvasn1->SetLogy();
  hMeasured->SetMarkerStyle(22);
  hTrainingReconstructed->SetMarkerStyle(26);
  hTrainingReconstructed->SetMarkerColor(2);
  hTrainingReconstructed->SetLineColor(2);
  cout<<"Measured histo is "<<hMeasured->GetName()<<" has entries "<<hMeasured->GetEntries()<<" max "<<hMeasured->GetMaximum()<<endl;
  hMeasured->Draw();
  cout<<"Reconstructed histo is "<<hTrainingReconstructed->GetName()<<" has entries "<<hTrainingReconstructed->GetEntries()<<" max "<<hTrainingReconstructed->GetMaximum()<<endl;
  hTrainingReconstructed->Draw("same");
  TLegend *legendn1 = new TLegend(0.437919,0.800699,0.966443,0.958042);
  legendn1->AddEntry(hMeasured,"Measured");
  legendn1->AddEntry(hTrainingReconstructed,"Simulated reconstructed");
  legendn1->Draw();
  //cout<<"Reconstructed mean "<<hMeasured->GetMean()<<" Simulated reconstructed mean "<<hTrainingReconstructed->GetMean()<<endl;
  //return;
  float matchval = 1.0;
  if(unfoldData){
    int binsim = hTrainingReconstructed->FindBin(matchval+.01);
    float simval = hTrainingReconstructed->GetBinContent(binsim);
    //cerr<<__FILE__<<" "<<__LINE__<<endl;
    int binreco = hMeasured->FindBin(matchval+0.01);
    float recoval = hMeasured->GetBinContent(binreco);
    cout<<"matching at "<<matchval<<" simval "<<simval<<" recoval "<<recoval<<" bins "<<binsim<<" "<<binreco<<endl;
    if(recoval>0.0) hMeasured->Scale(simval/recoval);
    else{cerr<<"Uh-oh!  Can't rescale.  :("<<endl;}
  }
  //return;
  //   for(int i=1;i<=hMeasured->GetNbinsX();i++){
  //     cout<<hMeasured->GetBinContent(i);
  //     if(i!=hMeasured->GetNbinsX())cout<<", ";
  //   }
  //   cout<<endl;
  //hMeasured->Fit(funcPower,"N","",1,100);
  //funcLevy->Draw("same");
  //hMeasured->Fit(funcLevy,"","",1,100);
  //return;
  //return;
//   if(simdataset==2009){
//     cout<<"NOT doing full unfolding because this is 2009.  Exiting."<<endl;
//     cout<<"Mean is "<<hTruth->GetMean()<<" ";
//     GetChi2(hMeasured,hTrainingReconstructed);
//     canvasn1->SaveAs(Form("%s%s.C",outputfilename,"RecoVSSimReco"));
//     cout<<"Saving "<<Form("%s%s.C",outputfilename,"RecoVSSimReco")<<endl;
//     return;
//   }
  if(testFunction) return;
  //================UNFOLDING===========================
  if(zerolowetbins){
    for(int i=0;i<minbin;i++){
      hMeasured->SetBinContent(i,0.0);
    }
  }
  RooUnfoldBayes   unfold (&response, hMeasured, niter);    // OR
  unfold.SetSmoothing(true);

  //================PLOTTING===========================


  TH1D* hReco1= (TH1D*) unfold.Hreco();
  //cout<<"MEAN WITHOUT ANY MASSAGING "<<hReco1->GetMean()<<endl;

  TCanvas *canvas7 = new TCanvas("canvas7","Reconstructed Unfolded E_{T}",600,600);
  canvas7->SetTopMargin(0.020979);
  canvas7->SetRightMargin(0.0184564);
  canvas7->SetLeftMargin(0.0989933);
  canvas7->SetBottomMargin(0.101399);
  canvas7->SetBorderSize(0);
  canvas7->SetFillColor(0);
  canvas7->SetFillColor(0);
  canvas7->SetBorderMode(0);
  canvas7->SetFrameFillColor(0);
  canvas7->SetFrameBorderMode(0);
  canvas7->SetLogy();
  hReco1->Draw();

  TCanvas *canvas1 = new TCanvas("canvas1","Results with fits",600,600);
  canvas1->SetTopMargin(0.020979);
  canvas1->SetRightMargin(0.0184564);
  canvas1->SetLeftMargin(0.0989933);
  canvas1->SetBottomMargin(0.101399);
  canvas1->SetBorderSize(0);
  canvas1->SetFillColor(0);
  canvas1->SetFillColor(0);
  canvas1->SetBorderMode(0);
  canvas1->SetFrameFillColor(0);
  canvas1->SetFrameBorderMode(0);
  //canvas1->Divide(2);
  canvas1->SetLogy();

  //rescale just in case
  //   float myscale = hTruth->Integral("width") / hReco1->Integral("width");
  //   cout<<"Rescaling result by "<<myscale<<endl;
  //   hReco1->Scale(myscale);
  hReco1->Fit(func,"NI","",0.0,1.0);
  funcDoubleExponential->SetParameter(1,func->GetParameter(1));
  hReco1->Fit(funcDoubleExponential,"NI","",0.0,1.0);
  float xgoal1 = 1.0;
  float xgoal2 = 0.01;
  if(recodataset ==2010){
    float xgoal1 = 1.0;
    float xgoal2 = 2.0;
  }
  float x1 = hReco1->GetBinCenter(hReco1->FindBin(xgoal1));
  float y1 = hReco1->GetBinContent(hReco1->FindBin(xgoal1));
  float x2 = hReco1->GetBinCenter(hReco1->FindBin(xgoal2));
  float y2 = hReco1->GetBinContent(hReco1->FindBin(xgoal2));
//   float x2 = hReco1->GetBinCenter(1);
//   float y2 = hReco1->GetBinContent(1);
  float myb = -TMath::Log(y1/y2)/(x1-x2);
  float myA = y1/myb/exp(-myb*x1);
  func->SetParameter(0,myA);
  func->SetParameter(1,1.0/myb);
  //cout<<"x1 "<<x1<<" y1 "<<y1<<" x2 "<<x2<<" y2 "<<y2<<" b "<<1/myb<<" A "<<myA/myb<<endl;


  hTruth->SetMarkerStyle(22);
  hReco1->SetMarkerStyle(30);
  hReco1->SetLineColor(2);
  hReco1->SetMarkerColor(2);
  hITS->SetMarkerColor(3);
  hITS->SetLineColor(3);
  hTPC->SetMarkerColor(7);
  hTPC->SetLineColor(7);
  //hTruth->GetXaxis()->SetRange(0,hTruth->FindBin(10.0));
  hReco1->Draw();
  if(!unfoldData) hTruth->Draw("same");
  //hITS->Draw("same");
  //hTPC->Draw("same");
  func->Draw("same");
  funcDoubleExponential->Draw("same");
  hTruth->GetXaxis()->SetRange(0,hTruth->GetNbinsX());
  //cout<<" Means "<<hTruth->GetMean()<<" "<<hReco1->GetMean()<<endl;
//   hTruth->GetXaxis()->SetRange(hTruth->FindBin(1.),hTruth->GetNbinsX());
//   hReco1->GetXaxis()->SetRange(hTruth->FindBin(1.),hReco1->GetNbinsX());
  hTruth->GetXaxis()->SetRange(0,hTruth->FindBin(20.));
  hReco1->GetXaxis()->SetRange(0,hTruth->FindBin(20.));
  //cout<<" Truncated Means "<<hTruth->GetMean()<<" "<<hReco1->GetMean()<<endl;
  hTruth->GetXaxis()->SetRange(0,hTruth->GetNbinsX());
  hReco1->GetXaxis()->SetRange(0,hReco1->GetNbinsX());

  TLegend *leg = new TLegend(0.505034,0.744755,0.605705,0.952797);
  leg->SetFillStyle(0);
  leg->SetFillColor(0);
  leg->SetBorderSize(0);
  //leg->AddEntry(hSim,"Simulated E_{T}");
  leg->AddEntry(hReco1,"Unfolded result");
  leg->AddEntry(func,"Exponential");
  leg->AddEntry(funcDoubleExponential,"Double exponential");
  hSim->SetLineColor(1);
  hSim->GetYaxis()->SetTitleOffset(1.3);
  hSim->GetYaxis()->SetTitle("1/N_{eve} dN/dE_{T}");
  leg->SetTextSize(0.0437063);
  leg->Draw();
  // canvas1->SaveAs(Form("%s%s.png",outputfilename,"Extrap"));
  //canvas1->SaveAs(Form("%s%s.eps",outputfilename,"Extrap"));
  //canvas1->SaveAs(Form("%s%s.C",outputfilename,"Extrap"));
  //canvas1->cd(2);
  TCanvas *canvas6 = new TCanvas("canvas6","Unfolded data/simulated MC truth",600,600);
  canvas6->SetTopMargin(0.020979);
  canvas6->SetRightMargin(0.0184564);
  canvas6->SetLeftMargin(0.0989933);
  canvas6->SetBottomMargin(0.101399);
  canvas6->SetBorderSize(0);
  canvas6->SetFillColor(0);
  canvas6->SetFillColor(0);
  canvas6->SetBorderMode(0);
  canvas6->SetFrameFillColor(0);
  canvas6->SetFrameBorderMode(0);

  TH1D *hReco1Clone = (TH1D*) hReco1->Clone("hReco1Clone");
  if(unfoldData){
    int binsim = hTruth->FindBin(matchval+.01);
    float simval = hTruth->GetBinContent(binsim);
    //cerr<<__FILE__<<" "<<__LINE__<<endl;
    int binreco = hReco1Clone->FindBin(matchval+0.01);
    float recoval = hReco1Clone->GetBinContent(binreco);
    cout<<"matching at "<<matchval<<" simval "<<simval<<" recoval "<<recoval<<" bins "<<binsim<<" "<<binreco<<endl;
    if(recoval>0.0) hReco1Clone->Scale(simval/recoval);
  }
  hReco1Clone->Divide(hTruth);
  hReco1Clone->Draw("");
  hReco1Clone->GetYaxis()->SetTitle("N_{eve}^{reco}/N_{eve}^{true}");
  hReco1Clone->GetXaxis()->SetTitle("E_{T}");
  hReco1Clone->SetMinimum(0.0);
  hReco1Clone->SetMaximum(2.0);
  hReco1Clone->GetXaxis()->SetRange(1,hReco1Clone->FindBin(maxEt));
  //   canvas1->cd(3);

  //   hReco1->Draw("");
  //cout<<"Bin 1: true :"<< hSim->GetBinContent(1)<<"+/-"<<hSim->GetBinError(1)<<" reco:"<<hReco1->GetBinContent(1)<<"+/-"<<hSim->GetBinError(1)<<endl;

  //  unfold.PrintTable(cout,hSim);

  if(trainingcase==1 || unfoldcase==1){
    TCanvas *canvas2 = new TCanvas("WeightingFunction","WeightingFunction",600,600);
    canvas2->SetTopMargin(0.020979);
    canvas2->SetRightMargin(0.0184564);
    canvas2->SetLeftMargin(0.0989933);
    canvas2->SetBottomMargin(0.101399);
    canvas2->SetBorderSize(0);
    canvas2->SetFillColor(0);
    canvas2->SetFillColor(0);
    canvas2->SetBorderMode(0);
    canvas2->SetFrameFillColor(0);
    canvas2->SetFrameBorderMode(0);
    fWeight->Draw();
  }
  //   TCanvas *canvas3 = new TCanvas("canvas3","canvas3",1200,600);
  //   canvas3->SetTopMargin(0.020979);
  //   canvas3->SetRightMargin(0.0184564);
  //   canvas3->SetLeftMargin(0.0989933);
  //   canvas3->SetBottomMargin(0.101399);
  //   canvas3->SetBorderSize(0);
  //   canvas3->SetFillColor(0);
  //   canvas3->SetFillColor(0);
  //   canvas3->SetBorderMode(0);
  //   canvas3->SetFrameFillColor(0);
  //   canvas3->SetFrameBorderMode(0);
  //   hReco1->Draw();
//   TCanvas *canvas4 = new TCanvas("canvas4","canvas4",1200,600);
//   canvas4->SetTopMargin(0.020979);
//   canvas4->SetRightMargin(0.0184564);
//   canvas4->SetLeftMargin(0.0989933);
//   canvas4->SetBottomMargin(0.101399);
//   canvas4->SetBorderSize(0);
//   canvas4->SetFillColor(0);
//   canvas4->SetFillColor(0);
//   canvas4->SetBorderMode(0);
//   canvas4->SetFrameFillColor(0);
//   canvas4->SetFrameBorderMode(0);
//   hTrainingReconstructed->Draw();
//   hTrainingTruth->Draw("same");
//   hTrainingTruth->SetLineColor(1);
//   hTrainingReconstructed->SetLineColor(2);


  //   TCanvas *canvas5 = new TCanvas("canvas5","canvas5",1200,600);
  //   canvas5->SetTopMargin(0.020979);
  //   canvas5->SetRightMargin(0.0184564);
  //   canvas5->SetLeftMargin(0.0989933);
  //   canvas5->SetBottomMargin(0.101399);
  //   canvas5->SetBorderSize(0);
  //   canvas5->SetFillColor(0);
  //   canvas5->SetFillColor(0);
  //   canvas5->SetBorderMode(0);
  //   canvas5->SetFrameFillColor(0);
  //   canvas5->SetFrameBorderMode(0);

  //Calculating mean/mean error with covariant matrix
  float cutoffLow = hReco1->GetBinLowEdge(hReco1->FindBin(1.0+0.01));
  float cutoffHigh = hReco1->GetBinLowEdge(hReco1->FindBin(30+0.01));
  if(had==1) cutoffHigh = hReco1->GetBinLowEdge(hReco1->FindBin(20+0.01));
  int cutoffbin = hReco1->FindBin(1.01);//Get the bin at 1 GeV, with a little wiggle room to be sure it returns the bin I mean
  int cutoffbinHigh = hReco1->FindBin(30.01);//Get the bin at 1 GeV, with a little wiggle room to be sure it returns the bin I mean
  if(had==1) cutoffbinHigh = hReco1->FindBin(20.01);//Get the bin at 1 GeV, with a little wiggle room to be sure it returns the bin I mean  
  if(had==2) cutoffbinHigh = hReco1->FindBin(17.01);//Get the bin at 1 GeV, with a little wiggle room to be sure it returns the bin I mean
  int nbins = hReco1->GetNbinsX();
  TMatrixD cov = unfold.Ereco();
  TVectorD result = unfold.Vreco();
  TVectorD resultError = unfold.ErecoV();
  //   TMatrixD cov = unfold.GetMeasuredCov();
  //   TVectorD result = unfold.Vmeasured();
  //   TVectorD resultError = unfold.Emeasured();
  float cutoff = hReco1->GetBinLowEdge(cutoffbin);
  float binwidth = hReco1->GetBinWidth(1);
  float mean = 0;
  float meanerr = 0;//this is actually the error squared but I'm just trying a different way of calculating it
  float meanvar = 0;
  float total = 0;
  //truncated values
  float meantrunc = 0;
  float meanerrtrunc = 0;//this is actually the error squared but I'm just trying a different way of calculating it
  float meanvartrunc = 0;
  float totaltrunc = 0;
  for(int i=0;i<cutoffbinHigh;i++){
    total += result(i)*binwidth;
    float energyi = hReco1->GetBinCenter(i+1);
    mean += result(i)*binwidth*energyi;
    meanerr += resultError(i)*resultError(i)*binwidth*energyi*binwidth*energyi;
    if(i>=cutoffbin){
      totaltrunc += result(i)*binwidth;
      meantrunc += result(i)*binwidth*energyi;
      meanerrtrunc += resultError(i)*resultError(i)*binwidth*energyi*binwidth*energyi;
    }
    for(int j=0;j<nbins;j++){
      float energyj = hReco1->GetBinCenter(j+1);
      meanvar += energyi*binwidth  *  energyj*binwidth  * cov(i,j);
      if(i>=cutoffbin && j>=cutoffbin){
	meanvartrunc += energyi*binwidth  *  energyj*binwidth  * cov(i,j);
      }
      //       if(i==j && i<40 && j<40 && cov(i,j)>0.0){
      // 	cout<<"i "<<i<<" bin center "<<hReco1->GetBinCenter(i+1)<<" j "<<j<<" cov "<<cov(i,j)<<" err "<< result(i)*binwidth*energyi  *  result(j)*binwidth*energyj  * cov(i,j);
      // 	if(i==j) cout<<" error "<<resultError(i)<<" rel. err "<< resultError(i)/result(i)*100.0<<"%";
      // 	cout<< endl;
      //       }
    }
    //     cout<<"i "<<i;
    //     cout<<" result "<<result(i);
    //     cout<<" +/- "<<resultError(i);
    //     cout<<endl;
  }
  cout<<"Mean "<<mean<<" total "<<total<<" mean err ";
  if(meanvar>0) cout<<TMath::Sqrt(meanvar);
  cout<<" or ";
  if(meanerr>0)cout<<TMath::Sqrt(meanerr);
  cout<<endl;
  cout<<"Mean trunc";
  if(totaltrunc>0)cout<<meantrunc/totaltrunc;
  cout<<endl;
  TF1 *funcMean = new TF1("funcMean","x*([0])/[1]*exp(-x/[1])",0,100);
  for(int i=0; i<2;i++){funcMean->SetParameter(i,func->GetParameter(i));}
  float expoExtrap = -1;
  if(funcMean->GetParameter(1)!=0) funcMean->Integral(0.0,cutoffLow);
  float expoExtrapTotal = -1;
  if(func->GetParameter(1)!=0) func->Integral(0.0,cutoffLow);
  TF1 *funcDoubleExponentialMean = new TF1("funcDoubleExponentialMean","x*[0]/[1]*exp(-x/[1])+x*[2]/[3]*exp(-x/[3])",0,100);
  for(int i=0; i<4;i++){funcDoubleExponentialMean->SetParameter(i,funcDoubleExponential->GetParameter(i));}
  float dblExpoExtrap = funcDoubleExponentialMean->Integral(0.0,cutoffLow);
  float dblExpoExtrapTotal = funcDoubleExponential->Integral(0.0,cutoffLow);
  float total = hReco1->Integral(1,hReco1->FindBin(cutoffHigh-0.01),"width");
  float truncated = hReco1->Integral(hReco1->FindBin(cutoffLow+0.01),hReco1->FindBin(cutoffHigh-0.01),"width");
  hReco1->GetXaxis()->SetRange(1,hReco1->FindBin(cutoffHigh));
  hReco1->GetXaxis()->SetRange(hReco1->FindBin(cutoffLow),hReco1->FindBin(cutoffHigh));
  cout<<"Truncated Mean "<<hReco1->GetMean()<<" total "<<total<<" mean err ";
  if(meanvar>0) cout<<TMath::Sqrt(meanvar);
  cout<<endl;
  hReco1->GetXaxis()->SetRange(1,hReco1->GetNbinsX());
//   cout<<"Extrapolations:  exponential "<<expoExtrap<<" double exponential "<<dblExpoExtrap<<endl;
//   cout<<"Total: high ";
//   if((totaltrunc+dblExpoExtrapTotal)>0) cout<<(dblExpoExtrap+meantrunc)/(totaltrunc+dblExpoExtrapTotal);
//   cout<<" best ";
//   if((totaltrunc+expoExtrapTotal)>0) cout<<(expoExtrap+meantrunc)/(totaltrunc+expoExtrapTotal);
//   cout<<" low "<<mean<<endl;
//   cout<<"Raw mean "<<hReco1->GetMean();
//   cout<<" Total scaled: low ";
//   if((totaltrunc+dblExpoExtrapTotal)>0) cout<<(dblExpoExtrap+meantrunc)/(totaltrunc+dblExpoExtrapTotal);
//   cout<<" best ";
//   if(totaltrunc+expoExtrapTotal>0) cout<<(expoExtrap+meantrunc)/(totaltrunc+expoExtrapTotal);
//   cout<<" high ";
//   if(total>0) cout<<mean/total;
//   cout<<endl;
  canvas1->cd();
  funcDoubleExponential->SetLineStyle(2);
  func->Draw("same");
  funcDoubleExponential->Draw("same");
  // canvas1->SaveAs(Form("%s.C",outputfilename));
  //canvas1->SaveAs(Form("%s.eps",outputfilename));
  //canvas1->SaveAs(Form("%s.png",outputfilename));



  TCanvas *canvas5 = new TCanvas("RecovsSimReco","RecovsSimReco",600,600);
  canvas5->SetTopMargin(0.020979);
  canvas5->SetRightMargin(0.0184564);
  canvas5->SetLeftMargin(0.0989933);
  canvas5->SetBottomMargin(0.101399);
  canvas5->SetBorderSize(0);
  canvas5->SetFillColor(0);
  canvas5->SetFillColor(0);
  canvas5->SetBorderMode(0);
  canvas5->SetFrameFillColor(0);
  canvas5->SetFrameBorderMode(0);
  canvas5->SetLogy();
  hMeasured->Draw();
  nevents = neveUsed;

  TH1F *hMeasuredSim = GetReconstructedEt((TH1*)hReco1,(int) nevents,(char *)"SmearedTruth",(float) hReco1->GetBinLowEdge(1),(float) hReco1->GetBinLowEdge(hReco1->GetNbinsX()),(int) hReco1->GetNbinsX());//(TH1D*) unfold.Hmeasured();
  float myscale2 = hMeasured->GetBinContent(hMeasured->FindBin(matchval)) / hMeasuredSim->GetBinContent(hMeasuredSim->FindBin(matchval));
  //cout<<"p1 "<<hMeasured->GetBinContent(hMeasured->FindBin(matchval))<<" "<<hMeasured->GetBinContent(hMeasured->FindBin(matchval))<<" p2 "<<
  //  cout<<"Scaling by "<<hMeasured->GetBinContent(hMeasured->FindBin(matchval))<<" / "<<hMeasuredSim->GetBinContent(hMeasuredSim->FindBin(matchval))<<" = "<<myscale2<<endl;
  GetChi2(hMeasured,hMeasuredSim);
  cout<<"Chi^2 of Smeared compared to measured "<<GetChi2(hMeasured,hMeasuredSim)<<endl;
  hMeasuredSim->Scale(myscale2);
  hMeasuredSim->Draw("same");
  hMeasuredSim->SetMarkerStyle(21);
  hMeasuredSim->SetLineColor(2);
  hMeasuredSim->SetMarkerColor(2);
  TLegend *legend5 = new TLegend(0.437919,0.800699,0.966443,0.958042);
  legend5->AddEntry(hMeasured,"Measured");
  legend5->AddEntry(hMeasuredSim,"Simulated Measured");
  legend5->Draw();
  //canvas5->SaveAs(Form("%s%s.png",outputfilename,"Reco"));
  //canvas5->SaveAs(Form("%s%s.eps",outputfilename,"Reco"));
  canvas5->SaveAs(Form("%s%s.C",outputfilename,"Reco"));


  TCanvas *canvas6 = new TCanvas("RecoOverSimReco","RecoOverSimReco",600,600);
  canvas6->SetTopMargin(0.020979);
  canvas6->SetRightMargin(0.0184564);
  canvas6->SetLeftMargin(0.0989933);
  canvas6->SetBottomMargin(0.101399);
  canvas6->SetBorderSize(0);
  canvas6->SetFillColor(0);
  canvas6->SetFillColor(0);
  canvas6->SetBorderMode(0);
  canvas6->SetFrameFillColor(0);
  canvas6->SetFrameBorderMode(0);
  canvas6->SetLogy();

  //TH1F *hMeasuredClone = hMeasured->Clone("hMeasuredClone");
  //hMeasuredClone->Divide(hMeasuredSim);
  Float_t avgratio = 0;
  Int_t lowbin = hMeasured->FindBin(0.0);
  Int_t highbin = hMeasured->FindBin(maxEt);
  TH1F *hMeasuredClone = new TH1F("hMeasuredClone","Measured/simulated measured",highbin-lowbin+1,0,maxEt);
  Int_t mylowbin = hMeasured->FindBin(1.0);
  Int_t myhighbin = hMeasured->FindBin(maxEt-2.0);
  Float_t maxratio = 0;
  Float_t minratio = 1e6;
  for(Int_t i = lowbin;i<=highbin;i++){
    Float_t ratio = hMeasured->GetBinContent(i) / hMeasuredSim->GetBinContent(i);
    Float_t ratioerror = 0;
    if(hMeasured->GetBinContent(i)>0 && hMeasuredSim->GetBinContent(i)>0) ratio * TMath::Sqrt(TMath::Power(hMeasured->GetBinError(i)/hMeasured->GetBinContent(i),2)+TMath::Power(hMeasuredSim->GetBinError(i)/hMeasuredSim->GetBinContent(i),2));
    hMeasuredClone->SetBinContent(i,ratio);
    hMeasuredClone->SetBinError(i,ratioerror);
    if(i>=mylowbin && i<=myhighbin){
      avgratio += ratio;
      if(maxratio<ratio) maxratio = ratio;
      if(minratio>ratio) minratio = ratio;
    }
  }
  avgratio = avgratio/((Float_t)(myhighbin-mylowbin+1));
  cout<<"average ratio : "<<avgratio<<" max ratio "<<maxratio<<" min ratio "<<minratio;
  Bool_t goodFit = kFALSE;
  if(avgratio<5 && avgratio>0.1 && maxratio<2 && minratio>0.1){
    goodFit = kTRUE;
    cout<<" GOOD"<<endl;
  }
  else{
    cout<<" BAD"<<endl;
  }
  hMeasuredClone->Draw();
  canvas6->SaveAs(Form("%s%s.C",outputfilename,"RecoOverSim"));
  canvas6->SaveAs(Form("%s%s.png",outputfilename,"RecoOverSim"));


  TString temp = outputfilename;
  TString filename = temp+".root";
  TFile *outfile2 = new TFile(filename.Data(), "RECREATE");
  cout<<"Creating "<<filename.Data()<<endl;
  hReco1->Write();
  hMeasured->Write();
  hMeasuredSim->Write();
  outfile2->Close();

  TString temp = outputfilename;
  TString filename = temp+".root";
  TFile *outfile2 = new TFile(filename.Data(), "RECREATE");
  hReco1->Write();
  hMeasured->Write();
  hMeasuredSim->Write();
  outfile2->Close();
  return;


//   func->Draw();
  //funcDoubleExponential->Draw();
}

TH1F *GetReconstructedEt(TF1 *inputfunc, int nevents, char *name, float lowbound, float highbound, int nbins,bool smooth){
  TH1F *hResult = new TH1F(name,ytitle->Data(),nbins,lowbound,highbound);
  hResult->Sumw2();
  // cerr<<__FILE__<<" "<<__LINE__<<" Creating "<<hResult->GetName()<<" with "<<nevents<<" events"<<endl;
  for(int i=0;i<nevents;i++){
    float et = inputfunc->GetRandom(lowbound,highbound);
    int mybin = resolutionFull->GetXaxis()->FindBin(et);
    if(mybin>0 && mybin<=nbins){//then this is in our range...
      float myres = ((TH1D*)histoarray.At(mybin-1))->GetRandom();
      //float etreco = (1-myres)*et;
      float etreco = myres;
      //cout<<"et true "<<et<<" reco "<<etreco<<endl;
      hResult->Fill(etreco);
    }
    //if(i%100000==0) Smooth(hResult,inputfunc);
  }
  //if(smooth) 
  //cerr<<__FILE__<<" "<<__LINE__<<" "<<name<<endl;
   //Smooth(hResult,inputfunc);
  //float binwidth = hResult->GetBinWidth(1);
  //hResult->Scale(1.0/nevents/binwidth);
  return hResult;
}
TH1F *GetReconstructedEt(TH1 *input, int nevents, char *name, float lowbound, float highbound, int nbins){
  // cerr<<__FILE__<<" "<<__LINE__<<" "<<name<<endl;
  TH1F *hResult = new TH1F(name,ytitle->Data(),nbins,lowbound,highbound);
  hResult->Sumw2();
  for(int i=0;i<nevents;i++){
    float et = input->GetRandom();
    int mybin = resolutionFull->GetXaxis()->FindBin(et);
    if(mybin>0 && mybin<=nbins){//then this is in our range...
      float myres = ((TH1D*)histoarray.At(mybin-1))->GetRandom();
      //float etreco = (1-myres)*et;
      float etreco = myres;
      //cout<<"et true "<<et<<" reco "<<etreco<<endl;
      hResult->Fill(etreco);
    }
  }
  hResult->GetYaxis()->SetTitle("1/N_{eve} dN/dE_{T}");
  hResult->GetXaxis()->SetTitle("E_{T}");
  //float binwidth = hResult->GetBinWidth(1);
  //hResult->Scale(1.0/nevents/binwidth);
  return hResult;
}

TH1F *GetTrueEt(TF1 *inputfunc, int nevents, char *name, float lowbound, float highbound, int nbins){

  //cerr<<__FILE__<<" "<<__LINE__<<" Throwing simulation "<<name<<" with "<<nevents<<" events "<<endl;
  TH1F *hResult = new TH1F(name,ytitle->Data(),nbins,lowbound,highbound);
  hResult->Sumw2();
  //cerr<<"event ";
  for(int i=0;i<nevents;i++){
    //if(i%1000) cerr<<i<<" ";
    float et = inputfunc->GetRandom(lowbound,highbound);
    hResult->Fill(et);
  }
  //cerr<<endl;
  //hResult->SetBinContent(1,hResult->GetBinContent(1)*10);
  float binwidth = hResult->GetBinWidth(1);
  //hResult->Scale(1.0/nevents/binwidth);
  hResult->GetYaxis()->SetTitle("1/N_{eve} dN/dE_{T}");
  hResult->GetXaxis()->SetTitle("E_{T}");
  return hResult;
}


Float_t GetChi2(TH1F *reconstructed, TH1F *simulated){
  Float_t chi2 = 0;
  int nbins = reconstructed->FindBin(10.0);
  int lowbin =  reconstructed->FindBin(5.01);
  float ndf=0;
  for(int i=4;i<=nbins;i++){
    float y = reconstructed->GetBinContent(i);
    float yerr = reconstructed->GetBinError(i);
    float f = simulated->GetBinContent(i);
    float ferr = simulated->GetBinError(i);
    if((yerr*yerr)>0){
      //       cout<<"i "<< TMath::Power(y-f,2)/(yerr*yerr+ferr*ferr)<<endl;
      //       chi2+= TMath::Power(y-f,2)/(yerr*yerr+ferr*ferr);
      //cout<<"i "<< TMath::Power(y-f,2)/(yerr*yerr)<<endl;
      chi2+= TMath::Power(y-f,2)/(yerr*yerr);
      //float relerry = yerr/y;
      //float relerrf = ferr/f;
      //cout<<"i "<<i<<" chi2 increment "<< TMath::Power(y-f,2)/(yerr*yerr)<<" y "<<y<<" f "<<f<<" yerr/y "<<relerry<<" ferr/f "<<relerrf<<endl;
      ndf++;
    }
  }
  ndf--;//There is one parameter
  cout<<"Chi^2/ndf "<<chi2<<"/"<<ndf<<" = "<<chi2/ndf<<endl;
  if(ndf>0)return chi2/ndf;
  else{return 0;}
}

TH1F *RestrictAxes(TH1F *old,float minEt,float maxEt){
  int minbin = old->FindBin(minEt+0.01);
  int maxbin = old->FindBin(maxEt-0.01);
  //cout<<"Restricting range.  Old bin width:"<<old->GetBinWidth(1);
  int totnbins = maxbin-minbin+1;
  TH1F *hNew = new TH1F(Form("%sNew",old->GetName()),old->GetTitle(),totnbins,minEt,maxEt);
  hNew->GetYaxis()->SetTitle(old->GetYaxis()->GetTitle());
  hNew->GetXaxis()->SetTitle(old->GetXaxis()->GetTitle());
  //cout<<old->GetName()<<" New range "<<minEt<<"-"<<maxEt<<" bins "<<minbin<<"-"<<maxbin<<endl;
  for(int i=minbin;i<=maxbin;i++){
    //cout<<hNew->FindBin(old->GetBinCenter(i))<<":"<<old->GetBinContent(i);
    //if(i!=maxbin) cout<<",";
    int oldbin = i;
    float newbin = hNew->FindBin(old->GetBinCenter(oldbin));
    //cout<<"old "<<oldbin<<" new "<<newbin<<" center "<<hNew->GetBinCenter(newbin)<<"="<<old->GetBinCenter(oldbin)<<" content "<<old->GetBinContent(oldbin)<<" +/- "<<old->GetBinError(oldbin)<<endl;
    hNew->SetBinContent(newbin,old->GetBinContent(oldbin));
    hNew->SetBinError(newbin,old->GetBinError(oldbin));
  }
  //cout<<endl;
  hNew->Sumw2();
  //delete old;
  //old = hNew;
  //cout<<" new bin width "<<hNew->GetBinWidth(1)<<endl;
  return hNew;
}
TH2F *RestrictAxes(TH2F *old,float minEt,float maxEt){
  int minbin = old->GetYaxis()->FindBin(minEt+0.01);
  int maxbin = old->GetYaxis()->FindBin(maxEt-0.01);
  //cout<<"Restricting range.  Old bin width:"<<old->GetBinWidth(1);
  int totnbins = maxbin-minbin+1;
  TH2F *hNew = new TH2F(Form("%sNew",old->GetName()),old->GetTitle(),totnbins,minEt,maxEt,totnbins,minEt,maxEt);
  hNew->GetYaxis()->SetTitle(old->GetYaxis()->GetTitle());
  hNew->GetXaxis()->SetTitle(old->GetXaxis()->GetTitle());
  for(int i=minbin;i<=maxbin;i++){
    int newbinx = hNew->GetXaxis()->FindBin(old->GetXaxis()->GetBinCenter(i));
    int oldbinx = i;//hNew->GetXaxis()->FindBin(old->GetXaxis()->GetBinCenter(i));
    for(int j=minbin;j<=maxbin;j++){
      int newbiny = hNew->GetYaxis()->FindBin(old->GetYaxis()->GetBinCenter(j));
      int oldbiny = j;//hNew->GetYaxis()->FindBin(old->GetYaxis()->GetBinCenter(j));
      //int mybinNew = hNew->FindBin(old->GetXaxis()->GetBinCenter(i),old->GetYaxis()->GetBinCenter(j));
      //int mybinOld = old->FindBin(old->GetXaxis()->GetBinCenter(i),old->GetYaxis()->GetBinCenter(j));
      //cout<<"i "<<i<<" j "<<j<<" ";
      //cout<<"Old bin ("<<oldbinx<<","<<oldbiny<<") is becoming ("<<newbinx<<","<<newbiny<<") with content "<<old->GetBinContent(oldbinx,oldbiny)<<" +/- "<<old->GetBinError(oldbinx,oldbiny)<<endl;
      hNew->SetBinContent(newbinx,newbiny,old->GetBinContent(oldbinx,oldbiny));
      hNew->SetBinError(newbinx,newbiny,old->GetBinError(oldbinx,oldbiny));
      //hNew->SetBinError(mybinNew,old->GetBinError(mybinOld));
    }
  }
  hNew->Sumw2();
  return hNew;
  //delete old;
  //old = hNew;
  //cout<<" new bin width "<<hNew->GetBinWidth(1)<<endl;
}

void Smooth(TH1F *histo,TF1 *func){
  cout<<"Smoothing..."<<endl;
  //histo->Smooth(1,"R");
  //cerr<<__FILE__<<" "<<__LINE__<<endl;
  histo->Fit(func,"N","",10,35);
  //cerr<<__FILE__<<" "<<__LINE__<<endl;
  for(int i=histo->FindBin(15.0);i<histo->GetNbinsX();i++){
    float thisval = histo->GetBinContent(i);
    float thiscenter = histo->GetBinCenter(i);
    float thiserr = histo->GetBinError(i);
    float expectation = func->Eval(thiscenter);
    //if the number is more than 10 sigma away from the expectation and we would have expected at least 1 entry in that bin, recalculate it assuming Gaussian smoothing
    if(thisval<1.0) break;
    //cerr<<__FILE__<<" "<<__LINE__<<endl;
    if(expectation>1.0 && TMath::Abs(thiserr)>1e-5 && TMath::Abs(thisval-expectation)/thiserr>5){
      float nSigma = myGaussian->GetRandom();
      //cerr<<__FILE__<<" "<<__LINE__<<endl;
      histo->SetBinContent(i,expectation+nSigma*TMath::Sqrt(expectation));
      //cout<<"Resetting bin "<<i<<" at "<<histo->GetBinCenter(i)<<" from "<<thisval<<" which was "<<TMath::Abs(thisval-expectation)/thiserr<<" sigma away to "<<expectation+nSigma*TMath::Sqrt(expectation)<<" nSigma "<<nSigma<<" away from "<<expectation<<endl;
    }
//     float nextval = histo->GetBinContent(i+1);
//     float lastval = histo->GetBinContent(i-1);
//     float nextcenter = histo->GetBinCenter(i+1);
//     float lastcenter = histo->GetBinCenter(i-1);
//     float nexterr = histo->GetBinError(i+1);
//     float lasterr = histo->GetBinError(i-1);
//     if(nextval>thisval){//We have a problem!  This function should decrease!
//       //impose y=A e(-x/b) and use previous two values to calculate b and A
//       float b = TMath::Log(thisval/lastval)/(lastcenter-thiscenter);
//       float A = thisval/exp(-b*thiscenter);
//       float newval = A*exp(-b*nextcenter);
//       cout<<"A "<<A<<" b "<<" center "<<nextcenter<<" old "<<histo->GetBinContent(i+1)<<" new "<<newval<<endl;
//       //if(newval)histo->SetBinContent(i+1,newval);
//     }
  }
}
 Unfoldpp.C:1
 Unfoldpp.C:2
 Unfoldpp.C:3
 Unfoldpp.C:4
 Unfoldpp.C:5
 Unfoldpp.C:6
 Unfoldpp.C:7
 Unfoldpp.C:8
 Unfoldpp.C:9
 Unfoldpp.C:10
 Unfoldpp.C:11
 Unfoldpp.C:12
 Unfoldpp.C:13
 Unfoldpp.C:14
 Unfoldpp.C:15
 Unfoldpp.C:16
 Unfoldpp.C:17
 Unfoldpp.C:18
 Unfoldpp.C:19
 Unfoldpp.C:20
 Unfoldpp.C:21
 Unfoldpp.C:22
 Unfoldpp.C:23
 Unfoldpp.C:24
 Unfoldpp.C:25
 Unfoldpp.C:26
 Unfoldpp.C:27
 Unfoldpp.C:28
 Unfoldpp.C:29
 Unfoldpp.C:30
 Unfoldpp.C:31
 Unfoldpp.C:32
 Unfoldpp.C:33
 Unfoldpp.C:34
 Unfoldpp.C:35
 Unfoldpp.C:36
 Unfoldpp.C:37
 Unfoldpp.C:38
 Unfoldpp.C:39
 Unfoldpp.C:40
 Unfoldpp.C:41
 Unfoldpp.C:42
 Unfoldpp.C:43
 Unfoldpp.C:44
 Unfoldpp.C:45
 Unfoldpp.C:46
 Unfoldpp.C:47
 Unfoldpp.C:48
 Unfoldpp.C:49
 Unfoldpp.C:50
 Unfoldpp.C:51
 Unfoldpp.C:52
 Unfoldpp.C:53
 Unfoldpp.C:54
 Unfoldpp.C:55
 Unfoldpp.C:56
 Unfoldpp.C:57
 Unfoldpp.C:58
 Unfoldpp.C:59
 Unfoldpp.C:60
 Unfoldpp.C:61
 Unfoldpp.C:62
 Unfoldpp.C:63
 Unfoldpp.C:64
 Unfoldpp.C:65
 Unfoldpp.C:66
 Unfoldpp.C:67
 Unfoldpp.C:68
 Unfoldpp.C:69
 Unfoldpp.C:70
 Unfoldpp.C:71
 Unfoldpp.C:72
 Unfoldpp.C:73
 Unfoldpp.C:74
 Unfoldpp.C:75
 Unfoldpp.C:76
 Unfoldpp.C:77
 Unfoldpp.C:78
 Unfoldpp.C:79
 Unfoldpp.C:80
 Unfoldpp.C:81
 Unfoldpp.C:82
 Unfoldpp.C:83
 Unfoldpp.C:84
 Unfoldpp.C:85
 Unfoldpp.C:86
 Unfoldpp.C:87
 Unfoldpp.C:88
 Unfoldpp.C:89
 Unfoldpp.C:90
 Unfoldpp.C:91
 Unfoldpp.C:92
 Unfoldpp.C:93
 Unfoldpp.C:94
 Unfoldpp.C:95
 Unfoldpp.C:96
 Unfoldpp.C:97
 Unfoldpp.C:98
 Unfoldpp.C:99
 Unfoldpp.C:100
 Unfoldpp.C:101
 Unfoldpp.C:102
 Unfoldpp.C:103
 Unfoldpp.C:104
 Unfoldpp.C:105
 Unfoldpp.C:106
 Unfoldpp.C:107
 Unfoldpp.C:108
 Unfoldpp.C:109
 Unfoldpp.C:110
 Unfoldpp.C:111
 Unfoldpp.C:112
 Unfoldpp.C:113
 Unfoldpp.C:114
 Unfoldpp.C:115
 Unfoldpp.C:116
 Unfoldpp.C:117
 Unfoldpp.C:118
 Unfoldpp.C:119
 Unfoldpp.C:120
 Unfoldpp.C:121
 Unfoldpp.C:122
 Unfoldpp.C:123
 Unfoldpp.C:124
 Unfoldpp.C:125
 Unfoldpp.C:126
 Unfoldpp.C:127
 Unfoldpp.C:128
 Unfoldpp.C:129
 Unfoldpp.C:130
 Unfoldpp.C:131
 Unfoldpp.C:132
 Unfoldpp.C:133
 Unfoldpp.C:134
 Unfoldpp.C:135
 Unfoldpp.C:136
 Unfoldpp.C:137
 Unfoldpp.C:138
 Unfoldpp.C:139
 Unfoldpp.C:140
 Unfoldpp.C:141
 Unfoldpp.C:142
 Unfoldpp.C:143
 Unfoldpp.C:144
 Unfoldpp.C:145
 Unfoldpp.C:146
 Unfoldpp.C:147
 Unfoldpp.C:148
 Unfoldpp.C:149
 Unfoldpp.C:150
 Unfoldpp.C:151
 Unfoldpp.C:152
 Unfoldpp.C:153
 Unfoldpp.C:154
 Unfoldpp.C:155
 Unfoldpp.C:156
 Unfoldpp.C:157
 Unfoldpp.C:158
 Unfoldpp.C:159
 Unfoldpp.C:160
 Unfoldpp.C:161
 Unfoldpp.C:162
 Unfoldpp.C:163
 Unfoldpp.C:164
 Unfoldpp.C:165
 Unfoldpp.C:166
 Unfoldpp.C:167
 Unfoldpp.C:168
 Unfoldpp.C:169
 Unfoldpp.C:170
 Unfoldpp.C:171
 Unfoldpp.C:172
 Unfoldpp.C:173
 Unfoldpp.C:174
 Unfoldpp.C:175
 Unfoldpp.C:176
 Unfoldpp.C:177
 Unfoldpp.C:178
 Unfoldpp.C:179
 Unfoldpp.C:180
 Unfoldpp.C:181
 Unfoldpp.C:182
 Unfoldpp.C:183
 Unfoldpp.C:184
 Unfoldpp.C:185
 Unfoldpp.C:186
 Unfoldpp.C:187
 Unfoldpp.C:188
 Unfoldpp.C:189
 Unfoldpp.C:190
 Unfoldpp.C:191
 Unfoldpp.C:192
 Unfoldpp.C:193
 Unfoldpp.C:194
 Unfoldpp.C:195
 Unfoldpp.C:196
 Unfoldpp.C:197
 Unfoldpp.C:198
 Unfoldpp.C:199
 Unfoldpp.C:200
 Unfoldpp.C:201
 Unfoldpp.C:202
 Unfoldpp.C:203
 Unfoldpp.C:204
 Unfoldpp.C:205
 Unfoldpp.C:206
 Unfoldpp.C:207
 Unfoldpp.C:208
 Unfoldpp.C:209
 Unfoldpp.C:210
 Unfoldpp.C:211
 Unfoldpp.C:212
 Unfoldpp.C:213
 Unfoldpp.C:214
 Unfoldpp.C:215
 Unfoldpp.C:216
 Unfoldpp.C:217
 Unfoldpp.C:218
 Unfoldpp.C:219
 Unfoldpp.C:220
 Unfoldpp.C:221
 Unfoldpp.C:222
 Unfoldpp.C:223
 Unfoldpp.C:224
 Unfoldpp.C:225
 Unfoldpp.C:226
 Unfoldpp.C:227
 Unfoldpp.C:228
 Unfoldpp.C:229
 Unfoldpp.C:230
 Unfoldpp.C:231
 Unfoldpp.C:232
 Unfoldpp.C:233
 Unfoldpp.C:234
 Unfoldpp.C:235
 Unfoldpp.C:236
 Unfoldpp.C:237
 Unfoldpp.C:238
 Unfoldpp.C:239
 Unfoldpp.C:240
 Unfoldpp.C:241
 Unfoldpp.C:242
 Unfoldpp.C:243
 Unfoldpp.C:244
 Unfoldpp.C:245
 Unfoldpp.C:246
 Unfoldpp.C:247
 Unfoldpp.C:248
 Unfoldpp.C:249
 Unfoldpp.C:250
 Unfoldpp.C:251
 Unfoldpp.C:252
 Unfoldpp.C:253
 Unfoldpp.C:254
 Unfoldpp.C:255
 Unfoldpp.C:256
 Unfoldpp.C:257
 Unfoldpp.C:258
 Unfoldpp.C:259
 Unfoldpp.C:260
 Unfoldpp.C:261
 Unfoldpp.C:262
 Unfoldpp.C:263
 Unfoldpp.C:264
 Unfoldpp.C:265
 Unfoldpp.C:266
 Unfoldpp.C:267
 Unfoldpp.C:268
 Unfoldpp.C:269
 Unfoldpp.C:270
 Unfoldpp.C:271
 Unfoldpp.C:272
 Unfoldpp.C:273
 Unfoldpp.C:274
 Unfoldpp.C:275
 Unfoldpp.C:276
 Unfoldpp.C:277
 Unfoldpp.C:278
 Unfoldpp.C:279
 Unfoldpp.C:280
 Unfoldpp.C:281
 Unfoldpp.C:282
 Unfoldpp.C:283
 Unfoldpp.C:284
 Unfoldpp.C:285
 Unfoldpp.C:286
 Unfoldpp.C:287
 Unfoldpp.C:288
 Unfoldpp.C:289
 Unfoldpp.C:290
 Unfoldpp.C:291
 Unfoldpp.C:292
 Unfoldpp.C:293
 Unfoldpp.C:294
 Unfoldpp.C:295
 Unfoldpp.C:296
 Unfoldpp.C:297
 Unfoldpp.C:298
 Unfoldpp.C:299
 Unfoldpp.C:300
 Unfoldpp.C:301
 Unfoldpp.C:302
 Unfoldpp.C:303
 Unfoldpp.C:304
 Unfoldpp.C:305
 Unfoldpp.C:306
 Unfoldpp.C:307
 Unfoldpp.C:308
 Unfoldpp.C:309
 Unfoldpp.C:310
 Unfoldpp.C:311
 Unfoldpp.C:312
 Unfoldpp.C:313
 Unfoldpp.C:314
 Unfoldpp.C:315
 Unfoldpp.C:316
 Unfoldpp.C:317
 Unfoldpp.C:318
 Unfoldpp.C:319
 Unfoldpp.C:320
 Unfoldpp.C:321
 Unfoldpp.C:322
 Unfoldpp.C:323
 Unfoldpp.C:324
 Unfoldpp.C:325
 Unfoldpp.C:326
 Unfoldpp.C:327
 Unfoldpp.C:328
 Unfoldpp.C:329
 Unfoldpp.C:330
 Unfoldpp.C:331
 Unfoldpp.C:332
 Unfoldpp.C:333
 Unfoldpp.C:334
 Unfoldpp.C:335
 Unfoldpp.C:336
 Unfoldpp.C:337
 Unfoldpp.C:338
 Unfoldpp.C:339
 Unfoldpp.C:340
 Unfoldpp.C:341
 Unfoldpp.C:342
 Unfoldpp.C:343
 Unfoldpp.C:344
 Unfoldpp.C:345
 Unfoldpp.C:346
 Unfoldpp.C:347
 Unfoldpp.C:348
 Unfoldpp.C:349
 Unfoldpp.C:350
 Unfoldpp.C:351
 Unfoldpp.C:352
 Unfoldpp.C:353
 Unfoldpp.C:354
 Unfoldpp.C:355
 Unfoldpp.C:356
 Unfoldpp.C:357
 Unfoldpp.C:358
 Unfoldpp.C:359
 Unfoldpp.C:360
 Unfoldpp.C:361
 Unfoldpp.C:362
 Unfoldpp.C:363
 Unfoldpp.C:364
 Unfoldpp.C:365
 Unfoldpp.C:366
 Unfoldpp.C:367
 Unfoldpp.C:368
 Unfoldpp.C:369
 Unfoldpp.C:370
 Unfoldpp.C:371
 Unfoldpp.C:372
 Unfoldpp.C:373
 Unfoldpp.C:374
 Unfoldpp.C:375
 Unfoldpp.C:376
 Unfoldpp.C:377
 Unfoldpp.C:378
 Unfoldpp.C:379
 Unfoldpp.C:380
 Unfoldpp.C:381
 Unfoldpp.C:382
 Unfoldpp.C:383
 Unfoldpp.C:384
 Unfoldpp.C:385
 Unfoldpp.C:386
 Unfoldpp.C:387
 Unfoldpp.C:388
 Unfoldpp.C:389
 Unfoldpp.C:390
 Unfoldpp.C:391
 Unfoldpp.C:392
 Unfoldpp.C:393
 Unfoldpp.C:394
 Unfoldpp.C:395
 Unfoldpp.C:396
 Unfoldpp.C:397
 Unfoldpp.C:398
 Unfoldpp.C:399
 Unfoldpp.C:400
 Unfoldpp.C:401
 Unfoldpp.C:402
 Unfoldpp.C:403
 Unfoldpp.C:404
 Unfoldpp.C:405
 Unfoldpp.C:406
 Unfoldpp.C:407
 Unfoldpp.C:408
 Unfoldpp.C:409
 Unfoldpp.C:410
 Unfoldpp.C:411
 Unfoldpp.C:412
 Unfoldpp.C:413
 Unfoldpp.C:414
 Unfoldpp.C:415
 Unfoldpp.C:416
 Unfoldpp.C:417
 Unfoldpp.C:418
 Unfoldpp.C:419
 Unfoldpp.C:420
 Unfoldpp.C:421
 Unfoldpp.C:422
 Unfoldpp.C:423
 Unfoldpp.C:424
 Unfoldpp.C:425
 Unfoldpp.C:426
 Unfoldpp.C:427
 Unfoldpp.C:428
 Unfoldpp.C:429
 Unfoldpp.C:430
 Unfoldpp.C:431
 Unfoldpp.C:432
 Unfoldpp.C:433
 Unfoldpp.C:434
 Unfoldpp.C:435
 Unfoldpp.C:436
 Unfoldpp.C:437
 Unfoldpp.C:438
 Unfoldpp.C:439
 Unfoldpp.C:440
 Unfoldpp.C:441
 Unfoldpp.C:442
 Unfoldpp.C:443
 Unfoldpp.C:444
 Unfoldpp.C:445
 Unfoldpp.C:446
 Unfoldpp.C:447
 Unfoldpp.C:448
 Unfoldpp.C:449
 Unfoldpp.C:450
 Unfoldpp.C:451
 Unfoldpp.C:452
 Unfoldpp.C:453
 Unfoldpp.C:454
 Unfoldpp.C:455
 Unfoldpp.C:456
 Unfoldpp.C:457
 Unfoldpp.C:458
 Unfoldpp.C:459
 Unfoldpp.C:460
 Unfoldpp.C:461
 Unfoldpp.C:462
 Unfoldpp.C:463
 Unfoldpp.C:464
 Unfoldpp.C:465
 Unfoldpp.C:466
 Unfoldpp.C:467
 Unfoldpp.C:468
 Unfoldpp.C:469
 Unfoldpp.C:470
 Unfoldpp.C:471
 Unfoldpp.C:472
 Unfoldpp.C:473
 Unfoldpp.C:474
 Unfoldpp.C:475
 Unfoldpp.C:476
 Unfoldpp.C:477
 Unfoldpp.C:478
 Unfoldpp.C:479
 Unfoldpp.C:480
 Unfoldpp.C:481
 Unfoldpp.C:482
 Unfoldpp.C:483
 Unfoldpp.C:484
 Unfoldpp.C:485
 Unfoldpp.C:486
 Unfoldpp.C:487
 Unfoldpp.C:488
 Unfoldpp.C:489
 Unfoldpp.C:490
 Unfoldpp.C:491
 Unfoldpp.C:492
 Unfoldpp.C:493
 Unfoldpp.C:494
 Unfoldpp.C:495
 Unfoldpp.C:496
 Unfoldpp.C:497
 Unfoldpp.C:498
 Unfoldpp.C:499
 Unfoldpp.C:500
 Unfoldpp.C:501
 Unfoldpp.C:502
 Unfoldpp.C:503
 Unfoldpp.C:504
 Unfoldpp.C:505
 Unfoldpp.C:506
 Unfoldpp.C:507
 Unfoldpp.C:508
 Unfoldpp.C:509
 Unfoldpp.C:510
 Unfoldpp.C:511
 Unfoldpp.C:512
 Unfoldpp.C:513
 Unfoldpp.C:514
 Unfoldpp.C:515
 Unfoldpp.C:516
 Unfoldpp.C:517
 Unfoldpp.C:518
 Unfoldpp.C:519
 Unfoldpp.C:520
 Unfoldpp.C:521
 Unfoldpp.C:522
 Unfoldpp.C:523
 Unfoldpp.C:524
 Unfoldpp.C:525
 Unfoldpp.C:526
 Unfoldpp.C:527
 Unfoldpp.C:528
 Unfoldpp.C:529
 Unfoldpp.C:530
 Unfoldpp.C:531
 Unfoldpp.C:532
 Unfoldpp.C:533
 Unfoldpp.C:534
 Unfoldpp.C:535
 Unfoldpp.C:536
 Unfoldpp.C:537
 Unfoldpp.C:538
 Unfoldpp.C:539
 Unfoldpp.C:540
 Unfoldpp.C:541
 Unfoldpp.C:542
 Unfoldpp.C:543
 Unfoldpp.C:544
 Unfoldpp.C:545
 Unfoldpp.C:546
 Unfoldpp.C:547
 Unfoldpp.C:548
 Unfoldpp.C:549
 Unfoldpp.C:550
 Unfoldpp.C:551
 Unfoldpp.C:552
 Unfoldpp.C:553
 Unfoldpp.C:554
 Unfoldpp.C:555
 Unfoldpp.C:556
 Unfoldpp.C:557
 Unfoldpp.C:558
 Unfoldpp.C:559
 Unfoldpp.C:560
 Unfoldpp.C:561
 Unfoldpp.C:562
 Unfoldpp.C:563
 Unfoldpp.C:564
 Unfoldpp.C:565
 Unfoldpp.C:566
 Unfoldpp.C:567
 Unfoldpp.C:568
 Unfoldpp.C:569
 Unfoldpp.C:570
 Unfoldpp.C:571
 Unfoldpp.C:572
 Unfoldpp.C:573
 Unfoldpp.C:574
 Unfoldpp.C:575
 Unfoldpp.C:576
 Unfoldpp.C:577
 Unfoldpp.C:578
 Unfoldpp.C:579
 Unfoldpp.C:580
 Unfoldpp.C:581
 Unfoldpp.C:582
 Unfoldpp.C:583
 Unfoldpp.C:584
 Unfoldpp.C:585
 Unfoldpp.C:586
 Unfoldpp.C:587
 Unfoldpp.C:588
 Unfoldpp.C:589
 Unfoldpp.C:590
 Unfoldpp.C:591
 Unfoldpp.C:592
 Unfoldpp.C:593
 Unfoldpp.C:594
 Unfoldpp.C:595
 Unfoldpp.C:596
 Unfoldpp.C:597
 Unfoldpp.C:598
 Unfoldpp.C:599
 Unfoldpp.C:600
 Unfoldpp.C:601
 Unfoldpp.C:602
 Unfoldpp.C:603
 Unfoldpp.C:604
 Unfoldpp.C:605
 Unfoldpp.C:606
 Unfoldpp.C:607
 Unfoldpp.C:608
 Unfoldpp.C:609
 Unfoldpp.C:610
 Unfoldpp.C:611
 Unfoldpp.C:612
 Unfoldpp.C:613
 Unfoldpp.C:614
 Unfoldpp.C:615
 Unfoldpp.C:616
 Unfoldpp.C:617
 Unfoldpp.C:618
 Unfoldpp.C:619
 Unfoldpp.C:620
 Unfoldpp.C:621
 Unfoldpp.C:622
 Unfoldpp.C:623
 Unfoldpp.C:624
 Unfoldpp.C:625
 Unfoldpp.C:626
 Unfoldpp.C:627
 Unfoldpp.C:628
 Unfoldpp.C:629
 Unfoldpp.C:630
 Unfoldpp.C:631
 Unfoldpp.C:632
 Unfoldpp.C:633
 Unfoldpp.C:634
 Unfoldpp.C:635
 Unfoldpp.C:636
 Unfoldpp.C:637
 Unfoldpp.C:638
 Unfoldpp.C:639
 Unfoldpp.C:640
 Unfoldpp.C:641
 Unfoldpp.C:642
 Unfoldpp.C:643
 Unfoldpp.C:644
 Unfoldpp.C:645
 Unfoldpp.C:646
 Unfoldpp.C:647
 Unfoldpp.C:648
 Unfoldpp.C:649
 Unfoldpp.C:650
 Unfoldpp.C:651
 Unfoldpp.C:652
 Unfoldpp.C:653
 Unfoldpp.C:654
 Unfoldpp.C:655
 Unfoldpp.C:656
 Unfoldpp.C:657
 Unfoldpp.C:658
 Unfoldpp.C:659
 Unfoldpp.C:660
 Unfoldpp.C:661
 Unfoldpp.C:662
 Unfoldpp.C:663
 Unfoldpp.C:664
 Unfoldpp.C:665
 Unfoldpp.C:666
 Unfoldpp.C:667
 Unfoldpp.C:668
 Unfoldpp.C:669
 Unfoldpp.C:670
 Unfoldpp.C:671
 Unfoldpp.C:672
 Unfoldpp.C:673
 Unfoldpp.C:674
 Unfoldpp.C:675
 Unfoldpp.C:676
 Unfoldpp.C:677
 Unfoldpp.C:678
 Unfoldpp.C:679
 Unfoldpp.C:680
 Unfoldpp.C:681
 Unfoldpp.C:682
 Unfoldpp.C:683
 Unfoldpp.C:684
 Unfoldpp.C:685
 Unfoldpp.C:686
 Unfoldpp.C:687
 Unfoldpp.C:688
 Unfoldpp.C:689
 Unfoldpp.C:690
 Unfoldpp.C:691
 Unfoldpp.C:692
 Unfoldpp.C:693
 Unfoldpp.C:694
 Unfoldpp.C:695
 Unfoldpp.C:696
 Unfoldpp.C:697
 Unfoldpp.C:698
 Unfoldpp.C:699
 Unfoldpp.C:700
 Unfoldpp.C:701
 Unfoldpp.C:702
 Unfoldpp.C:703
 Unfoldpp.C:704
 Unfoldpp.C:705
 Unfoldpp.C:706
 Unfoldpp.C:707
 Unfoldpp.C:708
 Unfoldpp.C:709
 Unfoldpp.C:710
 Unfoldpp.C:711
 Unfoldpp.C:712
 Unfoldpp.C:713
 Unfoldpp.C:714
 Unfoldpp.C:715
 Unfoldpp.C:716
 Unfoldpp.C:717
 Unfoldpp.C:718
 Unfoldpp.C:719
 Unfoldpp.C:720
 Unfoldpp.C:721
 Unfoldpp.C:722
 Unfoldpp.C:723
 Unfoldpp.C:724
 Unfoldpp.C:725
 Unfoldpp.C:726
 Unfoldpp.C:727
 Unfoldpp.C:728
 Unfoldpp.C:729
 Unfoldpp.C:730
 Unfoldpp.C:731
 Unfoldpp.C:732
 Unfoldpp.C:733
 Unfoldpp.C:734
 Unfoldpp.C:735
 Unfoldpp.C:736
 Unfoldpp.C:737
 Unfoldpp.C:738
 Unfoldpp.C:739
 Unfoldpp.C:740
 Unfoldpp.C:741
 Unfoldpp.C:742
 Unfoldpp.C:743
 Unfoldpp.C:744
 Unfoldpp.C:745
 Unfoldpp.C:746
 Unfoldpp.C:747
 Unfoldpp.C:748
 Unfoldpp.C:749
 Unfoldpp.C:750
 Unfoldpp.C:751
 Unfoldpp.C:752
 Unfoldpp.C:753
 Unfoldpp.C:754
 Unfoldpp.C:755
 Unfoldpp.C:756
 Unfoldpp.C:757
 Unfoldpp.C:758
 Unfoldpp.C:759
 Unfoldpp.C:760
 Unfoldpp.C:761
 Unfoldpp.C:762
 Unfoldpp.C:763
 Unfoldpp.C:764
 Unfoldpp.C:765
 Unfoldpp.C:766
 Unfoldpp.C:767
 Unfoldpp.C:768
 Unfoldpp.C:769
 Unfoldpp.C:770
 Unfoldpp.C:771
 Unfoldpp.C:772
 Unfoldpp.C:773
 Unfoldpp.C:774
 Unfoldpp.C:775
 Unfoldpp.C:776
 Unfoldpp.C:777
 Unfoldpp.C:778
 Unfoldpp.C:779
 Unfoldpp.C:780
 Unfoldpp.C:781
 Unfoldpp.C:782
 Unfoldpp.C:783
 Unfoldpp.C:784
 Unfoldpp.C:785
 Unfoldpp.C:786
 Unfoldpp.C:787
 Unfoldpp.C:788
 Unfoldpp.C:789
 Unfoldpp.C:790
 Unfoldpp.C:791
 Unfoldpp.C:792
 Unfoldpp.C:793
 Unfoldpp.C:794
 Unfoldpp.C:795
 Unfoldpp.C:796
 Unfoldpp.C:797
 Unfoldpp.C:798
 Unfoldpp.C:799
 Unfoldpp.C:800
 Unfoldpp.C:801
 Unfoldpp.C:802
 Unfoldpp.C:803
 Unfoldpp.C:804
 Unfoldpp.C:805
 Unfoldpp.C:806
 Unfoldpp.C:807
 Unfoldpp.C:808
 Unfoldpp.C:809
 Unfoldpp.C:810
 Unfoldpp.C:811
 Unfoldpp.C:812
 Unfoldpp.C:813
 Unfoldpp.C:814
 Unfoldpp.C:815
 Unfoldpp.C:816
 Unfoldpp.C:817
 Unfoldpp.C:818
 Unfoldpp.C:819
 Unfoldpp.C:820
 Unfoldpp.C:821
 Unfoldpp.C:822
 Unfoldpp.C:823
 Unfoldpp.C:824
 Unfoldpp.C:825
 Unfoldpp.C:826
 Unfoldpp.C:827
 Unfoldpp.C:828
 Unfoldpp.C:829
 Unfoldpp.C:830
 Unfoldpp.C:831
 Unfoldpp.C:832
 Unfoldpp.C:833
 Unfoldpp.C:834
 Unfoldpp.C:835
 Unfoldpp.C:836
 Unfoldpp.C:837
 Unfoldpp.C:838
 Unfoldpp.C:839
 Unfoldpp.C:840
 Unfoldpp.C:841
 Unfoldpp.C:842
 Unfoldpp.C:843
 Unfoldpp.C:844
 Unfoldpp.C:845
 Unfoldpp.C:846
 Unfoldpp.C:847
 Unfoldpp.C:848
 Unfoldpp.C:849
 Unfoldpp.C:850
 Unfoldpp.C:851
 Unfoldpp.C:852
 Unfoldpp.C:853
 Unfoldpp.C:854
 Unfoldpp.C:855
 Unfoldpp.C:856
 Unfoldpp.C:857
 Unfoldpp.C:858
 Unfoldpp.C:859
 Unfoldpp.C:860
 Unfoldpp.C:861
 Unfoldpp.C:862
 Unfoldpp.C:863
 Unfoldpp.C:864
 Unfoldpp.C:865
 Unfoldpp.C:866
 Unfoldpp.C:867
 Unfoldpp.C:868
 Unfoldpp.C:869
 Unfoldpp.C:870
 Unfoldpp.C:871
 Unfoldpp.C:872
 Unfoldpp.C:873
 Unfoldpp.C:874
 Unfoldpp.C:875
 Unfoldpp.C:876
 Unfoldpp.C:877
 Unfoldpp.C:878
 Unfoldpp.C:879
 Unfoldpp.C:880
 Unfoldpp.C:881
 Unfoldpp.C:882
 Unfoldpp.C:883
 Unfoldpp.C:884
 Unfoldpp.C:885
 Unfoldpp.C:886
 Unfoldpp.C:887
 Unfoldpp.C:888
 Unfoldpp.C:889
 Unfoldpp.C:890
 Unfoldpp.C:891
 Unfoldpp.C:892
 Unfoldpp.C:893
 Unfoldpp.C:894
 Unfoldpp.C:895
 Unfoldpp.C:896
 Unfoldpp.C:897
 Unfoldpp.C:898
 Unfoldpp.C:899
 Unfoldpp.C:900
 Unfoldpp.C:901
 Unfoldpp.C:902
 Unfoldpp.C:903
 Unfoldpp.C:904
 Unfoldpp.C:905
 Unfoldpp.C:906
 Unfoldpp.C:907
 Unfoldpp.C:908
 Unfoldpp.C:909
 Unfoldpp.C:910
 Unfoldpp.C:911
 Unfoldpp.C:912
 Unfoldpp.C:913
 Unfoldpp.C:914
 Unfoldpp.C:915
 Unfoldpp.C:916
 Unfoldpp.C:917
 Unfoldpp.C:918
 Unfoldpp.C:919
 Unfoldpp.C:920
 Unfoldpp.C:921
 Unfoldpp.C:922
 Unfoldpp.C:923
 Unfoldpp.C:924
 Unfoldpp.C:925
 Unfoldpp.C:926
 Unfoldpp.C:927
 Unfoldpp.C:928
 Unfoldpp.C:929
 Unfoldpp.C:930
 Unfoldpp.C:931
 Unfoldpp.C:932
 Unfoldpp.C:933
 Unfoldpp.C:934
 Unfoldpp.C:935
 Unfoldpp.C:936
 Unfoldpp.C:937
 Unfoldpp.C:938
 Unfoldpp.C:939
 Unfoldpp.C:940
 Unfoldpp.C:941
 Unfoldpp.C:942
 Unfoldpp.C:943
 Unfoldpp.C:944
 Unfoldpp.C:945
 Unfoldpp.C:946
 Unfoldpp.C:947
 Unfoldpp.C:948
 Unfoldpp.C:949
 Unfoldpp.C:950
 Unfoldpp.C:951
 Unfoldpp.C:952
 Unfoldpp.C:953
 Unfoldpp.C:954
 Unfoldpp.C:955
 Unfoldpp.C:956
 Unfoldpp.C:957
 Unfoldpp.C:958
 Unfoldpp.C:959
 Unfoldpp.C:960
 Unfoldpp.C:961
 Unfoldpp.C:962
 Unfoldpp.C:963
 Unfoldpp.C:964
 Unfoldpp.C:965
 Unfoldpp.C:966
 Unfoldpp.C:967
 Unfoldpp.C:968
 Unfoldpp.C:969
 Unfoldpp.C:970
 Unfoldpp.C:971
 Unfoldpp.C:972
 Unfoldpp.C:973
 Unfoldpp.C:974
 Unfoldpp.C:975
 Unfoldpp.C:976
 Unfoldpp.C:977
 Unfoldpp.C:978
 Unfoldpp.C:979
 Unfoldpp.C:980
 Unfoldpp.C:981
 Unfoldpp.C:982
 Unfoldpp.C:983
 Unfoldpp.C:984
 Unfoldpp.C:985
 Unfoldpp.C:986
 Unfoldpp.C:987
 Unfoldpp.C:988
 Unfoldpp.C:989
 Unfoldpp.C:990
 Unfoldpp.C:991
 Unfoldpp.C:992
 Unfoldpp.C:993
 Unfoldpp.C:994
 Unfoldpp.C:995
 Unfoldpp.C:996
 Unfoldpp.C:997
 Unfoldpp.C:998
 Unfoldpp.C:999
 Unfoldpp.C:1000
 Unfoldpp.C:1001
 Unfoldpp.C:1002
 Unfoldpp.C:1003
 Unfoldpp.C:1004
 Unfoldpp.C:1005
 Unfoldpp.C:1006
 Unfoldpp.C:1007
 Unfoldpp.C:1008
 Unfoldpp.C:1009
 Unfoldpp.C:1010
 Unfoldpp.C:1011
 Unfoldpp.C:1012
 Unfoldpp.C:1013
 Unfoldpp.C:1014
 Unfoldpp.C:1015
 Unfoldpp.C:1016
 Unfoldpp.C:1017
 Unfoldpp.C:1018
 Unfoldpp.C:1019
 Unfoldpp.C:1020
 Unfoldpp.C:1021
 Unfoldpp.C:1022
 Unfoldpp.C:1023
 Unfoldpp.C:1024
 Unfoldpp.C:1025
 Unfoldpp.C:1026
 Unfoldpp.C:1027
 Unfoldpp.C:1028
 Unfoldpp.C:1029
 Unfoldpp.C:1030
 Unfoldpp.C:1031
 Unfoldpp.C:1032
 Unfoldpp.C:1033
 Unfoldpp.C:1034
 Unfoldpp.C:1035
 Unfoldpp.C:1036
 Unfoldpp.C:1037
 Unfoldpp.C:1038
 Unfoldpp.C:1039
 Unfoldpp.C:1040
 Unfoldpp.C:1041
 Unfoldpp.C:1042
 Unfoldpp.C:1043
 Unfoldpp.C:1044
 Unfoldpp.C:1045
 Unfoldpp.C:1046
 Unfoldpp.C:1047
 Unfoldpp.C:1048
 Unfoldpp.C:1049
 Unfoldpp.C:1050
 Unfoldpp.C:1051
 Unfoldpp.C:1052
 Unfoldpp.C:1053
 Unfoldpp.C:1054
 Unfoldpp.C:1055
 Unfoldpp.C:1056
 Unfoldpp.C:1057
 Unfoldpp.C:1058
 Unfoldpp.C:1059
 Unfoldpp.C:1060
 Unfoldpp.C:1061
 Unfoldpp.C:1062
 Unfoldpp.C:1063
 Unfoldpp.C:1064
 Unfoldpp.C:1065
 Unfoldpp.C:1066
 Unfoldpp.C:1067
 Unfoldpp.C:1068
 Unfoldpp.C:1069
 Unfoldpp.C:1070
 Unfoldpp.C:1071
 Unfoldpp.C:1072
 Unfoldpp.C:1073
 Unfoldpp.C:1074
 Unfoldpp.C:1075
 Unfoldpp.C:1076
 Unfoldpp.C:1077
 Unfoldpp.C:1078
 Unfoldpp.C:1079
 Unfoldpp.C:1080
 Unfoldpp.C:1081
 Unfoldpp.C:1082
 Unfoldpp.C:1083
 Unfoldpp.C:1084
 Unfoldpp.C:1085
 Unfoldpp.C:1086
 Unfoldpp.C:1087
 Unfoldpp.C:1088
 Unfoldpp.C:1089
 Unfoldpp.C:1090
 Unfoldpp.C:1091
 Unfoldpp.C:1092
 Unfoldpp.C:1093
 Unfoldpp.C:1094
 Unfoldpp.C:1095
 Unfoldpp.C:1096
 Unfoldpp.C:1097
 Unfoldpp.C:1098
 Unfoldpp.C:1099
 Unfoldpp.C:1100
 Unfoldpp.C:1101
 Unfoldpp.C:1102
 Unfoldpp.C:1103
 Unfoldpp.C:1104
 Unfoldpp.C:1105
 Unfoldpp.C:1106
 Unfoldpp.C:1107
 Unfoldpp.C:1108
 Unfoldpp.C:1109
 Unfoldpp.C:1110
 Unfoldpp.C:1111
 Unfoldpp.C:1112
 Unfoldpp.C:1113
 Unfoldpp.C:1114
 Unfoldpp.C:1115
 Unfoldpp.C:1116
 Unfoldpp.C:1117
 Unfoldpp.C:1118
 Unfoldpp.C:1119
 Unfoldpp.C:1120
 Unfoldpp.C:1121
 Unfoldpp.C:1122
 Unfoldpp.C:1123
 Unfoldpp.C:1124
 Unfoldpp.C:1125
 Unfoldpp.C:1126
 Unfoldpp.C:1127
 Unfoldpp.C:1128
 Unfoldpp.C:1129
 Unfoldpp.C:1130
 Unfoldpp.C:1131
 Unfoldpp.C:1132
 Unfoldpp.C:1133
 Unfoldpp.C:1134
 Unfoldpp.C:1135
 Unfoldpp.C:1136
 Unfoldpp.C:1137
 Unfoldpp.C:1138
 Unfoldpp.C:1139
 Unfoldpp.C:1140
 Unfoldpp.C:1141
 Unfoldpp.C:1142
 Unfoldpp.C:1143
 Unfoldpp.C:1144
 Unfoldpp.C:1145
 Unfoldpp.C:1146
 Unfoldpp.C:1147
 Unfoldpp.C:1148
 Unfoldpp.C:1149
 Unfoldpp.C:1150
 Unfoldpp.C:1151
 Unfoldpp.C:1152
 Unfoldpp.C:1153
 Unfoldpp.C:1154
 Unfoldpp.C:1155
 Unfoldpp.C:1156
 Unfoldpp.C:1157
 Unfoldpp.C:1158
 Unfoldpp.C:1159
 Unfoldpp.C:1160
 Unfoldpp.C:1161
 Unfoldpp.C:1162
 Unfoldpp.C:1163
 Unfoldpp.C:1164
 Unfoldpp.C:1165
 Unfoldpp.C:1166
 Unfoldpp.C:1167
 Unfoldpp.C:1168
 Unfoldpp.C:1169
 Unfoldpp.C:1170
 Unfoldpp.C:1171
 Unfoldpp.C:1172
 Unfoldpp.C:1173
 Unfoldpp.C:1174
 Unfoldpp.C:1175
 Unfoldpp.C:1176
 Unfoldpp.C:1177
 Unfoldpp.C:1178
 Unfoldpp.C:1179
 Unfoldpp.C:1180
 Unfoldpp.C:1181
 Unfoldpp.C:1182
 Unfoldpp.C:1183
 Unfoldpp.C:1184
 Unfoldpp.C:1185
 Unfoldpp.C:1186
 Unfoldpp.C:1187
 Unfoldpp.C:1188
 Unfoldpp.C:1189
 Unfoldpp.C:1190
 Unfoldpp.C:1191
 Unfoldpp.C:1192
 Unfoldpp.C:1193
 Unfoldpp.C:1194
 Unfoldpp.C:1195
 Unfoldpp.C:1196
 Unfoldpp.C:1197
 Unfoldpp.C:1198
 Unfoldpp.C:1199
 Unfoldpp.C:1200
 Unfoldpp.C:1201
 Unfoldpp.C:1202
 Unfoldpp.C:1203
 Unfoldpp.C:1204
 Unfoldpp.C:1205
 Unfoldpp.C:1206
 Unfoldpp.C:1207
 Unfoldpp.C:1208
 Unfoldpp.C:1209
 Unfoldpp.C:1210
 Unfoldpp.C:1211
 Unfoldpp.C:1212
 Unfoldpp.C:1213
 Unfoldpp.C:1214
 Unfoldpp.C:1215
 Unfoldpp.C:1216
 Unfoldpp.C:1217
 Unfoldpp.C:1218
 Unfoldpp.C:1219
 Unfoldpp.C:1220
 Unfoldpp.C:1221
 Unfoldpp.C:1222
 Unfoldpp.C:1223
 Unfoldpp.C:1224
 Unfoldpp.C:1225
 Unfoldpp.C:1226
 Unfoldpp.C:1227
 Unfoldpp.C:1228
 Unfoldpp.C:1229
 Unfoldpp.C:1230
 Unfoldpp.C:1231
 Unfoldpp.C:1232
 Unfoldpp.C:1233
 Unfoldpp.C:1234
 Unfoldpp.C:1235
 Unfoldpp.C:1236
 Unfoldpp.C:1237
 Unfoldpp.C:1238
 Unfoldpp.C:1239
 Unfoldpp.C:1240
 Unfoldpp.C:1241
 Unfoldpp.C:1242
 Unfoldpp.C:1243
 Unfoldpp.C:1244
 Unfoldpp.C:1245
 Unfoldpp.C:1246
 Unfoldpp.C:1247
 Unfoldpp.C:1248
 Unfoldpp.C:1249
 Unfoldpp.C:1250
 Unfoldpp.C:1251
 Unfoldpp.C:1252
 Unfoldpp.C:1253
 Unfoldpp.C:1254
 Unfoldpp.C:1255
 Unfoldpp.C:1256
 Unfoldpp.C:1257
 Unfoldpp.C:1258
 Unfoldpp.C:1259
 Unfoldpp.C:1260
 Unfoldpp.C:1261
 Unfoldpp.C:1262
 Unfoldpp.C:1263
 Unfoldpp.C:1264
 Unfoldpp.C:1265
 Unfoldpp.C:1266
 Unfoldpp.C:1267
 Unfoldpp.C:1268
 Unfoldpp.C:1269
 Unfoldpp.C:1270
 Unfoldpp.C:1271
 Unfoldpp.C:1272
 Unfoldpp.C:1273
 Unfoldpp.C:1274
 Unfoldpp.C:1275
 Unfoldpp.C:1276
 Unfoldpp.C:1277
 Unfoldpp.C:1278
 Unfoldpp.C:1279
 Unfoldpp.C:1280
 Unfoldpp.C:1281
 Unfoldpp.C:1282
 Unfoldpp.C:1283
 Unfoldpp.C:1284
 Unfoldpp.C:1285
 Unfoldpp.C:1286
 Unfoldpp.C:1287
 Unfoldpp.C:1288
 Unfoldpp.C:1289
 Unfoldpp.C:1290
 Unfoldpp.C:1291
 Unfoldpp.C:1292
 Unfoldpp.C:1293
 Unfoldpp.C:1294
 Unfoldpp.C:1295
 Unfoldpp.C:1296
 Unfoldpp.C:1297
 Unfoldpp.C:1298
 Unfoldpp.C:1299
 Unfoldpp.C:1300
 Unfoldpp.C:1301
 Unfoldpp.C:1302
 Unfoldpp.C:1303
 Unfoldpp.C:1304
 Unfoldpp.C:1305
 Unfoldpp.C:1306
 Unfoldpp.C:1307
 Unfoldpp.C:1308
 Unfoldpp.C:1309
 Unfoldpp.C:1310