#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;
}