/** * Loads the information contained in non-Spectra (ie, Text or Numeric) axis in the Nexus * file into the workspace. * @param local_workspace :: pointer to workspace object * @param data :: reference to the NeXuS data for the axis */ void LoadNexusProcessed::loadNonSpectraAxis(API::MatrixWorkspace_sptr local_workspace, NXData & data) { Mantid::API::Axis* axis = local_workspace->getAxis(1); if ( axis->isNumeric() ) { NXDouble axisData = data.openNXDouble("axis2"); axisData.load(); for ( int i = 0; i < static_cast<int>(axis->length()); i++ ) { axis->setValue(i, axisData[i]); } } else if ( axis->isText() ) { // We must cast the axis object to TextAxis so we may use ->setLabel Mantid::API::TextAxis* textAxis = dynamic_cast<Mantid::API::TextAxis*>(axis); NXChar axisData = data.openNXChar("axis2"); axisData.load(); std::string axisLabels = axisData(); // Use boost::tokenizer to split up the input boost::char_separator<char> sep("\n"); boost::tokenizer<boost::char_separator<char> > tokenizer(axisLabels, sep); boost::tokenizer<boost::char_separator<char> >::iterator tokIter; int i = 0; for ( tokIter = tokenizer.begin(); tokIter != tokenizer.end(); ++tokIter ) { textAxis->setLabel(i, *tokIter); ++i; } } }
/** * Creates the output workspace for this algorithm * @param inputWorkspace A parent workspace to initialize from. * @return A pointer to the output workspace. */ API::MatrixWorkspace_sptr Transpose::createOutputWorkspace( API::MatrixWorkspace_const_sptr inputWorkspace) { Mantid::API::Axis *yAxis = getVerticalAxis(inputWorkspace); const size_t oldNhist = inputWorkspace->getNumberHistograms(); const MantidVec &inX = inputWorkspace->readX(0); const size_t oldYlength = inputWorkspace->blocksize(); const size_t oldVerticalAxislength = yAxis->length(); // The input Y axis may be binned so the new X data should be too size_t newNhist(oldYlength), newXsize(oldVerticalAxislength), newYsize(oldNhist); MatrixWorkspace_sptr outputWorkspace = WorkspaceFactory::Instance().create( inputWorkspace, newNhist, newXsize, newYsize); // Create a new numeric axis for Y the same length as the old X array // Values come from input X API::NumericAxis *newYAxis(nullptr); if (inputWorkspace->isHistogramData()) { newYAxis = new API::BinEdgeAxis(inX); } else { newYAxis = new API::NumericAxis(inX); } newYAxis->unit() = inputWorkspace->getAxis(0)->unit(); outputWorkspace->getAxis(0)->unit() = inputWorkspace->getAxis(1)->unit(); outputWorkspace->replaceAxis(1, newYAxis); setProperty("OutputWorkspace", outputWorkspace); return outputWorkspace; }
/** * Creates the output workspace for this algorithm * @param inputWorkspace A parent workspace to initialize from. * @return A pointer to the output workspace. */ API::MatrixWorkspace_sptr Transpose::createOutputWorkspace( API::MatrixWorkspace_const_sptr inputWorkspace) { Mantid::API::Axis *yAxis = getVerticalAxis(inputWorkspace); const size_t oldNhist = inputWorkspace->getNumberHistograms(); const auto &inX = inputWorkspace->x(0); const size_t oldYlength = inputWorkspace->blocksize(); const size_t oldVerticalAxislength = yAxis->length(); // The input Y axis may be binned so the new X data should be too size_t newNhist(oldYlength), newXsize(oldVerticalAxislength), newYsize(oldNhist); MatrixWorkspace_sptr outputWorkspace = inputWorkspace->cloneEmpty(); outputWorkspace->initialize(newNhist, newXsize, newYsize); outputWorkspace->setTitle(inputWorkspace->getTitle()); outputWorkspace->setComment(inputWorkspace->getComment()); outputWorkspace->copyExperimentInfoFrom(inputWorkspace.get()); outputWorkspace->setYUnit(inputWorkspace->YUnit()); outputWorkspace->setYUnitLabel(inputWorkspace->YUnitLabel()); outputWorkspace->setDistribution(inputWorkspace->isDistribution()); // Create a new numeric axis for Y the same length as the old X array // Values come from input X API::NumericAxis *newYAxis(nullptr); if (inputWorkspace->isHistogramData()) { newYAxis = new API::BinEdgeAxis(inX.rawData()); } else { newYAxis = new API::NumericAxis(inX.rawData()); } newYAxis->unit() = inputWorkspace->getAxis(0)->unit(); outputWorkspace->getAxis(0)->unit() = inputWorkspace->getAxis(1)->unit(); outputWorkspace->replaceAxis(1, newYAxis); setProperty("OutputWorkspace", outputWorkspace); return outputWorkspace; }
/** Checks that the axis stated * @param value :: The workspace to test * @return A message for users with negative results, otherwise "" */ std::string SpectraAxisValidator::checkValidity(const MatrixWorkspace_sptr &value) const { Mantid::API::Axis *axis = value->getAxis(m_axisNumber); if (axis->isSpectra()) return ""; else return "A workspace with axis being Spectra Number is required here."; }
/** Checks that the axis stated * @param value :: The workspace to test * @return A message for users with negative results, otherwise "" */ std::string SpectraAxisValidator::checkValidity(const MatrixWorkspace_sptr &value) const { Mantid::API::Axis *axis; try { axis = value->getAxis(m_axisNumber); } catch (Kernel::Exception::IndexError &) { return "No axis at index " + std::to_string(m_axisNumber) + " available in the workspace"; } if (axis->isSpectra()) return ""; else return "A workspace with axis being Spectra Number is required here."; }