All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Member Functions | Static Public Attributes | Protected Member Functions | Friends
DinverDCCore::TargetList Class Reference

Brief description of class still missing. More...

#include <TargetList.h>

Inheritance diagram for DinverDCCore::TargetList:
QGpCoreTools::XMLClass

List of all members.

Public Member Functions

AutocorrTargetautocorrTarget ()
const AutocorrTargetautocorrTarget () const
int dispersionSampleCount () const
ModalCurveTargetdispersionTarget ()
const ModalCurveTargetdispersionTarget () const
ModalCurveTargetellipticityCurveTarget ()
const ModalCurveTargetellipticityCurveTarget () const
ValueTargetellipticityPeakTarget ()
const ValueTargetellipticityPeakTarget () const
bool isEmpty () const
bool isGroundModelParameter (const Parameter *p) const
bool isPoissonRatioOk (const GroundParameter *from)
void magnetoTelluricMisfit (double &totalMisfit, double &totalWeight, const Resistivity1DModel *model, double staticShift, int nDimensions, bool &ok)
MagnetoTelluricTargetmagnetoTelluricTarget ()
const MagnetoTelluricTargetmagnetoTelluricTarget () const
double misfit (int nDimensions, bool &ok)
const Pointposition () const
void refractionMisfit (double &totalMisfit, double &totalWeight, Seismic1DModel *surfModel, const QVector< double > &pitch, int nDimensions, bool &ok)
void refractionMisfit (double &totalMisfit, double &totalWeight, RefractionDippingModel *tiltModel, int nDimensions, bool &ok)
RefractionTargetrefractionVpTarget ()
const RefractionTargetrefractionVpTarget () const
RefractionTargetrefractionVsTarget ()
const RefractionTargetrefractionVsTarget () const
void setMisfitType (MisfitType t)
void setParamProfiles (ParamGroundModel *gm, RealSpace &ps)
void setPosition (const Point &p)
void surfaceMisfit (double &totalMisfit, double &totalWeight, Seismic1DModel *surfModel, int nDimensions, bool &ok)
 TargetList ()
 TargetList (const TargetList &o)
void validateTargets ()
void writeReport (ReportWriter *report) const
virtual const QString & xml_tagName () const
virtual ~TargetList ()

Static Public Attributes

static const QString xmlTargetListTag = "TargetList"

Protected Member Functions

virtual XMLMember xml_member (XML_MEMBER_ARGS)
virtual void xml_polish (XML_POLISH_ARGS)
virtual void xml_polishChild (XML_POLISHCHILD_ARGS)
virtual bool xml_setProperty (XML_SETPROPERTY_ARGS)
virtual void xml_writeChildren (XML_WRITECHILDREN_ARGS) const
virtual void xml_writeProperties (XML_WRITECHILDREN_ARGS) const

Friends

class DCReportBlock

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

Description of constructor still missing

References QGpCoreTools::L2_LogNormalized, DinverDCCore::Target::setMisfitType(), and TRACE.

{
  TRACE;
  initFactories();
  initProfiles();
  // Ellipticity values are expressed on a log scale
  _ellipticityCurveTarget.setMisfitType(L2_LogNormalized);
}

References TRACE, and validateTargets().

   : XMLClass(),
     _dispersionTarget(o._dispersionTarget),
     _autocorrTarget(o._autocorrTarget),
     _ellipticityCurveTarget(o._ellipticityCurveTarget),
     _ellipticityPeakTarget(o._ellipticityPeakTarget),
     _refractionVpTarget(o._refractionVpTarget),
     _refractionVsTarget(o._refractionVsTarget),
     _magnetoTelluricTarget(o._magnetoTelluricTarget)
{
  TRACE;
  _position=o._position;
  initFactories();
  initProfiles();
  validateTargets();
}

References TRACE.

{
  TRACE;
  deleteFactories();
}

Member Function Documentation

{return _autocorrTarget;}

Return the number of sample internally set to dispersion computation. Mainly used to inform the user.

References QGpCoreWave::DispersionFactory::groupRayleigh(), QGpCoreWave::DispersionFactory::phaseRayleigh(), TRACE, and QGpCoreWave::ModalStorage::xCount().

Referenced by DCPlugin::initForward().

{
  TRACE;
  if(!_dispersionFactory) return 0;
  int nSamples=0;
  Dispersion * d=_dispersionFactory->phaseRayleigh();
  if(d) {
    nSamples=d->xCount();
  } else {
    d=_dispersionFactory->groupRayleigh();
    if(d) {
      nSamples=d->xCount();
    }
  }
  return nSamples;
}
{return _dispersionTarget;}
{return _ellipticityCurveTarget;}
{return _ellipticityPeakTarget;}

References DinverDCCore::ModalCurveTarget::curves(), DinverDCCore::AutocorrTarget::curves(), DinverDCCore::MagnetoTelluricTarget::curves(), DinverDCCore::RefractionTarget::curves(), QGpCoreWave::AutocorrCurves::isEmpty(), QGpCoreTools::StatisticalValue< numberType >::isValid(), TRACE, and DinverDCCore::ValueTarget::value().

Referenced by TargetMerge::execute().

{
  TRACE;
  return _dispersionTarget.curves().isEmpty() &&
         !_ellipticityPeakTarget.value().isValid() &&
         _ellipticityCurveTarget.curves().isEmpty() &&
         _autocorrTarget.curves().isEmpty() &&
         _refractionVpTarget.curves().isEmpty() &&
         _refractionVsTarget.curves().isEmpty() &&
         _magnetoTelluricTarget.curves().isEmpty();
}
bool DinverDCCore::TargetList::isGroundModelParameter ( const Parameter p) const [inline]

