/** Constructor * * @param workspace :: IMDWorkspace to plot * @param logScale :: true to plot Y in log scale * @param start :: start point in N-dimensions of the line * @param end :: end point in N-dimensions of the line * @param normalize :: method for normalizing the line * @param isDistribution :: is this a distribution (divide by bin width?) * @return */ MantidQwtIMDWorkspaceData::MantidQwtIMDWorkspaceData(Mantid::API::IMDWorkspace_const_sptr workspace, const bool logScale, Mantid::Kernel::VMD start, Mantid::Kernel::VMD end, Mantid::API::MDNormalization normalize, bool isDistribution) : m_workspace(workspace), m_logScale(logScale), m_minPositive(0), m_preview(false), m_start(start), m_end(end), m_normalization(normalize), m_isDistribution(isDistribution), m_transform(NULL), m_plotAxis(PlotDistance), m_currentPlotAxis(PlotDistance) { if (start.getNumDims() == 1 && end.getNumDims() == 1) { if (start[0] == 0.0 && end[0] == 0.0) { // Default start and end. Find the limits Mantid::Geometry::VecIMDDimension_const_sptr nonIntegDims = m_workspace->getNonIntegratedDimensions(); std::string alongDim = ""; if (!nonIntegDims.empty()) alongDim = nonIntegDims[0]->getName(); else alongDim = m_workspace->getDimension(0)->getName(); size_t nd = m_workspace->getNumDims(); m_start = VMD(nd); m_end = VMD(nd); for (size_t d=0; d<nd; d++) { IMDDimension_const_sptr dim = m_workspace->getDimension(d); if (dim->getDimensionId() == alongDim) { // All the way through in the single dimension m_start[d] = dim->getMinimum(); m_end[d] = dim->getMaximum(); } else { // Mid point along each dimension m_start[d] = (dim->getMaximum() + dim->getMinimum()) / 2.0f; m_end[d] = m_start[d]; } } } } // Unit direction of the line m_dir = m_end - m_start; m_dir.normalize(); // And cache the X/Y values this->cacheLinePlot(); }
/** * Make 1D MatrixWorkspace */ void ConvertMDHistoToMatrixWorkspace::make1DWorkspace() { IMDHistoWorkspace_sptr inputWorkspace = getProperty("InputWorkspace"); // This code is copied from MantidQwtIMDWorkspaceData Mantid::Geometry::VecIMDDimension_const_sptr nonIntegDims = inputWorkspace->getNonIntegratedDimensions(); std::string alongDim = ""; if (!nonIntegDims.empty()) alongDim = nonIntegDims[0]->getDimensionId(); else alongDim = inputWorkspace->getDimension(0)->getDimensionId(); size_t nd = inputWorkspace->getNumDims(); Mantid::Kernel::VMD start = VMD(nd); Mantid::Kernel::VMD end = VMD(nd); size_t id = 0; for (size_t d = 0; d < nd; d++) { Mantid::Geometry::IMDDimension_const_sptr dim = inputWorkspace->getDimension(d); if (dim->getDimensionId() == alongDim) { // All the way through in the single dimension start[d] = dim->getMinimum(); end[d] = dim->getMaximum(); id = d; // We take the first non integrated dimension to be the diemnsion // of interest. } else { // Mid point along each dimension start[d] = (dim->getMaximum() + dim->getMinimum()) / 2.0f; end[d] = start[d]; } } // Unit direction of the line Mantid::Kernel::VMD dir = end - start; dir.normalize(); std::string normProp = getPropertyValue("Normalization"); Mantid::API::MDNormalization normalization; if (normProp == "NoNormalization") { normalization = NoNormalization; } else if (normProp == "VolumeNormalization") { normalization = VolumeNormalization; } else if (normProp == "NumEventsNormalization") { normalization = NumEventsNormalization; } else { normalization = NoNormalization; } auto line = inputWorkspace->getLineData(start, end, normalization); MatrixWorkspace_sptr outputWorkspace = WorkspaceFactory::Instance().create( "Workspace2D", 1, line.x.size(), line.y.size()); outputWorkspace->dataY(0).assign(line.y.begin(), line.y.end()); outputWorkspace->dataE(0).assign(line.e.begin(), line.e.end()); const size_t numberTransformsToOriginal = inputWorkspace->getNumberTransformsToOriginal(); CoordTransform_const_sptr transform = boost::make_shared<NullCoordTransform>(inputWorkspace->getNumDims()); if (numberTransformsToOriginal > 0) { const size_t indexToLastTransform = numberTransformsToOriginal - 1; transform = CoordTransform_const_sptr( inputWorkspace->getTransformToOriginal(indexToLastTransform), NullDeleter()); } assert(line.x.size() == outputWorkspace->dataX(0).size()); std::string xAxisLabel = inputWorkspace->getDimension(id)->getName(); const bool autoFind = this->getProperty("FindXAxis"); if (autoFind) { // We look to the original workspace if possbible to find the dimension of // interest to plot against. id = findXAxis(start, end, transform.get(), inputWorkspace.get(), g_log, id, xAxisLabel); } for (size_t i = 0; i < line.x.size(); ++i) { // Coordinates in the workspace being plotted VMD wsCoord = start + dir * line.x[i]; VMD inTargetCoord = transform->applyVMD(wsCoord); outputWorkspace->dataX(0)[i] = inTargetCoord[id]; } boost::shared_ptr<Kernel::Units::Label> labelX = boost::dynamic_pointer_cast<Kernel::Units::Label>( Kernel::UnitFactory::Instance().create("Label")); labelX->setLabel(xAxisLabel); outputWorkspace->getAxis(0)->unit() = labelX; outputWorkspace->setYUnitLabel("Signal"); setProperty("OutputWorkspace", outputWorkspace); }