File indexing completed on 2024-04-28 03:48:15

0001 /*
0002     File                 : FITSFilterTest.cpp
0003     Project              : LabPlot
0004     Description          : Tests for the FITS filter
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2022 Stefan Gerlach <stefan.gerlach@uni.kn>
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #include "FITSFilterTest.h"
0012 #include "backend/datasources/filters/FITSFilter.h"
0013 #include "backend/lib/macros.h"
0014 #include "backend/spreadsheet/Spreadsheet.h"
0015 
0016 #include <gsl/gsl_randist.h>
0017 #include <gsl/gsl_rng.h>
0018 
0019 extern "C" {
0020 #include "fitsio.h"
0021 }
0022 
0023 void FITSFilterTest::importFile1() {
0024     const QString& fileName = QFINDTESTDATA(QLatin1String("data/WFPC2ASSNu5780205bx.fits"));
0025 
0026     Spreadsheet spreadsheet(QStringLiteral("test"), false);
0027     FITSFilter filter;
0028     filter.readDataFromFile(fileName, &spreadsheet);
0029 
0030     QCOMPARE(spreadsheet.columnCount(), 100);
0031     QCOMPARE(spreadsheet.rowCount(), 100);
0032 
0033     WARN(spreadsheet.column(0)->valueAt(0))
0034     WARN(spreadsheet.column(1)->valueAt(0))
0035     WARN(spreadsheet.column(0)->valueAt(1))
0036     WARN(spreadsheet.column(1)->valueAt(1))
0037     WARN(spreadsheet.column(99)->valueAt(99))
0038     QCOMPARE(spreadsheet.column(0)->valueAt(0), 1.0315774679184);
0039     QCOMPARE(spreadsheet.column(1)->valueAt(0), 1.08554399013519);
0040     QCOMPARE(spreadsheet.column(0)->valueAt(1), 0.476544350385666);
0041     QCOMPARE(spreadsheet.column(1)->valueAt(1), 0.369004756212234);
0042     QCOMPARE(spreadsheet.column(99)->valueAt(99), 0.487100154161453);
0043 }
0044 
0045 void FITSFilterTest::importFile2() {
0046     const QString& fileName = QFINDTESTDATA(QLatin1String("data/WFPC2u5780205r_c0fx.fits"));
0047 
0048     Spreadsheet spreadsheet(QStringLiteral("test"), false);
0049     FITSFilter filter;
0050     filter.readDataFromFile(fileName, &spreadsheet);
0051 
0052     QCOMPARE(spreadsheet.columnCount(), 200);
0053     QCOMPARE(spreadsheet.rowCount(), 200);
0054 
0055     WARN(spreadsheet.column(0)->valueAt(0))
0056     WARN(spreadsheet.column(1)->valueAt(0))
0057     WARN(spreadsheet.column(0)->valueAt(1))
0058     WARN(spreadsheet.column(1)->valueAt(1))
0059     WARN(spreadsheet.column(99)->valueAt(99))
0060     QCOMPARE(spreadsheet.column(0)->valueAt(0), -1.54429864883423);
0061     QCOMPARE(spreadsheet.column(1)->valueAt(0), 0.91693103313446);
0062     QCOMPARE(spreadsheet.column(0)->valueAt(1), -0.882439613342285);
0063     QCOMPARE(spreadsheet.column(1)->valueAt(1), -1.09242105484009);
0064     QCOMPARE(spreadsheet.column(99)->valueAt(99), -0.387779891490936);
0065 
0066     // read table
0067     const QString& tableName = fileName + QLatin1String("[u5780205r_cvt.c0h.tab]");
0068     FITSFilter filter2;
0069     filter2.readDataFromFile(tableName, &spreadsheet);
0070 
0071     QCOMPARE(spreadsheet.columnCount(), 49);
0072     QCOMPARE(spreadsheet.rowCount(), 4);
0073 
0074     WARN(spreadsheet.column(0)->valueAt(0))
0075     WARN(spreadsheet.column(1)->valueAt(0))
0076     WARN(spreadsheet.column(0)->valueAt(1))
0077     WARN(spreadsheet.column(1)->valueAt(1))
0078     WARN(spreadsheet.column(48)->valueAt(3))
0079     QCOMPARE(spreadsheet.column(0)->valueAt(0), 182.6311886308);
0080     QCOMPARE(spreadsheet.column(1)->valueAt(0), 39.39633673411);
0081     QCOMPARE(spreadsheet.column(0)->valueAt(1), 182.6255233634);
0082     QCOMPARE(spreadsheet.column(1)->valueAt(1), 39.41214313815);
0083     QCOMPARE(spreadsheet.column(48)->valueAt(3), 0.3466465);
0084 }
0085 
0086 // BENCHMARKS
0087 
0088 void FITSFilterTest::benchDoubleImport_data() {
0089     QTest::addColumn<long>("lineCount");
0090     // can't transfer file name since needed in clean up
0091 
0092     QTemporaryFile file;
0093     if (!file.open()) // needed to generate file name
0094         return;
0095     file.close(); // only file name is used
0096 
0097     benchDataFileName = file.fileName();
0098     benchDataFileName.append(QStringLiteral(".fits"));
0099 
0100     QString testName(QString::number(paths) + QLatin1String(" random double paths"));
0101 
0102     QTest::newRow(qPrintable(testName)) << lines;
0103     DEBUG("CREATE DATA FILE " << STDSTRING(benchDataFileName) << ", lines = " << lines)
0104 
0105     gsl_rng_env_setup();
0106     gsl_rng* r = gsl_rng_alloc(gsl_rng_default);
0107     gsl_rng_set(r, 12345);
0108 
0109     // create file
0110     int status = 0;
0111 
0112     fitsfile* fptr;
0113     fits_create_file(&fptr, qPrintable(benchDataFileName), &status);
0114 
0115     long naxis = 2;
0116     long naxes[2] = {paths, lines};
0117     fits_create_img(fptr, DOUBLE_IMG, naxis, naxes, &status);
0118 
0119     // create data
0120     double path[paths] = {0.0};
0121     double* data = new double[paths * lines];
0122 
0123     const double delta = 0.25;
0124     const int dt = 1;
0125     const double sigma = delta * delta * dt;
0126     for (long i = 0; i < lines; ++i) {
0127         // std::cout << "line " << i+1 << std::endl;
0128 
0129         for (int p = 0; p < paths; ++p) {
0130             path[p] += gsl_ran_gaussian_ziggurat(r, sigma);
0131             data[p + i * paths] = path[p];
0132         }
0133     }
0134 
0135     long fpixel = 1, nelements = naxes[0] * naxes[1];
0136     // write data and close file
0137     fits_write_img(fptr, TDOUBLE, fpixel, nelements, data, &status);
0138 
0139     fits_close_file(fptr, &status);
0140     fits_report_error(stderr, status);
0141 
0142     delete[] data;
0143 
0144     DEBUG(Q_FUNC_INFO << ", DONE")
0145 }
0146 
0147 void FITSFilterTest::benchDoubleImport() {
0148     Spreadsheet spreadsheet(QStringLiteral("test"), false);
0149     FITSFilter filter;
0150 
0151     const int p = paths; // need local variable
0152     QBENCHMARK {
0153         filter.readDataFromFile(benchDataFileName, &spreadsheet);
0154 
0155         QCOMPARE(spreadsheet.columnCount(), p);
0156         QCOMPARE(spreadsheet.rowCount(), lines);
0157 
0158         QCOMPARE(spreadsheet.column(0)->valueAt(0), 0.120997813055);
0159         QCOMPARE(spreadsheet.column(1)->valueAt(0), 0.119301077563219);
0160         QCOMPARE(spreadsheet.column(2)->valueAt(0), -0.0209979608555485);
0161     }
0162 }
0163 
0164 void FITSFilterTest::benchDoubleImport_cleanup() {
0165     DEBUG("REMOVE DATA FILE " << STDSTRING(benchDataFileName))
0166     QFile::remove(benchDataFileName);
0167 }
0168 
0169 QTEST_MAIN(FITSFilterTest)