Referenced by Forward::isFussyOk(), and Forward::valueChanged().

{
  return p!= _magnetoTelluricStaticShift;
}

References DinverDCCore::PoissonCondition::isOk(), and TRACE.

Referenced by Forward::isFussyOk().

{
  TRACE;
  if(_poissonCondition)
    return _poissonCondition->isOk(from);
  else
    return true;
}
void DinverDCCore::TargetList::magnetoTelluricMisfit ( double &  totalMisfit,
double &  totalWeight,
const Resistivity1DModel model,
double  staticShift,
int  nDimensions,
bool &  ok 
)

References QGpCoreWave::MagnetoTelluricFactory::calculate(), DinverDCCore::MagnetoTelluricTarget::curves(), and TRACE.

Referenced by misfit(), and reportMode().

{
  TRACE;
  double individualMisfit;
  if(!_magnetoTelluricFactory->calculate(*model, staticShift)) {
    ok=false;
    return;
  }
  individualMisfit=curveMisfit(_magnetoTelluricTarget.curves(), *_magnetoTelluricFactory, _magnetoTelluricTarget, nDimensions);
  if(individualMisfit==-1) {
    ok=false;
    return;
  }
  totalMisfit+=_magnetoTelluricTarget.misfitWeight()*individualMisfit;
  totalWeight+=_magnetoTelluricTarget.misfitWeight();
}
{return _magnetoTelluricTarget;}
double DinverDCCore::TargetList::misfit ( int  nDimensions,
bool &  ok 
)

nDimensions is number of free parameters. This is used only if Akaike misfit is computed.

References DinverDCCore::RefractionTarget::curves(), DinverDCCore::MagnetoTelluricTarget::curves(), QGpCoreWave::Profile::depths(), magnetoTelluricMisfit(), DinverDCCore::ParamProfile::maxResampledProfile(), DinverDCCore::ParamProfile::minResampledProfile(), DinverCore::Parameter::realValue(), refractionMisfit(), DinverDCCore::ParamProfile::resampledProfile(), DinverDCCore::Target::selected(), surfaceMisfit(), DinverDCCore::DCReportBlock::surfaceWaveModel(), TRACE, QGpCoreWave::Profile::values(), DinverDCCore::DCReportBlock::vpModel(), DinverDCCore::DCReportBlock::vsModel(), and DinverDCCore::DCReportBlock::vspModel().

Referenced by Forward::misfit().

{
  TRACE;
  double totalMisfit=0;
  double totalWeight=0;
  Seismic1DModel * m=0;
  if(surfaceWave()) {
    m=DCReportBlock::surfaceWaveModel(_vp->resampledProfile().depths(),
                                      _vp->resampledProfile().values(),
                                      _vs->resampledProfile().values(),
                                      _rho->resampledProfile().values(),
                                      &_nu->minResampledProfile().values(),
                                      &_nu->maxResampledProfile().values());
    //fprintf(stdout,"%s\n",surfModel->toString().toAscii().data());
    surfaceMisfit(totalMisfit, totalWeight, m, nDimensions, ok);
    if((_refractionVpTarget.selected() && !_refractionVpTarget.curves().isEmpty()) ||
       (_refractionVsTarget.selected() && !_refractionVsTarget.curves().isEmpty())) {
      refractionMisfit(totalMisfit, totalWeight, m, _pitch->resampledProfile().values(), nDimensions, ok);
    }
  } else { // No surface wave
    if(_refractionVpTarget.selected() && !_refractionVpTarget.curves().isEmpty()) {
      if(_refractionVsTarget.selected() && !_refractionVsTarget.curves().isEmpty()) {
        m=DCReportBlock::vspModel(_pitch->resampledProfile().depths(),
                                     _vp->resampledProfile().values(),
                                     _vs->resampledProfile().values());
      } else {
        m=DCReportBlock::vpModel(_pitch->resampledProfile().depths(),
                                    _vp->resampledProfile().values());
      }
    } else if(_refractionVsTarget.selected() && !_refractionVsTarget.curves().isEmpty()) {
      m=DCReportBlock::vsModel(_pitch->resampledProfile().depths(),
                                  _vs->resampledProfile().values());
    }
    if(m) refractionMisfit(totalMisfit, totalWeight, m, _pitch->resampledProfile().values(), nDimensions, ok);

  }
  delete m;
  if(_magnetoTelluricTarget.selected() && !_magnetoTelluricTarget.curves().isEmpty()) {
    double staticShift;
    if(_magnetoTelluricStaticShift) {
      staticShift=_magnetoTelluricStaticShift->realValue();
    } else {
      staticShift=1.0;
    }
    Resistivity1DModel m(_res->resampledProfile());
    magnetoTelluricMisfit(totalMisfit, totalWeight, &m, staticShift, nDimensions, ok);
  }
  if(totalWeight > 0) return totalMisfit/totalWeight;
  else return totalMisfit;
}
const Point& DinverDCCore::TargetList::position ( ) const [inline]
void DinverDCCore::TargetList::refractionMisfit ( double &  totalMisfit,
double &  totalWeight,
Seismic1DModel surfModel,
const QVector< double > &  pitch,
int  nDimensions,
bool &  ok 
)

