Brief description of class still missing. More...
#include <MatFormat.h>
Public Member Functions | |
| virtual bool | isReadOnly () const |
| virtual bool | isValid (const QString &fileName) const |
| virtual bool | load (SignalFile *file) const |
| virtual bool | load (const Signal *sig, double *samples) const |
| MatFormat () | |
| virtual bool | save (const SubSignalPool &subpool, const QString &filePath) const |
| virtual const QString & | xml_tagName () const |
| ~MatFormat () | |
Static Public Attributes | |
| static const QString | name = "Matlab Mat-files" |
| static const QString | xmlMatFormatTag = "MatFormat" |
Brief description of class still missing.
Full description of class still missing
Description of constructor still missing
References GeopsyCore::AbstractFileFormat::addExtension(), GeopsyCore::AbstractFileFormat::name(), GeopsyCore::AbstractFileFormat::setName(), and TRACE.
: AbstractFileFormat() { TRACE; setName(name); addExtension("mat"); }
| virtual bool MatFormat::isReadOnly | ( | ) | const [inline, virtual] |
Reimplemented from GeopsyCore::AbstractFileFormat.
{return false;}
| bool MatFormat::isValid | ( | const QString & | fileName | ) | const [virtual] |
Reimplemented from GeopsyCore::AbstractFileFormat.
References QGpCoreTools::endl(), QGpCoreTools::tr(), and TRACE.
{
TRACE;
#ifdef GP_MATLAB_LIBS
MATFile * fmat=MatFormatPrivate::open(fileName);
if(!fmat) {
return false;
}
int nVariables=0;
char ** variableNames=reinterpret_cast<char **>(matGetDir(fmat, &nVariables));
mxFree(variableNames);
matClose(fmat);
if(!variableNames || nVariables==0) {
App::stream() << tr("No variable stored in file %1.").arg(fileName) << endl;
return false;
}
return true;
#else
Q_UNUSED(fileName);
return false;
#endif
}
| bool MatFormat::load | ( | SignalFile * | file | ) | const [virtual] |
Reimplemented from GeopsyCore::AbstractFileFormat.
References GeopsyCore::Signal::addMetaData(), GeopsyCore::SignalFile::database(), QGpCoreTools::endl(), GeopsyCore::SignalFile::name(), GeopsyCore::Signal::setComponent(), GeopsyCore::Signal::setDeltaT(), GeopsyCore::Signal::setFile(), GeopsyCore::Signal::setNSamples(), GeopsyCore::Signal::setNumberInFile(), GeopsyCore::Signal::setOffsetInFile(), GeopsyCore::DoubleSignal::setType(), GeopsyCore::SignalFile::shortName(), QGpCoreTools::tr(), and TRACE.
{
TRACE;
#ifdef GP_MATLAB_LIBS
// Query header information
QMap<QByteArray, QVariant> headerValues;
MatFormatPrivate::loadHeader(headerValues, file->name());
// Scan for all the other variables
MATFile * fmat=MatFormatPrivate::open(file->name());
if(!fmat) {
return false;
}
int iSig=0;
int iVar=0;
const char * variableName=0;
while(true) {
mxArray * array=matGetNextVariableInfo(fmat, &variableName);
if(!array) {
if(feof(matGetFp(fmat))) {
matClose(fmat);
return true;
} else {
App::stream() << tr("Error after reading %1 variables in file %2.").arg(iVar).arg(file->name()) << endl;
}
}
if(!headerValues.contains(variableName)) { // Skip variables used for meta data
if(mxGetNumberOfDimensions(array)==2) {
int nSamples=mxGetDimensions(array)[0];
int nChannels=mxGetDimensions(array)[1];
MatlabVariableName * vn=new MatlabVariableName(variableName);
int n0=(int)ceil(log10(nChannels));
for(int iChan=0; iChan<nChannels; iChan++) {
Signal * newSignal=new Signal(file->database());
newSignal->setFile(file);
newSignal->setNumberInFile(iSig);
newSignal->setNSamples(nSamples);
newSignal->setOffsetInFile(iChan); // Store channel index for current variable
newSignal->addMetaData(vn);
newSignal->setDeltaT(0.0);
newSignal->setType(Signal::Waveform);
SignalFile::setSignalName(newSignal, variableName, QString("_%1").arg(iChan, n0, 10, QChar('0')), iChan, file->shortName());
newSignal->setComponent(Signal::UndefinedComponent);
iSig++;
}
} else {
App::stream() << tr("Skip variable %1 not having 2 dimensions in file %2.").arg(variableName).arg(file->name()) << endl;
}
}
mxDestroyArray(array);
iVar++;
}
#else
Q_UNUSED(file);
return false;
#endif
}
| bool MatFormat::load | ( | const Signal * | sig, |
| double * | samples | ||
| ) | const [virtual] |
Reimplemented from GeopsyCore::AbstractFileFormat.
References GeopsyCore::Signal::file(), GeopsyCore::Signal::id(), GeopsyCore::Signal::metaData(), GeopsyCore::SignalFile::name(), GeopsyCore::SignalTemplate< sampleType >::nSamples(), GeopsyCore::Signal::numberInFile(), MatlabVariableName::staticId(), TRACE, and GeopsyCore::MetaString::value().
{
TRACE;
#ifdef GP_MATLAB_LIBS
const MetaData * d=sig->metaData(MatlabVariableName::staticId());
if(!d) {
qWarning("No matlab variable name available for signal id %i", sig->id());
return false;
}
const MatlabVariableName * variableName=static_cast<const MatlabVariableName *>(d);
MATFile * fmat=MatFormatPrivate::open(sig->file()->name());
if(!fmat) {
return false;
}
mxArray * array=matGetVariable(fmat, variableName->value().toAscii().data());
// TODO: like text files in columns: loads all signal of the same matrix together
int nSamples=sig->nSamples();
double * ptr=mxGetPr(array)+nSamples*sig->numberInFile();
memcpy(samples, ptr, sizeof(double)*nSamples);
mxDestroyArray(array);
matClose(fmat);
return true;
#else
Q_UNUSED(sig);
Q_UNUSED(samples);
return false;
#endif
}
| bool MatFormat::save | ( | const SubSignalPool & | subpool, |
| const QString & | filePath | ||
| ) | const [virtual] |
Reimplemented from GeopsyCore::AbstractFileFormat.
References QGpCoreTools::endl(), QGpCoreTools::tr(), and TRACE.
| virtual const QString& MatFormat::xml_tagName | ( | ) | const [inline, virtual] |
const QString MatFormat::name = "Matlab Mat-files" [static] |
const QString MatFormat::xmlMatFormatTag = "MatFormat" [static] |
Referenced by xml_tagName().