ATLAS Offline Software
MultiTreeAccessor.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
8 #include "LArSamplesMon/Data.h"
9 #include "LArCafJobs/EventData.h"
10 #include "TSystem.h"
11 #include "TChain.h"
12 #include <iostream>
13 #include <iomanip>
14 #include <fstream>
15 #include <string>
16 
17 using std::string;
18 using std::cout;
19 using std::endl;
20 using namespace std;
21 
22 using namespace LArSamples;
23 
24 
25 MultiTreeAccessor* MultiTreeAccessor::open(const std::vector<TString>& files)
26 {
27  std::vector<const TreeAccessor*> accessors;
28  for (const TString& fileName : files) {
30  if (!accessor) {
31  cout << "Skipping invalid file " << fileName << endl;
32  continue;
33  }
34  accessors.push_back(accessor);
35  }
36 
37  if (accessors.empty()) return nullptr;
38  return new MultiTreeAccessor(accessors);
39 }
40 
41 
42 MultiTreeAccessor* MultiTreeAccessor::openList(const TString& fileList)
43 {
44  std::ifstream f(fileList);
45  if (!f) {
46  cout << "file " << fileList << " not accessible" << endl;
47  return nullptr;
48  }
49 
50  std::string fileName;
51  unsigned int i = 0;
52 
53  std::vector<const TreeAccessor*> accessors;
54 
55  while (f >> fileName) {
56  //gSystem->Exec("free");
58  if (!accessor) {
59  cout << "Skipping invalid file " << fileName << endl;
60  continue;
61  }
62  cout << std::setw(2) << ++i << " - " << fileName << endl;
63  accessors.push_back(accessor);
64  }
65 
66  if (accessors.empty()) return nullptr;
67  return new MultiTreeAccessor(accessors);
68 }
69 
70 
71 MultiTreeAccessor* MultiTreeAccessor::openWild(const TString& wcName)
72 {
73  // Piggyback on TChain wildcarding feature...
74  TChain chain("");
75  chain.Add(wcName);
76 
77  std::vector<const TreeAccessor*> accessors;
78 
79  for (int i = 0; i < chain.GetListOfFiles()->GetEntries(); i++) {
80  std::string fileName = chain.GetListOfFiles()->At(i)->GetTitle();
82  if (!accessor) {
83  cout << "Skipping invalid file " << fileName << endl;
84  continue;
85  }
86  cout << std::setw(2) << i+1 << " - " << fileName << " , nEvents = " << accessor->nEvents() << ", nRuns = " << accessor->nRuns() << endl;
87  accessors.push_back(accessor);
88  }
89 
90  if (accessors.empty()) return nullptr;
91  return new MultiTreeAccessor(accessors);
92 }
93 
94 
95 MultiTreeAccessor::~MultiTreeAccessor()
96 {
97  for (const TreeAccessor* accessor : m_accessors)
98  delete accessor;
99 }
100 
101 
102 const EventData* MultiTreeAccessor::eventData(unsigned int i) const
103 {
104  unsigned int nEventsSoFar = 0;
105  for (const TreeAccessor* accessor : m_accessors) {
106  unsigned int n = accessor->nEvents();
107  if (i < nEventsSoFar + n) return accessor->eventData(i - nEventsSoFar);
108  nEventsSoFar += n;
109  }
110  return nullptr;
111 }
112 
113 
114 const RunData* MultiTreeAccessor::runData(unsigned int i) const
115 {
116  unsigned int nRunsSoFar = 0;
117  for (const TreeAccessor* accessor : m_accessors) {
118  unsigned int n = accessor->nRuns();
119  if (i < nRunsSoFar + n) return accessor->runData(i - nRunsSoFar);
120  nRunsSoFar += n;
121  }
122  return nullptr;
123 }
124 
125 
126 unsigned int MultiTreeAccessor::nEvents() const
127 {
128  unsigned int n = 0;
129  for (const TreeAccessor* accessor : m_accessors)
130  n += accessor->nEvents();
131  return n;
132 }
133 
134 
135 unsigned int MultiTreeAccessor::nRuns() const
136 {
137  unsigned int n = 0;
138  for (const TreeAccessor* accessor : m_accessors)
139  n += accessor->nRuns();
140  return n;
141 }
142 
143 
144 unsigned int MultiTreeAccessor::historySize(unsigned int i) const
145 {
146  resetCache();
147  unsigned int size = 0;
148  for (const TreeAccessor* accessor : m_accessors) {
149  const HistoryContainer* cont = accessor->historyContainer(i);
150  if (cont) size += cont->nDataContainers();
151  }
152  return size;
153 }
154 
155 
156 const History* MultiTreeAccessor::getCellHistory(unsigned int i) const
157 {
158  CellInfo* cellInfo = nullptr;
159  std::vector<const Data*> allData;
160  std::vector<const EventData*> allEventData;
161  for (const TreeAccessor* accessor : m_accessors) {
162  //cout << "---> Getting history for a treeAccessor..." << endl;
163  const History* thisHistory = accessor->getCellHistory(i);
164  //cout << "---> done Getting history for a treeAccessor..." << endl;
165  if (!thisHistory) continue;
166  if (!cellInfo) {
167  cellInfo = new CellInfo(*thisHistory->cellInfo());
168  //cout << "---> done new cell info" << endl;
169  }
170  //cout << "---> Creating new event data N = " << thisHistory->eventData().size() << endl;
171  const std::vector<const EventData*>& thisEventData = thisHistory->eventData();
172  std::map<const EventData*, const EventData*> eventMap;
173  for (const EventData* event : thisEventData) {
174  if (eventMap.find(event) != eventMap.end()) continue;
175  EventData* newED = new EventData(*event);
176  eventMap[event] = newED;
177  allEventData.push_back(newED);
178  }
179  //cout << "---> Creating new data N = " << thisHistory->nData() << endl;
180 
181  for (unsigned int i = 0; i < thisHistory->nData(); i++) {
182  //cout << "------> Creating new data " << i << endl;
183  allData.push_back(new Data(*thisHistory->data(i), eventMap[thisHistory->data(i)->eventData()], nullptr, -1));
184  //cout << "------> done Creating new data " << i << endl;
185  if (!cellInfo->shape(thisHistory->data(i)->gain())) {
186  const ShapeInfo* thisShape = thisHistory->cellInfo()->shape(thisHistory->data(i)->gain());
187  cellInfo->setShape(thisHistory->data(i)->gain(), thisShape ? new ShapeInfo(*thisShape) : nullptr);
188  }
189  //cout << "------> done shape " << i << endl;
190  }
191  //cout << "---> done Creating new data, deleting treeAcc history" << endl;
192  delete thisHistory;
193  }
194  //cout << "--->returning new history..." << endl;
195  return (cellInfo ? new History(allData, *cellInfo, allEventData, i) : nullptr);
196 }
197 
198 
199 const CellInfo* MultiTreeAccessor::getCellInfo(unsigned int i) const
200 {
201  resetCache();
202  for (const TreeAccessor* accessor : m_accessors) {
203  const HistoryContainer* cont = accessor->historyContainer(i);
204  if (cont && cont->cellInfo()) return new CellInfo(*cont->cellInfo());
205  }
206  return nullptr;
207 }
208 
209 
210 bool MultiTreeAccessor::writeToFile(const TString& fileName) const
211 {
212  std::vector<const Accessor*> accessors;
213  for (unsigned int i = 0; i < m_accessors.size(); i++)
214  accessors.push_back(m_accessors[i]);
215  cout << "Merging data..." << endl;
216  TreeAccessor* singleContainer = TreeAccessor::merge(accessors, fileName);
217  if (!singleContainer) return false;
218  delete singleContainer;
219  return true;
220 }
221 
222 
223 std::vector<MultiTreeAccessor*> MultiTreeAccessor::filterComponents(const FilterList& filterList, const DataTweaker& tweaker) const
224 {
225  std::vector< std::vector<const TreeAccessor*> > filteredAccessors(filterList.size());
226 
227  for (unsigned int i = 0; i < nAccessors(); i++) {
228  const TreeAccessor* treeAcc = dynamic_cast<const TreeAccessor*>(&accessor(i));
229  cout << "Processing data " << i << " of " << nAccessors();
230  if (treeAcc) cout << " (fileName = " << treeAcc->fileName() << ")";
231  cout << endl;
232  FilterList thisFilterList;
233  //
234  for (unsigned int f = 0; f < filterList.size(); f++) {
235  std::string pathname = (string)filterList.fileName(f);
236  if( pathname.find("eos/atlas/") < pathname.length() ){
237  int nslashes = 0, slpos = 0;
238  for( int k1 = 0; k1 < (int)pathname.length(); k1++ ){
239  if( nslashes > 2 )break;
240  if( pathname[k1] != '/' )continue;
241  nslashes++;
242  slpos = k1;
243  }
244  pathname.resize( slpos );
245  }
246  TString thisFN = Form("%s_filter%d.root", pathname.c_str(), i );//filterList.fileName(f).Data(), i);
247  //if (treeAcc) thisFN = treeAcc->fileName() + Form("_filter%d.root", f);
248  thisFilterList.add(filterList.filterParams(f), thisFN);
249  }
250  std::vector<TreeAccessor*> filteredTreeAccs = TreeAccessor::filter(accessor(i), thisFilterList, tweaker);
251  if (filteredTreeAccs.size() != filterList.size()) {
252  cout << "Filtering failed, exiting" << endl;
253  return std::vector<MultiTreeAccessor*>();
254  }
255  for (unsigned int f = 0; f < filteredTreeAccs.size(); f++) filteredAccessors[f].push_back(filteredTreeAccs[f]);
256  //if (treeAcc) treeAcc->resetCache(); // to save memory
257  }
258 
259  std::vector<MultiTreeAccessor*> result;
260  for (unsigned int f = 0; f < filteredAccessors.size(); f++) result.push_back(new MultiTreeAccessor(filteredAccessors[f]));
261  return result;
262 }
MultiTreeAccessor.h
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
get_generator_info.result
result
Definition: get_generator_info.py:21
runLayerRecalibration.chain
chain
Definition: runLayerRecalibration.py:175
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
LArSamples::CellInfo::setShape
bool setShape(CaloGain::CaloGain gain, ShapeInfo *shape)
Definition: CellInfo.cxx:90
LArSamples::History::cellInfo
const CellInfo * cellInfo() const
Definition: History.h:61
Data
@ Data
Definition: BaseObject.h:11
LArSamples::History
Definition: History.h:40
LArSamples::FilterList::filterParams
const FilterParams & filterParams(unsigned int i) const
Definition: FilterList.h:30
CscCalibQuery.fileList
fileList
Definition: CscCalibQuery.py:330
LArSamples
Definition: AbsShape.h:24
TreeAccessor.h
LArSamples::ShapeInfo
Definition: ShapeInfo.h:24
LArSamples::FilterList::add
void add(const FilterParams &params, const TString &fileName)
Definition: FilterList.h:27
covarianceTool.filter
filter
Definition: covarianceTool.py:514
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
LArSamples::RunData
Definition: RunData.h:21
LArSamples::History::data
const Data * data(unsigned int i) const
Definition: History.cxx:88
systematicsTool.writeToFile
def writeToFile(histDict, fOut)
Definition: systematicsTool.py:1035
FortranAlgorithmOptions.fileName
fileName
Definition: FortranAlgorithmOptions.py:13
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
lumiFormat.i
int i
Definition: lumiFormat.py:92
beamspotman.n
n
Definition: beamspotman.py:731
LArSamples::CellInfo::shape
const ShapeInfo * shape(CaloGain::CaloGain gain) const
Definition: CellInfo.cxx:78
generateReferenceFile.files
files
Definition: generateReferenceFile.py:12
nEvents
int nEvents
Definition: fbtTestBasics.cxx:77
ITk::EventData
InDet::SiSpacePointsSeedMakerEventData EventData
Definition: ITkSiSpacePointsSeedMaker.h:63
LArSamples::DataTweaker
Definition: DataTweaker.h:23
LArSamples::History::nData
unsigned int nData() const
Definition: History.h:56
EventData.h
LArSamples::FilterList
Definition: FilterList.h:21
LArSamples::MultiTreeAccessor
Definition: MultiTreeAccessor.h:27
LArSamples::FilterList::fileName
const TString & fileName(unsigned int i) const
Definition: FilterList.h:31
LArSamples::Data::gain
CaloGain::CaloGain gain() const
Definition: Data.h:90
LArSamples::CellInfo
Definition: CellInfo.h:31
xAOD::JetAttributeAccessor::accessor
const AccessorWrapper< T > * accessor(xAOD::JetAttribute::AttributeID id)
Returns an attribute accessor corresponding to an AttributeID.
Definition: JetAccessorMap.h:26
LArSamples::HistoryContainer::cellInfo
const CellInfo * cellInfo() const
Definition: HistoryContainer.h:43
Trk::open
@ open
Definition: BinningType.h:40
LArSamples::HistoryContainer
Definition: HistoryContainer.h:29
generate::GetEntries
double GetEntries(TH1D *h, int ilow, int ihi)
Definition: rmsFrac.cxx:20
python.utility.LHE.merge
def merge(input_file_pattern, output_file)
Merge many input LHE files into a single output file.
Definition: LHE.py:17
Data.h
xAODRootTest.accessors
dictionary accessors
Definition: xAODRootTest.py:67
LArSamples::Data::eventData
const EventData * eventData() const
Definition: Data.h:100
LArSamples::History::eventData
const std::vector< const EventData * > & eventData() const
Definition: History.h:63
LArSamples::TreeAccessor
Definition: TreeAccessor.h:32
LArSamples::FilterList::size
unsigned int size() const
Definition: FilterList.h:29
LArSamples::EventData
Definition: LArCalorimeter/LArCafJobs/LArCafJobs/EventData.h:29
LArSamples::PersistentAccessor::fileName
TString fileName() const
Definition: PersistentAccessor.cxx:135
python.ComponentAccumulator.filterComponents
def filterComponents(comps, onlyComponents=[])
Definition: ComponentAccumulator.py:79
LArSamples::HistoryContainer::nDataContainers
unsigned int nDataContainers() const
Definition: HistoryContainer.h:40