25using namespace Kernel;
32template <
class T>
struct not_finite {
36 constexpr bool operator()(
const T &
value,
const T &ignored)
const {
38 return !std::isfinite(
value);
48 "A 1D Workspace that contains values to select against");
49 const std::vector<std::string> select_mode{
"SelectIf",
"DeselectIf"};
50 declareProperty(
"Mode",
"SelectIf", std::make_shared<StringListValidator>(select_mode),
51 "Mode to select or deselect detectors based on comparison with values.");
52 const std::vector<std::string> select_operator{
"Equal",
"NotEqual",
"Greater",
"GreaterEqual",
53 "Less",
"LessEqual",
"NotFinite"};
54 declareProperty(
"Operator",
"Equal", std::make_shared<StringListValidator>(select_operator),
55 "Operator to compare to given values.");
57 auto positiveIntValidator = std::make_shared<BoundedValidator<int>>();
58 positiveIntValidator->setLower(0);
61 "The start of the spectrum range on which to apply the mask");
64 "The end of the spectrum range on which to apply the mask.");
66 "The name of the CalFile with grouping data.");
68 "The name of the CalFile with grouping data.");
71 "The masked workspace.");
79 std::map<std::string, std::string> issues;
80 const auto noInputFile =
isDefault(
"InputCalFile");
81 const auto noOutputFile =
isDefault(
"OutputCalFile");
82 if (!noInputFile && noOutputFile) {
83 issues[
"OutputCalFile"] =
"Output file name is missing.";
84 }
else if (noInputFile && !noOutputFile) {
85 issues[
"InputCalFile"] =
"Input file name is missing.";
88 const int nspec_start =
getProperty(
"StartWorkspaceIndex");
89 const int nspec_end =
getProperty(
"EndWorkspaceIndex");
90 if (nspec_end < nspec_start) {
91 issues[
"EndWorkspaceIndex"] =
92 "EndWorkspaceIndex should be more than StartWorkspaceIndex. Specify a value greater than " +
105 g_log.
error() <<
"No InputCalFle or OutputWorkspace specified; " << this->
name() <<
" will do nothing.\n";
110 const auto &dets =
m_inputW->getSpectrum(i).getDetectorIDs();
115 const size_t num_bins =
m_inputW->y(i).size();
116 for (
size_t j = 0; j < num_bins; ++j) {
117 const double val =
m_inputW->y(i)[j];
119 for (
const auto det : dets) {
128 progress(p,
"Generating detector map");
146 auto &detectorInfo = outputW->mutableDetectorInfo();
147 for (
const auto &selection :
m_umap) {
148 detectorInfo.setMasked(detectorInfo.indexOf(selection.first), selection.second);
151 const auto &spectrumInfo = outputW->spectrumInfo();
152 for (
size_t i = 0; i < spectrumInfo.size(); ++i) {
153 if (spectrumInfo.hasDetectors(i) && spectrumInfo.isMasked(i))
154 outputW->getSpectrum(i).clearData();
171 if (select_mode ==
"SelectIf")
177 std::string select_operator =
getProperty(
"Operator");
179 if (select_operator ==
"LessEqual")
181 else if (select_operator ==
"Less")
183 else if (select_operator ==
"GreaterEqual")
185 else if (select_operator ==
"Greater")
187 else if (select_operator ==
"Equal")
189 else if (select_operator ==
"NotEqual")
191 else if (select_operator ==
"NotFinite")
202 int nspec =
static_cast<int>(
m_inputW->getNumberHistograms());
205 throw std::invalid_argument(
"StartWorkspaceIndex should be greater than or equal to 0 and less than " +
212 if (end_ix > nspec - 1) {
213 throw std::invalid_argument(
"EndWorkspaceIndex should be greater than 0 and less than " +
std::to_string(nspec) +
214 ". Value provided is invalid.");
227 const std::string oldfile =
getProperty(
"InputCalFile");
228 const std::string newfile =
getProperty(
"OutputCalFile");
229 progress(0.99,
"Creating new cal file");
230 std::ifstream oldf(oldfile.c_str());
231 if (!oldf.is_open()) {
232 g_log.
error() <<
"Unable to open grouping file " << oldfile <<
'\n';
235 std::ofstream newf(newfile.c_str());
236 if (!newf.is_open()) {
237 g_log.
error() <<
"Unable to open grouping file " << newfile <<
'\n';
241 while (getline(oldf, str)) {
243 if (str.empty() || str[0] ==
'#') {
247 std::istringstream istr(str);
250 istr >>
n >> udet >> offset >> sel >>
group;
251 const auto it =
m_umap.find(udet);
255 selection = sel != 0;
257 selection = (*it).second;
259 newf << std::fixed << std::setw(9) <<
n << std::fixed << std::setw(15) << udet << std::fixed << std::setprecision(7)
260 << std::setw(15) << offset << std::fixed << std::setw(8) << selection << std::fixed << std::setw(8) <<
group
#define DECLARE_ALGORITHM(classname)
double value
The value of the point.
#define UNUSED_ARG(x)
Function arguments are sometimes unused in certain implmentations but are required for documentation ...
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.
void progress(double p, const std::string &msg="", double estimatedTime=0.0, int progressPrecision=0)
Sends ProgressNotification.
bool isDefault(const std::string &name) const
@ OptionalSave
to specify a file to write to but an empty string is
@ OptionalLoad
to specify a file to read but the file doesn't have to exist
A property class for workspaces.
const std::string name() const override
Algorithm's name for identification overriding a virtual method.
std::map< std::string, std::string > validateInputs() override
Validates the algorithm's input properties.
boost::function< bool(double, double)> m_compar_f
A comparator function.
void init() override
Initialisation method.
API::MatrixWorkspace_const_sptr m_inputW
The input workspace.
int m_end_ix
The end index parameter.
void retrieveProperties()
Get the input properties and store them in the object variables.
void validateAndSetIxProperties()
Execution code.
void createNewCalFile()
Create a new cal file based on the old file.
int m_start_ix
The start index parameter.
bool m_select_on
Whether select is on or off.
void outputToWorkspace()
Create an output workspace masking/unmasking the selected/deselected spectra.
udet2valuem m_umap
A map from detid to selection.
void exec() override
Executes the algorithm.
double m_value
The Value parameter.
This class is intended to fulfill the design specified in <https://github.com/mantidproject/documents...
Records the filename and the description of failure.
IPropertyManager * setProperty(const std::string &name, const T &value)
Templated method to set the value of a PropertyWithValue.
void error(const std::string &msg)
Logs at error level.
The concrete, templated class for properties.
std::shared_ptr< MatrixWorkspace > MatrixWorkspace_sptr
shared pointer to the matrix workspace base class
constexpr int EMPTY_INT() noexcept
Returns what we consider an "empty" integer within a property.
std::string to_string(const wide_integer< Bits, Signed > &n)
@ Input
An input workspace.
@ Output
An output workspace.