References QGpCoreWave::RefractionFactory::calculate(), DinverDCCore::RefractionTarget::curves(), QGpCoreWave::RefractionDippingModel::fromSeismic1DModel(), QGpCoreWave::Seismic1DModel::layerCount(), DinverDCCore::Target::selected(), and TRACE.

Referenced by misfit(), refractionModelMode(), and reportMode().

{
  TRACE;
  double individualMisfit;
  if(_refractionVpTarget.selected() && !_refractionVpTarget.curves().isEmpty()) {
    RefractionDippingModel m(surfModel->layerCount());
    m.fromSeismic1DModel( *surfModel, pitch, Seismic1DModel::P);
    if( !_refractionVpFactory->calculate(&m) ) {
      ok=false;
      return;
    }
    individualMisfit=curveMisfit(_refractionVpTarget.curves(), *_refractionVpFactory, _refractionVpTarget, nDimensions);
    if(individualMisfit==-1) {
      ok=false;
      return;
    }
    totalMisfit+=_refractionVpTarget.misfitWeight()*individualMisfit;
    totalWeight+=_refractionVpTarget.misfitWeight();
  }
  if(_refractionVsTarget.selected() && !_refractionVsTarget.curves().isEmpty()) {
    RefractionDippingModel m(surfModel->layerCount());
    m.fromSeismic1DModel( *surfModel, pitch, Seismic1DModel::S);
    if( !_refractionVsFactory->calculate(&m) ) {
      ok=false;
      return;
    }
    individualMisfit=curveMisfit(_refractionVsTarget.curves(), *_refractionVsFactory, _refractionVsTarget, nDimensions);
    if(individualMisfit==-1) {
      ok=false;
      return;
    }
    totalMisfit+=_refractionVsTarget.misfitWeight()*individualMisfit;
    totalWeight+=_refractionVsTarget.misfitWeight();
  }
}
void DinverDCCore::TargetList::refractionMisfit ( double &  totalMisfit,
double &  totalWeight,
RefractionDippingModel tiltModel,
int  nDimensions,
bool &  ok 
)

References QGpCoreWave::RefractionFactory::calculate(), DinverDCCore::RefractionTarget::curves(), DinverDCCore::Target::misfitWeight(), DinverDCCore::Target::selected(), and TRACE.

{
  TRACE;
  double individualMisfit;
  if(_refractionVpTarget.selected() && !_refractionVpTarget.curves().isEmpty()) {
    if( !_refractionVpFactory->calculate(tiltModel) ) {
      ok=false;
      return;
    }
    individualMisfit=curveMisfit(_refractionVpTarget.curves(), *_refractionVpFactory, _refractionVpTarget, nDimensions);
    if(individualMisfit==-1) {
      ok=false;
      return;
    }
    totalMisfit+=_refractionVpTarget.misfitWeight()*individualMisfit;
    totalWeight+=_refractionVpTarget.misfitWeight();
  }
  if(_refractionVsTarget.selected() && !_refractionVsTarget.curves().isEmpty()) {
    if( !_refractionVsFactory->calculate(tiltModel) ) {
      ok=false;
      return;
    }
    individualMisfit=curveMisfit(_refractionVsTarget.curves(), *_refractionVsFactory, _refractionVsTarget, nDimensions);
    if(individualMisfit==-1) {
      ok=false;
      return;
    }
    totalMisfit+=_refractionVpTarget.misfitWeight()*individualMisfit;
    totalWeight+=_refractionVsTarget.misfitWeight();
  }
}
{return _refractionVpTarget;}
{return _refractionVsTarget;}

References DinverDCCore::Target::setMisfitType(), and TRACE.

Referenced by main().

{
  TRACE;
  _dispersionTarget.setMisfitType(t);
  _dispersionTarget.setMisfitType(t);
  _autocorrTarget.setMisfitType(t);
  _ellipticityCurveTarget.setMisfitType(t);
  _ellipticityPeakTarget.setMisfitType(t);
  _refractionVpTarget.setMisfitType(t);
  _refractionVsTarget.setMisfitType(t);
  _magnetoTelluricTarget.setMisfitType(t);
}

References DinverCore::RealSpace::addCondition(), DinverDCCore::ParamProfile::Condition, QGpCoreTools::endl(), DinverDCCore::ParamGroundModel::find(), DinverCore::RealSpace::parameter(), QGpCoreTools::tr(), TRACE, and DinverDCCore::ParamProfile::type().

Referenced by Forward::setParamSpace().

{
  TRACE;
  _vp=gm->find( "Vp" );
  _vs=gm->find( "Vs" );
  _rho=gm->find( "Rho" );
  _pitch=gm->find( "Pitch" );
  _res=gm->find( "Res" );
  if(_vp && _vs) {
    _nu=gm->find( "Nu" );
    ASSERT(_nu && _nu->type()==ParamProfile::Condition);
    _poissonCondition=new PoissonCondition(_vp, _vs, _nu);
    ps.addCondition(_poissonCondition);
  }
  if(_res) {
    _magnetoTelluricStaticShift=ps.parameter("MTStatic");
    if(_magnetoTelluricStaticShift){
      App::stream() << tr("Magneto-telluric static shift included") << endl;
    } else {
      App::stream() << tr("Magneto-telluric static shift not found (paramter 'MTStatic'") << endl;
    }
  }
}
void DinverDCCore::TargetList::setPosition ( const Point p) [inline]

Referenced by TargetAdd::execute().

