Public Member Functions | Static Public Attributes
MatFormat Class Reference

Brief description of class still missing. More...

#include <MatFormat.h>

Inheritance diagram for MatFormat:
GeopsyCore::AbstractFileFormat QGpCoreTools::XMLClass QGpCoreTools::SharedObject

List of all members.

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"

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

Description of destructor still missing

References TRACE.

{
  TRACE;
}

Member Function Documentation

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.

{
  TRACE;
#ifdef GP_MATLAB_LIBS
  App::stream() << tr("Export of mat-files not yet supported (if you need it, send a request to the developers.") << endl;
  return true;
#else
  Q_UNUSED(subpool);
  Q_UNUSED(filePath);
  return false;
#endif
}
virtual const QString& MatFormat::xml_tagName ( ) const [inline, virtual]

Implements QGpCoreTools::XMLClass.

References xmlMatFormatTag.

{return xmlMatFormatTag;}

Member Data Documentation

const QString MatFormat::name = "Matlab Mat-files" [static]
const QString MatFormat::xmlMatFormatTag = "MatFormat" [static]

Referenced by xml_tagName().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines