2#ifndef RestCore_TRestRun
3#define RestCore_TRestRun
5#define REST_MAXIMUM_EVENTS 2E9
8#include <TFileMerger.h>
11#include "TRestAnalysisTree.h"
12#include "TRestEvent.h"
13#include "TRestMetadata.h"
24 TString fRunClassName;
30 TString fRunDescription;
31 TString fExperimentName;
34 TString fInputFileName;
35 TString fOutputFileName;
42 std::vector<TRestMetadata*> fMetadata;
43 std::vector<TRestMetadata*> fInputMetadata;
46 std::vector<TString> fInputFileNames;
53 bool fSaveHistoricData;
59 int fEventIndexCounter = 0;
60 bool fHangUpEndFile =
false;
61 bool fFromRML =
false;
74 void OpenInputFile(
const TString& filename,
const std::string& mode =
"");
75 void AddInputFileExternal(
const std::string& file);
77 void ReadInputFileMetadata();
78 void ReadInputFileTrees();
87 if (fCurrentEvent + 1 >= GetEntries()) {
93 TString
FormFormat(
const TString& FilenameFormat);
94 TFile*
MergeToOutputFile(std::vector<std::string> filefullnames, std::string outputfilename =
"");
96 TFile* UpdateOutputFile();
98 void PassOutputFile() {
99 fOutputFile = fInputFile;
100 fOutputFileName = fOutputFile->GetName();
107 void ImportMetadata(
const TString& rootFile,
const TString& name,
const TString& type, Bool_t store);
111 if (meta !=
nullptr) {
112 fMetadata.push_back(meta);
114 RESTWarning <<
"REST Warning! A null metadata wants to be added in TRestRun!" <<
RESTendl;
118 void SkipEventTree() {}
121 if (fInputFile !=
nullptr) fInputFile->cd();
127 inline Int_t GetRunNumber()
const {
return fRunNumber; }
128 inline TString GetRunType()
const {
return fRunType; }
129 inline TString GetRunUser()
const {
return fRunUser; }
130 inline TString GetRunTag()
const {
return fRunTag; }
131 inline TString GetRunDescription()
const {
return fRunDescription; }
132 Double_t GetRunLength()
const;
133 inline Double_t GetStartTimestamp()
const {
return fStartTime; }
134 inline Double_t GetEndTimestamp()
const {
return fEndTime; }
135 inline TString GetExperimentName()
const {
return fExperimentName; }
137 inline std::vector<TString> GetInputFileNames()
const {
return fInputFileNames; }
138 inline std::string GetInputFileName(
unsigned int i)
const {
139 return i < fInputFileNames.size() ? (std::string)fInputFileNames[i] :
"";
141 inline std::string GetInputFileNamePattern()
const {
return fInputFileName.Data(); }
142 inline TString GetOutputFileName()
const {
return fOutputFileName; }
143 inline TFile* GetInputFile()
const {
return fInputFile; }
144 inline TFile* GetOutputFile()
const {
return fOutputFile; }
145 inline int GetCurrentEntry()
const {
return fCurrentEvent; }
146 inline Long64_t GetBytesReaded()
const {
return fBytesRead; }
147 Long64_t GetTotalBytes();
148 Long64_t GetEntries()
const;
155 return static_cast<T*
>(fInputEvent);
158 TRestEvent* GetEventWithID(Int_t eventID, Int_t subEventID = -1,
const TString& tag =
"");
159 std::vector<int> GetEventEntriesWithConditions(
const std::string&,
int startingIndex = 0,
161 std::vector<int> GetEventIdsWithConditions(
const std::string&,
int startingIndex = 0,
int maxNumber = -1);
164 std::string GetRunInformation(
const std::string& info);
165 inline Int_t GetObservableID(
const std::string& name) {
return fAnalysisTree->
GetObservableID(name); }
166 inline Bool_t ObservableExists(
const std::string& name) {
return fAnalysisTree->
ObservableExists(name); }
167 inline TString GetInputEventName()
const {
return fInputEvent->ClassName(); }
169 inline TTree* GetEventTree()
const {
return fEventTree; }
170 inline Int_t GetInputFileNumber()
const {
return fFileProcess ==
nullptr ? fInputFileNames.size() : 1; }
174 TRestMetadata* GetMetadata(
const TString& name, TFile* file =
nullptr);
175 TRestMetadata* GetMetadataClass(
const TString& type, TFile* file =
nullptr);
176 std::vector<std::string> GetMetadataNames();
177 std::vector<std::string> GetMetadataTitles();
178 inline int GetNumberOfMetadata()
const {
return fMetadata.size(); }
180 inline std::string GetMetadataMember(
const std::string& instr) {
return ReplaceMetadataMember(instr); }
186 inline void SetInputFileName(
const std::string& s) {
188 fInputFileNames = Vector_cast<std::string, TString>(
191 inline void SetOutputFileName(
const std::string& s) { fOutputFileName = s; }
193 inline void SetCurrentEntry(
int i) { fCurrentEvent = i; }
196 inline void SetRunNumber(Int_t number) { fRunNumber = number; }
198 inline void SetRunType(
const TString& type) {
200 fRunType = (TString)cleanType;
202 inline void SetRunTag(
const TString& tag) {
204 fRunTag = (TString)cleanTag;
206 inline void SetRunUser(
const TString& user) {
208 fRunUser = (TString)cleanUser;
210 inline void SetRunDescription(
const TString& description) { fRunDescription = description; }
211 inline void SetStartTimeStamp(Double_t timestamp) {
fStartTime = timestamp; }
212 inline void SetEndTimeStamp(Double_t timestamp) {
fEndTime = timestamp; }
213 inline void SetTotalBytes(Long64_t totalBytes) { fTotalBytes = totalBytes; }
214 inline void SetHistoricMetadataSaving(
bool save) { fSaveHistoricData = save; }
215 inline void SetNFilesSplit(
int n) { fNFilesSplit = n; }
216 inline void HangUpEndFile() { fHangUpEndFile =
true; }
217 inline void ReleaseEndFile() { fHangUpEndFile =
false; }
223 inline void PrintAllMetadata() {
225 for (
unsigned int i = 0; i < fMetadata.size(); i++) fMetadata[i]->
PrintMetadata();
227 inline void PrintTrees()
const {
228 if (fEventTree !=
nullptr) {
230 RESTcout <<
"=====EventTree=====" <<
RESTendl;
233 if (fAnalysisTree !=
nullptr) {
235 RESTcout <<
"=====AnalysisTree=====" <<
RESTendl;
236 fAnalysisTree->Print();
239 void PrintObservables() {
240 if (fAnalysisTree !=
nullptr) fAnalysisTree->PrintObservables();
243 inline void PrintEvent()
const { fInputEvent->
PrintEvent(); }
247 Int_t
Write(
const char* name =
nullptr, Int_t option = 0, Int_t bufsize = 0)
override;
251 explicit TRestRun(
const std::string& filename);
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.
virtual void PrintEvent() const
Data provider and manager in REST.
void PrintWarnings()
Prints out all the warnings registered by metadata classes accessible to TRestRun,...
void AddEventBranch(TRestEvent *event)
Add an event branch in output EventTree.
void OpenInputFile(int i)
Open the i th file in the file list.
void CloseFile()
Close both input file and output file, setting trees to nullptr also.
TFile * FormOutputFile()
Create a new TFile as REST output file. Writing metadata objects into it.
void AddMetadata(TRestMetadata *meta)
add metadata object to the metadata list
void ResetEntry()
Reset file reading progress.
TRestEvent * GetInputEvent() const
Calling GetInputEvent() will return a basic TRestEvent*
Int_t fParentRunNumber
It can be used as parent number of subrun number.
T * GetInputEvent()
Calling GetInputEvent<TRestGeant4Event>() will return a TRestGeant4Event*
void SetInputEvent(TRestEvent *event)
Retarget input event in the tree.
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...
void GetEntry(Long64_t entry)
Calls GetEntry() for both AnalysisTree and EventTree.
void InitFromConfigFile() override
Initialize logic of TRestRun.
void Initialize() override
REST run class.
void PrintErrors()
Prints out all the warnings registered by metadata classes accessible to TRestRun,...
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 ...
void PrintMetadata() override
Prints the basic run information.
std::vector< std::string > GetEventTypesList()
It returns a list of available event types inside the file.
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.
Bool_t EvaluateMetadataMember(const std::string &instr)
It will evaluate the expression given including the data member from the corresponding metadata class...
void SetExtProcess(TRestEventProcess *p)
Set external file process.
TString FormFormat(const TString &FilenameFormat)
Form output file name according to file info list, proc info list and run data.
TFile * MergeToOutputFile(std::vector< std::string > filefullnames, std::string outputfilename="")
Form REST output file by merging a list of files together.
void PrintStartDate()
Prints the run start date and time in human format.
Double_t fStartTime
Event absolute starting time/date (unix timestamp)
void WriteWithDataBase()
Write this object into TFile and add a new entry in database.
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) override
overwriting the write() method with fStore considered
void ReadFileInfo(const std::string &filename)
Extract file info from a file, and save it in the file info list.
Double_t fEndTime
Event absolute ending time/date (unix timestamp)
Int_t GetNextEvent(TRestEvent *targetEvent, TRestAnalysisTree *targetTree)
Get next event by writing event data into target event and target tree.
TRestEvent * GetNextEventWithConditions(const std::string &)
Load the next event that satisfies the conditions specified by a string.
std::string RemoveWhiteSpaces(std::string in)
Returns the input string removing all white spaces.