37 void DuplicateChecker ::
38 testInvariant ()
const
45 : m_eventInfoName (
"EventInfo")
52 const std::string& DuplicateChecker ::
53 eventInfoName ()
const
56 return m_eventInfoName;
61 void DuplicateChecker ::
62 setEventInfoName (
const std::string& val_eventInfoName)
65 m_eventInfoName = val_eventInfoName;
70 const std::string& DuplicateChecker ::
71 outputTreeName ()
const
74 return m_outputTreeName;
79 void DuplicateChecker ::
80 setOutputTreeName (
const std::string& val_outputTreeName)
83 m_outputTreeName = val_outputTreeName;
88 void DuplicateChecker ::
89 addKnownDuplicate (
const std::string& sampleName,
90 const std::string& fileName,
91 Long64_t entry, number_type runNumber,
92 number_type eventNumber)
95 m_duplicates[std::make_pair (sampleName, fileName)].insert
96 (std::make_pair (entry, std::make_pair (runNumber, eventNumber)));
101 void DuplicateChecker ::
102 addKnownDuplicatesFile (
const std::string& duplicatesFile)
104 std::ifstream
file (duplicatesFile);
106 while (std::getline (
file, line))
108 if (!line.empty() && line[0] !=
'#')
110 std::string sampleName, fileName;
112 number_type runNumber, eventNumber;
113 std::istringstream
str (line);
114 if (!(
str >> sampleName >> fileName >> entry >> runNumber >> eventNumber))
115 throw std::runtime_error (
"failed to parse line: " + line);
116 addKnownDuplicate (sampleName, fileName, entry, runNumber, eventNumber);
123 bool DuplicateChecker ::
124 processSummary (
const std::string& submitdir,
const std::string& treeName)
127 sh.load (submitdir +
"/hist");
129 return processSummary (
sh, submitdir +
"/duplicates");
134 bool DuplicateChecker ::
137 std::ofstream
file (outputFile.c_str());
141 std::set<std::pair<number_type,number_type>> known_list;
142 std::set<std::pair<number_type,number_type>> processed_list;
144 std::unique_ptr<TChain>
tree (sample->makeTChain());
145 std::string *inputFileName =
nullptr;
146 tree->SetBranchAddress (
"fileName", &inputFileName);
147 Long64_t inputFileIndex;
148 tree->SetBranchAddress (
"fileIndex", &inputFileIndex);
149 number_type runNumber;
150 tree->SetBranchAddress (
"runNumber", &runNumber);
151 number_type eventNumber;
152 tree->SetBranchAddress (
"eventNumber", &eventNumber);
154 tree->SetBranchAddress (
"processed", &processed);
155 for (Long64_t entry = 0,
entries =
tree->GetEntries();
158 if (
tree->GetEntry (entry) < 0)
159 throw std::runtime_error (
"failed to read tree entry");
160 std::pair<number_type,number_type> id (runNumber, eventNumber);
162 if (known_list.find (
id) == known_list.end())
163 known_list.insert (
id);
166 file << sample->name() <<
" " << *inputFileName <<
" "
167 << inputFileIndex <<
" " << runNumber <<
" "
168 << eventNumber << std::endl;
173 if (processed_list.find (
id) == processed_list.end())
174 processed_list.insert (
id);
178 std::cout <<
"ERROR: duplicate event processed: "
179 << sample->name() <<
" "
180 << runNumber <<
" " << eventNumber << std::endl;
184 if (known_list.size() != processed_list.size())
186 RCU_ASSERT (processed_list.size() < known_list.size());
188 for (
auto&
id : known_list)
190 if (processed_list.find (
id) == processed_list.end())
192 std::cout <<
"ERROR: event never processed: "
193 << sample->name() <<
" "
194 << runNumber <<
" " << eventNumber << std::endl;
209 return StatusCode::SUCCESS;
218 m_inputFileName = wk()->inputFileName();
220 auto iter = m_duplicates.find
222 if (iter != m_duplicates.end())
223 m_currentDuplicates = &iter->second;
225 m_currentDuplicates =
nullptr;
226 return StatusCode::SUCCESS;
236 m_event = wk()->xaodEvent();
238 if (!m_outputTreeName.empty())
240 m_outputTree =
new TTree (m_outputTreeName.c_str(),
"DuplicateChecker tree");
241 wk()->addOutput (m_outputTree);
242 m_outputTree->Branch (
"fileName", &m_inputFileName);
243 m_outputTree->Branch (
"fileIndex", &m_inputFileIndex,
"inputFileIndex/L");
244 m_outputTree->Branch (
"runNumber", &m_runNumber,
"runNumber/i");
245 m_outputTree->Branch (
"eventNumber", &m_eventNumber,
"eventNumber/i");
246 m_outputTree->Branch (
"processed", &m_processEvent,
"processed/O");
249 return StatusCode::SUCCESS;
259 read_run_event_number ();
260 m_processEvent =
true;
262 const std::pair<number_type,number_type> id (m_runNumber, m_eventNumber);
264 if (m_currentDuplicates !=
nullptr)
266 auto iter = m_currentDuplicates->find (wk()->treeEntry());
267 if (iter != m_currentDuplicates->end())
269 if (
id != iter->second)
271 ATH_MSG_FATAL (
"expected duplicate event at entry " << iter->first
272 <<
" to be run=" << iter->second.first <<
",event="
273 << iter->second.second <<
" but found run="
274 <<
id.first <<
",event=" <<
id.second);
275 return StatusCode::FAILURE;
277 m_processEvent =
false;
284 if (m_processed.find (
id) != m_processed.end())
287 <<
" event=" <<
id.second <<
" in file "
288 << wk()->inputFileName() <<
" at event "
289 << wk()->treeEntry());
290 m_processEvent =
false;
292 m_processed.insert (
id);
294 if (m_processEvent ==
false)
298 m_inputFileIndex = wk()->treeEntry ();
299 m_outputTree->Fill ();
303 return StatusCode::SUCCESS;
308 void DuplicateChecker ::
309 read_run_event_number ()
312 if (m_event->retrieve (info, m_eventInfoName).isFailure())
313 throw std::runtime_error (
"didn't find event info \"" + m_eventInfoName +
"\"");
315 m_runNumber = info->runNumber();
316 m_eventNumber = info->eventNumber();