{_position=p;}
void DinverDCCore::TargetList::surfaceMisfit ( double &  totalMisfit,
double &  totalWeight,
Seismic1DModel surfModel,
int  nDimensions,
bool &  ok 
)

References QGpCoreWave::DispersionFactory::calculate(), QGpCoreWave::AutocorrFactory::calculate(), DinverDCCore::ModalCurveTarget::curves(), DinverDCCore::AutocorrTarget::curves(), QGpCoreWave::AutocorrCurves::curves(), QGpCoreTools::endl(), QGpCoreWave::Seismic1DModel::initCalculation(), QGpCoreWave::AutocorrCurves::isEmpty(), QGpCoreTools::StatisticalValue< numberType >::isValid(), DinverDCCore::Target::minimumMisfit(), DinverDCCore::Target::misfitWeight(), QGpCoreWave::EllipticityFactory::peakMisfit(), DinverDCCore::Target::selected(), QGpCoreWave::Seismic1DModel::toString(), QGpCoreTools::tr(), TRACE, and DinverDCCore::ValueTarget::value().

Referenced by DinverDCCore::TargetList2D::misfit(), misfit(), reportMode(), and surfaceModelMode().

{
  TRACE;
  double individualMisfit;

  if(!surfModel->initCalculation()) {
    App::stream() << tr( " *** WARNING *** : bad physical model" ) << endl;
    App::stream() << surfModel->toString() << endl;
    ok=false;
    return;
  }

  // Determinant misfit
  individualMisfit=determinantMisfit(_dispersionTarget.curves(), surfModel);
  totalMisfit+=_dispersionTarget.misfitWeight()*individualMisfit;
  totalWeight+=_dispersionTarget.misfitWeight();
  return;

  // Rayleigh and/or Love modes, phase and/or group
  if(!_dispersionFactory->calculate(surfModel, _ellipticityFactory)) {
    ok=false;
    return;
  }

  if(_dispersionTarget.selected() && !_dispersionTarget.curves().isEmpty()) {
    individualMisfit=curveMisfit(_dispersionTarget.curves(), *_dispersionFactory, _dispersionTarget, nDimensions);
    if(individualMisfit==-1) {
      ok=false;
      return;
    }
    totalMisfit+=_dispersionTarget.misfitWeight()*individualMisfit;
    totalWeight+=_dispersionTarget.misfitWeight();
  }

  if(_autocorrTarget.selected() && !_autocorrTarget.curves().isEmpty()) {
    _autocorrFactory->calculate(_dispersionFactory);
    /*if(_autocorrFactory->isRadial() || _autocorrFactory->isTransverse()) {
      _autocorrFactory->setAlpha(_autocorrCurves.curves());
      _autocorrFactory->setHorizontalAutocorr();
    }*/
    individualMisfit=curveMisfit(_autocorrTarget.curves().curves(), *_autocorrFactory, _autocorrTarget, nDimensions);
    if(individualMisfit==-1) {
      ok=false;
      return;
    }
    totalMisfit+=_autocorrTarget.misfitWeight()*individualMisfit;
    totalWeight+=_autocorrTarget.misfitWeight();
  }

  if(_ellipticityCurveTarget.selected() && !_ellipticityCurveTarget.curves().isEmpty()) {
    individualMisfit=curveMisfit(_ellipticityCurveTarget.curves(), *_ellipticityFactory, _ellipticityCurveTarget, nDimensions);
    if(individualMisfit==-1) {
      ok=false;
      return;
    }
    totalMisfit+=_ellipticityCurveTarget.misfitWeight()*individualMisfit;
    totalWeight+=_ellipticityCurveTarget.misfitWeight();
  }

  if(_ellipticityPeakTarget.selected() && _ellipticityPeakTarget.value().isValid()) {
    // TODO includes misfitType
    // Ellipticity peak misfit is not a L2 norm but just a L1...
    individualMisfit=_ellipticityFactory->peakMisfit(_ellipticityPeakTarget.value(), *_dispersionFactory, surfModel);
    if(individualMisfit<_ellipticityPeakTarget.minimumMisfit()) {
      individualMisfit=_ellipticityPeakTarget.minimumMisfit();
    }
    totalMisfit+=_ellipticityPeakTarget.misfitWeight()*individualMisfit;
    totalWeight+=_ellipticityPeakTarget.misfitWeight();
  }
}

Build the factories responsible for computing dispersion curves and misfits

References DinverDCCore::ModalCurveTarget::curves(), DinverDCCore::AutocorrTarget::curves(), DinverDCCore::RefractionTarget::curves(), DinverDCCore::MagnetoTelluricTarget::curves(), QGpCoreWave::AutocorrCurves::curves(), QGpCoreTools::Function, QGpCoreWave::AutocorrFactory::init(), QGpCoreWave::AutocorrCurves::isEmpty(), QGpCoreTools::StatisticalValue< numberType >::isValid(), QGpCoreTools::Curve< pointType >::line(), QGpCoreWave::MagnetoTelluricFactory::linkX(), QGpCoreWave::ModalFactory::linkX(), QGpCoreWave::RefractionFactory::linkX(), QGpCoreTools::LogScale, QGpCoreTools::Curve< pointType >::resample(), QGpCoreWave::AutocorrCurves::ringCount(), QGpCoreWave::AutocorrCurves::ringCurves(), QGpCoreWave::AutocorrCurves::rings(), DinverDCCore::Target::selected(), QGpCoreWave::MagnetoTelluricFactory::setAngularFrequency(), QGpCoreWave::ModalFactory::setAngularFrequency(), QGpCoreWave::EllipticityFactory::setMode(), QGpCoreWave::ModalFactory::setModes(), QGpCoreWave::MagnetoTelluricFactory::setX(), QGpCoreWave::ModalFactory::setX(), QGpCoreWave::RefractionFactory::setX(), TRACE, QGpCoreWave::DispersionFactory::validate(), and DinverDCCore::ValueTarget::value().

