43 const Peak &fullPeak =
dynamic_cast<const Peak &
>(p);
54using namespace Kernel;
56using API::IPeaksWorkspace;
71 "The input workspace");
73 "The filtered workspace");
76 const std::string FILTER(
"Filter Options");
77 std::vector<std::string> filters{
"h+k+l",
"h^2+k^2+l^2",
"m^2+n^2+p^2",
"Intensity",
"Signal/Noise",
78 "QMod",
"Wavelength",
"DSpacing",
"TOF",
"RunNumber"};
79 declareProperty(
"FilterVariable",
"h+k+l", std::make_shared<StringListValidator>(filters),
80 "The variable on which to filter the peaks");
84 std::vector<std::string> operation{
"<",
">",
"=",
"!=",
"<=",
">="};
85 declareProperty(
"Operator",
"<", std::make_shared<StringListValidator>(operation),
"");
91 const std::string SELECT(
"Select Bank by Name");
92 std::vector<std::string> action{
"=",
"!="};
93 declareProperty(
"Criterion",
"=", std::make_shared<StringListValidator>(action),
"");
94 declareProperty(
"BankName",
"",
"Selected bank name, empty means skip selection. Applicable only to PeaksWorkspace");
107 filteredWS->copyExperimentInfoFrom(inputWS.get());
109 const double filterValue =
getProperty(
"FilterValue");
110 const std::string Operator =
getProperty(
"Operator");
111 const std::string filterVariable =
getProperty(
"FilterVariable");
113 const std::string bankname =
getProperty(
"BankName");
114 const std::string criterion =
getProperty(
"Criterion");
116 if (!bankname.empty() && (inputWS->id() ==
"PeaksWorkspace")) {
120 if (criterion ==
"=")
121 filterPeaksStr<std::equal_to<std::string>>(*inputWS, *selectedWS, filterFunction, bankname);
122 else if (criterion ==
"!=")
123 filterPeaksStr<std::not_equal_to<std::string>>(*inputWS, *selectedWS, filterFunction, bankname);
125 throw std::invalid_argument(
"Unsupported operator " + criterion +
" for BankName filter");
127 inputWS = selectedWS;
135 filterPeaks<std::less<double>>(*inputWS, *filteredWS, filterFunction, filterValue);
136 else if (Operator ==
">")
137 filterPeaks<std::greater<double>>(*inputWS, *filteredWS, filterFunction, filterValue);
138 else if (Operator ==
"=")
139 filterPeaks<std::equal_to<double>>(*inputWS, *filteredWS, filterFunction, filterValue);
140 else if (Operator ==
"!=")
141 filterPeaks<std::not_equal_to<double>>(*inputWS, *filteredWS, filterFunction, filterValue);
142 else if (Operator ==
"<=")
143 filterPeaks<std::less_equal<double>>(*inputWS, *filteredWS, filterFunction, filterValue);
144 else if (Operator ==
">=")
145 filterPeaks<std::greater_equal<double>>(*inputWS, *filteredWS, filterFunction, filterValue);
147 throw std::invalid_argument(
"Unknown Operator " + Operator);
165 if (filterVariable ==
"h+k+l")
166 filterFunction = &HKLSum;
167 else if (filterVariable ==
"h^2+k^2+l^2")
168 filterFunction = &HKL2;
169 else if (filterVariable ==
"m^2+n^2+p^2")
170 filterFunction = &MNP2;
171 else if (filterVariable ==
"Intensity")
172 filterFunction = &intensity;
173 else if (filterVariable ==
"Wavelength")
174 filterFunction = &wavelength;
175 else if (filterVariable ==
"DSpacing")
176 filterFunction = &dspacing;
177 else if (filterVariable ==
"TOF")
178 filterFunction = &tof;
179 else if (filterVariable ==
"Signal/Noise")
180 filterFunction = &SN;
181 else if (filterVariable ==
"QMod")
182 filterFunction = &QMOD;
183 else if (filterVariable ==
"RunNumber")
184 filterFunction = &RUN;
186 throw std::invalid_argument(
"Unknown FilterVariable: " + filterVariable);
187 return filterFunction;
#define DECLARE_ALGORITHM(classname)
void declareProperty(std::unique_ptr< Kernel::Property > p, const std::string &doc="") override
Add a property to the list of managed properties.
TypedValue getProperty(const std::string &name) const override
Get the value of a property.
bool isDefault(const std::string &name) const
A property class for workspaces.
void init() override
Override for algorithm init.
const std::string name() const override
Algorithm's name for identification.
FilterFunction getFilterVariableFunction(const std::string &filterVariable) const
Get a function to filter peaks by.
void exec() override
Override for algorithm exec.
const std::string category() const override
Algorithm's category for identification.
std::function< double(const Geometry::IPeak &)> FilterFunction
Typedef for the function to get the variable we're filtering against.
std::function< std::string(const Geometry::IPeak &)> FilterFunctionStr
int version() const override
Algorithm's version for identification.
Structure describing a single-crystal peak.
const std::string & getBankName() const
Find the name of the bank that is the parent of the detector.
Structure describing a single-crystal peak.
virtual double getH() const =0
virtual double getTOF() const =0
virtual double getSigmaIntensity() const =0
virtual double getWavelength() const =0
virtual double getDSpacing() const =0
virtual Mantid::Kernel::V3D getIntHKL() const =0
virtual double getK() const =0
virtual int getRunNumber() const =0
virtual Mantid::Kernel::V3D getQSampleFrame() const =0
virtual double getIntensity() const =0
virtual double getL() const =0
virtual Mantid::Kernel::V3D getIntMNP() const =0
IPropertyManager * setProperty(const std::string &name, const T &value)
Templated method to set the value of a PropertyWithValue.
void setPropertyGroup(const std::string &name, const std::string &group)
Set the group for a given property.
static T & Instance()
Return a reference to the Singleton instance, creating it if it does not already exist Creation is do...
double norm() const noexcept
constexpr double norm2() const noexcept
Vector length squared.
std::shared_ptr< IPeaksWorkspace > IPeaksWorkspace_sptr
shared pointer to Mantid::API::IPeaksWorkspace
std::shared_ptr< const IPeaksWorkspace > IPeaksWorkspace_const_sptr
shared pointer to Mantid::API::IPeaksWorkspace (const version)
constexpr double EMPTY_DBL() noexcept
Returns what we consider an "empty" double within a property.
@ Input
An input workspace.
@ Output
An output workspace.