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

Brief description of class still missing. More...

#include <ModalCurve.h>

Inheritance diagram for QGpCoreWave::ModalCurve:
QGpCoreTools::Curve< FactoryPoint > QGpCoreTools::XMLClass QVector

List of all members.

Public Member Functions

void addLog (QString s)
void addMode (const Mode &m)
void clear ()
double determinantMisfit (const Seismic1DModel *m) const
bool hasMode (const Mode &m) const
int indexOf (int factoryIndex) const
void linkX (const QVector< double > &x)
QString log () const
double misfit (int &nValues, int &nData, const ModalFactory &f, MisfitType type, double minMisfit) const
 ModalCurve ()
 ModalCurve (const ModalCurve &o)
 ModalCurve (int n)
 ModalCurve (const Curve< RealStatisticalPoint > &o)
const QList< Mode > & modes () const
QList< Mode > & modes ()
QString name () const
void operator= (const Curve< RealStatisticalPoint > &o)
bool operator== (const ModalCurve &o) const
void removeMode (int index)
void setName (QString n)
void sort ()
virtual const QString & xml_tagName () const
virtual ~ModalCurve ()

Static Public Attributes

static const QString xmlModalCurveTag = "ModalCurve"

Protected Member Functions

XMLMember xml_member (XML_MEMBER_ARGS)
bool xml_setProperty (XML_SETPROPERTY_ARGS)
void xml_writeChildren (XML_WRITECHILDREN_ARGS) const
void xml_writeProperties (XML_WRITEPROPERTIES_ARGS) const

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

Construct an empty curve

{}

Copy constructor

References TRACE.

                                                 : Curve<FactoryPoint>(o), XMLClass()
{
  TRACE;
  _name=o._name;
  _modes=o._modes;
  _log=o._log;
}

Construct a curve with n points.

References TRACE.

                                                                  : Curve<FactoryPoint>(), XMLClass()
{
  TRACE;
  *this=o;
}

References TRACE.

{
  TRACE;
}

Member Function Documentation

void QGpCoreWave::ModalCurve::addLog ( QString  s) [inline]

Calculates the misfit based on determinant value.

References QGpCoreTools::Curve< FactoryPoint >::at(), QGpCoreTools::Curve< FactoryPoint >::count(), QGpCoreTools::StatisticalValue< numberType >::isValid(), QGpCoreWave::Love::setOmega(), QGpCoreWave::RayleighTemplate< RealType >::setOmega(), TRACE, QGpCoreTools::StatisticalPoint< numberType >::x(), QGpCoreWave::Love::y(), QGpCoreWave::RayleighTemplate< RealType >::y(), and QGpCoreTools::RealStatisticalPoint::y().

{
  TRACE;
  double res=0.0;
  int nx=count();
  if(_modes.at(0).polarisation()==Mode::Rayleigh) {
    Rayleigh rayleigh(m);
    for(int i=0; i<nx; i++ ) {
      const FactoryPoint& p=at(i);
      if(!p.isValid()) continue;
      double f=p.x();
      rayleigh.setOmega(2.0*M_PI*f);
      double factor=1.0/(f*f);
      res+=fabs(rayleigh.y(p.y())*factor);
    }
  } else {
    Love love(m);
    for(int i=0; i<nx; i++ ) {
      const FactoryPoint& p=at(i);
      if(!p.isValid()) continue;
      double f=p.x();
      love.setOmega(2.0*M_PI*f);
      double factor=1.0/(f*f);
      res+=fabs(love.y(p.y())*factor);
    }
  }
  return res;
}
bool QGpCoreWave::ModalCurve::hasMode ( const Mode m) const

References TRACE.

{
  TRACE;
  int n=_modes.count();
  for(int i=0; i<n; i++ ) {
    if(_modes.at(i)==m) {
      return true;
    }
  }
  return false;
}
int QGpCoreWave::ModalCurve::indexOf ( int  factoryIndex) const

References QGpCoreTools::Curve< FactoryPoint >::at(), QGpCoreTools::Curve< FactoryPoint >::count(), QGpCoreWave::FactoryPoint::index(), and TRACE.

Referenced by SpacSelector::inverseAt(), and SpacSelector::selectSamples().

{
  TRACE;
  int n=count();
  for(int i=0; i< n; i++) {
    const FactoryPoint& p=at(i);
    if(p.index()==factoryIndex) return i;
  }
  return -1;
}
void QGpCoreWave::ModalCurve::linkX ( const QVector< double > &  x)

Set the index in vector x of each sample of the curve. Each sample of the curve must have its corresponding value in vector x.

References QGpCoreTools::Curve< FactoryPoint >::at(), QGpCoreTools::Curve< FactoryPoint >::count(), and TRACE.

Referenced by QGpCoreWave::ModalFactory::linkX().

{
  TRACE;
  int n=count();
  int nx=x.count();
  int ix=0;
  for(int i=0; i< n; i++) {
    while(ix<nx && x.at(ix) < at(i).x()) ix++;
    ASSERT(at(i).x()==x.at(ix));
    (*this)[i].setIndex(ix);
  }
}
QString QGpCoreWave::ModalCurve::log ( ) const [inline]

Referenced by QGpGuiWave::ModalProxy::log().

