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)