diff --git a/src/classes/PRunDataHandler.cpp b/src/classes/PRunDataHandler.cpp index 379e8df6..18948987 100644 --- a/src/classes/PRunDataHandler.cpp +++ b/src/classes/PRunDataHandler.cpp @@ -2284,198 +2284,6 @@ Bool_t PRunDataHandler::ReadNexusFile() // not yet implemented } } - -/* //as35 - } else if (nxs_file->GetIdfVersion() == 2) { - if (!nxs_file->IsValid()) { - std::cout << std::endl << "**ERROR** invalid NeXus IDF 2 version file found." << std::endl; - return false; - } - // get header information - - // get/set laboratory - str = TString(nxs_file->GetEntryIdf2()->GetInstrument()->GetSource()->GetName()); - runData.SetLaboratory(str); - - // get/set beamline - str = TString(nxs_file->GetEntryIdf2()->GetInstrument()->GetName()); - runData.SetBeamline(str); - - // get/set instrument - str = TString(nxs_file->GetEntryIdf2()->GetInstrument()->GetName()); - runData.SetInstrument(str); - - // get/set muon source - str = TString(nxs_file->GetEntryIdf2()->GetInstrument()->GetSource()->GetType()); - runData.SetMuonSource(str); - - // get/set muon species - str = TString(nxs_file->GetEntryIdf2()->GetInstrument()->GetSource()->GetProbe()); - runData.SetMuonSpecies(str); - - // get/set run title - str = TString(nxs_file->GetEntryIdf2()->GetTitle()); - runData.SetRunTitle(str); - - // get/set run number - runData.SetRunNumber(nxs_file->GetEntryIdf2()->GetRunNumber()); - - // get/set temperature - dval = nxs_file->GetEntryIdf2()->GetSample()->GetPhysPropValue("temperature", ok); - if (ok) - runData.SetTemperature(0, dval, 0.0); - - // get/set field - dval = nxs_file->GetEntryIdf2()->GetSample()->GetPhysPropValue("magnetic_field", ok); - nxs_file->GetEntryIdf2()->GetSample()->GetPhysPropUnit("magnetic_field", sstr, ok); - str = sstr; - // since field has to be given in Gauss, check the units - Double_t factor=1.0; - if (!str.CompareTo("gauss", TString::kIgnoreCase)) - factor=1.0; - else if (!str.CompareTo("tesla", TString::kIgnoreCase)) - factor=1.0e4; - else - factor=1.0; - runData.SetField(factor*dval); - - // 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 take NXsample/temperature_1_env and NXsample/magnetic_field_1_env - sstr = nxs_file->GetEntryIdf2()->GetSample()->GetEnvironmentTemp() + std::string("/"); - sstr += nxs_file->GetEntryIdf2()->GetSample()->GetEnvironmentField(); - str = sstr; - runData.SetSetup(str); - - // get/set sample - runData.SetSample(nxs_file->GetEntryIdf2()->GetSample()->GetName()); - - // get/set orientation - runData.SetOrientation("??"); - - // get/set time resolution (ns) - runData.SetTimeResolution(nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetTimeResolution("ns")); - - // get/set start/stop time - sstr = nxs_file->GetEntryIdf2()->GetStartTime(); - str = sstr; - TString date, time; - SplitTimeDate(str, time, date, ok); - if (ok) { - runData.SetStartTime(time); - runData.SetStartDate(date); - } - - sstr = nxs_file->GetEntryIdf2()->GetStopTime(); - str = sstr; - SplitTimeDate(str, time, date, ok); - if (ok) { - runData.SetStopTime(time); - runData.SetStopDate(date); - } - - // get/set data, t0, fgb, lgb - PDoubleVector data; - PRawRunDataSet dataSet; - UInt_t histoNo = 0; - Int_t ival; - int *histos = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetHistos(); - if (nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfPeriods() > 0) { // counts[][][] - for (int i=0; iGetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfPeriods(); i++) { - for (int j=0; jGetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfSpectra(); j++) { - for (int k=0; kGetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfBins(); k++) { - data.push_back(*(histos+i*nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfSpectra()+j*nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfBins()+k)); - } - dataSet.Clear(); - dataSet.SetHistoNo(++histoNo); // i.e. histo numbers start with 1 - // get t0 - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetT0(i,j); - if (ival == -1) // i.e. single value only - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetT0(); - dataSet.SetTimeZeroBin(ival); - // get first good bin - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetFirstGoodBin(i,j); - if (ival == -1) // i.e. single value only - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetFirstGoodBin(); - dataSet.SetFirstGoodBin(ival); - // get last good bin - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetLastGoodBin(i,j); - if (ival == -1) // i.e. single value only - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetLastGoodBin(); - dataSet.SetLastGoodBin(ival); - - dataSet.SetData(data); - runData.SetDataSet(dataSet); - data.clear(); - } - } - } else { - if (nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfSpectra() > 0) { // counts[][] - for (int i=0; iGetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfSpectra(); i++) { - for (int j=0; jGetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfBins(); j++) { - data.push_back(*(histos+i*nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfBins()+j)); - } - dataSet.Clear(); - dataSet.SetHistoNo(++histoNo); // i.e. histo numbers start with 1 - // get t0 - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetT0(-1,i); - if (ival == -1) // i.e. single value only - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetT0(); - dataSet.SetTimeZeroBin(ival); - // get first good bin - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetFirstGoodBin(-1,i); - if (ival == -1) // i.e. single value only - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetFirstGoodBin(); - dataSet.SetFirstGoodBin(ival); - // get last good bin - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetLastGoodBin(-1,i); - if (ival == -1) // i.e. single value only - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetLastGoodBin(); - dataSet.SetLastGoodBin(ival); - - dataSet.SetData(data); - runData.SetDataSet(dataSet); - data.clear(); - } - } else { // counts[] - for (int i=0; iGetEntryIdf2()->GetInstrument()->GetDetector()->GetNoOfBins(); i++) { - data.push_back(*(histos+i)); - } - dataSet.Clear(); - dataSet.SetHistoNo(++histoNo); // i.e. histo numbers start with 1 - // get t0 - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetT0(); - dataSet.SetTimeZeroBin(ival); - // get first good bin - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetFirstGoodBin(); - dataSet.SetFirstGoodBin(ival); - // get last good bin - ival = nxs_file->GetEntryIdf2()->GetInstrument()->GetDetector()->GetLastGoodBin(); - dataSet.SetLastGoodBin(ival); - - dataSet.SetData(data); - runData.SetDataSet(dataSet); - data.clear(); - } - } - - // keep run name from the msr-file - runData.SetRunName(fRunName); - - // keep the information - fData.push_back(runData); - } else { - std::cout << std::endl << ">> PRunDataHandler::ReadNexusFile(): IDF version " << nxs_file->GetIdfVersion() << ", not implemented." << std::endl; - } -*/ //as35 #else std::cout << std::endl << ">> PRunDataHandler::ReadNexusFile(): Sorry, not enabled at configuration level, i.e. --enable-NeXus when executing configure" << std::endl << std::endl; #endif diff --git a/src/include/PRunDataHandler.h b/src/include/PRunDataHandler.h index a4170cb3..86b14a78 100644 --- a/src/include/PRunDataHandler.h +++ b/src/include/PRunDataHandler.h @@ -685,6 +685,159 @@ Bool_t PRunDataHandler::ReadNexusFileIdf1(T& nxs_file) template Bool_t PRunDataHandler::ReadNexusFileIdf2(T& nxs_file) { + PRawRunData runData; + PRawRunDataSet dataSet; + TString str; + std::string sstr; + Int_t ival; + Double_t dval, factor; + bool ok; + + // get header information + + // get/set laboratory + sstr = "n/a"; + if (nxs_file->HasDataset("/raw_data_1/instrument/source/name")) + sstr = nxs_file->template GetDataset("/raw_data_1/instrument/source/name").GetData()[0]; + runData.SetLaboratory(sstr); + + // get/set beamline + sstr = "n/a"; + if (nxs_file->HasDataset("/raw_data_1/instrument/name")) + sstr = nxs_file->template GetDataset("/raw_data_1/instrument/name").GetData()[0]; + runData.SetBeamline(sstr); + runData.SetBeamline(sstr); + + // get/set muon source + sstr = "n/a"; + if (nxs_file->HasDataset("/raw_data_1/instrument/source/type")) + sstr = nxs_file->template GetDataset("/raw_data_1/instrument/source/type").GetData()[0]; + runData.SetMuonSource(sstr); + + // get/set muon species + sstr = "n/a"; + if (nxs_file->HasDataset("/raw_data_1/instrument/source/probe")) + sstr = nxs_file->template GetDataset("/raw_data_1/instrument/source/probe").GetData()[0]; + runData.SetMuonSpecies(sstr); + + // get/set run title + sstr = "n/a"; + if (nxs_file->HasDataset("/raw_data_1/title")) + sstr = nxs_file->template GetDataset("/raw_data_1/title").GetData()[0]; + runData.SetRunTitle(sstr); + + // get/set run number + ival = -1; + if (nxs_file->HasDataset("/raw_data_1/run_number")) + ival = nxs_file->template GetDataset("/raw_data_1/run_number").GetData()[0]; + runData.SetRunNumber(ival); + + // get/set temperature + dval = PMUSR_UNDEFINED; + sstr = "n/a"; + if (nxs_file->HasDataset("/raw_data_1/sample/temperature")) { + auto tmp_ds = nxs_file->template GetDataset("/raw_data_1/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("/raw_data_1/sample/magnetic_field")) { + auto mag_ds = nxs_file->template GetDataset("/raw_data_1/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 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"; + runData.SetSetup(str); + + // get/set sample + sstr = "n/a"; + if (nxs_file->HasDataset("/raw_data_1/sample/name")) + sstr = nxs_file->template GetDataset("/raw_data_1/sample/name").GetData()[0]; + runData.SetSample(sstr); + + // get/set orientation + runData.SetOrientation("n/a"); + + // get/set time resolution (ns) + dval = PMUSR_UNDEFINED; + sstr = "n/a"; + factor = 1.0; + if (nxs_file->HasDataset("/raw_data_1/instrument/detector_1/resolution")) { + auto res_ds = nxs_file->template GetDataset("/raw_data_1/instrument/detector_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("/raw_data_1/start_time")) + sstr = nxs_file->template GetDataset("/raw_data_1/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("/raw_data_1/end_time")) + sstr = nxs_file->template GetDataset("/raw_data_1/end_time").GetData()[0]; + str = sstr; + SplitTimeDate(str, time, date, ok); + if (ok) { + runData.SetStopTime(time); + runData.SetStopDate(date); + } + + // get/set deadtime relevant parameters + if (nxs_file->HasDataset("/raw_data_1/instrument/detector1/dead_time")) { + std::vector dt; + dt = nxs_file->template GetDataset("/raw_data_1/instrument/detector1/dead_time").GetData(); + runData.SetDeadTimeParam(dt); + } + if (nxs_file->HasDataset("/raw_data_1/good_frames")) { + ival = nxs_file->template GetDataset("/raw_data_1/good_frames").GetData()[0]; + runData.SetNumberOfGoodFrames(ival); + } + + // data with its metadata + + // *** STILL MISSING *** + return true; }