{return _log;}
double QGpCoreWave::ModalCurve::misfit ( int &  nValues,
int &  nData,
const ModalFactory f,
MisfitType  type,
double  minMisfit 
) const

Calculates the squared misfit

nValues is incremented by the number of valid values where the comparison was possible. nData is incremented by the number of valid data where the comparison is possible. In all cases, nData >= nValues and for the best matching case, nValues==nData.

minMisfit is the square of the minimum misfit value that can be reached for each sample individualy.

References QGpCoreTools::Curve< FactoryPoint >::at(), QGpCoreTools::Curve< FactoryPoint >::count(), QGpCoreWave::FactoryPoint::index(), QGpCoreTools::StatisticalValue< numberType >::isValid(), QGpCoreTools::StatisticalValue< numberType >::misfit(), QGpCoreWave::ModalFactory::mode(), and TRACE.

{
  TRACE;
  double res=0.0;
  int nx=count();
  int nm=_modes.count();
  if(nm==1) {
    const RealValue * values=f.mode(_modes.first());
    for(int i=0;i<nx;i++) {
      const FactoryPoint& p=at(i);
      double pointMisfit=p.misfit(nValues, nData, values[ p.index() ], type, minMisfit);
      if(pointMisfit>0.0) {
        res+=pointMisfit;
      }
    }
  } else if(nm > 1) {
    for(int i=0; i<nx; i++ ) {
      const FactoryPoint& p=at(i);
      if( !p.isValid()) continue;
      nData++;
      double modalMisfit,minModalMisfit=1e99;
      int localNData=0, localNValues=0;
      for(int im=0;im<nm;im++) {
        const RealValue * values=f.mode(_modes.at(im));
        localNValues=0;
        modalMisfit=p.misfit(localNValues, localNData, values[ p.index() ], type, minMisfit);
        if(localNValues==1 && modalMisfit>0.0 && modalMisfit<minModalMisfit) {
          minModalMisfit=modalMisfit;
        }
      }
      if(minModalMisfit!=1e99) {
        res+=minModalMisfit;
        nValues++;
      }
    }
  }
  return res;
}
const QList<Mode>& QGpCoreWave::ModalCurve::modes ( ) const [inline]
QList<Mode>& QGpCoreWave::ModalCurve::modes ( ) [inline]
{return _modes;}
QString QGpCoreWave::ModalCurve::name ( ) const [inline]
void QGpCoreWave::ModalCurve::operator= ( const Curve< RealStatisticalPoint > &  o)

References QGpCoreTools::Curve< pointType >::count(), QGpCoreTools::Curve< FactoryPoint >::resize(), and TRACE.

{
  TRACE;
  int n=o.count();
  resize(n);
  for(int i=0; i<n; i++ ) {
    (*this)[i]=o[i];
  }
  _modes.clear();
  _log="";
  _name="";
}
bool QGpCoreWave::ModalCurve::operator== ( const ModalCurve o) const [inline]
{
  return _name==o._name &&
         _modes==o._modes &&
         _log==o._log &&
         Curve<FactoryPoint>::operator==(o);
}

References TRACE.

{
  TRACE;
  if(index < _modes.count()) _modes.removeAt(index);
}
void QGpCoreWave::ModalCurve::setName ( QString  n) [inline]
{_name=n;}
void QGpCoreWave::ModalCurve::sort ( ) [inline]

Sort all samples by increasing X. Necessary for entering into a ModalFactory

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 QGpCoreTools::Curve< FactoryPoint >::append(), QGpCoreTools::Curve< FactoryPoint >::last(), and TRACE.

{
  TRACE;
  Q_UNUSED(attributes)
  Q_UNUSED(context);
  if(tag=="RealStatisticalPoint" || tag=="StatPoint") { // StatPoint kept for compatibility
    append(FactoryPoint());
    return XMLMember(&last());
  } else if(tag=="Mode") {
    _modes.append(Mode());
    return XMLMember(&_modes.last());
  } else if(tag=="name") return XMLMember(0);
  else if(tag=="log") return XMLMember(1);
  else return XMLMember(XMLMember::Unknown);
}

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 TRACE.

{
  TRACE;
  Q_UNUSED(tag);
  Q_UNUSED(attributes)
  Q_UNUSED(context);
  switch (memberID) {
  case 0: _name=content.toString(); return true;
  case 1: _log=content.toString(); return true;
  default: return false;
  }
}
virtual const QString& QGpCoreWave::ModalCurve::xml_tagName ( ) const [inline, virtual]

Reimplemented from QGpCoreTools::XMLClass.

References QGpCoreTools::Curve< FactoryPoint >::begin(), QGpCoreTools::Curve< FactoryPoint >::end(), and TRACE.

{
  TRACE;
  for(QList<Mode>::ConstIterator it=_modes.begin(); it!=_modes.end(); it++ ) {
    it->xml_save(s, context);
  }
  const_iterator it;
  for(it=begin(); it!=end(); ++it) {
    it->xml_save(s, context);
  }
}

Reimplemented from QGpCoreTools::XMLClass.

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

{
  TRACE;
  Q_UNUSED(context);
  writeProperty(s,"name",_name);
  writeProperty(s,"log",_log);
}

Member Data Documentation

const QString QGpCoreWave::ModalCurve::xmlModalCurveTag = "ModalCurve" [static]

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