diff --git a/src/classes/PRunDataHandler.cpp b/src/classes/PRunDataHandler.cpp index 436668441..6f0736b74 100644 --- a/src/classes/PRunDataHandler.cpp +++ b/src/classes/PRunDataHandler.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include "TMusrRunHeader.h" #include "TLemRunHeader.h" @@ -64,8 +65,9 @@ #include "PRunDataHandler.h" -#define PRH_MUSR_ROOT 0 -#define PRH_LEM_ROOT 1 +#define PRH_MUSR_ROOT 0 +#define PRH_MUSR_ROOT_DIR 1 +#define PRH_LEM_ROOT 2 #define PRH_NPP_OFFSET 0 #define PRH_PPC_OFFSET 20 @@ -1433,14 +1435,21 @@ Bool_t PRunDataHandler::ReadRootFile() TFolder *folder; f.GetObject("RunInfo", folder); // try first LEM-ROOT style file (used until 2011). if (!folder) { // either something is wrong, or it is a MusrRoot file - f.GetObject("RunHeader", folder); - if (!folder) { // something is wrong!! + TObject *obj = f.FindObjectAny("RunHeader"); + if (obj == nullptr) { // something is wrong!! std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't neither obtain RunInfo (LEM),"; std::cerr << std::endl << " nor RunHeader (MusrRoot) from " << fRunPathName.Data() << std::endl; f.Close(); return false; - } else { + } + if (!strcmp(obj->ClassName(), "TFolder")) fileType = PRH_MUSR_ROOT; + else if (!strcmp(obj->ClassName(), "TDirectoryFile")) + fileType = PRH_MUSR_ROOT_DIR; + else { + std::cerr << std::endl << "PRunDataHandler::ReadRootFile: **ERROR** RunHeader (MusrRoot) from '" << fRunPathName.Data() << "' is neither a TFolder nor a TDirectory. Found: '" << obj->ClassName() << "'" << std::endl; + f.Close(); + return false; } } else { fileType = PRH_LEM_ROOT; @@ -1722,12 +1731,28 @@ Bool_t PRunDataHandler::ReadRootFile() return false; } - // try to populate the MusrRoot header object - if (!header->ExtractAll(folder)) { - std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader in file:" << fRunPathName; - std::cerr << std::endl; - f.Close(); - return false; + // check if TFolder or TDirectory is needed + if (fileType == PRH_MUSR_ROOT) { // TFolder + f.GetObject("RunHeader", folder); + + // try to populate the MusrRoot header object + if (!header->ExtractAll(folder)) { + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader (TFolder) in file:" << fRunPathName; + std::cerr << std::endl; + f.Close(); + return false; + } + } else { // TDirectory + TDirectoryFile *runHeader = nullptr; + f.GetObject("RunHeader", runHeader); + + // try to populate the MusrRoot header object + if (!header->ExtractAll(runHeader)) { + std::cerr << std::endl << ">> PRunDataHandler::ReadRootFile: **ERROR** Couldn't invoke MusrRoot RunHeader (TDirectoryFile) in file:" << fRunPathName; + std::cerr << std::endl; + f.Close(); + return false; + } } // get all the header information