ATLAS Offline Software
Loading...
Searching...
No Matches
TreeAccessor.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
14
15#include "TObjString.h"
16#include "TFile.h"
17#include "TTree.h"
18#include "TSystem.h"
19#include "TString.h"
20#include <iostream>
21#include <fstream>
22#include <iomanip>
23
24using std::cout;
25using std::endl;
26
27using namespace LArSamples;
28
29
30std::unique_ptr<TreeAccessor> TreeAccessor::open(const TString& fileName)
31{
32 std::unique_ptr<TFile> file (TFile::Open(fileName));
33 if (!file) return nullptr;
34 if (!file->IsOpen()) { return nullptr; }
35 TTree* cellTree = (TTree*)file->Get("cells");
36 if (!cellTree) return nullptr;
37 TTree* scTree = (TTree*)file->Get("SC");
38 if (!scTree) return nullptr;
39 TTree* eventTree = (TTree*)file->Get("events");
40 if (!eventTree) return nullptr;
41 TTree* runTree = (TTree*)file->Get("runs");
42 return std::make_unique<TreeAccessor>(*cellTree, *scTree, *eventTree, runTree, file.release());
43}
44
45
46std::unique_ptr<const CellInfo> TreeAccessor::getCellInfo(unsigned int i) const
47{
48 const HistoryContainer* cont = historyContainer(i);
49 if (!cont || !cont->cellInfo()) return nullptr;
50 return std::make_unique<CellInfo>(*cont->cellInfo());
51}
52
53std::unique_ptr<const CellInfo> TreeAccessor::getSCInfo(unsigned int i) const
54{
55 const HistoryContainer* cont = historyContainerSC(i);
56 if (!cont || !cont->cellInfo()) return nullptr;
57 return std::make_unique<CellInfo>(*cont->cellInfo());
58}
59
60
61std::unique_ptr<const History> TreeAccessor::getCellHistory(unsigned int i) const
62{
63 if (i >= cellTree().GetEntries()) return nullptr;
64 getCellEntry(i);
65
66 std::vector<std::unique_ptr<const EventData> > eventDatas;
67
68 for (unsigned int k = 0; k < currentContainer()->nDataContainers(); k++) {
69 const EventData* evtData = eventData(currentContainer()->dataContainer(k)->eventIndex());
70 std::unique_ptr<const EventData> newEvtData;
71 if (evtData)
72 newEvtData = std::make_unique<EventData> (*evtData);
73 eventDatas.push_back(std::move(newEvtData));
74 }
76 return std::make_unique<History>(*currentContainer(), std::move(eventDatas), i);
77 return nullptr;
78}
79
80std::unique_ptr<const History> TreeAccessor::getSCHistory(unsigned int i) const
81{
82 if (i >= SCTree().GetEntries()) return nullptr;
83 getSCEntry(i);
84
85 std::vector<std::unique_ptr<const EventData> > eventDatas;
86
87 for (unsigned int k = 0; k < currentContainerSC()->nDataContainers(); k++) {
88 const EventData* evtData = eventData(currentContainerSC()->dataContainer(k)->eventIndex());
89 std::unique_ptr<const EventData> newEvtData;
90 if (evtData)
91 newEvtData = std::make_unique<EventData> (*evtData);
92 eventDatas.push_back(std::move(newEvtData));
93 }
95 return std::make_unique<History>(*currentContainerSC(), std::move(eventDatas), i);
96 return nullptr;
97}
98
99std::unique_ptr<TreeAccessor> TreeAccessor::merge(const std::vector<const Accessor*>& accessors,
100 const TString& fileName)
101{
102 cout << "Merging to " << fileName << endl;
103 auto newAcc = std::make_unique<TreeAccessor>(fileName);
104 unsigned int size = 0;
105
106 int evtIndex = 0, runIndex = 0;
107 std::map<std::pair<int, int>, int> evtMap;
108 std::map<int, int> runMap;
109
110 cout << "Merging runs" << endl;
111 for (const Accessor* accessor : accessors) {
112 if (!accessor) {
113 cout << "Cannot merge: one of the inputs is null!" << endl;
114 return nullptr;
115 }
116 for (unsigned int i = 0; i < accessor->nRuns(); i++) {
117 int run = accessor->runData(i)->run();
118 if (runMap.find(run) != runMap.end()) continue;
119 runMap[run] = runIndex;
120 RunData newRun(*accessor->runData(i));
121 newAcc->addRun(&newRun);
122 runIndex++;
123 }
124 }
125
126 cout << "Merging events" << endl;
127 unsigned int nEventsTotal = 0, iEvt = 0;
128 for (const Accessor* accessor : accessors)
129 nEventsTotal += accessor->nEvents();
130 for (const Accessor* accessor : accessors) {
131 for (unsigned int i = 0; i < accessor->nEvents(); i++) {
132 iEvt++;
133 if (iEvt % 100000 == 0) cout << "Merging event " << iEvt << "/" << nEventsTotal << endl;
134 std::pair<int, int> evtId(accessor->eventData(i)->run(), accessor->eventData(i)->event());
135 if (evtMap.find(evtId) != evtMap.end()) continue;
136 evtMap[evtId] = evtIndex;
137 std::map<int, int>::const_iterator idx = runMap.find(accessor->eventData(i)->run());
138 int newRunIndex = (idx == runMap.end() ? -999 : idx->second);
139 //cout << "Storing eventData for run " << accessor->eventData(i)->run() << " at index " << newRunIndex << " instead of " << accessor->eventData(i)->runIndex() << endl;
140 EventData newEvent(*accessor->eventData(i), newRunIndex);
141 newAcc->addEvent(&newEvent);
142 evtIndex++;
143 }
144 }
145
146 for (unsigned int i = 0; i < newAcc->nChannels(); i++) {
147 if (i % 10000 == 0) {
148 cout << "Merging channel " << i << "/" << newAcc->nChannels() << " (current size = " << size << ")" << endl;
149 //ClassCounts::printCountsTable();
150 }
151 std::optional<HistoryContainer> historyContainer;
152 CellInfo* info = nullptr;
153 for (const Accessor* accessor : accessors) {
154 const History* history = accessor->cellHistory(i);
155 if (!history || !history->isValid()) continue;
156 if (!historyContainer) {
157 info = new CellInfo(*history->cellInfo());
158 historyContainer.emplace (info);
159 }
160 for (unsigned int j = 0; j < history->nData(); j++) {
161 auto newDC = std::make_unique<DataContainer>(history->data(j)->container());
162 std::map<std::pair<int, int>, int>::const_iterator newIndex
163 = evtMap.find(std::make_pair(history->data(j)->run(), history->data(j)->event()));
164 if (newIndex == evtMap.end()) std::cout << "Event not found for cell " << i << ", data " << j << ".\n";
165 newDC->setEventIndex(newIndex != evtMap.end() ? newIndex->second : -1);
166 historyContainer->add(newDC.release());
167 if (not info) continue;
168 if (!info->shape(history->data(j)->gain())) {
169 const ShapeInfo* shape = history->cellInfo()->shape(history->data(j)->gain());
170 if (!shape) {
171 cout << "Shape not filled for hash = " << i << ", index = " << j << ", gain = " << Data::gainStr(history->data(j)->gain()) << endl;
172 }
173 info->setShape(history->data(j)->gain(), (shape ? new ShapeInfo(*shape) : nullptr));
174 }
175 }
176 }
177 if (historyContainer) size += historyContainer->nDataContainers();
178 newAcc->add(&historyContainer.value());
179 }
180
181 cout << "Merging done, final size = " << size << endl;
182 newAcc->save();
183 return newAcc;
184}
185
186
187std::unique_ptr<TreeAccessor> TreeAccessor::merge(const std::vector<const Accessor*>& accessors,const TString& fileName,const TString& LBFile)
188{
189 // O.Simard - 01.07.2011
190 // Alternative version with LB cleaning.
191
192 bool kBadLB=false;
193 std::vector<unsigned int> LBList;
194 std::ifstream infile(LBFile.Data());
195 std::string line;
196 // assume single-line format with coma-separated LBs (from python)
197 std::getline(infile,line,'\n');
198 TString filter(line.c_str());
199 std::unique_ptr<TObjArray> list (filter.Tokenize(", ")); // coma\space delimiters
200 if(list->GetEntries() == 0){
201 printf("No LB filtering specified, or bad format. Exiting.\n");
202 return nullptr;
203 }
204
205 for(int k = 0; k < list->GetEntries(); k++){
206 TObjString* tobs = (TObjString*)(list->At(k));
207 LBList.push_back((unsigned int)(tobs->String()).Atoi());
208 }
209 printf("LB List: %d\n",(int)LBList.size());
210
211
212 // from here it is similar to other functions of this class
213 auto newAcc = std::make_unique<TreeAccessor>(fileName);
214 unsigned int size = 0;
215
216 int evtIndex = 0, runIndex = 0;
217 std::map<std::pair<int, int>, int> evtMap;
218 std::map<int, int> runMap;
219
220 cout << "Merging runs" << endl;
221 for (const Accessor* accessor : accessors) {
222 if (!accessor) {
223 cout << "Cannot merge: one of the inputs is null!" << endl;
224 return nullptr;
225 }
226 for (unsigned int i = 0; i < accessor->nRuns(); i++) {
227 int run = accessor->runData(i)->run();
228 if (runMap.find(run) != runMap.end()) continue;
229 runMap[run] = runIndex;
230 RunData newRun(*accessor->runData(i));
231 newAcc->addRun(&newRun);
232 runIndex++;
233 }
234 }
235
236 cout << "Merging events" << endl;
237 unsigned int nEventsTotal = 0, iEvt = 0;
238 for (const Accessor* accessor : accessors)
239 nEventsTotal += accessor->nEvents();
240 for (const Accessor* accessor : accessors) {
241 for (unsigned int i = 0; i < accessor->nEvents(); i++) {
242 iEvt++;
243 if (iEvt % 100000 == 0) cout << "Merging event " << iEvt << "/" << nEventsTotal << endl;
244
245 // ----
246 // skip LBs which are found in the list
247 kBadLB=false;
248 for(unsigned int ilb = 0 ; ilb < LBList.size() ; ilb++){
249 if(LBList.at(ilb)==accessor->eventData(i)->lumiBlock()){
250 kBadLB=true;
251 //printf(" == Rejecting Event in LB %4d\n",accessor->eventData(i)->lumiBlock());
252 break;
253 }
254 }
255 if(kBadLB) continue;
256 // ----
257
258 std::pair<int, int> evtId(accessor->eventData(i)->run(), accessor->eventData(i)->event());
259 if (evtMap.find(evtId) != evtMap.end()) continue;
260 evtMap[evtId] = evtIndex;
261 std::map<int, int>::const_iterator idx = runMap.find(accessor->eventData(i)->run());
262 int newRunIndex = (idx == runMap.end() ? -999 : idx->second);
263 EventData newEvent(*accessor->eventData(i), newRunIndex);
264 newAcc->addEvent(&newEvent);
265 evtIndex++;
266 }
267 }
268
269 cout << "Merging cells" << endl;
270 for (unsigned int i = 0; i < newAcc->nChannels(); i++) {
271 if (i % 10000 == 0) {
272 cout << "Merging channel " << i << "/" << newAcc->nChannels() << " (current size = " << size << ")" << endl;
273 //ClassCounts::printCountsTable();
274 }
275 std::optional<HistoryContainer> historyContainer;
276 CellInfo* info = nullptr;
277 for (const Accessor* accessor : accessors) {
278 const History* history = accessor->cellHistory(i);
279 if (!history || !history->isValid()) continue;
280 if (!historyContainer) {
281 info = new CellInfo(*history->cellInfo());
282 historyContainer.emplace (info);
283 }
284 for (unsigned int j = 0; j < history->nData(); j++) {
285 auto newDC = std::make_unique<DataContainer>(history->data(j)->container());
286 std::map<std::pair<int, int>, int>::const_iterator newIndex
287 = evtMap.find(std::make_pair(history->data(j)->run(), history->data(j)->event()));
288 //if (newIndex == evtMap.end()) cout << "Event not found for cell " << i << ", data " << j << "." << endl;
289 newDC->setEventIndex(newIndex != evtMap.end() ? newIndex->second : -1);
290 historyContainer->add(newDC.release());
291 if (not info) continue;
292 if (!info->shape(history->data(j)->gain())) {
293 const ShapeInfo* shape = history->cellInfo()->shape(history->data(j)->gain());
294 if (!shape)
295 cout << "Shape not filled for hash = " << i << ", index = " << j << ", gain = " << Data::gainStr(history->data(j)->gain()) << endl;
296 info->setShape(history->data(j)->gain(), (shape ? new ShapeInfo(*shape) : nullptr));
297 }
298 }
299 }
301 size += historyContainer->nDataContainers();
302 }
303 newAcc->add(&historyContainer.value());
304 //}
305 }
306
307 cout << "Merging SC" << endl;
308 for (unsigned int i = 0; i < newAcc->nChannelsSC(); i++) {
309 if (i % 10000 == 0) {
310 cout << "Merging channel " << i << "/" << newAcc->nChannelsSC() << " (current size = " << size << ")" << endl;
311 }
312 std::optional<HistoryContainer> historyContainer;
313 CellInfo* info = nullptr;
314 for (const Accessor* accessor : accessors) {
315 std::unique_ptr<const History> history = accessor->getSCHistory(i);
316 if (!history || !history->isValid()) continue;
317 if (!historyContainer) {
318 info = new CellInfo(*history->cellInfo());
319 historyContainer.emplace (info);
320 }
321 for (unsigned int j = 0; j < history->nData(); j++) {
322 auto newDC = std::make_unique<DataContainer>(history->data(j)->container());
323 std::map<std::pair<int, int>, int>::const_iterator newIndex
324 = evtMap.find(std::make_pair(history->data(j)->run(), history->data(j)->event()));
325 //if (newIndex == evtMap.end()) cout << "Event not found for cell " << i << ", data " << j << "." << endl;
326 newDC->setEventIndex(newIndex != evtMap.end() ? newIndex->second : -1);
327 historyContainer->add(newDC.release());
328 if (not info) continue;
329 if (!info->shape(history->data(j)->gain())) {
330 const ShapeInfo* shape = history->cellInfo()->shape(history->data(j)->gain());
331 if (!shape)
332 cout << "Shape not filled for hash = " << i << ", index = " << j << ", gain = " << Data::gainStr(history->data(j)->gain()) << endl;
333 info->setShape(history->data(j)->gain(), (shape ? new ShapeInfo(*shape) : nullptr));
334 }
335 }
336 }
338 size += historyContainer->nDataContainers();
339 }
340 newAcc->addSC(&historyContainer.value());
341 //}
342 }
343
344 cout << "Merging done, final size = " << size << endl;
345 newAcc->save();
346 return newAcc;
347}
348
349
350std::unique_ptr<TreeAccessor> TreeAccessor::filter(const Accessor& accessor,
351 const FilterParams& filterParams,
352 const TString& fileName,
353 const DataTweaker& tweaker)
354{
355 FilterList filterList; filterList.add(filterParams, fileName);
356 std::vector<std::unique_ptr<TreeAccessor> > result = filter(accessor, filterList, tweaker);
357 return (!result.empty() ? std::move(result[0]) : nullptr);
358}
359
360std::vector<std::unique_ptr<TreeAccessor> >
362 const FilterList& filterList,
363 const DataTweaker& tweaker)
364{
365 std::vector<std::unique_ptr<TreeAccessor> > newAccessors;
366
367 if (filterList.size() == 0) {
368 cout << "No filter categories specified, done! (?)" << endl;
369 return newAccessors;
370 }
371
372 for (unsigned int f = 0; f < filterList.size(); f++) {
373 cout << "Skimming to " << filterList.fileName(f) << endl;
374 if (!gSystem->AccessPathName(filterList.fileName(f))) {
375 cout << "File already exists, exiting." << endl;
376 return newAccessors;
377 }
378 }
379
380 for (unsigned int f = 0; f < filterList.size(); f++)
381 newAccessors.push_back(std::make_unique<TreeAccessor>(filterList.fileName(f)));
382 std::map<std::pair<unsigned int, unsigned int>, unsigned int> eventIndices;
383 std::vector< std::map<unsigned int, unsigned int> > eventsToKeep(filterList.size());
384 std::vector< std::map<unsigned int, unsigned int> > runsToKeep(filterList.size());
385
386 double nTot = 0, nPass = 0;
387
388 for (unsigned int i = 0; i < accessor.nEvents(); i++) {
389 const EventData* eventData = accessor.eventData(i);
390 eventIndices[std::pair<unsigned int, unsigned int>(eventData->run(), eventData->event())] = i;
391 }
392
393 for (unsigned int i = 0; i < accessor.nChannels(); i++) {
394 if (i % 25000 == 0) {
395 cout << "Filtering " << i << "/" << accessor.nChannels()
396 << " (passing so far = " << nPass << ", total seen = " << nTot << ")" << endl;
397 //ClassCounts::printCountsTable();
398 }
399 bool first = true;
400
401 const History* history = nullptr;
402 for (unsigned int f = 0; f < filterList.size(); f++) {
403 history = accessor.pass(i, filterList.filterParams(f));
404 if (history) break;
405 }
406 for (unsigned int f = 0; f < filterList.size(); f++) {
407 if (!history || !history->cellInfo() || !filterList.filterParams(f).passCell(*history->cellInfo())) {
408 HistoryContainer newHist;
409 newAccessors[f]->add(&newHist);
410 continue;
411 }
412 if (first) { nTot += history->nData(); first = false; }
413 HistoryContainer newHist(new CellInfo(*history->cellInfo()));
414 for (unsigned int k = 0; k < history->nData(); k++) {
415 if (!filterList.filterParams(f).passEvent(*history->data(k))) continue;
416 const EventData& eventData = history->data(k)->eventData();
417 std::map<std::pair<unsigned int, unsigned int>, unsigned int>::const_iterator findIndex =
418 eventIndices.find(std::pair<unsigned int, unsigned int>(eventData.run(), eventData.event()));
419 if (findIndex == eventIndices.end()) {
420 cout << "Inconsistent event numbering!!!" << endl;
421 return std::vector<std::unique_ptr<TreeAccessor> >();
422 }
423 int oldEvtIndex = findIndex->second;
424 bool isNewEvt = (eventsToKeep[f].find(oldEvtIndex) == eventsToKeep[f].end());
425 unsigned int newEvtIndex = (isNewEvt ? eventsToKeep[f].size() : eventsToKeep[f][oldEvtIndex]);
426 if (isNewEvt) eventsToKeep[f][oldEvtIndex] = newEvtIndex;
427
428 int oldRunIndex = history->data(k)->eventData().runIndex();
429 bool isNewRun = (runsToKeep[f].find(oldRunIndex) == runsToKeep[f].end());
430 unsigned int newRunIndex = (isNewRun ? runsToKeep[f].size() : runsToKeep[f][oldRunIndex]);
431 if (isNewRun) runsToKeep[f][oldRunIndex] = newRunIndex;
432
433 std::unique_ptr<Data> newData = tweaker.tweak(*history->data(k), newEvtIndex);
434 if (!newData) {
435 cout << "Filtering failed on data " << k << " of cell " << i << ", aborting" << endl;
436 return std::vector<std::unique_ptr<TreeAccessor> >();
437 }
438 nPass++;
439 newHist.add(newData.release()->dissolve());
440 }
441 newAccessors[f]->add(&newHist);
442 }
443 }
444
445 for (unsigned int f = 0; f < filterList.size(); f++) {
446 cout << "Adding runs..." << endl;
447 std::vector<unsigned int> runsToKeep_ordered(runsToKeep[f].size());
448 for (const auto& runIndex : runsToKeep[f])
449 runsToKeep_ordered[runIndex.second] = runIndex.first;
450
451 for (unsigned int runIndex : runsToKeep_ordered) {
452 RunData newRun(*accessor.runData(runIndex));
453 newAccessors[f]->addRun(&newRun);
454 }
455 cout << "Adding events..." << endl;
456 std::vector<unsigned int> eventsToKeep_ordered(eventsToKeep[f].size());
457 for (const auto& eventIndex : eventsToKeep[f])
458 eventsToKeep_ordered[eventIndex.second] = eventIndex.first;
459
460 for (unsigned int eventIndex : eventsToKeep_ordered) {
461 std::map<unsigned int, unsigned int>::const_iterator idx = runsToKeep[f].find(accessor.eventData(eventIndex)->runIndex());
462 int newRunIndex = (idx == runsToKeep[f].end() ? 0 : idx->second);
463 std::unique_ptr<EventData> newEvent (tweaker.tweak(*accessor.eventData(eventIndex), newRunIndex));
464 newAccessors[f]->addEvent(newEvent.get());
465 }
466 }
467 cout << "Filtering done! final size = " << nPass << endl;
468 //ClassCounts::printCountsTable();
469 for (unsigned int f = 0; f < filterList.size(); f++) {
470 cout << "Saving " << newAccessors[f]->fileName() << endl;
471 newAccessors[f]->save();
472 }
473 return newAccessors;
474}
475
476
477std::unique_ptr<TreeAccessor> TreeAccessor::makeTemplate(const Accessor& accessor, const TString& fileName)
478{
479 auto newAccessor = std::make_unique<TreeAccessor>(fileName);
480
481 std::vector<short> samples(5, 0);
482 std::vector<float> autoCorrs(4, 0);
483
484 RunData dummyRun(0);
485 newAccessor->addRun(&dummyRun);
486
487 EventData dummyEvent(0, 0, 0, 0);
488 newAccessor->addEvent(&dummyEvent);
489
490 for (unsigned int i = 0; i < accessor.nChannels(); i++) {
491 if (i % 25000 == 0)
492 cout << "Templating " << i << "/" << accessor.nChannels() << endl;
493 const History* history = accessor.cellHistory(i);
494 if (!history || !history->cellInfo()) {
495 HistoryContainer newHist;
496 newAccessor->add(&newHist);
497 continue;
498 }
499 HistoryContainer newHist(new CellInfo(*history->cellInfo()));
500 auto dataContainer = std::make_unique<DataContainer>(CaloGain::LARHIGHGAIN, samples, 0, 0, 0, 0, autoCorrs);
501 newHist.add(dataContainer.release());
502 newAccessor->add(&newHist);
503 }
504
505 newAccessor->save();
506 return newAccessor;
507}
508
509bool TreeAccessor::writeToFile(const TString& fileName) const
510{
511 TFile newFile(fileName, "RECREATE");
512 if (!newFile.IsOpen()) return false;
513
514 cellTree().Write();
515 eventTree().Write();
516
517 return true;
518}
TGraphErrors * GetEntries(TH2F *histo)
virtual std::unique_ptr< const CellInfo > cellInfo(unsigned int i) const
const ShapeInfo * shape(CaloGain::CaloGain gain) const
Definition CellInfo.cxx:78
std::unique_ptr< Data > tweak(const Data &data, int evtIndex=-1) const
CaloGain::CaloGain gain() const
Definition Data.h:87
const EventData & eventData() const
Definition Data.h:97
static TString gainStr(CaloGain::CaloGain gain)
Definition Data.cxx:506
const DataContainer & container() const
Definition Data.h:158
int event() const
Definition Data.cxx:28
int run() const
Definition Data.cxx:27
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
bool passCell(const CellInfo &info) const
bool passEvent(const Data &data) const
const CellInfo * cellInfo() const
unsigned int nDataContainers() const
bool isValid() const
Definition History.cxx:149
const CellInfo * cellInfo() const
Definition History.h:59
const Data * data(unsigned int i) const
Definition History.cxx:88
unsigned int nData() const
Definition History.h:54
HistoryContainer * currentContainer() const
const HistoryContainer * historyContainer(unsigned int i) const
const HistoryContainer * historyContainerSC(unsigned int i) const
HistoryContainer * currentContainerSC() const
int getCellEntry(unsigned int i) const
int getSCEntry(unsigned int i) const
virtual std::unique_ptr< const History > getCellHistory(unsigned int i) const override
static std::unique_ptr< TreeAccessor > merge(const std::vector< const Accessor * > &accessors, const TString &fileName="")
virtual const EventData * eventData(unsigned int i) const override
virtual std::unique_ptr< const CellInfo > getCellInfo(unsigned int i) const override
static std::unique_ptr< TreeAccessor > open(const TString &fileName)
virtual bool writeToFile(const TString &fileName) const override
virtual std::unique_ptr< const History > getSCHistory(unsigned int i) const override
static std::unique_ptr< TreeAccessor > makeTemplate(const Accessor &accessor, const TString &fileName)
static std::unique_ptr< TreeAccessor > filter(const Accessor &accessor, const FilterParams &filterParams, const TString &fileName, const DataTweaker &tweaker)
std::unique_ptr< const CellInfo > getSCInfo(unsigned int i) const
@ LARHIGHGAIN
Definition CaloGain.h:18
int run(int argc, char *argv[])