Mantid
Loading...
Searching...
No Matches
MDHistoWorkspace.h
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#pragma once
8
13#include "MantidDataObjects/DllConfig.h"
20
21namespace Mantid {
22namespace DataObjects {
23
38class MANTID_DATAOBJECTS_DLL MDHistoWorkspace : public API::IMDHistoWorkspace {
39public:
45
46 MDHistoWorkspace(std::vector<Mantid::Geometry::MDHistoDimension_sptr> &dimensions,
48 MDHistoWorkspace(std::vector<Mantid::Geometry::IMDDimension_sptr> const &dimensions,
51
53 std::unique_ptr<MDHistoWorkspace> clone() const { return std::unique_ptr<MDHistoWorkspace>(doClone()); }
54
56 std::unique_ptr<MDHistoWorkspace> cloneEmpty() const { return std::unique_ptr<MDHistoWorkspace>(doCloneEmpty()); }
57
58 void init(std::vector<Mantid::Geometry::MDHistoDimension_sptr> &dimensions);
59 void init(std::vector<Mantid::Geometry::IMDDimension_sptr> const &dimensions);
60
61 void cacheValues();
62
63 const std::string id() const override { return "MDHistoWorkspace"; }
64
65 size_t getMemorySize() const override;
66
69 uint64_t getNPoints() const override { return m_length; }
71 uint64_t getNEvents() const override;
72 std::vector<std::unique_ptr<Mantid::API::IMDIterator>>
73 createIterators(size_t suggestedNumCores = 1,
74 Mantid::Geometry::MDImplicitFunction *function = nullptr) const override;
75
76 LinePlot getLinePlot(const Mantid::Kernel::VMD &start, const Mantid::Kernel::VMD &end,
77 Mantid::API::MDNormalization normalize) const override;
78
79 LinePlot getLineData(const Mantid::Kernel::VMD &start, const Mantid::Kernel::VMD &end,
80 Mantid::API::MDNormalization normalize) const override;
81
82 void checkWorkspaceSize(const MDHistoWorkspace &other, const std::string &operation);
83
84 // --------------------------------------------------------------------------------------------
86 void add(const MDHistoWorkspace &b);
87 void add(const signal_t signal, const signal_t error);
88
90 void subtract(const MDHistoWorkspace &b);
91 void subtract(const signal_t signal, const signal_t error);
92
94 void multiply(const MDHistoWorkspace &b_ws);
95 void multiply(const signal_t signal, const signal_t error);
96
98 void divide(const MDHistoWorkspace &b_ws);
99 void divide(const signal_t signal, const signal_t error);
100
101 void log(double filler = 0.0);
102 void log10(double filler = 0.0);
103 void exp();
104 void power(double exponent);
105
106 // --------------------------------------------------------------------------------------------
107
109 MDHistoWorkspace &operator|=(const MDHistoWorkspace &b);
110 MDHistoWorkspace &operator^=(const MDHistoWorkspace &b);
111 void operatorNot();
112
113 void lessThan(const MDHistoWorkspace &b);
114 void lessThan(const signal_t signal);
115 void greaterThan(const MDHistoWorkspace &b);
116 void greaterThan(const signal_t signal);
117 void equalTo(const MDHistoWorkspace &b, const signal_t tolerance = 1e-5);
118 void equalTo(const signal_t signal, const signal_t tolerance = 1e-5);
119
120 void setUsingMask(const MDHistoWorkspace &mask, const MDHistoWorkspace &values);
121 void setUsingMask(const MDHistoWorkspace &mask, const signal_t signal, const signal_t error);
122
123 // --------------------------------------------------------------------------------------------
128 const size_t *getIndexMultiplier() const { return indexMultiplier.data(); }
129
131 const signal_t *getSignalArray() const override { return m_signals.data(); }
132
135 coord_t getInverseVolume() const override { return m_inverseVolume; }
136
138 const signal_t *getErrorSquaredArray() const override { return m_errorsSquared.data(); }
139
142 const signal_t *getNumEventsArray() const override { return m_numEvents.data(); }
143
146 const bool *getMaskArray() const { return m_masks.get(); }
147
150 const coord_t *getBinWidths() const { return m_boxLength.data(); }
151
154 signal_t *mutableSignalArray() override { return m_signals.data(); }
155
158 signal_t *mutableErrorSquaredArray() override { return m_errorsSquared.data(); }
159
162 signal_t *mutableNumEventsArray() override { return m_numEvents.data(); }
163
166 bool *mutableMaskArray() { return m_masks.get(); }
167
169 Kernel::SpecialCoordinateSystem getSpecialCoordinateSystem() const override;
170
172 void setCoordinateSystem(const Kernel::SpecialCoordinateSystem coordinateSystem) override;
173
174 void setTo(signal_t signal, signal_t errorSquared, signal_t numEvents) override;
175
176 void applyImplicitFunction(Mantid::Geometry::MDImplicitFunction *function, signal_t signal, signal_t errorSquared);
177
178 std::unique_ptr<coord_t[]> getVertexesArray(size_t linearIndex, size_t &numVertices) const;
179
180 Kernel::VMD getCenter(size_t linearIndex) const override;
181
183 signal_t getSignalAtCoord(const coord_t *coords, const Mantid::API::MDNormalization &normalization) const override;
184
186 // or 0 if masked
187 signal_t getSignalWithMaskAtCoord(const coord_t *coords,
188 const Mantid::API::MDNormalization &normalization) const override;
189
191 void setSignalAt(size_t index, signal_t value) override { m_signals[index] = value; }
192
194 void setErrorSquaredAt(size_t index, signal_t value) override { m_errorsSquared[index] = value; }
195
197 void setNumEventsAt(size_t index, signal_t value) { m_numEvents[index] = value; }
198
201 signal_t getNumEventsAt(size_t index) const { return m_numEvents[index]; }
202
204 signal_t getErrorAt(size_t index) const override { return std::sqrt(m_errorsSquared[index]); }
205
208 signal_t getErrorAt(size_t index1, size_t index2) const override {
209 return std::sqrt(m_errorsSquared[index1 + indexMultiplier[0] * index2]);
210 }
211
214 signal_t getErrorAt(size_t index1, size_t index2, size_t index3) const override {
215 return std::sqrt(m_errorsSquared[index1 + indexMultiplier[0] * index2 + indexMultiplier[1] * index3]);
216 }
217
220 signal_t getErrorAt(size_t index1, size_t index2, size_t index3, size_t index4) const override {
221 return std::sqrt(m_errorsSquared[index1 + indexMultiplier[0] * index2 + indexMultiplier[1] * index3 +
222 indexMultiplier[2] * index4]);
223 }
224
228 bool getIsMaskedAt(size_t index) const { return m_masks[index]; }
229
231 signal_t getSignalAt(size_t index) const override { return m_signals[index]; }
232
235 signal_t getSignalAt(size_t index1, size_t index2) const override {
236 return m_signals[index1 + indexMultiplier[0] * index2];
237 }
238
241 signal_t getSignalAt(size_t index1, size_t index2, size_t index3) const override {
242 return m_signals[index1 + indexMultiplier[0] * index2 + indexMultiplier[1] * index3];
243 }
244
247 signal_t getSignalAt(size_t index1, size_t index2, size_t index3, size_t index4) const override {
248 return m_signals[index1 + indexMultiplier[0] * index2 + indexMultiplier[1] * index3 + indexMultiplier[2] * index4];
249 }
250
252 signal_t getSignalNormalizedAt(size_t index) const override { return m_signals[index] * m_inverseVolume; }
253
256 signal_t getSignalNormalizedAt(size_t index1, size_t index2) const override {
257 return m_signals[index1 + indexMultiplier[0] * index2] * m_inverseVolume;
258 }
259
262 signal_t getSignalNormalizedAt(size_t index1, size_t index2, size_t index3) const override {
263 return m_signals[index1 + indexMultiplier[0] * index2 + indexMultiplier[1] * index3] * m_inverseVolume;
264 }
265
268 signal_t getSignalNormalizedAt(size_t index1, size_t index2, size_t index3, size_t index4) const override {
269 return m_signals[index1 + indexMultiplier[0] * index2 + indexMultiplier[1] * index3 + indexMultiplier[2] * index4] *
270 m_inverseVolume;
271 }
272
275 signal_t getErrorNormalizedAt(size_t index) const override {
276 return std::sqrt(m_errorsSquared[index]) * m_inverseVolume;
277 }
278
281 signal_t getErrorNormalizedAt(size_t index1, size_t index2) const override {
282 return getErrorAt(index1, index2) * m_inverseVolume;
283 }
284
287 signal_t getErrorNormalizedAt(size_t index1, size_t index2, size_t index3) const override {
288 return getErrorAt(index1, index2, index3) * m_inverseVolume;
289 }
290
293 signal_t getErrorNormalizedAt(size_t index1, size_t index2, size_t index3, size_t index4) const override {
294 return getErrorAt(index1, index2, index3, index4) * m_inverseVolume;
295 }
296
297 //---------------------------------------------------------------------------------------------
300 signal_t &errorSquaredAt(size_t index) override {
301 if (index < m_length)
302 return m_errorsSquared[index];
303 else
304 throw std::invalid_argument("MDHistoWorkspace::array index out of range");
305 }
306
309 signal_t &signalAt(size_t index) override {
310 if (index < m_length)
311 return m_signals[index];
312 else
313 throw std::invalid_argument("MDHistoWorkspace::array index out of range");
314 }
315
316 //---------------------------------------------------------------------------------------------
317 size_t getLinearIndex(size_t index1, size_t index2) const override {
318 if (this->getNumDims() != 2)
319 throw std::runtime_error("Workspace does not have 2 dimensions!");
320 return index1 + indexMultiplier[0] * index2;
321 }
322
323 size_t getLinearIndex(size_t index1, size_t index2, size_t index3) const override {
324 if (this->getNumDims() != 3)
325 throw std::runtime_error("Workspace does not have 3 dimensions!");
326 return index1 + indexMultiplier[0] * index2 + indexMultiplier[1] * index3;
327 }
328
329 size_t getLinearIndex(size_t index1, size_t index2, size_t index3, size_t index4) const override {
330 if (this->getNumDims() != 4)
331 throw std::runtime_error("Workspace does not have 4 dimensions!");
332 return index1 + indexMultiplier[0] * index2 + indexMultiplier[1] * index3 + indexMultiplier[2] * index4;
333 }
334
339 size_t getLinearIndex(const size_t *index) const {
340 size_t nd = this->getNumDims();
341 size_t out = index[0];
342 for (size_t d = 1; d < nd; d++)
343 out += indexMultiplier[d - 1] * index[d];
344 return out;
345 }
346
347 size_t getLinearIndexAtCoord(const coord_t *coords) const;
348
353 signal_t &operator[](const size_t &index) override {
354 if (index < m_length)
355 return m_signals[index];
356 else
357 throw std::invalid_argument("MDHistoWorkspace::array index out of range");
358 }
359
362 virtual std::vector<signal_t> getSignalDataVector() const;
363 virtual std::vector<signal_t> getErrorDataVector() const;
364
366 void setMDMasking(std::unique_ptr<Mantid::Geometry::MDImplicitFunction> maskingRegion) override;
368 void setMDMaskAt(const size_t &index, bool mask);
369
371 void clearMDMasking() override;
373 uint64_t sumNContribEvents() const;
374 void updateSum() { m_nEventsContributed = sumNContribEvents(); }
375
377 static size_t sizeOfElement();
378
380 Mantid::API::MDNormalization displayNormalization() const override;
381
383 Mantid::API::MDNormalization displayNormalizationHisto() const override;
384
385 void setDisplayNormalization(const Mantid::API::MDNormalization &preferredNormalization) override;
386
388 bool isMDHistoWorkspace() const override { return true; }
389
390private:
391 MDHistoWorkspace *doClone() const override { return new MDHistoWorkspace(*this); }
392
393 MDHistoWorkspace *doCloneEmpty() const override { return new MDHistoWorkspace(nullptr); }
394
395 void makeSingleBinWithNaN(std::vector<coord_t> &x, std::vector<signal_t> &y, std::vector<signal_t> &e) const;
396
397 void initVertexesArray();
398
401
403 std::vector<signal_t> m_signals;
404
406 std::vector<signal_t> m_errorsSquared;
407
409 std::vector<signal_t> m_numEvents;
410
412 size_t m_length;
413
416 std::vector<size_t> indexMultiplier;
418 std::vector<size_t> m_indexMaker;
420 std::vector<size_t> m_indexMax;
421
424
426 std::vector<coord_t> m_vertexesArray;
427
429 std::vector<coord_t> m_boxLength;
430
432 std::vector<coord_t> m_origin;
434 mutable uint64_t m_nEventsContributed;
435
437
440
441 // Get ordered list of boundaries in position-along-the-line coordinates
442 std::set<coord_t> getBinBoundariesOnLine(const Kernel::VMD &start, const Kernel::VMD &end, size_t nd,
443 const Kernel::VMD &dir, coord_t length) const;
444
445 signal_t getNormalizationFactor(const API::MDNormalization &normalize, size_t linearIndex) const;
446
447protected:
448 LinePlot getLinePoints(const Mantid::Kernel::VMD &start, const Mantid::Kernel::VMD &end,
449 Mantid::API::MDNormalization normalize, const bool bin_centres) const;
450
453
456 std::unique_ptr<bool[]> m_masks;
457};
458
460using MDHistoWorkspace_sptr = std::shared_ptr<MDHistoWorkspace>;
461
463using MDHistoWorkspace_const_sptr = std::shared_ptr<const MDHistoWorkspace>;
464
465} // namespace DataObjects
466} // namespace Mantid
467
468// Instantiated and exported by DataObjects/src/PropertyWithValue.cpp
470 Mantid::Kernel::PropertyWithValue<std::shared_ptr<Mantid::DataObjects::MDHistoWorkspace>>);
double value
The value of the point.
Definition FitMW.cpp:51
double error
std::map< DeltaEMode::Type, std::string > index
MANTID_DATAOBJECTS_EXTERN_TEMPLATE(Mantid::Kernel::PropertyWithValue< std::shared_ptr< Mantid::DataObjects::MDHistoWorkspace > >)
double tolerance
Abstract interface to MDHistoWorkspace, for use in exposing to Python.
signal_t & signalAt(size_t index) override
signal_t getErrorNormalizedAt(size_t index1, size_t index2, size_t index3, size_t index4) const override
Get the signal at the specified index given in 4 dimensions (typically X,Y,Z,t), normalized by cell v...
coord_t m_inverseVolume
Inverse of the volume of EACH cell.
size_t getLinearIndex(size_t index1, size_t index2, size_t index3) const override
bool isMDHistoWorkspace() const override
Return if this workspace is a MDHistoWorkspace. Will always return true.
std::unique_ptr< bool[]> m_masks
Linear array of masks for each bin.
const signal_t * getNumEventsArray() const override
signal_t getNumEventsAt(size_t index) const
Returns the number of contributing events from the bin at the specified index.
MDHistoWorkspace & operator=(const MDHistoWorkspace &other)=delete
std::vector< size_t > m_indexMax
Max index into each dimension.
signal_t getSignalNormalizedAt(size_t index1, size_t index2, size_t index3, size_t index4) const override
Get the signal at the specified index given in 4 dimensions (typically X,Y,Z,t), normalized by cell v...
signal_t getSignalNormalizedAt(size_t index) const override
Get the signal at the specified index, normalized by cell volume.
std::unique_ptr< MDHistoWorkspace > cloneEmpty() const
Returns a default-initialized clone of the workspace.
size_t getLinearIndex(const size_t *index) const
Get the linear index into the array.
size_t numDimensions
Number of dimensions in this workspace.
signal_t getErrorNormalizedAt(size_t index1, size_t index2) const override
Get the signal at the specified index given in 4 dimensions (typically X,Y,Z,t), normalized by cell v...
signal_t getErrorAt(size_t index) const override
Get the error of the signal at the specified index.
size_t getLinearIndex(size_t index1, size_t index2) const override
const coord_t * getBinWidths() const
Return the aray of bin withs (the linear length of a box) for each dimension.
signal_t getErrorAt(size_t index1, size_t index2, size_t index3, size_t index4) const override
Get the error at the specified index given in 4 dimensions (typically X,Y,Z,t)
signal_t getSignalAt(size_t index) const override
Get the signal at the specified index.
void setNumEventsAt(size_t index, signal_t value)
Sets the number of contributing events in the bin at the specified index.
std::unique_ptr< MDHistoWorkspace > clone() const
Returns a clone of the workspace.
std::vector< coord_t > m_origin
Vector of the origin in each dimension.
MDHistoWorkspace * doCloneEmpty() const override
Virtual cloneEmpty method.
signal_t getErrorAt(size_t index1, size_t index2, size_t index3) const override
Get the error at the specified index given in 4 dimensions (typically X,Y,Z,t)
uint64_t m_nEventsContributed
the number of events, contributed into the workspace;
signal_t & operator[](const size_t &index) override
Array subscript operator.
coord_t getInverseVolume() const override
uint64_t getNPoints() const override
Get the number of points (bins in this case) associated with the workspace;.
std::vector< signal_t > m_errorsSquared
Linear array of errors for each bin.
std::vector< coord_t > m_boxLength
Vector of the length of the box in each dimension.
signal_t getSignalAt(size_t index1, size_t index2, size_t index3, size_t index4) const override
Get the signal at the specified index given in 4 dimensions (typically X,Y,Z,t)
size_t m_length
Length of the m_signals / m_errorsSquared arrays.
const std::string id() const override
A string ID for the class.
size_t getLinearIndex(size_t index1, size_t index2, size_t index3, size_t index4) const override
MDHistoWorkspace & operator&=(const MDHistoWorkspace &b)
std::vector< size_t > m_indexMaker
For converting to/from linear index to tdimensions.
const signal_t * getErrorSquaredArray() const override
void makeSingleBinWithNaN(std::vector< coord_t > &x, std::vector< signal_t > &y, std::vector< signal_t > &e) const
std::vector< coord_t > m_vertexesArray
Pre-calculated vertexes array for the 0th box.
signal_t & errorSquaredAt(size_t index) override
signal_t getSignalNormalizedAt(size_t index1, size_t index2, size_t index3) const override
Get the signal at the specified index given in 4 dimensions (typically X,Y,Z,t), normalized by cell v...
signal_t getErrorNormalizedAt(size_t index) const override
Get the error of the signal at the specified index, normalized by cell volume.
bool getIsMaskedAt(size_t index) const
Getter for the masking at a specified linear index.
signal_t getSignalNormalizedAt(size_t index1, size_t index2) const override
Get the signal at the specified index given in 4 dimensions (typically X,Y,Z,t), normalized by cell v...
Mantid::API::MDNormalization m_displayNormalization
Display normalization to use.
signal_t getErrorAt(size_t index1, size_t index2) const override
Get the error at the specified index given in 4 dimensions (typically X,Y,Z,t)
const signal_t * getSignalArray() const override
signal_t getErrorNormalizedAt(size_t index1, size_t index2, size_t index3) const override
Get the signal at the specified index given in 4 dimensions (typically X,Y,Z,t), normalized by cell v...
std::vector< size_t > indexMultiplier
To find the index into the linear array, dim0 + indexMultiplier[0]*dim1 + ...
signal_t getSignalAt(size_t index1, size_t index2) const override
Get the signal at the specified index given in 4 dimensions (typically X,Y,Z,t)
std::vector< signal_t > m_signals
Linear array of signals for each bin.
void setSignalAt(size_t index, signal_t value) override
Sets the signal at the specified index.
void setErrorSquaredAt(size_t index, signal_t value) override
Sets the error (squared) at the specified index.
signal_t * mutableErrorSquaredArray() override
MDHistoWorkspace * doClone() const override
Virtual clone method. Not implemented to force implementation in children.
signal_t getSignalAt(size_t index1, size_t index2, size_t index3) const override
Get the signal at the specified index given in 4 dimensions (typically X,Y,Z,t)
std::vector< signal_t > m_numEvents
Number of contributing events for each bin.
Kernel::SpecialCoordinateSystem m_coordSystem
An "ImplicitFunction" defining a hyper-cuboid-shaped region in N dimensions.
The concrete, templated class for properties.
MatrixWorkspace_sptr MANTID_API_DLL operator/=(const MatrixWorkspace_sptr &lhs, const MatrixWorkspace_sptr &rhs)
Divide two workspaces.
MatrixWorkspace_sptr MANTID_API_DLL operator+=(const MatrixWorkspace_sptr &lhs, const MatrixWorkspace_sptr &rhs)
Adds two workspaces.
MatrixWorkspace_sptr MANTID_API_DLL operator-=(const MatrixWorkspace_sptr &lhs, const MatrixWorkspace_sptr &rhs)
Subtracts two workspaces.
MDNormalization
Enum describing different ways to normalize the signal in a MDWorkspace.
Definition IMDIterator.h:25
@ NoNormalization
Don't normalize = return raw counts.
Definition IMDIterator.h:27
MatrixWorkspace_sptr MANTID_API_DLL operator*=(const MatrixWorkspace_sptr &lhs, const MatrixWorkspace_sptr &rhs)
Multiply two workspaces.
std::shared_ptr< MDHistoWorkspace > MDHistoWorkspace_sptr
A shared pointer to a MDHistoWorkspace.
std::shared_ptr< const MDHistoWorkspace > MDHistoWorkspace_const_sptr
A shared pointer to a const MDHistoWorkspace.
std::shared_ptr< MDHistoDimension > MDHistoDimension_sptr
Shared pointer to a MDHistoDimension.
SpecialCoordinateSystem
Special coordinate systems for Q3D.
Helper class which provides the Collimation Length for SANS instruments.
float coord_t
Typedef for the data type to use for coordinate axes in MD objects such as MDBox, MDEventWorkspace,...
Definition MDTypes.h:27
double signal_t
Typedef for the signal recorded in a MDBox, etc.
Definition MDTypes.h:36
Holds X, Y, E for a line plot.