GGS(GenericGEANT4Simulation)Software  2.99.0
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations 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(GGSTFilesHandler *filesHandler = nullptr);
206 
217  bool HasROOTGeometry(GGSTFilesHandler *filesHandler = nullptr);
218 
219 private:
220  TChain *_FindChain(const TString &treeName, GGSTFilesHandler *filesHandler);
221  TChain *_CreateChain(const TString &treeName, GGSTFilesHandler *filesHandler);
222  bool _CheckBranches(TTree *tree1, TTree *tree2);
223 
225  Long64_t _GetEntriesBlind();
226 
227  std::vector<GGSTFilesHandler *> _filesHandlers;
228 
229  struct ReadersInfo {
230  GGSTChainReader *reader;
231  TChain *chain;
232  GGSTFilesHandler *filesHandler;
233 
234  ~ReadersInfo() { delete reader; }
235  };
236  typedef std::vector<ReadersInfo *> ReadersStore;
237 
238  ReadersStore _readers;
239  Long_t _currentEv;
240  GGSTSimInfo _simInfo;
241 };
242 
243 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
244 
245 template <class T> T *GGSTRootReader::GetReader(GGSTFilesHandler *filesHandler, const TString &treeName) {
246 
247  static const char *routineName = "GGSTRootReader::GetReader";
248 
249  // Set filesHandler to first handler if no handler is provided
250  if (filesHandler == nullptr) {
251  if (_filesHandlers.size() > 0)
252  filesHandler = _filesHandlers[0];
253  }
254 
255  // Set default tree name if no name is provided
256  TString tName(treeName);
257  if (tName == "") {
258  tName = "GGSEventsTree";
259  }
260 
261  // Search the tree in stored trees (i.e., already requested by a reader)
262  for (unsigned int iReader = 0; iReader < _readers.size(); iReader++) {
263  if (_readers[iReader]->filesHandler == filesHandler && _readers[iReader]->chain->GetName() == tName) {
264  // Check if found reader is of the desired type
265  T *retVal = dynamic_cast<T *>(_readers[iReader]->reader);
266  if (retVal) {
267  return retVal;
268  }
269  }
270  }
271 
272  // Search for chain
273  TChain *chain = _FindChain(tName, filesHandler);
274  if (chain) {
275  T *reader = new T;
276  // Read first entry if no entry has been read yet.
277  // This is necessary in order to make branches available so that readers can check for branch match in their
278  // SetChain methods.
279  if (chain->GetReadEntry() < 0)
280  chain->GetEntry(0);
281  if (reader->SetChain(chain)) {
282  // Reset the read entry to -1, to avoid missing to read the first event with some readers.
283  chain->GetEntry(-1);
284  for (unsigned int iReader = 0; iReader < _readers.size(); iReader++) {
285  if (chain->GetEntries() != _readers[iReader]->chain->GetEntries()) {
286  GGSCOUT(WARNING) << routineName << "Event number for the requested reader (" << chain->GetEntries()
287  << ") and for reader no. " << iReader << " (" << _readers[iReader]->chain->GetEntries()
288  << ") do not match. The reader has not been created." << std::endl;
289  delete reader;
290  return nullptr;
291  }
292  }
293  if (_currentEv != -1)
294  reader->GetEntry(_currentEv);
295  _readers.push_back(new ReadersInfo());
296  _readers.back()->reader = reader;
297  _readers.back()->chain = chain;
298  _readers.back()->filesHandler = filesHandler;
299  return reader;
300  } else {
301  GGSCOUT(WARNING) << "Tree " << tName
302  << " cannot be read by the requested reader. The reader has not been created." << std::endl;
303  chain->GetEntry(-1);
304  delete reader;
305  return nullptr;
306  }
307  } else {
308  GGSCOUT(WARNING) << "Can't find tree " << tName << ". The reader has not been created." << GGSENDL;
309  return nullptr;
310  }
311 }
312 #endif /* GGSTROOTREADER_H_ */
bool HasROOTGeometry(GGSTFilesHandler *filesHandler=nullptr)
Checks if the data files contains the detector geometry in TGeo format.
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 GGSENDL
Definition: GGSSmartLog.h:131
~GGSTRootReader()
Destructor.
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.
const TGeoManager * GetROOTGeometry(GGSTFilesHandler *filesHandler=nullptr)
Returns the simulation geometry in TGeo format.
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.
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.