51 throw std::runtime_error(
"InputWorkspace is not a MDHistoWorkspace");
52 if (ws->getNumDims() != 3)
53 throw std::runtime_error(
"InputWorkspace must have 3 dimensions (having "
54 "one bin in the 3rd dimension is OK).");
56 if (ws->getDimension(0)->getName() !=
"[H,0,0]")
57 g_log.
warning() <<
"SaveZODS expects the workspace to be in HKL space! "
65 file->makeGroup(
"CoordinateSystem",
"NXgroup",
true);
66 file->putAttr(
"isLocal", isLocal);
68 if (ws->getNumExperimentInfo() > 0) {
71 if (ei->sample().hasOrientedLattice()) {
72 std::vector<double> unitCell;
74 unitCell.emplace_back(latt.
a());
75 unitCell.emplace_back(latt.
b());
76 unitCell.emplace_back(latt.
c());
77 unitCell.emplace_back(latt.
alpha());
78 unitCell.emplace_back(latt.
beta());
79 unitCell.emplace_back(latt.
gamma());
83 file->writeData(
"unit_cell", unitCell, unit_cell_size);
90 uint64_t numPoints = ws->getNPoints();
92 file->makeGroup(
"Data",
"NXgroup",
true);
93 file->makeGroup(
"Data_0",
"NXgroup",
true);
96 std::vector<double> origin(3, 0.0);
103 std::vector<int> size_field(3, 0);
106 for (
size_t d = 0;
d < 3;
d++) {
108 std::vector<double> direction(3, 0.0);
109 direction[
d] = dim->getBinWidth();
111 origin[
d] = dim->getMinimum() + dim->getBinWidth() / 2;
113 size[2 -
d] = int(dim->getNBins());
115 size_field[
d] = int(dim->getNBins());
118 file->writeData(
"origin", origin);
119 file->writeData(
"size", size_field);
122 const auto signal = ws->getSignalArray();
123 std::vector<double> data;
125 for (
int i = 0; i < size_field[0]; i++)
126 for (
int j = 0; j < size_field[1]; j++)
127 for (
int k = 0; k < size_field[2]; k++) {
128 int l = i + size_field[0] * j + size_field[0] * size_field[1] * k;
129 data.emplace_back(signal[l]);
132 file->writeData(
"Data", data, size);
135 const auto errorSquared = ws->getErrorSquaredArray();
136 std::vector<double>
sigma;
137 sigma.reserve(numPoints);
138 for (
int i = 0; i < size_field[0]; i++)
139 for (
int j = 0; j < size_field[1]; j++)
140 for (
int k = 0; k < size_field[2]; k++) {
141 int l = i + size_field[0] * j + size_field[0] * size_field[1] * k;
142 sigma.emplace_back(sqrt(errorSquared[l]));
144 file->writeData(
"sigma",
sigma, size);