diff --git a/CMakeLists.txt b/CMakeLists.txt index b2d88ea0..690dd280 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ # - musrfit cmake_minimum_required(VERSION 3.17) -project(musrfit VERSION 1.9.0 LANGUAGES C CXX) +project(musrfit VERSION 1.9.1 LANGUAGES C CXX) #--- musrfit specific options ------------------------------------------------- option(nexus "build optional NeXus support. Needed for ISIS" OFF) diff --git a/ChangeLog b/ChangeLog index d11566b0..8af8b86b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,13 @@ or https://bitbucket.org/muonspin/musrfit/commits/all +Release of V1.9.1, 2023/05/16 +============================= + +add option [-c, --count] to dump_header which will dump the number of counts +per detector and the total number of counts. Currently for MusrRoot data format +only. For the other data formats it will be implement asap + Release of V1.9.0, 2023/02/17 ============================= diff --git a/src/dump_header.cpp b/src/dump_header.cpp index dd38c74d..960c6a65 100644 --- a/src/dump_header.cpp +++ b/src/dump_header.cpp @@ -52,6 +52,8 @@ #include #include #include +#include +#include #ifdef HAVE_GIT_REV_H #include "git-revision.h" @@ -78,7 +80,8 @@ void dump_header_syntax() { std::cout << std::endl << "usage: dump_header [-rn | -fn ] [-ff, --fileFormat ]"; - std::cout << std::endl << " [-y, --year ] [-s, --summary] [--psi-bulk ] |"; + std::cout << std::endl << " [-y, --year ] [-s, --summary] [-i, --instrument ]"; + std::cout << std::endl << " [-c, --counts] | "; std::cout << std::endl << " --help | --version"; std::cout << std::endl; std::cout << std::endl << " Dumps the header information of a given muSR data file onto the standard output."; @@ -97,6 +100,7 @@ void dump_header_syntax() std::cout << std::endl << " to the header information, print the summary file content."; std::cout << std::endl << " -i, --instrument : where is the requested instrument:"; std::cout << std::endl << " lem (default) | gps | ltf | dolly | gpd | hifi."; + std::cout << std::endl << " -c, --counts : will show detector counts as well."; std::cout << std::endl << " -h, --help : will show this help"; std::cout << std::endl << " -v, --version : will show the current version."; std::cout << std::endl << std::endl; @@ -108,10 +112,11 @@ void dump_header_syntax() * * @param fileName file name of the ROOT file * @param summary bool, if true dump the summary + * @param counts bool, if true dump detector counts * * @return 0 on success, otherwise 1. */ -int dump_header_root(const std::string fileName, const bool summary) +int dump_header_root(const std::string fileName, const bool summary, const bool counts) { TFile f(fileName.c_str()); if (f.IsZombie()) { @@ -122,6 +127,8 @@ int dump_header_root(const std::string fileName, const bool summary) } UInt_t fileType = DH_MUSR_ROOT; + UInt_t noOfHistos{0}; + PIntVector redGreenOffset; TFolder *folder; f.GetObject("RunInfo", folder); // try first LEM-ROOT style file (used until 2011). @@ -208,6 +215,18 @@ int dump_header_root(const std::string fileName, const bool summary) header->DumpHeader(); + if (counts) { + bool ok; + Int_t ival; + PIntVector ivec; + header->Get("RunInfo/No of Histos", ival, ok); + if (ok) + noOfHistos = ival; + header->Get("RunInfo/RedGreen Offsets", ivec, ok); + if (ok) + redGreenOffset = ivec; + } + delete header; } @@ -232,6 +251,38 @@ int dump_header_root(const std::string fileName, const bool summary) } } + // detector counts as well? + if (counts && (fileType == DH_MUSR_ROOT)) { + // dump the detector counts + std::cout << "Detector counts" << std::endl; + f.GetObject("histos", folder); + if (folder != nullptr) { + char detectorLabel[64]; + TH1F *histo{nullptr}; + UInt_t total{0}; + for (UInt_t i=0; iFindObjectAny(detectorLabel); + if (histo != nullptr) { + std::cout << " " << histo->GetTitle() << ":\t " << histo->GetEntries() << std::endl; + total += histo->GetEntries(); + } + } + if (i % 2 == 0) + std::cout << " total counts of group " << i+1 << ":\t\t\t " << total << std::endl; + else + std::cout << " total counts of group " << i+1 << ":\t\t\t\t\t " << total << std::endl; + } + } else { + std::cout << "Sorry, no histos folder found" << std::endl; + f.Close(); + return 0; + } + } + f.Close(); return 0; @@ -242,10 +293,11 @@ int dump_header_root(const std::string fileName, const bool summary) *

