30#ifndef _PRUNDATAHANDLER_H_
31#define _PRUNDATAHANDLER_H_
57#define A2M_UNDEFINED 0
61#define A2M_MUSR_ROOT 2
63#define A2M_MUSR_ROOT_DIR 3
359 virtual Bool_t
WriteData(TString fileName=
"");
430 virtual void Init(
const Int_t tag=0);
434 virtual void TestFileName(TString &runName,
const TString &ext);
436 virtual Bool_t
FileExistsCheck(
const Bool_t fileName,
const Int_t idx);
460 virtual Double_t
ToDouble(TString &str, Bool_t &ok);
461 virtual Int_t
ToInt(TString &str, Bool_t &ok);
465 virtual TString
GetFileName(
const TString extension, Bool_t &ok);
466 virtual TString
FileNameFromTemplate(TString &fileNameTemplate, Int_t run, TString &year, Bool_t &ok);
467 virtual bool DateToISO8601(std::string inDate, std::string &iso8601Date);
468 virtual void SplitTimeDate(TString timeDate, TString &time, TString &date, Bool_t &ok);
469 virtual TString
GetMonth(Int_t month);
470 virtual TString
GetYear(Int_t month);
498 Double_t dval, factor;
505 if (nxs_file->HasDataset(
"/run/lab"))
506 sstr = nxs_file->template GetDataset<std::string>(
"/run/lab").GetData()[0];
511 if (nxs_file->HasDataset(
"/run/beamline"))
512 sstr = nxs_file->template GetDataset<std::string>(
"/run/beamline").GetData()[0];
517 if (nxs_file->HasDataset(
"/run/instrument/name"))
518 sstr = nxs_file->template GetDataset<std::string>(
"/run/instrument/name").GetData()[0];
523 if (nxs_file->HasDataset(
"/run/title"))
524 sstr = nxs_file->template GetDataset<std::string>(
"/run/title").GetData()[0];
529 if (nxs_file->HasDataset(
"/run/number"))
530 ival = nxs_file->template GetDataset<int>(
"/run/number").GetData()[0];
536 if (nxs_file->HasDataset(
"/run/sample/temperature")) {
537 auto tmp_ds = nxs_file->template GetDataset<float>(
"/run/sample/temperature");
538 dval = tmp_ds.GetData()[0];
539 if (tmp_ds.HasAttribute(
"units")) {
541 sstr = std::any_cast<std::string>(tmp_ds.GetAttribute(
"units"));
542 }
catch (
const std::bad_any_cast&) {
543 std::cerr << std::endl <<
"**WARNING** ReadNexusFileIdf1: temperature 'units' attribute has unexpected type." << std::endl;
546 if (sstr ==
"Celcius")
555 if (nxs_file->HasDataset(
"/run/sample/magnetic_field")) {
556 auto mag_ds = nxs_file->template GetDataset<float>(
"/run/sample/magnetic_field");
557 dval = mag_ds.GetData()[0];
558 if (mag_ds.HasAttribute(
"units")) {
560 sstr = std::any_cast<std::string>(mag_ds.GetAttribute(
"units"));
561 }
catch (
const std::bad_any_cast&) {
562 std::cerr << std::endl <<
"**WARNING** ReadNexusFileIdf1: magnetic_field 'units' attribute has unexpected type." << std::endl;
577 for (UInt_t i=0; i<4; i++)
582 if (nxs_file->HasDataset(
"/run/notes"))
583 sstr = nxs_file->template GetDataset<std::string>(
"/run/notes").GetData()[0];
588 if (nxs_file->HasDataset(
"/run/sample/name"))
589 sstr = nxs_file->template GetDataset<std::string>(
"/run/sample/name").GetData()[0];
599 if (nxs_file->HasDataset(
"/run/histogram_data_1/resolution")) {
600 auto res_ds = nxs_file->template GetDataset<int>(
"/run/histogram_data_1/resolution");
601 dval = res_ds.GetData()[0];
602 if (res_ds.HasAttribute(
"units")) {
604 sstr = std::any_cast<std::string>(res_ds.GetAttribute(
"units"));
605 }
catch (
const std::bad_any_cast&) {
606 std::cerr << std::endl <<
"**WARNING** ReadNexusFileIdf1: resolution 'units' attribute has unexpected type." << std::endl;
609 if ((sstr ==
"picoseconds") || (sstr ==
"pico.seconds"))
616 TString date{
"n/a"}, time{
"n/a"};
617 if (nxs_file->HasDataset(
"/run/start_time"))
618 sstr = nxs_file->template GetDataset<std::string>(
"/run/start_time").GetData()[0];
629 if (nxs_file->HasDataset(
"/run/stop_time"))
630 sstr = nxs_file->template GetDataset<std::string>(
"/run/stop_time").GetData()[0];
639 if (nxs_file->HasDataset(
"/run/instrument/detector/deadtimes")) {
640 std::vector<float> dt;
641 dt = nxs_file->template GetDataset<float>(
"/run/instrument/detector/deadtimes").GetData();
644 if (nxs_file->HasDataset(
"/run/instrument/beam/frames_good")) {
645 ival = nxs_file->template GetDataset<int>(
"/run/instrument/beam/frames_good").GetData()[0];
650 if (nxs_file->HasDataset(
"/run/histogram_data_1/counts")) {
651 int t0_bin{-1}, fgb{-1}, lgb{-1}, noOfHistos{-1}, histoLength{-1};
652 auto count_ds = nxs_file->template GetDataset<int>(
"/run/histogram_data_1/counts");
653 auto count = count_ds.GetData();
655 auto castIntAttr = [](
const std::any& val,
const std::string& name) ->
int {
657 return std::any_cast<int>(val);
658 }
catch (
const std::bad_any_cast&) {
661 return std::any_cast<std::vector<int>>(val)[0];
662 }
catch (
const std::bad_any_cast&) {
663 std::cerr << std::endl <<
"**WARNING** ReadNexusFileIdf1: counts attribute '" << name
664 <<
"' has unexpected type; defaulting to -1." << std::endl;
669 if (count_ds.HasAttribute(
"t0_bin"))
670 t0_bin = castIntAttr(count_ds.GetAttribute(
"t0_bin"),
"t0_bin");
671 if (count_ds.HasAttribute(
"first_good_bin"))
672 fgb = castIntAttr(count_ds.GetAttribute(
"first_good_bin"),
"first_good_bin");
673 if (count_ds.HasAttribute(
"last_good_bin"))
674 lgb = castIntAttr(count_ds.GetAttribute(
"last_good_bin"),
"last_good_bin");
675 if (count_ds.HasAttribute(
"number"))
676 noOfHistos = castIntAttr(count_ds.GetAttribute(
"number"),
"number");
677 if (count_ds.HasAttribute(
"length"))
678 histoLength = castIntAttr(count_ds.GetAttribute(
"length"),
"length");
679 if (
static_cast<int>(count.size()) != noOfHistos*histoLength) {
680 std::cerr << std::endl <<
"**ERROR** PNeXus data size error! count.size()=" << count.size() <<
", #histos=" << noOfHistos <<
", length=" << histoLength <<
"." << std::endl;
685 for (
int i=0; i<noOfHistos; i++) {
691 for (
int j=0; j<histoLength; j++)
692 data.push_back(count[i*histoLength+j]);
702 fData.push_back(runData);
704 std::cerr << std::endl <<
"**ERROR** PNeXus couldn't obtain data: '/run/histogram_data_1/counts' is missing." << std::endl;
722 Double_t dval, factor;
729 if (nxs_file->HasDataset(
"/raw_data_1/instrument/source/name"))
730 sstr = nxs_file->template GetDataset<std::string>(
"/raw_data_1/instrument/source/name").GetData()[0];
735 if (nxs_file->HasDataset(
"/raw_data_1/instrument/name"))
736 sstr = nxs_file->template GetDataset<std::string>(
"/raw_data_1/instrument/name").GetData()[0];
742 if (nxs_file->HasDataset(
"/raw_data_1/instrument/source/type"))
743 sstr = nxs_file->template GetDataset<std::string>(
"/raw_data_1/instrument/source/type").GetData()[0];
748 if (nxs_file->HasDataset(
"/raw_data_1/instrument/source/probe"))
749 sstr = nxs_file->template GetDataset<std::string>(
"/raw_data_1/instrument/source/probe").GetData()[0];
754 if (nxs_file->HasDataset(
"/raw_data_1/title"))
755 sstr = nxs_file->template GetDataset<std::string>(
"/raw_data_1/title").GetData()[0];
760 if (nxs_file->HasDataset(
"/raw_data_1/run_number"))
761 ival = nxs_file->template GetDataset<int>(
"/raw_data_1/run_number").GetData()[0];
767 if (nxs_file->HasDataset(
"/raw_data_1/sample/temperature")) {
768 auto tmp_ds = nxs_file->template GetDataset<float>(
"/raw_data_1/sample/temperature");
769 dval = tmp_ds.GetData()[0];
770 if (tmp_ds.HasAttribute(
"units"))
771 sstr = std::any_cast<std::string>(tmp_ds.GetAttribute(
"units"));
772 if (sstr ==
"Celcius")
781 if (nxs_file->HasDataset(
"/raw_data_1/sample/magnetic_field")) {
782 auto mag_ds = nxs_file->template GetDataset<float>(
"/raw_data_1/sample/magnetic_field");
783 dval = mag_ds.GetData()[0];
784 if (mag_ds.HasAttribute(
"units"))
785 sstr = std::any_cast<std::string>(mag_ds.GetAttribute(
"units"));
801 for (UInt_t i=0; i<4; i++)
810 if (nxs_file->HasDataset(
"/raw_data_1/sample/name"))
811 sstr = nxs_file->template GetDataset<std::string>(
"/raw_data_1/sample/name").GetData()[0];
821 if (nxs_file->HasDataset(
"/raw_data_1/instrument/detector_1/resolution")) {
822 auto res_ds = nxs_file->template GetDataset<int>(
"/raw_data_1/instrument/detector_1/resolution");
823 dval = res_ds.GetData()[0];
824 if (res_ds.HasAttribute(
"units"))
825 sstr = std::any_cast<std::string>(res_ds.GetAttribute(
"units"));
826 if ((sstr ==
"picoseconds") || (sstr ==
"pico.seconds"))
833 TString date{
"n/a"}, time{
"n/a"};
834 if (nxs_file->HasDataset(
"/raw_data_1/start_time"))
835 sstr = nxs_file->template GetDataset<std::string>(
"/raw_data_1/start_time").GetData()[0];
846 if (nxs_file->HasDataset(
"/raw_data_1/end_time"))
847 sstr = nxs_file->template GetDataset<std::string>(
"/raw_data_1/end_time").GetData()[0];
856 if (nxs_file->HasDataset(
"/raw_data_1/instrument/detector_1/dead_time")) {
857 std::vector<float> dt;
858 dt = nxs_file->template GetDataset<float>(
"/raw_data_1/instrument/detector_1/dead_time").GetData();
861 if (nxs_file->HasDataset(
"/raw_data_1/good_frames")) {
862 ival = nxs_file->template GetDataset<int>(
"/raw_data_1/good_frames").GetData()[0];
867 if (nxs_file->HasDataset(
"/raw_data_1/instrument/detector_1/counts")) {
868 int t0_bin{-1}, fgb{-1}, lgb{-1}, noOfPeriods{-1}, noOfHistos{-1}, histoLength{-1};
869 auto count_ds = nxs_file->template GetDataset<int>(
"/raw_data_1/instrument/detector_1/counts");
870 auto count = count_ds.GetData();
871 auto dims = count_ds.GetDimensions();
872 if (dims.size() < 3) {
873 std::cerr << std::endl <<
"**ERROR** PNeXus data dimension error! dims.size()=" << dims.size() <<
", expecting == 3." << std::endl;
876 noOfPeriods = dims[0];
877 noOfHistos = dims[1];
878 histoLength = dims[2];
882 if (count_ds.HasAttribute(
"t0_bin"))
883 t0_bin = std::any_cast<int>(count_ds.GetAttribute(
"t0_bin"));
884 if (count_ds.HasAttribute(
"first_good_bin"))
885 fgb = std::any_cast<int>(count_ds.GetAttribute(
"first_good_bin"));
886 if (count_ds.HasAttribute(
"last_good_bin"))
887 lgb = std::any_cast<int>(count_ds.GetAttribute(
"last_good_bin"));
888 if (
static_cast<int>(count.size()) != noOfPeriods*noOfHistos*histoLength) {
889 std::cerr << std::endl <<
"**ERROR** PNeXus data size error! count.size()=" << count.size() <<
", #periods=" << noOfPeriods <<
", #histos=" << noOfHistos <<
", length=" << histoLength <<
"." << std::endl;
895 for (
int i=0; i<noOfPeriods; i++) {
896 for (
int j=0; j<noOfHistos; j++) {
902 for (
int k=0; k<histoLength; k++)
903 data.push_back(count[i*noOfHistos*histoLength+j*histoLength+k]);
914 fData.push_back(runData);
#define PERIOD_HISTO_OFFSET
std::vector< TString > PStringVector
std::vector< Double_t > PDoubleVector
std::vector< PRawRunData > PRawRunDataList
MSR file parser and manager for the musrfit framework.
virtual void Clear()
Clears all data from this histogram set.
virtual void SetLastGoodBin(Int_t lgb)
virtual void SetHistoNo(Int_t no)
virtual void SetData(PDoubleVector data)
virtual void SetTimeZeroBin(Double_t tzb)
virtual void SetFirstGoodBin(Int_t fgb)
virtual void SetStopDate(const TString str)
virtual void SetNoOfHistosPerPeriod(UInt_t ival)
virtual void SetRingAnode(const UInt_t idx, const Double_t dval)
virtual void SetMuonSource(const TString &str)
virtual void SetTimeResolution(const Double_t dval)
virtual void SetSample(const TString str)
virtual void SetEnergy(const Double_t dval)
virtual void SetStartDate(const TString str)
virtual void SetTransport(const Double_t dval)
virtual void SetRunName(const TString &str)
virtual void SetOrientation(const TString str)
virtual void SetSetup(const TString str)
virtual void SetStopTime(const TString str)
virtual void SetRunTitle(const TString str)
virtual void SetTemperature(const UInt_t idx, const Double_t temp, const Double_t errTemp)
virtual void SetMuonSpecies(const TString &str)
virtual void SetBeamline(const TString &str)
virtual void SetNumberOfGoodFrames(Int_t ival)
virtual void SetRunNumber(const Int_t &val)
virtual void SetInstrument(const TString &str)
virtual void SetField(const Double_t dval)
virtual void SetStartTime(const TString str)
virtual void SetLaboratory(const TString &str)
virtual void SetDataSet(PRawRunDataSet &dataSet, UInt_t idx=-1)
virtual void SetDeadTimeParam(std::vector< float > dvec)
PRunDataHandler()
Default constructor creating an uninitialized handler.
PMsrHandler * fMsrInfo
Pointer to MSR file handler (not owned, don't delete)
virtual TString FileNameFromTemplate(TString &fileNameTemplate, Int_t run, TString &year, Bool_t &ok)
virtual void SplitTimeDate(TString timeDate, TString &time, TString &date, Bool_t &ok)
virtual Bool_t ReadAsciiFile()
virtual Bool_t ReadWkmFile()
virtual Bool_t ReadRootFile()
Bool_t ReadNexusFileIdf2(T &nxs_file)
virtual Int_t GetNoOfRunData()
Returns the number of loaded run data sets.
virtual Bool_t WriteWkmFile(TString fln="")
TString fRunName
Current run name being processed (used during file reading)
virtual Bool_t ReadDBFile()
virtual void ReadData()
Reads all data files specified in MSR file or configuration.
virtual Bool_t StripWhitespace(TString &str)
virtual Bool_t IsWhitespace(const Char_t *str)
virtual Bool_t ReadFilesMsr()
Bool_t ReadNexusFileIdf1(T &nxs_file)
Bool_t fAllDataAvailable
Flag: true if all requested data files loaded successfully, false if any failed.
virtual Int_t ToInt(TString &str, Bool_t &ok)
PRawRunDataList fData
List of all loaded raw run data (histograms + metadata)
virtual Bool_t WriteData(TString fileName="")
Writes data to file in the specified format.
virtual Bool_t ReadNexusFile()
virtual TString GenerateOutputFileName(const TString fileName, const TString extension, Bool_t &ok)
virtual Bool_t WriteAsciiFile(TString fln="")
virtual Bool_t ReadMudFile()
virtual Bool_t IsAllDataAvailable() const
Checks if all required data files were successfully loaded.
virtual Bool_t FileExistsCheck(PMsrRunBlock &runInfo, const UInt_t idx)
virtual Bool_t WritePsiBinFile(TString fln="")
virtual PRawRunData * GetRunData(const TString &runName)
Retrieves run data by run name.
virtual TString GetFileName(const TString extension, Bool_t &ok)
virtual Bool_t WriteMudFile(TString fln="")
TString fFileFormat
Explicitly specified file format (overrides auto-detection)
virtual TString GetMonth(Int_t month)
virtual Bool_t WriteMusrRootFile(Int_t tag=A2M_MUSR_ROOT_DIR, TString fln="")
virtual Int_t GetDataTagIndex(TString &str, const PStringVector *fLabels)
virtual Bool_t ReadMduAsciiFile()
virtual Bool_t WriteRootFile(TString fln="")
PStringVector fDataPath
Search paths for data files (checked sequentially until file found)
TString fRunPathName
Full path to current data file being read.
virtual ~PRunDataHandler()
Virtual destructor that frees all loaded data.
virtual void TestFileName(TString &runName, const TString &ext)
virtual Bool_t WriteNexusFile(TString format, TString fln="")
virtual bool DateToISO8601(std::string inDate, std::string &iso8601Date)
virtual Bool_t ReadWriteFilesList()
virtual Bool_t SetRunData(PRawRunData *data, UInt_t idx=0)
Sets or replaces run data at specified index.
virtual void Init(const Int_t tag=0)
PAny2ManyInfo * fAny2ManyInfo
Pointer to any2many conversion configuration (not owned, don't delete)
virtual Bool_t FileAlreadyRead(TString runName)
virtual Bool_t ReadPsiBinFile()
virtual Bool_t ReadDatFile()
virtual TString GetYear(Int_t month)
virtual Double_t ToDouble(TString &str, Bool_t &ok)
virtual void ConvertData()
Performs format conversion (for any2many utility).