Referenced by main(), TargetListWidget::targetList(), TargetList(), and xml_polish().

{
  TRACE;
  // Init all factories instead of just dispersion (until 20110404)
  // Bug encountered in gpdcmisfit: load a target with various sub-targets, options
  //                                from command line do not select all of them.
  //                                Hence factories were still allocated but not validated
  //                                however still used by calculate().
  deleteFactories();
  initFactories();

  // Set X from curves
  if(_dispersionTarget.selected() && !_dispersionTarget.curves().isEmpty()) {
    _dispersionFactory=new DispersionFactory;
    _dispersionFactory->setX(_dispersionTarget.curves());
  }
  if(_ellipticityCurveTarget.selected() && !_ellipticityCurveTarget.curves().isEmpty()) {
    _ellipticityFactory=new EllipticityFactory;
    _ellipticityFactory->setX(_ellipticityCurveTarget.curves());
    if(!_dispersionFactory) {
      _dispersionFactory=new DispersionFactory;
    }
  }
  if(_autocorrTarget.selected() && !_autocorrTarget.curves().isEmpty()) {
    _autocorrFactory=new AutocorrFactory(_autocorrTarget.curves().rings());
    int nRings=_autocorrTarget.curves().ringCount();
    for(int iRing=0; iRing<nRings; iRing++) {
      _autocorrFactory->setX(_autocorrTarget.curves().ringCurves(iRing));
    }
    if(!_dispersionFactory) {
      _dispersionFactory=new DispersionFactory;
    }
  }
  if(_ellipticityPeakTarget.selected() && _ellipticityPeakTarget.value().isValid()) {
    if(!_ellipticityFactory) {
      _ellipticityFactory=new EllipticityFactory;
      if(!_dispersionFactory) {
        _dispersionFactory=new DispersionFactory;
        // No sampling defined elsewhere, use a default one from 0.2 to 20 with 100 samples on a log scale
        ModalCurve c;
        c.line(FactoryPoint(0.2, 0.0), FactoryPoint(20.0, 0.0));
        c.resample(100, 0.2, 20.0, LogScale | Function);
        _ellipticityFactory->setX(c);
      }
    }
  }
  // Set consistent X between factories
  if(_autocorrFactory) {
    _autocorrFactory->setX( *_dispersionFactory);
  }
  if(_ellipticityFactory) {
    _ellipticityFactory->setX( *_dispersionFactory);
    if(_autocorrFactory) { // Share again with autocorr if any
      _autocorrFactory->setX( *_dispersionFactory);
    }
  }
  // Set modes
  if(_dispersionFactory) {
    if(_dispersionTarget.selected() && !_dispersionTarget.curves().isEmpty()) {
      _dispersionFactory->linkX(_dispersionTarget.curves());
      _dispersionFactory->setModes(_dispersionTarget.curves());
    }
    _dispersionFactory->setAngularFrequency();
    if(_ellipticityFactory) {
      if(_ellipticityCurveTarget.selected() && !_ellipticityCurveTarget.curves().isEmpty()) {
        _ellipticityFactory->linkX(_ellipticityCurveTarget.curves());
        _ellipticityFactory->setModes(_ellipticityCurveTarget.curves());
      }
      _ellipticityFactory->setAngularFrequency();
      if(_ellipticityPeakTarget.selected() && _ellipticityPeakTarget.value().isValid()) {
        _ellipticityFactory->setMode(Mode(Mode::Phase, Mode::Rayleigh, 0));  // TODO Add mode selector in ellipticity peak
      }
    }
    if(_autocorrFactory) {
      _autocorrFactory->linkX(_autocorrTarget.curves().curves());
      _autocorrFactory->setModes(_autocorrTarget.curves().curves());
      _autocorrFactory->setAngularFrequency();
      _autocorrFactory->init();
    }
    _dispersionFactory->validate(_ellipticityFactory, _autocorrFactory);
  }

  if(_refractionVpTarget.selected() && !_refractionVpTarget.curves().isEmpty()) {
    _refractionVpFactory=new RefractionFactory();
    _refractionVpFactory->setX(_refractionVpTarget.curves());
    _refractionVpFactory->linkX(_refractionVpTarget.curves());
  }
  if(_refractionVpTarget.selected() && !_refractionVsTarget.curves().isEmpty()) {
    _refractionVsFactory=new RefractionFactory();
    _refractionVsFactory->setX(_refractionVsTarget.curves());
    _refractionVsFactory->linkX(_refractionVsTarget.curves());
  }
  if(_magnetoTelluricTarget.selected() && !_magnetoTelluricTarget.curves().isEmpty()) {
    delete _magnetoTelluricFactory;
    _magnetoTelluricFactory=new MagnetoTelluricFactory();
    _magnetoTelluricFactory->setX(_magnetoTelluricTarget.curves());
    _magnetoTelluricFactory->linkX(_magnetoTelluricTarget.curves());
    _magnetoTelluricFactory->setAngularFrequency();
  }
}
void DinverDCCore::TargetList::writeReport ( ReportWriter report) const [inline]

