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
171std::unique_ptr<const History> MultiTreeAccessor::getCellHistory(unsigned int i) const
172{
173 std::unique_ptr<CellInfo> cellInfo;
174 std::vector<std::unique_ptr<const Data> > allData;
175 std::vector<std::unique_ptr<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<std::unique_ptr<const EventData> >& thisEventData = thisHistory->eventData();
183 std::map<const EventData*, const EventData*> eventMap;
184 for (const std::unique_ptr<const EventData>& event : thisEventData) {
185 if (eventMap.find(event.get()) != eventMap.end()) continue;
186 auto newED = std::make_unique<EventData>(*event);
187 eventMap[event.get()] = newED.get();
188 allEventData.push_back(std::move(newED));
189 }
190
191 for (unsigned int j = 0; j < thisHistory->nData(); j++) {
192 allData.push_back(std::make_unique<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 if (cellInfo)
201 return std::make_unique<History>(std::move(allData), *cellInfo, std::move(allEventData), i);
202 return nullptr;
203}
204
205std::unique_ptr<const History> MultiTreeAccessor::getSCHistory(unsigned int i) const
206{
207 std::unique_ptr<CellInfo> cellInfo;
208 std::vector<std::unique_ptr<const Data> > allData;
209 std::vector<std::unique_ptr<const EventData> > allEventData;
210 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors) {
211 //cout << "---> Getting history for a treeAccessor..." << endl;
212 std::unique_ptr<const History> thisHistory (accessor->getSCHistory(i));
213 //cout << "---> done Getting history for a treeAccessor..." << endl;
214 if (!thisHistory) continue;
215 if (!cellInfo) {
216 cellInfo = std::make_unique<CellInfo>(*thisHistory->cellInfo());
217 //cout << "---> done new cell info" << endl;
218 }
219 //cout << "---> Creating new event data N = " << thisHistory->eventData().size() << endl;
220 const std::vector<std::unique_ptr<const EventData> >& thisEventData = thisHistory->eventData();
221 std::map<const EventData*, const EventData*> eventMap;
222 for (const std::unique_ptr<const EventData>& event : thisEventData) {
223 if (eventMap.find(event.get()) != eventMap.end()) continue;
224 auto newED = std::make_unique<EventData>(*event);
225 eventMap[event.get()] = newED.get();
226 allEventData.push_back(std::move(newED));
227 }
228 //cout << "---> Creating new data N = " << thisHistory->nData() << endl;
229
230 for (unsigned int ii = 0; ii < thisHistory->nData(); ii++) {
231 //cout << "------> Creating new data " << i << endl;
232 allData.push_back(std::make_unique<Data>(*thisHistory->data(ii), eventMap[&thisHistory->data(ii)->eventData()], nullptr, -1));
233 //cout << "------> done Creating new data " << i << endl;
234 if (!cellInfo->shape(thisHistory->data(ii)->gain())) {
235 const ShapeInfo* thisShape = thisHistory->cellInfo()->shape(thisHistory->data(ii)->gain());
236 cellInfo->setShape(thisHistory->data(ii)->gain(), thisShape ? new ShapeInfo(*thisShape) : nullptr);
237 }
238 //cout << "------> done shape " << i << endl;
239 }
240 //cout << "---> done Creating new data, deleting treeAcc history" << endl;
241 }
242 //cout << "--->returning new history..." << endl;
243 if (cellInfo)
244 return std::make_unique<History>(std::move(allData), *cellInfo, std::move(allEventData), i);
245 return nullptr;
246}
247
248
249std::unique_ptr<const CellInfo> MultiTreeAccessor::getCellInfo(unsigned int i) const
250{
251 resetCache();
252 for (const std::unique_ptr<const TreeAccessor>& accessor : m_accessors) {
253 const HistoryContainer* cont = accessor->historyContainer(i);
254 if (cont && cont->cellInfo()) return std::make_unique<CellInfo>(*cont->cellInfo());
255 }
256 return nullptr;
257}
258
259
260bool MultiTreeAccessor::writeToFile(const TString& fileName) const
261{
262 std::vector<const Accessor*> accessors;
263 for (unsigned int i = 0; i < m_accessors.size(); i++)
264 accessors.push_back(m_accessors[i].get());
265 cout << "Merging data..." << endl;
266 std::unique_ptr<TreeAccessor> singleContainer = TreeAccessor::merge(accessors, fileName);
267 return !!singleContainer;
268}
269
270
271std::vector<std::unique_ptr<MultiTreeAccessor> >
272MultiTreeAccessor::filterComponents(const FilterList& filterList, const DataTweaker& tweaker) const
273{
274 std::vector< std::vector<std::unique_ptr<const TreeAccessor> > > filteredAccessors(filterList.size());
275
276 std::vector<std::unique_ptr<MultiTreeAccessor> > result;
277
278 for (unsigned int i = 0; i < nAccessors(); i++) {
279 const TreeAccessor* treeAcc = dynamic_cast<const TreeAccessor*>(&accessor(i));
280 cout << "Processing data " << i << " of " << nAccessors();
281 if (treeAcc) cout << " (fileName = " << treeAcc->fileName() << ")";
282 cout << endl;
283 FilterList thisFilterList;
284 //
285 for (unsigned int f = 0; f < filterList.size(); f++) {
286 std::string pathname = (string)filterList.fileName(f);
287 if( pathname.find("eos/atlas/") < pathname.length() ){
288 int nslashes = 0, slpos = 0;
289 for( int k1 = 0; k1 < (int)pathname.length(); k1++ ){
290 if( nslashes > 2 )break;
291 if( pathname[k1] != '/' )continue;
292 nslashes++;
293 slpos = k1;
294 }
295 pathname.resize( slpos );
296 }
297 TString thisFN = Form("%s_filter%d.root", pathname.c_str(), i );//filterList.fileName(f).Data(), i);
298 thisFilterList.add(filterList.filterParams(f), thisFN);
299 }
300 std::vector<std::unique_ptr<TreeAccessor> > filteredTreeAccs = TreeAccessor::filter(accessor(i), thisFilterList, tweaker);
301 if (filteredTreeAccs.size() != filterList.size()) {
302 cout << "Filtering failed, exiting" << endl;
303 return result;
304 }
305 for (unsigned int f = 0; f < filteredTreeAccs.size(); f++) filteredAccessors[f].push_back(std::move(filteredTreeAccs[f]));
306 }
307
308 for (unsigned int f = 0; f < filteredAccessors.size(); f++)
309 result.push_back(std::make_unique<MultiTreeAccessor>(std::move(filteredAccessors[f])));
310 return result;
311}
TGraphErrors * GetEntries(TH2F *histo)
virtual void resetCache() const
virtual std::unique_ptr< 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
virtual std::unique_ptr< const CellInfo > getCellInfo(unsigned int i) const override
virtual unsigned int historySizeSC(unsigned int i) const override
MultiTreeAccessor(std::vector< std::unique_ptr< const TreeAccessor > > &&accessors)
Constructor.
unsigned int nAccessors() const
virtual std::unique_ptr< const History > getCellHistory(unsigned int i) const override
virtual unsigned int nRuns() const override
virtual const EventData * eventData(unsigned int i) const override
virtual const RunData * runData(unsigned int i) const override
const TreeAccessor & accessor(unsigned int i) const
static std::unique_ptr< MultiTreeAccessor > open(const std::vector< TString > &files)
std::vector< std::unique_ptr< MultiTreeAccessor > > filterComponents(const FilterList &filterList, const DataTweaker &tweaker) const
virtual bool writeToFile(const TString &fileName) const override
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
virtual unsigned int nEvents() const override
virtual unsigned int historySize(unsigned int i) const override
virtual std::unique_ptr< const History > getSCHistory(unsigned int i) const override
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.