Mantid
Loading...
Searching...
No Matches
NXcanSASUtil.cpp
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2025 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
8
9#include "MantidAPI/Axis.h"
13#include "MantidNexus/H5Util.h"
14
15using namespace Mantid::API;
16using namespace Mantid::Nexus;
17
19
20// Prepares size and shape vectors and variables for data to be stored in file
22 const std::optional<std::pair<size_t, size_t>> &spinVecSize)
23 : DataDimensions(static_cast<hsize_t>(workspace->blocksize()),
24 static_cast<hsize_t>(workspace->getNumberHistograms()), spinVecSize) {}
25
26DataDimensions::DataDimensions(const hsize_t numberOfPoints, const hsize_t numberOfHistograms,
27 const std::optional<std::pair<size_t, size_t>> &spinVecSize)
28 : m_numberOfPoints(numberOfPoints), m_numberOfHistograms(numberOfHistograms),
29 m_dataShape(std::vector<hsize_t>({m_numberOfPoints})), m_slabShape(std::vector<hsize_t>({m_numberOfPoints})) {
30 if (m_numberOfHistograms > 1) {
31 m_dataShape.insert(m_dataShape.cbegin(), m_numberOfHistograms);
32 m_slabShape.insert(m_slabShape.cbegin(), 1);
33 }
34 // If data is polarized only
35 if (spinVecSize.has_value()) {
36 const auto &[PinSize, PoutSize] = *spinVecSize;
37 m_dataShape.insert(m_dataShape.cbegin(), {PinSize, PoutSize});
38 m_slabShape.insert(m_slabShape.cbegin(), {1, 1});
39 }
40
41 m_dataSpace = H5::DataSpace(static_cast<int>(m_dataShape.size()), m_dataShape.data());
42 m_dataType = H5::DataType(H5Util::getType<double>());
43}
44
47const std::vector<hsize_t> &DataDimensions::getDataShape() const { return m_dataShape; }
48const std::vector<hsize_t> &DataDimensions::getSlabShape() const { return m_slabShape; }
49const H5::DataSpace &DataDimensions::getDataSpace() const { return m_dataSpace; }
50const H5::DataType &DataDimensions::getDataType() const { return m_dataType; }
51
52std::string InstrumentNameInfo::getInstrumentNameFromFile(const H5::Group &entry) {
53 // Get instrument name
54 const auto instrument = entry.openGroup(sasInstrumentGroupName);
55 return H5Util::readString(instrument, sasInstrumentName);
56}
57
58std::string InstrumentNameInfo::getIdfFromFile(const std::string &instrumentName) {
59 std::string idf;
60 try {
62 } catch (std::runtime_error &) {
63 return "";
64 }
65 return idf;
66}
67
69 : instrumentName(getInstrumentNameFromFile(entry)), idf(getIdfFromFile(instrumentName)) {}
70
71SpinVectorBuilder::SpinVectorBuilder(const std::vector<std::string> &spinStateStr) : spinVec(spinStateStr) {
72 // If there is polarized data, we set the default state vector as -1,1 and then arrange workspaces accordingly
73 // when storing the polarized data set.
74 const auto stateVector = std::vector<int>({-1, 1});
75 if (spinStateStr.size() == 4) {
76 pIn = stateVector;
77 pOut = stateVector;
78 } else if (spinStateStr.size() == 2) {
79 if (spinStateStr.begin()->starts_with("0")) {
80 pIn = std::vector<int>(1, 0);
81 pOut = stateVector;
82 } else {
83 pIn = stateVector;
84 pOut = std::vector<int>(1, 0);
85 }
86 }
87}
88
89DataSpaceInformation getDataSpaceInfo(const H5::DataSet &dataSet) {
90 DataSpaceInformation dataSpaceInfo;
91 const auto dataSpace = dataSet.getSpace();
92 const auto rank = dataSpace.getSimpleExtentNdims();
93 auto dims = std::vector<hsize_t>(rank);
94 dataSpace.getSimpleExtentDims(dims.data());
95 switch (rank) {
96 case 1:
97 dataSpaceInfo.dimSpectrumAxis = 1;
98 dataSpaceInfo.dimBin = dims[0];
99 break;
100 case 2:
101 dataSpaceInfo.dimSpectrumAxis = dims[0];
102 dataSpaceInfo.dimBin = dims[1];
103 break;
104 case 3:
105 dataSpaceInfo.spinStates = dims[0] * dims[1];
106 dataSpaceInfo.dimSpectrumAxis = 1;
107 dataSpaceInfo.dimBin = dims[2];
108 break;
109 case 4:
110 dataSpaceInfo.spinStates = dims[0] * dims[1];
111 dataSpaceInfo.dimSpectrumAxis = dims[2];
112 dataSpaceInfo.dimBin = dims[3];
113 break;
114 default:
115 throw std::invalid_argument("LoadNXcanSAS:: Cannot load a data set with " + std::to_string(rank) + " m_dataDims.");
116 }
117 return dataSpaceInfo;
118}
119
126 const auto numberOfHists = workspace->getNumberHistograms();
127 return static_cast<WorkspaceDimensionality>(numberOfHists > 1 ? 2 : numberOfHists);
128}
129
130} // namespace Mantid::DataHandling::NXcanSAS
IPeaksWorkspace_sptr workspace
uint64_t hsize_t
static std::string getInstrumentFilename(const std::string &instrumentName, const std::string &date="")
Get the IDF using the instrument name and date.
const H5::DataSpace & getDataSpace() const
DataDimensions(const hsize_t numberOfPoints, const hsize_t numberOfHistograms, const std::optional< std::pair< size_t, size_t > > &spinVecSize=std::nullopt)
const std::vector< hsize_t > & getSlabShape() const
const std::vector< hsize_t > & getDataShape() const
std::shared_ptr< MatrixWorkspace > MatrixWorkspace_sptr
shared pointer to the matrix workspace base class
DataSpaceInformation getDataSpaceInfo(const H5::DataSet &dataSet)
WorkspaceDimensionality getWorkspaceDimensionality(const Mantid::API::MatrixWorkspace_sptr &workspace)
Retrieves workspace dimensionality enum value: oneD , twoD, other (error)
MANTID_NEXUS_DLL std::string readString(H5::H5File &file, const std::string &address)
Definition H5Util.cpp:266
MANTID_NEXUS_DLL DataType getType< double >()
Definition H5Util.cpp:40
Header for a base Nexus::Exception.
STL namespace.
std::string to_string(const wide_integer< Bits, Signed > &n)
static std::string getIdfFromFile(const std::string &instrumentName)
static std::string getInstrumentNameFromFile(const H5::Group &entry)
SpinVectorBuilder(const std::vector< std::string > &spinStateStr)