33 static T*
Get(
bool verbose =
false)
38 if((gDirectory->GetFile()) !=
nullptr) {
39 TList* list = gDirectory->GetFile()->GetListOfKeys();
41 if(verbose) { std::cout <<
"Reading " << T::Class()->GetName() << R
"( from file ")" << CYAN << gDirectory->GetFile()->GetName() << RESET_COLOR << R"(")" << std::endl; }
42 while(TKey* key =
static_cast<TKey*
>(iter.Next())) {
43 if(strcmp(key->GetClassName(), T::Class()->GetName()) != 0) {
48 Set(
static_cast<T*
>(key->ReadObj()));
53 std::cout <<
"Not reading " << T::Class()->GetName() <<
" from file!" << std::endl;
58 if(verbose) { std::cout <<
"Created new singleton of class " << T::Class()->GetName() << std::endl; }
61 std::cout <<
"Re-using old singleton of class " << T::Class()->GetName() << std::endl;
71 std::string fileName =
fDir->GetName();
75 if(fileName.length() < 9) {
78 size_t underscore = fileName.find_last_of(
'_');
79 size_t dot = fileName.find_last_of(
'.');
82 if(dot != fileName.length() - 5 || underscore != dot - 4) {
85 filebase = fileName.substr(0, underscore - 5);
86 int runNumber = atoi(fileName.substr(underscore - 5).c_str());
87 int subrunNumber = atoi(fileName.substr(dot - 3).c_str());
88 if(runNumber > 0 || subrunNumber > 0) {
89 TFile* prevSubRun =
nullptr;
90 if(subrunNumber > 0) {
91 prevSubRun =
new TFile(Form(
"%s%05d_%03d.root", filebase.c_str(), runNumber, subrunNumber - 1));
95 prevSubRun =
new TFile(Form(
"%s%05d_%03d.root", filebase.c_str(), runNumber - 1, subrun++));
96 TFile* tmpFile =
nullptr;
97 while(prevSubRun !=
nullptr && prevSubRun->IsOpen()) {
98 if(tmpFile !=
nullptr) {
100 tmpFile = prevSubRun;
102 prevSubRun =
new TFile(Form(
"%s%05d_%03d.root", filebase.c_str(), runNumber - 1, subrun++));
106 prevSubRun = tmpFile;
108 if(prevSubRun !=
nullptr && prevSubRun->IsOpen()) {
109 T* prevSingleton =
static_cast<T*
>(prevSubRun->Get(
fSingleton->GetName()));
110 if(prevSingleton !=
nullptr) {
112 std::cout <<
"Found previous " <<
fSingleton->GetName() <<
" data from " << prevSubRun->GetName() << std::endl;
114 std::cout <<
"Failed to find previous " <<
fSingleton->GetName() <<
" data from " << prevSubRun->GetName() << std::endl;
116 prevSingleton =
static_cast<T*
>(prevSubRun->Get(&(
fSingleton->GetName()[1])));
117 if(prevSingleton !=
nullptr) {
119 std::cout <<
"Found previous " << &(
fSingleton->GetName()[1]) <<
" data from " << prevSubRun->GetName() << std::endl;
121 std::cout <<
"Failed to find previous " << &(
fSingleton->GetName()[1]) <<
" data from " << prevSubRun->GetName() << std::endl;
127 std::cout <<
"Failed to find previous file " << prevSubRun->GetName() <<
" not adding data to " <<
fSingleton->GetName() << std::endl;