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