143 cout << __func__ <<
' ' << slice <<
" start" << endl;
147 auto tIn1 = flow1.GetInputTree(slice);
148 auto tIn2 = flow2.GetInputTree(slice);
149 auto tOut2 = flow2.GetOutputTree(output);
150 auto tOut1 = flow1.GetOutputTree(output);
157 auto isMC = metainfo1.Get<
bool>(
"flags",
"isMC");
158 auto minpt = metainfo1.Get<
float>(
"skims",
"jets",
"minpt");
159 auto R = metainfo1.Get<
int>(
"flags",
"R");
163 auto recEvent1 = flow1.GetBranchReadWrite<RecEvent>(
"recEvent");
164 auto recEvent2 = flow2.GetBranchReadOnly <RecEvent>(
"recEvent");
165 auto genEvent1 =
isMC ? flow1.GetBranchReadWrite<GenEvent>(
"genEvent") :
nullptr;
166 auto genEvent2 =
isMC ? flow2.GetBranchReadOnly <GenEvent>(
"genEvent") :
nullptr;
167 auto recJets1 = flow1.GetBranchReadWrite<vector<RecJet>>(
"recJets");
168 auto recJets2 = flow2.GetBranchReadOnly <vector<RecJet>>(
"recJets");
169 auto genJets1 =
isMC ? flow1.GetBranchReadWrite<vector<GenJet>>(
"genJets") :
nullptr;
170 auto genJets2 =
isMC ? flow2.GetBranchReadOnly <vector<GenJet>>(
"genJets") :
nullptr;
172 const auto strategyStr =
config.get<
string>(
"corrections.event_mixing.overlap");
177 map<Long64_t, size_t> lastUsedIndex;
179 Long64_t matchedEvents = 0;
181 for (
DT::Looper looper(tIn1); looper(); ++looper) {
185 int run1 = recEvent1->runNo;
187 if (runToEntries.find(run1) == runToEntries.end())
191 const auto& matchingEntries = runToEntries[run1];
193 size_t currentIndex = lastUsedIndex[run1];
194 Long64_t entry2 = matchingEntries[currentIndex];
195 tIn2->GetEntry(entry2);
198 if (recEvent1->runNo != recEvent2->runNo)
199 BOOST_THROW_EXCEPTION(
DE::BadInput((
"Run number mismatch: " + to_string(recEvent1->runNo) +
" != " + to_string(recEvent2->runNo)).c_str(), tIn1));
202 lastUsedIndex[run1] = (currentIndex + 1) % matchingEntries.size();
204 if (recJets1 && recJets2) {
206 recJets1->insert(recJets1->end(), recJets2->begin(), recJets2->end());
207 recEvent1->weights.front() *= recEvent2->weights.front();
209 sort(recJets1->begin(), recJets1->end(),
pt_sort);
212 case RemovalStrategy::DeltaR:
215 case RemovalStrategy::AntikT:{
217 vector<fjcore::PseudoJet> inclusive_recJets =
cluster(*recJets1, R/10.0);
222 if (nJets1 != nJets2) {
223 cout <<
"Jet multiplicity changed: " << nJets1 <<
" -> " << nJets2 << endl;
225 for (
const auto& jet : *recJets1) cout << jet.CorrPt() <<
" ";
226 cout <<
"\nAnti-kT: ";
227 for (
const auto& jet : inclusive_recJets) cout << jet.pt() <<
" ";
236 if (
isMC && genJets1 && genJets2) {
238 genJets1->insert(genJets1->end(), genJets2->begin(), genJets2->end());
239 genEvent1->weights.front() *= genEvent2->weights.front();
241 sort(genJets1->begin(), genJets1->end(),
pt_sort);
244 case RemovalStrategy::DeltaR:
247 case RemovalStrategy::AntikT:{
249 vector<fjcore::PseudoJet> inclusive_genJets =
cluster(*genJets1, R/10.0);
254 if (nJets1 != nJets2) {
255 cout <<
"Jet multiplicity changed: " << nJets1 <<
" -> " << nJets2 << endl;
257 for (
const auto& jet : *genJets1) cout << jet.CorrPt() <<
" ";
258 cout <<
"\nAnti-kT: ";
259 for (
const auto& jet : inclusive_genJets) cout << jet.pt() <<
" ";
269 if (steering &
DT::fill) tOut1->Fill();
273 cout <<
"Processed " << tIn1->GetEntries() <<
" events, matched " << matchedEvents <<
" events ("
274 << fixed << setprecision(2) << matchedEvents * 100.0 / tIn1->GetEntries() <<
"%)." << endl;
276 metainfo1.Set<
bool>(
"git",
"complete",
true);
277 cout << __func__ <<
' ' << slice <<
" stop" << endl;