Remove PU staub (i.e. high-weight events due to PU sampling)
75 cout << __func__ <<
' ' << slice <<
" start" << endl;
78 auto tIn = flow.GetInputTree(slice);
79 auto [fOut, tOut] = flow.GetOutput(output);
83 auto isMC = metainfo.Get<
bool>(
"flags",
"isMC");
84 if (!
isMC) BOOST_THROW_EXCEPTION(
DE::BadInput(
"Only MC may be used as input.",
85 make_unique<TFile>(
inputs.front().c_str() )) );
86 auto R = metainfo.Get<
int>(
"flags",
"R");
87 const auto maxDR = R/10.;
89 auto fMBmaxgenpt =
config.get<fs::path>(
"corrections.PUcleaning.MBmaxgenpt");
91 metainfo.Set<fs::path>(
"corrections",
"PUcleaning",
"MBmaxgenpt", fMBmaxgenpt);
93 auto artifacts_minpt =
config.get<
float>(
"corrections.PUcleaning.artifacts_minpt");
94 metainfo.Set<
float>(
"corrections",
"PUcleaning",
"artifacts_minpt", artifacts_minpt);
97 auto genEvt = flow.GetBranchReadOnly<GenEvent>(
"genEvent");
98 auto recEvt = flow.GetBranchReadWrite<RecEvent>(
"recEvent");
99 auto pileup = flow.GetBranchReadWrite<PileUp>(
"pileup");
100 auto genJets = flow.GetBranchReadOnly <vector<GenJet>>(
"genJets");
101 auto recJets = flow.GetBranchReadWrite<vector<RecJet>>(
"recJets");
103 auto pt_logw = make_unique<TH2F>(
"pt_logw",
";Jet p_{T}^{rec} [GeV];log(w);N_{eff}^{j}",
nPtBins,
pt_edges.data(), 400, -30, 20),
104 mjj_logw = make_unique<TH2F>(
"mjj_logw",
";m_{jj}^{rec} [GeV];log(w);N_{eff}^{jj}",
nMjjBins,
Mjj_edges.data(), 400, -30, 20);
107 ControlPlots raw(
"raw"),
109 corrected(
"corrected");
111 Plots PUbefore(
"PUbefore"),
113 PUgenveto(
"PUgenveto");
115 for (
DT::Looper looper(tIn); looper(); ++looper) {
119 raw(*genJets, genEvt->weights.front());
120 raw(*recJets, genEvt->weights.front() * recEvt->weights.front());
121 PUbefore(*genJets, *recJets, *genEvt, *recEvt, *
pileup);
125 const float maxpthatPU = pthats_it !=
pileup->
pthats.end() ? *pthats_it : 0.;
126 bool bad_rec = (maxpthatPU > genEvt->hard_scale);
133 auto it = maxgenpts.find(evtID);
134 if (it == maxgenpts.end())
continue;
135 bad_rec |= it->second > genJets->front().p4.Pt();
136 cout << recEvt->evtNo <<
' ' << evtID <<
' ' << it->second << endl;
141 if (recJets->size() > 0 && artifacts_minpt > 0) {
142 const auto&
recjet = recJets->begin();
143 bool matched =
false;
144 for (
const auto&
genjet: *genJets)
146 float maxgenpt = genJets->size() > 0 ? genJets->front().p4.Pt()
147 : genEvt->hard_scale;
148 if (
recjet->
p4.Pt() > max(2*maxgenpt, artifacts_minpt))
155 recEvt->weights *= 0;
156 genveto(*genJets, genEvt->weights.front());
157 genveto(*recJets, genEvt->weights.front() * recEvt->weights.front());
158 PUgenveto(*genJets, *recJets, *genEvt, *recEvt, *
pileup);
163 corrected(*genJets, genEvt->weights.front());
164 corrected(*recJets, genEvt->weights.front() * recEvt->weights.front());
165 PUafter(*genJets, *recJets, *genEvt, *recEvt, *
pileup);
167 if (steering &
DT::fill) tOut->Fill();
170 metainfo.Set<
bool>(
"git",
"complete",
true);
174 corrected.Write(fOut);
175 PUbefore.Write(fOut);
176 PUgenveto.Write(fOut);
179 cout << __func__ <<
' ' << slice <<
" stop" << endl;