References DinverDCCore::ParamProfile::resampledProfile(), TRACE, and DinverDCCore::DCReportBlock::write().

Referenced by Forward::writeReport().

{
  TRACE;
  DCReportBlock::write(report, *this,
                       _vp ? &_vp->resampledProfile() : 0,
                       _vs ? &_vs->resampledProfile() : 0,
                       _rho ? &_rho->resampledProfile() : 0,
                       _pitch ? &_pitch->resampledProfile() : 0,
                       _res ? &_res->resampledProfile() : 0);
}

Re-implement this function to offer XML restore (children and properties) support to your class.

From tag and map (with contains the attibute value) return a unique identifier under the format of a XMLMember. XMLMember is initialized with 3 types of contructors:

  • An integer: id number of a property
  • A XMLClass * : a child of this object identified by tag
  • Default constructor: error, unknow child or property

Map of attributes can be inspected in this way (can be achived also in xml_setProperty()):

    static const QString tmp("childrenName");
    XMLRestoreAttributeIterator it=map.find(tmp);
    if(it!=map.end()) {
      // found attribute "childrenName"
    }

If the map of attributes is not used:

    Q_UNUSED(attributes);
    if(tag=="x1") return XMLMember(0);
    else if(tag=="y1") return XMLMember(1);
    else if(tag=="x2") return XMLMember(2);
    else if(tag=="y2") return XMLMember(3);
    else return XMLMember(XMLMember::Unknown);

Arithmetic operations + and - apply to XMLMember to avoid confusion of property id numbers between inherited objects. Offset 3 corresponds to the number of properties defined in this object.

    if(tag=="anInteger") return XMLMember(0);
    else if(tag=="aString") return XMLMember(1);
    else if(tag=="aDouble") return XMLMember(2);
    return AbstractLine::xml_member(tag, attributes, context)+3;

For the arguments of this function use Macro XML_MEMBER_ARGS.

Reimplemented from QGpCoreTools::XMLClass.

References DinverDCCore::ModalCurveTarget::curves(), DinverDCCore::AutocorrTarget::curves(), DinverDCCore::RefractionTarget::curves(), QGpCoreTools::endl(), QGpCoreTools::tr(), TRACE, and DinverDCCore::ValueTarget::value().

