Esempio n. 1
0
int main(int argc, char* argv[]) {

  if (argc != 7 && argc != 8) {
    std::cout << "USAGE: ./draw_vs_npv [data_dataset] [mc_SIGNAL_dataset] [mc_BG_dataset] [recoType] [jetAlgo] [norm ('LUMI' or 'SHAPE')] [flags=\"\"]" << std::endl;
    exit(23);
  }

  gROOT->SetBatch();

  std::string data_dataset(argv[1]);
  std::string mc_photonjet(argv[2]);
  std::string mc_QCD(argv[3]);
  std::string recoType(argv[4]);
  std::string jetAlgo(argv[5]);
  std::string norm(argv[6]);
  if (norm != "LUMI" && norm != "SHAPE") {
    std::cout << "'" << norm << "' normalization not implemented yet." << std::endl;
    std::cout << "Only 'LUMI' and 'SHAPE' currently supported." << std::endl;
    std::cout << "Exiting." << std::endl;
    exit(9811);
  }
  std::string flags = "";
  if (argc == 8) {
    std::string flags_str(argv[7]);
    flags = flags_str;
  }


  std::string algoType;
  if (recoType == "calo") {
    algoType = jetAlgo;
  } else {
    algoType = recoType + jetAlgo;
  }
  if (recoType == "jpt" && jetAlgo == "akt4") {
    algoType = "jptak4";
  }

  jetAlgo = (jetAlgo == "ak4") ? "AK4" : "AK8";
  recoType = (recoType == "pf") ? "PFlow" : "Calo";
  std::string postFix = recoType + jetAlgo;

  postFix += "chs";


  //Float_t etamax = 3.;
  //bool sameEvents = false; //until njets histos have no overflows... or maybe use GetEntries instead of integral?

  drawBase* db = new drawBase("PhotonJet", recoType, jetAlgo, OUTPUT_GRAPHS);
  db->set_pdf_aussi((bool)false);
  db->set_flags(flags);
  db->set_isCMSArticle(false);

  std::cout << "flags set." << std::endl;

  TString dataFileName;
  if (flags.length() > 0) {
    dataFileName = TString::Format("PhotonJet_%s_%s_%s.root", data_dataset.c_str(), postFix.c_str(), flags.c_str());
  } else {
    dataFileName = TString::Format("PhotonJet_%s_%s.root", data_dataset.c_str(), postFix.c_str());
  }

  TFile* dataFile = TFile::Open(dataFileName);

  if (dataFile) {
    std::cout << "Opened data file '" << dataFileName << "'." << std::endl;
    db->add_dataFile(dataFile, data_dataset);
  }

  TString mc1FileName;
  if (flags.length() > 0) {
    mc1FileName = TString::Format("PhotonJet_%s_%s_%s.root", mc_photonjet.c_str(), postFix.c_str(), flags.c_str());
  } else {
    mc1FileName = TString::Format("PhotonJet_%s_%s.root", mc_photonjet.c_str(), postFix.c_str());
  }
  TFile* mcPhotonJetFile = TFile::Open(mc1FileName);
  std::cout << "Opened mc file '" << mc1FileName << "'." << std::endl;

  if (mcPhotonJetFile) {
    db->add_mcFile(mcPhotonJetFile, mc_photonjet, "#gamma + jets MC", BALANCING);
  }

  if (mc_QCD != "") {
    TString mc2FileName;
    if (flags.length() > 0) {
      mc2FileName = TString::Format("PhotonJet_%s_%s_%s.root", mc_QCD.c_str(), postFix.c_str(), flags.c_str());
    } else {
      mc2FileName = TString::Format("PhotonJet_%s_%s.root", mc_QCD.c_str(), postFix.c_str());
    }
    TFile* mcQCDFile = TFile::Open(mc2FileName);
    std::cout << "Opened mc file '" << mc2FileName << "'." << std::endl;

    if (mcQCDFile && mc_QCD != mc_photonjet) {
      db->add_mcFile(mcQCDFile, mc_QCD, "QCD MC", MPF);
    }
  }

  // MC should already be normalized to a lumi of 1 pb-1
  // Read luminosity
  double dLumi = 1e6;
  if (dataFile) {
    TParameter<double>* lumi = static_cast<TParameter<double>*>(dataFile->Get("analysis/luminosity"));
    dLumi = lumi->GetVal();
  }

  std::cout<< "Lumi "<< dLumi << std::endl;  

  //  db->set_lumi(dLumi * 1e-6);
  db->set_lumi(dLumi);
  if (norm == "LUMI") {
    db->set_lumiNormalization();
  } else {
    db->set_shapeNormalization();
  }
  
  db->setFolder("analysis");
  std::string outputDir = "PhotonJetPlots_" + db->get_fullSuffix() + "/vs_npv";
  db->set_outputdir(outputDir);
  
  bool log = true;
  gErrorIgnoreLevel = kWarning;
  
  db->setOutputGraphs(OUTPUT_GRAPHS);
  
  VertexBinning vertexBinning;
  std::vector<std::pair<int, int> > vertexBins = vertexBinning.getBinning();
  
  EtaBinning etaBinning;
  size_t etaBinningSize = etaBinning.size();
  
  db->set_rebin(2);
  
  db->setFolder("analysis/vertex");
  for (size_t i = 0; i < etaBinningSize; i++) {
    db->set_legendTitle(etaBinning.getBinTitle(i));
    
    TString responseName = TString::Format("resp_balancing_%s", etaBinning.getBinName(i).c_str());
    db->drawHisto_vs_vertex(vertexBins, responseName.Data(), "Balancing Response", "", "Events", log);
    
    // Raw jets
    //responseName = TString::Format("resp_balancing_raw_%s", etaBinning.getBinName(i).c_str());
    //db->drawHisto_vs_vertex(ptBins, responseName.Data(), "Balancing Response (raw jets)", "", "Events", log);
    
    responseName = TString::Format("resp_mpf_%s", etaBinning.getBinName(i).c_str());
    db->drawHisto_vs_vertex(vertexBins, responseName.Data(), "MPF Response", "", "Events", log);
    
    // Raw jets
    //responseName = TString::Format("resp_mpf_raw_%s", etaBinning.getBinName(i).c_str());
    //db->drawHisto_vs_vertex(ptBins, responseName.Data(), "MPF Response (raw ME_{T})", "", "Events", log);
    
  }
  // Special case eta < 1.3
  
  db->set_legendTitle("|#eta| < 1.3");
  db->drawHisto_vs_vertex(vertexBins, "resp_balancing_eta0013", "Balancing Response", "", "Events", log);
  //db->drawHisto_vs_pt(ptBins, "resp_balancing_raw_eta013", "Balancing Response (raw jets)", "", "Events", log);
  
  db->drawHisto_vs_vertex(vertexBins, "resp_mpf_eta0013", "MPF Response", "", "Events", log);
  //db->drawHisto_vs_vertex(ptBins, "resp_mpf_raw_eta013", "MPF Response (raw ME_{T})", "", "Events", log);
  
  delete db;
  db = NULL;
  
  return 0;
  
}
int main(int argc, char* argv[]) {

  if (argc != 5) {
    std::cout << "USAGE: ./drawPhotonJet [data_dataset] [mc_SIGNAL_dataset] [recoType] [jetAlgo]" << std::endl;
    exit(23);
  }

  std::string data_dataset(argv[1]);
  std::string mc_photonjet(argv[2]);
  std::string recoType(argv[3]);
  std::string jetAlgo(argv[4]);
  recoType = (recoType == "pf") ? "PFlow" : "PUPPI";
  jetAlgo = (jetAlgo == "ak4") ? "AK4" : "AK8";
  std::string postFix = recoType + jetAlgo;
  if(recoType == "PFlow") postFix += "chs";

  TString dataFileName;
  dataFileName = TString::Format("PhotonJet_%s_%s.root", data_dataset.c_str(), postFix.c_str());
  TFile* dataFile = TFile::Open(dataFileName);  
  if (dataFile) {
    std::cout << "Opened data file '" << dataFileName << "'." << std::endl;
  }
  
  TString mc1FileName;
  mc1FileName = TString::Format("PhotonJet_%s_%s.root", mc_photonjet.c_str(), postFix.c_str()); 
  TFile* mcPhotonJetFile = TFile::Open(mc1FileName);
  if (mcPhotonJetFile) {
    std::cout << "Opened mc file '" << mc1FileName << "'." << std::endl;
  }
  
  TString outputDir = TString::Format("PhotonJetPlots_%s_vs_%s_%s_EnergyFractions",data_dataset.c_str(), mc_photonjet.c_str(), postFix.c_str());
  mkdir(outputDir, 0777);
  
  TFile * inputfile;
  TString type;  
  EtaBinning etaBinning;
  size_t etaBinningSize = etaBinning.size() + 1;
  
  for(int ii = 0; ii<2; ii++){
    
    inputfile = (ii == 0) ? mcPhotonJetFile : dataFile; 
    type = (ii == 0) ? "mc" : "data"; 
    
    PtBinning ptBinning;
    std::vector<std::pair<float, float> > ptBins = ptBinning.getBinning();
    size_t ptBinningSize = ptBinning.size();
    std::pair<float, float> currentBin;
    
    TString histoName;
    TString histoName_tmp;
    TH1F *h_tmp;
    TString stackName;

    Float_t dataResponse = 0.;
    Float_t dataResponseErr = 0.;    
    //  Float_t meanTruncFraction = 0.99;
    //  Float_t rmsTruncFraction = 0.99;  
    //  Float_t dataRMS = 0.;
    //  Float_t dataRMSErr = 0.;
    
    Float_t ptphot_bins[ptBinningSize+1];
    TH1F *hCHFrac[etaBinningSize];
    TH1F *hNHFrac[etaBinningSize];
    TH1F *hElFrac[etaBinningSize];
    TH1F *hPhFrac[etaBinningSize];
    TH1F *hMuFrac[etaBinningSize];
    THStack *hsum[etaBinningSize];
    
    for(size_t j = 0; j<ptBinningSize; j++) {
      currentBin = ptBinning.getBinValue(j);
      ptphot_bins[j] = currentBin.first;
      if(j == ptBinningSize-1) ptphot_bins[j+1] = currentBin.second;
    }
    
    for (size_t i = 0; i < etaBinningSize; i++) {
      for(int frac=0; frac<5; frac++) {
	if(i == etaBinningSize-1){
	  if(frac==0){
	    histoName = TString::Format("ChHadronFraction_eta0013");
	    hCHFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  } else if(frac==1){
	    histoName = TString::Format("NHadronFraction_eta0013");
	    hNHFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  } else if(frac==2) {
	    histoName = TString::Format("CEmFraction_eta0013");
	    hElFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  } else if(frac==3) {
	    histoName = TString::Format("NEmFraction_eta0013");
	    hPhFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  } else {
	    histoName = TString::Format("MuFraction_eta0013");
	    hMuFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  }
	}else{
	  if(frac==0){
	    histoName = TString::Format("ChHadronFraction_%s", etaBinning.getBinName(i).c_str());
	    hCHFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  } else if(frac==1){
	    histoName = TString::Format("NHadronFraction_%s", etaBinning.getBinName(i).c_str());
	    hNHFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  } else if(frac==2) {
	    histoName = TString::Format("CEmFraction_%s", etaBinning.getBinName(i).c_str());
	    hElFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  } else if(frac==3) {
	    histoName = TString::Format("NEmFraction_%s", etaBinning.getBinName(i).c_str());
	    hPhFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  } else {
	    histoName = TString::Format("MuFraction_%s", etaBinning.getBinName(i).c_str());
	    hMuFrac[i] = new TH1F(histoName,histoName,ptBinningSize,ptphot_bins);
	  }
	}

	for(size_t j = 0; j<ptBinningSize; j++) {
	  histoName_tmp=histoName;
	  currentBin = ptBinning.getBinValue(j);
	  histoName_tmp.Append(TString::Format("_ptPhot_%i",int(currentBin.first)));
	  histoName_tmp.Append(TString::Format("_%i", int(currentBin.second)));
	  h_tmp=(TH1F*)inputfile->Get("analysis/ecomposition/"+histoName_tmp);
	  //     fitTools::getTruncatedMeanAndRMS(h_tmp, dataResponse, dataResponseErr, dataRMS, dataRMSErr, meanTruncFraction, rmsTruncFraction);
	  dataResponse = h_tmp->GetMean();
	  dataResponseErr = h_tmp->GetMeanError();
	  // dataRMS = h_tmp->GetRMS();
	  // dataRMSErr = h_tmp->GetRMSError();

	  if(frac==0) {
	    hCHFrac[i]->SetBinContent(j+1,dataResponse);
	    hCHFrac[i]->SetBinError(j+1,dataResponseErr);
	  } else if(frac==1) {
	    hNHFrac[i]->SetBinContent(j+1,dataResponse);
	    hNHFrac[i]->SetBinError(j+1,dataResponseErr);
	  } else if(frac==2) {
	    hElFrac[i]->SetBinContent(j+1,dataResponse);
	    hElFrac[i]->SetBinError(j+1,dataResponseErr);
	  } else if(frac==3){
	    hPhFrac[i]->SetBinContent(j+1,dataResponse);
	    hPhFrac[i]->SetBinError(j+1,dataResponseErr);
	  } else {
	    hMuFrac[i]->SetBinContent(j+1,dataResponse);
	    hMuFrac[i]->SetBinError(j+1,dataResponseErr);
	  }	  
	}
      }//loop on frac 
      
      //stack them
      if(i == etaBinningSize-1){
	stackName = TString::Format("JetEnergyComposition_eta0013");
      }else{
	stackName = TString::Format("JetEnergyComposition_%s", etaBinning.getBinName(i).c_str());
      }
      hsum[i] = new THStack(stackName, stackName);
      
      if(type == "mc"){
	hMuFrac[i]->SetFillColor(7);
	hMuFrac[i]->SetFillStyle(1001);
	hElFrac[i]->SetFillColor(4);          
	hElFrac[i]->SetFillStyle(1001);
	hNHFrac[i]->SetFillColor(8);          
	hNHFrac[i]->SetFillStyle(1001);
	hPhFrac[i]->SetFillColor(6);     
	hPhFrac[i]->SetFillStyle(1001);  
	hCHFrac[i]->SetFillColor(2);     
	hCHFrac[i]->SetFillStyle(1001); 
      }else{
	hMuFrac[i]->SetMarkerStyle(29);
	hElFrac[i]->SetMarkerStyle(22);
	hNHFrac[i]->SetMarkerStyle(21);
	hPhFrac[i]->SetMarkerStyle(23);
	hCHFrac[i]->SetMarkerStyle(20);
      }

      hsum[i]->Add(hCHFrac[i]);      
      hsum[i]->Add(hPhFrac[i]);
      hsum[i]->Add(hNHFrac[i]);
      hsum[i]->Add(hElFrac[i]);
      hsum[i]->Add(hMuFrac[i]);     
      
      TCanvas *c = new TCanvas("c","c",600,600);    
      gPad->SetLogx();
      if(type == "mc") {
	hsum[i]->Draw("hist");
      }else{
	hsum[i]->Draw();
      }

      if(pdf_aussi) c->SaveAs(outputDir+"/"+type+"_"+stackName+".pdf");
      c->SaveAs(outputDir+"/"+type+"_"+stackName+".png");
      c->Destructor();
	 
    }// eta bins
 
    TFile out(outputDir+"/"+type+"_EComposition.root","recreate");
    out.cd();
    for (size_t i = 0; i < etaBinningSize; i++) {
      hCHFrac[i]->Write();
      hNHFrac[i]->Write();
      hElFrac[i]->Write();
      hPhFrac[i]->Write();
      hMuFrac[i]->Write();
      hsum[i]->Write();
    }
    out.Close();
  }

  TString dataName;
  dataName = TString::Format(outputDir+"/data_EComposition.root");
  TFile* data = TFile::Open(dataName);
  if (data) {
    std::cout << "Opened data file '" << dataName << "'." << std::endl;
  }
  
  TString mcName;
  mcName = TString::Format(outputDir+"/mc_EComposition.root");  
  TFile* mcFile = TFile::Open(mcName);
  if(mcFile){
    std::cout << "Opened mc file '" << mcName << "'." << std::endl;
  }

  TString histoName;
  THStack *h_data;
  THStack *h_mc;
  TString histoNameEnFrac;
  TH1F *h_dataEnFrac;
  TH1F *h_mcEnFrac;
  
  for (size_t i = 0; i < etaBinningSize; i++) {

    if(i == etaBinningSize-1){
      histoName = TString::Format("JetEnergyComposition_eta0013");
    }else{
      histoName = TString::Format("JetEnergyComposition_%s", etaBinning.getBinName(i).c_str());
    }

    h_data=(THStack*)data->Get(histoName);
    h_mc=(THStack*)mcFile->Get(histoName);

    TLegend *leg = new TLegend(0.20 , 0.1, 0.50, 0.40);

    TCanvas *c = new TCanvas("c","c",800,800);    

    // Data / MC comparison
    TPad* pad_hi = new TPad("pad_hi", "", 0., 0.3333333, 0.99, 0.99);
    pad_hi->SetLogx();
    pad_hi->SetLeftMargin(0.15);
    pad_hi->SetBottomMargin(0.015);
    pad_hi->Draw();
     
    // Data - MC
    TPad* pad_lo = new TPad("pad_lo", "", 0., 0., 0.99, 0.3333333);
    pad_lo->SetGridy();
    pad_lo->SetLogx();
    pad_lo->SetLeftMargin(0.15);
    pad_lo->SetTopMargin(1.);
    pad_lo->SetBottomMargin(0.3);
    pad_lo->Draw();
    ////////////////////////////////////     

    pad_lo->cd();
     
    for(int frac=0; frac<5; frac++) {
      if(i == etaBinningSize-1){
	if(frac==0){
	  histoNameEnFrac = TString::Format("ChHadronFraction_eta0013");
	} else if(frac==1){
	  histoNameEnFrac = TString::Format("NHadronFraction_eta0013");
	} else if(frac==2) {
	  histoNameEnFrac = TString::Format("CEmFraction_eta0013");
	} else if(frac==3) {
	  histoNameEnFrac = TString::Format("NEmFraction_eta0013");
	} else {
	  histoNameEnFrac = TString::Format("MuFraction_eta0013");
	}
      }else{
	if(frac==0){
	  histoNameEnFrac = TString::Format("ChHadronFraction_%s", etaBinning.getBinName(i).c_str());
	} else if(frac==1){
	  histoNameEnFrac = TString::Format("NHadronFraction_%s", etaBinning.getBinName(i).c_str());
	} else if(frac==2) {
	  histoNameEnFrac = TString::Format("CEmFraction_%s", etaBinning.getBinName(i).c_str());
	} else if(frac==3) {
	  histoNameEnFrac = TString::Format("NEmFraction_%s", etaBinning.getBinName(i).c_str());
	} else {
	  histoNameEnFrac = TString::Format("MuFraction_%s", etaBinning.getBinName(i).c_str());
	}
      }
    
      h_dataEnFrac = (TH1F*)data->Get(histoNameEnFrac);
      h_mcEnFrac = (TH1F*)mcFile->Get(histoNameEnFrac);
       
      TH1D *h_diff = (TH1D*)h_dataEnFrac->Clone("h_diff");
      h_diff->Add(h_mcEnFrac, -1);
      h_diff->Scale(100);
      if(frac==0){
	h_diff->GetXaxis()->SetLabelSize(0.085);
	h_diff->GetYaxis()->SetLabelSize(0.07);
	h_diff->GetYaxis()->SetTitleOffset(0.50);
	h_diff->GetXaxis()->SetTitleSize(0.09);
	h_diff->GetYaxis()->SetTitleSize(0.07);	 	 
	h_diff -> SetTitle("");
	h_diff-> GetXaxis()->SetMoreLogLabels();
	h_diff-> GetXaxis()->SetNoExponent();
	h_diff-> GetYaxis()->SetNdivisions(508);
	h_diff -> SetYTitle("Data - MC (%)");
	h_diff -> SetXTitle("p_{T} [GeV]");
	h_diff -> SetStats(kFALSE);
	h_diff -> SetMarkerColor(2);	
	h_diff -> SetLineColor(2);
	h_diff -> GetYaxis()->SetRangeUser(-10., 10.);
	// federico -- da togliere
	h_diff->GetXaxis()-> SetRangeUser(175, 2500);
	h_diff -> Draw();

	leg -> AddEntry(h_diff, "Charged Hadron En. Frac.", "PL");
      }else{
	if(frac==1){
	  h_diff->SetMarkerColor(8);
	  h_diff->SetLineColor(8);
	  leg -> AddEntry(h_diff, "Neutral Hadron En. Frac.", "PL");
	}else if(frac==2){
	  h_diff->SetMarkerColor(4);
	  h_diff->SetLineColor(4);
	  leg -> AddEntry(h_diff, "Charged Electromagnetic En. Frac.", "PL");
	}else if(frac==3){
	  h_diff->SetMarkerColor(6);
	  h_diff->SetLineColor(6);
	  leg -> AddEntry(h_diff, "Neutral Electromagnetic En. Frac.", "PL");
	}else if(frac==4){
	  h_diff->SetMarkerColor(7);
	  h_diff->SetLineColor(7);
	  leg -> AddEntry(h_diff, "Muon En. Frac.", "PL");
	}

	h_diff -> Draw("same");
      }
    }
    

    pad_hi -> cd();  
    h_mc->GetYaxis()->SetTitle("PF Energy Fraction");
    h_mc->GetYaxis()-> SetNdivisions(511);
    h_mc-> GetXaxis()->SetLabelColor(kWhite);
    //federico -- da togliere
    h_mc->GetXaxis()-> SetRangeUser(175, 2500);
    h_mc->Draw("hist");
    h_data->Draw("same");
    leg -> Draw();

    if(pdf_aussi) c->SaveAs(outputDir+"/dataMC_"+histoName+".pdf");
    c->SaveAs(outputDir+"/dataMC_"+histoName+".png");
    c->Destructor();
     
  }// eta bins


}
int main(int argc, char* argv[]) {

  if (argc != 7 && argc != 8) {
    std::cout << "USAGE: ./drawPhotonJet [data_dataset] [mc_SIGNAL_dataset] [mc_BG_dataset] [recoType] [jetAlgo]" << std::endl;
    exit(23);
  }

  setPrettyStyle();

  std::string data_dataset(argv[1]);
  std::string mc_photonjet(argv[2]);
  std::string mc_QCD(argv[3]);
  std::string recoType(argv[4]);
  std::string jetAlgo(argv[5]);

  std::string algoType;
  if (recoType == "calo") {
    algoType = jetAlgo;
  } else {
    algoType = recoType + jetAlgo;
  }
  if (recoType == "jpt" && jetAlgo == "akt5") {
    algoType = "jptak5";
  }

  std::string flags = "";

  jetAlgo = (jetAlgo == "ak5") ? "AK5" : "AK7";
  recoType = (recoType == "pf") ? "PFlow" : "Calo";
  std::string postFix = recoType + jetAlgo;

  postFix += "chs";

  TString dataFileName;
  if (flags.length() > 0) {
    dataFileName = TString::Format("PhotonJet_%s_%s_%s.root", data_dataset.c_str(), postFix.c_str(), flags.c_str());
  } else {
    dataFileName = TString::Format("PhotonJet_%s_%s.root", data_dataset.c_str(), postFix.c_str());
  }

  TFile* dataFile = TFile::Open(dataFileName);
  std::cout << "Opened data file '" << dataFileName << "'." << std::endl;

  //db->add_dataFile(dataFile, data_dataset);

  TString mc1FileName;
  if (flags.length() > 0) {
    mc1FileName = TString::Format("PhotonJet_%s_%s_%s.root", mc_photonjet.c_str(), postFix.c_str(), flags.c_str());
  } else {
    mc1FileName = TString::Format("PhotonJet_%s_%s.root", mc_photonjet.c_str(), postFix.c_str());
  }

  TFile* mcPhotonJetFile = TFile::Open(mc1FileName);
  std::cout << "Opened mc file '" << mc1FileName << "'." << std::endl;

  if (mcPhotonJetFile) {
    //db->add_mcFile(mcPhotonJetFile, mc_photonjet, "#gamma+jet MC", 46);
  }

  if (mc_QCD != "") {
    TString mc2FileName;
    if (flags.length() > 0) {
      mc2FileName = TString::Format("PhotonJet_%s_%s_%s.root", mc_QCD.c_str(), postFix.c_str(), flags.c_str());
    } else {
      mc2FileName = TString::Format("PhotonJet_%s_%s.root", mc_QCD.c_str(), postFix.c_str());
    }
    TFile* mcQCDFile = TFile::Open(mc2FileName);
    std::cout << "Opened mc file '" << mc2FileName << "'." << std::endl;

    if (mcQCDFile && mc_QCD != mc_photonjet) {
      //db->add_mcFile(mcQCDFile, mc_QCD, "QCD MC", 38);
    }
  }

  // Create output directory
  mkdir("plots", 0755);

  TString directoryName = "";
  
  if (mc_QCD.length() == 0)
    directoryName = TString::Format("plots/%s_vs_%s_%s", data_dataset.c_str(), mc_photonjet.c_str(), postFix.c_str());
  else
    directoryName = TString::Format("plots/%s_vs_%s_plus_%s_%s", data_dataset.c_str(), mc_photonjet.c_str(), mc_QCD.c_str(), postFix.c_str());
  mkdir(directoryName, 0755);

  directoryName = TString::Format("%s/extrapolation", directoryName.Data());
  mkdir(directoryName, 0755);

  TParameter<double>* pLumi = static_cast<TParameter<double>*>(dataFile->Get("analysis/luminosity"));
  double lumi = pLumi->GetVal() * 1e-9;

  //bool log = true;
  gErrorIgnoreLevel = kWarning;

  EtaBinning etaBinning;
  size_t etaBinningSize = etaBinning.size();

  TString rootFolder = "analysis/new_extrapolation";
  for (size_t i = 0; i < etaBinningSize; i++) {

    const std::string& etaName = etaBinning.getBinName(i);
    std::cout << "Processing " << etaName << std::endl;
    
    TString responseName = TString::Format("%s/extrap_resp_balancing_%s_graph", rootFolder.Data(), etaName.c_str());
    TString outputName = TString::Format("%s/extrap_resp_balancing_%s.pdf", directoryName.Data(), etaName.c_str());
    TGraphErrors* data = (TGraphErrors*) dataFile->Get(responseName);
    TGraphErrors* mc = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawGraphs(data, mc, "Balancing", "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response", etaBinning.getBinTitle(i), lumi, outputName.Data());

    // Raw jets
    responseName = TString::Format("%s/extrap_resp_balancing_raw_%s_graph", rootFolder.Data(), etaName.c_str());
    outputName = TString::Format("%s/extrap_resp_balancing_raw_%s.pdf", directoryName.Data(), etaName.c_str());
    data = (TGraphErrors*) dataFile->Get(responseName);
    mc = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawGraphs(data, mc, "Balancing", "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response (raw jets)", etaBinning.getBinTitle(i), lumi, outputName.Data());

    responseName = TString::Format("%s/extrap_resp_mpf_%s_graph", rootFolder.Data(), etaName.c_str());
    outputName = TString::Format("%s/extrap_resp_mpf_%s.pdf", directoryName.Data(), etaName.c_str());
    data = (TGraphErrors*) dataFile->Get(responseName);
    mc = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawGraphs(data, mc, "MPF", "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response", etaBinning.getBinTitle(i), lumi, outputName.Data());

    // Raw jets
    responseName = TString::Format("%s/extrap_resp_mpf_raw_%s_graph", rootFolder.Data(), etaName.c_str());
    outputName = TString::Format("%s/extrap_resp_mpf_raw_%s.pdf", directoryName.Data(), etaName.c_str());
    data = (TGraphErrors*) dataFile->Get(responseName);
    mc = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawGraphs(data, mc, "MPF", "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response (raw #slashed{E_{t}})", etaBinning.getBinTitle(i), lumi, outputName.Data());
  }
  // Special case eta < 1.3
  {
    const std::string& etaName = "eta013";
    std::cout << "Processing " << etaName << std::endl;
    
    TString responseName = TString::Format("%s/extrap_resp_balancing_%s_graph", rootFolder.Data(), etaName.c_str());
    TString outputName = TString::Format("%s/extrap_resp_balancing_%s.pdf", directoryName.Data(), etaName.c_str());
    TGraphErrors* data = (TGraphErrors*) dataFile->Get(responseName);
    TGraphErrors* mc = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawGraphs(data, mc, "Balancing", "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response", "#eta #leq 1.3", lumi, outputName.Data());

    // Raw jets
    responseName = TString::Format("%s/extrap_resp_balancing_raw_%s_graph", rootFolder.Data(), etaName.c_str());
    outputName = TString::Format("%s/extrap_resp_balancing_raw_%s.pdf", directoryName.Data(), etaName.c_str());
    data = (TGraphErrors*) dataFile->Get(responseName);
    mc = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawGraphs(data, mc, "Balancing", "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response (raw jets)", "#eta #leq 1.3", lumi, outputName.Data());

    responseName = TString::Format("%s/extrap_resp_mpf_%s_graph", rootFolder.Data(), etaName.c_str());
    outputName = TString::Format("%s/extrap_resp_mpf_%s.pdf", directoryName.Data(), etaName.c_str());
    data = (TGraphErrors*) dataFile->Get(responseName);
    mc = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawGraphs(data, mc, "MPF", "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response", "#eta #leq 1.3", lumi, outputName.Data());

    // Raw jets
    responseName = TString::Format("%s/extrap_resp_mpf_raw_%s_graph", rootFolder.Data(), etaName.c_str());
    outputName = TString::Format("%s/extrap_resp_mpf_raw_%s.pdf", directoryName.Data(), etaName.c_str());
    data = (TGraphErrors*) dataFile->Get(responseName);
    mc = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawGraphs(data, mc, "MPF", "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response (raw #slashed{E_{t}})", "#eta #leq 1.3", lumi, outputName.Data());
  }

  //db->set_legendTitle("|#eta| < 1.3");
  //db->drawHisto_vs_pt(ptBins, "resp_mpf_eta013", "MPF Response", "", "Events", log);
  //db->drawHisto_vs_pt(ptBins, "resp_mpf_raw_eta013", "MPF Response (raw ME_{T})", "", "Events", log);
  for (size_t i = 0; i < etaBinningSize; i++) {

    const std::string& etaName = etaBinning.getBinName(i);
    std::cout << "Processing " << etaName << std::endl;
    
    TString responseName = TString::Format("%s/extrap_resp_balancing_%s_graph", rootFolder.Data(), etaName.c_str());
    TString outputName = TString::Format("%s/extrap_resp_combined_%s", directoryName.Data(), etaName.c_str());
    TGraphErrors* balancingData = (TGraphErrors*) dataFile->Get(responseName);
    TGraphErrors* balancingMC = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    responseName = TString::Format("%s/extrap_resp_mpf_%s_graph", rootFolder.Data(), etaName.c_str());
    TGraphErrors* mpfData = (TGraphErrors*) dataFile->Get(responseName);
    TGraphErrors* mpfMC = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawCombinedGraphs(balancingData, balancingMC, mpfData, mpfMC, "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response", etaBinning.getBinTitle(i), lumi, outputName.Data());

    responseName = TString::Format("%s/extrap_resp_balancing_raw_%s_graph", rootFolder.Data(), etaName.c_str());
    outputName = TString::Format("%s/extrap_resp_combined_raw_%s", directoryName.Data(), etaName.c_str());
    balancingData = (TGraphErrors*) dataFile->Get(responseName);
    balancingMC = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    responseName = TString::Format("%s/extrap_resp_mpf_raw_%s_graph", rootFolder.Data(), etaName.c_str());
    mpfData = (TGraphErrors*) dataFile->Get(responseName);
    mpfMC = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawCombinedGraphs(balancingData, balancingMC, mpfData, mpfMC, "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response (raw objects)", etaBinning.getBinTitle(i), lumi, outputName.Data());

  }

  // Eta < 1.3
  {
    const std::string& etaName = "eta013";
    std::cout << "Processing " << etaName << std::endl;
    
    TString responseName = TString::Format("%s/extrap_resp_balancing_%s_graph", rootFolder.Data(), etaName.c_str());
    TString outputName = TString::Format("%s/extrap_resp_combined_%s", directoryName.Data(), etaName.c_str());
    TGraphErrors* balancingData = (TGraphErrors*) dataFile->Get(responseName);
    TGraphErrors* balancingMC = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    responseName = TString::Format("%s/extrap_resp_mpf_%s_graph", rootFolder.Data(), etaName.c_str());
    TGraphErrors* mpfData = (TGraphErrors*) dataFile->Get(responseName);
    TGraphErrors* mpfMC = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawCombinedGraphs(balancingData, balancingMC, mpfData, mpfMC, "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response", "#eta #leq 1.3", lumi, outputName.Data());

    responseName = TString::Format("%s/extrap_resp_balancing_raw_%s_graph", rootFolder.Data(), etaName.c_str());
    outputName = TString::Format("%s/extrap_resp_combined_raw_%s", directoryName.Data(), etaName.c_str());
    balancingData = (TGraphErrors*) dataFile->Get(responseName);
    balancingMC = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    responseName = TString::Format("%s/extrap_resp_mpf_raw_%s_graph", rootFolder.Data(), etaName.c_str());
    mpfData = (TGraphErrors*) dataFile->Get(responseName);
    mpfMC = (TGraphErrors*) mcPhotonJetFile->Get(responseName);

    drawCombinedGraphs(balancingData, balancingMC, mpfData, mpfMC, "p_{t}^{2^{nd} jet} / p_{t}^{#gamma}", "Jet response (raw objects)", "#eta #leq 1.3", lumi, outputName.Data());
  }

  return 0;
}