ATLAS Offline Software
Loading...
Searching...
No Matches
PersistentAccessor.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
10#include "LArCafJobs/CellInfo.h"
12#include "TFile.h"
13#include "TTree.h"
14#include "TSystem.h"
15#include "TString.h"
16#include <iostream>
17#include <fstream>
18#include <iomanip>
19
20using std::cout;
21using std::endl;
22
23using namespace LArSamples;
24
25
28 m_historyCont(nullptr), m_historyContSC(nullptr), m_eventData(nullptr), m_runData(nullptr)
29{
30 ClassCounts::incrementInstanceCount("PersistentAccessor");
31 m_cellTree->SetBranchAddress("history", &m_historyCont);
32 m_SCTree->SetBranchAddress("historySC", &m_historyContSC);
33 m_eventTree->SetBranchAddress("event", &m_eventData);
34 m_eventTree->LoadBaskets(); // loads the tree to memory
35 if (m_eventTree->MemoryFull(0)) {
36 cout << "WARNING: could not load all the baskets of the event tree into memory -- processing will be very slow." << endl;
37 cout << "Please check if the file you are loading is too large or corrupted." << endl;
38 }
39 if (m_runTree) {
40 m_runTree->SetBranchAddress("run", &m_runData);
41 m_runTree->LoadBaskets();
42 }
43}
44
45
47 : m_cellTree(nullptr), m_SCTree(nullptr), m_eventTree(nullptr), m_runTree(nullptr), m_file(nullptr),
48 m_historyCont(nullptr), m_historyContSC(nullptr), m_eventData(nullptr), m_runData(nullptr)
49{
50 ClassCounts::incrementInstanceCount("PersistentAccessor");
51 if (TString(fileName) != "") m_file = new TFile(fileName, "RECREATE");
52 if (m_file && !m_file->IsOpen()) { delete m_file; m_file = nullptr; }
53 m_cellTree = new TTree("cells", "");
54 m_SCTree = new TTree("SC", "");
55 m_eventTree = new TTree("events", "");
56 m_runTree = new TTree("runs", "");
57 m_cellTree->Branch("history", &m_historyCont, 32000, 0);
58 m_SCTree->Branch("historySC", &m_historyContSC, 32000, 0);
59 m_eventTree->Branch("event", &m_eventData, 32000, 0);
60 m_runTree->Branch("run", &m_runData, 32000, 0);
61 m_eventTree->SetAutoSave(0); // keep everything in memory
62 m_eventTree->SetAutoFlush(0); // keep everything in memory
63 m_runTree->SetAutoSave(0); // keep everything in memory
64 m_runTree->SetAutoFlush(0); // keep everything in memory
65}
66
67
69{
70 TFile* file = TFile::Open(fileName);
71 if (!file) return nullptr;
72 if (!file->IsOpen()) { delete file; return nullptr; }
73 TTree* cellTree = (TTree*)file->Get("cells");
74 if (!cellTree) return nullptr;
75 TTree* SCTree = (TTree*)file->Get("SC");
76 if (!SCTree) return nullptr;
77 TTree* eventTree = (TTree*)file->Get("events");
78 if (!eventTree) return nullptr;
79 TTree* runTree = (TTree*)file->Get("runs");
81 return accessor;
82}
83
84
86{
87 ClassCounts::decrementInstanceCount("PersistentAccessor");
88 for (std::map<unsigned int, const RunData*>::iterator run = m_runCache.begin();
89 run != m_runCache.end(); ++run)
90 delete run->second;
91 if (m_file)
92 delete m_file;
93 else {
94 delete m_cellTree;
95 delete m_SCTree;
96 delete m_eventTree;
97 delete m_runTree;
98 }
99 if (m_historyCont) delete m_historyCont;
101 if (m_eventData) delete m_eventData;
102 if (m_runData) delete m_runData;
103}
104
105
107{
108 m_cellTree->GetEntry(i);
109 return m_historyCont;
110}
111
113{
114 m_SCTree->GetEntry(i);
115 return m_historyContSC;
116}
117
118
119unsigned int PersistentAccessor::historySize(unsigned int i) const
120{
121 const HistoryContainer* cont = historyContainer(i);
122 return (cont ? cont->nDataContainers() : 0);
123}
124
125unsigned int PersistentAccessor::historySizeSC(unsigned int i) const
126{
127 const HistoryContainer* cont = historyContainerSC(i);
128 return (cont ? cont->nDataContainers() : 0);
129}
130
131
132const EventData* PersistentAccessor::eventData(unsigned int i) const
133{
134 if (i >= nEvents()) return nullptr;
135 m_eventTree->GetEntry(i);
136 m_eventData->setRunData(runData(m_eventData->runIndex()));
137 return m_eventData;
138}
139
140
141const RunData* PersistentAccessor::runData(unsigned int i) const
142{
143 if (i >= nRuns()) return nullptr;
144 std::map<unsigned int, const RunData*>::const_iterator cache = m_runCache.find(i);
145 if (cache != m_runCache.end()) return cache->second;
146
147 m_runTree->GetEntry(i);
148 RunData* newRunData = new RunData(*m_runData);
149 m_runCache[m_eventData->runIndex()] = newRunData;
150 return newRunData;
151}
152
153
155{
156 return (m_file ? m_file->GetName() : "");
157}
158
159
161{
162 m_historyCont = cont;
163 m_cellTree->Fill();
164 m_historyCont = nullptr;
165}
166
168{
169 m_historyContSC = cont;
170 m_SCTree->Fill();
171 m_historyContSC = nullptr;
172}
173
174
181
182
184{
186 m_runTree->Fill();
187 m_runData = nullptr;
188}
189
190
192{
193 if (!m_file) return 0;
194 m_file->cd();
195 cout << "Writing " << m_runTree->GetEntries() << " run(s)..." << endl;
196 m_runTree->Write();
197 cout << "Writing " << m_eventTree->GetEntries() << " event(s)..." << endl;
198 m_eventTree->Write();
199 cout << "Writing " << m_cellTree->GetEntries() << " cell(s)..." << endl;
200 m_cellTree->Write();
201 cout << "Writing " << m_SCTree->GetEntries() << " SC(s)..." << endl;
202 m_SCTree->Write();
203 m_file->Flush();
204 cout << "Writing done!" << endl;
205 return true;
206}
207
208
209PersistentAccessor* PersistentAccessor::merge(const std::vector<const PersistentAccessor*>& accessors,
210 const TString& fileName)
211{
213 unsigned int size = 0;
214 CellInfo* info = nullptr;
215
216 int evtIndex = 0, runIndex = 0;
217 std::map<std::pair<int, int>, int> evtMap;
218 std::map<int, int> runMap;
219 std::map< std::pair<const PersistentAccessor*, int>, int > evtAccMap;
220
221 cout << "Merging runs" << endl;
222 for (const PersistentAccessor* accessor : accessors) {
223 if (!accessor) {
224 cout << "Cannot merge: one of the inputs is null!" << endl;
225 delete newAcc;
226 return nullptr;
227 }
228 for (unsigned int i = 0; i < accessor->nRuns(); i++) {
229 int run = accessor->runData(i)->run();
230 if (runMap.find(run) != runMap.end()) continue;
231 runMap[run] = runIndex;
232 RunData* newRun = new RunData(*accessor->runData(i));
233 newAcc->addRun(newRun);
234 delete newRun;
235 runIndex++;
236 }
237 }
238
239 cout << "Merging events" << endl;
240 unsigned int nEventsTotal = 0, iEvt = 0;
241 for (const PersistentAccessor* accessor : accessors) {
242 nEventsTotal += accessor->nEvents();
243 }
244 for (const PersistentAccessor* accessor : accessors) {
245 for (unsigned int i = 0; i < accessor->nEvents(); i++) {
246 iEvt++;
247 if (iEvt % 100000 == 0) cout << "Merging event " << iEvt << "/" << nEventsTotal << endl;
248 std::pair<int, int> evtId(accessor->eventData(i)->run(), accessor->eventData(i)->event());
249 std::pair<const PersistentAccessor*, int> evtAccId(accessor, i);
250 if (evtMap.find(evtId) != evtMap.end()) {
251 cout << "ERROR: Skipping duplicate entry for run " << accessor->eventData(i)->run() << ", event " << accessor->eventData(i)->event() << endl;
252 continue;
253 }
254 evtAccMap[evtAccId] = evtIndex;
255 evtMap[evtId] = evtIndex;
256 std::map<int, int>::const_iterator idx = runMap.find(accessor->eventData(i)->run());
257 int newRunIndex = (idx == runMap.end() ? -999 : idx->second);
258 //cout << "Storing eventData for run " << accessor->eventData(i)->run() << " at index " << newRunIndex << " instead of " << accessor->eventData(i)->runIndex() << endl;
259 EventData* newEvent = new EventData(*accessor->eventData(i), newRunIndex);
260 newAcc->addEvent(newEvent);
261 delete newEvent;
262 evtIndex++;
263 }
264 }
265
266 cout << "Merging cells" << endl;
267 for (unsigned int i = 0; i < Definitions::nChannels; i++) {
268 if (i % 10000 == 0) {
269 cout << "Merging channel " << i << "/" << Definitions::nChannels << " (current size = " << size << ")" << endl;
270 //ClassCounts::printCountsTable();
271 }
272 HistoryContainer* newHistory = nullptr;
273 for (const PersistentAccessor* accessor : accessors) {
274 const HistoryContainer* history = accessor->historyContainer(i);
275 if (!history || !history->isValid()) continue;
276 if (!newHistory) {
277 info = new CellInfo(*history->cellInfo());
278 newHistory = new HistoryContainer(info);
279 }
280 for (unsigned int j = 0; j < history->nDataContainers(); j++) {
281 DataContainer* newDC = new DataContainer(*history->dataContainer(j));
282 std::map<std::pair<const PersistentAccessor*, int>, int>::const_iterator newIndex
283 = evtAccMap.find(std::make_pair(accessor, history->dataContainer(j)->eventIndex()));
284 if (newIndex == evtAccMap.end()) cout << "Event not found for cell " << i << ", data " << j << "." << endl;
285 newDC->setEventIndex(newIndex != evtAccMap.end() ? newIndex->second : -1);
286 newHistory->add(newDC);
287 if (!info->shape(history->dataContainer(j)->gain())) {
288 const ShapeInfo* shape = history->cellInfo()->shape(history->dataContainer(j)->gain());
289 //if (!shape)
290 // cout << "Shape not filled for hash = " << i << ", index = " << j << ", gain = " << history->dataContainer(j)->gain() << endl;
291 info->setShape(history->dataContainer(j)->gain(), (shape ? new ShapeInfo(*shape) : nullptr));
292 }
293 }
294 }
295 if (newHistory) size += newHistory->nDataContainers();
296 newAcc->add(newHistory);
297 delete newHistory;
298 }
299
300
301 cout << "Merging SC" << endl;
302 size=0;
303 for (unsigned int i = 0; i < Definitions::nChannelsSC; i++) {
304 if (i % 10000 == 0) {
305 cout << "Merging channel " << i << "/" << Definitions::nChannelsSC << " (current size = " << size << ")" << endl;
306 //ClassCounts::printCountsTable();
307 }
308 HistoryContainer* newHistory = nullptr;
309 for (const PersistentAccessor* accessor : accessors) {
310 const HistoryContainer* history = accessor->historyContainerSC(i);
311 if (!history || !history->isValid()) continue;
312 if (!newHistory) {
313 info = new CellInfo(*history->cellInfo());
314 newHistory = new HistoryContainer(info);
315 }
316 for (unsigned int j = 0; j < history->nDataContainers(); j++) {
317 DataContainer* newDC = new DataContainer(*history->dataContainer(j));
318 std::map<std::pair<const PersistentAccessor*, int>, int>::const_iterator newIndex
319 = evtAccMap.find(std::make_pair(accessor, history->dataContainer(j)->eventIndex()));
320 if (newIndex == evtAccMap.end()) cout << "Event not found for cell " << i << ", data " << j << "." << endl;
321 newDC->setEventIndex(newIndex != evtAccMap.end() ? newIndex->second : -1);
322 newHistory->add(newDC);
323 if (!info->shape(history->dataContainer(j)->gain())) {
324 const ShapeInfo* shape = history->cellInfo()->shape(history->dataContainer(j)->gain());
325 //if (!shape)
326 // cout << "Shape not filled for hash = " << i << ", index = " << j << ", gain = " << history->dataContainer(j)->gain() << endl;
327 info->setShape(history->dataContainer(j)->gain(), (shape ? new ShapeInfo(*shape) : nullptr));
328 }
329 }
330 }
331 if (newHistory) size += newHistory->nDataContainers();
332 newAcc->addSC(newHistory);
333 delete newHistory;
334 }
335
336
337 cout << "Merging done, final size = " << size << endl;
338 newAcc->save();
339 return newAcc;
340}
341
342
343PersistentAccessor* PersistentAccessor::merge(const std::vector<TString>& inputFiles, const TString& fileName)
344{
345 std::vector<const PersistentAccessor*> accessors;
346 for (const TString& inputFile : inputFiles) {
347 PersistentAccessor* accessor = open(inputFile);
348 if (!accessor) {
349 cout << "ERROR : could not open file " << inputFile << endl;
350 return nullptr;
351 }
352 accessors.push_back(accessor);
353 }
355 for (const PersistentAccessor* accessor : accessors) {
356 delete accessor;
357 }
358 return result;
359}
const ShapeInfo * shape(CaloGain::CaloGain gain) const
Definition CellInfo.cxx:78
CaloGain::CaloGain gain() const
void setEventIndex(int index)
void add(const DataContainer *data)
append data (takes ownership)
const CellInfo * cellInfo() const
unsigned int nDataContainers() const
const DataContainer * dataContainer(unsigned int i) const
const RunData * runData(unsigned int i) const
void addEvent(EventData *eventData)
const HistoryContainer * historyContainer(unsigned int i) const
unsigned int historySizeSC(unsigned int i) const
const HistoryContainer * historyContainerSC(unsigned int i) const
static PersistentAccessor * open(const TString &fileName)
static PersistentAccessor * merge(const std::vector< const PersistentAccessor * > &accessors, const TString &fileName)
void add(HistoryContainer *cont)
unsigned int historySize(unsigned int i) const
std::map< unsigned int, const RunData * > m_runCache
PersistentAccessor(TTree &cellTree, TTree &SCTree, TTree &eventTree, TTree *runTree, TFile *file)
Constructor.
const EventData * eventData(unsigned int i) const
void addSC(HistoryContainer *cont)
Definition merge.py:1
Definition run.py:1