Mantid
Loading...
Searching...
No Matches
FindPeaksConvolve.h
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2023 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
7#pragma once
8
12#include "MantidAlgorithms/DllConfig.h"
13
14// Disable warning 4554 on windows which is inherent in the Eigen::Tensor library.
15#ifdef _MSC_VER
16#pragma warning(push)
17#pragma warning(disable : 4554)
18#include "Eigen/../unsupported/Eigen/CXX11/Tensor"
19#pragma warning(pop)
20#else
21#include "Eigen/../unsupported/Eigen/CXX11/Tensor"
22#endif
23
24#include "Eigen/Core"
25
26typedef Eigen::Tensor<double, 1> Tensor1D;
27typedef Eigen::TensorMap<const Eigen::Tensor<double, 1>> TensorMap_const;
28typedef Eigen::TensorMap<Eigen::Tensor<double, 1>> TensorMap;
29typedef Eigen::Map<const Eigen::VectorXd> EigenMap_const;
30
31namespace Mantid::HistogramData {
32class HistogramX;
33}
34
35namespace Mantid::Algorithms {
36
40class MANTID_ALGORITHMS_DLL FindPeaksConvolve : public API::Algorithm {
41public:
42 const std::string name() const override;
43 int version() const override;
44 const std::string category() const override;
45 const std::string summary() const override;
46
47private:
48 struct PeakResult {
49 const double centre;
50 const double height;
51 const double iOverSigma;
52 double getAttribute(const std::string &attrString) const;
53 };
54
55 std::unordered_map<std::string, Kernel::IValidator_sptr> m_validators;
57 size_t m_specCount = -1;
58 std::vector<int> m_specNums;
59 std::vector<std::vector<FindPeaksConvolve::PeakResult>> m_peakResults;
60 std::atomic<size_t> m_maxPeakCount;
61
62 bool m_createIntermediateWorkspaces = false;
63 bool m_findHighestDatapointInPeak = false;
64 double m_iOverSigmaThreshold = 3.0;
65 bool m_mergeNearbyPeaks = true;
66 bool m_centreBins = true;
67 Eigen::VectorXd m_pdf;
68 std::vector<std::string> m_intermediateWsNames;
69 std::mutex m_mtx;
70
71 void init() override;
72 void exec() override;
73
74 void initiateValidators();
75 std::pair<std::string, int> secondaryValidation() const;
76 const std::string validatePeakExtentInput() const;
77 const std::string validateWorkspaceIndexInput() const;
78 void storeClassProperties();
79
80 void performConvolution(const size_t dataIndex);
81 Tensor1D createKernel(const int binCount) const;
82 Tensor1D createSmoothKernel(const size_t kernelSize) const;
83 std::pair<size_t, bool> getKernelBinCount(const HistogramData::HistogramX *xData) const;
84 double getXDataValue(const HistogramData::HistogramX *xData, const size_t xIndex) const;
85 Eigen::VectorXd centreBinsXData(const HistogramData::HistogramX *xData) const;
86 void extractPeaks(const size_t dataIndex, const Tensor1D &iOverSigma, const HistogramData::HistogramX *xData,
87 const TensorMap_const &yData, const size_t peakExtentBinNumber);
88 size_t findPeakInRawData(const int xIndex, const TensorMap_const &yData, size_t peakExtentBinNumber);
89 void storePeakResults(const size_t dataIndex, std::vector<FindPeaksConvolve::PeakResult> &peakCentres);
90 void generateNormalPDF(const int peakExtentBinNumber);
91 std::vector<std::string> createIntermediateWorkspaces(const size_t dataIndex, const Tensor1D &kernel,
92 const Tensor1D &iOverSigma,
93 const HistogramData::HistogramX *xData);
94 void outputIntermediateWorkspace(const std::string &wsName, const std::vector<double> &xData,
95 const std::vector<double> &yData);
96 void outputResults();
97 void outputResultsTable(const std::string &resultHeader);
98 std::unordered_map<std::string, API::ITableWorkspace_sptr>
99 createOutputTables(const std::vector<std::string> &outputTblNames);
100 std::string populateOutputWorkspaces(const std::vector<std::string> &outputTblNames,
101 const std::unordered_map<std::string, API::ITableWorkspace_sptr> &outputTbls);
102 API::WorkspaceGroup_sptr groupOutputWorkspaces(const std::string &outputName,
103 const std::vector<std::string> &outputTblNames);
104};
105
106} // namespace Mantid::Algorithms
std::string name
Definition Run.cpp:60
Eigen::Map< const Eigen::VectorXd > EigenMap_const
Eigen::Tensor< double, 1 > Tensor1D
Eigen::TensorMap< Eigen::Tensor< double, 1 > > TensorMap
Eigen::TensorMap< const Eigen::Tensor< double, 1 > > TensorMap_const
Base class from which all concrete algorithm classes should be derived.
Definition Algorithm.h:76
FindPeaksConvolve : Finds peak centres using convolution with a shoebox kernel to approximate the sec...
std::vector< std::vector< FindPeaksConvolve::PeakResult > > m_peakResults
std::vector< std::string > m_intermediateWsNames
API::MatrixWorkspace_sptr m_inputDataWS
std::unordered_map< std::string, Kernel::IValidator_sptr > m_validators
void outputResultsTable(const std::string &resultHeader)
std::shared_ptr< WorkspaceGroup > WorkspaceGroup_sptr
shared pointer to Mantid::API::WorkspaceGroup
std::shared_ptr< MatrixWorkspace > MatrixWorkspace_sptr
shared pointer to the matrix workspace base class