Enumerations | Functions | Variables
gpdcmisfit/main.cpp File Reference
#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

ApplicationHelphelp ()
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
TargetListtargets = 0

Enumeration Type Documentation

enum AppMode
Enumerator:
Report 
SurfaceModel 
RefractionModel 

Function Documentation

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   
)

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

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

Variable Documentation

int akaikeDof = 1
int bestOutputCount = 0

Referenced by main(), and reportMode().

QStringList inputFileList
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
QString reportFile

Referenced by main(), and reportMode().

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines