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().