36{
37 void DuplicateChecker ::
38 testInvariant () const
39 {
41 }
42
43
44
45 DuplicateChecker ::
46 DuplicateChecker ()
47 : m_eventInfoName ("EventInfo")
48 {
50 }
51
52
53
54 const std::string& DuplicateChecker ::
55 eventInfoName () const
56 {
58 return m_eventInfoName;
59 }
60
61
62
63 void DuplicateChecker ::
64 setEventInfoName (const std::string& val_eventInfoName)
65 {
67 m_eventInfoName = val_eventInfoName;
68 }
69
70
71
72 const std::string& DuplicateChecker ::
73 outputTreeName () const
74 {
76 return m_outputTreeName;
77 }
78
79
80
81 void DuplicateChecker ::
82 setOutputTreeName (const std::string& val_outputTreeName)
83 {
85 m_outputTreeName = val_outputTreeName;
86 }
87
88
89
90 void DuplicateChecker ::
91 addKnownDuplicate (const std::string& sampleName,
92 const std::string& fileName,
93 Long64_t entry, number_type runNumber,
94 number_type eventNumber)
95 {
97 m_duplicates[std::make_pair (sampleName, fileName)].insert
98 (std::make_pair (entry, std::make_pair (runNumber, eventNumber)));
99 }
100
101
102
103 void DuplicateChecker ::
104 addKnownDuplicatesFile (const std::string& duplicatesFile)
105 {
106 std::ifstream
file (duplicatesFile);
108 while (std::getline (
file, line))
109 {
110 if (!
line.empty() && line[0] !=
'#')
111 {
115 std::istringstream
str (line);
116 if (!(
str >> sampleName >> fileName >> entry >> runNumber >> eventNumber))
118 addKnownDuplicate (sampleName, fileName, entry, runNumber, eventNumber);
119 }
120 }
121 }
122
123
124
125 bool DuplicateChecker ::
126 processSummary (const std::string& submitdir, const std::string& treeName)
127 {
129 sh.load (submitdir +
"/hist");
131 return processSummary (
sh, submitdir +
"/duplicates");
132 }
133
134
135
136 bool DuplicateChecker ::
138 {
140 bool success = true;
142 {
143 std::set<std::pair<number_type,number_type>> known_list;
144 std::set<std::pair<number_type,number_type>> processed_list;
145
146 std::unique_ptr<TChain>
tree (
sample->makeTChain());
147 std::string *inputFileName = nullptr;
148 tree->SetBranchAddress (
"fileName", &inputFileName);
149 Long64_t inputFileIndex;
150 tree->SetBranchAddress (
"fileIndex", &inputFileIndex);
152 tree->SetBranchAddress (
"runNumber", &runNumber);
154 tree->SetBranchAddress (
"eventNumber", &eventNumber);
155 Bool_t processed;
156 tree->SetBranchAddress (
"processed", &processed);
157 for (Long64_t entry = 0,
entries =
tree->GetEntries();
159 {
160 if (
tree->GetEntry (entry) < 0)
162 std::pair<number_type,number_type>
id (runNumber, eventNumber);
163
164 if (known_list.find (id) == known_list.end())
165 known_list.insert (id);
166 else
167 {
168 file <<
sample->name() <<
" " << *inputFileName <<
" "
169 << inputFileIndex <<
" " <<
runNumber <<
" "
171 }
172
173 if (processed)
174 {
175 if (processed_list.find (id) == processed_list.end())
176 processed_list.insert (id);
177 else
178 {
179 success = false;
180 std::cout << "ERROR: duplicate event processed: "
183 }
184 }
185 }
186 if (known_list.size() != processed_list.size())
187 {
188 RCU_ASSERT (processed_list.size() < known_list.size());
189 success = false;
190 for (auto& id : known_list)
191 {
192 if (processed_list.find (id) == processed_list.end())
193 {
194 std::cout << "ERROR: event never processed: "
197 }
198 }
199 }
200 }
201 return success;
202 }
203
204
205
206 StatusCode DuplicateChecker ::
207 setupJob (Job& job)
208 {
211 return StatusCode::SUCCESS;
212 }
213
214
215
216 StatusCode DuplicateChecker ::
217 changeInput (bool )
218 {
220 m_inputFileName = wk()->inputFileName();
221
222 auto iter = m_duplicates.find
224 if (iter != m_duplicates.end())
225 m_currentDuplicates = &
iter->second;
226 else
227 m_currentDuplicates = nullptr;
228 return StatusCode::SUCCESS;
229 }
230
231
232
233 StatusCode DuplicateChecker ::
234 initialize ()
235 {
237
238 m_event = wk()->xaodEvent();
239
240 if (!m_outputTreeName.empty())
241 {
242 m_outputTree = new TTree (m_outputTreeName.c_str(), "DuplicateChecker tree");
243 wk()->addOutput (m_outputTree);
244 m_outputTree->Branch ("fileName", &m_inputFileName);
245 m_outputTree->Branch ("fileIndex", &m_inputFileIndex, "inputFileIndex/L");
246 m_outputTree->Branch ("runNumber", &m_runNumber, "runNumber/i");
247 m_outputTree->Branch ("eventNumber", &m_eventNumber, "eventNumber/i");
248 m_outputTree->Branch ("processed", &m_processEvent, "processed/O");
249 }
250
251 return StatusCode::SUCCESS;
252 }
253
254
255
256 StatusCode DuplicateChecker ::
257 execute ()
258 {
260
261 read_run_event_number ();
262 m_processEvent = true;
263
264 const std::pair<number_type,number_type>
id (m_runNumber, m_eventNumber);
265
266 if (m_currentDuplicates != nullptr)
267 {
268 auto iter = m_currentDuplicates->find (wk()->treeEntry());
269 if (iter != m_currentDuplicates->end())
270 {
271 if (
id !=
iter->second)
272 {
274 <<
" to be run=" <<
iter->second.first <<
",event="
275 <<
iter->second.second <<
" but found run="
276 << id.first << ",event=" << id.second);
277 return StatusCode::FAILURE;
278 }
279 m_processEvent = false;
280 }
281 }
282
283
284 if (m_processEvent)
285 {
286 if (m_processed.find (id) != m_processed.end())
287 {
289 << " event=" << id.second << " in file "
290 << wk()->inputFileName() << " at event "
291 << wk()->treeEntry());
292 m_processEvent = false;
293 } else
294 m_processed.insert (id);
295 }
296 if (m_processEvent == false)
297 wk()->skipEvent ();
298 if (m_outputTree)
299 {
300 m_inputFileIndex = wk()->treeEntry ();
301 m_outputTree->Fill ();
302
303 }
304
305 return StatusCode::SUCCESS;
306 }
307
308
309
310 void DuplicateChecker ::
311 read_run_event_number ()
312 {
314 if (m_event->retrieve (info, m_eventInfoName).isFailure())
316
317 m_runNumber =
info->runNumber();
318 m_eventNumber =
info->eventNumber();
319 }
320}
#define RCU_CHANGE_INVARIANT(x)
#define RCU_NEW_INVARIANT(x)
#define RCU_READ_INVARIANT(x)
#define ATH_MSG_WARNING(x)
#define RCU_THROW_MSG(message)
A class that manages a list of Sample objects.
a base class that manages a set of files belonging to a particular data set and the associated meta-d...
EventInfo_v1 EventInfo
Definition of the latest event info version.