{
  TRACE;
  Q_UNUSED(context);
  static const QString attName("type");
  if(tag=="ModalCurveTarget") {
    XMLRestoreAttributeIterator it=attributes.find(attName);
    if(it!=attributes.end()) {
      if(it.value()=="dispersion") {
        return XMLMember(&_dispersionTarget);
      } else if(it.value()=="ellipticity") {
        return XMLMember(&_ellipticityCurveTarget);
      } else {
        App::stream() << tr("Wrong type of modal curve target: %1").arg(it.value().toString()) << endl;
        return XMLMember(XMLMember::Unknown);
      }
    } else {
      App::stream() << tr("No type defined for modal curve target") << endl;
      return XMLMember(XMLMember::Unknown);
    }
  } else if(tag=="AutocorrTarget") {
    return XMLMember(&_autocorrTarget);
  } else if(tag=="ValueTarget") {
    XMLRestoreAttributeIterator it=attributes.find(attName);
    if(it!=attributes.end()) {
      if(it.value()=="ellipticity peak") {
        return XMLMember(&_ellipticityPeakTarget);
      } else {
        App::stream() << tr("Wrong type of value target: %1").arg(it.value().toString()) << endl;
        return XMLMember(XMLMember::Unknown);
      }
    }  else {
      App::stream() << tr("No type defined for value target") << endl;
      return XMLMember(XMLMember::Unknown);
    }
  } else if(tag=="RefractionTarget") {
    XMLRestoreAttributeIterator it=attributes.find(attName);
    if(it!=attributes.end()) {
      if(it.value()=="Vp") {
        return XMLMember(&_refractionVpTarget);
      } else if(it.value()=="Vs") {
        return XMLMember(&_refractionVsTarget);
      } else {
        App::stream() << tr("Wrong type of refraction target: %1").arg(it.value().toString()) << endl;
        return XMLMember(XMLMember::Unknown);
      }
    }  else {
      App::stream() << tr("No type defined for refraction target") << endl;
      return XMLMember(XMLMember::Unknown);
    }
  } else if(tag=="MagnetoTelluricTarget") {
    return XMLMember(&_magnetoTelluricTarget);
  //
  // Code below kept for compatibility with files generated before 20090727
  //
  } else if(tag=="ModalCurve" ) {
    XMLRestoreAttributeIterator it=attributes.find(attName);
    if(it!=attributes.end()) {
      if(it.value()=="disp") {
        _dispersionTarget.curves().append(ModalCurve());
        return XMLMember(&_dispersionTarget.curves().last());
      } else if(it.value()=="ellCurve") {
        _ellipticityCurveTarget.curves().append(ModalCurve());
        return XMLMember(&_ellipticityCurveTarget.curves().last());
      } else {
        App::stream() << tr("Wrong type of modal curve %1").arg(it.value().toString()) << endl;
        return XMLMember(XMLMember::Unknown);
      }
    } else {
      App::stream() << tr("No type defined for modal curve") << endl;
      return XMLMember(XMLMember::Unknown);
    }
  } else if(tag=="AutocorrCurves") {
    return XMLMember(&_autocorrTarget.curves());
  } else if(tag=="StatValue" ) {
    return XMLMember(&_ellipticityPeakTarget.value());
  } else if(tag=="RefractionCurve") {
    XMLRestoreAttributeIterator it=attributes.find(attName);
    if(it!=attributes.end()) {
      if(it.value()=="refraVp") {
        _refractionVpTarget.curves().append(RefractionCurve());
        return XMLMember(&_refractionVpTarget.curves().last());
      } else if(it.value()=="refraVs") {
        _refractionVsTarget.curves().append(RefractionCurve());
        return XMLMember(&_refractionVsTarget.curves().last());
      } else {
        App::stream() << tr("Wrong type of refraction curve %1").arg(it.value().toString()) << endl;
        return XMLMember(XMLMember::Unknown);
      }
    } else {
      App::stream() << tr("No type defined for refraction curve") << endl;
      return XMLMember(XMLMember::Unknown);
    }
  } else if(tag=="position" ) return XMLMember(19);
  else if(tag=="dispWeight" ) return XMLMember(1); // kept for compatibility
  else if(tag=="dispMinMisfit" ) return XMLMember(7); // kept for compatibility
  else if(tag=="dispMisfitType" ) return XMLMember(13); // kept for compatibility
  else if(tag=="autocorrWeight" ) return XMLMember(2); // kept for compatibility
  else if(tag=="autocorrMinMisfit" ) return XMLMember(8); // kept for compatibility
  else if(tag=="autocorrMisfitType" ) return XMLMember(14); // kept for compatibility
  else if(tag=="ellCurveWeight" ) return XMLMember(3); // kept for compatibility
  else if(tag=="ellCurveMinMisfit" ) return XMLMember(9); // kept for compatibility
  else if(tag=="ellCurveMisfitType" ) return XMLMember(15); // kept for compatibility
  else if(tag=="ellPeakWeight" ) return XMLMember(4); // kept for compatibility
  else if(tag=="ellPeakMinMisfit" ) return XMLMember(10); // kept for compatibility
  else if(tag=="ellPeakMisfitType" ) return XMLMember(16); // kept for compatibility
  else if(tag=="refraVpWeight" ) return XMLMember(5); // kept for compatibility
  else if(tag=="refraVpMinMisfit" ) return XMLMember(11); // kept for compatibility
  else if(tag=="refraVpMisfitType" ) return XMLMember(17); // kept for compatibility
  else if(tag=="refraVsWeight" ) return XMLMember(6); // kept for compatibility
  else if(tag=="refraVsMinMisfit" ) return XMLMember(12); // kept for compatibility
  else if(tag=="refraVsMisfitType" ) return XMLMember(18); // kept for compatibility
  else if(tag=="ellWeight" ) return XMLMember(0); // kept for compatibility
  else if(tag=="modeGuess" ) return XMLMember(0); // kept for compatibility
  else if(tag=="modeGuessFreeJumping" ) return XMLMember(0); // kept for compatibility
  else if(tag=="modeGuessCount" ) return XMLMember(0); // kept for compatibility
  else if(tag=="modeGuessRayleighCount" ) return XMLMember(0); // kept for compatibility
  else if(tag=="hodoVpWeight" ) return XMLMember(0); // kept for compatibility
  else if(tag=="hodoVpMinMisfit" ) return XMLMember(0); // kept for compatibility
  else if(tag=="hodoVsWeight" ) return XMLMember(0); // kept for compatibility
  else if(tag=="hodoVsMinMisfit" ) return XMLMember(0); // kept for compatibility
  else if(tag=="ModalDispersion" ) { // kept for compatibility
    CompatModalDispersion * disp=new CompatModalDispersion;
    return XMLMember(disp, true);
  } else return XMLMember(XMLMember::Unknown);
}
void DinverDCCore::TargetList::xml_polish ( XML_POLISH_ARGS  ) [protected, virtual]

Reimplemented from QGpCoreTools::XMLClass.

References QGpCoreTools::L2_LogNormalized, DinverDCCore::Target::setMisfitType(), TRACE, and validateTargets().

{
  TRACE;
  Q_UNUSED(context);
  // Ellipticity values are expressed on a log scale
  _ellipticityCurveTarget.setMisfitType(L2_LogNormalized);

  validateTargets();
}

Reimplemented from QGpCoreTools::XMLClass.

References QGpCoreWave::ModalCurve::addMode(), QGpCoreTools::Curve< pointType >::append(), DinverDCCore::ModalCurveTarget::curves(), QGpCompatibility::CompatModalRefinedCurves::mode(), QGpCompatibility::CompatModalRefinedCurves::nModes(), QGpCompatibility::CompatModalFrequency::nRayleighModes(), QGpCompatibility::CompatModalFrequency::omega(), QGpCoreTools::StatisticalValue< numberType >::setMean(), QGpCoreTools::StatisticalValue< numberType >::setStddev(), QGpCoreTools::StatisticalValue< numberType >::setWeight(), QGpCoreTools::StatisticalPoint< numberType >::setX(), and TRACE.

{
  TRACE;
  Q_UNUSED(context);
  // Function kept for compatibility only
  if(child->xml_tagName()=="ModalDispersion") {
    CompatModalDispersion * disp=static_cast<CompatModalDispersion *>(child);
    for(int i=0;i<disp->nModes();i++) {
      _dispersionTarget.curves().append(ModalCurve());
      ModalCurve * c=&_dispersionTarget.curves().last();
      if(i<disp->nRayleighModes()) {
        c->addMode(Mode( Mode::Phase, Mode::Rayleigh, i) );
      } else {
        c->addMode(Mode( Mode::Phase, Mode::Love, i-disp->nRayleighModes()) );
      }
      CompatVDataPointVector& m=disp->mode(i);
      for(int i=0;i<m.size();i++) {
        FactoryPoint p;
        p.setX(0.5/M_PI * disp->omega(i));
        p.setMean(m.at(i).mean());
        p.setStddev(m.at(i).stddev());
        p.setWeight(m.at(i).weight());
        c->append(p);
      }
    }
  }
}

