24using namespace Kernel;
31template <
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.");
58 "The name of the CalFile with grouping data.");
60 "The name of the CalFile with grouping data.");
63 "The masked workspace.");
71 std::map<std::string, std::string> issues;
72 const auto noInputFile =
isDefault(
"InputCalFile");
73 const auto noOutputFile =
isDefault(
"OutputCalFile");
74 if (!noInputFile && noOutputFile) {
75 issues[
"OutputCalFile"] =
"Output file name is missing.";
76 }
else if (noInputFile && !noOutputFile) {
77 issues[
"InputCalFile"] =
"Input file name is missing.";
88 g_log.
error() <<
"No InputCalFle or OutputWorkspace specified; " << this->
name() <<
" will do nothing.\n";
91 const size_t nspec =
m_inputW->getNumberHistograms();
92 for (
size_t i = 0; i < nspec; ++i) {
94 const auto &dets =
m_inputW->getSpectrum(i).getDetectorIDs();
99 const size_t num_bins =
m_inputW->y(i).size();
100 for (
size_t j = 0; j < num_bins; ++j) {
101 const double val =
m_inputW->y(i)[j];
103 for (
const auto det : dets) {
111 const double p =
static_cast<double>(i) /
static_cast<double>(nspec);
112 progress(p,
"Generating detector map");
130 auto &detectorInfo = outputW->mutableDetectorInfo();
131 for (
const auto &selection :
m_umap) {
132 detectorInfo.setMasked(detectorInfo.indexOf(selection.first), selection.second);
135 const auto &spectrumInfo = outputW->spectrumInfo();
136 for (
size_t i = 0; i < spectrumInfo.size(); ++i) {
137 if (spectrumInfo.hasDetectors(i) && spectrumInfo.isMasked(i))
138 outputW->getSpectrum(i).clearData();
155 if (select_mode ==
"SelectIf")
161 std::string select_operator =
getProperty(
"Operator");
163 if (select_operator ==
"LessEqual")
165 else if (select_operator ==
"Less")
167 else if (select_operator ==
"GreaterEqual")
169 else if (select_operator ==
"Greater")
171 else if (select_operator ==
"Equal")
173 else if (select_operator ==
"NotEqual")
175 else if (select_operator ==
"NotFinite")
185 const std::string oldfile =
getProperty(
"InputCalFile");
186 const std::string newfile =
getProperty(
"OutputCalFile");
187 progress(0.99,
"Creating new cal file");
188 std::ifstream oldf(oldfile.c_str());
189 if (!oldf.is_open()) {
190 g_log.
error() <<
"Unable to open grouping file " << oldfile <<
'\n';
193 std::ofstream newf(newfile.c_str());
194 if (!newf.is_open()) {
195 g_log.
error() <<
"Unable to open grouping file " << newfile <<
'\n';
199 while (getline(oldf, str)) {
201 if (str.empty() || str[0] ==
'#') {
205 std::istringstream istr(str);
206 int n, udet, sel, group;
208 istr >>
n >> udet >> offset >> sel >> group;
209 const auto it =
m_umap.find(udet);
213 selection = sel != 0;
215 selection = (*it).second;
217 newf << std::fixed << std::setw(9) <<
n << std::fixed << std::setw(15) << udet << std::fixed << std::setprecision(7)
218 << 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.
void retrieveProperties()
Get the input properties and store them in the object variables.
void createNewCalFile()
Create a new cal file based on the old file.
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.
std::shared_ptr< MatrixWorkspace > MatrixWorkspace_sptr
shared pointer to the matrix workspace base class
@ Input
An input workspace.
@ Output
An output workspace.