check for IDF 1/2.
This commit is contained in:
@@ -2219,7 +2219,7 @@ Bool_t PRunDataHandler::ReadNexusFile()
|
|||||||
PRawRunDataSet dataSet;
|
PRawRunDataSet dataSet;
|
||||||
TString str;
|
TString str;
|
||||||
std::string sstr;
|
std::string sstr;
|
||||||
Int_t ival;
|
Int_t ival, idf{-1};
|
||||||
Double_t dval, factor;
|
Double_t dval, factor;
|
||||||
bool ok;
|
bool ok;
|
||||||
|
|
||||||
@@ -2231,173 +2231,192 @@ Bool_t PRunDataHandler::ReadNexusFile()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get header information
|
// check for IDF_version
|
||||||
|
if (nxs_file->HasDataset("/run/IDF_version")) {
|
||||||
// get/set laboratory
|
idf = nxs_file->GetDataset<int>("/run/IDF_version").GetData()[0];
|
||||||
sstr = "n/a";
|
std::cout << ">> PRunDataHandler::ReadNexusFile(): IDF V" << idf << std::endl;
|
||||||
if (nxs_file->HasDataset("/run/lab"))
|
|
||||||
sstr = nxs_file->GetDataset<std::string>("/run/lab").GetData()[0];
|
|
||||||
runData.SetLaboratory(sstr);
|
|
||||||
|
|
||||||
// get/set beamline
|
|
||||||
sstr = "n/a";
|
|
||||||
if (nxs_file->HasDataset("/run/beamline"))
|
|
||||||
sstr = nxs_file->GetDataset<std::string>("/run/beamline").GetData()[0];
|
|
||||||
runData.SetBeamline(sstr);
|
|
||||||
|
|
||||||
// get/set instrument
|
|
||||||
sstr = "n/a";
|
|
||||||
if (nxs_file->HasDataset("/run/instrument/name"))
|
|
||||||
sstr = nxs_file->GetDataset<std::string>("/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<std::string>("/run/title").GetData()[0];
|
|
||||||
runData.SetRunTitle(sstr);
|
|
||||||
|
|
||||||
// get/set run number
|
|
||||||
ival = -1;
|
|
||||||
if (nxs_file->HasDataset("/run/number"))
|
|
||||||
ival = nxs_file->GetDataset<int>("/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<float>("/run/sample/temperature");
|
|
||||||
dval = tmp_ds.GetData()[0];
|
|
||||||
if (tmp_ds.HasAttribute("units"))
|
|
||||||
sstr = std::any_cast<std::string>(tmp_ds.GetAttribute("units"));
|
|
||||||
if (sstr == "Celcius")
|
|
||||||
dval += 273.16;
|
|
||||||
}
|
}
|
||||||
runData.SetTemperature(0, dval, 0.0);
|
if (idf == -1) { // IDF_version not found
|
||||||
|
if (nxs_file->HasDataset("/raw_data_1/IDF_version")) {
|
||||||
// get/set field
|
idf = nxs_file->GetDataset<int>("/raw_data_1/IDF_version").GetData()[0];
|
||||||
dval = PMUSR_UNDEFINED;
|
std::cout << ">> PRunDataHandler::ReadNexusFile(): IDF V" << idf << std::endl;
|
||||||
sstr = "n/a";
|
|
||||||
factor = 1.0;
|
|
||||||
if (nxs_file->HasDataset("/run/sample/magnetic_field")) {
|
|
||||||
auto mag_ds = nxs_file->GetDataset<float>("/run/sample/magnetic_field");
|
|
||||||
dval = mag_ds.GetData()[0];
|
|
||||||
if (mag_ds.HasAttribute("units"))
|
|
||||||
sstr = std::any_cast<std::string>(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<std::string>("/run/notes").GetData()[0];
|
|
||||||
runData.SetSetup(sstr);
|
|
||||||
|
|
||||||
// get/set sample
|
|
||||||
sstr = "n/a";
|
|
||||||
if (nxs_file->HasDataset("/run/sample/name"))
|
|
||||||
sstr = nxs_file->GetDataset<std::string>("/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<int>("/run/histogram_data_1/resolution");
|
|
||||||
dval = res_ds.GetData()[0];
|
|
||||||
if (res_ds.HasAttribute("units"))
|
|
||||||
sstr = std::any_cast<std::string>(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<std::string>("/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<std::string>("/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<int>("/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<int>(count_ds.GetAttribute("t0_bin"));
|
|
||||||
if (count_ds.HasAttribute("first_good_bin"))
|
|
||||||
fgb = std::any_cast<int>(count_ds.GetAttribute("first_good_bin"));
|
|
||||||
if (count_ds.HasAttribute("last_good_bin"))
|
|
||||||
lgb = std::any_cast<int>(count_ds.GetAttribute("last_good_bin"));
|
|
||||||
if (count_ds.HasAttribute("number"))
|
|
||||||
noOfHistos = std::any_cast<int>(count_ds.GetAttribute("number"));
|
|
||||||
if (count_ds.HasAttribute("length"))
|
|
||||||
histoLength = std::any_cast<int>(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;
|
if ((idf != 1) && (idf != 2)) {
|
||||||
for (unsigned int i=0; i<noOfHistos; i++) {
|
std::cerr << std::endl << ">> PRunDataHandler::ReadNexusFile(): a NeXus file with an invalid IDF V" << idf << std::endl;
|
||||||
dataSet.Clear();
|
|
||||||
dataSet.SetHistoNo(i+1); // i.e. histo numbers start with 1
|
|
||||||
dataSet.SetTimeZeroBin(t0_bin);
|
|
||||||
dataSet.SetFirstGoodBin(fgb);
|
|
||||||
dataSet.SetLastGoodBin(lgb);
|
|
||||||
for (unsigned j=0; j<histoLength; j++)
|
|
||||||
data.push_back(count[i*histoLength+j]);
|
|
||||||
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 { // no data found
|
|
||||||
std::cerr << std::endl << "**ERROR** nxH4::PNeXus couldn't obtain data: '/run/histogram_data_1/counts' is missing." << std::endl;
|
|
||||||
return false;
|
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<std::string>("/run/lab").GetData()[0];
|
||||||
|
runData.SetLaboratory(sstr);
|
||||||
|
|
||||||
|
// get/set beamline
|
||||||
|
sstr = "n/a";
|
||||||
|
if (nxs_file->HasDataset("/run/beamline"))
|
||||||
|
sstr = nxs_file->GetDataset<std::string>("/run/beamline").GetData()[0];
|
||||||
|
runData.SetBeamline(sstr);
|
||||||
|
|
||||||
|
// get/set instrument
|
||||||
|
sstr = "n/a";
|
||||||
|
if (nxs_file->HasDataset("/run/instrument/name"))
|
||||||
|
sstr = nxs_file->GetDataset<std::string>("/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<std::string>("/run/title").GetData()[0];
|
||||||
|
runData.SetRunTitle(sstr);
|
||||||
|
|
||||||
|
// get/set run number
|
||||||
|
ival = -1;
|
||||||
|
if (nxs_file->HasDataset("/run/number"))
|
||||||
|
ival = nxs_file->GetDataset<int>("/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<float>("/run/sample/temperature");
|
||||||
|
dval = tmp_ds.GetData()[0];
|
||||||
|
if (tmp_ds.HasAttribute("units"))
|
||||||
|
sstr = std::any_cast<std::string>(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<float>("/run/sample/magnetic_field");
|
||||||
|
dval = mag_ds.GetData()[0];
|
||||||
|
if (mag_ds.HasAttribute("units"))
|
||||||
|
sstr = std::any_cast<std::string>(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<std::string>("/run/notes").GetData()[0];
|
||||||
|
runData.SetSetup(sstr);
|
||||||
|
|
||||||
|
// get/set sample
|
||||||
|
sstr = "n/a";
|
||||||
|
if (nxs_file->HasDataset("/run/sample/name"))
|
||||||
|
sstr = nxs_file->GetDataset<std::string>("/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<int>("/run/histogram_data_1/resolution");
|
||||||
|
dval = res_ds.GetData()[0];
|
||||||
|
if (res_ds.HasAttribute("units"))
|
||||||
|
sstr = std::any_cast<std::string>(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<std::string>("/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<std::string>("/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<int>("/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<int>(count_ds.GetAttribute("t0_bin"));
|
||||||
|
if (count_ds.HasAttribute("first_good_bin"))
|
||||||
|
fgb = std::any_cast<int>(count_ds.GetAttribute("first_good_bin"));
|
||||||
|
if (count_ds.HasAttribute("last_good_bin"))
|
||||||
|
lgb = std::any_cast<int>(count_ds.GetAttribute("last_good_bin"));
|
||||||
|
if (count_ds.HasAttribute("number"))
|
||||||
|
noOfHistos = std::any_cast<int>(count_ds.GetAttribute("number"));
|
||||||
|
if (count_ds.HasAttribute("length"))
|
||||||
|
histoLength = std::any_cast<int>(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<noOfHistos; i++) {
|
||||||
|
dataSet.Clear();
|
||||||
|
dataSet.SetHistoNo(i+1); // i.e. histo numbers start with 1
|
||||||
|
dataSet.SetTimeZeroBin(t0_bin);
|
||||||
|
dataSet.SetFirstGoodBin(fgb);
|
||||||
|
dataSet.SetLastGoodBin(lgb);
|
||||||
|
for (unsigned j=0; j<histoLength; j++)
|
||||||
|
data.push_back(count[i*histoLength+j]);
|
||||||
|
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 { // no data found
|
||||||
|
std::cerr << std::endl << "**ERROR** nxH4::PNeXus couldn't obtain data: '/run/histogram_data_1/counts' is missing." << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else { // HDF4 IDF V2
|
||||||
|
// not yet implemented
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else { // HDF5
|
} else { // HDF5
|
||||||
std::unique_ptr<nxH5::PNeXus> nxs_file = std::make_unique<nxH5::PNeXus>(fRunPathName.Data());
|
std::unique_ptr<nxH5::PNeXus> nxs_file = std::make_unique<nxH5::PNeXus>(fRunPathName.Data());
|
||||||
@@ -2405,13 +2424,31 @@ Bool_t PRunDataHandler::ReadNexusFile()
|
|||||||
std::cerr << std::endl << "**ERROR** allocation of nxH5::PNeXus object failed." << std::endl;
|
std::cerr << std::endl << "**ERROR** allocation of nxH5::PNeXus object failed." << std::endl;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check for IDF_version
|
||||||
|
if (nxs_file->HasDataset("/run/IDF_version")) {
|
||||||
|
idf = nxs_file->GetDataset<int>("/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<int>("/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
|
/* //as35
|
||||||
if (nxs_file->GetIdfVersion() == 1) {
|
|
||||||
|
|
||||||
// keep the information
|
|
||||||
fData.push_back(runData);
|
|
||||||
} else if (nxs_file->GetIdfVersion() == 2) {
|
} else if (nxs_file->GetIdfVersion() == 2) {
|
||||||
if (!nxs_file->IsValid()) {
|
if (!nxs_file->IsValid()) {
|
||||||
std::cout << std::endl << "**ERROR** invalid NeXus IDF 2 version file found." << std::endl;
|
std::cout << std::endl << "**ERROR** invalid NeXus IDF 2 version file found." << std::endl;
|
||||||
|
|||||||
Reference in New Issue
Block a user