/** * Writes a single workspace into the file * @param workspace the workspace to get data from * @param nxFile the nexus file to save data into */ void SaveNXTomo::writeSingleWorkspace(const Workspace2D_sptr workspace, ::NeXus::File &nxFile) { try { nxFile.openPath("/entry1/tomo_entry/data"); } catch (...) { throw std::runtime_error("Unable to create a valid NXTomo file"); } int numFiles = 0; nxFile.getAttr<int>("NumFiles", numFiles); // Change slab start to after last data position m_slabStart[0] = numFiles; m_slabSize[0] = 1; // Set the rotation value for this WS std::vector<double> rotValue; rotValue.push_back(0); if (workspace->run().hasProperty("Rotation")) { std::string tmpVal = workspace->run().getLogData("Rotation")->value(); try { rotValue[0] = boost::lexical_cast<double>(tmpVal); } catch (...) { } // Invalid Cast is handled below } nxFile.openData("rotation_angle"); nxFile.putSlab(rotValue, numFiles, 1); nxFile.closeData(); // Copy data out, remake data with dimension of old size plus new elements. // Insert previous data. nxFile.openData("data"); double *dataArr = new double[m_spectraCount]; for (int64_t i = 0; i < m_dimensions[1]; ++i) { for (int64_t j = 0; j < m_dimensions[2]; ++j) { dataArr[i * m_dimensions[1] + j] = workspace->dataY(i * m_dimensions[1] + j)[0]; } } nxFile.putSlab(dataArr, m_slabStart, m_slabSize); nxFile.closeData(); nxFile.putAttr("NumFiles", numFiles + 1); nxFile.closeGroup(); // Write additional log information, intensity and image key writeLogValues(workspace, nxFile, numFiles); writeIntensityValue(workspace, nxFile, numFiles); writeImageKeyValue(workspace, nxFile, numFiles); ++numFiles; delete[] dataArr; }