All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Types | Public Member Functions | Static Public Member Functions
DinverCore::ReportWriter Class Reference

#include <ReportWriter.h>

List of all members.

Public Types

enum  Action { Ask, Overwrite, Append }

Public Member Functions

void addModel (double misfit, uint paramChecksum, int nd, Parameter **model)
void addModel (double misfit, uint paramChecksum, const RealSpace &parameterSpace)
void close ()
bool isOpen ()
bool open ()
 ReportWriter (QString fileName)
QDataStream & stream ()
void userBlockHeader (const char *tag, int version)
 ~ReportWriter ()

Static Public Member Functions

static bool initReport (const QString &fileName, const QString &title, Action action)
static void remove (const QString &fileName)
static void setCurrentOffset (QDataStream &s, qint64 tableOffset)
static void setEmptyOffset (QDataStream &s, qint64 tableOffset)

Detailed Description

See documentation for ReportReader for format specification


Member Enumeration Documentation

Enumerator:
Ask 
Overwrite 
Append 

Constructor & Destructor Documentation

DinverCore::ReportWriter::ReportWriter ( QString  fileName) [inline]
: _f(fileName) {_blockOffset=0;}
{}

Member Function Documentation

void DinverCore::ReportWriter::addModel ( double  misfit,
uint  paramChecksum,
int  nd,
Parameter **  model 
)

References misfit(), DinverCore::Parameter::realValue(), REPORT_BLOCK_TAG, setCurrentOffset(), and TRACE.

Referenced by DinverCore::ModelRepository::addReport(), DinverCore::ImportanceSampling::generate(), DinverCore::GridSnoop::optimization(), outputModel(), reportMode(), and DinverDCGui::GroundModelViewer::saveAsReport().

{
  TRACE;
  // Write offset in previous block if necessary
  if(_blockOffset>0) {
    setCurrentOffset(_s, _blockOffset);
  }
  // Construct header of the new model block
  _s.writeRawData(REPORT_BLOCK_TAG, 4);
  _blockOffset=_f.pos();
  qint64 emptyOffset=0;
  _s << emptyOffset; // room for next block offset
  // Write mifit and model
  _s << misfit;
  // Write the parameterization checksum
  _s << nd;
  _s << paramChecksum;
  for(int i=0;i<nd;i++) {
    _s << model[i]->realValue();
  }
}
void DinverCore::ReportWriter::addModel ( double  misfit,
uint  paramChecksum,
const RealSpace parameterSpace 
)

References DinverCore::RealSpace::allParameterCount(), misfit(), DinverCore::RealSpace::parameter(), DinverCore::Parameter::realValue(), REPORT_BLOCK_TAG, setCurrentOffset(), and TRACE.

{
  TRACE;
  // Write offset in previous block if necessary
  if(_blockOffset>0) {
    setCurrentOffset(_s, _blockOffset);
  }
  // Construct header of the new model block
  _s.writeRawData(REPORT_BLOCK_TAG, 4);
  _blockOffset=_f.pos();
  qint64 emptyOffset=0;
  _s << emptyOffset; // room for next block offset
  // Write mifit and model
  _s << misfit;
  // Write the parameterization checksum
  int nd=parameterSpace.allParameterCount();
  _s << nd;
  _s << paramChecksum;
  for(int i=0;i<nd;i++) {
    _s << parameterSpace.parameter(i)->realValue();
  }
}
{_f.close();}
bool DinverCore::ReportWriter::initReport ( const QString &  fileName,
const QString &  title,
Action  action 
) [static]

References Append, Ask, QGpCoreTools::endl(), fileName, DinverCore::ReportReader::isReportFormat(), MSG_ID, Overwrite, stream(), QGpCoreTools::tr(), and TRACE.

Referenced by DinverCore::BatchRun::importanceSampling(), DinverCore::BatchRun::neighborhoodOptimization(), and DinverCore::BatchRun::snoopOptimization().

