108 cout << __func__ <<
' ' << slice <<
" start" << endl;
112 auto tIn1 = flow1.GetInputTree(slice);
113 auto tIn2 = flow2.GetInputTree(slice);
114 auto tOut2 = flow2.GetOutputTree(output);
115 auto tOut1 = flow1.GetOutputTree(output);
122 auto isMC = metainfo1.Get<
bool>(
"flags",
"isMC");
123 auto R = metainfo1.Get<
int>(
"flags",
"R");
125 auto recEvent1 = flow1.GetBranchReadWrite<RecEvent>(
"recEvent");
126 auto recEvent2 = flow2.GetBranchReadOnly <RecEvent>(
"recEvent");
127 auto genEvent1 =
isMC ? flow1.GetBranchReadWrite<GenEvent>(
"genEvent") :
nullptr;
128 auto genEvent2 =
isMC ? flow2.GetBranchReadOnly <GenEvent>(
"genEvent") :
nullptr;
129 auto recJets1 = flow1.GetBranchReadWrite<vector<RecJet>>(
"recJets");
130 auto recJets2 = flow2.GetBranchReadOnly <vector<RecJet>>(
"recJets");
131 auto recMuons1 = flow1.GetBranchReadWrite<vector<RecMuon>>(
"recMuons",
DT::facultative);
132 auto recMuons2 = flow2.GetBranchReadOnly <vector<RecMuon>>(
"recMuons",
DT::facultative);
133 auto genJets1 =
isMC ? flow1.GetBranchReadWrite<vector<GenJet>>(
"genJets") :
nullptr;
134 auto genJets2 =
isMC ? flow2.GetBranchReadOnly <vector<GenJet>>(
"genJets") :
nullptr;
135 auto genMuons1 =
isMC ? flow1.GetBranchReadWrite<vector<GenMuon>>(
"genMuons",
DT::facultative) :
nullptr;
136 auto genMuons2 =
isMC ? flow2.GetBranchReadOnly <vector<GenMuon>>(
"genMuons",
DT::facultative) :
nullptr;
137 auto recPVs1 = flow1.GetBranchReadOnly<vector<PrimaryVertex>>(
"recPVs");
138 auto recPVs2 = flow2.GetBranchReadOnly<vector<PrimaryVertex>>(
"recPVs");
139 auto genPVs1 =
isMC ? flow1.GetBranchReadOnly<vector<PrimaryVertex>>(
"genPVs") :
nullptr;
140 auto genPVs2 =
isMC ? flow2.GetBranchReadOnly<vector<PrimaryVertex>>(
"genPVs") :
nullptr;
142 const auto minpt =
config.get<
float>(
"skims.jets.minpt");
143 const auto strategyStr =
config.get<
string>(
"corrections.event_mixing.overlap");
148 map<Long64_t, size_t> lastUsedIndex;
150 Long64_t matchedEvents = 0;
152 for (
DT::Looper looper(tIn1); looper(); ++looper) {
156 int run1 = recEvent1->runNo;
158 if (runToEntries.find(run1) == runToEntries.end())
161 const auto& matchingEntries = runToEntries[run1];
162 size_t currentIndex = lastUsedIndex[run1];
163 if (currentIndex >= matchingEntries.size())
continue;
164 Long64_t entry2 = matchingEntries[currentIndex];
165 tIn2->GetEntry(entry2);
166 lastUsedIndex[run1] = currentIndex + 1;
169 if (recEvent1->runNo != recEvent2->runNo)
170 cerr <<
orange <<
"Run number mismatch: " << recEvent1->runNo <<
" != " << recEvent2->runNo <<
def << endl;
171 if (recPVs1->front().z != recPVs2->front().z)
172 cerr <<
orange <<
"Unmatched rec-level primary vertex: " << recPVs1->front().z <<
" != " << recPVs2->front().z <<
def << endl;
174 if (recJets1 && recJets2) {
176 recJets1->insert(recJets1->end(), recJets2->begin(), recJets2->end());
177 sort(recJets1->begin(), recJets1->end(),
pt_sort);
180 case RemovalStrategy::DeltaR:
183 case RemovalStrategy::AntikT:{
185 vector<fjcore::PseudoJet> inclusive_recJets =
cluster(*recJets1, R/10.0);
190 if (nJets1 != nJets2) {
191 cout <<
"Jet multiplicity changed: " << nJets1 <<
" -> " << nJets2 << endl;
193 for (
const auto& jet : *recJets1) cout << jet.CorrPt() <<
" ";
194 cout <<
"\nAnti-kT: ";
195 for (
const auto& jet : inclusive_recJets) cout << jet.pt() <<
" ";
204 if (recMuons1 && recMuons2) {
206 recMuons1->insert(recMuons1->end(), recMuons2->begin(), recMuons2->end());
207 sort(recMuons1->begin(), recMuons1->end(),
pt_sort);
210 if ((recJets1 && recJets2) || (recMuons1 && recMuons2))
211 recEvent1->weights.front() *= recEvent2->weights.front();
214 if (genJets1 && genJets2) {
216 if (genPVs1->front().z != genPVs2->front().z)
217 BOOST_THROW_EXCEPTION(
DE::BadInput((
"Unmatched gen-level primary vertex: " + to_string(genPVs1->front().z) +
" != " + to_string(genPVs2->front().z)).c_str(), tIn1));
219 genJets1->insert(genJets1->end(), genJets2->begin(), genJets2->end());
221 sort(genJets1->begin(), genJets1->end(),
pt_sort);
224 case RemovalStrategy::DeltaR:
227 case RemovalStrategy::AntikT:{
229 vector<fjcore::PseudoJet> inclusive_genJets =
cluster(*genJets1, R/10.0);
234 if (nJets1 != nJets2) {
235 cout <<
"Jet multiplicity changed: " << nJets1 <<
" -> " << nJets2 << endl;
237 for (
const auto& jet : *genJets1) cout << jet.CorrPt() <<
" ";
238 cout <<
"\nAnti-kT: ";
239 for (
const auto& jet : inclusive_genJets) cout << jet.pt() <<
" ";
248 if (genMuons1 && genMuons2) {
250 genMuons1->insert(genMuons1->end(), genMuons2->begin(), genMuons2->end());
251 sort(genMuons1->begin(), genMuons1->end(),
pt_sort);
254 if ((genJets1 && genJets2) || (genMuons1 && genMuons2))
255 genEvent1->weights.front() *= genEvent2->weights.front();
258 if (steering &
DT::fill) tOut1->Fill();
262 cout <<
"Processed " << tIn1->GetEntries() <<
" events, matched " << matchedEvents <<
" events ("
263 << fixed << setprecision(2) << matchedEvents * 100.0 / min(tIn1->GetEntries(), tIn2->GetEntries()) <<
"%)." << endl;
265 metainfo1.Set<
bool>(
"git",
"complete",
true);
266 cout << __func__ <<
' ' << slice <<
" stop" << endl;