41#include "TRestDataBase.h"
42#include "TRestEventProcess.h"
43#include "TRestManager.h"
44#include "TRestVersion.h"
54TRestRun::TRestRun(
const string& filename) {
55 if (filename.find(
".root") != string::npos) {
58 }
else if (filename.find(
".rml") != string::npos) {
62 RESTError <<
"TRestRun::TRestRun(): input file error!" <<
RESTendl;
84 fExperimentName =
"Null";
86 fRunDescription =
"Null";
88 fInputFileName =
"null";
89 fOutputFileName =
"rest_default.root";
97 fInputMetadata.clear();
99 fInputFileNames.clear();
100 fInputFile =
nullptr;
101 fOutputFile =
nullptr;
102 fInputEvent =
nullptr;
103 fAnalysisTree =
nullptr;
104 fEventTree =
nullptr;
106 fEventBranchLoc = -1;
107 fFileProcess =
nullptr;
108 fSaveHistoricData =
true;
123 RESTDebug <<
"Initializing TRestRun from config file, version: " << REST_RELEASE <<
RESTendl;
128 fRunUser = REST_USER;
141 string inputNameOld =
GetParameter(
"inputFile",
"default");
142 if (inputNameOld !=
"default") {
143 RESTWarning <<
"Parameter \"inputFile\" in rml is obsolete! Please update it to \"inputFileName\""
145 if (inputName.empty()) {
146 inputName = inputNameOld;
150 RESTError <<
"TRestRun: run number and input file name cannot both be "
156 if (
ToUpper(inputName) !=
"AUTO") {
157 fInputFileName = inputName;
161 if (
ToUpper(runNstr) !=
"AUTO") {
162 fRunNumber = atoi(runNstr.c_str());
165 if (
ToUpper(inputName) ==
"AUTO") {
168 fInputFileName = db->
query_run(fRunNumber).value;
169 fInputFileNames = Vector_cast<DBFile, TString>(files);
172 if (
ToUpper(runNstr) ==
"AUTO") {
176 fRunNumber = runs[0];
182 if (fRunNumber == 0) {
185 entry.runNr = fRunNumber;
186 entry.description = fRunDescription;
188 entry.type = fRunType;
189 entry.version = REST_RELEASE;
195 if (fRunNumber != -1) {
196 DBEntry entry = gDataBase->
query_run(fRunNumber);
197 if (!entry.IsZombie()) {
200 fRunDescription = entry.description;
202 fRunType = entry.type;
206 if (fInputFileNames.empty()) {
207 if (fInputFileName !=
"") {
208 RESTError <<
"cannot find the input file!" <<
RESTendl;
211 RESTWarning <<
"no input file added" <<
RESTendl;
218 string outputName =
GetParameter(
"outputFileName",
"default");
219 string outputNameOld =
GetParameter(
"outputFile",
"default");
220 if (outputNameOld !=
"default") {
221 RESTWarning <<
"Parameter \"outputFile\" in rml is obsolete! Please update it to \"outputFileName\""
223 if (outputName ==
"default") {
224 outputName = outputNameOld;
227 if (
ToUpper(outputName) ==
"DEFAULT") {
230 char runParentStr[256];
232 char runNumberStr[256];
233 sprintf(runNumberStr,
"%05d", fRunNumber);
235 fOutputFileName = outputDir +
"Run_" + expName +
"_" + fRunUser +
"_" + runType +
"_" + fRunTag +
236 "_" + (TString)runNumberStr +
"_" + (TString)runParentStr +
"_V" + REST_RELEASE +
243 fOutputFileName = outputDir +
"Run_" + expName +
"_" + fRunUser +
"_" + runType +
"_" + fRunTag +
244 "_" + (TString)runNumberStr +
"_" + (TString)runParentStr +
"_V" +
245 REST_RELEASE +
".root";
247 }
else if (
ToUpper(outputName) ==
"NULL" || outputName ==
"/dev/null") {
248 fOutputFileName =
"/dev/null";
250 fOutputFileName = outputName;
253 fOutputFileName = outputDir +
"/" + outputName;
259 int z = system((TString)
"mkdir -p " + outputDir);
260 if (z != 0) RESTError <<
"Problem creating directory : " << outputDir <<
RESTendl;
263 RESTWarning <<
"TRestRun: Output path '" << outputDir <<
"' does not exist or it is not writable."
268 TiXmlElement* e =
fElement->FirstChildElement();
269 while (e !=
nullptr) {
270 string key = e->Value();
271 if (key ==
"addMetadata") {
272 if (e->Attribute(
"file") !=
nullptr) {
273 ImportMetadata(e->Attribute(
"file"), e->Attribute(
"name"), e->Attribute(
"type"),
true);
275 RESTWarning <<
"Wrong definition of addMetadata! Metadata name or file name "
279 }
else if (
Count(key,
"TRest") > 0) {
281 RESTWarning <<
"TRestRun: A root file is being included in section <" << key
282 <<
" ! To import metadata from this file, use <addMetadata" <<
RESTendl;
283 RESTWarning <<
"Skipping..." <<
RESTendl;
287 if (meta ==
nullptr) {
288 RESTWarning <<
"failed to add metadata \"" << key <<
"\"" <<
RESTendl;
289 e = e->NextSiblingElement();
294 fMetadata.push_back(meta);
297 e = e->NextSiblingElement();
303 RESTDebug <<
"TRestRun::EndOfInit. InputFile pattern: \"" << fInputFileName <<
"\"" <<
RESTendl;
304 RESTInfo <<
"which matches :" <<
RESTendl;
305 for (
const auto& inputFileName : fInputFileNames) {
306 RESTInfo << inputFileName <<
RESTendl;
308 RESTEssential <<
"(" << fInputFileNames.size() <<
" added files)" <<
RESTendl;
315 if (fInputFileNames.size() > (
unsigned int)i) {
316 TString Filename = fInputFileNames[i];
317 RESTInfo <<
"opening... " << Filename <<
RESTendl;
334 RESTError <<
"input file \"" << filename <<
"\" does not exist!" <<
RESTendl;
338 if (!filename.Contains(
"http"))
ReadFileInfo((
string)filename);
342 for (
const auto& inputFileName : fInputFileNames) {
343 if (inputFileName == filename) {
350 fInputFileNames.push_back(filename);
354 fInputFile = TFile::Open(filename, mode.c_str());
356 if (GetMetadataClass(
"TRestRun", fInputFile)) {
358 TString runTypeTmp = fRunType;
360 TString runTagTmp = fRunTag;
361 TString runDescriptionTmp = fRunDescription;
362 TString experimentNameTmp = fExperimentName;
363 TString outputFileNameTmp = fOutputFileName;
364 TString inputFileNameTmp = fInputFileName;
374 this->Read(GetMetadataClass(
"TRestRun", fInputFile)->GetName());
376 if (inputFileNameTmp !=
"null") fInputFileName = inputFileNameTmp;
377 if (outputFileNameTmp !=
"rest_default.root") fOutputFileName = outputFileNameTmp;
383 if (runTypeTmp !=
"Null" && runTypeTmp !=
"preserve") fRunType = runTypeTmp;
390 if (runTagTmp !=
"Null" && runTagTmp !=
"preserve") fRunTag = runTagTmp;
391 if (runDescriptionTmp !=
"Null" && runDescriptionTmp !=
"preserve")
392 fRunDescription = runDescriptionTmp;
393 if (experimentNameTmp !=
"Null" && experimentNameTmp !=
"preserve")
394 fExperimentName = experimentNameTmp;
401 if (fSaveHistoricData) {
402 if (this->GetVersionCode() >= REST_VERSION(2, 2, 1) ||
403 this->GetVersionCode() <= REST_VERSION(2, 1, 8)) {
404 ReadInputFileMetadata();
406 RESTWarning <<
"-- W : The metadata version found on input file is lower "
409 RESTWarning <<
"-- W : metadata from input file will not be read" <<
RESTendl;
413 RESTDebug <<
"Initializing input file : version code : " << this->GetVersionCode() <<
RESTendl;
415 ReadInputFileTrees();
418 RESTWarning <<
"TRestRun object not found in file! The input file may be incomplete!" <<
RESTendl;
419 ReadInputFileTrees();
422 fInputFile =
nullptr;
423 fAnalysisTree =
nullptr;
424 if (fFileProcess !=
nullptr) {
425 fFileProcess->OpenInputFiles(Vector_cast<TString, string>(fInputFileNames));
430 if (fAnalysisTree ==
nullptr && fFileProcess ==
nullptr)
431 RESTInfo <<
"Input file is not REST root file, an external process is needed!" <<
RESTendl;
434void TRestRun::AddInputFileExternal(
const string& file) {
436 if (fFileProcess !=
nullptr) {
437 bool add = fFileProcess->AddInputFile(file);
439 RESTError <<
"failed to add input file!" <<
RESTendl;
441 fInputFileNames.emplace_back(file);
446void TRestRun::ReadInputFileMetadata() {
447 TFile* f = fInputFile;
449 fInputMetadata.clear();
451 TIter nextkey(f->GetListOfKeys());
454 set<string> addedNames;
455 while ((key = (TKey*)nextkey())) {
456 RESTDebug <<
"Reading key with name : " << key->GetName() <<
RESTendl;
457 RESTDebug <<
"Key type (class) : " << key->GetClassName() <<
RESTendl;
459 if (!TClass::GetClass(key->GetClassName()) ||
460 !TClass::GetClass(key->GetClassName())->IsLoaded()) {
461 RESTError <<
"-- Class " << key->GetClassName() <<
" has no dictionary!" <<
RESTendl;
462 RESTError <<
"- Any relevant REST library missing? " <<
RESTendl;
463 RESTError <<
"- File reading will continue without loading key: " << key->GetName()
468 if (addedNames.count(key->GetName()) != 0) {
473 RESTDebug <<
"Key of type : " << a->ClassName() <<
"(" << a <<
")" <<
RESTendl;
476 RESTError <<
"TRestRun::ReadInputFileMetadata." <<
RESTendl;
477 RESTError <<
"Key name : " << key->GetName() <<
RESTendl;
478 RESTError <<
"Hidden key? Please, report this problem." <<
RESTendl;
479 }
else if (a->InheritsFrom(
"TRestMetadata") && a->ClassName() != (TString)
"TRestRun") {
499 fInputMetadata.push_back(a);
500 fMetadata.push_back(a);
501 addedNames.insert(key->GetName());
507void TRestRun::ReadInputFileTrees() {
508 if (fInputFile !=
nullptr) {
509 RESTDebug <<
"Finding TRestAnalysisTree.." <<
RESTendl;
510 TTree* _eventTree =
nullptr;
511 string filename = fInputFile->GetName();
513 if (fInputFile->Get(
"AnalysisTree") !=
nullptr) {
516 if (fNFilesSplit > 0) {
517 RESTEssential <<
"Linking analysis tree from split data files" <<
RESTendl;
520 fAnalysisTree->Clone();
521 for (
int i = 1; i <= fNFilesSplit; i++) {
522 string filename = fInputFile->GetName() + (string)
"." + ToString(i);
523 RESTInfo << filename <<
" --> ";
526 if (fAnalysisTree->GetChain() ==
nullptr ||
527 fAnalysisTree->GetChain()->GetNtrees() != fNFilesSplit + 1) {
528 RESTError <<
"Error adding split files, files missing?" <<
RESTendl;
529 RESTError <<
"Your data could be incomplete!" <<
RESTendl;
536 fAnalysisTree->GetEntries();
538 fAnalysisTree->GetEntry(0);
540 _eventTree = (TTree*)fInputFile->Get(
"EventTree");
541 }
else if (fInputFile->FindKey(
"TRestAnalysisTree") !=
nullptr) {
545 RESTWarning <<
"Loading root file from old version REST!" <<
RESTendl;
547 fAnalysisTree->GetEntry(0);
549 TIter nextkey(fInputFile->GetListOfKeys());
551 while ((key = (TKey*)nextkey())) {
553 if (((
string)key->GetName()).find(
"EventTree") != string::npos) {
554 _eventTree = (TTree*)fInputFile->Get(key->GetName());
555 string eventName =
Replace(key->GetName(),
"Tree",
"", 0);
556 TBranch* br = _eventTree->GetBranch(
"eventBranch");
557 br->SetName((eventName +
"Branch").c_str());
558 br->SetTitle((eventName +
"Branch").c_str());
562 RESTDebug <<
"Old REST file successfully recovered!" <<
RESTendl;
564 RESTWarning <<
"(OpenInputFile) : AnalysisTree was not found" <<
RESTendl;
565 RESTWarning <<
"Inside file : " << filename <<
RESTendl;
566 RESTWarning <<
"This may not be a REST output file!" <<
RESTendl;
569 if (_eventTree !=
nullptr) {
570 if (fNFilesSplit > 0) {
573 RESTEssential <<
"Linking event tree from split data files" <<
RESTendl;
574 TChain* _fEventTree =
new TChain(
"EventTree");
575 RESTInfo << fInputFile->GetName() <<
" --> ";
576 RESTInfo << (_fEventTree->Add(fInputFile->GetName()) ?
"success" :
"failed") <<
RESTendl;
578 for (
int i = 1; i <= fNFilesSplit; i++) {
579 string filename = fInputFile->GetName() + (string)
"." + ToString(i);
580 RESTInfo << filename <<
" --> ";
581 RESTInfo << (_fEventTree->Add(filename.c_str()) ?
"success" :
"failed") <<
RESTendl;
583 fEventTree = _fEventTree;
585 fEventTree = _eventTree;
588 RESTDebug <<
"Finding event branch.." <<
RESTendl;
589 if (fInputEvent ==
nullptr) {
590 TObjArray* branches = fEventTree->GetListOfBranches();
592 if (branches->GetLast() > -1) {
593 TBranch* br = (TBranch*)branches->At(branches->GetLast());
595 if (br ==
nullptr ||
Count(br->GetName(),
"EventBranch") == 0) {
596 RESTInfo <<
"No event branch inside file : " << filename <<
RESTendl;
597 RESTInfo <<
"This file may be a pure analysis file" <<
RESTendl;
599 string type =
Replace(br->GetName(),
"Branch",
"", 0);
600 TClass* cl = TClass::GetClass(type.c_str());
601 if (cl->HasDictionary()) {
603 }
else if (fInputEvent !=
nullptr) {
605 fInputEvent =
nullptr;
608 if (fInputEvent ==
nullptr) {
609 RESTError <<
"TRestRun:OpenInputFile. Cannot initialize input event, event "
613 <<
"Please install corresponding libraries to provide root dictionaries for "
619 fInputEvent->InitializeWithMetadata(
this);
620 fEventTree->SetBranchAddress(br->GetName(), &fInputEvent);
621 fEventBranchLoc = branches->GetLast();
622 RESTDebug <<
"found event branch of event type: " << fInputEvent->ClassName()
627 string brname = (string)fInputEvent->ClassName() +
"Branch";
628 if (fEventTree->GetBranch(brname.c_str()) ==
nullptr) {
629 RESTWarning <<
"REST WARNING (OpenInputFile) : No matched event branch "
632 RESTWarning <<
"Branch required: " << brname <<
RESTendl;
634 fEventTree->SetBranchAddress(brname.c_str(), &fInputEvent);
635 RESTDebug << brname <<
" is found and set!" <<
RESTendl;
639 RESTDebug <<
"TRestRun:OpenInputFile. EventTree was not found" <<
RESTendl;
640 RESTDebug <<
"This is a pure analysis file!" <<
RESTendl;
641 fInputEvent =
nullptr;
654 RESTDebug <<
"begin collecting basic file info..." << filename <<
RESTendl;
658 FILE* fp = fopen(filename.c_str(),
"rb");
660 RESTError <<
"TRestRun::ReadFileInfo. Something went wrong with fopen()!" << strerror(errno)
672 fTotalBytes = buf.st_size;
675 RESTDebug <<
"begin matching file name pattern for more file info..." <<
RESTendl;
683 vector<string> formatSectionList;
684 vector<string> formatPrefixList;
690 pos1 = format.find(
"[", pos + 1);
691 pos2 = format.find(
"]", pos1);
692 if (pos1 == -1 || pos2 == -1) {
693 formatPrefixList.push_back(format.substr(pos + 1, -1));
697 formatSectionList.push_back(format.substr(pos1 + 1, pos2 - pos1 - 1));
698 formatPrefixList.push_back(format.substr(pos + 1, pos1 - pos - 1));
704 for (
unsigned int i = 0; i < formatSectionList.size() && i < formatPrefixList.size() - 1; i++) {
705 if (i != 0 && formatPrefixList[i].empty()) {
706 RESTWarning <<
"file format reference contains error!" <<
RESTendl;
709 int pos1 = name.find(formatPrefixList[i], pos + 1) + formatPrefixList[i].size();
710 if (formatPrefixList[i].empty()) pos1 = 0;
711 int pos2 = name.find(formatPrefixList[i + 1], pos1);
712 if (formatPrefixList[i + 1].empty()) pos2 = name.length();
713 if (pos1 == -1 || pos2 == -1) {
714 RESTWarning <<
"File pattern matching: file format mismatch!" <<
RESTendl;
718 string infoFromFileName = name.substr(pos1, pos2 - pos1);
720 RESTDebug <<
"File pattern matching. key: " << formatSectionList[i] <<
" (between the mark \""
721 << formatPrefixList[i] <<
"\" and \"" << formatPrefixList[i + 1]
722 <<
"\"), value: " << infoFromFileName <<
RESTendl;
725 bool inforead =
false;
734 RESTWarning <<
"TRestRun: file name format field \"" << formatSectionList[i]
735 <<
"\"(value = " << infoFromFileName
736 <<
") not registered, data member does not exist in TRestRun!" <<
RESTendl;
744 vector<string> classDataMember =
Split(formatSectionList[i],
"::");
745 if (classDataMember.size() > 1) {
747 if (meta !=
nullptr) {
754 RESTWarning <<
"TRestRun: file name format field \"" << formatSectionList[i]
755 <<
"\"(value = " << infoFromFileName
756 <<
") not registered, metadata exist but without such datamember field!"
760 RESTWarning <<
"TRestRun: file name format field \"" << formatSectionList[i]
761 <<
"\"(value = " << infoFromFileName
762 <<
") not registered, metadata does not exist!" <<
RESTendl;
784 if (fFileProcess !=
nullptr) {
785 fFileProcess->ResetEntry();
798 bool messageShown =
false;
801 if (fFileProcess !=
nullptr) {
802 RESTDebug <<
"TRestRun: getting next event from external process" <<
RESTendl;
816 if (eve ==
nullptr) {
817 RESTDebug <<
"TRestRun::GetNextEvent(): input event has not been initialized!" <<
RESTendl;
819 RESTDebug <<
"TRestRun: getting next event from root file" <<
RESTendl;
820 if (fAnalysisTree ==
nullptr) {
821 RESTWarning <<
"error to get event from input file, missing analysis tree from input file"
825 if (fCurrentEvent >= fAnalysisTree->
GetTree()->GetEntriesFast()) {
828 if (targetTree !=
nullptr) {
831 fBytesRead += fAnalysisTree->GetEntry(fCurrentEvent);
832 targetTree->SetEventInfo(fAnalysisTree);
833 for (
int n = 0; n < fAnalysisTree->GetNumberOfObservables(); n++)
834 targetTree->
SetObservable(n, fAnalysisTree->GetObservable(n));
836 if (fEventTree !=
nullptr) {
837 if (fEventTree->IsA() == TChain::Class()) {
838 Long64_t entry = fEventTree->LoadTree(fCurrentEvent);
839 fBytesRead += ((TBranch*)fEventTree->GetTree()->GetListOfBranches()->UncheckedAt(
844 ((TBranch*)fEventTree->GetListOfBranches()->UncheckedAt(fEventBranchLoc))
856 if (eve ==
nullptr) {
857 if (fHangUpEndFile && fFileProcess !=
nullptr) {
861 RESTEssential <<
"external process file reading reaches end, waiting for more files"
876 if (fInputEvent->GetID() == 0 && fInputEvent->GetSubID() == 0) {
877 fInputEvent->SetID(fCurrentEvent - 1);
880 if (fInputEvent->GetRunOrigin() == 0) {
881 fInputEvent->SetRunOrigin(fRunNumber);
885 fInputEvent->
CloneTo(targetEvent);
894 std::vector<std::string> list;
895 TObjArray* branches = GetEventTree()->GetListOfBranches();
896 for (
int i = 0; i <= branches->GetLast(); i++) {
897 auto branch = (TBranch*)branches->At(i);
898 if (((std::string)branch->GetName()).find(
"EventBranch") != string::npos) {
899 std::string eventType =
Replace((
string)branch->GetName(),
"Branch",
"");
900 list.emplace_back(eventType);
910 if (entry >= GetEntries()) {
911 RESTWarning <<
"TRestRun::GetEntry. Entry requested out of limits" <<
RESTendl;
912 RESTWarning <<
"Total number of entries is : " << GetEntries() <<
RESTendl;
915 if (fAnalysisTree !=
nullptr) {
916 fAnalysisTree->GetEntry(entry);
918 if (fEventTree !=
nullptr) {
919 fEventTree->GetEntry(entry);
922 if (fInputEvent !=
nullptr) {
926 fCurrentEvent = entry;
942 string inString = (string)FilenameFormat;
943 string outString = (string)FilenameFormat;
945 RESTDebug <<
"TRestRun::FormFormat. In string : " << inString <<
RESTendl;
949 int pos1 = inString.find(
"[", pos);
950 int pos2 = inString.find(
"]", pos1);
951 if (pos1 == -1 || pos2 == -1)
break;
953 string targetstr = inString.substr(pos1, pos2 - pos1 + 1);
954 string target = inString.substr(pos1 + 1, pos2 - pos1 - 1);
955 string replacestr = GetRunInformation(target);
957 RESTDebug <<
"TRestRun::FormFormat. target : " << target <<
RESTendl;
958 RESTDebug <<
"TRestRun::FormFormat. replacestr : " << replacestr <<
RESTendl;
963 if (target ==
"fVersion") replacestr = (string)REST_RELEASE;
964 if (target ==
"fCommit") replacestr = (string)REST_COMMIT;
966 if (replacestr != target) {
967 if (target ==
"fRunNumber" || target ==
"fParentRunNumber") {
970 outString =
Replace(outString, targetstr, replacestr, 0);
987 RESTDebug <<
"TRestRun::FormOutputFile. target : " << outputfilename <<
RESTendl;
989 TFileMerger* m =
new TFileMerger(
false);
990 if (outputfilename.empty()) {
991 filename = fOutputFileName;
992 RESTInfo <<
"Creating file : " << filename <<
RESTendl;
993 m->OutputFile(filename.c_str(),
"RECREATE");
995 filename = outputfilename;
996 RESTInfo <<
"Updating file : " << filename <<
RESTendl;
997 m->OutputFile(filename.c_str(),
"UPDATE");
1000 RESTDebug <<
"TRestRun::FormOutputFile. Starting to add files" <<
RESTendl;
1002 for (
unsigned int i = 0; i < filenames.size(); i++) {
1003 m->AddFile(filenames[i].c_str(),
false);
1007 for (
unsigned int i = 0; i < filenames.size(); i++) {
1008 remove(filenames[i].c_str());
1011 fOutputFileName =
"";
1012 RESTError <<
"(Merge files) failed to merge process files." <<
RESTendl;
1020 rename(filename.c_str(), fOutputFileName);
1023 fOutputFile =
new TFile(fOutputFileName,
"update");
1024 RESTDebug <<
"TRestRun::FormOutputFile. Calling WriteWithDataBase()" <<
RESTendl;
1027 RESTcout << this->ClassName() <<
" Created ..." <<
RESTendl;
1040 fOutputFileName =
FormFormat(fOutputFileName);
1042 fOutputFileName = std::filesystem::weakly_canonical(fOutputFileName.Data());
1044 fOutputFile =
new TFile(fOutputFileName,
"recreate");
1046 fEventTree =
new TTree(
"EventTree",
"EventTree");
1048 fAnalysisTree->Write(
nullptr, TObject::kOverwrite);
1049 fEventTree->Write(
nullptr, TObject::kOverwrite);
1052 RESTcout <<
"TRestRun: Output File Created." <<
RESTendl;
1059TFile* TRestRun::UpdateOutputFile() {
1060 if (fOutputFile !=
nullptr) {
1061 if (fOutputFile->IsOpen()) {
1062 fOutputFile->ReOpen(
"update");
1067 fAnalysisTree->Write(
nullptr, kOverwrite);
1068 fEventTree->Write(
nullptr, kOverwrite);
1072 RESTcout <<
"TRestRun: Output File Updated." <<
RESTendl;
1079 RESTError <<
"TRestRun::UpdateOutputFile(): output file is closed" <<
RESTendl;
1096 RESTDebug <<
"TRestRun::WriteWithDataBase. Getting entries in analysisTree" <<
RESTendl;
1100 if (fOutputFile !=
nullptr) {
1102 if (tree !=
nullptr) {
1103 fEntriesSaved = tree->GetEntries();
1106 RESTDebug <<
"TRestRun::WriteWithDataBase. Entries found : " << fEntriesSaved <<
RESTendl;
1115 fRunUser = REST_USER;
1119 RESTDebug <<
"TRestRun::WriteWithDataBase. Calling this->Write(0, kOverwrite)" <<
RESTendl;
1120 this->
Write(
nullptr, kOverwrite);
1122 RESTDebug <<
"TRestRun::WriteWithDataBase. Succeed" <<
RESTendl;
1123 RESTDebug <<
"TRestRun::WriteWithDataBase. fMetadata.size() == " << fMetadata.size() <<
RESTendl;
1124 for (
auto& metadata : fMetadata) {
1125 bool historic =
false;
1126 RESTDebug <<
"TRestRun::WriteWithDataBase. fInputMetadata.size() == " << fInputMetadata.size()
1128 for (
const auto& inputMetadata : fInputMetadata) {
1129 RESTDebug << metadata->GetName() <<
" == " << inputMetadata->GetName() <<
RESTendl;
1130 if (metadata == inputMetadata) {
1137 RESTDebug <<
"NO historic" <<
RESTendl;
1138 metadata->Write(metadata->GetName(), kOverwrite);
1140 RESTDebug <<
"IS historic" <<
RESTendl;
1141 if (fSaveHistoricData) metadata->Write(metadata->GetName(), kOverwrite);
1146 RESTDebug <<
"TResRun::WriteWithDataBase. Run number is : " << fRunNumber <<
RESTendl;
1147 if (fRunNumber != -1) {
1148 int fileid = gDataBase->
set_runfile(fRunNumber, (
string)fOutputFileName);
1149 RESTcout <<
"DataBase Entry Added! Run Number: " << fRunNumber <<
", File ID: " << fileid <<
RESTendl;
1158 if (fAnalysisTree !=
nullptr) {
1159 fEntriesSaved = fAnalysisTree->GetEntries();
1160 if (fAnalysisTree->GetEntries() > 0 && fInputFile ==
nullptr) {
1161 if (fOutputFile !=
nullptr) {
1163 fAnalysisTree->Write(
nullptr, kOverwrite);
1164 this->
Write(
nullptr, kOverwrite);
1167 delete fAnalysisTree;
1168 fAnalysisTree =
nullptr;
1171 if (fEventTree !=
nullptr) {
1172 if (fEventTree->GetEntries() > 0 && fInputFile ==
nullptr) fEventTree->Write(
nullptr, kOverwrite);
1174 fEventTree =
nullptr;
1177 for (
unsigned int i = 0; i < fMetadata.size(); i++) {
1178 for (
unsigned int j = 0; j < fInputMetadata.size(); j++) {
1179 if (fMetadata[i] == fInputMetadata[j]) {
1180 delete fMetadata[i];
1181 fMetadata.erase(fMetadata.begin() + i);
1183 fInputMetadata.erase(fInputMetadata.begin() + j);
1189 if (fOutputFile !=
nullptr) {
1190 fOutputFile->Write(0, TObject::kOverwrite);
1191 fOutputFile->Close();
1193 fOutputFile =
nullptr;
1195 if (fInputFile !=
nullptr) {
1196 fInputFile->Close();
1197 fInputFile =
nullptr;
1205 if (fFileProcess ==
nullptr && p !=
nullptr) {
1208 fFileProcess->OpenInputFiles(Vector_cast<TString, string>(fInputFileNames));
1211 if (fInputEvent ==
nullptr) {
1212 RESTError <<
"The external process \"" << p->GetName() <<
"\" doesn't yield any output event!"
1216 fInputEvent->SetRunOrigin(fRunNumber);
1220 fInputFile =
nullptr;
1222 fAnalysisTree =
new TRestAnalysisTree(
"externalProcessAna",
"externalProcessAna");
1228 RESTInfo <<
"The external file process has been set! Name : " << fFileProcess->GetName() <<
RESTendl;
1230 if (fFileProcess !=
nullptr) {
1231 RESTError <<
"There can only be one file process!" <<
RESTendl;
1235 RESTWarning <<
"Given file process is null, skipping..." <<
RESTendl;
1247 if (event !=
nullptr) {
1248 if (fEventTree !=
nullptr) {
1249 if (fInputEvent !=
nullptr) {
1250 fEventTree->SetBranchAddress((TString)fInputEvent->ClassName() +
"Branch",
nullptr);
1251 fEventTree->SetBranchStatus((TString)fInputEvent->ClassName() +
"Branch",
false);
1253 TObjArray* branches = fEventTree->GetListOfBranches();
1254 string branchName = (string)event->ClassName() +
"Branch";
1255 for (
int i = 0; i <= branches->GetLast(); i++) {
1256 auto branch = (TBranch*)branches->At(i);
1257 if ((
string)branch->GetName() == branchName) {
1258 RESTDebug <<
"Setting input event.. Type: " <<
event->ClassName() <<
" Address: " <<
event
1260 fInputEvent = event;
1261 fEventTree->SetBranchAddress(branchName.c_str(), &fInputEvent);
1262 fEventTree->SetBranchStatus(branchName.c_str(),
false);
1263 fEventBranchLoc = i;
1265 }
else if (i == branches->GetLast()) {
1266 RESTWarning <<
"REST Warning : (TRestRun) cannot find corresponding "
1267 "branch in event tree!"
1269 RESTWarning <<
"Event Type : " <<
event->ClassName() <<
RESTendl;
1270 RESTWarning <<
"Input event not set!" <<
RESTendl;
1274 fInputEvent = event;
1284 if (event !=
nullptr) {
1285 if (fEventTree !=
nullptr) {
1286 string eventName = (string)event->ClassName();
1287 string branchName = eventName +
"Branch";
1288 fEventTree->Branch(branchName.c_str(), event);
1289 fEventTree->SetTitle((eventName +
"Tree").c_str());
1300 const TString thisFile =
SearchFile(File.Data());
1301 if (thisFile ==
"") {
1302 RESTError <<
"(ImportMetadata): The file " << thisFile <<
" does not exist!" <<
RESTendl;
1307 RESTError <<
"(ImportMetadata) : The file " << thisFile <<
" is not root file!" <<
RESTendl;
1308 RESTError <<
"If you want to initialize metadata from rml file, use <TRest section!" <<
RESTendl;
1312 TFile* file = TFile::Open(thisFile);
1314 if (type ==
"" && name ==
"") {
1315 RESTError <<
"(ImportMetadata) : metadata type and name is not "
1323 meta = GetMetadata(name, file);
1324 }
else if (type !=
"") {
1325 meta = GetMetadataClass(type, file);
1328 if (meta ==
nullptr) {
1329 cout <<
"REST ERROR (ImportMetadata) : " << name <<
" does not exist." << endl;
1330 cout <<
"Inside root file : " << File << endl;
1342 fMetadata.push_back(meta);
1353Double_t TRestRun::GetRunLength()
const {
1355 cout <<
"Run time is not set\n";
1360Long64_t TRestRun::GetTotalBytes() {
1361 if (fFileProcess !=
nullptr) {
1367Long64_t TRestRun::GetEntries()
const {
1368 if (fAnalysisTree !=
nullptr) {
1369 return fAnalysisTree->GetEntries();
1371 return REST_MAXIMUM_EVENTS;
1375TRestEvent* TRestRun::GetEventWithID(Int_t eventID, Int_t subEventID,
const TString& tag) {
1376 if (fAnalysisTree !=
nullptr) {
1377 int nEntries = fAnalysisTree->GetEntries();
1380 fAnalysisTree->SetBranchStatus(
"*",
false);
1381 fAnalysisTree->SetBranchStatus(
"eventID",
true);
1382 fAnalysisTree->SetBranchStatus(
"subEventID",
true);
1383 fAnalysisTree->SetBranchStatus(
"subEventTag",
true);
1387 for (
int i = 0; i < nEntries; i++) {
1388 fAnalysisTree->GetEntry(i);
1389 if (fAnalysisTree->GetEventID() == eventID) {
1390 if (subEventID != -1 && fAnalysisTree->GetSubEventID() != subEventID)
continue;
1391 if (tag !=
"" && fAnalysisTree->GetSubEventTag() != tag)
continue;
1392 if (fEventTree !=
nullptr) fEventTree->GetEntry(i);
1393 fAnalysisTree->SetBranchStatus(
"*",
true);
1394 fAnalysisTree->GetEntry(i);
1400 fAnalysisTree->SetBranchStatus(
"*",
true);
1405std::vector<int> TRestRun::GetEventEntriesWithConditions(
const string& cuts,
int startingIndex,
1407 int max = maxNumber;
1408 if (max < 0) max = GetEntries();
1410 std::vector<int> eventIds;
1412 std::vector<string> observables;
1413 std::vector<string> operators;
1414 std::vector<Double_t> values;
1416 const std::vector<string> validOperators = {
"==",
"<=",
">=",
"=",
">",
"<"};
1418 vector<string> cutsVector =
Split(cuts,
"&&",
false,
true);
1420 for (
unsigned int i = 0; i < cutsVector.size(); i++) {
1421 string cut = cutsVector[i];
1422 for (
unsigned int j = 0; j < validOperators.size(); j++) {
1423 if (cut.find(validOperators[j]) != string::npos) {
1424 operators.push_back(validOperators[j]);
1425 observables.push_back((
string)cut.substr(0, cut.find(validOperators[j])));
1426 values.push_back(std::stod((
string)cut.substr(
1427 cut.find(validOperators[j]) + validOperators[j].length(), string::npos)));
1434 if (fAnalysisTree ==
nullptr) {
1437 Int_t nEntries = fAnalysisTree->GetEntries();
1438 auto branches = fAnalysisTree->GetListOfBranches();
1439 std::set<string> branchNames;
1440 for (
int i = 0; i < branches->GetEntries(); i++) {
1441 branchNames.insert((
string)branches->At(i)->GetName());
1444 for (
unsigned int i = 0; i < observables.size(); i++) {
1446 if (std::find(validOperators.begin(), validOperators.end(), operators[i]) == validOperators.end()) {
1448 cout <<
"invalid operation '" << operators[i] <<
"' for 'TRestRun::GetEventIdsWithConditions'"
1453 if (branchNames.count(observables[i]) == 0) {
1455 cout <<
"invalid observable '" << observables[i] <<
"' for 'TRestRun::GetEventIdsWithConditions'"
1457 cout <<
"valid branch names: ";
1458 for (
auto branchName : branchNames) {
1459 cout << branchName <<
" ";
1466 fAnalysisTree->SetBranchStatus(
"*",
false);
1467 for (
unsigned int i = 0; i < observables.size(); i++) {
1468 fAnalysisTree->SetBranchStatus(observables[i].c_str(),
true);
1471 Double_t valueToCompareFrom;
1472 bool comparisonResult;
1474 for (
int iNoOffset = 0; iNoOffset < nEntries; iNoOffset++) {
1475 i = (iNoOffset + startingIndex) % nEntries;
1476 fAnalysisTree->GetEntry(i);
1477 comparisonResult =
true;
1478 for (
unsigned int j = 0; j < observables.size(); j++) {
1480 if (operators[j] ==
"=" || operators[j] ==
"==") {
1481 comparisonResult = comparisonResult && (valueToCompareFrom == values[j]);
1482 }
else if (operators[j] ==
"<") {
1483 comparisonResult = comparisonResult && (valueToCompareFrom < values[j]);
1484 }
else if (operators[j] ==
"<=") {
1485 comparisonResult = comparisonResult && (valueToCompareFrom <= values[j]);
1486 }
else if (operators[j] ==
">") {
1487 comparisonResult = comparisonResult && (valueToCompareFrom > values[j]);
1488 }
else if (operators[j] ==
">=") {
1489 comparisonResult = comparisonResult && (valueToCompareFrom >= values[j]);
1493 if (comparisonResult) {
1494 if ((
int)eventIds.size() < max) {
1495 eventIds.push_back(i);
1502 fAnalysisTree->SetBranchStatus(
"*",
true);
1506std::vector<int> TRestRun::GetEventIdsWithConditions(
const string& cuts,
int startingIndex,
int maxNumber) {
1507 int max = maxNumber;
1508 if (max < 0) max = GetEntries();
1510 auto indices = GetEventEntriesWithConditions(cuts, startingIndex, max);
1511 std::vector<int> ids;
1512 for (
unsigned int i = 0; i < indices.size(); i++) {
1514 ids.push_back(fAnalysisTree->GetEventID());
1527 if (fEventIndexCounter >= GetEntries()) {
1528 fEventIndexCounter = 0;
1530 auto indices = GetEventEntriesWithConditions(cuts, fEventIndexCounter++, 1);
1531 if (indices.size() == 0) {
1535 fAnalysisTree->GetEntry(indices[0]);
1536 fEventTree->GetEntry(indices[0]);
1537 fCurrentEvent = indices[0];
1542string TRestRun::GetRunInformation(
const string& info) {
1559 result =
fHostmgr->GetProcessRunner()->GetProcInfo(info);
1568TRestMetadata* TRestRun::GetMetadataClass(
const TString& type, TFile* file) {
1569 if (file !=
nullptr) {
1570 TIter nextkey(file->GetListOfKeys());
1572 while ((key = (TKey*)nextkey())) {
1573 string kName = key->GetClassName();
1579 if (metadata !=
nullptr && metadata->InheritsFrom(
"TRestMetadata")) {
1582 RESTWarning <<
"TRestRun::GetMetadataClass() : The object to import is "
1583 "not inherited from TRestMetadata"
1589 for (
unsigned int i = 0; i < fMetadata.size(); i++)
1590 if (fMetadata[i]->InheritsFrom(type))
return fMetadata[i];
1593 return GetMetadataClass(type, fInputFile);
1600TRestMetadata* TRestRun::GetMetadata(
const TString& name, TFile* file) {
1601 if (file !=
nullptr) {
1602 TIter nextkey(file->GetListOfKeys());
1604 while ((key = (TKey*)nextkey())) {
1605 string kName = key->GetName();
1607 if (kName == name) {
1610 if (metadata->InheritsFrom(
"TRestMetadata")) {
1613 RESTWarning <<
"TRestRun::GetMetadata() : The object to import is not "
1614 "inherited from TRestMetadata"
1620 for (
unsigned int i = 0; i < fMetadata.size(); i++) {
1621 if (fMetadata[i]->GetName() == name) {
1622 return fMetadata[i];
1630std::vector<std::string> TRestRun::GetMetadataNames() {
1631 std::vector<std::string> strings;
1633 for (
int n = 0; n < GetNumberOfMetadata(); n++) strings.push_back(fMetadata[n]->GetName());
1638std::vector<std::string> TRestRun::GetMetadataTitles() {
1639 std::vector<std::string> strings;
1641 for (
int n = 0; n < GetNumberOfMetadata(); n++) strings.push_back(fMetadata[n]->GetTitle());
1653 if (instr.find(
"[", 0) == string::npos)
return instr;
1654 string outstring = instr;
1656 int startPosition = 0;
1657 int endPosition = 0;
1658 while ((startPosition = outstring.find(
"[", endPosition)) != (
int)string::npos) {
1659 endPosition = outstring.find(
"]", startPosition + 1);
1660 string s = outstring.substr(startPosition + 1, endPosition - startPosition - 1);
1661 int cont = count(s.begin(), s.end(),
'[') - count(s.begin(), s.end(),
']');
1663 if (cont < 0) RESTError <<
"This is a coding error at ReplaceMetadataMembers!" <<
RESTendl;
1667 endPosition = outstring.find(
"]", endPosition + 1);
1668 s = outstring.substr(startPosition + 1, endPosition - startPosition - 1);
1669 cont = count(s.begin(), s.end(),
'[') - count(s.begin(), s.end(),
']');
1670 if (endPosition == (
int)string::npos)
break;
1672 if (endPosition == (
int)string::npos)
break;
1674 string expressionToReplace = outstring.substr(startPosition + 1, endPosition - startPosition - 1);
1677 outstring.replace(startPosition, endPosition - startPosition + 1, value);
1681 outstring =
Replace(outstring,
"{{",
"[");
1682 outstring =
Replace(outstring,
"}}",
"]");
1704 if (instr.find(
"::") == string::npos && instr.find(
"->") == string::npos) {
1705 return "{{" + instr +
"}}";
1707 vector<string> results =
Split(instr,
"::",
false,
true);
1708 if (results.size() == 1) results =
Split(instr,
"->",
false,
true);
1710 if (results.size() == 2) {
1712 int pos1 = results[1].find(
"[", 0);
1713 int pos2 = results[1].find(
"]", pos1);
1714 if (pos1 > 0 && pos2 > 0) {
1715 string indexStr = results[1].substr(pos1 + 1, pos2 - pos1 - 1);
1718 if (index < 0) index = 0;
1720 results[1] = results[1].substr(0, pos1);
1723 if (GetMetadata(results[0])) {
1724 if (index >= this->GetMetadata(results[0])->
GetDataMemberValues(results[1], precision).size()) {
1725 RESTWarning <<
"TRestRun::ReplaceMetadataMember. Index out of range!" <<
RESTendl;
1726 RESTWarning <<
"Returning the first element" <<
RESTendl;
1732 if (GetMetadataClass(results[0])) {
1735 RESTWarning <<
"TRestRun::ReplaceMetadataMember. Index out of range!" <<
RESTendl;
1736 RESTWarning <<
"Returning the first element" <<
RESTendl;
1739 return this->GetMetadataClass(results[0])->
GetDataMemberValues(results[1], precision)[index];
1743 RESTError <<
"TRestRun::ReplaceMetadataMember. Wrong number of elements found" <<
RESTendl;
1745 RESTWarning <<
"TRestRun::ReplaceMetadataMember. " << instr <<
" not found!" <<
RESTendl;
1769 if (instr ==
"")
return true;
1771 std::vector<string> oper = {
"=",
"==",
"<=",
"<",
">=",
">",
"!="};
1774 std::vector<string> results;
1775 for (
unsigned int n = 0; n < oper.size(); n++) {
1777 if (instr.find(
"->") != string::npos) pos = instr.find(
"->") + 2;
1779 if (instr.find(oper[n], pos) != string::npos) {
1781 results =
Split(instr, oper[n],
false,
true, pos);
1787 RESTWarning <<
"TRestRun::EvaluateMetadataMember. Not valid operator found in expression : " << instr
1792 if (results.size() != 2) {
1793 RESTWarning <<
"TRestRun::EvaluateMetadataMember. Not valid expression : " << instr <<
RESTendl;
1807 if (expOp ==
"=" && lvalue == rvalue)
return true;
1808 if (expOp ==
"==" && lvalue == rvalue)
return true;
1809 if (expOp ==
"<=" && lvalue <= rvalue)
return true;
1810 if (expOp ==
"<" && lvalue < rvalue)
return true;
1811 if (expOp ==
">=" && lvalue >= rvalue)
return true;
1812 if (expOp ==
">" && lvalue > rvalue)
return true;
1813 if (expOp ==
"!=" && lvalue != rvalue)
return true;
1826 RESTMetadata <<
"Parent run number : " << GetParentRunNumber() <<
RESTendl;
1827 RESTMetadata <<
"Run number : " << GetRunNumber() <<
RESTendl;
1828 RESTMetadata <<
"Experiment/project : " << GetExperimentName() <<
RESTendl;
1829 RESTMetadata <<
"Run type : " << GetRunType() <<
RESTendl;
1830 RESTMetadata <<
"Run tag : " << GetRunTag() <<
RESTendl;
1831 RESTMetadata <<
"Run user : " << GetRunUser() <<
RESTendl;
1832 RESTMetadata <<
"Run description : " << GetRunDescription() <<
RESTendl;
1833 RESTMetadata <<
"Start Date/Time : " <<
ToDateTimeString(GetStartTimestamp()) <<
" ("
1834 << GetStartTimestamp() <<
")" <<
RESTendl;
1835 RESTMetadata <<
"End Date/Time : " <<
ToDateTimeString(GetEndTimestamp()) <<
" (" << GetEndTimestamp()
1840 if (fInputFile !=
nullptr) {
1841 RESTMetadata <<
"Data file : " << fInputFile->GetName();
1842 if (fNFilesSplit > 0) {
1843 RESTMetadata <<
" (Splitted into " << fNFilesSplit + 1 <<
" files)" <<
RESTendl;
1848 RESTMetadata <<
"Number of events : " << fEntriesSaved <<
RESTendl;
1853 RESTMetadata <<
"---------------------------------------" <<
RESTendl;
1863 cout <<
"------------------------" << endl;
1864 cout <<
"---- Run start date ----" << endl;
1865 cout <<
"------------------------" << endl;
1866 cout <<
"Unix time : " <<
fStartTime << endl;
1868 struct tm* tm = localtime(&tt);
1871 strftime(date,
sizeof(date),
"%Y-%m-%d", tm);
1872 cout <<
"Date : " << date << endl;
1875 strftime(time,
sizeof(time),
"%H:%M:%S", tm);
1876 cout <<
"Time : " << time << endl;
1877 cout <<
"++++++++++++++++++++++++" << endl;
1880void TRestRun::PrintEndDate() {
1881 cout <<
"----------------------" << endl;
1882 cout <<
"---- Run end date ----" << endl;
1883 cout <<
"----------------------" << endl;
1884 cout <<
"Unix time : " <<
fEndTime << endl;
1886 struct tm* tm = localtime(&tt);
1889 strftime(date,
sizeof(date),
"%Y-%m-%d", tm);
1890 cout <<
"Date : " << date << endl;
1893 strftime(time,
sizeof(time),
"%H:%M:%S", tm);
1894 cout <<
"Time : " << time << endl;
1895 cout <<
"++++++++++++++++++++++++" << endl;
1904 for (
unsigned int n = 0; n < fMetadata.size(); n++)
1905 if (fMetadata[n]->
GetError()) nErrors++;
1909 RESTError <<
"Found a total of " << nErrors <<
" metadata errors" <<
RESTendl;
1910 for (
unsigned int n = 0; n < fMetadata.size(); n++)
1913 RESTError <<
"Class: " << fMetadata[n]->ClassName() <<
" Name: " << fMetadata[n]->GetName()
1915 RESTError <<
"Number of errors: " << fMetadata[n]->GetNumberOfErrors() <<
RESTendl;
1916 RESTError <<
"Message: " << fMetadata[n]->GetErrorMessage() <<
RESTendl;
1920 cout <<
"No errors found!" << endl;
1929 Int_t nWarnings = 0;
1930 for (
unsigned int n = 0; n < fMetadata.size(); n++)
1935 RESTWarning <<
"Found a total of " << nWarnings <<
" metadata warnings" <<
RESTendl;
1936 for (
unsigned int n = 0; n < fMetadata.size(); n++)
1939 RESTWarning <<
"Class: " << fMetadata[n]->ClassName() <<
" Name: " << fMetadata[n]->GetName()
1941 RESTWarning <<
"Number of warnings: " << fMetadata[n]->GetNumberOfWarnings() <<
RESTendl;
1942 RESTWarning <<
"Message: " << fMetadata[n]->GetWarningMessage() <<
RESTendl;
1946 cout <<
"No warnings found!" << endl;
void ParseString(std::string str)
Set the value of the wrapped object from std::string.
TRestReflector GetDataMember(std::string name)
Find the class's datamember as TRestReflector object, including those from base class.
bool IsZombie()
If this object type wrapper is invalid.
REST core data-saving helper based on TTree.
Bool_t AddChainFile(const std::string &file)
Add a series output file like TChain.
TTree * GetTree() const
Overrides TTree::GetTree(), to get the actual tree used in case of chain operation(fCurrentTree !...
Double_t GetDblObservableValue(const std::string &obsName)
Get double value of the observable, according to the name.
void SetObservable(Int_t id, RESTValue obs)
Set the value of observable whose id is as specified.
virtual std::vector< int > search_run_with_file(std::string filepattern)
search runs according to the file name. return a list of run numbers
virtual int get_lastrun()
get the latest run id in database
virtual int set_run(DBEntry info, bool overwrite=true)
add/update a run, with run info as struct DBEntry. returns the added run id
virtual int set_runfile(int runnumber, std::string filename)
add/update a runfile to the specified run
virtual DBEntry query_run(int runnumber)
virtual std::vector< DBFile > query_run_files(int runnumber)
return all the files of the run
A base class for any REST event process.
virtual void EndOfEventProcess(TRestEvent *inputEvent=nullptr)
End of event process. Nothing to do. Called directly after ProcessEvent()
void SetAnalysisTree(TRestAnalysisTree *tree)
Set analysis tree of this process, then add observables to it.
virtual Long64_t GetTotalBytes() const
virtual void BeginOfEventProcess(TRestEvent *inputEvent=nullptr)
Begin of event process, preparation work. Called right before ProcessEvent()
virtual TRestEvent * ProcessEvent(TRestEvent *inputEvent)=0
Process one event.
virtual RESTValue GetOutputEvent() const =0
Get pointer to output event. Must be implemented in the derived class.
virtual void InitProcess()
To be executed at the beginning of the run (outside event loop)
virtual Long64_t GetTotalBytesRead() const
Interface to external file reading, get the read bytes. To be implemented in external processes.
A base class for any REST event.
virtual void InitializeReferences(TRestRun *run)
Initialize dynamical references when loading the event from a root file.
virtual void CloneTo(TRestEvent *target)
Clone the content of this TRestEvent object to another.
virtual void Initialize()=0
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 ResetEntry()
Reset file reading progress.
Int_t fParentRunNumber
It can be used as parent number of subrun number.
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.
TClass * GetClassQuick(std::string type)
TRestReflector Assembly(std::string typeName)
Assembly an object of type: typeName, returning the allocated memory address and size.
Int_t GetChar(std::string hint="Press a KEY to continue ...")
Helps to pause the program, printing a message before pausing.
std::vector< std::string > Split(std::string in, std::string separator, bool allowBlankString=false, bool removeWhiteSpaces=false, int startPos=-1)
Split the input string according to the given separator. Returning a vector of fragments.
Double_t StringToDouble(std::string in)
Gets a double from a string.
std::string ToUpper(std::string in)
Convert string to its upper case. Alternative of TString::ToUpper.
Int_t StringToInteger(std::string in)
Gets an integer from a string.
Int_t Count(std::string s, std::string sbstring)
Counts the number of occurences of substring inside the input string in.
std::string ParameterNameToDataMemberName(std::string name)
Convert parameter name to datamember name, following REST parameter naming convention.
std::string DataMemberNameToParameterName(std::string name)
Convert data member name to parameter name, following REST parameter naming convention.
Int_t isANumber(std::string in)
Returns 1 only if a valid number is found in the string in. If not it returns 0.
std::string RemoveWhiteSpaces(std::string in)
Returns the input string removing all white spaces.
std::string ToDateTimeString(time_t time)
Format time_t into string.
std::string Replace(std::string in, std::string thisString, std::string byThisString, size_t fromPosition=0, Int_t N=0)
Replace every occurences of thisSring by byThisString inside string in.
std::string ReplaceMathematicalExpressions(std::string buffer, Int_t precision=0, std::string errorMessage="")
Evaluates and replaces valid mathematical expressions found in the input string buffer.