26template <
typename T,
typename... Ts> std::vector<T, Ts...> repeat(std::vector<T, Ts...>
const &
vec, std::size_t
n) {
27 std::vector<T, Ts...> result;
28 result.reserve(
vec.size() *
n);
30 result.insert(result.end(),
vec.begin(),
vec.end());
34template <
typename T> std::vector<T> getIncrementingSequence(
const T &from, std::size_t length) {
35 std::vector<T> sequence(length);
36 std::iota(sequence.begin(), sequence.end(), from);
40std::vector<std::string> appendSuffix(std::vector<std::string>
const &
vec, std::string
const &suffix) {
41 std::vector<std::string> appended;
42 appended.reserve(
vec.size());
43 std::transform(
vec.cbegin(),
vec.cend(), std::back_inserter(appended),
44 [&suffix](
auto &&str) { return str + suffix; });
49 std::vector<double>
const &e,
int numberOfSpectra,
50 std::vector<std::string>
const &verticalAxisNames, std::string
const &unitX) {
51 auto createWorkspaceAlgorithm = AlgorithmManager::Instance().createUnmanaged(
"CreateWorkspace");
52 createWorkspaceAlgorithm->initialize();
53 createWorkspaceAlgorithm->setChild(
true);
54 createWorkspaceAlgorithm->setLogging(
false);
55 createWorkspaceAlgorithm->setProperty(
"DataX",
x);
56 createWorkspaceAlgorithm->setProperty(
"DataY",
y);
57 createWorkspaceAlgorithm->setProperty(
"DataE", e);
58 createWorkspaceAlgorithm->setProperty(
"NSpec", numberOfSpectra);
59 createWorkspaceAlgorithm->setProperty(
"VerticalAxisUnit",
"Text");
60 createWorkspaceAlgorithm->setProperty(
"VerticalAxisValues", verticalAxisNames);
61 createWorkspaceAlgorithm->setProperty(
"UnitX", unitX);
62 createWorkspaceAlgorithm->setProperty(
"OutputWorkspace",
"__created");
63 createWorkspaceAlgorithm->execute();
64 return createWorkspaceAlgorithm->getProperty(
"OutputWorkspace");
67template <
typename T,
typename OutputIterator>
68void extractColumnValues(
Column const &column, std::size_t startRow, std::size_t endRow, OutputIterator outputIt) {
69 for (
auto i = startRow; i <= endRow; ++i)
70 *outputIt++ = column.
cell<T>(i);
73template <
typename T,
typename OutputIterator>
74void extractValuesFromColumns(std::size_t startRow, std::size_t endRow,
const std::vector<Column_const_sptr> &columns,
75 OutputIterator outputIt) {
76 for (
auto &&column : columns)
77 extractColumnValues<T>(*column, startRow, endRow, outputIt);
80template <
typename T> std::vector<T> getColumnValues(
Column const &column, std::size_t startRow, std::size_t endRow) {
81 std::vector<T> values;
82 values.reserve(1 + (endRow - startRow));
83 extractColumnValues<T>(column, startRow, endRow, std::back_inserter(values));
87std::vector<double> getNumericColumnValuesOrIndices(
Column const &column, std::size_t startRow, std::size_t endRow) {
88 auto const length = startRow > endRow ? 0 : 1 + endRow - startRow;
90 return getColumnValues<double>(column, startRow, endRow);
91 return getIncrementingSequence(0.0, length);
94std::string getColumnName(
const Column_const_sptr &column) {
return column->name(); }
96std::vector<std::string> extractColumnNames(std::vector<Column_const_sptr>
const &columns) {
97 std::vector<std::string> names;
98 names.reserve(columns.size());
99 std::transform(columns.begin(), columns.end(), std::back_inserter(names), getColumnName);
103template <
typename ColumnFilter>
104std::vector<Column_const_sptr> extractColumns(
ITableWorkspace const *table, ColumnFilter
const &filter) {
105 std::vector<Column_const_sptr> columns;
109 columns.emplace_back(column);
114struct TableToMatrixWorkspaceConverter {
115 template <
typename YFilter,
typename EFilter>
116 TableToMatrixWorkspaceConverter(
ITableWorkspace const *table, std::vector<double>
x, YFilter
const &yFilter,
117 EFilter
const &eFilter)
118 : m_x(
std::move(
x)), m_yColumns(extractColumns(table, yFilter)), m_eColumns(extractColumns(table, eFilter)),
119 m_yAxis(extractColumnNames(m_yColumns)) {}
121 MatrixWorkspace_sptr operator()(std::size_t startRow, std::size_t endRow, std::string
const &unitX,
122 bool includeChiSquared)
const {
123 auto const x = repeat(m_x, m_yColumns.size());
125 std::vector<double>
y;
126 std::vector<double> e;
129 extractValuesFromColumns<double>(startRow, endRow, m_yColumns, std::back_inserter(
y));
130 extractValuesFromColumns<double>(startRow, endRow, m_eColumns, std::back_inserter(e));
132 if (includeChiSquared)
133 std::fill_n(std::back_inserter(e),
y.size() - e.size(), 0.0);
135 return createWorkspace(
x,
y, e,
static_cast<int>(m_yColumns.size()), m_yAxis, unitX);
139 std::vector<double>
const m_x;
140 std::vector<Column_const_sptr>
const m_yColumns;
141 std::vector<Column_const_sptr>
const m_eColumns;
142 std::vector<std::string>
const m_yAxis;
145struct EndsWithOneOf {
146 explicit EndsWithOneOf(std::vector<std::string> &&strings) : m_strings(
std::move(strings)) {}
148 bool operator()(std::string
const &
value)
const {
149 return std::any_of(m_strings.cbegin(), m_strings.cend(),
150 [&
value](
const auto &str) { return value.ends_with(str); });
154 std::vector<std::string>
const m_strings;
157template <
typename StringFilter>
struct ColumnNameFilter {
159 explicit ColumnNameFilter(StringFilter &&filter) : m_filter(
std::forward<StringFilter>(filter)) {}
161 bool operator()(
Column const &column)
const {
return m_filter(column.
name()); }
164 StringFilter
const m_filter;
167template <
typename StringFilter> ColumnNameFilter<StringFilter> makeColumnNameFilter(StringFilter &&filter) {
168 return ColumnNameFilter<StringFilter>(std::forward<StringFilter>(filter));
175using namespace Kernel;
193 return "Convert a parameter table output by PlotPeakByLogValue to a "
202 std::vector<std::string> unitOptions = UnitFactory::Instance().getKeys();
203 unitOptions.emplace_back(
"");
206 "The table workspace to convert to a MatrixWorkspace.");
213 "List of the parameter names to add to the workspace.");
215 declareProperty(
"IncludeChiSquared",
false,
"Add Chi-squared to the output workspace.");
217 declareProperty(
"XAxisUnit",
"", std::make_shared<StringListValidator>(unitOptions),
218 "The unit to assign to the X Axis");
220 auto positiveInt = std::make_shared<Kernel::BoundedValidator<int>>();
221 positiveInt->setLower(0);
223 "The start row index to include in the output matrix workspace.");
225 "The end row index to include in the output matrix workspace.");
228 "The name to give the output workspace");
237 std::string
const xUnit =
getProperty(
"XAxisUnit");
238 bool const includeChiSquared =
getProperty(
"IncludeChiSquared");
239 std::vector<std::string> parameterNames =
getProperty(
"ParameterNames");
240 std::vector<std::string> errorNames = appendSuffix(parameterNames,
"_Err");
242 auto const endRow =
getEndRow(inputWs->rowCount() - 1);
244 if (includeChiSquared)
245 parameterNames.emplace_back(
"Chi_squared");
247 auto const x = getNumericColumnValuesOrIndices(*inputWs->getColumn(xColumn), startRow, endRow);
248 auto const yFilter = makeColumnNameFilter(EndsWithOneOf(std::move(parameterNames)));
249 auto const eFilter = makeColumnNameFilter(EndsWithOneOf(std::move(errorNames)));
251 TableToMatrixWorkspaceConverter converter(inputWs.get(),
x, yFilter, eFilter);
252 auto const output = converter(startRow, endRow, xUnit, includeChiSquared);
258 return startRow ==
EMPTY_INT() ? 0 :
static_cast<std::size_t
>(startRow);
263 return endRow ==
EMPTY_INT() ? maximum :
static_cast<std::size_t
>(endRow);
#define DECLARE_ALGORITHM(classname)
double value
The value of the point.
std::vector< T > const * vec
void declareProperty(std::unique_ptr< Kernel::Property > p, const std::string &doc="") override
Add a property to the list of managed properties.
TypedValue getProperty(const std::string &name) const override
Get the value of a property.
Column is the base class for columns of TableWorkspace.
T & cell(size_t index)
Templated method for returning a value. No type checks are done.
virtual bool isNumber() const =0
Are elements of the column interpretable as a number?
const std::string & name() const
Name (caption) of the column.
ITableWorkspace is an implementation of Workspace in which the data are organised in columns of same ...
virtual Column_sptr getColumn(const std::string &name)=0
Gets the shared pointer to a column by name.
virtual size_t columnCount() const =0
Number of columns in the workspace.
A property class for workspaces.
ProcessIndirectFitParameters : Convert a parameter table output by PlotPeakByLogValue to a MatrixWork...
std::size_t getEndRow(std::size_t maximum) const
void init() override
Initialize the algorithm's properties.
const std::string summary() const override
Algorithm's summary for use in the GUI and help.
void exec() override
Execute the algorithm.
const std::string category() const override
Algorithm's category for identification.
int version() const override
Algorithm's version for identification.
std::size_t getStartRow() const
Support for a property that holds an array of values.
IPropertyManager * setProperty(const std::string &name, const T &value)
Templated method to set the value of a PropertyWithValue.
Validator to check that a property is not left empty.
std::shared_ptr< ITableWorkspace > ITableWorkspace_sptr
shared pointer to Mantid::API::ITableWorkspace
std::shared_ptr< T > createWorkspace(InitArgs... args)
std::shared_ptr< const Column > Column_const_sptr
std::shared_ptr< MatrixWorkspace > MatrixWorkspace_sptr
shared pointer to the matrix workspace base class
constexpr int EMPTY_INT() noexcept
Returns what we consider an "empty" integer within a property.
@ Input
An input workspace.
@ Output
An output workspace.