{
  TRACE;
  QFileInfo fi(fileName);
  if(fi.exists()) {
    if(ReportReader::isReportFormat(fileName)) {
      switch(action) {
      case Overwrite:
        remove(fileName);
        break;
      case Append:
        break;
      case Ask:
        switch(Message::warning(MSG_ID, title,
                                tr("Report file %1 already exists.").arg(fileName),
                                Message::cancel(), tr("Append"), tr("Overwrite"), true)) {
        case Message::Answer0:
          return false;
        case Message::Answer2:
          remove(fileName);
          break;
        default: // automatically append
          break;
        }
        break;
      }
    } else {
      switch(action) {
      case Overwrite:
        remove(fileName);
        break;
      case Append:
        App::stream() << tr("Cannot append to file %1 because report file has a bad format.").arg(fileName) << endl;
        return false;
      case Ask:
        switch(Message::warning(MSG_ID, title,
                                tr("Report file %1 already exists, but it has not a report format.").arg(fileName),
                                Message::cancel(), tr("Overwrite"), QString::null, true)) {
        case Message::Answer0:
          return false;
        default:
          remove(fileName);
          break;
        }
        break;
      }
    }
  }
  return true;
}
{return _f.isOpen();}

References QGpCoreTools::endl(), REPORT_CURRENT_VERSION, REPORT_FILE_TAG, stream(), DinverCore::ReportReader::synchronize(), QGpCoreTools::tr(), and TRACE.

Referenced by main(), DinverCore::GridSnoop::openReport(), DinverCore::ImportanceSampling::openReport(), DinverCore::ModelRepository::openReport(), DinverCore::Neighborhood::openReport(), reportMode(), and DinverDCGui::GroundModelViewer::saveAsReport().

{
  TRACE;
  QFileInfo fi(_f.fileName());
  if(fi.exists()) {
    ReportReader r(_f.fileName());
    if(r.open()) {
      r.synchronize();
      _blockOffset=r.lastBlockOffset();
      if(_blockOffset>0) _blockOffset-=8;
      r.close();
      App::stream() << tr("Adding models to an existing inversion report...") << endl;
      if(_f.open(QIODevice::ReadWrite)) {
        _s.setDevice(&_f);
        _f.seek(_f.size());
        return true;
      } else {
        App::stream() << tr("Cannot open file for writing (appending)") << endl;
        return false;
      }
    } else {
      App::stream() << tr("Report already exist but unreadable, cannot append models") << endl;
      return false;
    }
  } else {
    App::stream() << tr("Adding models to a new inversion report...") << endl;
    if(_f.open(QIODevice::WriteOnly)) {
      _s.setDevice(&_f);
      _s.writeRawData(REPORT_FILE_TAG, 8);
      _s << (int) REPORT_CURRENT_VERSION;
      return true;
    } else {
      App::stream() << tr("Cannot open file for writing") << endl;
      return false;
    }
  }
}
void DinverCore::ReportWriter::remove ( const QString &  fileName) [static]

Remove an exist report file. Handy to force overwriting an existing report.

{
  QFileInfo fi(fileName);
  QDir d(fi.absolutePath());
  d.remove(fi.fileName());
}
void DinverCore::ReportWriter::setCurrentOffset ( QDataStream &  s,
qint64  tableOffset 
) [static]

Write the current stream position in an offset table

References TRACE.

Referenced by addModel().

{
  TRACE;
  qint64 offset=s.device()->pos();
  s.device()->seek(tableOffset);
  s << offset;
  s.device()->seek(offset);
}
void DinverCore::ReportWriter::setEmptyOffset ( QDataStream &  s,
qint64  tableOffset 
) [static]

Write a null entry in an offset table

References TRACE.

{
  TRACE;
  qint64 offset=s.device()->pos();
  s.device()->seek(tableOffset);
  tableOffset=0;
  s << tableOffset;
  s.device()->seek(offset);
}
QDataStream& DinverCore::ReportWriter::stream ( ) [inline]
void DinverCore::ReportWriter::userBlockHeader ( const char *  tag,
int  version 
) [inline]

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