ATLAS Offline Software
Loading...
Searching...
No Matches
MultiTreeAccessor.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
11#include "TSystem.h"
12#include "TChain.h"
13#include <iostream>
14#include <iomanip>
15#include <fstream>
16#include <string>
17
18using std::string;
19using std::cout;
20using std::endl;
21using namespace std;
22
23using namespace LArSamples;
24
25
26MultiTreeAccessor::MultiTreeAccessor(std::vector<std::unique_ptr<const TreeAccessor> >&& accessors)
27 : m_accessors(std::move(accessors))
28{
29}
30
31
32std::unique_ptr<MultiTreeAccessor> MultiTreeAccessor::open(const std::vector<TString>& files)
33{
34 std::vector<std::unique_ptr<const TreeAccessor> > accessors;
35 for (const TString& fileName : files) {
36 std::unique_ptr<const TreeAccessor> accessor = TreeAccessor::open(fileName);
37 if (!accessor) {
38 cout << "Skipping invalid file " << fileName << endl;
39 continue;
40 }
41 accessors.push_back(std::move(accessor));
42 }
43
44 if (accessors.empty()) return nullptr;
45 return std::make_unique<MultiTreeAccessor>(std::move(accessors));
46}
47
48
49std::unique_ptr<MultiTreeAccessor> MultiTreeAccessor::openList(const TString& fileList)
50{
51 std::ifstream f(fileList);
52 if (!f) {
53 cout << "file " << fileList << " not accessible" << endl;
54 return nullptr;
55 }
56
57 std::string fileName;
58 unsigned int i = 0;
59
60 std::vector<std::unique_ptr<const TreeAccessor> > accessors;
61
62 while (f >> fileName) {
63 std::unique_ptr<const TreeAccessor> accessor = TreeAccessor::open(fileName.c_str());
64 if (!accessor) {
65 cout << "Skipping invalid file " << fileName << endl;
66 continue;
67 }
68 cout << std::setw(2) << ++i << " - " << fileName << endl;
69 accessors.push_back(std::move(accessor));
70 }
71
72 if (accessors.empty()) return nullptr;
73 return std::make_unique<MultiTreeAccessor>(std::move(accessors));
74}
75
76
77std::unique_ptr<MultiTreeAccessor> MultiTreeAccessor::openWild(const TString& wcName)
78{
79 // Piggyback on TChain wildcarding feature...
80 TChain chain("");
81 chain.Add(wcName);
82
83 std::vector<std::unique_ptr<const TreeAccessor> > accessors;
84
85 for (int i = 0; i < chain.GetListOfFiles()->GetEntries(); i++) {
86 std::string fileName = chain.GetListOfFiles()->At(i)->GetTitle();
87 std::unique_ptr<const TreeAccessor> accessor = TreeAccessor::open(fileName.c_str());
88 if (!accessor) {
89 cout << "Skipping invalid file " << fileName << endl;
90 continue;
91 }
92 cout << std::setw(2) << i+1 << " - " << fileName << " , nEvents = " << accessor->nEvents() << ", nRuns = " << accessor->nRuns() << endl;
93 accessors.push_back(std::move(accessor));
94 }
95
96 if (accessors.empty()) return nullptr;
97 return std::make_unique<MultiTreeAccessor>(std::move(accessors));
98}
99
100
104
105
106const EventData* MultiTreeAccessor::eventData(unsigned int i) const
107{
108 unsigned int nEventsSoFar = 0;
109 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors) {
110 unsigned int n = accessor->nEvents();
111 if (i < nEventsSoFar + n) return accessor->eventData(i - nEventsSoFar);
112 nEventsSoFar += n;
113 }
114 return nullptr;
115}
116
117
118const RunData* MultiTreeAccessor::runData(unsigned int i) const
119{
120 unsigned int nRunsSoFar = 0;
121 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors) {
122 unsigned int n = accessor->nRuns();
123 if (i < nRunsSoFar + n) return accessor->runData(i - nRunsSoFar);
124 nRunsSoFar += n;
125 }
126 return nullptr;
127}
128
129
130unsigned int MultiTreeAccessor::nEvents() const
131{
132 unsigned int n = 0;
133 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors)
134 n += accessor->nEvents();
135 return n;
136}
137
138
139unsigned int MultiTreeAccessor::nRuns() const
140{
141 unsigned int n = 0;
142 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors)
143 n += accessor->nRuns();
144 return n;
145}
146
147
148unsigned int MultiTreeAccessor::historySize(unsigned int i) const
149{
150 resetCache();
151 unsigned int size = 0;
152 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors) {
153 const HistoryContainer* cont = accessor->historyContainer(i);
154 if (cont) size += cont->nDataContainers();
155 }
156 return size;
157}
158
159unsigned int MultiTreeAccessor::historySizeSC(unsigned int i) const
160{
161 resetCache();
162 unsigned int size = 0;
163 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors) {
164 const HistoryContainer* cont = accessor->historyContainerSC(i);
165 if (cont) size += cont->nDataContainers();
166 }
167 return size;
168}
169
170
171const History* MultiTreeAccessor::getCellHistory(unsigned int i) const
172{
173 std::unique_ptr<CellInfo> cellInfo;
174 std::vector<const Data*> allData;
175 std::vector<const EventData*> allEventData;
176 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors) {
177 std::unique_ptr<const History> thisHistory (accessor->getCellHistory(i));
178 if (!thisHistory) continue;
179 if (!cellInfo) {
180 cellInfo = std::make_unique<CellInfo>(*thisHistory->cellInfo());
181 }
182 const std::vector<const EventData*>& thisEventData = thisHistory->eventData();
183 std::map<const EventData*, const EventData*> eventMap;
184 for (const EventData* event : thisEventData) {
185 if (eventMap.find(event) != eventMap.end()) continue;
186 auto newED = new EventData(*event);
187 eventMap[event] = newED;
188 allEventData.push_back(newED);
189 }
190
191 for (unsigned int j = 0; j < thisHistory->nData(); j++) {
192 allData.push_back(new Data(*thisHistory->data(j), eventMap[thisHistory->data(j)->eventData()], nullptr, -1));
193 if (!cellInfo->shape(thisHistory->data(j)->gain())) {
194 const ShapeInfo* thisShape = thisHistory->cellInfo()->shape(thisHistory->data(j)->gain());
195 cellInfo->setShape(thisHistory->data(j)->gain(), thisShape ? new ShapeInfo(*thisShape) : nullptr);
196 }
197 }
198 }
199 //data are copied from cellInfo into History member variable
200 auto * h = cellInfo ? new History(allData, *cellInfo, allEventData, i): nullptr;
201 return h;
202}
203
204const History* MultiTreeAccessor::getSCHistory(unsigned int i) const
205{
206 std::unique_ptr<CellInfo> cellInfo;
207 std::vector<const Data*> allData;
208 std::vector<const EventData*> allEventData;
209 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors) {
210 //cout << "---> Getting history for a treeAccessor..." << endl;
211 std::unique_ptr<const History> thisHistory (accessor->getSCHistory(i));
212 //cout << "---> done Getting history for a treeAccessor..." << endl;
213 if (!thisHistory) continue;
214 if (!cellInfo) {
215 cellInfo = std::make_unique<CellInfo>(*thisHistory->cellInfo());
216 //cout << "---> done new cell info" << endl;
217 }
218 //cout << "---> Creating new event data N = " << thisHistory->eventData().size() << endl;
219 const std::vector<const EventData*>& thisEventData = thisHistory->eventData();
220 std::map<const EventData*, const EventData*> eventMap;
221 for (const EventData* event : thisEventData) {
222 if (eventMap.find(event) != eventMap.end()) continue;
223 auto newED = std::make_unique<EventData>(*event);
224 eventMap[event] = newED.get();
225 allEventData.push_back(newED.release());
226 }
227 //cout << "---> Creating new data N = " << thisHistory->nData() << endl;
228
229 for (unsigned int ii = 0; ii < thisHistory->nData(); ii++) {
230 //cout << "------> Creating new data " << i << endl;
231 allData.push_back(new Data(*thisHistory->data(ii), eventMap[thisHistory->data(ii)->eventData()], nullptr, -1));
232 //cout << "------> done Creating new data " << i << endl;
233 if (!cellInfo->shape(thisHistory->data(ii)->gain())) {
234 const ShapeInfo* thisShape = thisHistory->cellInfo()->shape(thisHistory->data(ii)->gain());
235 cellInfo->setShape(thisHistory->data(ii)->gain(), thisShape ? new ShapeInfo(*thisShape) : nullptr);
236 }
237 //cout << "------> done shape " << i << endl;
238 }
239 //cout << "---> done Creating new data, deleting treeAcc history" << endl;
240 }
241 //cout << "--->returning new history..." << endl;
242 return (cellInfo ? new History(allData, *cellInfo, allEventData, i) : nullptr);
243}
244
245
246const CellInfo* MultiTreeAccessor::getCellInfo(unsigned int i) const
247{
248 resetCache();
249 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors) {
250 const HistoryContainer* cont = accessor->historyContainer(i);
251 if (cont && cont->cellInfo()) return new CellInfo(*cont->cellInfo());
252 }
253 return nullptr;
254}
255
256
257bool MultiTreeAccessor::writeToFile(const TString& fileName) const
258{
259 std::vector<const Accessor*> accessors;
260 for (unsigned int i = 0; i < m_accessors.size(); i++)
261 accessors.push_back(m_accessors[i].get());
262 cout << "Merging data..." << endl;
263 std::unique_ptr<TreeAccessor> singleContainer = TreeAccessor::merge(accessors, fileName);
264 return !!singleContainer;
265}
266
267
268std::vector<MultiTreeAccessor*> MultiTreeAccessor::filterComponents(const FilterList& filterList, const DataTweaker& tweaker) const
269{
270 std::vector< std::vector<std::unique_ptr<const TreeAccessor> > > filteredAccessors(filterList.size());
271
272 for (unsigned int i = 0; i < nAccessors(); i++) {
273 const TreeAccessor* treeAcc = dynamic_cast<const TreeAccessor*>(&accessor(i));
274 cout << "Processing data " << i << " of " << nAccessors();
275 if (treeAcc) cout << " (fileName = " << treeAcc->fileName() << ")";
276 cout << endl;
277 FilterList thisFilterList;
278 //
279 for (unsigned int f = 0; f < filterList.size(); f++) {
280 std::string pathname = (string)filterList.fileName(f);
281 if( pathname.find("eos/atlas/") < pathname.length() ){
282 int nslashes = 0, slpos = 0;
283 for( int k1 = 0; k1 < (int)pathname.length(); k1++ ){
284 if( nslashes > 2 )break;
285 if( pathname[k1] != '/' )continue;
286 nslashes++;
287 slpos = k1;
288 }
289 pathname.resize( slpos );
290 }
291 TString thisFN = Form("%s_filter%d.root", pathname.c_str(), i );//filterList.fileName(f).Data(), i);
292 thisFilterList.add(filterList.filterParams(f), thisFN);
293 }
294 std::vector<std::unique_ptr<TreeAccessor> > filteredTreeAccs = TreeAccessor::filter(accessor(i), thisFilterList, tweaker);
295 if (filteredTreeAccs.size() != filterList.size()) {
296 cout << "Filtering failed, exiting" << endl;
297 return std::vector<MultiTreeAccessor*>();
298 }
299 for (unsigned int f = 0; f < filteredTreeAccs.size(); f++) filteredAccessors[f].push_back(std::move(filteredTreeAccs[f]));
300 }
301
302 std::vector<MultiTreeAccessor*> result;
303 for (unsigned int f = 0; f < filteredAccessors.size(); f++) result.push_back(new MultiTreeAccessor(std::move(filteredAccessors[f])));
304 return result;
305}
@ Data
Definition BaseObject.h:11
TGraphErrors * GetEntries(TH2F *histo)
virtual void resetCache() const
virtual const CellInfo * cellInfo(unsigned int i) const
void add(const FilterParams &params, const TString &fileName)
Definition FilterList.h:27
unsigned int size() const
Definition FilterList.h:29
const FilterParams & filterParams(unsigned int i) const
Definition FilterList.h:30
const TString & fileName(unsigned int i) const
Definition FilterList.h:31
const CellInfo * cellInfo() const
unsigned int nDataContainers() const
unsigned int historySize(unsigned int i) const
const History * getSCHistory(unsigned int i) const
MultiTreeAccessor(std::vector< std::unique_ptr< const TreeAccessor > > &&accessors)
Constructor.
const EventData * eventData(unsigned int i) const
unsigned int historySizeSC(unsigned int i) const
std::vector< MultiTreeAccessor * > filterComponents(const FilterList &filterList, const DataTweaker &tweaker) const
unsigned int nAccessors() const
const History * getCellHistory(unsigned int i) const
const TreeAccessor & accessor(unsigned int i) const
static std::unique_ptr< MultiTreeAccessor > open(const std::vector< TString > &files)
const RunData * runData(unsigned int i) const
const CellInfo * getCellInfo(unsigned int i) const
bool writeToFile(const TString &fileName) const
static std::unique_ptr< MultiTreeAccessor > openList(const TString &fileList)
static std::unique_ptr< MultiTreeAccessor > openWild(const TString &wcName)
std::vector< std::unique_ptr< const TreeAccessor > > m_accessors
static std::unique_ptr< TreeAccessor > merge(const std::vector< const Accessor * > &accessors, const TString &fileName="")
static std::unique_ptr< TreeAccessor > open(const TString &fileName)
static std::unique_ptr< TreeAccessor > filter(const Accessor &accessor, const FilterParams &filterParams, const TString &fileName, const DataTweaker &tweaker)
std::vector< std::string > files
file names and file pointers
Definition hcg.cxx:50
STL namespace.