25const
std::
string DivideMD::name()
const {
return "DivideMD"; }
40 throw std::runtime_error(
"Cannot divide by a MDEventWorkspace on the RHS.");
42 throw std::runtime_error(
"A MDEventWorkspace can only be divided by a scalar.");
54 float scalarErrorSquared = scalarError * scalarError;
55 float inverseScalarSquared = 1.f / (scalar * scalar);
59 std::vector<API::IMDNode *> boxes;
60 parentBox->
getBoxes(boxes, 1000,
true);
62 bool fileBackedTarget(
false);
65 fileBackedTarget =
true;
69 for (
auto &boxe : boxes) {
73 typename std::vector<MDE> &events = box->getEvents();
74 auto it = events.begin();
75 auto it_end = events.end();
76 for (; it != it_end; it++) {
78 float oldSignal = it->getSignal();
79 float signal = oldSignal / scalar;
80 float errorSquared = it->getErrorSquared() * inverseScalarSquared +
81 scalarErrorSquared * oldSignal * oldSignal * inverseScalarSquared * inverseScalarSquared;
82 it->setSignal(signal);
83 it->setErrorSquared(errorSquared);
88 if (fileBackedTarget && ic > 0) {
104 throw std::runtime_error(
"A MDEventWorkspace can only be divided by a scalar.");
106 throw std::runtime_error(
"DivideMD::execEvent(): Error creating output MDEventWorkspace.");
115 out->divide(*operand);
122 out->divide(scalar->y(0)[0], scalar->e(0)[0]);
#define DECLARE_ALGORITHM(classname)
#define CALL_MDEVENT_FUNCTION(funcname, workspace)
Macro that makes it possible to call a templated method for a MDEventWorkspace using a IMDEventWorksp...
void setFileNeedsUpdating(bool value)
Sets the marker set to true when a file-backed workspace needs its back-end file updated (by calling ...
virtual void getBoxes(std::vector< IMDNode * > &boxes, size_t maxDepth, bool leafOnly)=0
Fill a vector with all the boxes who are the childred of this one up to a certain depth.
Templated super-class of a multi-dimensional event "box".
Templated class for a multi-dimensional event "box".
std::shared_ptr< MDEventWorkspace< MDE, nd > > sptr
Typedef for a shared pointer of this kind of event workspace.
MDBoxBase< MDE, nd > * getBox()
void refreshCache() override
Refresh the cache (integrated signal of each box)
Mantid::API::BoxController_sptr getBoxController() override
Returns the BoxController used in this workspace.
bool isFileBacked() const override
Buffer objects that need to be written out to disk so as to optimize writing operations.
void toWrite(ISaveable *item)
Call this method when an object is ready to be written out to disk.
An interface for objects that can be cached or saved to disk.
Mantid::API::IMDEventWorkspace_sptr m_rhs_event
Mantid::API::IMDEventWorkspace_sptr m_lhs_event
For checkInputs.
Mantid::DataObjects::WorkspaceSingleValue_sptr m_rhs_scalar
Mantid::API::IMDEventWorkspace_sptr m_out_event
Output MDEventWorkspace.
DivideMD : divide operation for MDWorkspaces.
void execHistoScalar(Mantid::DataObjects::MDHistoWorkspace_sptr out, Mantid::DataObjects::WorkspaceSingleValue_const_sptr scalar) override
Run the algorithm with a MDHisotWorkspace as output, scalar and operand.
void execHistoHisto(Mantid::DataObjects::MDHistoWorkspace_sptr out, Mantid::DataObjects::MDHistoWorkspace_const_sptr operand) override
Run the algorithm with a MDHisotWorkspace as output and operand.
void execEventScalar(typename Mantid::DataObjects::MDEventWorkspace< MDE, nd >::sptr ws)
Perform the operation with MDEventWorkpsace as LHS and a scalar as RHS Will do "ws /= scalar".
bool commutative() const override
Is the operation commutative?
void checkInputs() override
Check the inputs and throw if the algorithm cannot be run.
void execEvent() override
Run the algorithm with an MDEventWorkspace as output.
int version() const override
Algorithm's version for identification.
std::shared_ptr< const WorkspaceSingleValue > WorkspaceSingleValue_const_sptr
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.