GGS(GenericGEANT4Simulation)Software  2.6.0
 All Data Structures Namespaces Files Functions Variables Typedefs Macros
GGSTRootReader.h
Go to the documentation of this file.
1 /*
2  * GGSTRootReader.h
3  *
4  * Created on: 22 Aug 2011
5  * Author: Nicola Mori
6  */
7 
10 #ifndef GGSTROOTREADER_H_
11 #define GGSTROOTREADER_H_
12 
13 // Standard headers
14 #include <vector>
15 #include <iostream>
16 
17 // ROOT headers
18 #include "TChain.h"
19 #include "TFile.h"
20 
21 // GGS headers
22 #include "montecarlo/readers/GGSTChainReader.h"
24 #include "utils/GGSSmartLog.h"
25 
38 
39 public:
40 
43 
46 
86  GGSTFilesHandler* Open(const std::string &fileName, GGSTFilesHandler* filesHandler = NULL, bool force = false);
87 
101  GGSTFilesHandler* Open(const char *fileName, GGSTFilesHandler* filesHandler = NULL, bool force = false) {
102  return Open(std::string(fileName), filesHandler, force);
103  }
104 
113  bool OpenFile(const char *fileName) {
114  return Open(fileName);
115  }
116 
130  template<class T>
131  T* GetReader(GGSTFilesHandler* filesHandler = NULL, const TString &treeName = "");
132 
140  void GetEntry(Long64_t entry);
141 
156  Long64_t GetEntries();
157 
162  Long64_t GetReadEntry() {
163  return _currentEv;
164  }
165 
178  const GGSTSimInfo* GetSimInfo(const GGSTFilesHandler* filesHandler = NULL);
179 
188  const GGSTGeoParams* GetGeoParams(const GGSTFilesHandler* filesHandler = NULL);
189 
190 private:
191 
192  TChain* _FindChain(const TString &treeName, GGSTFilesHandler* filesHandler);
193  TChain* _CreateChain(const TString &treeName, GGSTFilesHandler* filesHandler);
194  bool _CheckBranches(TTree *tree1, TTree *tree2);
195 
197  Long64_t _GetEntriesBlind();
198 
199  std::vector<GGSTFilesHandler*> _filesHandlers;
200 
201  struct ReadersInfo {
202  GGSTChainReader* reader;
203  TChain *chain;
204  GGSTFilesHandler *filesHandler;
205 
206  ~ReadersInfo() {
207  delete reader;
208  }
209  };
210  typedef std::vector<ReadersInfo*> ReadersStore;
211 
212  ReadersStore _readers;
213  Long_t _currentEv;
214  GGSTSimInfo _simInfo;
215 
216 };
217 
218 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
219 
220 template<class T>
221 T* GGSTRootReader::GetReader(GGSTFilesHandler* filesHandler, const TString &treeName) {
222 
223  static const char *routineName = "GGSTRootReader::GetReader";
224 
225  // Set filesHandler to first handler if no handler is provided
226  if (filesHandler == NULL) {
227  if (_filesHandlers.size() > 0)
228  filesHandler = _filesHandlers[0];
229  }
230 
231  // Set default tree name if no name is provided
232  TString tName(treeName);
233  if (tName == "") {
234  tName = "GGSEventsTree";
235  }
236 
237  // Search the tree in stored trees (i.e., already requested by a reader)
238  for (unsigned int iReader = 0; iReader < _readers.size(); iReader++) {
239  if (_readers[iReader]->filesHandler == filesHandler && _readers[iReader]->chain->GetName() == tName) {
240  // Check if found reader is of the desired type
241  T* retVal = dynamic_cast<T*>(_readers[iReader]->reader);
242  if (retVal) {
243  return retVal;
244  }
245  }
246  }
247 
248  // Search for chain
249  TChain *chain = _FindChain(tName, filesHandler);
250  if (chain) {
251  T *reader = new T;
252  // Read first entry if no entry has been read yet.
253  // This is necessary in order to make branches available so that readers can check for branch match in their
254  // SetChain methods.
255  if (chain->GetReadEntry() < 0)
256  chain->GetEntry(0);
257  if (reader->SetChain(chain)) {
258  // Reset the read entry to -1, to avoid missing to read the first event with some readers.
259  chain->GetEntry(-1);
260  for (unsigned int iReader = 0; iReader < _readers.size(); iReader++) {
261  if (chain->GetEntries() != _readers[iReader]->chain->GetEntries()) {
262  COUT(WARNING) << routineName << "Event number for the requested reader (" << chain->GetEntries()
263  << ") and for reader no. " << iReader << " (" << _readers[iReader]->chain->GetEntries()
264  << ") do not match. The reader has not been created." << std::endl;
265  delete reader;
266  return NULL;
267  }
268  }
269  if (_currentEv != -1)
270  reader->GetEntry(_currentEv);
271  _readers.push_back(new ReadersInfo());
272  _readers.back()->reader = reader;
273  _readers.back()->chain = chain;
274  _readers.back()->filesHandler = filesHandler;
275  return reader;
276  }
277  else {
278  COUT(WARNING) << "Tree " << tName << " cannot be read by the requested reader. The reader has not been created."
279  << std::endl;
280  chain->GetEntry(-1);
281  delete reader;
282  return NULL;
283  }
284  }
285  else {
286  COUT(WARNING) << "Can't find tree " << tName << ". The reader has not been created." << ENDL;
287  return NULL;
288  }
289 
290 }
291 #endif /* GGSTROOTREADER_H_ */
GGSTFilesHandler * Open(const char *fileName, GGSTFilesHandler *filesHandler=NULL, bool force=false)
Open ROOT files.
const GGSTGeoParams * GetGeoParams(const GGSTFilesHandler *filesHandler=NULL)
Returns the geometry parameters.
Class to manage ROOT output readers.
Abstract class defining the interface for tree readers.
#define ENDL
Definition: GGSSmartLog.h:93
~GGSTRootReader()
Destructor.
#define COUT(level)
Smart log macro. It writes on stdout only if the specified verbosity level is lesser than the maximum...
Definition: GGSSmartLog.h:66
bool OpenFile(const char *fileName)
Opens a ROOT file.
Long64_t GetEntries()
The total number of events.
Long64_t GetReadEntry()
Returns the current entry (event).
void GetEntry(Long64_t entry)
Reads an event.
Class to handle group of Root files.
const GGSTSimInfo * GetSimInfo(const GGSTFilesHandler *filesHandler=NULL)
Returns the simulation informations.
GGSTFilesHandler * Open(const std::string &fileName, GGSTFilesHandler *filesHandler=NULL, bool force=false)
Open ROOT files.
Class for storing the geometry parameters on Root output file.
Definition: GGSTGeoParams.h:18
GGSTRootReader()
Constructor.
T * GetReader(GGSTFilesHandler *filesHandler=NULL, const TString &treeName="")
Get a chain reader.
A class to store simulation informations.
Definition: GGSTSimInfo.h:21