REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestRun.h
1 
2 #ifndef RestCore_TRestRun
3 #define RestCore_TRestRun
4 
5 #define REST_MAXIMUM_EVENTS 2E9
6 
7 #include <TFile.h>
8 #include <TFileMerger.h>
9 #include <TKey.h>
10 
11 #include "TRestAnalysisTree.h"
12 #include "TRestEvent.h"
13 #include "TRestMetadata.h"
14 
15 class TRestEventProcess;
16 
18 class TRestRun : public TRestMetadata {
19  protected:
20  // run info
21  Int_t fRunNumber; //< first identification number
24  TString fRunClassName;
25  TString fRunType; //< Stores bit by bit the type of run. e.g. calibration, background, pedestal,
26  // simulation, data taking
27  TString fRunUser; //< To identify the author it has created the run. It might be also a word describing
28  // the origin of the run (I.e. REST_Prototype, T-REX, etc)
29  TString fRunTag; //< A tag to be written to the output file
30  TString fRunDescription; //< A word or sentence describing the run (I.e. Fe55 calibration, cosmics, etc)
31  TString fExperimentName;
32 
33  // program data
34  TString fInputFileName;
35  TString fOutputFileName;
36  Double_t fStartTime;
37  Double_t fEndTime;
38  Int_t fEntriesSaved;
39  Int_t fNFilesSplit; // Number of files being split. Used when retrieving
40 
41  // data-like metadata objects
42  std::vector<TRestMetadata*> fMetadata;
43  std::vector<TRestMetadata*> fInputMetadata;
44 
45  // temp data members
46  std::vector<TString> fInputFileNames;
47  TFile* fInputFile;
48  TFile* fOutputFile;
49  TRestEvent* fInputEvent;
50  TTree* fEventTree;
51  TRestAnalysisTree* fAnalysisTree;
52  bool fOverwrite;
53  bool fSaveHistoricData;
54  TRestEventProcess* fFileProcess;
55  int fCurrentEvent;
56  Long64_t fBytesRead;
57  Long64_t fTotalBytes;
58  int fEventBranchLoc;
59  int fEventIndexCounter = 0;
60  bool fHangUpEndFile = false;
61  bool fFromRML = false;
62 
63  Long64_t fFeminosDaqTotalEvents = 0;
64 
65  void InitFromConfigFile() override;
66 
67  private:
68  std::string ReplaceMetadataMember(const std::string& instr, Int_t precision = 0);
69 
70  public:
72  void Initialize() override;
73 
74  // file operation
75  void OpenInputFile(int i);
76  void OpenInputFile(const TString& filename, const std::string& mode = "");
77  void AddInputFileExternal(const std::string& file);
78  void ReadFileInfo(const std::string& filename);
79  void ReadInputFileMetadata();
80  void ReadInputFileTrees();
81 
82  void ResetEntry();
83 
84  Int_t GetNextEvent(TRestEvent* targetEvent, TRestAnalysisTree* targetTree);
85 
86  void GetEntry(Long64_t entry);
87 
88  void GetNextEntry() {
89  if (fCurrentEvent + 1 >= GetEntries()) {
90  fCurrentEvent = -1;
91  }
92  GetEntry(fCurrentEvent + 1);
93  }
94 
95  TString FormFormat(const TString& filenameFormat);
96  TFile* MergeToOutputFile(std::vector<std::string> fileFullNames, std::string outputFileName = "");
97  TFile* FormOutputFile();
98  TFile* UpdateOutputFile();
99 
100  void PassOutputFile() {
101  fOutputFile = fInputFile;
102  fOutputFileName = fOutputFile->GetName();
103  }
104 
105  void WriteWithDataBase();
106 
107  void CloseFile();
108 
109  void ImportMetadata(const TString& rootFile, const TString& name, const TString& type, Bool_t store);
110 
112  inline void AddMetadata(TRestMetadata* meta) {
113  if (meta != nullptr) {
114  fMetadata.push_back(meta);
115  } else {
116  RESTWarning << "REST Warning! A null metadata wants to be added in TRestRun!" << RESTendl;
117  }
118  }
119  void AddEventBranch(TRestEvent* event);
120  void SkipEventTree() {}
121 
122  void cd() {
123  if (fInputFile != nullptr) fInputFile->cd();
124  }
125 
126  // Getters
127  inline Int_t GetParentRunNumber() const { return fParentRunNumber; }
128  inline Int_t GetSubRunNumber() const { return fParentRunNumber; }
129  inline Int_t GetRunNumber() const { return fRunNumber; }
130  inline TString GetRunType() const { return fRunType; }
131  inline TString GetRunUser() const { return fRunUser; }
132  inline TString GetRunTag() const { return fRunTag; }
133  inline TString GetRunDescription() const { return fRunDescription; }
134  Double_t GetRunLength() const;
135  inline Double_t GetStartTimestamp() const { return fStartTime; }
136  inline Double_t GetEndTimestamp() const { return fEndTime; }
137  inline TString GetExperimentName() const { return fExperimentName; }
138 
139  inline std::vector<TString> GetInputFileNames() const { return fInputFileNames; }
140  inline std::string GetInputFileName(unsigned int i) const {
141  return i < fInputFileNames.size() ? (std::string)fInputFileNames[i] : "";
142  }
143  inline std::string GetInputFileNamePattern() const { return fInputFileName.Data(); }
144  inline TString GetOutputFileName() const { return fOutputFileName; }
145  inline TFile* GetInputFile() const { return fInputFile; }
146  inline TFile* GetOutputFile() const { return fOutputFile; }
147  inline int GetCurrentEntry() const { return fCurrentEvent; }
148  inline Long64_t GetBytesRead() const { return fBytesRead; }
149  Long64_t GetTotalBytes();
150  Long64_t GetEntries() const;
151 
153  inline TRestEvent* GetInputEvent() const { return fInputEvent; }
155  template <class T>
156  inline T* GetInputEvent() {
157  return static_cast<T*>(fInputEvent);
158  }
159 
160  TRestEvent* GetEventWithID(Int_t eventID, Int_t subEventID = -1, const TString& tag = "");
161  std::vector<int> GetEventEntriesWithConditions(const std::string&, int startingIndex = 0,
162  int maxNumber = -1);
163  std::vector<int> GetEventIdsWithConditions(const std::string&, int startingIndex = 0, int maxNumber = -1);
164  TRestEvent* GetNextEventWithConditions(const std::string&);
165  inline TRestEventProcess* GetFileProcess() const { return fFileProcess; }
166  std::string GetRunInformation(const std::string& info);
167  inline Int_t GetObservableID(const std::string& name) { return fAnalysisTree->GetObservableID(name); }
168  inline Bool_t ObservableExists(const std::string& name) { return fAnalysisTree->ObservableExists(name); }
169  inline TString GetInputEventName() const { return fInputEvent->ClassName(); }
170  inline TRestAnalysisTree* GetAnalysisTree() const { return fAnalysisTree; }
171  inline TTree* GetEventTree() const { return fEventTree; }
172  inline Int_t GetInputFileNumber() const { return fFileProcess == nullptr ? fInputFileNames.size() : 1; }
173 
174  std::vector<std::string> GetEventTypesList();
175 
176  TRestMetadata* GetMetadata(const TString& name, TFile* file = nullptr);
177  TRestMetadata* GetMetadataClass(const TString& type, TFile* file = nullptr);
178  std::vector<std::string> GetMetadataNames();
179  std::vector<std::string> GetMetadataTitles();
180  inline int GetNumberOfMetadata() const { return fMetadata.size(); }
181  Double_t GetElapsedTimeSeconds() const { return fEndTime - fStartTime; }
182 
183  inline std::string GetMetadataMember(const std::string& instr) { return ReplaceMetadataMember(instr); }
184  std::string ReplaceMetadataMembers(const std::string& instr, Int_t precision = 8);
185 
186  Bool_t EvaluateMetadataMember(const std::string& instr);
187 
188  // Setters
189  inline void SetInputFileName(const std::string& s) {
190  fInputFileName = s;
191  fInputFileNames = Vector_cast<std::string, TString>(
192  TRestTools::GetFilesMatchingPattern((std::string)fInputFileName));
193  }
194  inline void SetOutputFileName(const std::string& s) { fOutputFileName = s; }
196  inline void SetCurrentEntry(int i) { fCurrentEvent = i; }
197  void SetInputEvent(TRestEvent* event);
198  inline void SetRunNumber(Int_t number) { fRunNumber = number; }
199  inline void SetParentRunNumber(Int_t number) { fParentRunNumber = number; }
200  inline void SetRunType(const TString& type) {
201  std::string cleanType = RemoveWhiteSpaces((std::string)type);
202  fRunType = (TString)cleanType;
203  }
204  inline void SetRunTag(const TString& tag) {
205  std::string cleanTag = RemoveWhiteSpaces((std::string)tag);
206  fRunTag = (TString)cleanTag;
207  }
208  inline void SetRunUser(const TString& user) {
209  std::string cleanUser = RemoveWhiteSpaces((std::string)user);
210  fRunUser = (TString)cleanUser;
211  }
212  inline void SetRunDescription(const TString& description) { fRunDescription = description; }
213  inline void SetStartTimeStamp(Double_t timestamp) { fStartTime = timestamp; }
214  inline void SetEndTimeStamp(Double_t timestamp) { fEndTime = timestamp; }
215  inline void SetTotalBytes(Long64_t totalBytes) { fTotalBytes = totalBytes; }
216  inline void SetHistoricMetadataSaving(bool save) { fSaveHistoricData = save; }
217  inline void SetNFilesSplit(int n) { fNFilesSplit = n; }
218  inline void HangUpEndFile() { fHangUpEndFile = true; }
219  inline void ReleaseEndFile() { fHangUpEndFile = false; }
220 
221  inline void SetFeminosDaqTotalEvents(Long64_t n) { fFeminosDaqTotalEvents = n; }
222  inline Long64_t GetFeminosDaqTotalEvents() const { return fFeminosDaqTotalEvents; }
223 
224  // Printers
225  void PrintStartDate();
226  void PrintEndDate();
227 
228  void PrintMetadata() override;
229  inline void PrintAllMetadata() {
230  PrintMetadata();
231  for (unsigned int i = 0; i < fMetadata.size(); i++) {
232  fMetadata[i]->PrintMetadata();
233  }
234  }
235  inline void PrintTrees() const {
236  if (fEventTree != nullptr) {
237  RESTcout << RESTendl;
238  RESTcout << "=====EventTree=====" << RESTendl;
239  fEventTree->Print();
240  }
241  if (fAnalysisTree != nullptr) {
242  RESTcout << RESTendl;
243  RESTcout << "=====AnalysisTree=====" << RESTendl;
244  fAnalysisTree->Print();
245  }
246  }
247  void PrintObservables() {
248  if (fAnalysisTree != nullptr) {
249  fAnalysisTree->PrintObservables();
250  }
251  }
252 
253  inline void PrintEvent() const { fInputEvent->PrintEvent(); }
254  void PrintErrors();
255  void PrintWarnings();
256 
257  Int_t Write(const char* name = nullptr, Int_t option = 0, Int_t bufsize = 0) override;
258 
259  // Constructor & Destructor
260  TRestRun();
261  explicit TRestRun(const std::string& filename);
262  ~TRestRun();
263 
264  ClassDefOverride(TRestRun, 6);
265 };
266 
267 #endif
REST core data-saving helper based on TTree.
Int_t GetObservableID(const std::string &obsName)
Get the index of the specified observable.
Bool_t ObservableExists(const std::string &obsName)
Get if the specified observable exists.
A base class for any REST event process.
A base class for any REST event.
Definition: TRestEvent.h:38
virtual void PrintEvent() const
Definition: TRestEvent.cxx:187
A base class for any REST metadata class.
Definition: TRestMetadata.h:74
endl_t RESTendl
Termination flag object for TRestStringOutput.
Data provider and manager in REST.
Definition: TRestRun.h:18
void PrintWarnings()
Prints out all the warnings registered by metadata classes accessible to TRestRun,...
Definition: TRestRun.cxx:1928
void AddEventBranch(TRestEvent *event)
Add an event branch in output EventTree.
Definition: TRestRun.cxx:1282
void OpenInputFile(int i)
Open the i th file in the file list.
Definition: TRestRun.cxx:314
void CloseFile()
Close both input file and output file, setting trees to nullptr also.
Definition: TRestRun.cxx:1155
TFile * FormOutputFile()
Create a new TFile as REST output file. Writing metadata objects into it.
Definition: TRestRun.cxx:1036
void AddMetadata(TRestMetadata *meta)
add metadata object to the metadata list
Definition: TRestRun.h:112
void ResetEntry()
Reset file reading progress.
Definition: TRestRun.cxx:781
TString FormFormat(const TString &filenameFormat)
Form output file name according to file info list, proc info list and run data.
Definition: TRestRun.cxx:940
Int_t fParentRunNumber
It can be used as parent number of subrun number.
Definition: TRestRun.h:23
void SetInputEvent(TRestEvent *event)
Retarget input event in the tree.
Definition: TRestRun.cxx:1245
std::string ReplaceMetadataMember(const std::string &instr, Int_t precision=0)
It will replace the data member from the corresponding metadata class type or name defined in the inp...
Definition: TRestRun.cxx:1703
void GetEntry(Long64_t entry)
Calls GetEntry() for both AnalysisTree and EventTree.
Definition: TRestRun.cxx:908
void InitFromConfigFile() override
Initialize logic of TRestRun.
Definition: TRestRun.cxx:122
void Initialize() override
REST run class.
Definition: TRestRun.cxx:71
T * GetInputEvent()
Calling GetInputEvent<TRestGeant4Event>() will return a TRestGeant4Event*
Definition: TRestRun.h:156
void PrintErrors()
Prints out all the warnings registered by metadata classes accessible to TRestRun,...
Definition: TRestRun.cxx:1902
std::string ReplaceMetadataMembers(const std::string &instr, Int_t precision=8)
It will replace the data members contained inside the string given as input. The data members in the ...
Definition: TRestRun.cxx:1652
void PrintMetadata() override
Prints the basic run information.
Definition: TRestRun.cxx:1821
TFile * MergeToOutputFile(std::vector< std::string > fileFullNames, std::string outputFileName="")
Form REST output file by merging a list of files together.
Definition: TRestRun.cxx:985
std::vector< std::string > GetEventTypesList()
It returns a list of available event types inside the file.
Definition: TRestRun.cxx:892
void ImportMetadata(const TString &rootFile, const TString &name, const TString &type, Bool_t store)
Open the root file and import the metadata of the given name.
Definition: TRestRun.cxx:1298
Bool_t EvaluateMetadataMember(const std::string &instr)
It will evaluate the expression given including the data member from the corresponding metadata class...
Definition: TRestRun.cxx:1768
void SetExtProcess(TRestEventProcess *p)
Set external file process.
Definition: TRestRun.cxx:1203
void PrintStartDate()
Prints the run start date and time in human format.
Definition: TRestRun.cxx:1860
Double_t fStartTime
Event absolute starting time/date (unix timestamp)
Definition: TRestRun.h:36
void WriteWithDataBase()
Write this object into TFile and add a new entry in database.
Definition: TRestRun.cxx:1092
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) override
overwriting the write() method with fStore considered
Definition: TRestRun.cxx:1347
TRestEvent * GetInputEvent() const
Calling GetInputEvent() will return a basic TRestEvent*
Definition: TRestRun.h:153
void ReadFileInfo(const std::string &filename)
Extract file info from a file, and save it in the file info list.
Definition: TRestRun.cxx:652
Double_t fEndTime
Event absolute ending time/date (unix timestamp)
Definition: TRestRun.h:37
Int_t GetNextEvent(TRestEvent *targetEvent, TRestAnalysisTree *targetTree)
Get next event by writing event data into target event and target tree.
Definition: TRestRun.cxx:796
TRestEvent * GetNextEventWithConditions(const std::string &)
Load the next event that satisfies the conditions specified by a string.
Definition: TRestRun.cxx:1525
static std::vector< std::string > GetFilesMatchingPattern(std::string pattern, bool unlimited=false)
Returns a list of files whose name match the pattern string. Key word is "*". e.g....
Definition: TRestTools.cxx:976
std::string RemoveWhiteSpaces(std::string in)
Returns the input string removing all white spaces.