dumps the header information of a NeXus file. * * @param fileName file name of the NeXus file. + * @param counts bool, if true dump detector counts * * @return 0 on success, 1 otherwise */ -int dump_header_nexus(const std::string fileName) { +int dump_header_nexus(const std::string fileName, const bool counts) { #ifdef PNEXUS_ENABLED PNeXus *nxs_file = new PNeXus(fileName.c_str()); @@ -258,7 +310,7 @@ int dump_header_nexus(const std::string fileName) { } if (nxs_file->IsValid(false)) { - nxs_file->Dump(); + nxs_file->Dump(counts); } else { std::cerr << std::endl; std::cerr << "**ERROR** found invalid NeXus file." << std::endl; @@ -344,10 +396,11 @@ std::vector dump_header_instrument_info(std::string fileName) * * @param fileName file name of the PSI-BIN * @param fileFormat either PSI-BIN or PSI-MDU + * @param counts bool, if true dump detector counts * * @return 0 on success, 1 otherwise */ -int dump_header_psi_bin(const std::string fileName, const std::string fileFormat) +int dump_header_psi_bin(const std::string fileName, const std::string fileFormat, const bool counts) { MuSR_td_PSI_bin psiBin; int status; @@ -439,7 +492,8 @@ int dump_header_psi_bin(const std::string fileName, const std::string fileFormat std::cout << std::endl << "Time Zero Bin : " << psiBin.GetT0Int(i); std::cout << std::endl << "First Good Bin : " << psiBin.GetFirstGoodInt(i); std::cout << std::endl << "Last Good Bin : " << psiBin.GetLastGoodInt(i); - std::cout << std::endl << "No of Events : " << psiBin.GetEventsHistoLong(i); + if (counts) + std::cout << std::endl << "No of Events : " << psiBin.GetEventsHistoLong(i); } std::cout << std::endl << "-------------------" << std::endl << std::endl; @@ -450,10 +504,11 @@ int dump_header_psi_bin(const std::string fileName, const std::string fileFormat /** *

dump the header information of a MUD file. * @param fileName file name of the MUD file + * @param counts bool, if true dump detector counts * * @return 0 on success, 1 otherwise */ -int dump_header_mud(const std::string fileName) +int dump_header_mud(const std::string fileName, const bool counts) { int fh; UINT32 type, val; @@ -618,6 +673,12 @@ int dump_header_mud(const std::string fileName) std::cout << std::endl << "Last Good Bin : " << val; else std::cout << std::endl << "Last Good Bin : ???"; + if (counts) { + success = MUD_getHistNumEvents( fh, i+1, &val ); + if (success) { + std::cout << std::endl << "#Events : " << val; + } + } } std::cout << std::endl << "-------------------" << std::endl << std::endl; @@ -723,6 +784,7 @@ int main(int argc, char *argv[]) std::string year(""); std::string instrument("lem"); bool summary(false); + bool counts(false); for (int i=1; i= argc) { std::cerr << std::endl << "**ERROR** found option --instrument without input!" << std::endl; @@ -929,17 +993,17 @@ int main(int argc, char *argv[]) boost::to_lower(fileFormat); if (boost::iequals(fileFormat, "MusrRoot") || boost::iequals(fileFormat, "ROOT")) { - dump_header_root(pathFln, summary); + dump_header_root(pathFln, summary, counts); } else if (boost::iequals(fileFormat, "NeXus")) { #ifdef PNEXUS_ENABLED - dump_header_nexus(pathFln); + dump_header_nexus(pathFln, counts); #else std::cout << std::endl << "Sorry, NeXus is not enabled, hence I cannot help you." << std::endl; #endif } else if (boost::iequals(fileFormat, "PSI-BIN") || boost::iequals(fileFormat, "PSI-MDU")) { - dump_header_psi_bin(pathFln, fileFormat); + dump_header_psi_bin(pathFln, fileFormat, counts); } else if (boost::iequals(fileFormat, "MUD")) { - dump_header_mud(pathFln); + dump_header_mud(pathFln, counts); } else if (boost::iequals(fileFormat, "WKM")) { dump_header_wkm(pathFln); } diff --git a/src/external/nexus/PNeXus.cpp b/src/external/nexus/PNeXus.cpp index 02dd709b..54c74e2c 100644 --- a/src/external/nexus/PNeXus.cpp +++ b/src/external/nexus/PNeXus.cpp @@ -635,6 +635,21 @@ unsigned int PNeXusData1::GetHistoLength(unsigned int histoNo) return fHisto[histoNo].size(); } +//------------------------------------------------------------------------------------------ +// GetHistoLength (public) +//------------------------------------------------------------------------------------------ +unsigned int PNeXusData1::GetHistoCounts(unsigned int histoNo) +{ + if (histoNo >= fHisto.size()) + return 0; + + unsigned int counts=0; + for (unsigned int i=0; iGet number of counts in a given histogram histoNo + * + * \param idx_p period index + * \param idx_s spectrum index + * + * \return the number of entries in the selected histogram histoNo, or 0 if the histoNo is out of scope. + */ +unsigned int PNeXusDetector2::GetHistoCounts(int idx_p, int idx_s) +{ + unsigned counts = 0; + + if (idx_p > 0) + if (idx_p > fNoOfPeriods) + return counts; + + if (idx_s > 0) + if (idx_s > fNoOfSpectra) + return counts; + + for (int i=0; iWrite the content of the NeXus file to stdout. Used for debugging purposes. * + * \param counts flag, if true, also dump the counts for all the histograms */ -void PNeXus::Dump() +void PNeXus::Dump(const bool counts) { double dval; std::string str; @@ -2259,6 +2305,8 @@ void PNeXus::Dump() std::cout << fNxEntry1->GetData()->GetHisto(i)->at(j) << ", "; } std::cout << "..."; + if (counts) + std::cout << " total no of entries: " << fNxEntry1->GetData()->GetHistoCounts(i); } } if (fNxEntry1->GetData()->GetAlpha()->size() == 0) { @@ -2408,6 +2456,8 @@ void PNeXus::Dump() std::cout << fNxEntry2->GetInstrument()->GetDetector()->GetHistoValue(i,j,k) << ", "; } std::cout << "..."; + if (counts) + std::cout << " total number of entries: " << fNxEntry2->GetInstrument()->GetDetector()->GetHistoCounts(i,j); } } } else { @@ -2421,6 +2471,8 @@ void PNeXus::Dump() std::cout << fNxEntry2->GetInstrument()->GetDetector()->GetHistoValue(0,j,k) << ", "; } std::cout << "..."; + if (counts) + std::cout << " total number of entries: " << fNxEntry2->GetInstrument()->GetDetector()->GetHistoCounts(0,j); } } else { // counts[ntc] std::cout << std::endl << " (#bins=" << fNxEntry2->GetInstrument()->GetDetector()->GetNoOfBins() << ")"; @@ -2431,6 +2483,8 @@ void PNeXus::Dump() std::cout << fNxEntry2->GetInstrument()->GetDetector()->GetHistoValue(0,0,k) << ", "; } std::cout << "..."; + if (counts) + std::cout << " total number of entries: " << fNxEntry2->GetInstrument()->GetDetector()->GetHistoCounts(0,0); } } std::cout << std::endl << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"; diff --git a/src/external/nexus/PNeXus.h b/src/external/nexus/PNeXus.h index 704a4864..6dc48083 100644 --- a/src/external/nexus/PNeXus.h +++ b/src/external/nexus/PNeXus.h @@ -254,6 +254,7 @@ class PNeXusData1 { virtual void GetHistoName(unsigned int idx, std::string &name, bool &ok); virtual unsigned int GetNoOfHistos() { return fHisto.size(); } virtual unsigned int GetHistoLength(unsigned int histoNo=0); + virtual unsigned int GetHistoCounts(unsigned int histoNo=0); virtual std::vector *GetHisto(unsigned int histoNo); virtual std::vector *GetGrouping() { return &fGrouping; } virtual std::vector *GetAlpha() { return &fAlpha; } @@ -399,6 +400,7 @@ class PNeXusDetector2 { virtual int GetNoOfPeriods() { return fNoOfPeriods; } virtual int GetNoOfSpectra() { return fNoOfSpectra; } virtual int GetNoOfBins() { return fNoOfBins; } + virtual unsigned int GetHistoCounts(int idx_p, int idx_s); virtual int GetHistoValue(int idx_p, int idx_s, int idx_b); virtual int* GetHistos() { return fHisto; } virtual unsigned int GetSpectrumIndexSize() { return fSpectrumIndex.size(); } @@ -586,7 +588,7 @@ class PNeXus { virtual void SetCreator(std::string str) { fCreator = str; } - virtual void Dump(); + virtual void Dump(const bool counts); private: bool fValid; diff --git a/src/musredit_qt5/musredit/PTextEdit.cpp b/src/musredit_qt5/musredit/PTextEdit.cpp index 016cc7f3..d768f531 100644 --- a/src/musredit_qt5/musredit/PTextEdit.cpp +++ b/src/musredit_qt5/musredit/PTextEdit.cpp @@ -2949,6 +2949,7 @@ void PTextEdit::musrDump() cmd.append(str); cmd.append("-fn"); cmd.append(fileName); + cmd.append("-c"); PDumpOutputHandler dumpOutputHandler(cmd); dumpOutputHandler.setModal(false); diff --git a/src/musredit_qt6/musredit/PTextEdit.cpp b/src/musredit_qt6/musredit/PTextEdit.cpp index df8c8efe..c590c7cb 100644 --- a/src/musredit_qt6/musredit/PTextEdit.cpp +++ b/src/musredit_qt6/musredit/PTextEdit.cpp @@ -2934,6 +2934,7 @@ void PTextEdit::musrDump() cmd.append(str); cmd.append("-fn"); cmd.append(fileName); + cmd.append("-c"); PDumpOutputHandler dumpOutputHandler(cmd); dumpOutputHandler.setModal(false);