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)