[Kst] branches/work/kst/portto4/kst/src
Barth Netterfield
netterfield at astro.utoronto.ca
Wed Aug 18 04:51:20 CEST 2010
SVN commit 1164944 by netterfield:
Port the fitsimage data source to new api.
There are still some deficiencies (like reading x/y scaling and units)
M +3 -3 datasources/datasources.pro
M +140 -152 datasources/fitsimage/fitsimage.cpp
M +10 -15 datasources/fitsimage/fitsimage.h
M +2 -1 datasources/fitsimage/fitsimage.pro
M +1 -1 libkst/datasource.h
--- branches/work/kst/portto4/kst/src/datasources/datasources.pro #1164943:1164944
@@ -9,9 +9,9 @@
LibExists(cfitsio) {
message(CFITSIO configured. Plugins will be built.)
-# SUBDIRS += fitsimage lfiio healpix planckIDEF
-# CONFIG += link_pkgconfig
-# PKGCONFIG += cfitsio
+ SUBDIRS += fitsimage
+ !win32:CONFIG += link_pkgconfig
+ !win32:PKGCONFIG += cfitsio
}
LibExists(getdata) {
--- branches/work/kst/portto4/kst/src/datasources/fitsimage/fitsimage.cpp #1164943:1164944
@@ -12,12 +12,15 @@
#include "fitsimage.h"
#include <QXmlStreamWriter>
-//#include <fitsio.h>
+
#include <math.h>
#include "kst_i18n.h"
+using namespace Kst;
+
static const QString fitsTypeString = I18N_NOOP("FITS image");
+static const QString DefaultMatrixName = I18N_NOOP("1");
class FitsImageSource::Config {
public:
@@ -39,141 +42,107 @@
}
};
+//
+// Matrix interface
+//
-FitsImageSource::FitsImageSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e)
-: Kst::DataSource(store, cfg, filename, type, None), _config(0L) {
- _fptr = 0L;
- _valid = false;
- if (!type.isEmpty() && type != fitsTypeString) {
- return;
- }
+class DataInterfaceFitsImageMatrix : public DataSource::DataInterface<DataMatrix> {
+public:
- _config = new FitsImageSource::Config;
- _config->read(cfg, filename);
- if (!e.isNull()) {
- _config->load(e);
- }
+ DataInterfaceFitsImageMatrix(fitsfile **fitsfileptr) : _fitsfileptr(fitsfileptr) {}
- if (init()) {
- _valid = true;
- }
+ // read one element
+ int read(const QString&, DataMatrix::ReadInfo&);
- update();
-}
+ // named elements
+ QStringList list() const { return _matrixList; }
+ bool isListComplete() const { return true; }
+ bool isValid(const QString&) const;
+ // T specific
+ const DataMatrix::Optional optional(const QString&) const;
+ void setOptional(const QString&, const DataMatrix::Optional&) {}
+ // meta data
+ QMap<QString, double> metaScalars(const QString&) { return QMap<QString, double>(); }
+ QMap<QString, QString> metaStrings(const QString&) { return QMap<QString, QString>(); }
-FitsImageSource::~FitsImageSource() {
- int status;
- if (_fptr) {
- fits_close_file( _fptr, &status );
- _fptr = 0L;
- }
-}
-const QString& FitsImageSource::typeString() const {
- return fitsTypeString;
-}
+ // no interface
+ fitsfile **_fitsfileptr;
+ QStringList _matrixList;
+ void init();
+ void clear();
+};
-
-bool FitsImageSource::reset() {
- init();
- return true;
-}
-
-
-bool FitsImageSource::init() {
- int status = 0;
-
+void DataInterfaceFitsImageMatrix::clear()
+{
_matrixList.clear();
- _fieldList.clear();
- _frameCount = 0;
-
- fits_open_image( &_fptr, _filename.latin1( ), READONLY, &status );
- if (status == 0) {
- _fieldList.append("INDEX");
- _fieldList.append("1");
- _matrixList.append("1");
- return update() == Kst::Object::UPDATE;
- } else {
- fits_close_file( _fptr, &status );
- _fptr = 0L;
}
- return false;
-}
-
-Kst::Object::UpdateType FitsImageSource::update() {
- long n_axes[3];
- int status = 0;
-
- fits_get_img_size( _fptr, 2, n_axes, &status );
-
- int newNF = n_axes[0]*n_axes[1];
- bool isnew = newNF != _frameCount;
-
- _frameCount = newNF;
-
- return (isnew ? Kst::Object::UPDATE : Kst::Object::NO_CHANGE);
+void DataInterfaceFitsImageMatrix::init()
+{
+ _matrixList.append(DefaultMatrixName); // FIXME: fits vectirs have real names...
}
-
-bool FitsImageSource::matrixDimensions( const QString& matrix, int* xDim, int* yDim) {
+const DataMatrix::Optional DataInterfaceFitsImageMatrix::optional(const QString& matrix) const
+{
long n_axes[3];
int status = 0;
- if (!_matrixList.contains(matrix)) {
- return false;
+ if ( !*_fitsfileptr || !_matrixList.contains( matrix ) ) {
+ return DataMatrix::Optional();
}
- fits_get_img_size( _fptr, 2, n_axes, &status );
+ fits_get_img_size( *_fitsfileptr, 2, n_axes, &status );
if (status) {
- return false;
+ return DataMatrix::Optional();
}
- *xDim = n_axes[0];
- *yDim = n_axes[1];
+ DataMatrix::Optional opt;
+ opt.samplesPerFrame = 1;
+ opt.xSize = n_axes[0];
+ opt.ySize = n_axes[1];
- return true;
+ return opt;
}
+//int FitsImageSource::readMatrix(Kst::MatrixData* data, const QString& field, int xStart,
+// int yStart, int xNumSteps, int yNumSteps) {
-int FitsImageSource::readMatrix(Kst::MatrixData* data, const QString& field, int xStart,
- int yStart, int xNumSteps, int yNumSteps) {
+int DataInterfaceFitsImageMatrix::read(const QString& field, DataMatrix::ReadInfo& p) {
long n_axes[2], fpixel[2] = {1, 1};
double nullval = NAN;
double blank = 0.0;
long n_elements;
- int i, px, py, anynull, ni;
- int y0, y1, x0, x1;
- double *z;
+ int px, py, anynull;
int status = 0;
double *buffer;
- if (!_matrixList.contains(field)) {
- return false;
+ if ((!*_fitsfileptr) || (!_matrixList.contains(field))) {
+ return 0;
}
- fits_get_img_size( _fptr, 2, n_axes, &status );
+ fits_get_img_size( *_fitsfileptr, 2, n_axes, &status );
if (status) {
- return false;
+ return 0;
}
n_elements = n_axes[0]*n_axes[1];
buffer = (double*)malloc(n_elements*sizeof(double));
- fits_read_pix( _fptr, TDOUBLE, fpixel, n_elements, &nullval, buffer, &anynull, &status );
+ fits_read_pix( *_fitsfileptr, TDOUBLE, fpixel, n_elements, &nullval, buffer, &anynull, &status );
// Check to see if the file is using the BLANK keyword
// to indicate the NULL value for the image. This is
// not correct useage for floating point images, but
// it is used frequently nonetheless...
char charBlank[] = "BLANK";
- fits_read_key(_fptr, TDOUBLE, charBlank, &blank, NULL, &status);
+ fits_read_key(*_fitsfileptr, TDOUBLE, charBlank, &blank, NULL, &status);
if (status) { //keyword does not exist, ignore it
status = 0;
} else { //keyword is used, replace pixels with this value
@@ -185,19 +154,19 @@
}
}
- y0 = yStart;
- y1 = yStart+yNumSteps;
+ int y0 = p.yStart;
+ int y1 = p.yStart + p.yNumSteps;
+ int x0 = p.xStart;
+ int x1 = p.xStart + p.xNumSteps;
+ double* z = p.data->z;
- x0 = xStart;
- x1 = xStart + xNumSteps;
- ni = xNumSteps * yNumSteps - 1;
+ int ni = p.xNumSteps * p.yNumSteps - 1;
- i = 0;
+ int i = 0;
- z = data->z;
- if (field=="1") {
- for (px = xStart; px < x1; px++) {
- for (py = y1-1; py >= yStart; py--) {
+ if (field==DefaultMatrixName) {
+ for (px = p.xStart; px < x1; px++) {
+ for (py = y1-1; py >= p.yStart; py--) {
z[ni - i] = buffer[px + py*n_axes[0]];
i++;
}
@@ -225,10 +194,10 @@
// fits_read_key(_fptr, TDOUBLE, charCRPix2, &cy, NULL, &status);
//
// if (status) {
- data->xMin = x0;
- data->yMin = y0;
- data->xStepSize = 1;
- data->yStepSize = 1;
+ p.data->xMin = x0;
+ p.data->yMin = y0;
+ p.data->xStepSize = 1;
+ p.data->yStepSize = 1;
// } else {
// dx = fabs(dx);
// dy = fabs(dy);
@@ -242,63 +211,100 @@
}
-int FitsImageSource::readField(double *v, const QString& field, int s, int n) {
- int i = 0;
-
- if (!_fieldList.contains(field)) {
- return false;
+bool DataInterfaceFitsImageMatrix::isValid(const QString& field) const {
+ return _matrixList.contains( field );
}
- if (field=="INDEX") {
- for (i = 0; i < n; i++) {
- v[i] = i+s;
- }
- } else if (field=="1") {
- double *buffer;
- long fpixel[2] = {1, 1};
- double nullval = 0;
- int status = 0, anynull;
- buffer = (double*)malloc(_frameCount*sizeof(double));
+FitsImageSource::FitsImageSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e)
+: Kst::DataSource(store, cfg, filename, type), _config(0L),
+ im(new DataInterfaceFitsImageMatrix(&_fptr))
+{
+ setInterface(im);
- fits_read_pix( _fptr, TDOUBLE, fpixel, _frameCount, &nullval, buffer, &anynull, &status );
+ setUpdateType(None);
- for (i = 0; i < n; i++) {
- v[i] = buffer[i+s];
+ _fptr = 0L;
+ _valid = false;
+
+ if (!type.isEmpty() && type != fitsTypeString) {
+ return;
}
- free( buffer );
+ _config = new FitsImageSource::Config;
+ _config->read(cfg, filename);
+ if (!e.isNull()) {
+ _config->load(e);
+ }
+ if (init()) {
+ _valid = true;
}
- return(i);
+ registerChange();
}
-bool FitsImageSource::isValidField(const QString& field) const {
- return _fieldList.contains( field );
+
+FitsImageSource::~FitsImageSource() {
+ int status;
+ if (_fptr) {
+ fits_close_file( _fptr, &status );
+ _fptr = 0L;
}
+ delete _config;
+ _config = 0L;
+}
+const QString& FitsImageSource::typeString() const {
+ return fitsTypeString;
+}
-bool FitsImageSource::isValidMatrix(const QString& field) const {
- return _matrixList.contains( field );
+
+
+void FitsImageSource::reset() {
+ init();
+ Object::reset();
}
+bool FitsImageSource::init() {
+ int status = 0;
+ fits_open_image( &_fptr, _filename.toAscii(), READONLY, &status );
-int FitsImageSource::samplesPerFrame(const QString &field) {
- Q_UNUSED(field)
- return 1;
+ im->clear();
+ if (status == 0) {
+ im->init();
+
+ registerChange();
+ return true;
+ } else {
+ fits_close_file( _fptr, &status );
+ _fptr = 0L;
+ return false;
}
+}
-int FitsImageSource::frameCount(const QString& field) const {
- Q_UNUSED(field)
- return _frameCount;
+Kst::Object::UpdateType FitsImageSource::internalDataSourceUpdate() {
+ /*
+ long n_axes[3];
+ int status = 0;
+
+ fits_get_img_size( _fptr, 2, n_axes, &status );
+
+ int newNF = n_axes[0]*n_axes[1];
+ bool isnew = newNF != _frameCount;
+
+ _frameCount = newNF;
+
+ */
+ //return (isnew ? Kst::Object::Updated : Kst::Object::NoChange);
+ return (Kst::Object::NoChange);
}
bool FitsImageSource::isEmpty() const {
- return _frameCount < 1;
+ return im->optional(DefaultMatrixName).xSize < 1;
}
@@ -312,24 +318,6 @@
}
-int FitsImageSource::readScalar(double &S, const QString& scalar) {
- if (scalar == "FRAMES") {
- S = _frameCount;
- return 1;
- }
- return 0;
-}
-
-
-int FitsImageSource::readString(QString &S, const QString& string) {
- if (string == "FILE") {
- S = _filename;
- return 1;
- }
- return 0;
-}
-
-
QString FitsImagePlugin::pluginName() const { return "FITS Image Source Reader"; }
QString FitsImagePlugin::pluginDescription() const { return "FITS Image Source Reader"; }
@@ -361,7 +349,7 @@
*typeSuggestion = fitsTypeString;
}
if ( understands(cfg, filename) ) {
- matrixList.append( "1" );
+ matrixList.append( DefaultMatrixName );
}
return matrixList;
@@ -433,8 +421,8 @@
*typeSuggestion = fitsTypeString;
}
if (understands(cfg, filename)) {
- fieldList.append("INDEX");
- fieldList.append( "1" );
+ //fieldList.append("INDEX");
+ //fieldList.append( DefaultMatrixName );
}
return fieldList;
}
@@ -447,7 +435,7 @@
int ret_val = 0;
int naxis;
- fits_open_image( &ffits, filename.latin1( ), READONLY, &status );
+ fits_open_image( &ffits, filename.toAscii(), READONLY, &status );
fits_get_img_dim( ffits, &naxis, &status);
if ((status == 0) && (naxis > 1)) {
--- branches/work/kst/portto4/kst/src/datasources/fitsimage/fitsimage.h #1164943:1164944
@@ -15,8 +15,12 @@
#include <datasource.h>
#include <dataplugin.h>
-#include <libcfitsio0/fitsio.h>
+//#include <libcfitsio0/fitsio.h>
+#include <fitsio.h>
+
+class DataInterfaceFitsImageMatrix;
+
class FitsImageSource : public Kst::DataSource {
Q_OBJECT
@@ -26,19 +30,10 @@
~FitsImageSource();
bool init();
- bool reset();
+ virtual void reset();
- Kst::Object::UpdateType update();
+ Kst::Object::UpdateType internalDataSourceUpdate();
- bool matrixDimensions( const QString& matrix, int* xDim, int* yDim);
- int readMatrix(Kst::MatrixData* data, const QString& matrix, int xStart, int yStart, int xNumSteps, int yNumSteps);
- bool isValidMatrix(const QString& field) const;
-
- int readField(double *v, const QString &field, int s, int n);
- bool isValidField(const QString &field) const;
-
- int samplesPerFrame(const QString &field);
- int frameCount(const QString& field = QString::null) const;
bool isEmpty() const;
QString fileType() const;
@@ -48,13 +43,13 @@
class Config;
- int readScalar(double &S, const QString& scalar);
- int readString(QString &S, const QString& string);
-
private:
int _frameCount;
fitsfile *_fptr;
mutable Config *_config;
+
+ DataInterfaceFitsImageMatrix* im;
+
};
--- branches/work/kst/portto4/kst/src/datasources/fitsimage/fitsimage.pro #1164943:1164944
@@ -1,4 +1,5 @@
-include($$PWD/../../../kst.pri)
+TOPOUT_REL=../../..
+include($$PWD/$$TOPOUT_REL/kst.pri)
include($$PWD/../../../datasourceplugin.pri)
TARGET = $$kstlib(kst2data_fitsimage)
--- branches/work/kst/portto4/kst/src/libkst/datasource.h #1164943:1164944
@@ -179,7 +179,7 @@
virtual bool isEmpty() const;
/** Reset to initial state of the source, just as though no data had been
- * read and the file had just been opened. Return true on success.
+ * read and the file had just been opened.
*/
virtual void reset();
More information about the Kst
mailing list