Mantid
Loading...
Searching...
No Matches
TableWorkspace.h
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2007 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
7#pragma once
8
9//----------------------------------------------------------------------
10// Includes
11//----------------------------------------------------------------------
12
14#include "MantidDataObjects/DllConfig.h"
19#include "MantidKernel/V3D.h"
20#include <boost/tuple/tuple.hpp>
21
22#include <memory>
23#include <utility>
24
25namespace Mantid {
26
27namespace DataObjects {
67class MANTID_DATAOBJECTS_DLL TableWorkspace : public API::ITableWorkspace {
68public:
70 TableWorkspace(size_t nrows = 0);
71
72 TableWorkspace &operator=(const TableWorkspace &other) = delete;
73
75 std::unique_ptr<TableWorkspace> clone() const { return std::unique_ptr<TableWorkspace>(doClone()); }
76
78 std::unique_ptr<TableWorkspace> cloneEmpty() const { return std::unique_ptr<TableWorkspace>(doCloneEmpty()); }
79
81 const std::string id() const override { return "TableWorkspace"; }
83 size_t getMemorySize() const override;
85 API::Column_sptr addColumn(const std::string &type, const std::string &name) override;
87 void removeColumn(const std::string &name) override;
89 size_t columnCount() const override { return static_cast<int>(m_columns.size()); }
91 API::Column_sptr getColumn(const std::string &name) override;
92 API::Column_const_sptr getColumn(const std::string &name) const override;
94 API::Column_sptr getColumn(size_t index) override;
97 API::Column_const_sptr getColumn(size_t index) const override;
99 std::vector<std::string> getColumnNames() const override;
101 size_t rowCount() const override { return m_rowCount; }
103 API::LogManager_sptr logs() override { return m_LogManager; }
105 API::LogManager_const_sptr getLogs() const override { return m_LogManager; }
106
114 template <class T> std::vector<T> &getColVector(size_t index) {
115 auto pTableCol = dynamic_cast<TableColumn<T> *>(m_columns[index].get());
116 if (pTableCol)
117 return pTableCol->data();
118 else {
119 throw std::runtime_error("TableWorkspace::getColVector(): Can not cast "
120 "to proper TableCol type");
121 }
122 }
124 template <class T> const std::vector<T> &getColVector(size_t index) const {
125 auto pTableCol = dynamic_cast<TableColumn<T> *>(m_columns[index].get());
126 if (pTableCol)
127 return pTableCol->data();
128 else {
129 throw std::runtime_error("TableWorkspace::getColVector()const: Can not "
130 "cast to proper TableCol type");
131 }
132 }
140 template <class T> std::vector<T> &getColVector(const std::string &name) {
141 auto ci = std::find_if(m_columns.begin(), m_columns.end(), FindName(name));
142 if (ci == m_columns.end())
143 throw(std::runtime_error("column with name: " + name + " does not exist"));
144 auto pTableCol = dynamic_cast<TableColumn<T> *>(ci->get());
145 if (pTableCol)
146 return pTableCol->data();
147 else {
148 throw std::runtime_error("TableWorkspace::getColVector(): Can not cast "
149 "to proper TableCol type");
150 }
151 }
153 template <class T> const std::vector<T> &getColVector(const std::string &name) const {
154 auto ci = std::find_if(m_columns.begin(), m_columns.end(), FindName(name));
155 if (ci == m_columns.end())
156 throw(std::runtime_error("column with name: " + name + " does not exist"));
157 auto pTableCol = dynamic_cast<TableColumn<T> *>(ci->get());
158 if (pTableCol)
159 return pTableCol->data();
160 else {
161 throw std::runtime_error("TableWorkspace::getColVector()const: Can not "
162 "cast to proper TableCol type");
163 }
164 }
171 template <class T> T *getColDataArray(const std::string &name) {
172 auto ci = std::find_if(m_columns.begin(), m_columns.end(), FindName(name));
173 if (ci == m_columns.end())
174 return nullptr;
175 auto pTableCol = dynamic_cast<TableColumn<T> *>(ci->get());
176 if (pTableCol)
177 return pTableCol->dataArray();
178 else
179 return nullptr;
180 }
188 template <class T> T *getColDataArray(const std::string &name) const {
189 auto ci = std::find_if(m_columns.begin(), m_columns.end(), FindName(name));
190 if (ci == m_columns.end())
191 return nullptr;
192 auto pTableCol = dynamic_cast<TableColumn<T> *>(ci->get());
193 if (pTableCol)
194 return pTableCol->dataArray();
195 else
196 return nullptr;
197 }
198
200 void setRowCount(size_t count) final; // Marked as final because used in constructors
203 size_t insertRow(size_t index) override;
205 void removeRow(size_t index) override;
206
213 void find(size_t value, size_t &row, size_t col) override { findValue(value, row, col); }
220 void find(const std::string &value, size_t &row, size_t col) override { findValue(value, row, col); }
227 void find(float value, size_t &row, size_t col) override { findValue(value, row, col); }
234 void find(API::Boolean value, size_t &row, size_t col) override { findValue(value, row, col); }
241 void find(double value, size_t &row, size_t col) override { findValue(value, row, col); }
248 void find(const Mantid::Kernel::V3D &value, size_t &row, size_t col) override { findValue(value, row, col); }
253 template <class U> U cell_cast(size_t nRow, size_t nCol) const {
254 API::Column_sptr spCol = this->m_columns[nCol];
255 return static_cast<U>(spCol->operator[](nRow));
256 }
257 template <class U> U cell_cast(size_t nRow, const std::string &col_name) const {
258 API::Column_const_sptr spCol = this->getColumn(col_name);
259 return static_cast<U>(spCol->operator[](nRow));
260 }
261
263 void sort(std::vector<std::pair<std::string, bool>> &criteria) override;
264
265protected:
267 TableWorkspace(const TableWorkspace &other);
268
269private:
270 TableWorkspace *doClone() const override { return doCloneColumns(std::vector<std::string>()); }
271
272 TableWorkspace *doCloneEmpty() const override { return new TableWorkspace(); }
273
274 TableWorkspace *doCloneColumns(const std::vector<std::string> &colNames) const override;
275
277 template <typename Type> void findValue(const Type value, size_t &row, size_t colIndex) {
278
279 try {
280 TableColumn_ptr<Type> tc_sptr = getColumn(colIndex);
281 std::vector<Type> dataVec = tc_sptr->data();
282 typename std::vector<Type>::iterator itr;
283 itr = std::find(dataVec.begin(), dataVec.end(), value);
284 if (itr != dataVec.end()) {
285 std::vector<int>::difference_type pos;
286 pos = std::distance(dataVec.begin(), itr);
287 // size_t pos=static_cast<int>itr-dataVec.begin();
288 row = static_cast<int>(pos);
289
290 } else {
291 throw std::out_of_range("Search object not found in table workspace");
292 }
293 } catch (std::range_error &) {
294 throw;
295 } catch (std::runtime_error &) {
296 throw;
297 }
298 }
299
300 void addColumn(const std::shared_ptr<API::Column> &column);
301
302private:
304 class FindName {
305 std::string m_name;
306 public:
308 FindName(const std::string &name) : m_name(name) {}
310 bool operator()(std::shared_ptr<API::Column> &cp) const { return cp->name() == m_name; }
311 bool operator()(const std::shared_ptr<const API::Column> &cp) const { return cp->name() == m_name; }
312 };
313
314 using column_it = std::vector<std::shared_ptr<API::Column>>::iterator;
316
318 using column_const_it = std::vector<std::shared_ptr<API::Column>>::const_iterator;
319
321 std::vector<std::shared_ptr<API::Column>> m_columns;
324
328};
329} // namespace DataObjects
330} // namespace Mantid
331
332// Instantiated and exported by DataObjects/src/PropertyWithValue.cpp
334 Mantid::Kernel::PropertyWithValue<std::shared_ptr<Mantid::DataObjects::TableWorkspace>>);
335
336#ifndef DataObjects_EXPORTS
338namespace Mantid::API {
340extern template class MANTID_DATAOBJECTS_DLL WorkspaceProperty<DataObjects::TableWorkspace>;
342} // namespace Mantid::API
343#endif
std::string name
Definition Run.cpp:60
double value
The value of the point.
Definition FitMW.cpp:51
std::map< DeltaEMode::Type, std::string > index
int count
counter
Definition Matrix.cpp:37
MANTID_DATAOBJECTS_EXTERN_TEMPLATE(Mantid::Kernel::PropertyWithValue< std::shared_ptr< Mantid::DataObjects::TableWorkspace > >)
ITableWorkspace is an implementation of Workspace in which the data are organised in columns of same ...
Shared pointer to a column with automatic type cast and data type check.
Class TableColumn implements abstract class Column for any copyable data type.
Definition TableColumn.h:51
Type * dataArray()
Pointer to the data array.
std::vector< Type > & data()
Reference to the data.
Used in std::find_if algorithm to find a Column with name name.
bool operator()(std::shared_ptr< API::Column > &cp) const
Comparison operator.
bool operator()(const std::shared_ptr< const API::Column > &cp) const
FindName(const std::string &name)
Constructor.
TableWorkspace is an implementation of Workspace in which the data are organised in columns of same s...
size_t columnCount() const override
Number of columns in the workspace.
std::vector< std::shared_ptr< API::Column > >::const_iterator column_const_it
U cell_cast(size_t nRow, const std::string &col_name) const
void find(double value, size_t &row, size_t col) override
This method finds the row and column index of an double cell value in a table workspace.
API::LogManager_sptr m_LogManager
shared pointer to the logManager, responsible for the workspace properties.
TableWorkspace * doClone() const override
Virtual clone method. Not implemented to force implementation in children.
size_t rowCount() const override
Number of rows in the workspace.
T * getColDataArray(const std::string &name)
Non-throwing access to the pointer to the column data array for the column with given name.
TableWorkspace & operator=(const TableWorkspace &other)=delete
std::vector< std::shared_ptr< API::Column > >::iterator column_it
Column const iterator.
const std::vector< T > & getColVector(size_t index) const
get constant access to column vector for index i.
void find(size_t value, size_t &row, size_t col) override
This method finds the row and column index of an integer cell value in a table workspace.
std::unique_ptr< TableWorkspace > clone() const
Returns a clone of the workspace.
void findValue(const Type value, size_t &row, size_t colIndex)
template method to find a given value in a table.
std::vector< T > & getColVector(size_t index)
get access to column vector for index i.
std::unique_ptr< TableWorkspace > cloneEmpty() const
Returns a default-initialized clone of the workspace.
TableWorkspace * doCloneEmpty() const override
Virtual cloneEmpty method.
void find(const std::string &value, size_t &row, size_t col) override
This method finds the row and column index of an string cell value in a table workspace.
API::LogManager_const_sptr getLogs() const override
Get constant access to shared pointer containing workspace porperties.
T * getColDataArray(const std::string &name) const
Non-throwing const access to the pointer to the column data array for the column with given name.
U cell_cast(size_t nRow, size_t nCol) const
Casts cells through converting their values to/from double without type checking; Can produce stuped ...
API::LogManager_sptr logs() override
Get access to shared pointer containing workspace porperties.
void find(API::Boolean value, size_t &row, size_t col) override
This method finds the row and column index of an API::Bollean value in a table workspace.
void find(const Mantid::Kernel::V3D &value, size_t &row, size_t col) override
This method finds the row and column index of an Mantid::Kernel::V3D cell value in a table workspace.
std::vector< std::shared_ptr< API::Column > > m_columns
Shared pointers to the columns.
const std::string id() const override
Return the workspace typeID.
void find(float value, size_t &row, size_t col) override
This method finds the row and column index of an float value in a table workspace.
const std::vector< T > & getColVector(const std::string &name) const
get access to column vector for column with given name
std::vector< T > & getColVector(const std::string &name)
get access to the column vector for column with given name .
The concrete, templated class for properties.
Class for 3D vectors.
Definition V3D.h:35
std::shared_ptr< const LogManager > LogManager_const_sptr
shared pointer to the logManager base class (const version)
Definition LogManager.h:228
std::shared_ptr< Column > Column_sptr
Definition Column.h:229
std::shared_ptr< LogManager > LogManager_sptr
shared pointer to the logManager base class
Definition LogManager.h:226
std::shared_ptr< const Column > Column_const_sptr
Definition Column.h:230
Helper class which provides the Collimation Length for SANS instruments.
As TableColumn stores its data in a std::vector bool type cannot be used in the same way as the other...
Definition Column.h:210