From a9ab22340dfc7c765b4822beb6b7f468d0b70300 Mon Sep 17 00:00:00 2001 From: Anton Piccardo-Selg <anton.piccardo-selg@tessella.com> Date: Thu, 29 Oct 2015 13:43:24 +0000 Subject: [PATCH] Refs #13458 Add x error to load nexus processed --- .../MantidDataHandling/LoadNexusProcessed.h | 3 + .../DataHandling/src/LoadNexusProcessed.cpp | 80 ++++++++++++++++--- Framework/Nexus/src/NexusFileIO.cpp | 37 +++++---- 3 files changed, 94 insertions(+), 26 deletions(-) diff --git a/Framework/DataHandling/inc/MantidDataHandling/LoadNexusProcessed.h b/Framework/DataHandling/inc/MantidDataHandling/LoadNexusProcessed.h index 7dc11e6e2e8..1d6da5f86a7 100644 --- a/Framework/DataHandling/inc/MantidDataHandling/LoadNexusProcessed.h +++ b/Framework/DataHandling/inc/MantidDataHandling/LoadNexusProcessed.h @@ -165,6 +165,7 @@ private: void loadBlock(Mantid::NeXus::NXDataSetTyped<double> &data, Mantid::NeXus::NXDataSetTyped<double> &errors, Mantid::NeXus::NXDataSetTyped<double> &farea, bool hasFArea, + Mantid::NeXus::NXDouble &xErrors, bool hasXErrors, int64_t blocksize, int64_t nchannels, int64_t &hist, API::MatrixWorkspace_sptr local_workspace); @@ -173,12 +174,14 @@ private: void loadBlock(Mantid::NeXus::NXDataSetTyped<double> &data, Mantid::NeXus::NXDataSetTyped<double> &errors, Mantid::NeXus::NXDataSetTyped<double> &farea, bool hasFArea, + Mantid::NeXus::NXDouble &xErrors, bool hasXErrors, int64_t blocksize, int64_t nchannels, int64_t &hist, int64_t &wsIndex, API::MatrixWorkspace_sptr local_workspace); /// Load a block of data into the workspace void loadBlock(Mantid::NeXus::NXDataSetTyped<double> &data, Mantid::NeXus::NXDataSetTyped<double> &errors, Mantid::NeXus::NXDataSetTyped<double> &farea, bool hasFArea, + Mantid::NeXus::NXDouble &xErrors, bool hasXErrors, Mantid::NeXus::NXDouble &xbins, int64_t blocksize, int64_t nchannels, int64_t &hist, int64_t &wsIndex, API::MatrixWorkspace_sptr local_workspace); diff --git a/Framework/DataHandling/src/LoadNexusProcessed.cpp b/Framework/DataHandling/src/LoadNexusProcessed.cpp index f3ced906479..cb61f6a3b65 100644 --- a/Framework/DataHandling/src/LoadNexusProcessed.cpp +++ b/Framework/DataHandling/src/LoadNexusProcessed.cpp @@ -1293,6 +1293,11 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry( fracarea = wksp_cls.openNXDouble("frac_area"); } + // Check for x errors; as with fracArea we set it to xbins + // although in this case it would never be used. + auto hasXErrors = wksp_cls.isValid("xerrors"); + NXDouble &xErrors = hasXErrors ? wksp_cls.openNXDouble("xerrors") : xbins; + int64_t blocksize(8); // const int fullblocks = nspectra / blocksize; // size of the workspace @@ -1325,12 +1330,12 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry( progressScaler * static_cast<double>(hist_index) / static_cast<double>(read_stop), "Reading workspace data..."); - loadBlock(data, errors, fracarea, hasFracArea, blocksize, nchannels, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, blocksize, nchannels, hist_index, wsIndex, local_workspace); } int64_t finalblock = m_spec_max - 1 - read_stop; if (finalblock > 0) { - loadBlock(data, errors, fracarea, hasFracArea, finalblock, nchannels, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, finalblock, nchannels, hist_index, wsIndex, local_workspace); } } @@ -1344,7 +1349,7 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry( progressScaler * static_cast<double>(specIndex) / static_cast<double>(m_spec_list.size()), "Reading workspace data..."); - loadBlock(data, errors, fracarea, hasFracArea, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, static_cast<int64_t>(1), nchannels, specIndex, wsIndex, local_workspace); } @@ -1355,12 +1360,12 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry( progressScaler * static_cast<double>(hist_index) / static_cast<double>(read_stop), "Reading workspace data..."); - loadBlock(data, errors, fracarea, hasFracArea, blocksize, nchannels, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, blocksize, nchannels, hist_index, wsIndex, local_workspace); } int64_t finalblock = total_specs - read_stop; if (finalblock > 0) { - loadBlock(data, errors, fracarea, hasFracArea, finalblock, nchannels, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, finalblock, nchannels, hist_index, wsIndex, local_workspace); } } @@ -1383,12 +1388,12 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry( progressScaler * static_cast<double>(hist_index) / static_cast<double>(read_stop), "Reading workspace data..."); - loadBlock(data, errors, fracarea, hasFracArea, xbins, blocksize, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, blocksize, nchannels, hist_index, wsIndex, local_workspace); } int64_t finalblock = m_spec_max - 1 - read_stop; if (finalblock > 0) { - loadBlock(data, errors, fracarea, hasFracArea, xbins, finalblock, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, finalblock, nchannels, hist_index, wsIndex, local_workspace); } } @@ -1401,7 +1406,7 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry( progressScaler * static_cast<double>(specIndex) / static_cast<double>(read_stop), "Reading workspace data..."); - loadBlock(data, errors, fracarea, hasFracArea, xbins, 1, nchannels, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, 1, nchannels, specIndex, wsIndex, local_workspace); } } @@ -1411,12 +1416,12 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry( progressScaler * static_cast<double>(hist_index) / static_cast<double>(read_stop), "Reading workspace data..."); - loadBlock(data, errors, fracarea, hasFracArea, xbins, blocksize, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, blocksize, nchannels, hist_index, wsIndex, local_workspace); } int64_t finalblock = total_specs - read_stop; if (finalblock > 0) { - loadBlock(data, errors, fracarea, hasFracArea, xbins, finalblock, + loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, finalblock, nchannels, hist_index, wsIndex, local_workspace); } } @@ -1812,6 +1817,8 @@ void LoadNexusProcessed::readBinMasking( * @param errors :: The NXDataSet object of error values * @param farea :: The NXDataSet object of fraction area values * @param hasFArea :: Flag to signal a RebinnedOutput workspace is in use + * @param xErrors :: The NXDataSet object of xError values + * @param hasXErrors :: Flag to signal the File contains x errors * @param blocksize :: The blocksize to use * @param nchannels :: The number of channels for the block * @param hist :: The workspace index to start reading into @@ -1820,6 +1827,7 @@ void LoadNexusProcessed::readBinMasking( void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, NXDataSetTyped<double> &errors, NXDataSetTyped<double> &farea, bool hasFArea, + NXDouble &xErrors, bool hasXErrors, int64_t blocksize, int64_t nchannels, int64_t &hist, API::MatrixWorkspace_sptr local_workspace) { @@ -1831,6 +1839,9 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, double *err_end = err_start + nchannels; double *farea_start = NULL; double *farea_end = NULL; + const int64_t nxbins(m_xbins->size()); + double *xErrors_start = NULL; + double *xErrors_end = NULL; RebinnedOutput_sptr rb_workspace; if (hasFArea) { farea.load(static_cast<int>(blocksize), static_cast<int>(hist)); @@ -1838,6 +1849,12 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, farea_end = farea_start + nchannels; rb_workspace = boost::dynamic_pointer_cast<RebinnedOutput>(local_workspace); } + if (hasXErrors) { + xErrors.load(static_cast<int>(blocksize), static_cast<int>(hist)); + xErrors_start = xErrors(); + xErrors_end = xErrors_start + nxbins; + } + int64_t final(hist + blocksize); while (hist < final) { MantidVec &Y = local_workspace->dataY(hist); @@ -1854,6 +1871,13 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, farea_start += nchannels; farea_end += nchannels; } + if (hasXErrors) { + MantidVec &DX = local_workspace->dataDx(hist); + DX.assign(xErrors_start, xErrors_end); + xErrors_start += nxbins; + xErrors_end += nxbins; + } + local_workspace->setX(hist, m_xbins); ++hist; } @@ -1868,6 +1892,8 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, * @param errors :: The NXDataSet object of error values * @param farea :: The NXDataSet object of fraction area values * @param hasFArea :: Flag to signal a RebinnedOutput workspace is in use + * @param xErrors :: The NXDataSet object of xError values + * @param hasXErrors :: Flag to signal the File contains x errors * @param blocksize :: The blocksize to use * @param nchannels :: The number of channels for the block * @param hist :: The workspace index to start reading into @@ -1878,6 +1904,7 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, NXDataSetTyped<double> &errors, NXDataSetTyped<double> &farea, bool hasFArea, + NXDouble &xErrors, bool hasXErrors, int64_t blocksize, int64_t nchannels, int64_t &hist, int64_t &wsIndex, API::MatrixWorkspace_sptr local_workspace) { @@ -1889,6 +1916,9 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, double *err_end = err_start + nchannels; double *farea_start = NULL; double *farea_end = NULL; + const int64_t nxbins(m_xbins->size()); + double *xErrors_start = NULL; + double *xErrors_end = NULL; RebinnedOutput_sptr rb_workspace; if (hasFArea) { farea.load(static_cast<int>(blocksize), static_cast<int>(hist)); @@ -1896,6 +1926,12 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, farea_end = farea_start + nchannels; rb_workspace = boost::dynamic_pointer_cast<RebinnedOutput>(local_workspace); } + if (hasXErrors) { + xErrors.load(static_cast<int>(blocksize), static_cast<int>(hist)); + xErrors_start = xErrors(); + xErrors_end = xErrors_start + nxbins; + } + int64_t final(hist + blocksize); while (hist < final) { MantidVec &Y = local_workspace->dataY(wsIndex); @@ -1912,6 +1948,12 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, farea_start += nchannels; farea_end += nchannels; } + if (hasXErrors) { + MantidVec &DX = local_workspace->dataDx(wsIndex); + DX.assign(xErrors_start, xErrors_end); + xErrors_start += nxbins; + xErrors_end += nxbins; + } local_workspace->setX(wsIndex, m_xbins); ++hist; ++wsIndex; @@ -1927,6 +1969,8 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, * @param errors :: The NXDataSet object of error values * @param farea :: The NXDataSet object of fraction area values * @param hasFArea :: Flag to signal a RebinnedOutput workspace is in use + * @param xErrors :: The NXDataSet object of xError values + * @param hasXErrors :: Flag to signal the File contains x errors * @param xbins :: The xbin NXDataSet * @param blocksize :: The blocksize to use * @param nchannels :: The number of channels for the block @@ -1937,6 +1981,7 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, NXDataSetTyped<double> &errors, NXDataSetTyped<double> &farea, bool hasFArea, + NXDouble &xErrors, bool hasXErrors, NXDouble &xbins, int64_t blocksize, int64_t nchannels, int64_t &hist, int64_t &wsIndex, @@ -1949,6 +1994,8 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, double *err_end = err_start + nchannels; double *farea_start = NULL; double *farea_end = NULL; + double *xErrors_start = NULL; + double *xErrors_end = NULL; RebinnedOutput_sptr rb_workspace; if (hasFArea) { farea.load(static_cast<int>(blocksize), static_cast<int>(hist)); @@ -1961,6 +2008,13 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, double *xbin_start = xbins(); double *xbin_end = xbin_start + nxbins; int64_t final(hist + blocksize); + + if (hasXErrors) { + xErrors.load(static_cast<int>(blocksize), static_cast<int>(hist)); + xErrors_start = xErrors(); + xErrors_end = xErrors_start + nxbins; + } + while (hist < final) { MantidVec &Y = local_workspace->dataY(wsIndex); Y.assign(data_start, data_end); @@ -1976,6 +2030,12 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data, farea_start += nchannels; farea_end += nchannels; } + if (hasXErrors) { + MantidVec &DX = local_workspace->dataDx(wsIndex); + DX.assign(xErrors_start, xErrors_end); + xErrors_start += nxbins; + xErrors_end += nxbins; + } MantidVec &X = local_workspace->dataX(wsIndex); X.assign(xbin_start, xbin_end); xbin_start += nxbins; diff --git a/Framework/Nexus/src/NexusFileIO.cpp b/Framework/Nexus/src/NexusFileIO.cpp index 8f8ba1d825b..7774e62dcd9 100644 --- a/Framework/Nexus/src/NexusFileIO.cpp +++ b/Framework/Nexus/src/NexusFileIO.cpp @@ -376,22 +376,6 @@ int NexusFileIO::writeNexusProcessedData2D( start[0]++; } - // Potentially x error - if (localworkspace->hasDx(0)) { - name = "xerrors"; - NXcompmakedata(fileID, name.c_str(), NX_FLOAT64, 2, dims_array, - m_nexuscompression, asize); - NXopendata(fileID, name.c_str()); - start[0] = 0; - for (size_t i = 0; i < nSpect; i++) { - int s = spec[i]; - NXputslab(fileID, reinterpret_cast<void *>(const_cast<double *>( - &(localworkspace->readDx(s)[0]))), - start, asize); - start[0]++; - } - } - if (m_progress != 0) m_progress->reportIncrement(1, "Writing data"); @@ -425,6 +409,7 @@ int NexusFileIO::writeNexusProcessedData2D( NXopendata(fileID, "axis1"); NXputdata(fileID, reinterpret_cast<void *>(const_cast<double *>( &(localworkspace->readX(0)[0])))); + } else { dims_array[0] = static_cast<int>(nSpect); dims_array[1] = static_cast<int>(localworkspace->readX(0).size()); @@ -439,6 +424,26 @@ int NexusFileIO::writeNexusProcessedData2D( start[0]++; } } + + // Potentially x error + if (localworkspace->hasDx(0)) { + dims_array[0] = static_cast<int>(nSpect); + dims_array[1] = static_cast<int>(localworkspace->readX(0).size()); + std::string dxErrorName = "xerrors"; + NXcompmakedata(fileID, dxErrorName.c_str(), NX_FLOAT64, 2, dims_array, + m_nexuscompression, asize); + NXopendata(fileID, dxErrorName.c_str()); + start[0] = 0; + asize[1] = dims_array[1]; + for (size_t i = 0; i < nSpect; i++) { + int s = spec[i]; + NXputslab(fileID, reinterpret_cast<void *>(const_cast<double *>( + &(localworkspace->readDx(s)[0]))), + start, asize); + start[0]++; + } + } + std::string dist = (localworkspace->isDistribution()) ? "1" : "0"; NXputattr(fileID, "distribution", reinterpret_cast<void *>(const_cast<char *>(dist.c_str())), 2, -- GitLab