void ProduceElectronEfficiencyPlots(const string inputfile, int wp, int option = -1, string label = "") {
 
  string Label = "";
  if (label != "") Label = "_" + label;

  //--------------------------------------------------------------------------------------------------------------
  // Settings 
  //============================================================================================================== 
  bool printdebug = false;


  //*****************************************************************************************
  //Make some histograms
  //*****************************************************************************************
  TH1F *histDenominatorPt = new TH1F ("histDenominatorPt",";Electron p_{T} [GeV/c^{2}]; Number of Events", 50, 0 , 100);
  TH1F *histNumeratorPt = new TH1F ("histNumeratorPt",";Electron p_{T} [GeV/c^{2}]; Number of Events", 50, 0 , 100);
  TH1F *histDenominatorEta = new TH1F ("histDenominatorEta",";Electron Eta; Number of Events", 50, -2.5 , 2.5);
  TH1F *histNumeratorEta = new TH1F ("histNumeratorEta",";Electron Eta; Number of Events", 50, -2.5 , 2.5);
  TH1F *histDenominatorPhi = new TH1F ("histDenominatorPhi",";Electron Phi; Number of Events", 50, 0 , 3.2);
  TH1F *histNumeratorPhi = new TH1F ("histNumeratorPhi",";Electron Phi; Number of Events", 50, 0 , 3.2);
  TH1F *histDenominatorRho = new TH1F ("histDenominatorRho",";Electron Rho; Number of Events", 50, 0 , 100);
  TH1F *histNumeratorRho = new TH1F ("histNumeratorRho",";Electron Rho; Number of Events", 50, 0 , 100);
  TH1F *histDenominatorNpv = new TH1F ("histDenominatorNpv",";Electron Npv; Number of Events", 50, 0 , 100);
  TH1F *histNumeratorNpv = new TH1F ("histNumeratorNpv",";Electron Npv; Number of Events", 50, 0 , 100);
  TH1F *histDenominatorNpu = new TH1F ("histDenominatorNpu",";Electron Npu; Number of Events", 50, 0 , 100);
  TH1F *histNumeratorNpu = new TH1F ("histNumeratorNpu",";Electron Npu; Number of Events", 50, 0 , 100);

  TH2F *histDenominatorPtEta = new TH2F ("histDenominatorPtEta",";Photon p_{T} [GeV/c] ; Photon #eta; Number of Events", 50, 0 , 200, 50, -3.0, 3.0);
  TH2F *histNumeratorPtEta = new TH2F ("histNumeratorPtEta",";Photon p_{T} [GeV/c] ; Photon #eta; Number of Events", 50, 0 , 200, 50, -3.0, 3.0);

  //*******************************************************************************************
  //Read file
  //*******************************************************************************************                
  ElectronTree *EleTree = new ElectronTree;
  EleTree->LoadTree(inputfile.c_str());
  EleTree->InitTree(ElectronTree::kEleTreeLight);

  cout << "Total Entries: " << EleTree->tree_->GetEntries() << "\n";
  int nentries = EleTree->tree_->GetEntries();
  for(UInt_t ientry=0; ientry < EleTree->tree_->GetEntries(); ientry++) {       	
    EleTree->tree_->GetEntry(ientry);

    if (ientry % 100000 == 0) cout << "Event " << ientry << endl;

    //Cuts
    if (EleTree->fEleGenPt < 5) continue;
    if (abs(EleTree->fEleGenEta) > 2.4) continue;

    //if (!(EleTree->fElePt > 5)) continue;
    //if (option == 1 && !passPreselection(EleTree)) continue;

    //for isolation efficiency, require that it passes ID first
    if (wp == 11) {
      if (!passIDMVANonTrigVeto(EleTree)) continue;
    }

    //for trigger require pass Tight
    if (wp >= 100) {
      if (!(EleTree->fPassTightSelection)) continue;
    }


    if (option == 0) {
      //**** PT - ETA ****
      histDenominatorPtEta->Fill(EleTree->fEleGenPt,EleTree->fEleGenEta);
      if(PassSelection(EleTree,wp)) {
	histNumeratorPtEta->Fill(EleTree->fEleGenPt,EleTree->fEleGenEta);
      }


      //**** PT ****
      histDenominatorPt->Fill(EleTree->fEleGenPt);

      //Numerator
      if(PassSelection(EleTree,wp)) {
        histNumeratorPt->Fill(EleTree->fEleGenPt);        
      }


      //**** Eta ****
      if (fabs(EleTree->fEleGenPt) > 30) {
	histDenominatorEta->Fill(EleTree->fEleGenEta);

	//Numerator
	if(PassSelection(EleTree,wp)) {
	  histNumeratorEta->Fill(EleTree->fEleGenEta);        
	}

      }

      //**** Phi ****
      if (fabs(EleTree->fEleGenEta) < 2.4) {
	histDenominatorPhi->Fill(EleTree->fEleGenPhi);

	//Numerator
	if(PassSelection(EleTree,wp)) {
	  histNumeratorPhi->Fill(EleTree->fEleGenPhi);        
	}

      }

      //**** Rho ****
      if (fabs(EleTree->fEleGenEta) < 2.4) {
	histDenominatorRho->Fill(EleTree->fRho);

	//Numerator
	if(PassSelection(EleTree,wp)) {
	  histNumeratorRho->Fill(EleTree->fRho);        
	}

      }
      //**** Npv ****
      if (fabs(EleTree->fEleGenEta) < 2.4) {
	histDenominatorNpv->Fill(EleTree->fNVertices);

	//Numerator
	if(PassSelection(EleTree,wp)) {
	  histNumeratorNpv->Fill(EleTree->fNVertices);        
	}

      }

      // //**** Npu ****
      // if (fabs(EleTree->fEleGenEta) < 2.4) {
      //   histDenominatorNpu->Fill(EleTree->);

      //   //Numerator
      //   if(PassSelection(EleTree,wp)) {
      //     histNumeratorNpu->Fill(EleTree->);        
      //   }

      // }
    }

    if (option == 1) {

      if (!(EleTree->fElePt > 0)) continue;

      //**** PT - ETA ****
      histDenominatorPtEta->Fill(EleTree->fElePt,EleTree->fEleEta);
      if(PassSelection(EleTree,wp)) {
	histNumeratorPtEta->Fill(EleTree->fElePt,EleTree->fEleEta);
      }


      //**** PT ****
      histDenominatorPt->Fill(EleTree->fElePt);

      //Numerator
      if(PassSelection(EleTree,wp)) {
        histNumeratorPt->Fill(EleTree->fElePt);        
      }


      //**** Eta ****
      if (fabs(EleTree->fElePt) > 30) {
	histDenominatorEta->Fill(EleTree->fEleEta);

	//Numerator
	if(PassSelection(EleTree,wp)) {
	  histNumeratorEta->Fill(EleTree->fEleEta);        
	}

      }

      //**** Phi ****
      if (fabs(EleTree->fEleEta) < 2.4) {
	histDenominatorPhi->Fill(EleTree->fElePhi);

	//Numerator
	if(PassSelection(EleTree,wp)) {
	  histNumeratorPhi->Fill(EleTree->fElePhi);        
	}

      }

      //**** Rho ****
      if (fabs(EleTree->fEleEta) < 2.4) {
	histDenominatorRho->Fill(EleTree->fRho);

	//Numerator
	if(PassSelection(EleTree,wp)) {
	  histNumeratorRho->Fill(EleTree->fRho);        
	}

      }
      //**** Npv ****
      if (fabs(EleTree->fEleEta) < 2.4) {
	histDenominatorNpv->Fill(EleTree->fNVertices);

	//Numerator
	if(PassSelection(EleTree,wp)) {
	  histNumeratorNpv->Fill(EleTree->fNVertices);        
	}

      }

      // //**** Npu ****
      // if (fabs(EleTree->fEleEta) < 2.4) {
      //   histDenominatorNpu->Fill(EleTree->);

      //   //Numerator
      //   if(PassSelection(EleTree,wp)) {
      //     histNumeratorNpu->Fill(EleTree->);        
      //   }

      // }
    }


  }


  //--------------------------------------------------------------------------------------------------------------
  // Make Efficiency Plots
  //==============================================================================================================

  TGraphAsymmErrors *efficiency_pt = createEfficiencyGraph(histNumeratorPt, histDenominatorPt, "Efficiency_Pt" , vector<double>() ,  -99, -99, 0, 1);
  TGraphAsymmErrors *efficiency_eta = createEfficiencyGraph(histNumeratorEta, histDenominatorEta, "Efficiency_Eta" , vector<double>() ,  -99, -99, 0, 1);
  TGraphAsymmErrors *efficiency_phi = createEfficiencyGraph(histNumeratorPhi, histDenominatorPhi, "Efficiency_Phi" , vector<double>() ,  -99, -99, 0, 1);
  TGraphAsymmErrors *efficiency_rho = createEfficiencyGraph(histNumeratorRho, histDenominatorRho, "Efficiency_Rho" , vector<double>() ,  -99, -99, 0, 1);
  TGraphAsymmErrors *efficiency_npv = createEfficiencyGraph(histNumeratorNpv, histDenominatorNpv, "Efficiency_Npv" , vector<double>() ,  -99, -99, 0, 1);
  TGraphAsymmErrors *efficiency_npu = createEfficiencyGraph(histNumeratorNpu, histDenominatorNpu, "Efficiency_Npu" , vector<double>() ,  -99, -99, 0, 1);  
  TH2F *efficiency_pteta = createEfficiencyHist2D(histNumeratorPtEta, histDenominatorPtEta, "Efficiency_PtEta" , vector<double>() ,vector<double>());  


  //--------------------------------------------------------------------------------------------------------------
  // Draw
  //==============================================================================================================
  TCanvas *cv =0;

  cv = new TCanvas("cv","cv",800,600);
  efficiency_pt->Draw("AP");
  efficiency_pt->SetTitle("");
  efficiency_pt->GetYaxis()->SetRangeUser(0.0,1.0);
  efficiency_pt->GetXaxis()->SetTitle("Electron p_{T} [GeV/c]");
  efficiency_pt->GetYaxis()->SetTitle("Efficiency");
  efficiency_pt->GetYaxis()->SetTitleOffset(1.2);
  efficiency_pt->SetLineWidth(3);  
  cv->SaveAs(("Efficiency"+Label+"_Pt.gif").c_str());

  cv = new TCanvas("cv","cv",800,600);
  efficiency_eta->Draw("AP");
  efficiency_eta->SetTitle("");
  efficiency_eta->GetYaxis()->SetRangeUser(0.0,1.0);
  efficiency_eta->GetXaxis()->SetTitle("Electron #eta");
  efficiency_eta->GetYaxis()->SetTitle("Efficiency");
  efficiency_eta->GetYaxis()->SetTitleOffset(1.2);
  efficiency_eta->SetLineWidth(3);  
  cv->SaveAs(("Efficiency"+Label+"_Eta.gif").c_str());

  cv = new TCanvas("cv","cv",800,600);
  efficiency_phi->Draw("AP");
  efficiency_phi->SetTitle("");
  efficiency_phi->GetYaxis()->SetRangeUser(0.0,1.0);
  efficiency_phi->GetXaxis()->SetTitle("Electron #phi");
  efficiency_phi->GetYaxis()->SetTitle("Efficiency");
  efficiency_phi->GetYaxis()->SetTitleOffset(1.2);
  cv->SaveAs(("Efficiency"+Label+"_Phi.gif").c_str());

  cv = new TCanvas("cv","cv",800,600);
  efficiency_rho->Draw("AP");
  efficiency_rho->SetTitle("");
  efficiency_rho->GetYaxis()->SetRangeUser(0.0,1.0);
  efficiency_rho->GetXaxis()->SetTitle("#rho");
  efficiency_rho->GetYaxis()->SetTitle("Efficiency");
  efficiency_rho->GetYaxis()->SetTitleOffset(1.2);
  cv->SaveAs(("Efficiency"+Label+"_Rho.gif").c_str());

  cv = new TCanvas("cv","cv",800,600);
  efficiency_npv->Draw("AP");
  efficiency_npv->SetTitle("");
  efficiency_npv->GetYaxis()->SetRangeUser(0.0,1.0);
  efficiency_npv->GetXaxis()->SetTitle("Number of Reconstructed Primary Vertices");
  efficiency_npv->GetYaxis()->SetTitle("Efficiency");
  efficiency_npv->GetYaxis()->SetTitleOffset(1.2);
  efficiency_npv->SetLineWidth(3);  
  efficiency_npv->GetXaxis()->SetRangeUser(0,40);
  cv->SaveAs(("Efficiency"+Label+"_Npv.gif").c_str());

  cv = new TCanvas("cv","cv",800,600);
  efficiency_npu->Draw("AP");
  efficiency_npu->SetTitle("");
  efficiency_npu->GetYaxis()->SetRangeUser(0.0,1.0);
  efficiency_npu->GetXaxis()->SetTitle("Number of Pileup Interactions");
  efficiency_npu->GetYaxis()->SetTitle("Efficiency");
  efficiency_npu->GetYaxis()->SetTitleOffset(1.2);
  cv->SaveAs(("Efficiency"+Label+"_Npu.gif").c_str());


  //--------------------------------------------------------------------------------------------------------------
  // Output
  //==============================================================================================================
  TFile *file = TFile::Open(("Efficiency"+Label+".root").c_str(), "UPDATE");
  file->cd();
  file->WriteTObject(efficiency_pt, "Efficiency_Pt", "WriteDelete");
  file->WriteTObject(efficiency_eta, "Efficiency_Eta", "WriteDelete");
  file->WriteTObject(efficiency_phi, "Efficiency_Phi", "WriteDelete");
  file->WriteTObject(efficiency_rho, "Efficiency_Rho", "WriteDelete");
  file->WriteTObject(efficiency_npv, "Efficiency_NPV", "WriteDelete");
  file->WriteTObject(efficiency_npu, "Efficiency_NPU", "WriteDelete");
  file->WriteTObject(efficiency_pteta, "Efficiency_PtEta", "WriteDelete");

  file->Close();
  delete file;       

}
//*************************************************************************************************
//Fill Lepton Pt Spectrum
//*************************************************************************************************
void MakeElectronIDMVAPerformancePlots(string InputFile, string Label, Int_t Option)
{  

  string label = "";
  if (Label != "") label = "_" + Label;


  //*****************************************************************************************
  //Plotting Setup
  //*****************************************************************************************
//   vector<Int_t> markers;
//   vector<Int_t> colors;
//   colors.push_back(kRed);     markers.push_back(20);
//   colors.push_back(kCyan);    markers.push_back(21);
// //   colors.push_back(kBlue);    markers.push_back(21);
//   colors.push_back(kMagenta); markers.push_back(22);
//   colors.push_back(kCyan);    markers.push_back(34);
//   colors.push_back(kBlack);   markers.push_back(29);
//   colors.push_back(kGreen);   markers.push_back(33);
//   colors.push_back(kRed-2);   markers.push_back(33);
//   colors.push_back(kOrange);   markers.push_back(33);
//   colors.push_back(kBlue-2);   markers.push_back(33);
//   colors.push_back(kGreen-2);   markers.push_back(33);
//   colors.push_back(kMagenta-2);   markers.push_back(33);


  //--------------------------------------------------------------------------------------------------------------
  // Histograms
  //==============================================================================================================  
  TH1F *EleIDMVATrig_Real = new TH1F(("EleIDMVATrig_Real"+label).c_str(), "; IDMVATrig ; Number of Events ",  10000, -2 , 2);
  TH1F *EleIDMVANonTrig_Real = new TH1F(("EleIDMVANonTrig_Real"+label).c_str(), "; IDMVANonTrig ; Number of Events ",  10000, -2 , 2);
  TH1F *EleIDMVATrig_Fake = new TH1F(("EleIDMVATrig_Fake"+label).c_str(), "; IDMVATrig ; Number of Events ",  10000, -2 , 2);
  TH1F *EleIDMVANonTrig_Fake = new TH1F(("EleIDMVANonTrig_Fake"+label).c_str(), "; IDMVANonTrig ; Number of Events ",  10000, -2 , 2);

  Double_t RealElectrons = 0;
  Double_t FakeElectrons = 0;
  Double_t RealElectronPassCSA14Tight = 0;
  Double_t FakeElectronPassCSA14Tight = 0;
  Double_t RealElectronPassCSA14Loose = 0;
  Double_t FakeElectronPassCSA14Loose = 0;
  Double_t RealElectronPassCSA14Veto = 0;
  Double_t FakeElectronPassCSA14Veto = 0;

  Double_t RealElectronPassIDMVANonTrigVeto = 0;
  Double_t FakeElectronPassIDMVANonTrigVeto = 0;
  Double_t RealElectronPassIDMVATrigTight = 0;
  Double_t FakeElectronPassIDMVATrigTight = 0;

  //*****************************************************************************************
  //EleTree
  //*****************************************************************************************
  ElectronTree *EleTree = new ElectronTree;
  EleTree->LoadTree(InputFile.c_str());
  EleTree->InitTree(ElectronTree::kEleTreeLight);

  cout << "Total Entries: " << EleTree->tree_->GetEntries() << "\n";
  int nentries = EleTree->tree_->GetEntries();
  nentries = 5000000;
  for(UInt_t ientry=0; ientry < EleTree->tree_->GetEntries(); ientry++) {       	
    EleTree->tree_->GetEntry(ientry);
    
    if (ientry % 100000 == 0) cout << "Event " << ientry << endl;
        
    
    if (abs(EleTree->fPdgId) == 11 && RealElectrons >= nentries) continue;
    if ( (abs(EleTree->fPdgId) > 50 || EleTree->fPdgId == 0) && FakeElectrons >= nentries) continue;

    //don't evaluate performance using training events
    if (EleTree->fElePt < 5) continue;


    //classify by eta and pt bins
    Int_t subdet = 0;
    if (fabs(EleTree->fEleEta) < 1.485) subdet = 0;
    else subdet = 1;

    Int_t ptBin = 0;
    if (EleTree->fElePt > 10.0) ptBin = 1;
    if (EleTree->fElePt > 20.0) ptBin = 2;

    Bool_t passCuts = kFALSE;
    if (Option == 0) passCuts = (subdet == 0 && ptBin == 0);
    if (Option == 1) passCuts = (subdet == 1 && ptBin == 0);
    if (Option == 2) passCuts = (subdet == 0 && ptBin == 1);
    if (Option == 3) passCuts = (subdet == 1 && ptBin == 1);    
    if (Option == 4) passCuts = (subdet == 0 && ptBin == 2);
    if (Option == 5) passCuts = (subdet == 1 && ptBin == 2);    
    if (Option == 10) passCuts = (ptBin == 0 );

    if (Option == -1) passCuts = kTRUE;
    if (!passCuts) continue;    


    //Some Preselection cuts
    //if (!passCSA14Preselection(EleTree)) continue;
    //if (!EleTree->fElePassConversion) continue;
    if (!(fabs(EleTree->fEleDZ) < 1)) continue;
    //if (!(EleTree->fElePFIso04 < 0.2)) continue;
    if (!passImprovedIso(EleTree)) continue;
    //if (!(fabs(EleTree->fEleD0) < 0.0166)) continue;

    //Real Electron
    if (abs(EleTree->fPdgId) == 11) {
      RealElectrons += EleTree->fWeight;
      if (passCSA14Tight(EleTree)) RealElectronPassCSA14Tight += EleTree->fWeight;
      if (passCSA14Loose(EleTree)) RealElectronPassCSA14Loose += EleTree->fWeight;
      if (passCSA14Veto(EleTree)) RealElectronPassCSA14Veto += EleTree->fWeight;
      if (passIDMVANonTrigVeto(EleTree)) RealElectronPassIDMVANonTrigVeto += EleTree->fWeight;
      if (passIDMVATrigTight(EleTree)) RealElectronPassIDMVATrigTight += EleTree->fWeight;      

      if ( EleTree->fElePFIso04 < 0.2 ) {
	EleIDMVATrig_Real->Fill(EleTree->fIDMVATrig, EleTree->fWeight);
      } else {
	EleIDMVATrig_Real->Fill(-1, EleTree->fWeight);
      }

      if ( EleTree->fElePFIso04 < 99 &&  
	   ( (fabs(EleTree->fEleSCEta) < 1.479 && fabs(EleTree->fEleD0) < 0.0166)
	     ||
	     (fabs(EleTree->fEleSCEta) >= 1.479 && fabs(EleTree->fEleD0) < 0.098)
	     )
	   ) {
	EleIDMVANonTrig_Real->Fill(EleTree->fIDMVANonTrig, EleTree->fWeight);
      } else {
	EleIDMVANonTrig_Real->Fill(-1, EleTree->fWeight);
      }

    } 
    //FakeElectron
    else if ( abs(EleTree->fPdgId) > 50 || EleTree->fPdgId == 0) {
      FakeElectrons += EleTree->fWeight;
      if (passCSA14Tight(EleTree)) FakeElectronPassCSA14Tight += EleTree->fWeight;
      if (passCSA14Loose(EleTree)) FakeElectronPassCSA14Loose += EleTree->fWeight;
      if (passCSA14Veto(EleTree)) FakeElectronPassCSA14Veto += EleTree->fWeight;
      if (passIDMVANonTrigVeto(EleTree)) FakeElectronPassIDMVANonTrigVeto += EleTree->fWeight;
      if (passIDMVATrigTight(EleTree)) FakeElectronPassIDMVATrigTight += EleTree->fWeight;
      
      if ( EleTree->fElePFIso04 < 0.2 ) {
	EleIDMVATrig_Fake->Fill(EleTree->fIDMVATrig, EleTree->fWeight);
      } else {
	EleIDMVATrig_Real->Fill(-1, EleTree->fWeight);
      }

      if ( EleTree->fElePFIso04 < 99 &&  
	   ( (fabs(EleTree->fEleSCEta) < 1.479 && fabs(EleTree->fEleD0) < 0.0166)
	     ||
	     (fabs(EleTree->fEleSCEta) >= 1.479 && fabs(EleTree->fEleD0) < 0.098)
	     )
	   ) {
	EleIDMVANonTrig_Fake->Fill(EleTree->fIDMVANonTrig, EleTree->fWeight);
      } else {
	EleIDMVANonTrig_Fake->Fill(-1, EleTree->fWeight);
      }
    }

  } 
  
  
  //*****************************************************************************************
  //Current Working Points
  //*****************************************************************************************
  cout << "CSA14 Tight Real Electron Efficiency : " << RealElectronPassCSA14Tight << " / " << RealElectrons << " = " << RealElectronPassCSA14Tight/RealElectrons << endl;
  cout << "CSA14 Tight Fake Electron Efficiency : " << FakeElectronPassCSA14Tight << " / " << FakeElectrons << " = " << FakeElectronPassCSA14Tight/FakeElectrons << endl;
  TGraphAsymmErrors* ROC_CSA14TightWP = MakeCurrentWPSigEffVsBkgEffGraph(RealElectronPassCSA14Tight/RealElectrons , FakeElectronPassCSA14Tight/FakeElectrons, "ROC_CSA14TightWP"+label);

  cout << "CSA14 Loose Real Electron Efficiency : " << RealElectronPassCSA14Loose << " / " << RealElectrons << " = " << RealElectronPassCSA14Loose/RealElectrons << endl;
  cout << "CSA14 Loose Fake Electron Efficiency : " << FakeElectronPassCSA14Loose << " / " << FakeElectrons << " = " << FakeElectronPassCSA14Loose/FakeElectrons << endl;
  TGraphAsymmErrors* ROC_CSA14LooseWP = MakeCurrentWPSigEffVsBkgEffGraph(RealElectronPassCSA14Loose/RealElectrons , FakeElectronPassCSA14Loose/FakeElectrons, "ROC_CSA14LooseWP"+label);

  cout << "CSA14 Veto Real Electron Efficiency : " << RealElectronPassCSA14Veto << " / " << RealElectrons << " = " << RealElectronPassCSA14Veto/RealElectrons << endl;
  cout << "CSA14 Veto Fake Electron Efficiency : " << FakeElectronPassCSA14Veto << " / " << FakeElectrons << " = " << FakeElectronPassCSA14Veto/FakeElectrons << endl;
  TGraphAsymmErrors* ROC_CSA14VetoWP = MakeCurrentWPSigEffVsBkgEffGraph(RealElectronPassCSA14Veto/RealElectrons , FakeElectronPassCSA14Veto/FakeElectrons, "ROC_CSA14VetoWP"+label);



  Double_t BkgEffCSA14Tight = FakeElectronPassCSA14Tight/FakeElectrons;
  Double_t SigEffCSA14Tight = RealElectronPassCSA14Tight/RealElectrons;
  Double_t BkgEffCSA14Veto = FakeElectronPassCSA14Veto/FakeElectrons;
  Double_t SigEffCSA14Veto = RealElectronPassCSA14Veto/RealElectrons;

  cout << "**********************\n";
  Double_t SigEffIDMVATrig_AtTightBkgEff = FindSigEffAtFixedBkgEfficiency(EleIDMVATrig_Real, EleIDMVATrig_Fake, BkgEffCSA14Tight);
  Double_t SigEffIDMVANonTrig_AtTightBkgEff = FindSigEffAtFixedBkgEfficiency(EleIDMVANonTrig_Real, EleIDMVANonTrig_Fake, BkgEffCSA14Tight);
  Double_t BkgEffIDMVATrig_AtTightSigEff = FindBkgEffAtFixedSignalEfficiency(EleIDMVATrig_Real, EleIDMVATrig_Fake, SigEffCSA14Tight);
  Double_t BkgEffIDMVANonTrig_AtTightSigEff = FindBkgEffAtFixedSignalEfficiency(EleIDMVANonTrig_Real, EleIDMVANonTrig_Fake, SigEffCSA14Tight);
  cout << "Signal Efficiency (wrt CSA14Tight Cut-based) for : same bkg \n";
  cout << "IDMVATrig : " << SigEffIDMVATrig_AtTightBkgEff/SigEffCSA14Tight <<  endl;
  cout << "IDMVANonTrig : " << SigEffIDMVANonTrig_AtTightBkgEff/SigEffCSA14Tight <<  endl;
  cout << "Bkg Efficiency (wrt CSA14Veto Cut-based) for same sig eff \n";
  cout << "IDMVATrig : " << BkgEffIDMVATrig_AtTightSigEff/BkgEffCSA14Tight << endl;
  cout << "IDMVANonTrig : " << BkgEffIDMVANonTrig_AtTightSigEff/BkgEffCSA14Tight << endl;
  cout << "**********************\n";

  cout << "**********************\n";
  Double_t BkgEffIDMVATrig_AtVetoSigEff = FindBkgEffAtFixedSignalEfficiency(EleIDMVATrig_Real, EleIDMVATrig_Fake, SigEffCSA14Veto);
  Double_t BkgEffIDMVANonTrig_AtVetoSigEff = FindBkgEffAtFixedSignalEfficiency(EleIDMVANonTrig_Real, EleIDMVANonTrig_Fake, SigEffCSA14Veto);
  Double_t SigEffIDMVATrig_AtVetoBkgEff = FindSigEffAtFixedBkgEfficiency(EleIDMVATrig_Real, EleIDMVATrig_Fake, BkgEffCSA14Veto);
  Double_t SigEffIDMVANonTrig_AtVetoBkgEff = FindSigEffAtFixedBkgEfficiency(EleIDMVANonTrig_Real, EleIDMVANonTrig_Fake, BkgEffCSA14Veto);
  cout << "Sig Efficiency (wrt CSA14Veto Cut-based) for same bkg eff \n";
  cout << "IDMVATrig : " << SigEffIDMVATrig_AtVetoBkgEff/SigEffCSA14Veto << endl;
  cout << "IDMVANonTrig : " << SigEffIDMVANonTrig_AtVetoBkgEff/SigEffCSA14Veto << endl;
  cout << "Bkg Efficiency (wrt CSA14Veto Cut-based) for same sig eff \n";
  cout << "IDMVATrig : " << BkgEffIDMVATrig_AtVetoSigEff/BkgEffCSA14Veto << endl;
  cout << "IDMVANonTrig : " << BkgEffIDMVANonTrig_AtVetoSigEff/BkgEffCSA14Veto << endl;
  cout << "**********************\n";


  cout << "IDMVANonTrig Veto Real Electron Efficiency : " << RealElectronPassIDMVANonTrigVeto << " / " << RealElectrons << " = " << RealElectronPassIDMVANonTrigVeto/RealElectrons << endl;
  cout << "IDMVANonTrig Veto Fake Electron Efficiency : " << FakeElectronPassIDMVANonTrigVeto << " / " << FakeElectrons << " = " << FakeElectronPassIDMVANonTrigVeto/FakeElectrons << endl;
  TGraphAsymmErrors* ROC_IDMVANonTrigVetoWP = MakeCurrentWPSigEffVsBkgEffGraph(RealElectronPassIDMVANonTrigVeto/RealElectrons , FakeElectronPassIDMVANonTrigVeto/FakeElectrons, "ROC_IDMVANonTrigVetoWP"+label);


  cout << "IDMVATrig Tight Real Electron Efficiency : " << RealElectronPassIDMVATrigTight << " / " << RealElectrons << " = " << RealElectronPassIDMVATrigTight/RealElectrons << endl;
  cout << "IDMVATrig Tight Veto Fake Electron Efficiency : " << FakeElectronPassIDMVATrigTight << " / " << FakeElectrons << " = " << FakeElectronPassIDMVATrigTight/FakeElectrons << endl;
  TGraphAsymmErrors* ROC_IDMVATrigTightWP = MakeCurrentWPSigEffVsBkgEffGraph(RealElectronPassIDMVATrigTight/RealElectrons , FakeElectronPassIDMVATrigTight/FakeElectrons, "ROC_IDMVATrigTightWP"+label);



  //*****************************************************************************************
  //Make ROC curves
  //*****************************************************************************************
  TGraphAsymmErrors* ROC_IDMVATrig = MakeSigEffVsBkgEffGraph(EleIDMVATrig_Real, EleIDMVATrig_Fake, "ROC_IDMVATrig"+label );
  TGraphAsymmErrors* ROC_IDMVANonTrig = MakeSigEffVsBkgEffGraph(EleIDMVANonTrig_Real, EleIDMVANonTrig_Fake, "ROC_IDMVANonTrig"+label );


  //*****************************************************************************************
  //Find Cut with same signal efficiency Make ROC curves
  //*****************************************************************************************
  Double_t CutValue_IDMVATrig_SameSig = FindCutValueAtFixedEfficiency(EleIDMVATrig_Real, SigEffCSA14Tight );
  Double_t CutValue_IDMVATrig_SameBkg = FindCutValueAtFixedEfficiency(EleIDMVATrig_Fake, BkgEffCSA14Tight );
  cout << "IDMVATrig Cut Value @ Same Cut-Based Tight Sig Eff: " << CutValue_IDMVATrig_SameSig << endl;
  cout << "IDMVATrig Cut Value @ Same Cut-Based Tight Bkg Eff: " << CutValue_IDMVATrig_SameBkg << endl;

  Double_t CutValue_IDMVANonTrig_SameSig = FindCutValueAtFixedEfficiency(EleIDMVANonTrig_Real, SigEffCSA14Veto );
  Double_t CutValue_IDMVANonTrig_SameBkg = FindCutValueAtFixedEfficiency(EleIDMVANonTrig_Fake, BkgEffCSA14Veto );
  cout << "IDMVANonTrig Cut Value @ Same Cut-Based Veto Sig Eff: " << CutValue_IDMVANonTrig_SameSig << endl;
  cout << "IDMVANonTrig Cut Value @ Same Cut-Based Veto Bkg Eff: " << CutValue_IDMVANonTrig_SameBkg << endl;

  Double_t CutValue_IDMVANonTrig_HalfBkg = FindCutValueAtFixedEfficiency(EleIDMVANonTrig_Fake, 0.5*FakeElectronPassIDMVANonTrigVeto/FakeElectrons );
  cout << "IDMVANonTrig Cut Value @ 50% IDMVA NonTrig Veto Bkg Eff: " << CutValue_IDMVANonTrig_HalfBkg << endl;

  TLegend* legend;
  TCanvas* cv;
  string plotname;

  //*****************************************************************************************
  //Plot ROC Curves
  //*****************************************************************************************
  vector<TGraphAsymmErrors*> ROCGraphs;
  vector<string> GraphLabels;
  vector<Int_t> colors;

  //*****************************************************************************************
  //*****************************************************************************************
  ROCGraphs.clear();
  GraphLabels.clear();
  plotname = "ElectronIDMVA"+label;

  // ROCGraphs.push_back(ROC_IDMVATrig);
  // GraphLabels.push_back("IDMVATrig");
  // colors.push_back(kBlue);
  
  ROCGraphs.push_back(ROC_IDMVANonTrig);
  GraphLabels.push_back("IDMVANonTrig");
  colors.push_back(kGreen+2);
  


  //*****************************************************************************************
  Double_t xmin = 0.0;
  Double_t xmax = 1.0;
  Double_t ymin = 0.0;
  Double_t ymax = 1.0;




  cv = new TCanvas("cv", "cv", 800, 600);

//    legend = new TLegend(0.45,0.20,0.75,0.50);
  legend = new TLegend(0.54,0.14,0.94,0.44);
  legend->SetTextSize(0.03);
  legend->SetBorderSize(0);
  legend->SetFillStyle(0);
  for (UInt_t i=0; i<GraphLabels.size(); ++i) {
    legend->AddEntry(ROCGraphs[i],GraphLabels[i].c_str(), "LP");

    ROCGraphs[i]->SetMarkerColor(colors[i]);
    ROCGraphs[i]->SetLineColor(colors[i]);
    ROCGraphs[i]->SetMarkerSize(0.5);
   
    ROCGraphs[i]->GetXaxis()->SetRangeUser(xmin,xmax);    
    ROCGraphs[i]->GetYaxis()->SetRangeUser(ymin,ymax);    
    if (i==0) {
      ROCGraphs[i]->Draw("AP");
    } else {
      ROCGraphs[i]->Draw("Psame");
    }
  }

  // legend->AddEntry(ROC_CSA14TightWP, "CSA14Tight WP", "P");
  // ROC_CSA14TightWP->SetFillColor(kRed);
  // ROC_CSA14TightWP->SetMarkerColor(kRed);
  // ROC_CSA14TightWP->SetMarkerStyle(34);
  // ROC_CSA14TightWP->SetMarkerSize(2.5);
  // ROC_CSA14TightWP->Draw("Psame");

  legend->AddEntry(ROC_CSA14LooseWP, "CSA14Loose WP", "P");
  ROC_CSA14LooseWP->SetFillColor(kBlue);
  ROC_CSA14LooseWP->SetMarkerColor(kBlue);
  ROC_CSA14LooseWP->SetMarkerStyle(34);
  ROC_CSA14LooseWP->SetMarkerSize(2.5);
  ROC_CSA14LooseWP->Draw("Psame");

  legend->AddEntry(ROC_CSA14VetoWP, "CSA14Veto WP", "P");
  ROC_CSA14VetoWP->SetFillColor(kGreen+3);
  ROC_CSA14VetoWP->SetMarkerColor(kGreen+3);
  ROC_CSA14VetoWP->SetMarkerStyle(34);
  ROC_CSA14VetoWP->SetMarkerSize(2.5);
  ROC_CSA14VetoWP->Draw("Psame");

   legend->AddEntry(ROC_IDMVANonTrigVetoWP, "IDMVANonTrigVeto WP", "P");
   ROC_IDMVANonTrigVetoWP->SetFillColor(kBlack);
   ROC_IDMVANonTrigVetoWP->SetMarkerColor(kBlack);
   ROC_IDMVANonTrigVetoWP->SetMarkerStyle(34);
   ROC_IDMVANonTrigVetoWP->SetMarkerSize(2.5);
   ROC_IDMVANonTrigVetoWP->Draw("Psame");

  // legend->AddEntry(ROC_IDMVATrigTightWP, "IDMVATrigTight WP", "P");
  // ROC_IDMVATrigTightWP->SetFillColor(kRed);
  // ROC_IDMVATrigTightWP->SetMarkerColor(kRed);
  // ROC_IDMVATrigTightWP->SetMarkerStyle(34);
  // ROC_IDMVATrigTightWP->SetMarkerSize(2.5);
  // ROC_IDMVATrigTightWP->Draw("Psame");


  legend->Draw();
  
  cv->SaveAs(("ROCGraphs_" + plotname + ".gif").c_str());

  gBenchmark->Show("WWTemplate");       
} 
bool PassSelection( ElectronTree* eleTree, int wp ) {

  bool pass = false;

  //Veto
  if (wp == 1) {
    if ( eleTree->fElePt > 0 
	 //&&  eleTree->fPassMVANonTrigVetoSelection
	  && passIDMVANonTrigVeto(eleTree)
	  && passImprovedIso(eleTree) 
	 ) {
      pass = true;
    }
  }

  if (wp == 2) {
    if ( eleTree->fElePt > 0 
	 && eleTree->fPassLooseSelection
	 //&& passCSA14Loose(eleTree) 
	 ) {
      pass = true;
    }
  }

  if (wp == 3) {
    if ( eleTree->fElePt > 0 
	 && eleTree->fPassTightSelection
	 //&& passCSA14Tight(eleTree)
	 ) {
      pass = true;
    }

  }

  //isolation only
  if (wp == 11) {
    if ( eleTree->fElePt > 0	 
	 && passImprovedIso(eleTree) 
	 ) {
      pass = true;
    }
  }

  //trigger
  if (wp == 100) {
    if ( (eleTree->fEleTriggerBit & ElectronTree::kEleTrigger_Ele27Loose) == ElectronTree::kEleTrigger_Ele27Loose) pass = true;
  }
  if (wp == 101) {
    if ( (eleTree->fEleTriggerBit & ElectronTree::kEleTrigger_Ele27Tight) == ElectronTree::kEleTrigger_Ele27Tight) pass = true;
  }
  if (wp == 102) {
    if ( (eleTree->fEleTriggerBit & ElectronTree::kEleTrigger_Ele32Tight) == ElectronTree::kEleTrigger_Ele32Tight) pass = true;
  }
  if (wp == 110) {
    if ( (eleTree->fEleTriggerBit & ElectronTree::kEleTrigger_Ele27Loose) == ElectronTree::kEleTrigger_Ele27Loose
	 || (eleTree->fEleTriggerBit & ElectronTree::kEleTrigger_Ele27Tight) == ElectronTree::kEleTrigger_Ele27Tight
	 || (eleTree->fEleTriggerBit & ElectronTree::kEleTrigger_Ele32Tight) == ElectronTree::kEleTrigger_Ele32Tight
	  ) pass = true;
  }


  return pass;  
}