24using namespace Kernel;
31template <
class T>
struct not_finite {
35 constexpr bool operator()(
const T &
value,
const T &ignored)
const {
37 return !std::isfinite(
value);
47 "A 1D Workspace that contains values to select against");
48 const std::vector<std::string> select_mode{
"SelectIf",
"DeselectIf"};
49 declareProperty(
"Mode",
"SelectIf", std::make_shared<StringListValidator>(select_mode),
50 "Mode to select or deselect detectors based on comparison with values.");
51 const std::vector<std::string> select_operator{
"Equal",
"NotEqual",
"Greater",
"GreaterEqual",
52 "Less",
"LessEqual",
"NotFinite"};
53 declareProperty(
"Operator",
"Equal", std::make_shared<StringListValidator>(select_operator),
54 "Operator to compare to given values.");
57 "The name of the CalFile with grouping data.");
59 "The name of the CalFile with grouping data.");
62 "The masked workspace.");
70 std::map<std::string, std::string> issues;
71 const auto noInputFile =
isDefault(
"InputCalFile");
72 const auto noOutputFile =
isDefault(
"OutputCalFile");
73 if (!noInputFile && noOutputFile) {
74 issues[
"OutputCalFile"] =
"Output file name is missing.";
75 }
else if (noInputFile && !noOutputFile) {
76 issues[
"InputCalFile"] =
"Input file name is missing.";
87 g_log.
error() <<
"No InputCalFle or OutputWorkspace specified; " << this->
name() <<
" will do nothing.\n";
90 const size_t nspec =
m_inputW->getNumberHistograms();
91 for (
size_t i = 0; i < nspec; ++i) {
93 const auto &dets =
m_inputW->getSpectrum(i).getDetectorIDs();
98 const size_t num_bins =
m_inputW->y(i).size();
99 for (
size_t j = 0; j < num_bins; ++j) {
100 const double val =
m_inputW->y(i)[j];
102 for (
const auto det : dets) {
110 const double p =
static_cast<double>(i) /
static_cast<double>(nspec);
111 progress(p,
"Generating detector map");
129 auto &detectorInfo = outputW->mutableDetectorInfo();
130 for (
const auto &selection :
m_umap) {
131 detectorInfo.setMasked(detectorInfo.indexOf(selection.first), selection.second);
134 const auto &spectrumInfo = outputW->spectrumInfo();
135 for (
size_t i = 0; i < spectrumInfo.size(); ++i) {
136 if (spectrumInfo.hasDetectors(i) && spectrumInfo.isMasked(i))
137 outputW->getSpectrum(i).clearData();
154 if (select_mode ==
"SelectIf")
160 std::string select_operator =
getProperty(
"Operator");
162 if (select_operator ==
"LessEqual")
164 else if (select_operator ==
"Less")
166 else if (select_operator ==
"GreaterEqual")
168 else if (select_operator ==
"Greater")
170 else if (select_operator ==
"Equal")
172 else if (select_operator ==
"NotEqual")
174 else if (select_operator ==
"NotFinite")
184 const std::string oldfile =
getProperty(
"InputCalFile");
185 const std::string newfile =
getProperty(
"OutputCalFile");
186 progress(0.99,
"Creating new cal file");
187 std::ifstream oldf(oldfile.c_str());
188 if (!oldf.is_open()) {
189 g_log.
error() <<
"Unable to open grouping file " << oldfile <<
'\n';
192 std::ofstream newf(newfile.c_str());
193 if (!newf.is_open()) {
194 g_log.
error() <<
"Unable to open grouping file " << newfile <<
'\n';
198 while (getline(oldf, str)) {
200 if (str.empty() || str[0] ==
'#') {
204 std::istringstream istr(str);
207 istr >>
n >> udet >> offset >> sel >>
group;
208 const auto it =
m_umap.find(udet);
212 selection = sel != 0;
214 selection = (*it).second;
216 newf << std::fixed << std::setw(9) <<
n << std::fixed << std::setw(15) << udet << std::fixed << std::setprecision(7)
217 << 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.