diff --git a/src/classes/PRunDataHandler.cpp b/src/classes/PRunDataHandler.cpp index 6c92899e..8d136df2 100644 --- a/src/classes/PRunDataHandler.cpp +++ b/src/classes/PRunDataHandler.cpp @@ -2219,7 +2219,7 @@ Bool_t PRunDataHandler::ReadNexusFile() PRawRunDataSet dataSet; TString str; std::string sstr; - Int_t ival; + Int_t ival, idf{-1}; Double_t dval, factor; bool ok; @@ -2231,173 +2231,192 @@ Bool_t PRunDataHandler::ReadNexusFile() return true; } - // get header information - - // get/set laboratory - sstr = "n/a"; - if (nxs_file->HasDataset("/run/lab")) - sstr = nxs_file->GetDataset("/run/lab").GetData()[0]; - runData.SetLaboratory(sstr); - - // get/set beamline - sstr = "n/a"; - if (nxs_file->HasDataset("/run/beamline")) - sstr = nxs_file->GetDataset("/run/beamline").GetData()[0]; - runData.SetBeamline(sstr); - - // get/set instrument - sstr = "n/a"; - if (nxs_file->HasDataset("/run/instrument/name")) - sstr = nxs_file->GetDataset("/run/instrument/name").GetData()[0]; - runData.SetInstrument(sstr); - - // get/set run title - str = "n/a"; - if (nxs_file->HasDataset("/run/title")) - sstr = nxs_file->GetDataset("/run/title").GetData()[0]; - runData.SetRunTitle(sstr); - - // get/set run number - ival = -1; - if (nxs_file->HasDataset("/run/number")) - ival = nxs_file->GetDataset("/run/number").GetData()[0]; - runData.SetRunNumber(ival); - - // get/set temperature - dval = PMUSR_UNDEFINED; - sstr = "n/a"; - if (nxs_file->HasDataset("/run/sample/temperature")) { - auto tmp_ds = nxs_file->GetDataset("/run/sample/temperature"); - dval = tmp_ds.GetData()[0]; - if (tmp_ds.HasAttribute("units")) - sstr = std::any_cast(tmp_ds.GetAttribute("units")); - if (sstr == "Celcius") - dval += 273.16; + // check for IDF_version + if (nxs_file->HasDataset("/run/IDF_version")) { + idf = nxs_file->GetDataset("/run/IDF_version").GetData()[0]; + std::cout << ">> PRunDataHandler::ReadNexusFile(): IDF V" << idf << std::endl; } - runData.SetTemperature(0, dval, 0.0); - - // get/set field - dval = PMUSR_UNDEFINED; - sstr = "n/a"; - factor = 1.0; - if (nxs_file->HasDataset("/run/sample/magnetic_field")) { - auto mag_ds = nxs_file->GetDataset("/run/sample/magnetic_field"); - dval = mag_ds.GetData()[0]; - if (mag_ds.HasAttribute("units")) - sstr = std::any_cast(mag_ds.GetAttribute("units")); - if (sstr == "Tesla") - factor = 1.0e4; - } - runData.SetField(dval*factor); - - // get/set implantation energy - runData.SetEnergy(PMUSR_UNDEFINED); - - // get/set moderator HV - runData.SetTransport(PMUSR_UNDEFINED); - - // get/set RA HV's (LEM specific) - for (UInt_t i=0; i<4; i++) - runData.SetRingAnode(i, PMUSR_UNDEFINED); - - // get/set setup - sstr = "n/a"; - if (nxs_file->HasDataset("/run/notes")) - sstr = nxs_file->GetDataset("/run/notes").GetData()[0]; - runData.SetSetup(sstr); - - // get/set sample - sstr = "n/a"; - if (nxs_file->HasDataset("/run/sample/name")) - sstr = nxs_file->GetDataset("/run/sample/name").GetData()[0]; - runData.SetSample(sstr); - - // get/set orientation - runData.SetOrientation("??"); - - // get/set time resolution (ns) - dval = PMUSR_UNDEFINED; - sstr = "n/a"; - factor = 1.0; - if (nxs_file->HasDataset("/run/histogram_data_1/resolution")) { - auto res_ds = nxs_file->GetDataset("/run/histogram_data_1/resolution"); - dval = res_ds.GetData()[0]; - if (res_ds.HasAttribute("units")) - sstr = std::any_cast(res_ds.GetAttribute("units")); - if ((sstr == "picoseconds") || (sstr == "pico.seconds")) - factor = 1.0e-3; // ps -> ns - } - runData.SetTimeResolution(dval*factor); - - // get/set start/stop time - sstr = "n/a"; - TString date{"n/a"}, time{"n/a"}; - if (nxs_file->HasDataset("/run/start_time")) - sstr = nxs_file->GetDataset("/run/start_time").GetData()[0]; - str = sstr; - SplitTimeDate(str, time, date, ok); - if (ok) { - runData.SetStartTime(time); - runData.SetStartDate(date); - } - - sstr = "n/a"; - date = "n/a"; - time = "n/a"; - if (nxs_file->HasDataset("/run/stop_time")) - sstr = nxs_file->GetDataset("/run/stop_time").GetData()[0]; - str = sstr; - SplitTimeDate(str, time, date, ok); - if (ok) { - runData.SetStopTime(time); - runData.SetStopDate(date); - } - - // data with its metadata - int t0_bin{-1}, fgb{-1}, lgb{-1}, noOfHistos{-1}, histoLength{-1}; - if (nxs_file->HasDataset("/run/histogram_data_1/counts")) { - auto count_ds = nxs_file->GetDataset("/run/histogram_data_1/counts"); - auto count = count_ds.GetData(); - // get all necessary attributes - if (count_ds.HasAttribute("t0_bin")) - t0_bin = std::any_cast(count_ds.GetAttribute("t0_bin")); - if (count_ds.HasAttribute("first_good_bin")) - fgb = std::any_cast(count_ds.GetAttribute("first_good_bin")); - if (count_ds.HasAttribute("last_good_bin")) - lgb = std::any_cast(count_ds.GetAttribute("last_good_bin")); - if (count_ds.HasAttribute("number")) - noOfHistos = std::any_cast(count_ds.GetAttribute("number")); - if (count_ds.HasAttribute("length")) - histoLength = std::any_cast(count_ds.GetAttribute("length")); - if (count.size() != noOfHistos*histoLength) { - std::cerr << std::endl << "**ERROR** nxH4::PNeXus data size error! count.size()=" << count.size() << ", #histos=" << noOfHistos << ", length=" << histoLength << "." << std::endl; - return false; + if (idf == -1) { // IDF_version not found + if (nxs_file->HasDataset("/raw_data_1/IDF_version")) { + idf = nxs_file->GetDataset("/raw_data_1/IDF_version").GetData()[0]; + std::cout << ">> PRunDataHandler::ReadNexusFile(): IDF V" << idf << std::endl; } - // fill dataSet - PDoubleVector data; - for (unsigned int i=0; i> PRunDataHandler::ReadNexusFile(): a NeXus file with an invalid IDF V" << idf << std::endl; return false; } + if (idf == 1) { // HDF4 IDF V1 + // get header information + + // get/set laboratory + sstr = "n/a"; + if (nxs_file->HasDataset("/run/lab")) + sstr = nxs_file->GetDataset("/run/lab").GetData()[0]; + runData.SetLaboratory(sstr); + + // get/set beamline + sstr = "n/a"; + if (nxs_file->HasDataset("/run/beamline")) + sstr = nxs_file->GetDataset("/run/beamline").GetData()[0]; + runData.SetBeamline(sstr); + + // get/set instrument + sstr = "n/a"; + if (nxs_file->HasDataset("/run/instrument/name")) + sstr = nxs_file->GetDataset("/run/instrument/name").GetData()[0]; + runData.SetInstrument(sstr); + + // get/set run title + str = "n/a"; + if (nxs_file->HasDataset("/run/title")) + sstr = nxs_file->GetDataset("/run/title").GetData()[0]; + runData.SetRunTitle(sstr); + + // get/set run number + ival = -1; + if (nxs_file->HasDataset("/run/number")) + ival = nxs_file->GetDataset("/run/number").GetData()[0]; + runData.SetRunNumber(ival); + + // get/set temperature + dval = PMUSR_UNDEFINED; + sstr = "n/a"; + if (nxs_file->HasDataset("/run/sample/temperature")) { + auto tmp_ds = nxs_file->GetDataset("/run/sample/temperature"); + dval = tmp_ds.GetData()[0]; + if (tmp_ds.HasAttribute("units")) + sstr = std::any_cast(tmp_ds.GetAttribute("units")); + if (sstr == "Celcius") + dval += 273.16; + } + runData.SetTemperature(0, dval, 0.0); + + // get/set field + dval = PMUSR_UNDEFINED; + sstr = "n/a"; + factor = 1.0; + if (nxs_file->HasDataset("/run/sample/magnetic_field")) { + auto mag_ds = nxs_file->GetDataset("/run/sample/magnetic_field"); + dval = mag_ds.GetData()[0]; + if (mag_ds.HasAttribute("units")) + sstr = std::any_cast(mag_ds.GetAttribute("units")); + if (sstr == "Tesla") + factor = 1.0e4; + } + runData.SetField(dval*factor); + + // get/set implantation energy + runData.SetEnergy(PMUSR_UNDEFINED); + + // get/set moderator HV + runData.SetTransport(PMUSR_UNDEFINED); + + // get/set RA HV's (LEM specific) + for (UInt_t i=0; i<4; i++) + runData.SetRingAnode(i, PMUSR_UNDEFINED); + + // get/set setup + sstr = "n/a"; + if (nxs_file->HasDataset("/run/notes")) + sstr = nxs_file->GetDataset("/run/notes").GetData()[0]; + runData.SetSetup(sstr); + + // get/set sample + sstr = "n/a"; + if (nxs_file->HasDataset("/run/sample/name")) + sstr = nxs_file->GetDataset("/run/sample/name").GetData()[0]; + runData.SetSample(sstr); + + // get/set orientation + runData.SetOrientation("??"); + + // get/set time resolution (ns) + dval = PMUSR_UNDEFINED; + sstr = "n/a"; + factor = 1.0; + if (nxs_file->HasDataset("/run/histogram_data_1/resolution")) { + auto res_ds = nxs_file->GetDataset("/run/histogram_data_1/resolution"); + dval = res_ds.GetData()[0]; + if (res_ds.HasAttribute("units")) + sstr = std::any_cast(res_ds.GetAttribute("units")); + if ((sstr == "picoseconds") || (sstr == "pico.seconds")) + factor = 1.0e-3; // ps -> ns + } + runData.SetTimeResolution(dval*factor); + + // get/set start/stop time + sstr = "n/a"; + TString date{"n/a"}, time{"n/a"}; + if (nxs_file->HasDataset("/run/start_time")) + sstr = nxs_file->GetDataset("/run/start_time").GetData()[0]; + str = sstr; + SplitTimeDate(str, time, date, ok); + if (ok) { + runData.SetStartTime(time); + runData.SetStartDate(date); + } + + sstr = "n/a"; + date = "n/a"; + time = "n/a"; + if (nxs_file->HasDataset("/run/stop_time")) + sstr = nxs_file->GetDataset("/run/stop_time").GetData()[0]; + str = sstr; + SplitTimeDate(str, time, date, ok); + if (ok) { + runData.SetStopTime(time); + runData.SetStopDate(date); + } + + // data with its metadata + int t0_bin{-1}, fgb{-1}, lgb{-1}, noOfHistos{-1}, histoLength{-1}; + if (nxs_file->HasDataset("/run/histogram_data_1/counts")) { + auto count_ds = nxs_file->GetDataset("/run/histogram_data_1/counts"); + auto count = count_ds.GetData(); + // get all necessary attributes + if (count_ds.HasAttribute("t0_bin")) + t0_bin = std::any_cast(count_ds.GetAttribute("t0_bin")); + if (count_ds.HasAttribute("first_good_bin")) + fgb = std::any_cast(count_ds.GetAttribute("first_good_bin")); + if (count_ds.HasAttribute("last_good_bin")) + lgb = std::any_cast(count_ds.GetAttribute("last_good_bin")); + if (count_ds.HasAttribute("number")) + noOfHistos = std::any_cast(count_ds.GetAttribute("number")); + if (count_ds.HasAttribute("length")) + histoLength = std::any_cast(count_ds.GetAttribute("length")); + if (count.size() != noOfHistos*histoLength) { + std::cerr << std::endl << "**ERROR** nxH4::PNeXus data size error! count.size()=" << count.size() << ", #histos=" << noOfHistos << ", length=" << histoLength << "." << std::endl; + return false; + } + // fill dataSet + PDoubleVector data; + for (unsigned int i=0; i nxs_file = std::make_unique(fRunPathName.Data()); @@ -2405,13 +2424,31 @@ Bool_t PRunDataHandler::ReadNexusFile() std::cerr << std::endl << "**ERROR** allocation of nxH5::PNeXus object failed." << std::endl; return true; } + + // check for IDF_version + if (nxs_file->HasDataset("/run/IDF_version")) { + idf = nxs_file->GetDataset("/run/IDF_version").GetData()[0]; + std::cout << ">> PRunDataHandler::ReadNexusFile(): IDF V" << idf << std::endl; + } + if (idf == -1) { // IDF_version not found + if (nxs_file->HasDataset("/raw_data_1/IDF_version")) { + idf = nxs_file->GetDataset("/raw_data_1/IDF_version").GetData()[0]; + std::cout << ">> PRunDataHandler::ReadNexusFile(): IDF V" << idf << std::endl; + } + } + if ((idf != 1) && (idf != 2)) { + std::cerr << std::endl << ">> PRunDataHandler::ReadNexusFile(): a NeXus file with an invalid IDF V" << idf << std::endl; + return false; + } + + if (idf == 1) { // HDF5 IDF V1 + // not yet implemented + } else { // HDF5 IDF V2 + // not yet implemented + } } /* //as35 - if (nxs_file->GetIdfVersion() == 1) { - - // keep the information - fData.push_back(runData); } else if (nxs_file->GetIdfVersion() == 2) { if (!nxs_file->IsValid()) { std::cout << std::endl << "**ERROR** invalid NeXus IDF 2 version file found." << std::endl;