File indexing completed on 2024-05-12 03:49:33
0001 /* 0002 File : NSLBaselineTest.cpp 0003 Project : LabPlot 0004 Description : NSL Tests for baseline functions 0005 -------------------------------------------------------------------- 0006 SPDX-FileCopyrightText: 2023 Stefan Gerlach <stefan.gerlach@uni.kn> 0007 0008 SPDX-License-Identifier: GPL-2.0-or-later 0009 */ 0010 0011 #include "NSLBaselineTest.h" 0012 #include "backend/nsl/nsl_baseline.h" 0013 0014 #include <fstream> 0015 0016 // ############################################################################## 0017 // ################# constant base lines 0018 // ############################################################################## 0019 0020 void NSLBaselineTest::testBaselineMinimum() { 0021 double data[] = {4., 5., 2.}; 0022 const double result[] = {2., 3., 0.}; 0023 const size_t N = 3; 0024 0025 nsl_baseline_remove_minimum(data, N); 0026 0027 for (size_t i = 0; i < N; ++i) 0028 QCOMPARE(data[i], result[i]); 0029 } 0030 void NSLBaselineTest::testBaselineMinimum2() { 0031 double data[] = {-4., -5., -2.}; 0032 const double result[] = {1., 0., 3.}; 0033 const size_t N = 3; 0034 0035 nsl_baseline_remove_minimum(data, N); 0036 0037 for (size_t i = 0; i < N; ++i) 0038 QCOMPARE(data[i], result[i]); 0039 } 0040 void NSLBaselineTest::testBaselineMaximum() { 0041 double data[] = {4., 5., 2.}; 0042 const double result[] = {-1., 0., -3.}; 0043 const size_t N = 3; 0044 0045 nsl_baseline_remove_maximum(data, N); 0046 0047 for (size_t i = 0; i < N; ++i) 0048 QCOMPARE(data[i], result[i]); 0049 } 0050 void NSLBaselineTest::testBaselineMaximum2() { 0051 double data[] = {-4., -5., -2.}; 0052 const double result[] = {-2., -3., 0.}; 0053 const size_t N = 3; 0054 0055 nsl_baseline_remove_maximum(data, N); 0056 0057 for (size_t i = 0; i < N; ++i) 0058 QCOMPARE(data[i], result[i]); 0059 } 0060 0061 void NSLBaselineTest::testBaselineMean() { 0062 double data[] = {4., 5., 2.}; 0063 const double result[] = {1 / 3., 4 / 3., -5 / 3.}; 0064 const size_t N = 3; 0065 0066 nsl_baseline_remove_mean(data, N); 0067 0068 for (size_t i = 0; i < N; ++i) 0069 QCOMPARE(data[i], result[i]); 0070 } 0071 void NSLBaselineTest::testBaselineMean2() { 0072 double data[] = {-4., -5., -2.}; 0073 const double result[] = {-1 / 3., -4 / 3., 5 / 3.}; 0074 const size_t N = 3; 0075 0076 nsl_baseline_remove_mean(data, N); 0077 0078 for (size_t i = 0; i < N; ++i) 0079 QCOMPARE(data[i], result[i]); 0080 } 0081 0082 void NSLBaselineTest::testBaselineMedian() { 0083 double data[] = {4., 5., 2.}; 0084 const double result[] = {0., 1., -2.}; 0085 const size_t N = 3; 0086 0087 nsl_baseline_remove_median(data, N); 0088 0089 for (size_t i = 0; i < N; ++i) 0090 QCOMPARE(data[i], result[i]); 0091 } 0092 void NSLBaselineTest::testBaselineMedian2() { 0093 double data[] = {-4., -5., -2.}; 0094 const double result[] = {0., -1., 2.}; 0095 const size_t N = 3; 0096 0097 nsl_baseline_remove_median(data, N); 0098 0099 for (size_t i = 0; i < N; ++i) 0100 QCOMPARE(data[i], result[i]); 0101 } 0102 0103 // ############################################################################## 0104 // ################# non-constant base lines 0105 // ############################################################################## 0106 0107 void NSLBaselineTest::testBaselineEndpoints() { 0108 double xdata[] = {1., 2., 4.}; 0109 double ydata[] = {4., 5., 2.}; 0110 const double result[] = {0., 13. / 3., 0.}; 0111 const size_t N = 3; 0112 0113 nsl_baseline_remove_endpoints(xdata, ydata, N); 0114 0115 for (size_t i = 0; i < N; ++i) 0116 QCOMPARE(ydata[i], result[i]); 0117 } 0118 0119 void NSLBaselineTest::testBaselineLinReg() { 0120 double xdata[] = {1., 2., 4.}; 0121 double ydata[] = {4., 5., 2.}; 0122 const double result[] = {-0.7142857142857144, 1.0714285714285712, -0.35714285714285765}; 0123 const size_t N = 3; 0124 0125 nsl_baseline_remove_linreg(xdata, ydata, N); 0126 0127 for (size_t i = 0; i < N; ++i) 0128 QCOMPARE(ydata[i], result[i]); 0129 } 0130 0131 void NSLBaselineTest::testBaselineARPLS() { 0132 double data[] = {1, 2, 3, 2, 4, 1, 3, 2, 3, 2}; 0133 double result[] = {-0.605556598278328, 0134 0.29922426449953, 0135 1.20406568260443, 0136 0.108998357316374, 0137 2.0139914015879, 0138 -1.0809969643924, 0139 0.823990535656255, 0140 -0.270980722318351, 0141 0.634078132872751, 0142 -0.460816930930479}; 0143 0144 const size_t N = 10; 0145 0146 double tol = nsl_baseline_remove_arpls(data, N, 1.e-3, 1.e4, 10); 0147 WARN("TOL = " << tol) 0148 0149 FuzzyCompare(tol, 0.0043202087307554, 5.e-9); // GSL value 0150 for (size_t i = 0; i < N; ++i) 0151 FuzzyCompare(data[i], result[i], 1.e-10); 0152 } 0153 0154 void NSLBaselineTest::testBaselineARPLSSpectrum() { 0155 std::ifstream d(QFINDTESTDATA(QLatin1String("data/spectrum.dat")).toStdString()); 0156 std::ifstream r(QFINDTESTDATA(QLatin1String("data/spectrum_arpls.dat")).toStdString()); 0157 const size_t N = 1000; 0158 0159 double data[N], result[N]; 0160 for (size_t i = 0; i < N; i++) { 0161 d >> data[i]; 0162 r >> result[i]; 0163 } 0164 0165 double tol = nsl_baseline_remove_arpls(data, N, 1.e-2, 1.e4, 10); 0166 WARN("TOL = " << tol) 0167 0168 FuzzyCompare(tol, 0.108167623062361, 1.e-9); // GSL value 0169 for (size_t i = 0; i < N; ++i) 0170 FuzzyCompare(data[i], result[i], 2.e-5); 0171 } 0172 0173 void NSLBaselineTest::testBaselineARPLS_XRD() { 0174 std::ifstream d(QFINDTESTDATA(QLatin1String("data/XRD.dat")).toStdString()); 0175 std::ifstream r(QFINDTESTDATA(QLatin1String("data/XRD_arpls.dat")).toStdString()); 0176 const size_t N = 1764; 0177 0178 double data[N], result[N]; 0179 for (size_t i = 0; i < N; i++) { 0180 d >> data[i]; 0181 r >> result[i]; 0182 } 0183 0184 double tol = nsl_baseline_remove_arpls(data, N, 1.e-3, 1.e6, 20); 0185 WARN("TOL = " << tol) 0186 0187 FuzzyCompare(tol, 0.0068956252520988, 1.e-6); // GSL value 0188 // std::ofstream o("out.dat"); 0189 for (size_t i = 0; i < N; ++i) { 0190 // o << data[i] << std::endl; 0191 FuzzyCompare(data[i], result[i], 2.e-5); 0192 } 0193 } 0194 0195 QTEST_MAIN(NSLBaselineTest)