117 changes: 111 additions & 6 deletions src/datasources/bis/bisdatasource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,18 +169,111 @@ bool DataInterfaceBISMatrix::isValid(const QString& field) const {
}


//
// Vector interface
//

class DataInterfaceBISVector : public DataSource::DataInterface<DataVector>
{
public:

DataInterfaceBISVector(BISSource& bis) : _bis(bis) {}

// read one element
int read(const QString&, DataVector::ReadInfo&);

// named elements
QStringList list() const { return _bis._vectorList; }
bool isListComplete() const { return true; }
bool isValid(const QString&) const;

// T specific
const DataVector::DataInfo dataInfo(const QString&, int frame=0) const;
void setDataInfo(const QString&, const DataVector::DataInfo&) {}

// meta data
QMap<QString, double> metaScalars(const QString&) { return QMap<QString, double>(); }
QMap<QString, QString> metaStrings(const QString&) { return QMap<QString, QString>(); }


BISSource& _bis;

void init();
void clear();
};

void DataInterfaceBISVector::clear()
{
}

void DataInterfaceBISVector::init()
{
}



const DataVector::DataInfo DataInterfaceBISVector::dataInfo(const QString& vector, int) const
{
if (_bis._bisfile->status != BIS_OK) {
return DataVector::DataInfo();
}

if (!_bis._vectorList.contains(vector)) {
return DataVector::DataInfo();
}

return DataVector::DataInfo(_bis._nframes, 1);
}


int DataInterfaceBISVector::read(const QString& field, DataVector::ReadInfo& p)
{

int f0 = p.startingFrame;
int nr = p.numberOfFrames;
int nf = _bis._nframes;

if (f0>nf) {
return 0;
}

if (f0 + nr > nf) {
nr = nf - f0;
}

if (!_bis._vectorList.contains(field)) {
return 0;
}

if ( field=="INDEX" ) {
for (int i=0; i<nr; ++i ) {
p.data[i] = i + f0;
}
return nr;
}

return 0;
}


bool DataInterfaceBISVector::isValid(const QString& field) const {
return _bis._vectorList.contains( field );
}


/**********************
BISSource - the reader for streams of images developed for the BIT telescope.
***********************/
BISSource::BISSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e)
: Kst::DataSource(store, cfg, filename, type), _config(0L),
im(new DataInterfaceBISMatrix(*this)), _bisfile(0), _nframes(0)
im(new DataInterfaceBISMatrix(*this)), iv(new DataInterfaceBISVector(*this)),_bisfile(0), _nframes(0)
{

BISInitImage(&_bisImage);

setInterface(im);
setInterface(iv);

startUpdating(None);

Expand Down Expand Up @@ -240,6 +333,9 @@ bool BISSource::init() {
_matrixHash["IMG4"] = 3;
_matrixHash["IMG5"] = 4;

_vectorList.clear();
_vectorList.append("INDEX");

_nframes = BISnframes(_bisfile);

registerChange();
Expand Down Expand Up @@ -382,7 +478,7 @@ QStringList BISSourcePlugin::stringList(QSettings *cfg,
*typeSuggestion = BISTypeString;
}

stringList.append("FILENAME");
//stringList.append("FILENAME");
return stringList;

}
Expand All @@ -395,10 +491,17 @@ QStringList BISSourcePlugin::fieldList(QSettings *cfg,
const QString& filename,
const QString& type,
QString *typeSuggestion,
bool *complete) const {
Q_UNUSED(cfg)
Q_UNUSED(filename)
Q_UNUSED(type)
bool *complete) const {
if (typeSuggestion) {
*typeSuggestion = BISTypeString;
}
if ((!type.isEmpty() && !provides().contains(type)) ||
0 == understands(cfg, filename)) {
if (complete) {
*complete = false;
}
return QStringList();
}

if (complete) {
*complete = true;
Expand All @@ -409,6 +512,8 @@ QStringList BISSourcePlugin::fieldList(QSettings *cfg,
}

QStringList fieldList;

fieldList.append("INDEX");
return fieldList;
}

Expand Down
4 changes: 4 additions & 0 deletions src/datasources/bis/bisdatasource.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "bis.h"

class DataInterfaceBISMatrix;
class DataInterfaceBISVector;

class BISSource : public Kst::DataSource {
Q_OBJECT
Expand All @@ -30,6 +31,7 @@ class BISSource : public Kst::DataSource {
~BISSource();

friend class DataInterfaceBISMatrix;
friend class DataInterfaceBISVector;

bool init();
virtual void reset();
Expand All @@ -49,8 +51,10 @@ class BISSource : public Kst::DataSource {
mutable Config *_config;

DataInterfaceBISMatrix* im;
DataInterfaceBISVector* iv;

QHash<QString, int> _matrixHash;
QStringList _vectorList;

BISfile *_bisfile;

Expand Down
15 changes: 14 additions & 1 deletion src/libkst/datamatrix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,19 @@ LabelInfo DataMatrix::titleInfo() const {
}


int DataMatrix::fileLength() const {

if (dataSource()) {
const DataInfo info = dataSource()->matrix().dataInfo(_field);

return info.frameCount;
}

return 0;
}



void DataMatrix::internalUpdate() {
if (dataSource()) {
dataSource()->writeLock();
Expand All @@ -468,7 +481,7 @@ void DataMatrix::internalUpdate() {
int frame;

if (_frame<0) {
frame = fc;
frame = fc-1;
} else {
frame = _frame;
}
Expand Down
2 changes: 2 additions & 0 deletions src/libkst/datamatrix.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,8 @@ class KSTCORE_EXPORT DataMatrix : public Matrix, public DataPrimitive

virtual ScriptInterface* createScriptInterface();

int fileLength() const;

protected:
DataMatrix(ObjectStore *store);
virtual ~DataMatrix();
Expand Down
2 changes: 1 addition & 1 deletion src/libkstapp/commandlineparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ DataVectorPtr CommandLineParser::createOrFindDataVector(QString field, DataSourc
if (ds->fileType() == "ASCII file") {
QRegExp num("^[0-9]{1,2}$");
if (num.exactMatch(field)) {
field = tr("Column %1").arg(field);
field = ds->vector().list()[field.toInt()];
}
}
// check to see if an identical vector already exists. If so, use it.
Expand Down
Loading