void analyzePFGammaJetTree(TString inpFileName,
			   Long64_t maxEntries=-1,
			   double extraWeightFactor=-1.) {

  // book histograms
  double cPI= 4*atan(1);
  int show_dPhi=0;
  TH1D *h1_dPhi= new TH1D("h1_dPhi","#Delta#Phi",100,-2*cPI,2*cPI);
  prepareHisto(h1_dPhi);

  int show_dPt_PF=0;
  TH1D *h1_dPt_PF= new TH1D("h1_dPt_PF","#Deltap_{T}^{PF}",100,-1000,1000);
  prepareHisto(h1_dPt_PF);

  int show_pho2D_pt=1;
  TH2D *h2_pho_pt= new TH2D("h2_pho_pt","Photon p_{T};gen p_{T};reco p_{T}",
			    100,0.,1000.,
			    100,0.,1000.);
  prepareHisto(h2_pho_pt);

  int show_pho2D_ptMap=1;
  TH2D *h2_pho_ptMap= (TH2D*)h2_pho_pt->Clone("h2_pho_ptMap");
  h2_pho_ptMap->SetTitle("Photon average quality");
  TH2D *h2_pho_ptMapCount= (TH2D*)h2_pho_pt->Clone("h2_pho_ptMapCount");
  prepareHisto(h2_pho_ptMap);
  prepareHisto(h2_pho_ptMapCount);

  int show_jet2D_ptPF=1;
  TH2D *h2_jet_ptPF= new TH2D("h2_jet_pt",
			      "Leading jet p_{T};gen p_{T};reco p_{T}^{PF}",
			      100,0.,1000.,
			      100,0.,1000.);
  prepareHisto(h2_jet_ptPF);

  int show_pho_vs_jet_genPt=1;
  TH2D *h2_pho_vs_jet_genPt= new TH2D("h2_pho_vs_jet_genPt",
				   "Gen p_{T};#gamma gen p_{T};jet gen p_{T}",
				   100,0.,1000.,
				   100,0.,1000.);
  prepareHisto(h2_pho_vs_jet_genPt);

  int show_pho_vs_jet_recoPtPF=1;
  TH2D *h2_pho_vs_jet_recoPtPF= new TH2D("h2_pho_vs_jet_recoPtPF",
			   "Reco p_{T};#gamma p_{T};jet p_{T}^{PF}",
				   100,0.,1000.,
				   100,0.,1000.);
  prepareHisto(h2_pho_vs_jet_recoPtPF);


  // process the data
  pf_gammajettree inpData(inpFileName);

  inpData.DeactivateBranches();
  inpData.ActivateBranches_forFitSkim();
  inpData.ActivateBranches(1,"ppfjet_pt");
  inpData.ActivateBranches_genBasicSet();

  GammaJetEvent_t *dt= new GammaJetEvent_t();
  GammaJetEventAuxInfo_t aux;

  // read in the file
  Long64_t nEntries= inpData.fChain->GetEntries();
  if (maxEntries<0) maxEntries=nEntries;
  Long64_t nBytes=0, passedCount=0;

  for (Long64_t iEntry=0; (iEntry<nEntries) && (iEntry<maxEntries);
       iEntry++) {
    if (inpData.LoadTree(iEntry) < 0) break;
    Long64_t nb = inpData.GetEntry(iEntry);
    nBytes += nb;
    if (iEntry%10000==0) std::cout << " ... reading entry " << iEntry << "\n";
    std::cout << "ientry=" << iEntry << "\n";

    if (!passCuts(inpData,0)) continue;

    passedCount++;

    double ecalE= inpData.getSumEcalE(0,1);
    double hcalE_noRecHits= inpData.getSumHcalE_trackDiffEcal(1);

    aux.SetEventNo(inpData.EventNumber);
    aux.SetRunNo(inpData.RunNumber);
    aux.SetProbeHcalENoRecHits(hcalE_noRecHits);
    dt->SetAuxInfo(aux);

    double w=inpData.EventWeight;
    if (extraWeightFactor>0) w*= extraWeightFactor;
    dt->SetWeight(w);

    dt->SetTagEEtaPhi(inpData.tagPho_energy,
		      inpData.tagPho_eta, inpData.tagPho_phi);

    dt->SetProbeEtaPhiEn(inpData.ppfjet_eta, inpData.ppfjet_phi,
			 ecalE+hcalE_noRecHits, inpData.getHcalEMap(1,1e-4));

    h1_dPhi->Fill( dt->GetTagPhi() - dt->GetProbePhi() , w);
    h1_dPt_PF->Fill( inpData.tagPho_pt - inpData.ppfjet_pt , w);
    h2_pho_pt->Fill( inpData.tagPho_genPt, inpData.tagPho_pt, w);
    h2_jet_ptPF->Fill( inpData.ppfjet_genpt, inpData.ppfjet_pt, w);
    h2_pho_vs_jet_genPt->Fill( inpData.tagPho_genPt, inpData.ppfjet_genpt, w);
    h2_pho_vs_jet_recoPtPF->Fill( inpData.tagPho_pt, inpData.ppfjet_pt, w);

    int cathegory=0;
    if (inpData.tagPho_idTight) cathegory=2;
    else if (inpData.tagPho_idLoose) cathegory=1;
    h2_pho_ptMap->Fill( inpData.tagPho_genPt, inpData.tagPho_pt, cathegory);
    h2_pho_ptMapCount->Fill( inpData.tagPho_genPt, inpData.tagPho_pt, 1);
  }

  std::cout << "nEntries=" << nEntries << ", passedCount=" << passedCount << "\n";

  if (show_dPhi) displayHisto(h1_dPhi,"dPhi","LPE");
  if (show_dPt_PF) displayHisto(h1_dPt_PF, "dPt_PF","LPE");
  if (show_pho2D_pt) displayHisto(h2_pho_pt,"pho2D_pt","COLZ");
  if (show_jet2D_ptPF) displayHisto(h2_jet_ptPF,"jet2D_ptPF","COLZ");
  if (show_pho_vs_jet_genPt) displayHisto(h2_pho_vs_jet_genPt,"pho_vs_jet_genPt","COLZ");
  if (show_pho_vs_jet_recoPtPF) displayHisto(h2_pho_vs_jet_recoPtPF,"pho_vs_jet_recoPtPF","COLZ");

  if (show_pho2D_ptMap) {
    for (int ibin=1; ibin<=h2_pho_ptMapCount->GetNbinsX(); ++ibin) {
      for (int jbin=1; jbin<=h2_pho_ptMapCount->GetNbinsY(); ++jbin) {
	double cnt= h2_pho_ptMapCount->GetBinContent(ibin,jbin);
	if (cnt==double(0)) continue;
	double sum= h2_pho_ptMap->GetBinContent(ibin,jbin);
	h2_pho_ptMap->SetBinContent(ibin,jbin, sum/cnt);
      }
    }
    displayHisto(h2_pho_ptMap,"pho_ptMap","COLZ");
  }

  return;
}
Exemple #2
0
void processDYmm(Int_t maxEntries=-1)
{
  std::cout << "DY range=" << DYtools::minMass << " .. " << DYtools::maxMass << "\n";

  TVersion_t inpVersion=_verMu1;
  inpVersion=_verMu76X;
  inpVersion=_verMuApproved;

  if (inpVersion!=_verMu1) {
    if (DYtools::nMassBins!=DYtools::nMassBins43) {
      std::cout << "a potential DYbinning.h problem\n";
      return;
    }
  }

  TString srcPath="/media/ssd/v20160214_1st_CovarianceMatrixInputs/";
  srcPath="/mnt/sdb/andriusj/v20160214_1st_CovarianceMatrixInputs/";
  TString dataFName=srcPath + "Input3/ROOTFile_ntuple_CovarianceMatrixInput.root";

  if (inpVersion==_verMu76X) {
    srcPath="/mnt/sdb/andriusj/v20160527_1st_CovarianceMatrixInputs_76X/";
    dataFName=srcPath + "Input3/ROOTFile_Input_CovarianceMatrix.root";
  }
  else if (inpVersion==_verMuApproved) {
    srcPath="/mnt/sdb/andriusj/v20160915_CovInput_ApprovedResults/";
    dataFName=srcPath + "ROOTFile_Input_CovarianceMatrix.root";
  }

  DYmm13TeV_t data(dataFName);
  data.DeactivateBranches();
  data.ActivateBranches("Momentum_postFSR_Lead  Momentum_postFSR_Sub  Momentum_preFSR_Lead  Momentum_preFSR_Sub  Weight_Norm  Weight_Gen Weight_PU");
  data.ActivateBranches("Flag_EventSelection");

  TH1D *h1postFsrInAccSel_M= new TH1D("h1_postFsrInAccSel_M", "postFSR selected events in acceptance;M_{gen,postFSR} [GeV];count",DYtools::nMassBins,DYtools::massBinEdges);
  TH1D *h1postFsrInAccSel_MW= new TH1D("h1_postFsrInAccSel_MW", "postFSR selected events in acceptance (weighted);M_{gen,postFSR} [GeV];weighted count",DYtools::nMassBins,DYtools::massBinEdges);
  TH1D *h1postFsrInAccSel_MWPU= new TH1D("h1_postFsrInAccSel_MWPU", "postFSR selected events in acceptance (weighted wPU);M_{gen,postFSR} [GeV];weighted (wPU) count",DYtools::nMassBins,DYtools::massBinEdges);
  TH1D *h1postFsrInAcc_M= new TH1D("h1_postFsrInAcc_M", "postFSR in acceptace;M_{gen,postFSR} [GeV];count",DYtools::nMassBins,
			    DYtools::massBinEdges);
  TH1D *h1postFsrInAcc_MW= new TH1D("h1_postFsrInAcc_Mweighted", "postFSR in acceptance;M_{gen,postFSR} [GeV];weighted count", DYtools::nMassBins,
			    DYtools::massBinEdges);
  TH1D *h1postFsrInAcc_MWPU= new TH1D("h1_postFsrInAcc_MweightedPU", "postFSR in acceptance (weighted wPU);M_{gen,postFSR} [GeV];weighted (wPU) count", DYtools::nMassBins,
			    DYtools::massBinEdges);
  TH1D *h1postFsr_M= new TH1D("h1_postFsr_M", "postFSR;M_{gen,postFSR} [GeV];count",DYtools::nMassBins,
			    DYtools::massBinEdges);
  TH1D *h1postFsr_MW= new TH1D("h1_postFsr_Mweighted", "postFSR;M_{gen,postFSR} [GeV];weighted count", DYtools::nMassBins,
			    DYtools::massBinEdges);
  TH1D *h1preFsr_M= new TH1D("h1_preFsr_M", "preFSR;M_{gen,preFSR} [GeV];count",DYtools::nMassBins,
			   DYtools::massBinEdges);
  TH1D *h1preFsr_MW= new TH1D("h1_preFsr_Mweighted", "preFSR;M_{gen,preFSR} [GeV];weighted count", DYtools::nMassBins,
			   DYtools::massBinEdges);
  prepareHisto(h1postFsrInAccSel_M);
  prepareHisto(h1postFsrInAccSel_MW);
  prepareHisto(h1postFsrInAccSel_MWPU);
  prepareHisto(h1postFsrInAcc_M);
  prepareHisto(h1postFsrInAcc_MW);
  prepareHisto(h1postFsrInAcc_MWPU);
  prepareHisto(h1postFsr_M);
  prepareHisto(h1postFsr_MW);
  prepareHisto(h1preFsr_M);
  prepareHisto(h1preFsr_MW);

  TH2D* h2FSRmig= new TH2D("h2FSRmig","FSR migration", DYtools::nMassBins, DYtools::massBinEdges, DYtools::nMassBins, DYtools::massBinEdges);
  h2FSRmig->Sumw2();
  RooUnfoldResponse fsrResp(h1postFsr_MW,h1preFsr_MW,h2FSRmig,"rooUnf_fsrResp","fsrResp;M_{#mu#mu} [GeV];FSR unfolded yield");
  fsrResp.UseOverflow();

  TH2D* h2effAccFSRmig= new TH2D("h2effAccFSRmig","eff x Acc x FSR migration", DYtools::nMassBins, DYtools::massBinEdges, DYtools::nMassBins, DYtools::massBinEdges);
  h2effAccFSRmig->Sumw2();
  RooUnfoldResponse effAccFsrResp(h1postFsrInAccSel_MW,h1preFsr_MW,h2effAccFSRmig,"rooUnf_effAccFsrResp","effAccFsrResp;M_{#mu#mu} [GeV];eff Acc FSR unfolded yield");
  effAccFsrResp.UseOverflow();


  UInt_t nEvents= data.GetEntries();

  std::cout << "process data\n";
  for (UInt_t iEntry=0; iEntry<nEvents; iEntry++) {
    if (data.GetEntry(iEntry)<0) break;
    if (iEntry%100000==0) std::cout << "iEntry=" << iEntry << Form("(%4.2lf%%)\n",iEntry*100/double(nEvents));
    if ((maxEntries>0) && (iEntry>UInt_t(maxEntries))) {
      std::cout << "debug run\n";
      break;
    }
    double w= data.Weight_Norm * data.Weight_Gen;
    if (iEntry<100) std::cout << "w=" << w << ": weight_norm=" << data.Weight_Norm << ", gen=" << data.Weight_Gen << "\n";
    double mPostFsr= (*data.Momentum_postFSR_Lead + *data.Momentum_postFSR_Sub).M();
    double mPreFsr= (*data.Momentum_preFSR_Lead + *data.Momentum_preFSR_Sub).M();
    if (DYtools::InAcceptance_mm(data.Momentum_postFSR_Lead,data.Momentum_postFSR_Sub)) {
      if (data.Flag_EventSelection) {
	h1postFsrInAccSel_M->Fill( mPostFsr, 1. );
	h1postFsrInAccSel_MW->Fill( mPostFsr, w );
	h1postFsrInAccSel_MWPU->Fill( mPostFsr, w * data.Weight_PU );
      }
      h1postFsrInAcc_M->Fill( mPostFsr, 1. );
      h1postFsrInAcc_MW->Fill( mPostFsr, w );
      h1postFsrInAcc_MWPU->Fill( mPostFsr, w * data.Weight_PU );
    }
    h1postFsr_M->Fill( mPostFsr, 1. );
    h1postFsr_MW->Fill( mPostFsr, w );
    h1preFsr_M->Fill( mPreFsr, 1. );
    h1preFsr_MW->Fill( mPreFsr, w );
    h2FSRmig->Fill( mPostFsr, mPreFsr, w );

    if (0) {
      if ( ! DYtools::InsideMassRange(mPreFsr) )
	std::cout << "preFSR mass " << mPreFsr << ", postFSR mass " << mPostFsr << "\n";
    }

    if ( ! DYtools::InsideMassRange(mPreFsr) &&
	 DYtools::InsideMassRange(mPostFsr) ) {
      std::cout << "fake detected\n";
      fsrResp.Fake(mPostFsr,w);
    }
    else if ( DYtools::InsideMassRange(mPreFsr) &&
	      ! DYtools::InsideMassRange(mPostFsr) ) {
      fsrResp.Miss(mPreFsr,w);
    }
    else {
      fsrResp.Fill(mPostFsr,mPreFsr,w);
    }

    int sel=(DYtools::InAcceptance_mm(data.Momentum_postFSR_Lead,data.Momentum_postFSR_Sub) && data.Flag_EventSelection && DYtools::InsideMassRange(mPostFsr)) ? 1:0;
    if (sel) h2effAccFSRmig->Fill(mPostFsr,mPreFsr,w);
    if ( ! DYtools::InsideMassRange(mPreFsr) && sel ) {
      effAccFsrResp.Fake(mPostFsr,w);
    }
    else if ( DYtools::InsideMassRange(mPreFsr) && ! sel ) {
      effAccFsrResp.Miss(mPreFsr,w);
    }
    else {
      effAccFsrResp.Fill(mPostFsr,mPreFsr,w);
    }
  }

  RooUnfoldBayes bayesFSR( &fsrResp, h1postFsr_MW, 4 );
  TH1D *h1preFsrUnf= (TH1D*) bayesFSR.Hreco()->Clone("h1preFsrUnf");
  h1preFsrUnf->SetTitle("unfolded postFSR->preFSR");
  h1preFsrUnf->SetDirectory(0);
  histoStyle(h1preFsrUnf,kRed,24);
  h1preFsrUnf->GetXaxis()->SetMoreLogLabels();
  h1preFsrUnf->GetXaxis()->SetNoExponent();
  TCanvas *cFSRTest=plotHisto(h1preFsrUnf,"cFSRTest",1,1,"LPE1");
  plotHistoSame(h1preFsr_MW,"cFSRTest","LPE");

  RooUnfoldBayes bayesEffAccFsr( &effAccFsrResp, h1postFsrInAccSel_MW, 4 );
  TH1D *h1EffAccFsrUnf= (TH1D*) bayesEffAccFsr.Hreco()->Clone("h1EffAccFsrUnf");
  h1EffAccFsrUnf->SetTitle("unfolded postFsrInAccSel -> preFSR");
  h1EffAccFsrUnf->SetDirectory(0);
  histoStyle(h1EffAccFsrUnf,kRed,24);
  h1EffAccFsrUnf->GetXaxis()->SetMoreLogLabels();
  h1EffAccFsrUnf->GetXaxis()->SetNoExponent();
  TCanvas *cScaleToPreFsrTest= plotHisto(h1EffAccFsrUnf,"cScaleToPreFsrTest",1,1,"LPE1");
  histoStyle(h1preFsr_MW,kBlue,5);
  plotHistoSame(h1preFsr_MW,"cScaleToPreFsrTest","LPE");

  TH1D* h1Eff=(TH1D*)h1postFsrInAccSel_MW->Clone("h1Eff");
  h1Eff->SetDirectory(0);
  if (!h1Eff->GetSumw2()) h1Eff->Sumw2();
  h1Eff->SetTitle("Efficiency;M_{#mu#mu,GEN postFSR} [GeV];postFSR_inAcc_Sel/postFSR_inAcc");
  h1Eff->Divide(h1postFsrInAccSel_MW,h1postFsrInAcc_MW,1,1,"B");

  TH1D* h1EffPU=(TH1D*)h1postFsrInAccSel_MWPU->Clone("h1EffPU");
  h1EffPU->SetDirectory(0);
  if (!h1EffPU->GetSumw2()) h1EffPU->Sumw2();
  h1EffPU->SetTitle("Efficiency (wPU);M_{#mu#mu,GEN postFSR} [GeV];postFSR_inAcc_Sel(wPU)/postFSR_inAcc(wPU)");
  h1EffPU->Divide(h1postFsrInAccSel_MWPU,h1postFsrInAcc_MWPU,1,1,"B");

  histoStyle(h1EffPU,kBlue,24);
  TCanvas *cEffCmp=plotHisto(h1Eff,"cEff_noPU_vs_wPU",1,0,"LPE1");
  plotHistoSame(h1EffPU,"cEff_noPU_vs_wPU","LPE");

  TH1D* h1Acc=(TH1D*)h1postFsrInAcc_MW->Clone("h1Acc");
  h1Acc->SetDirectory(0);
  if (!h1Acc->GetSumw2()) h1Acc->Sumw2();
  h1Acc->SetTitle("Acceptance;M_{#mu#mu,GEN postFSR} [GeV];postFSR_inAcc/postFSR");
  h1Acc->Divide(h1postFsrInAcc_MW,h1postFsr_MW,1,1,"B");

  TH1D* h1EffPUAcc=(TH1D*)h1postFsrInAccSel_MWPU->Clone("h1EffPUAcc");
  h1EffPUAcc->SetDirectory(0);
  if (!h1EffPUAcc->GetSumw2()) h1EffPUAcc->Sumw2();
  h1EffPUAcc->SetTitle("Efficiency(wPU) x Acc;M_{#mu#mu,GEN postFSR} [GeV];postFSR_inAccSel(wPU)/h1postFsr_MW(noPU)");
  h1EffPUAcc->Divide(h1postFsrInAccSel_MWPU,h1postFsr_MW,1,1,"B");

  TH1D *h1FSRCorr_binByBin=(TH1D*)h1preFsr_MW->Clone("h1FSRCorr_binByBin");
  h1FSRCorr_binByBin->SetDirectory(0);
  if (!h1FSRCorr_binByBin->GetSumw2()) h1FSRCorr_binByBin->Sumw2();
  h1FSRCorr_binByBin->SetTitle("FSR correction bin-by-bin;M_{#mu#mu} [GeV];preFSR/postFSR");
  h1FSRCorr_binByBin->Divide(h1preFsr_MW,h1postFsr_MW,1.,1.,"B");

  TString fname="dymm_test_" + versionName(inpVersion) + TString(".root");
  if (maxEntries>0) fname.ReplaceAll(".root","_debug.root");
  TFile fout(fname,"RECREATE");
  h1Eff->Write();
  h1EffPU->Write();
  h1Acc->Write();
  h1EffPUAcc->Write();
  h1FSRCorr_binByBin->Write();
  fsrResp.Write();
  effAccFsrResp.Write();
  h1postFsrInAccSel_M->Write();
  h1postFsrInAccSel_MW->Write();
  h1postFsrInAcc_M->Write();
  h1postFsrInAcc_MW->Write();
  h1postFsr_M->Write();
  h1postFsr_MW->Write();
  h1preFsr_M->Write();
  h1preFsr_MW->Write();
  h1preFsrUnf->Write();
  h2FSRmig->Write();
  h1EffAccFsrUnf->Write();
  h2effAccFSRmig->Write();
  cEffCmp->Write();
  cFSRTest->Write();
  cScaleToPreFsrTest->Write();
  TObjString timeTag(DayAndTimeTag(0));
  timeTag.Write("timeTag");
  fout.Close();
  std::cout << "file <" << fout.GetName() << "> created\n";
}
void analyzeQCD_PFGammaJetTree(TString inpFileName,
			       int flatQCD=0,
			       Long64_t maxEntries=-1,
			       double extraWeightFactor=-1.,
			       TString plotOutDir_user="",
			       int saveCollection_user=-1) {

  std::cout << "inpFileName=<" << inpFileName << ">\n";

#ifdef helper_HH
  if (plotOutDir_user.Length()>0) plotOutDir= plotOutDir_user;
#endif
  if (saveCollection_user>=0) saveCollection=saveCollection_user;

  double flat_ptMin=0, flat_ptMax=0;
  if (flatQCD==1) { flat_ptMin=80; flat_ptMax=120; }
  else if (flatQCD==2) { flat_ptMin=120; flat_ptMax=170; }
  else if (flatQCD==3) { flat_ptMin=170; flat_ptMax=300; }
  if (flatQCD && (extraWeightFactor<0)) {
    std::cout << "flatQCD requires extraWeightFactor\n";
    return;
  }

  collector.Clear();

  // book histograms
  //double cPI= 4*atan(1);
  int show_evweight=1;
  TH1D *h1_evWeight= new TH1D("h1_evWeight","Event weight;w;count",1000,0,10);
  TH1D *h1_evPtHat= new TH1D("h1_evPtHat","Event #hat p_{T};#hat p_{T};count",100,0,500);
  TH1D *h1_evPtHatEvWeighted= new TH1D("h1_evPtHatEvWeighted","Event #hat p_{T};#hat p_{T};gen-weighted count",100,0,500);
  TH1D *h1_evPtHatWeighted= new TH1D("h1_evPtHatWeighted","Event #hat p_{T};#hat p_{T};weighted count",100,0,500);
  prepareHisto(h1_evWeight);
  prepareHisto(h1_evPtHat);
  prepareHisto(h1_evPtHatEvWeighted);
  prepareHisto(h1_evPtHatWeighted);

  double c_pt_max=500;
  double c_energy_max=1500;


  int show_jet_energy=1;
  TH1D* h1_jet_energyGen= new TH1D("h1_jet_energyGen",
				   "jet energy Gen;E_{gen};count",
				   100,0.,c_energy_max);
  TH1D* h1_jet_energyPF = new TH1D("h1_jet_energyPF",
				   "jet energy PF;E_{PF};count",
				   100,0.,c_energy_max);
  prepareHisto(h1_jet_energyGen,1);
  prepareHisto(h1_jet_energyPF,1);

  int show_jet_pT=1;
  TH1D* h1_jet_pTGen= new TH1D("h1_jet_pTGen",
				   "jet pT Gen;p_{T,gen};count",
				   100,0.,c_pt_max);
  TH1D* h1_jet_pTPF = new TH1D("h1_jet_pTPF",
				   "jet pT PF;p_{T,PF};count",
				   100,0.,c_pt_max);
  prepareHisto(h1_jet_pTGen,1);
  prepareHisto(h1_jet_pTPF,1);

  int show_jet_pT_window=(1 && flatQCD) ? 1:0;
  TH1D* h1_jet_pTGen_window= new TH1D("h1_jet_pTGen_window",
	       Form("jet pT Gen window %2.0lf-%2.0lf;p_{T,gen};count",
		   flat_ptMin,flat_ptMax),
				   100,0.,c_pt_max);
  TH1D* h1_jet_pTPF_window= new TH1D("h1_jet_pTPF_window",
	       Form("jet pT PFreco window %2.0lf-%2.0lf;p_{T,PF};count",
		   flat_ptMin,flat_ptMax),
				   100,0.,c_pt_max);
  prepareHisto(h1_jet_pTGen_window,1);
  prepareHisto(h1_jet_pTPF_window,1);

  int show_jet_energy_PF_over_Gen=1;
  TH1D *h1_jet_energy_PFoverGen= new TH1D("h1_jet_energy_PFoverGen",
		       "Jet energy ratio (PF div gen);E_{PF}/E_{gen};count",
					  100,0.,2.5);
  prepareHisto(h1_jet_energy_PFoverGen,1);

  int show_jet_pT_PF_over_Gen=1;
  TH1D *h1_jet_pT_PFoverGen= new TH1D("h1_jet_pT_PFoverGen",
	       "Jet p_{T} ratio (PF div gen);p_{T}^{PF}/p_{T}^{gen};count",
					  100,0.,2.5);
  prepareHisto(h1_jet_pT_PFoverGen,1);

  int show_jet2D_ptPF=1;
  TH2D *h2_jet_ptPF= new TH2D("h2_jet_ptPF",
			      "Leading jet p_{T};gen p_{T};reco p_{T}^{PF}",
			      100,0.,c_pt_max,
			      100,0.,c_pt_max);
  prepareHisto(h2_jet_ptPF);

  int show_photon_pt=1;
  TH1D* h1_photon_pTreco = new TH1D("h1_photon_pTreco",
				    "photon pT;p_{T}^{#gamma};count",
				   100,0.,c_pt_max);
  prepareHisto(h1_photon_pTreco,1);



  // process the data
  pf_gammajettree inpData(inpFileName);

  inpData.DeactivateBranches();
  //inpData.ActivateBranches_forFitSkim();
  inpData.ActivateBranches(2,"EventWeight","EventPtHat");
  inpData.ActivateBranches(2,"ppfjet_pt","ppfjet_E");
  inpData.ActivateBranches(2,"ppfjet_genpt","ppfjet_genE");
  inpData.ActivateBranches(1,"tagPho_pt");
  //inpData.ActivateBranches_genBasicSet();

  // read in the file
  Long64_t nEntries= inpData.fChain->GetEntries();
  std::cout << "nEntries=" << nEntries << "\n";
  if (nEntries==0) return;
  if (maxEntries<0) maxEntries=nEntries;
  Long64_t nBytes=0, passedCount=0;
  Double_t sum_evWeight_window=0;
  Double_t sum_finalW_window=0;

  for (Long64_t iEntry=0; (iEntry<nEntries) && (iEntry<maxEntries);
       iEntry++) {
    if (inpData.LoadTree(iEntry) < 0) break;
    Long64_t nb = inpData.GetEntry(iEntry);
    nBytes += nb;
    if (iEntry%10000==0) std::cout << " ... reading entry " << iEntry << "\n";
    //std::cout << "ientry=" << iEntry << "\n";

    //if (!inpData.passCuts(1,2)) continue; // recommended use

    passedCount++;

    double w=inpData.EventWeight;
    if (0 && flatQCD) {
      // It seems this factor is already included in the gen.event weight
      //w /= pow(inpData.EventPtHat/double(15.), double(4.5));
    }
    if (extraWeightFactor>0) w*= extraWeightFactor;

    h1_evWeight->Fill( w, 1. );
    h1_evPtHat->Fill( inpData.EventPtHat, 1. );
    h1_evPtHatEvWeighted->Fill( inpData.EventPtHat, inpData.EventWeight );
    h1_evPtHatWeighted->Fill( inpData.EventPtHat, w );
    h1_jet_energyGen->Fill( inpData.ppfjet_genE, w);
    h1_jet_energyPF->Fill( inpData.ppfjet_E, w);
    h1_jet_energy_PFoverGen->Fill( inpData.ppfjet_E/inpData.ppfjet_genE, w);
    h1_jet_pTGen->Fill( inpData.ppfjet_genpt, w);
    h1_jet_pTPF->Fill( inpData.ppfjet_pt, w);
    if ((inpData.EventPtHat>flat_ptMin) &&
	(inpData.EventPtHat<flat_ptMax)) {
      sum_evWeight_window+= inpData.EventWeight;
      sum_finalW_window+= w;
      h1_jet_pTGen_window->Fill( inpData.ppfjet_genpt, w);
      h1_jet_pTPF_window->Fill( inpData.ppfjet_pt, w);
    }
    h1_jet_pT_PFoverGen->Fill( inpData.ppfjet_pt/inpData.ppfjet_genpt, w);
    h2_jet_ptPF->Fill( inpData.ppfjet_genpt, inpData.ppfjet_pt, w);

    h1_photon_pTreco->Fill( inpData.tagPho_pt, w );

    int gen_debug=0;
    if (gen_debug==1) {
      std::cout << "iEntry=" << iEntry << ",    leading jet genE=" << inpData.ppfjet_genE << ", pfE=" << inpData.ppfjet_E << "\n";

      /*
      std::cout << "  ppfjet_twr_ieta " << (inpData.ppfjet_twr_ieta) << "\n";
      std::cout << "  ppfjet_twr_hade " << (inpData.ppfjet_twr_hade) << "\n";
      std::cout << "  ppfjet_twr_frac " << (inpData.ppfjet_twr_frac) << "\n";
      std::cout << "  ppfjet_twr_clusterind " << (inpData.ppfjet_twr_clusterind) << "\n";
      std::cout << "  ppfjet_cluster_dR " << (inpData.ppfjet_cluster_dR) << "\n";
      */
    }
    else if (gen_debug==2) {
      std::cout << "genE=" << inpData.ppfjet_genE << ", pfE=" << inpData.ppfjet_E << "\n";
    }

  }

  std::cout << "nEntries=" << nEntries << ", passedCount=" << passedCount << "\n";

  displayHisto(show_evweight, h1_evWeight,"evWeight","LPE");
  displayHisto(show_evweight, h1_evPtHat, "evPtHat", "LPE");
  displayHisto(show_evweight, h1_evPtHatEvWeighted,"evPtHatEvWeighted", "LPE");
  displayHisto(show_evweight, h1_evPtHatWeighted, "evPtHatWeighted", "LPE");

  displayHisto(show_jet_energy, h1_jet_energyGen, "jet_E_gen","LPE");
  displayHisto(show_jet_energy, h1_jet_energyPF, "jet_E_recoPF","LPE");
  displayHisto(show_jet_energy_PF_over_Gen, h1_jet_energy_PFoverGen,"e_PFoverGen","hist");

  displayHisto(show_jet_pT, h1_jet_pTGen, "jet_pT_gen","LPE");
  displayHisto(show_jet_pT, h1_jet_pTPF, "jet_pT_recoPF","LPE");
  displayHisto(show_jet_pT_PF_over_Gen, h1_jet_pT_PFoverGen,"pT_PFoverGen","hist");
  //if (sum_window!=Double_t(0)) h1_jet_pTGen_window->Scale(1/sum_window);
  displayHisto(show_jet_pT_window, h1_jet_pTGen_window, "jet_pT_gen_window","LPE");
  displayHisto(show_jet_pT_window, h1_jet_pTPF_window, "jet_pT_reco_window","LPE");

  displayHisto(show_jet2D_ptPF, h2_jet_ptPF, "jet2D_ptPF","COLZ");

  displayHisto(show_photon_pt, h1_photon_pTreco, "photon_pTreco","LPE");

  if (saveCollection) {
    TString outFName=TString("saved_") + plotOutDir + TString(".root");
    collector.Add("producedBy_analyzePFGammaJetTree");
    collector.SaveToFile(outFName);
  }

  if (flatQCD) {
    std::cout << "flatQCD pt window : " << flat_ptMin << " .. "
	      << flat_ptMax << "\n";
    std::cout << "sum_window. evWeight=" << sum_evWeight_window
	      << ", finalW=" << sum_finalW_window << "\n";
  }

  return;
}