#include <DinverCore.h>
#include <DinverDCCore.h>
#include <QGpCoreTools.h>
#include <QGpCoreWave.h>
#include "gpdcmisfitVersion.h"
#include "gpdcmisfitInstallPath.h"
Enumerations | |
enum | AppMode { Report, SurfaceModel, RefractionModel } |
Functions | |
ApplicationHelp * | help () |
int | main (int argc, char **argv) |
PACKAGE_INFO (gpdcmisfit, GPDCMISFIT) | |
int | refractionModelMode () |
int | reportMode () |
int | surfaceModelMode () |
Variables | |
int | akaikeDof = 1 |
int | bestOutputCount = 0 |
QStringList | inputFileList |
double | maxInputMisfit = 1e99 |
int | maxOutputCount = 0 |
double | maxOutputMisfit = 1e99 |
AppMode | mode = Report |
QList< DCModelInfo * > | models |
ReportWriter::Action | reportAction = ReportWriter::Ask |
QString | reportFile |
TargetList * | targets = 0 |
enum AppMode |
ApplicationHelp* help | ( | ) |
int main | ( | int | argc, |
char ** | argv | ||
) |
References QGpCoreTools::Akaike, akaikeDof, QGpCoreTools::AkaikeFewSamples, DinverDCCore::TargetList::autocorrTarget(), bestOutputCount, DinverDCCore::TargetList::dispersionTarget(), DinverDCCore::TargetList::ellipticityCurveTarget(), DinverDCCore::TargetList::ellipticityPeakTarget(), QGpCoreTools::endl(), help(), inputFileList, QGpCoreTools::L2_Normalized, DinverDCCore::TargetList::magnetoTelluricTarget(), maxInputMisfit, maxOutputCount, maxOutputMisfit, mode, RefractionModel, refractionModelMode(), DinverDCCore::TargetList::refractionVpTarget(), DinverDCCore::TargetList::refractionVsTarget(), Report, reportAction, reportFile, reportMode(), DinverDCCore::Target::selected(), DinverDCCore::Target::setMinimumMisfit(), DinverDCCore::TargetList::setMisfitType(), DinverDCCore::Target::setSelected(), SurfaceModel, surfaceModelMode(), targets, QGpCoreTools::tr(), DinverDCCore::TargetList::validateTargets(), and QGpCoreTools::XMLHeader::xml_restoreFile().
{ CoreApplication a(argc, argv, help); targets=new TargetList; // Options QString targetFile; // Target file to consider in misfit computation int i, j=1; // Check arguments for Target file only for(i=1; i<argc; i++) { QByteArray arg=argv[i]; if(arg[0]=='-') { if(arg=="-target") { CoreApplication::checkOptionArg(i, argc, argv); targetFile=argv[i]; } else { argv[j++]=argv[i]; } } else { argv[j++]=argv[i]; } } if(j < argc) { argv[j]=0; argc=j; } if(targetFile.isEmpty()) { App::stream() << tr("gpdcmisfit: option -target is mandatory") << endl; delete targets; return 2; } XMLVirtualPlugin plugin(targets, "DispersionCurve"); XMLDinverHeader hdr(&plugin); if(hdr.xml_restoreFile(targetFile)!=XMLClass::NoError) { App::stream() << tr("gpdcmisfit: error parsing target file") << endl; delete targets; return 2; } // By default no misfit component is selected targets->dispersionTarget().setSelected(false); targets->autocorrTarget().setSelected(false); targets->ellipticityCurveTarget().setSelected(false); targets->ellipticityPeakTarget().setSelected(false); targets->refractionVpTarget().setSelected(false); targets->refractionVsTarget().setSelected(false); MisfitType misfitType=L2_Normalized; bool forceMisfitType=false; // Check arguments j=1; for(i=1; i<argc; i++) { QByteArray arg=argv[i]; if(arg[0]=='-') { if(arg=="-report") { mode=Report; } else if(arg=="-surf-model") { mode=SurfaceModel; } else if(arg=="-refra-model") { mode=RefractionModel; } else if(arg=="-akaike") { CoreApplication::checkOptionArg(i, argc, argv); misfitType=Akaike; akaikeDof=atoi(argv[i] ); forceMisfitType=true; } else if(arg=="-akaike-few") { CoreApplication::checkOptionArg(i, argc, argv); misfitType=AkaikeFewSamples; akaikeDof=atoi(argv[i] ); forceMisfitType=true; } else if(arg=="-o") { CoreApplication::checkOptionArg(i, argc, argv); reportFile=argv[i]; } else if(arg=="-m-in") { CoreApplication::checkOptionArg(i, argc, argv); maxInputMisfit=atof(argv[i])*(1.0+1e-15); } else if(arg=="-m-out") { CoreApplication::checkOptionArg(i, argc, argv); maxOutputMisfit=atof(argv[i])*(1.0+1e-15); } else if(arg=="-best-out") { CoreApplication::checkOptionArg(i, argc, argv); bestOutputCount=atoi(argv[i] ); } else if(arg=="-n-out") { CoreApplication::checkOptionArg(i, argc, argv); maxOutputCount=atoi(argv[i]); } else if(arg=="-all") { CoreApplication::checkOptionArg(i, argc, argv); targets->dispersionTarget().setSelected(true); targets->autocorrTarget().setSelected(true); targets->ellipticityCurveTarget().setSelected(true); targets->ellipticityPeakTarget().setSelected(true); targets->refractionVpTarget().setSelected(true); targets->refractionVsTarget().setSelected(true); double m=atof(argv[i]); targets->dispersionTarget().setMinimumMisfit(m); targets->autocorrTarget().setMinimumMisfit(m); targets->ellipticityCurveTarget().setMinimumMisfit(m); targets->ellipticityPeakTarget().setMinimumMisfit(m); targets->refractionVpTarget().setMinimumMisfit(m); targets->refractionVsTarget().setMinimumMisfit(m); } else if(arg=="-disp") { CoreApplication::checkOptionArg(i, argc, argv); targets->dispersionTarget().setSelected(true); targets->dispersionTarget().setMinimumMisfit(atof(argv[i])); } else if(arg=="-autocorr") { CoreApplication::checkOptionArg(i, argc, argv); targets->autocorrTarget().setSelected(true); targets->autocorrTarget().setMinimumMisfit(atof(argv[i])); } else if(arg=="-ellcurve") { CoreApplication::checkOptionArg(i, argc, argv); targets->ellipticityCurveTarget().setSelected(true); targets->ellipticityCurveTarget().setMinimumMisfit(atof(argv[i])); } else if(arg=="-ellpeak") { CoreApplication::checkOptionArg(i, argc, argv); targets->ellipticityPeakTarget().setSelected(true); targets->ellipticityPeakTarget().setMinimumMisfit(atof(argv[i])); } else if(arg=="-refravp") { CoreApplication::checkOptionArg(i, argc, argv); targets->refractionVpTarget().setSelected(true); targets->refractionVpTarget().setMinimumMisfit(atof(argv[i])); } else if(arg=="-refravs") { CoreApplication::checkOptionArg(i, argc, argv); targets->refractionVsTarget().setSelected(true); targets->refractionVsTarget().setMinimumMisfit(atof(argv[i])); } else if(arg=="-mt") { CoreApplication::checkOptionArg(i, argc, argv); targets->magnetoTelluricTarget().setSelected(true); targets->magnetoTelluricTarget().setMinimumMisfit(atof(argv[i])); } else if(arg=="-f") { reportAction=ReportWriter::Overwrite; } else if(arg=="-resume") { reportAction=ReportWriter::Append; } else { App::stream() << tr("gpdcmisfit: bad option %1, see --help").arg(argv[i]) << endl; delete targets; return 2; } } else { argv[j++]=argv[i]; } } if(j < argc) { argv[j]=0; argc=j; } if(!targets->dispersionTarget().selected() && !targets->autocorrTarget().selected() && !targets->ellipticityCurveTarget().selected() && !targets->ellipticityPeakTarget().selected() && !targets->refractionVpTarget().selected() && !targets->refractionVsTarget().selected() && !targets->magnetoTelluricTarget().selected()) { App::stream() << tr("gpdcmisfit: no sub-target selected, see --help") << endl; delete targets; return 2; } for(int i =1;i<argc;i++) { inputFileList.append(argv[i]); } if(forceMisfitType) { targets->setMisfitType(misfitType); } targets->validateTargets(); int exitCode=0; switch(mode) { case Report: exitCode=reportMode(); break; case SurfaceModel: exitCode=surfaceModelMode(); break; case RefractionModel: exitCode=refractionModelMode(); break; } delete targets; return exitCode; }
PACKAGE_INFO | ( | gpdcmisfit | , |
GPDCMISFIT | |||
) |
int refractionModelMode | ( | ) |
References akaikeDof, QGpCoreTools::endl(), QGpCoreWave::RefractionDippingModel::fromStream(), inputFileList, QGpCoreWave::RefractionDippingModel::layerCount(), DinverDCCore::TargetList::refractionMisfit(), QGpCoreWave::RefractionDippingModel::toStream(), and QGpCoreTools::tr().
Referenced by main().
{ RefractionDippingModel m; QFile * f; QStringList::iterator itFile=inputFileList.begin(); if(itFile==inputFileList.end()) { f=new QFile; f->open(stdin,QIODevice::ReadOnly); CoreApplication::instance()->debugUserInterrupts(false); } else { f=0; } while(true) { if(f && f->atEnd()) { delete f; f=0; // Even if stdin was not in use, it does not hurt. CoreApplication::instance()->debugUserInterrupts(true); } if(!f) { if(itFile!=inputFileList.end()) { f=new QFile(*itFile); if(!f->open(QIODevice::ReadOnly)) { App::stream() << tr("Cannot open file %1 for reading.").arg(*itFile) << endl; delete f; return 2; } itFile++; } else break; } QString comments; QTextStream s(f); if(!m.fromStream(s, &comments)) { break; } if(m.layerCount()>0) { double totalMisfit=0.0; double totalWeight=0.0; bool ok=true; targets->refractionMisfit(totalMisfit, totalWeight, &m, akaikeDof,ok); if(ok && totalWeight>0) { s << totalMisfit/totalWeight << endl; m.toStream(s); } } else { break; } } delete f; return 0; }
int reportMode | ( | ) |
References DinverCore::ReportWriter::addModel(), QGpCoreTools::SharedObject::addReference(), akaikeDof, bestOutputCount, QGpCoreWave::Profile::depths(), QGpCoreTools::endl(), iModel, DinverDCCore::DCModelInfo::indexInReport(), inputFileList, DinverDCCore::TargetList::magnetoTelluricMisfit(), maxInputMisfit, maxOutputCount, maxOutputMisfit, misfit(), DinverCore::ReportReader::misfit(), DinverDCCore::DCModelInfo::misfit(), models, DinverCore::ReportReader::open(), DinverCore::ReportWriter::open(), outputReport, DinverDCCore::DCReportBlock::pitch(), DinverDCCore::DCReportBlock::readElectricModel(), DinverDCCore::DCReportBlock::readProfiles(), QGpCoreWave::Profile::readReport(), DinverDCCore::DCReportBlock::readSeismicModel(), DinverDCCore::TargetList::refractionMisfit(), DinverDCCore::DCModelInfo::report(), reportAction, reportFile, reports, QGpCoreWave::Profile::resample(), DinverDCCore::DCModelInfo::setIndexInReport(), DinverDCCore::DCModelInfo::setMisfit(), DinverCore::Parameter::setRealValue(), DinverDCCore::DCModelInfo::setReport(), sOut(), DinverCore::ReportReader::stream(), DinverDCCore::TargetList::surfaceMisfit(), DinverCore::ReportReader::synchronize(), QGpCoreTools::tr(), QGpCoreWave::Profile::values(), and QGpCoreWave::Seismic1DModel::vpProfile().
Referenced by main().
{ ReportWriter * outputReport; if(!reportFile.isEmpty()) { if(!ReportWriter::initReport(reportFile, tr("Open report for writing"), reportAction)) { return 2; } outputReport=new ReportWriter(reportFile); if(!outputReport->open()) { App::stream() << tr("gpdcmisfit: cannot open report file for writing") << endl; delete outputReport; return 2; } } else { outputReport=0; } QTextStream sOut(stdout); int iModel=0; //report->addModel(totalMisfit/totalWeight, checksum, nDimensions, _varParamList); sOut << "# Index in report | New misfit | Old misfit\n"; QList<ReportReader *> reports; for(QStringList::iterator it=inputFileList.begin(); it!=inputFileList.end(); it++) { ReportReader * report=new ReportReader(*it); if(!report->open()) { qDeleteAll(models); foreach(ReportReader * report, reports) { ReportReader::removeReference(report); } delete report; delete outputReport; return 2; } report->addReference(); reports << report; report->synchronize(); int nReportModels=report->nModels(); sOut << "# Report=" << *it << "\n"; sOut << "# N Models=" << nReportModels << "\n"; QDataStream& s=report->stream(); for(int iReportModel=0; iReportModel<nReportModels; iReportModel++) { double oldMisfit=report->misfit(iReportModel); if(oldMisfit<maxInputMisfit) { int nParams; uint cs; double val; qint64 blockOffset=s.device()->pos(); s >> nParams; s >> cs; Parameter * params[nParams]; for(int id=0 ; id<nParams; id++) { s >> val; params[id]=new Parameter; params[id]->setRealValue(val); } // Read layered model s.device()->seek(blockOffset); int reportDCVersion=report->userBlockVersion("DISP"); if(reportDCVersion>=0) { DCReportBlock dcBlock(s); dcBlock.readProfiles(reportDCVersion); Seismic1DModel * sm=dcBlock.readSeismicModel(); Resistivity1DModel * em=dcBlock.readElectricModel(); // Compute new misfit double totalMisfit=0.0; double totalWeight=0.0; bool ok=true; if(sm) { targets->surfaceMisfit(totalMisfit, totalWeight, sm, akaikeDof, ok); if(dcBlock.pitch()) { Profile pitch; pitch.readReport(s); pitch.resample(sm->vpProfile().depths()); targets->refractionMisfit(totalMisfit, totalWeight, sm, pitch.values(), akaikeDof, ok); } } if(em) { // No static shift: TODO provide a way to identify parameters values targets->magnetoTelluricMisfit(totalMisfit, totalWeight, em, 1.0, akaikeDof, ok); } if(!sm && !em) { // Really nothing to retrieve skip this model for(int id=0; id<nParams; id++) delete params[id]; continue; } if(ok && totalWeight>0) { double misfit=totalMisfit/totalWeight; if(misfit<maxOutputMisfit) { if(bestOutputCount>0) { DCModelInfo * info=new DCModelInfo; info->setReport(report); info->setIndexInReport(iReportModel); info->setMisfit(misfit); info->addReference(); models << info; } else { sOut << QString("%1 %2 %3").arg(iReportModel+1).arg(oldMisfit).arg(misfit) << endl; if(outputReport) { // Save new misfit and the rest of the model entry (param, disp,...) outputReport->addModel(misfit, cs, nParams, params); s.device()->seek(blockOffset); DCReportBlock::write(outputReport, report); } iModel++; if(iModel==maxOutputCount) { for(int id=0 ; id<nParams; id++) { delete params[id]; } delete sm; delete em; break; } } } delete sm; delete em; } for(int id=0; id<nParams; id++) { delete params[id]; } } } } } if(bestOutputCount>0) { qSort(models.begin(), models.end(), DCModelInfo::misfitLessThan); int iStop=models.count() - maxOutputCount; if(iStop<0) iStop=0; for(int i=models.count()-1; i>=iStop; i-- ) { DCModelInfo * info=models.at(i); ReportReader * report=info->report(); double oldMisfit=report->misfit(info->indexInReport()); sOut << QString("%1 %2 %3\n").arg(info->indexInReport()+1).arg(oldMisfit).arg(info->misfit()); if(outputReport) { QDataStream& s=report->stream(); int nParams; uint cs; double val; qint64 blockOffset=s.device()->pos(); s >> nParams; s >> cs; Parameter * params[nParams]; for(int id=0 ; id<nParams; id++ ) { s >> val; params[id]=new Parameter; params[id]->setRealValue(val); } // Save new misfit and the rest of the model entry (param, disp,...) outputReport->addModel(info->misfit(), cs, nParams, params); for(int id=0 ; id<nParams; id++ ) delete params[id]; s.device()->seek(blockOffset); DCReportBlock::write(outputReport, report); } iModel++; } } qDeleteAll(models); foreach(ReportReader * report, reports) ReportReader::removeReference(report); if(outputReport) { sOut << QString("# Saved %1 misfits in %2").arg(iModel).arg(reportFile) << endl; delete outputReport; } return 0; }
int surfaceModelMode | ( | ) |
References akaikeDof, QGpCoreTools::endl(), QGpCoreWave::Seismic1DModel::fromStream(), inputFileList, QGpCoreWave::Seismic1DModel::layerCount(), DinverDCCore::TargetList::surfaceMisfit(), QGpCoreWave::Seismic1DModel::toStream(), and QGpCoreTools::tr().
Referenced by main().
{ Seismic1DModel m; QFile * f; QStringList::iterator itFile=inputFileList.begin(); if(itFile==inputFileList.end()) { f=new QFile; f->open(stdin,QIODevice::ReadOnly); CoreApplication::instance()->debugUserInterrupts(false); } else { f=0; } while(true) { if(f && f->atEnd()) { delete f; f=0; // Even if stdin was not in use, it does not hurt. CoreApplication::instance()->debugUserInterrupts(true); } if(!f) { if(itFile!=inputFileList.end()) { f=new QFile(*itFile); if(!f->open(QIODevice::ReadOnly)) { App::stream() << tr("Cannot open file %1 for reading.").arg(*itFile) << endl; delete f; return 2; } itFile++; } else break; } QString comments; QTextStream s(f); if(!m.fromStream(s, &comments)) { break; } if(m.layerCount()>0) { double totalMisfit=0.0; double totalWeight=0.0; bool ok=true; targets->surfaceMisfit(totalMisfit, totalWeight, &m, akaikeDof, ok); if(ok && totalWeight>0) { s << totalMisfit/totalWeight << endl; m.toStream(s); } } else { break; } } delete f; return 0; }
int akaikeDof = 1 |
Referenced by main(), refractionModelMode(), reportMode(), and surfaceModelMode().
int bestOutputCount = 0 |
Referenced by main(), and reportMode().
QStringList inputFileList |
Referenced by main(), refractionModelMode(), reportMode(), and surfaceModelMode().
double maxInputMisfit = 1e99 |
Referenced by main(), and reportMode().
int maxOutputCount = 0 |
Referenced by main(), and reportMode().
double maxOutputMisfit = 1e99 |
Referenced by main(), and reportMode().
Referenced by QGpCompatibility::CompatMultiModalData::allocatesData(), QGpCompatibility::CompatMultiModalCurves::allocatesValues(), QGpCompatibility::CompatDispersion::checkSlopes(), QGpCompatibility::CompatMultiModalData::checkStdDev(), QGpCompatibility::CompatDispersionData::closestModeMisfit(), QGpCompatibility::CompatDispersionData::convertStddev(), QGpCompatibility::CompatMultiModalData::dataToReport(), QGpCompatibility::CompatMultiModalData::deleteData(), QGpCompatibility::CompatMultiModalCurves::deleteValues(), dispersion_curve_love_(), dispersion_curve_rayleigh_(), QGpCompatibility::CompatMultiModalData::isSameData(), main(), QGpCompatibility::CompatDispersionData::maxDataFrequency(), QGpCompatibility::CompatMultiModalData::measurement(), QGpCompatibility::CompatDispersionData::minDataFrequency(), QGpCompatibility::CompatDispersionData::misfit(), QGpCompatibility::CompatMultiModalData::reportToData(), QGpCompatibility::CompatMultiModalData::reportToDataWeight(), QGpCompatibility::CompatMultiModalCurves::reportToValues(), QGpCompatibility::CompatEllipticity::resetValues(), QGpCompatibility::CompatDispersion::resetValues(), QGpCompatibility::CompatAutocorrCurves::resetValues(), QGpCompatibility::CompatMultiModalData::setMean(), QGpCompatibility::CompatMultiModalData::setStddev(), QGpCompatibility::CompatMultiModalCurves::setValue(), QGpCompatibility::CompatMultiModalData::stddev(), QGpCompatibility::CompatMultiModalCurves::toStream(), QGpCompatibility::CompatMultiModalCurves::value(), QGpCompatibility::CompatMultiModalData::valuesToData(), and QGpCompatibility::CompatMultiModalCurves::valuesToReport().
QList<DCModelInfo *> models |
ReportWriter::Action reportAction = ReportWriter::Ask |
Referenced by main(), modeImportanceSampling(), modeNeighborhoodOptimization(), modeSnoopOptimization(), and reportMode().
QString reportFile |
Referenced by main(), and reportMode().
TargetList* targets = 0 |
Referenced by DinverCore::XMLDinverContext::all(), and main().