Mantid
Loading...
Searching...
No Matches
Axis.cpp
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2018 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#include "MantidAPI/Axis.h"
12#include "MantidAPI/TextAxis.h"
13#include "MantidKernel/Unit.h"
16
17#include <boost/python/class.hpp>
18#include <boost/python/copy_const_reference.hpp>
19#include <boost/python/overloads.hpp>
20#include <boost/python/register_ptr_to_python.hpp>
21#include <boost/python/ssize_t.hpp> //For Py_ssize_t. We can get rid of this when RHEL5 goes
22
23// See
24// http://docs.scipy.org/doc/numpy/reference/c-api.array.html#PY_ARRAY_UNIQUE_SYMBOL
25#define PY_ARRAY_UNIQUE_SYMBOL API_ARRAY_API
26#define NO_IMPORT_ARRAY
27#include <numpy/arrayobject.h>
28
29using namespace Mantid::API;
32using namespace boost::python;
33
35
36namespace {
37
38//------------------------------- Overload macros ---------------------------
39GNU_DIAG_OFF("unused-local-typedef")
40// Ignore -Wconversion warnings coming from boost::python
41// Seen with GCC 7.1.1 and Boost 1.63.0
42GNU_DIAG_OFF("conversion")
43
44// Overloads for operator() function which has 1 optional argument
45// cppcheck-suppress unknownMacro
46BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(Axis_getValue, Axis::getValue, 1, 2)
47
48GNU_DIAG_ON("conversion")
49GNU_DIAG_ON("unused-local-typedef")
57PyObject *extractAxisValues(Axis &self) {
58 const auto nvalues = static_cast<npy_intp>(self.length());
59 npy_intp arrayDims[1] = {nvalues};
60
61 // Pick the correct element type base on the Axis type
62 PyObject *array;
63 bool numeric(true);
64 if (self.isNumeric() || self.isSpectra()) {
65 array = PyArray_SimpleNew(1, arrayDims, NPY_DOUBLE);
66 } else if (self.isText()) {
67 array = PyList_New(static_cast<Py_ssize_t>(nvalues));
68 numeric = false;
69 } else {
70 throw std::invalid_argument("Unknown axis type. Cannot extract to Numpy");
71 }
72
73 // Fill the array
74 for (npy_intp i = 0; i < nvalues; ++i) {
75 if (numeric) {
76 PyObject *value = PyFloat_FromDouble(self.getValue(static_cast<size_t>(i)));
77 void *pos = PyArray_GETPTR1((PyArrayObject *)array, i);
78 PyArray_SETITEM(reinterpret_cast<PyArrayObject *>(array), reinterpret_cast<char *>(pos), value);
79 } else {
80 const std::string s = self.label(static_cast<size_t>(i));
81 PyObject *value = to_python_value<const std::string &>()(s);
82 PyList_SetItem(array, (Py_ssize_t)i, value);
83 }
84 }
85 return array;
86}
87} // namespace
88
90 register_ptr_to_python<Axis *>();
91
92 // Class
93 class_<Axis, boost::noncopyable>("MantidAxis", no_init)
94 .def("length", &Axis::length, arg("self"), "Returns the length of the axis")
95 .def("title", (const std::string &(Axis::*)() const) & Axis::title, arg("self"),
96 return_value_policy<copy_const_reference>(), "Get the axis title")
97 .def("isSpectra", &Axis::isSpectra, arg("self"), "Returns true if this is a SpectraAxis")
98 .def("isNumeric", &Axis::isNumeric, arg("self"), "Returns true if this is a NumericAxis")
99 .def("isText", &Axis::isText, arg("self"), "Returns true if this is a TextAxis")
100 .def("label", &Axis::label, (arg("self"), arg("index")), "Return the axis label")
101 .def("getUnit", (const Unit_sptr &(Axis::*)() const) & Axis::unit, arg("self"),
102 return_value_policy<copy_const_reference>(), "Returns the unit object for the axis")
103 .def("getValue", &Axis::getValue,
104 Axis_getValue((arg("self"), arg("index"), arg("vertical_index")),
105 "Returns the value at the given point on the Axis. "
106 "The vertical axis index [default=0]"))
107 .def("indexOfValue", &Axis::indexOfValue,
108 ((arg("self"), arg("value")), return_value_policy<copy_const_reference>(),
109 "Returns the index of the given value on the Axis. "))
110 .def("extractValues", &extractAxisValues, arg("self"), "Return a numpy array of the axis values")
111 .def("indexOfValue", &Axis::indexOfValue, (arg("value")),
112 "Returns the index of the closest to the given value on the axis")
113 .def("setUnit", &Axis::setUnit, (arg("self"), arg("unit_name")), return_value_policy<copy_const_reference>(),
114 "Set the unit for this axis by name.")
115 .def("setValue", &Axis::setValue, (arg("self"), arg("index"), arg("value")), "Set a value at the given index")
116 .def("getMin", &Axis::getMin, arg("self"), "Get min value specified on the axis")
117 .def("getMax", &Axis::getMax, arg("self"), "Get max value specified on the axis")
118 //------------------------------------ Special methods
119 //------------------------------------
120 .def("__len__", &Axis::length, arg("self"));
121}
122
123// --------------------------------------------------------------------------------------------
124// SpectraAxis
125// --------------------------------------------------------------------------------------------
131Axis *createSpectraAxis(const MatrixWorkspace *const ws) { return new SpectraAxis(ws); }
132
136 class_<SpectraAxis, bases<Axis>, boost::noncopyable>("SpectraAxis", no_init)
137 .def("create", &createSpectraAxis, arg("workspace"), return_internal_reference<>(),
138 "Creates a new SpectraAxis referencing the given workspace")
139 .staticmethod("create");
140}
141
142// --------------------------------------------------------------------------------------------
143// NumericAxis
144// --------------------------------------------------------------------------------------------
150Axis *createNumericAxis(int length) { return new NumericAxis(length); }
151
155 class_<NumericAxis, bases<Axis>, boost::noncopyable>("NumericAxis", no_init)
156 .def("create", &createNumericAxis, arg("length"), return_internal_reference<>(),
157 "Creates a new NumericAxis of a specified length")
158 .staticmethod("create");
159}
160
161// --------------------------------------------------------------------------------------------
162// BinEdgeAxis
163// --------------------------------------------------------------------------------------------
164
170Axis *createBinEdgeAxis(int length) { return new BinEdgeAxis(length); }
171
175 class_<BinEdgeAxis, bases<NumericAxis>, boost::noncopyable>("BinEdgeAxis", no_init)
176 .def("create", &createBinEdgeAxis, arg("length"), return_internal_reference<>(),
177 "Creates a new BinEdgeAxis of a specified length")
178 .staticmethod("create");
179}
180
181// --------------------------------------------------------------------------------------------
182// TextAxis
183// --------------------------------------------------------------------------------------------
184
190Axis *createTextAxis(int length) { return new TextAxis(length); }
191
193 class_<TextAxis, bases<Axis>, boost::noncopyable>("TextAxis", no_init)
194 .def("setLabel", &TextAxis::setLabel, (arg("self"), arg("index"), arg("label")),
195 "Set the label at the given entry")
196 .def("label", &TextAxis::label, (arg("self"), arg("index")), "Return the label at the given position")
197 .def("create", &createTextAxis, arg("length"), return_internal_reference<>(),
198 "Creates a new TextAxis of a specified length")
199 .staticmethod("create");
200}
double value
The value of the point.
Definition FitMW.cpp:51
#define GET_POINTER_SPECIALIZATION(TYPE)
Definition GetPointer.h:17
tagPyArrayObject PyArrayObject
Axis * createBinEdgeAxis(int length)
Creates a BinEdgeAxis.
Definition Axis.cpp:170
void export_BinEdgeAxis()
Definition Axis.cpp:172
void export_NumericAxis()
Definition Axis.cpp:152
void export_Axis()
Definition Axis.cpp:89
void export_SpectraAxis()
Definition Axis.cpp:133
Axis * createTextAxis(int length)
Creates a TextAxis.
Definition Axis.cpp:190
Axis * createSpectraAxis(const MatrixWorkspace *const ws)
Creates a SpectraAxis referencing a given workspace.
Definition Axis.cpp:131
Axis * createNumericAxis(int length)
Creates a NumericAxis.
Definition Axis.cpp:150
void export_TextAxis()
Definition Axis.cpp:192
#define GNU_DIAG_ON(x)
#define GNU_DIAG_OFF(x)
This is a collection of macros for turning compiler warnings off in a controlled manner.
Class to represent the axis of a workspace.
Definition Axis.h:28
virtual double getMin() const =0
returns min value defined on axis
virtual double getMax() const =0
returns max value defined on axis
const std::string & title() const
Returns the user-defined title for this axis.
Definition Axis.cpp:20
virtual const Kernel::Unit_sptr & setUnit(const std::string &unitName)
Set the unit on the Axis.
Definition Axis.cpp:39
virtual std::string label(const std::size_t &index) const =0
Returns a text label of for a value Note that the index here is not the index of a value,...
virtual bool isText() const
Returns true if the axis is Text.
Definition Axis.h:52
virtual size_t indexOfValue(const double value) const =0
Find the index of the given double value.
virtual std::size_t length() const =0
Get the length of the axis.
virtual void setValue(const std::size_t &index, const double &value)=0
Sets the value at the specified index.
virtual bool isNumeric() const
Returns true if the axis is numeric.
Definition Axis.h:50
const Kernel::Unit_sptr & unit() const
The unit for this axis.
Definition Axis.cpp:28
double getValue(const std::size_t &index, const std::size_t &verticalIndex=0) const
Gets the value at the specified index.
Definition Axis.cpp:51
virtual bool isSpectra() const
Returns true is the axis is a Spectra axis.
Definition Axis.h:48
Stores numeric values that are assumed to be bin edge values.
Definition BinEdgeAxis.h:20
Base MatrixWorkspace Abstract Class.
Class to represent a numeric axis of a workspace.
Definition NumericAxis.h:30
Class to represent the spectra axis of a workspace.
Definition SpectraAxis.h:30
Class to represent a text axis of a workspace.
Definition TextAxis.h:35
void setLabel(const std::size_t &index, const std::string &lbl)
Set the label at the given index.
Definition TextAxis.cpp:114
std::string label(const std::size_t &index) const override
Get the label at the specified index.
Definition TextAxis.cpp:107
std::shared_ptr< Unit > Unit_sptr
Shared pointer to the Unit base class.
Definition Unit_fwd.h:17
int32_t specnum_t
Typedef for a spectrum Number.
Definition IDTypes.h:14