From 10117abeff3127a4d19f21962a099413f770ab50 Mon Sep 17 00:00:00 2001 From: Andreas Suter Date: Tue, 30 Sep 2025 12:30:45 +0200 Subject: [PATCH] dump_header can now handle TMusrRoot with TFolder as well as TDirectory. --- src/dump_header.cpp | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/src/dump_header.cpp b/src/dump_header.cpp index 8e1747426..bc606d66f 100644 --- a/src/dump_header.cpp +++ b/src/dump_header.cpp @@ -71,8 +71,9 @@ #include "PNeXus.h" #endif -#define DH_MUSR_ROOT 0 -#define DH_LEM_ROOT 1 +#define DH_MUSR_ROOT 0 +#define DH_MUSR_ROOT_DIR 1 +#define DH_LEM_ROOT 2 //------------------------------------------------------------------------ /** @@ -131,16 +132,24 @@ int dump_header_root(const std::string fileName, const bool summary, const bool UInt_t noOfHistos{0}; PIntVector redGreenOffset; + 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) { std::cerr << std::endl << "**ERROR** Couldn't neither obtain RunInfo (LEM), nor RunHeader (MusrRoot) from " << fileName << std::endl; f.Close(); return 1; - } else { + } + if (!strcmp(obj->ClassName(), "TFolder")) { fileType = DH_MUSR_ROOT; + } else if (!strcmp(obj->ClassName(), "TDirectoryFile")) { + fileType = DH_MUSR_ROOT_DIR; + } else { + std::cerr << std::endl << "**ERROR** RunHeader (MusrRoot) from '" << fileName << "' is neither a TFolder nor a TDirectory. Found: '" << obj->ClassName() << "'" << std::endl; + f.Close(); + return 1; } } else { fileType = DH_LEM_ROOT; @@ -202,12 +211,26 @@ int dump_header_root(const std::string fileName, const bool summary, const bool // invoke the MusrRoot header object header = std::make_unique(fileName.c_str(), true); // read quite - // try to populate the MusrRoot header object - if (!header->ExtractAll(folder)) { - std::cerr << std::endl << "**ERROR** Couldn't invoke MusrRoot RunHeader in file:" << fileName; - std::cerr << std::endl; - f.Close(); - return 1; + // check if TFolder or TDirectory is needed + if (fileType == DH_MUSR_ROOT) { // TFolder + f.GetObject("RunHeader", folder); + // try to populate the MusrRoot header object + if (!header->ExtractAll(folder)) { + std::cerr << std::endl << "**ERROR** Couldn't invoke MusrRoot RunHeader in file:" << fileName; + std::cerr << std::endl; + f.Close(); + return 1; + } + } else { // TDirectory + TDirectoryFile *runHeader = nullptr; + f.GetObject("RunHeader", runHeader); + // try to populate the MusrRoot header object + if (!header->ExtractAll(runHeader)) { + std::cerr << std::endl << "**ERROR** Couldn't invoke MusrRoot RunHeader in file:" << fileName; + std::cerr << std::endl; + f.Close(); + return 1; + } } header->DumpHeader();