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;
63 Long64_t fFeminosDaqTotalEvents = 0;
76 void OpenInputFile(
const TString& filename,
const std::string& mode =
"");
77 void AddInputFileExternal(
const std::string& file);
79 void ReadInputFileMetadata();
80 void ReadInputFileTrees();
89 if (fCurrentEvent + 1 >= GetEntries()) {
95 TString
FormFormat(
const TString& filenameFormat);
96 TFile*
MergeToOutputFile(std::vector<std::string> fileFullNames, std::string outputFileName =
"");
98 TFile* UpdateOutputFile();
100 void PassOutputFile() {
101 fOutputFile = fInputFile;
102 fOutputFileName = fOutputFile->GetName();
109 void ImportMetadata(
const TString& rootFile,
const TString& name,
const TString& type, Bool_t store);
113 if (meta !=
nullptr) {
114 fMetadata.push_back(meta);
116 RESTWarning <<
"REST Warning! A null metadata wants to be added in TRestRun!" <<
RESTendl;
120 void SkipEventTree() {}
123 if (fInputFile !=
nullptr) fInputFile->cd();
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; }
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] :
"";
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;
157 return static_cast<T*
>(fInputEvent);
160 TRestEvent* GetEventWithID(Int_t eventID, Int_t subEventID = -1,
const TString& tag =
"");
161 std::vector<int> GetEventEntriesWithConditions(
const std::string&,
int startingIndex = 0,
163 std::vector<int> GetEventIdsWithConditions(
const std::string&,
int startingIndex = 0,
int maxNumber = -1);
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(); }
171 inline TTree* GetEventTree()
const {
return fEventTree; }
172 inline Int_t GetInputFileNumber()
const {
return fFileProcess ==
nullptr ? fInputFileNames.size() : 1; }
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(); }
183 inline std::string GetMetadataMember(
const std::string& instr) {
return ReplaceMetadataMember(instr); }
189 inline void SetInputFileName(
const std::string& s) {
191 fInputFileNames = Vector_cast<std::string, TString>(
194 inline void SetOutputFileName(
const std::string& s) { fOutputFileName = s; }
196 inline void SetCurrentEntry(
int i) { fCurrentEvent = i; }
198 inline void SetRunNumber(Int_t number) { fRunNumber = number; }
200 inline void SetRunType(
const TString& type) {
202 fRunType = (TString)cleanType;
204 inline void SetRunTag(
const TString& tag) {
206 fRunTag = (TString)cleanTag;
208 inline void SetRunUser(
const TString& user) {
210 fRunUser = (TString)cleanUser;
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; }
221 inline void SetFeminosDaqTotalEvents(Long64_t n) { fFeminosDaqTotalEvents = n; }
222 inline Long64_t GetFeminosDaqTotalEvents()
const {
return fFeminosDaqTotalEvents; }
229 inline void PrintAllMetadata() {
231 for (
unsigned int i = 0; i < fMetadata.size(); i++) {
232 fMetadata[i]->PrintMetadata();
235 inline void PrintTrees()
const {
236 if (fEventTree !=
nullptr) {
238 RESTcout <<
"=====EventTree=====" <<
RESTendl;
241 if (fAnalysisTree !=
nullptr) {
243 RESTcout <<
"=====AnalysisTree=====" <<
RESTendl;
244 fAnalysisTree->Print();
247 void PrintObservables() {
248 if (fAnalysisTree !=
nullptr) {
249 fAnalysisTree->PrintObservables();
253 inline void PrintEvent()
const { fInputEvent->
PrintEvent(); }
257 Int_t
Write(
const char* name =
nullptr, Int_t option = 0, Int_t bufsize = 0)
override;
261 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.
TString FormFormat(const TString &filenameFormat)
Form output file name according to file info list, proc info list and run data.
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.
TFile * MergeToOutputFile(std::vector< std::string > fileFullNames, std::string outputFileName="")
Form REST output file by merging a list of files together.
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.
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.