GGS(GenericGEANT4Simulation)Software  2.7.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 <iostream>
15 #include <vector>
16 
17 // ROOT headers
18 #include "TChain.h"
19 #include "TFile.h"
20 #include "TGeoManager.h"
21 
22 // GGS headers
23 #include "montecarlo/readers/GGSTChainReader.h"
25 #include "utils/GGSSmartLog.h"
26 
39 
40 public:
43 
46 
86  GGSTFilesHandler *Open(const std::string &fileName, GGSTFilesHandler *filesHandler = nullptr, bool force = false);
87 
101  GGSTFilesHandler *Open(const char *fileName, GGSTFilesHandler *filesHandler = nullptr, bool force = false) {
102  return Open(std::string(fileName), filesHandler, force);
103  }
104 
113  bool OpenFile(const char *fileName) { return Open(fileName); }
114 
129  template <class T> T *GetReader(GGSTFilesHandler *filesHandler = nullptr, const TString &treeName = "");
130 
138  void GetEntry(Long64_t entry);
139 
155  Long64_t GetEntries();
156 
161  Long64_t GetReadEntry() { return _currentEv; }
162 
175  const GGSTSimInfo *GetSimInfo(const GGSTFilesHandler *filesHandler = nullptr);
176 
185  const GGSTGeoParams *GetGeoParams(const GGSTFilesHandler *filesHandler = nullptr);
186 
195  const GGSTParameters *GetGenParams(const GGSTFilesHandler *filesHandler = nullptr);
196 
205  const TGeoManager *GetROOTGeometry(const GGSTFilesHandler *filesHandler = nullptr);
206 
207 private:
208  TChain *_FindChain(const TString &treeName, GGSTFilesHandler *filesHandler);
209  TChain *_CreateChain(const TString &treeName, GGSTFilesHandler *filesHandler);
210  bool _CheckBranches(TTree *tree1, TTree *tree2);
211 
213  Long64_t _GetEntriesBlind();
214 
215  std::vector<GGSTFilesHandler *> _filesHandlers;
216 
217  struct ReadersInfo {
218  GGSTChainReader *reader;
219  TChain *chain;
220  GGSTFilesHandler *filesHandler;
221 
222  ~ReadersInfo() { delete reader; }
223  };
224  typedef std::vector<ReadersInfo *> ReadersStore;
225 
226  ReadersStore _readers;
227  Long_t _currentEv;
228  GGSTSimInfo _simInfo;
229 };
230 
231 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
232 
233 template <class T> T *GGSTRootReader::GetReader(GGSTFilesHandler *filesHandler, const TString &treeName) {
234 
235  static const char *routineName = "GGSTRootReader::GetReader";
236 
237  // Set filesHandler to first handler if no handler is provided
238  if (filesHandler == nullptr) {
239  if (_filesHandlers.size() > 0)
240  filesHandler = _filesHandlers[0];
241  }
242 
243  // Set default tree name if no name is provided
244  TString tName(treeName);
245  if (tName == "") {
246  tName = "GGSEventsTree";
247  }
248 
249  // Search the tree in stored trees (i.e., already requested by a reader)
250  for (unsigned int iReader = 0; iReader < _readers.size(); iReader++) {
251  if (_readers[iReader]->filesHandler == filesHandler && _readers[iReader]->chain->GetName() == tName) {
252  // Check if found reader is of the desired type
253  T *retVal = dynamic_cast<T *>(_readers[iReader]->reader);
254  if (retVal) {
255  return retVal;
256  }
257  }
258  }
259 
260  // Search for chain
261  TChain *chain = _FindChain(tName, filesHandler);
262  if (chain) {
263  T *reader = new T;
264  // Read first entry if no entry has been read yet.
265  // This is necessary in order to make branches available so that readers can check for branch match in their
266  // SetChain methods.
267  if (chain->GetReadEntry() < 0)
268  chain->GetEntry(0);
269  if (reader->SetChain(chain)) {
270  // Reset the read entry to -1, to avoid missing to read the first event with some readers.
271  chain->GetEntry(-1);
272  for (unsigned int iReader = 0; iReader < _readers.size(); iReader++) {
273  if (chain->GetEntries() != _readers[iReader]->chain->GetEntries()) {
274  COUT(WARNING) << routineName << "Event number for the requested reader (" << chain->GetEntries()
275  << ") and for reader no. " << iReader << " (" << _readers[iReader]->chain->GetEntries()
276  << ") do not match. The reader has not been created." << std::endl;
277  delete reader;
278  return nullptr;
279  }
280  }
281  if (_currentEv != -1)
282  reader->GetEntry(_currentEv);
283  _readers.push_back(new ReadersInfo());
284  _readers.back()->reader = reader;
285  _readers.back()->chain = chain;
286  _readers.back()->filesHandler = filesHandler;
287  return reader;
288  } else {
289  COUT(WARNING) << "Tree " << tName << " cannot be read by the requested reader. The reader has not been created."
290  << std::endl;
291  chain->GetEntry(-1);
292  delete reader;
293  return nullptr;
294  }
295  } else {
296  COUT(WARNING) << "Can't find tree " << tName << ". The reader has not been created." << ENDL;
297  return nullptr;
298  }
299 }
300 #endif /* GGSTROOTREADER_H_ */
const GGSTGeoParams * GetGeoParams(const GGSTFilesHandler *filesHandler=nullptr)
Returns the geometry parameters.
Class to manage ROOT output readers.
Abstract class defining the interface for tree readers.
#define ENDL
Definition: GGSSmartLog.h:105
~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:76
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.
GGSTFilesHandler * Open(const char *fileName, GGSTFilesHandler *filesHandler=nullptr, bool force=false)
Open ROOT files.
const GGSTParameters * GetGenParams(const GGSTFilesHandler *filesHandler=nullptr)
Returns the generator parameters.
Class for storing the geometry parameters on Root output file.
Definition: GGSTGeoParams.h:18
const GGSTSimInfo * GetSimInfo(const GGSTFilesHandler *filesHandler=nullptr)
Returns the simulation informations.
GGSTFilesHandler * Open(const std::string &fileName, GGSTFilesHandler *filesHandler=nullptr, bool force=false)
Open ROOT files.
const TGeoManager * GetROOTGeometry(const GGSTFilesHandler *filesHandler=nullptr)
Returns the simulation geometry in TGeo format.
GGSTRootReader()
Constructor.
A class to store simulation informations.
Definition: GGSTSimInfo.h:21
Class for writing parameters into the output Root file.
T * GetReader(GGSTFilesHandler *filesHandler=nullptr, const TString &treeName="")
Get a chain reader.