Re-implement this function to offer XML restore properties support to your class.

From memberID set the corresponding property with value content. The map of attributes is given as a supplementary information (not useful in all cases).

For a general case:

  Q_UNUSED(attributes);
  double val=content.toDouble();
  switch (memberID) {
  case 0:
    _x1=val;
    return true;
  case 1:
    _y1=val;
    return true;
  case 2:
    _x2=val;
    return true;
  case 3:
    _y2=val;
    return true;
  default:
    return false;
  }

For classes inheriting other classes (see also xml_member())

  switch (memberID) {
  case 0:
    _anInteger=content.toString();
    return true;
  case 1:
    _aString=content.toInt();
    return true;
  case 2:
    _aDouble=content.toDouble();
    return true;
  default:
    return AbstractLine::xml_setProperty(memberID-3, map, content);

For the arguments of this function use Macro XML_SETPROPERTY_ARGS.

Reimplemented from QGpCoreTools::XMLClass.

References QGpCoreTools::Point::fromString(), DinverDCCore::Target::setMinimumMisfit(), DinverDCCore::Target::setMisfitType(), DinverDCCore::Target::setMisfitWeight(), and TRACE.

{
  TRACE;
  Q_UNUSED(tag)
  Q_UNUSED(attributes)
  Q_UNUSED(context);
  switch (memberID) {
  case 19: _position.fromString(content.toString()); return true;
  case 0: return true; // kept for compatibility only
  case 1: _dispersionTarget.setMisfitWeight(content.toDouble()); return true; // kept for compatibility only
  case 2: _autocorrTarget.setMisfitWeight(content.toDouble()); return true; // kept for compatibility only
  case 3: _ellipticityCurveTarget.setMisfitWeight(content.toDouble()); return true; // kept for compatibility only
  case 4: _ellipticityPeakTarget.setMisfitWeight(content.toDouble()); return true; // kept for compatibility only
  case 5: _refractionVpTarget.setMisfitWeight(content.toDouble()); return true; // kept for compatibility only
  case 6: _refractionVsTarget.setMisfitWeight(content.toDouble()); return true; // kept for compatibility only
  case 7: _dispersionTarget.setMinimumMisfit(content.toDouble()); return true; // kept for compatibility only
  case 8: _autocorrTarget.setMinimumMisfit(content.toDouble()); return true; // kept for compatibility only
  case 9: _ellipticityCurveTarget.setMinimumMisfit(content.toDouble()); return true; // kept for compatibility only
  case 10: _ellipticityPeakTarget.setMinimumMisfit(content.toDouble()); return true; // kept for compatibility only
  case 11: _refractionVpTarget.setMinimumMisfit(content.toDouble()); return true; // kept for compatibility only
  case 12: _refractionVsTarget.setMinimumMisfit(content.toDouble()); return true; // kept for compatibility only
  case 13: _dispersionTarget.setMisfitType(RealStatisticalValue::misfitType(content.toString())); return true; // kept for compatibility only
  case 14: _autocorrTarget.setMisfitType(RealStatisticalValue::misfitType(content.toString())); return true; // kept for compatibility only
  case 15: _ellipticityCurveTarget.setMisfitType(RealStatisticalValue::misfitType(content.toString())); return true; // kept for compatibility only
  case 16: _ellipticityPeakTarget.setMisfitType(RealStatisticalValue::misfitType(content.toString())); return true; // kept for compatibility only
  case 17: _refractionVpTarget.setMisfitType(RealStatisticalValue::misfitType(content.toString())); return true; // kept for compatibility only
  case 18: _refractionVsTarget.setMisfitType(RealStatisticalValue::misfitType(content.toString())); return true; // kept for compatibility only
  default: return false;
  }
}
virtual const QString& DinverDCCore::TargetList::xml_tagName ( ) const [inline, virtual]

Reimplemented from QGpCoreTools::XMLClass.

References QGpCoreTools::XMLSaveAttributes::add(), TRACE, and QGpCoreTools::XMLClass::xml_save().

{
  TRACE;
  static const QString key("type");
  XMLSaveAttributes att;
  QString& value=att.add(key);
  value="dispersion";
  _dispersionTarget.xml_save(s, context, att);
  _autocorrTarget.xml_save(s, context);
  value="ellipticity";
  _ellipticityCurveTarget.xml_save(s, context, att);
  value="ellipticity peak";
  _ellipticityPeakTarget.xml_save(s, context, att);
  value="Vp";
  _refractionVpTarget.xml_save(s, context, att);
  value="Vs";
  _refractionVsTarget.xml_save(s, context, att);
  _magnetoTelluricTarget.xml_save(s, context);
}

References QGpCoreTools::Point::toString(), TRACE, and QGpCoreTools::XMLClass::writeProperty().

{
  TRACE;
  Q_UNUSED(context);
  writeProperty(s, "position", _position.toString(20));
}

Friends And Related Function Documentation

friend class DCReportBlock [friend]

Member Data Documentation

const QString DinverDCCore::TargetList::xmlTargetListTag = "TargetList" [static]

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