#include <ReportWriter.h>
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 ¶meterSpace) |
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) |
See documentation for ReportReader for format specification
DinverCore::ReportWriter::ReportWriter | ( | QString | fileName | ) | [inline] |
: _f(fileName) {_blockOffset=0;}
DinverCore::ReportWriter::~ReportWriter | ( | ) | [inline] |
{}
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(); } }
void DinverCore::ReportWriter::close | ( | ) | [inline] |
{_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; }
bool DinverCore::ReportWriter::isOpen | ( | ) | [inline] |
{return _f.isOpen();}
bool DinverCore::ReportWriter::open | ( | ) |
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] |
QDataStream& DinverCore::ReportWriter::stream | ( | ) | [inline] |
Referenced by initReport(), open(), DinverDCCore::DCReportBlock::write(), DinverDCCore::DCReportBlock::writeBeta(), and DinverDCCore::DCReportBlock::writeNaViewer().
{return _s;}
void DinverCore::ReportWriter::userBlockHeader | ( | const char * | tag, |
int | version | ||
) | [inline] |
References TRACE.
Referenced by DinverDCCore::DCReportBlock::write(), DinverDCCore::DCReportBlock::writeBeta(), and DinverDCCore::DCReportBlock::writeNaViewer().
{ TRACE; _s.writeRawData(tag,4); _s << version; }