Mantid
Loading...
Searching...
No Matches
MDGridBox.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
15#include "MantidKernel/Task.h"
17
18namespace Mantid {
19namespace DataObjects {
20
21#ifndef __INTEL_COMPILER // As of July 13, the packing has no effect for the
22 // Intel compiler and produces a warning
23#pragma pack(push, 4) // Ensure the structure is no larger than it needs to
24#endif
25
26//===============================================================================================
42class MANTID_DATAOBJECTS_DLL MDGridBox : public MDBoxBase<MDE, nd> {
43public:
44 MDGridBox(std::shared_ptr<API::BoxController> &bc, const uint32_t depth,
45 const std::vector<Mantid::Geometry::MDDimensionExtents<coord_t>> &extentsVector);
46 MDGridBox(Mantid::API::BoxController *const bc, const uint32_t depth,
47 const std::vector<Mantid::Geometry::MDDimensionExtents<coord_t>> &extentsVector);
48
50
52
53 ~MDGridBox() override;
54 // ----------------------------- ISaveable Methods
55 // ------------------------------------------------------
59 Kernel::ISaveable *getISaveable() override { return nullptr; }
63 Kernel::ISaveable *getISaveable() const override { return nullptr; }
65 void setFileBacked(const uint64_t /*fileLocation*/, const size_t /*fileSize*/, const bool /*markSaved*/) override;
66 void setFileBacked() override;
67 void clearFileBacked(bool loadDiskBackedData) override;
68 void clear() override;
69 void clearDataFromMemory() override { /*it seems works on boxes only though recursive
70 clearing makes sence, not yet implemented*/
71 }
74 void saveAt(API::IBoxControllerIO *const, uint64_t /*position*/) const override { /*Not saveable */
75 }
76
79 void loadAndAddFrom(API::IBoxControllerIO *const, uint64_t /*position*/, size_t /* Size */,
80 std::vector<coord_t> & /*memory*/) override { /*Not directly loadable */
81 }
82
85 void loadAndAddFrom(API::IBoxControllerIO *const, uint64_t /*position*/,
86 size_t /* Size */) override { /*Not directly loadable */
87 }
88 void reserveMemoryForLoad(uint64_t /* Size */) override { /*Not directly loadable */
89 }
90 //-------------------------------------------------------------------------------------------------------
91 // Setters for cached values
92 void setNPoints(const uint64_t &n) { nPoints = n; }
93 //-------------------------------------------------------------------------------------------------------
97 uint64_t getNPoints() const override { return nPoints; }
100 uint64_t getTotalDataSize() const override { return nPoints; }
104 size_t getDataInMemorySize() const override;
105
106 size_t getNumDims() const override;
107 size_t getNumMDBoxes() const override;
108 size_t getNumChildren() const override;
111 bool isBox() const override { return false; }
112
113 size_t getChildIndexFromID(size_t childId) const;
114 API::IMDNode *getChild(size_t index) override;
115 void setChild(size_t index, MDGridBox<MDE, nd> *newChild);
116
117 void setChildren(const std::vector<API::IMDNode *> &otherBoxes, const size_t indexStart,
118 const size_t indexEnd) override;
119
120 void getBoxes(std::vector<API::IMDNode *> &outBoxes, size_t maxDepth, bool leafOnly) override;
121 void getBoxes(std::vector<API::IMDNode *> &outBoxes, size_t maxDepth, bool leafOnly,
122 Mantid::Geometry::MDImplicitFunction *function) override;
123
124 void getBoxes(std::vector<API::IMDNode *> &outBoxes, const std::function<bool(API::IMDNode *)> &cond) final override;
125
126 const API::IMDNode *getBoxAtCoord(const coord_t *coords) override;
127
128 void transformDimensions(std::vector<double> &scaling, std::vector<double> &offset) override;
129 //----------------------------------------------------------------------------
130
131 std::vector<MDE> *getEventsCopy() override;
132
133 //----------------------------------------------------------------------------------------------------------------------
134 size_t addEvent(const MDE &event) override;
135 size_t addEventUnsafe(const MDE &event) override;
136
137 /*---------------> EVENTS from event data
138 * <-------------------------------------------------------------*/
139 void buildAndAddEvent(const signal_t Signal, const signal_t errorSq, const std::vector<coord_t> &point,
140 uint16_t expInfoIndex, uint16_t goniometerIndex, uint32_t detectorId) override;
141 void buildAndAddEventUnsafe(const signal_t Signal, const signal_t errorSq, const std::vector<coord_t> &point,
142 uint16_t expInfoIndex, uint16_t goniometerIndex, uint32_t detectorId) override;
143 size_t buildAndAddEvents(const std::vector<signal_t> &sigErrSq, const std::vector<coord_t> &Coord,
144 const std::vector<uint16_t> &expInfoIndex, const std::vector<uint16_t> &goniometerIndex,
145 const std::vector<uint32_t> &detectorId) override;
146 //----------------------------------------------------------------------------------------------------------------------
147
148 void centerpointBin(MDBin<MDE, nd> &bin, bool *fullyContained) const override;
149
150 void generalBin(MDBin<MDE, nd> & /*bin*/, Mantid::Geometry::MDImplicitFunction & /*function*/) const override {}
151
152 void integrateSphere(Mantid::API::CoordTransform &radiusTransform, const coord_t radiusSquared, signal_t &signal,
153 signal_t &errorSquared, const coord_t innerRadiusSquared = 0.0,
154 const bool useOnePercentBackgroundCorrection = true) const override;
155
156 void centroidSphere(Mantid::API::CoordTransform &radiusTransform, const coord_t radiusSquared, coord_t *centroid,
157 signal_t &signal) const override;
158
159 void integrateCylinder(Mantid::API::CoordTransform &radiusTransform, const coord_t radius, const coord_t length,
160 signal_t &signal, signal_t &errorSquared, std::vector<signal_t> &signal_fit) const override;
161
162 void splitContents(size_t index, Kernel::ThreadScheduler *ts = nullptr);
163
164 void splitAllIfNeeded(Kernel::ThreadScheduler *ts = nullptr) override;
165
166 void refreshCache(Kernel::ThreadScheduler *ts = nullptr) override;
167
168 void calculateGridCaches() override final;
169
170 bool getIsMasked() const override;
172 void mask() override;
174 void unmask() override;
175 // ======================= Testing/Debugging Methods =================
177 std::vector<MDBoxBase<MDE, nd> *> &getBoxes() { return m_Children; }
178
179 //-------------------------------------------------------------------------
182 void calculateCentroid(coord_t * /*centroid*/) const override {
183 throw(std::runtime_error("This function should not be called on MDGridBox "
184 "(as its meaning for MDbox is dubious too)"));
185 }
186 //-------------------------------------------------------------------------
189 void calculateCentroid(coord_t * /*centroid*/, const int /*expInfoIndex*/) const override {
190 throw(std::runtime_error("This function should not be called on MDGridBox "
191 "(as its meaning for MDbox is dubious too)"));
192 }
193 //-------------------------------------------------------------------------
196 coord_t *getCentroid() const override {
197 throw(std::runtime_error("This function should not be called on MDGridBox "
198 "(as its meaning for MDbox is dubious too)"));
199 }
200
201public:
203 using sptr = std::shared_ptr<MDGridBox<MDE, nd>>;
204
206 using boxVector_t = std::vector<MDBoxBase<MDE, nd> *>;
207
208private:
210 size_t calculateChildIndex(const MDE &event) const;
211
213 size_t split[nd];
216 size_t splitCumul[nd];
219 double m_SubBoxSize[nd];
220
223 size_t numBoxes;
224
227 std::vector<MDBoxBase<MDE, nd> *> m_Children;
228
233
235 size_t nPoints;
236
237 //=================== PRIVATE METHODS =======================================
238
239 size_t getLinearIndex(size_t *indices) const;
240
242 void fillBoxShell(const size_t tot, const coord_t ChildInverseVolume);
247 MDGridBox() = default;
249 size_t initGridBox();
250};
251
252#ifndef __INTEL_COMPILER
253#pragma pack(pop) // Return to default packing size
254#endif
255
256} // namespace DataObjects
257} // namespace Mantid
std::map< DeltaEMode::Type, std::string > index
Definition: DeltaEMode.cpp:19
#define TMDE_CLASS
Macro to make declaring template classes faster.
Definition: MDTypes.h:58
double radius
Definition: Rasterize.cpp:31
This class is used by MDBox and MDGridBox in order to intelligently determine optimal behavior.
Definition: BoxController.h:33
Unique SingleValueParameter Declaration for InputNDimensions.
The header describes interface to IO Operations perfomed by the box controller May be replaced by a b...
MDBin : Class describing a single bin in a dense, Multidimensional histogram.
Definition: MDBin.h:32
Templated super-class of a multi-dimensional event "box".
Definition: MDBoxBase.h:50
Templated class for a multi-dimensional event "box".
Definition: MDBox.h:45
Templated class for a GRIDDED multi-dimensional event "box".
Definition: MDGridBox.h:42
size_t getDataInMemorySize() const override
size_t addEventUnsafe(const MDE &event) override
Add a single event, with no mutex locking.
void setChildren(const std::vector< API::IMDNode * > &otherBoxes, const size_t indexStart, const size_t indexEnd) override
std::vector< MDBoxBase< MDE, nd > * > m_Children
1D array of boxes contained within.
Definition: MDGridBox.h:227
const API::IMDNode * getBoxAtCoord(const coord_t *coords) override
void saveAt(API::IBoxControllerIO *const, uint64_t) const override
Save the box at specific disk position using the class, respoinsible for the file IO.
Definition: MDGridBox.h:74
void splitAllIfNeeded(Kernel::ThreadScheduler *ts=nullptr) override
void setFileBacked(const uint64_t, const size_t, const bool) override
Recursively make all underlaying boxes file-backed.
void loadAndAddFrom(API::IBoxControllerIO *const, uint64_t, size_t, std::vector< coord_t > &) override
Load the box data of specified size from the disk location provided using the class,...
Definition: MDGridBox.h:79
MDGridBox()=default
Private constructor as it does not work without box controller.
coord_t diagonalSquared
Length (squared) of the diagonal through every dimension = sum( boxSize[i]^2 ) Used in some calculati...
Definition: MDGridBox.h:232
size_t calculateChildIndex(const MDE &event) const
Compute the index of the child box for the given event.
Kernel::ISaveable * getISaveable() override
get object responsible for saving the box to a file.
Definition: MDGridBox.h:59
void centerpointBin(MDBin< MDE, nd > &bin, bool *fullyContained) const override
Perform centerpoint binning of events.
void setNPoints(const uint64_t &n)
Definition: MDGridBox.h:92
std::shared_ptr< MDGridBox< MDE, nd > > sptr
Typedef for a shared pointer to a MDGridBox.
Definition: MDGridBox.h:203
void generalBin(MDBin< MDE, nd > &, Mantid::Geometry::MDImplicitFunction &) const override
General binning method for any shape.
Definition: MDGridBox.h:150
void calculateGridCaches() override final
std::vector< MDE > * getEventsCopy() override
Return a copy of contained events.
size_t addEvent(const MDE &event) override
Add a single event.
void buildAndAddEventUnsafe(const signal_t Signal, const signal_t errorSq, const std::vector< coord_t > &point, uint16_t expInfoIndex, uint16_t goniometerIndex, uint32_t detectorId) override
void setChild(size_t index, MDGridBox< MDE, nd > *newChild)
void loadAndAddFrom(API::IBoxControllerIO *const, uint64_t, size_t) override
Load the box data of specified size from the disk location provided using the class,...
Definition: MDGridBox.h:85
void getBoxes(std::vector< API::IMDNode * > &outBoxes, const std::function< bool(API::IMDNode *)> &cond) final override
size_t nPoints
Cached number of points contained (including all sub-boxes)
Definition: MDGridBox.h:235
coord_t * getCentroid() const override
The function used to satisfy IMDNode interface but the physical meaning is unclear.
Definition: MDGridBox.h:196
void transformDimensions(std::vector< double > &scaling, std::vector< double > &offset) override
MDGridBox(const MDGridBox< MDE, nd > &other, Mantid::API::BoxController *const otherBC)
void refreshCache(Kernel::ThreadScheduler *ts=nullptr) override
void centroidSphere(Mantid::API::CoordTransform &radiusTransform, const coord_t radiusSquared, coord_t *centroid, signal_t &signal) const override
Find the centroid around a sphere.
size_t getChildIndexFromID(size_t childId) const
bool isBox() const override
to avoid casting (which need also the number of dimensions) method say if Node is a box.
Definition: MDGridBox.h:111
MDGridBox(std::shared_ptr< API::BoxController > &bc, const uint32_t depth, const std::vector< Mantid::Geometry::MDDimensionExtents< coord_t > > &extentsVector)
size_t getNumDims() const override
MDGridBox(Mantid::API::BoxController *const bc, const uint32_t depth, const std::vector< Mantid::Geometry::MDDimensionExtents< coord_t > > &extentsVector)
void clearFileBacked(bool loadDiskBackedData) override
size_t getNumChildren() const override
MDGridBox(MDBox< MDE, nd > *box)
void reserveMemoryForLoad(uint64_t) override
Definition: MDGridBox.h:88
MDGridBox(const MDGridBox< MDE, nd > &box)
private default copy constructor as the only correct constructor is the one with box controller
void getBoxes(std::vector< API::IMDNode * > &outBoxes, size_t maxDepth, bool leafOnly) override
uint64_t getTotalDataSize() const override
Definition: MDGridBox.h:100
void calculateCentroid(coord_t *, const int) const override
The function used to satisfy IMDNode interface but the physical meaning is unclear.
Definition: MDGridBox.h:189
void buildAndAddEvent(const signal_t Signal, const signal_t errorSq, const std::vector< coord_t > &point, uint16_t expInfoIndex, uint16_t goniometerIndex, uint32_t detectorId) override
Kernel::ISaveable * getISaveable() const override
get const object responsible for saving the box to a file.
Definition: MDGridBox.h:63
size_t numBoxes
How many boxes in the boxes vector? This is just to avoid boxes.size() calls.
Definition: MDGridBox.h:223
void calculateCentroid(coord_t *) const override
The function used to satisfy IMDNode interface but the physical meaning is unclear.
Definition: MDGridBox.h:182
std::vector< MDBoxBase< MDE, nd > * > boxVector_t
Typedef for a vector of MDBoxBase pointers.
Definition: MDGridBox.h:206
size_t initGridBox()
common part of MDGridBox contstructor;
size_t buildAndAddEvents(const std::vector< signal_t > &sigErrSq, const std::vector< coord_t > &Coord, const std::vector< uint16_t > &expInfoIndex, const std::vector< uint16_t > &goniometerIndex, const std::vector< uint32_t > &detectorId) override
void integrateCylinder(Mantid::API::CoordTransform &radiusTransform, const coord_t radius, const coord_t length, signal_t &signal, signal_t &errorSquared, std::vector< signal_t > &signal_fit) const override
Cylinder (peak) integration.
void integrateSphere(Mantid::API::CoordTransform &radiusTransform, const coord_t radiusSquared, signal_t &signal, signal_t &errorSquared, const coord_t innerRadiusSquared=0.0, const bool useOnePercentBackgroundCorrection=true) const override
Sphere (peak) integration.
size_t getLinearIndex(size_t *indices) const
API::IMDNode * getChild(size_t index) override
void getBoxes(std::vector< API::IMDNode * > &outBoxes, size_t maxDepth, bool leafOnly, Mantid::Geometry::MDImplicitFunction *function) override
void clearDataFromMemory() override
Definition: MDGridBox.h:69
void fillBoxShell(const size_t tot, const coord_t ChildInverseVolume)
size_t getNumMDBoxes() const override
void splitContents(size_t index, Kernel::ThreadScheduler *ts=nullptr)
uint64_t getNPoints() const override
Uses the cached value of points stored in the grid box.
Definition: MDGridBox.h:97
Simple class that holds the extents (min/max) of a given dimension in a MD workspace or MDBox.
An "ImplicitFunction" defining a hyper-cuboid-shaped region in N dimensions.
An interface for objects that can be cached or saved to disk.
Definition: ISaveable.h:28
The ThreadScheduler object defines how tasks are allocated to threads and in what order.
void split(const int A, int &S, int &V)
Split a number into the sign and positive value.
Definition: Acomp.cpp:42
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
STL namespace.