Public Slots | Public Member Functions | Public Attributes | Protected Member Functions
SpacSelector Class Reference

#include <SpacSelector.h>

Inheritance diagram for SpacSelector:
SciFigs::GraphicSheetMenu

List of all members.

Public Slots

void inverse ()
void inverseAt ()
void radiusScroll_valueChanged ()
void saveSelection ()
void selectSamples ()
void setK ()

Public Member Functions

bool createObjects (AutocorrCurves *autocorr)
void setMaximumSolutionCount (int c)
 SpacSelector (QWidget *parent=0)
 ~SpacSelector ()

Public Attributes

CurveBrowsercurves
Spac2DispOptionsoptions

Protected Member Functions

virtual void closeEvent (QCloseEvent *)

Constructor & Destructor Documentation

SpacSelector::SpacSelector ( QWidget *  parent = 0)

References SciFigs::GraphicSheetMenu::_childLayout, SciFigs::GraphicSheetMenu::_sheet, SciFigs::LineLayer::addLine(), curves, SciFigs::CurveBrowser::initLayer(), inverse(), inverseAt(), options, radiusScroll_valueChanged(), saveSelection(), selectSamples(), SciFigs::CurveBrowser::setCurrentLayer(), setK(), SciFigs::AbstractLine::setPen(), SciFigs::CurveBrowser::setProxy(), SciFigs::LineLayer::setReferenceLine(), SciFigs::AbstractLine::setSymbol(), and TRACE.

                                           :
    GraphicSheetMenu(parent, Qt::Window)
{
  TRACE;
  _lastCurRing=0;
  _selAutocorr=0;
  _autocorr=0;
  _maxSolutionCount=5;

  _childLayout->removeWidget(&_sheet);

  QSplitter * hSplitter=new QSplitter(this);
  hSplitter->setOrientation(Qt::Horizontal);
  QSplitter * vSplitter=new QSplitter(hSplitter);
  vSplitter->setOrientation(Qt::Vertical);

  curves=new CurveBrowser(vSplitter);
  curves->setProxy(new DispersionProxy);
  AxisWindow * graph=new AxisWindow(vSplitter);
  _gridLayer=new IrregularGrid2DPlot(graph);
  LineLayer * dispLayer=new LineLayer(graph);
  ModalLine * line=new ModalLine;
  line->setPen(Pen( QColor(145,145,145), 0.6, Qt::SolidLine) );
  line->setSymbol(Symbol(Symbol::Circle,1.2, Pen(QColor(222,222,222)), Brush(QColor(101,101,101), Qt::SolidPattern) ));
  dispLayer->setReferenceLine(line);
  curves->initLayer(dispLayer);
  curves->setCurrentLayer(dispLayer);
  _limitsSolutionsLayer=new LineLayer(graph);
  _limitsSolutionsLayer->setReferenceLine(new PlotLine2D);
  _limitsSolutionsLayer->setObjectName("SPAC Limits & Solutions");
  _limitsSolutionsLayer->addLine(Pen(Qt::NoPen),Symbol(Symbol::Circle,1.2, Pen(Qt::black), Brush(Qt::black, Qt::SolidPattern)));
  _limitsSolutionsLayer->addLine(Pen(Qt::black,0.6,Qt::SolidLine),Symbol());
  _limitsSolutionsLayer->addLine(Pen(Qt::black,0.6,Qt::DotLine),Symbol());

  hSplitter->addWidget(&_sheet);
  hSplitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  _childLayout->addWidget(hSplitter);

  options=new Spac2DispOptions(this);
  _childLayout->addWidget(options);
  Settings::getWidget(this, "SpacSelector");
  connect(options->kmin,SIGNAL(valueChanged(double)), this,SLOT(setK()));
  connect(options->kmax,SIGNAL(valueChanged(double)), this,SLOT(setK()));
  connect(options->vmin,SIGNAL(valueChanged(double)), this,SLOT(inverse()));
  connect(options->vmax,SIGNAL(valueChanged(double)), this,SLOT(inverse()));
  connect(options->nCells,SIGNAL(valueChanged(int)),
          this,SLOT(inverse()));
  connect(options->radiusScroll,SIGNAL(valueChanged(int)),
          this,SLOT(radiusScroll_valueChanged()));
  connect(options->frequencyScroll,SIGNAL(valueChanged(int)),
          this,SLOT(inverseAt()));
  connect(options->selectBut,SIGNAL(clicked()),
          this,SLOT(selectSamples()));
  connect(options->saveBut,SIGNAL(clicked()),
          this,SLOT(saveSelection()));
}

References TRACE.

{
  TRACE;
  delete _selAutocorr;
}

Member Function Documentation

void SpacSelector::closeEvent ( QCloseEvent *  e) [protected, virtual]

References TRACE.

{
  TRACE;
  Settings::setWidget(this, "SpacSelector");
  e->accept();
}

References SciFigs::GraphicSheetMenu::addGraph(), SciFigs::GraphicSheetMenu::addText(), QGpCoreTools::Curve< pointType >::append(), QGpGuiWave::ModalLine::curve(), QGpCoreWave::AutocorrCurves::curves(), SciFigs::GraphContentLayer::graph(), inverse(), QGpCoreWave::AutocorrRing::maxRadius(), QGpCoreWave::AutocorrRing::minRadius(), MSG_ID, options, radiusScroll_valueChanged(), QGpCoreWave::AutocorrCurves::ring(), QGpCoreWave::AutocorrCurves::ringCurves(), QGpCoreWave::AutocorrCurves::rings(), SciFigs::GraphicSheetMenu::setFrequencyTitles(), SciFigs::GraphicSheetMenu::setGraphGeometry(), setK(), SciFigs::GraphicObject::setObjectName(), SciFigs::AbstractLine::setPen(), SciFigs::Axis::setRange(), SciFigs::AbstractLine::setSymbol(), SciFigs::TextEdit::setText(), QGpCoreTools::Curve< pointType >::setValid(), QGpCoreWave::ModalFactory::setX(), QGpCoreTools::Point2D::setX(), QGpCoreTools::tr(), TRACE, w, QGpCoreTools::Rect::x1(), QGpCoreTools::Rect::x2(), SciFigs::AxisWindow::xAxis(), and SciFigs::AxisWindow::yAxis().

Referenced by main().

{
  TRACE;
  _autocorr=autocorr;
  // Check that all ring has only one curve and is not empty
  int ringCount=_autocorr->rings()->count();
  for(int iRing=0; iRing<ringCount; iRing++) {
    if(_autocorr->ringCurves(iRing).count()!=1) {
      const AutocorrRing& ring=_autocorr->ring(iRing);
      Message::critical(MSG_ID, tr("Loading Dinver target/project ..."),
                        tr("Ring %1 (from %2 to %3 m) contains %4 curves. Check your "
                           "target files with dinver so that each ring has only one curve.\n\n"
                           "Tip:\nStart from an empty environment, load all your target files, edit the curves "
                           "and choose 'Export targets' from 'File' menu.")
                              .arg(iRing).arg(ring.minRadius())
                              .arg(ring.maxRadius())
                              .arg(_autocorr->ringCurves(iRing).count()), Message::cancel());
      return false;
    }
  }

  AutocorrFactory autocorrFactory(_autocorr->rings());
  autocorrFactory.setX(_autocorr->curves());
  int omegaCount=autocorrFactory.x()->count();
  if(omegaCount<2) {
    Message::critical(MSG_ID, tr( "Loading Dinver target/project ..." ),
                     tr("No frequency samples found in target."));
    return false;
  }

  options->radiusScroll->setMaximum(ringCount-1);
  options->frequencyScroll->setMaximum(omegaCount-1);
  Curve<Point2D>& resol=limitsSolutionsCurve(1);
  Curve<Point2D>& aliasing=limitsSolutionsCurve(2);
  Point2D fcurve;
  for(int i=0;i<omegaCount;i++) {
    fcurve.setX(autocorrFactory.x()->at(i));
    resol.append(fcurve);
    aliasing.append(fcurve);
  }
  double orX=0.5;
  double orY=0.5;
  AxisWindow * w;
  Rect r;
  static const QString caption(tr("Ring %1 from %2 m to %3 m"));
  _spacLayers.resize(ringCount);
  for(int ig=0;ig<ringCount;ig++) {
    w=addGraph();
    _spacLayers[ig]=new LineLayer(w);
    ModalLine * line=new ModalLine;
    line->setPen(Pen(Qt::NoPen));
    line->setSymbol(Symbol( Symbol::Circle,1.2, Pen(Qt::gray),
                                Brush(Qt::gray,Qt::SolidPattern)) );
    _spacLayers[ig]->setReferenceLine(line);
    line=static_cast<ModalLine *>(_spacLayers[ig]->addLine());
    line->curve()=_autocorr->ringCurves(ig).first();
    _spacLayers[ig]->setReferenceSymbol(Symbol( Symbol::Circle, 1.2,
                                         Pen(Qt::black),
                                         Brush(Qt::black,Qt::SolidPattern) ));
    line=static_cast<ModalLine *>(_spacLayers[ig]->addLine());
    line->curve()=_autocorr->ringCurves(ig).first();
    line->curve().setValid(false);
    _spacLayers[ig]->setReferenceSymbol(Symbol( Symbol::Circle, 2.75,
                                         Pen(Qt::black,0.6)) );
    _spacLayers[ig]->addLine();

    w->setObjectName(QString("AutocorrGraph_%1").arg(ig));
    setFrequencyTitles(w,tr("Autocorr ratio"), "",Number::Fixed);
    setGraphGeometry(w,orX, 9, orY+0.5, 6);
    r=_spacLayers[ig]->boundingRect();
    w->xAxis()->setRange(r.x1()*0.95, r.x2()*1.05);
    w->yAxis()->setRange(-1.05, 1.05);

    TextEdit * c=addText(orX, orY, 9, 1);
    const AutocorrRing& r=_autocorr->ring(ig);
    c->setText(caption.arg(ig+1).arg(r.minRadius()).arg(r.maxRadius()));

    if(orX==0.5) orX=9.5; else {orX=0.5;orY+=6.5;}
  }
  _gridLayer->graph()->xAxis()->setRange(autocorrFactory.x()->first()*0.95, autocorrFactory.x()->last()*1.05);
  // TODO: fix bug if vmin is left to 0, infinite loop after
  radiusScroll_valueChanged();
  inverse();
  setK();
  return true;
}
void SpacSelector::inverse ( ) [slot]

References QGpCoreTools::Curve< pointType >::at(), QGpCoreWave::AutocorrCurves::curves(), SciFigs::AxisWindow::deepUpdate(), QGpGuiTools::ColorPalette::defaultColors(), QGpCoreWave::AutocorrDispersion::dispersion(), QGpCoreTools::Curve< pointType >::first(), SciFigs::GraphContentLayer::graph(), QGpCoreTools::IrregularGrid2D::indexOfY(), QGpCoreTools::IrregularGrid2D::init(), QGpCoreTools::StatisticalValue< numberType >::isValid(), QGpCoreTools::IrregularGrid2D::maximumValue(), QGpCoreTools::IrregularGrid2D::ny(), options, SciFigs::GridPlot::palette(), QGpCoreWave::AutocorrCurves::ring(), QGpCoreWave::AutocorrCurves::ringCurves(), QGpCoreWave::AutocorrCurves::rings(), QGpGuiTools::ColorPalette::setColor(), SciFigs::IrregularGrid2DPlot::setGrid(), QGpCoreTools::IrregularGrid2D::setLinear(), SciFigs::GridPlot::setPalette(), SciFigs::Axis::setRange(), QGpCoreWave::AutocorrDispersion::setRing(), QGpGuiTools::ColorPalette::setVLinear(), QGpCoreWave::ModalFactory::setX(), QGpCoreTools::IrregularGrid2D::setX(), TRACE, QGpCoreTools::IrregularGrid2D::value(), QGpCoreTools::IrregularGrid2D::valuePointer(), QGpCoreTools::StatisticalPoint< numberType >::x(), QGpCoreTools::RealStatisticalPoint::y(), QGpCoreTools::YAxis, and SciFigs::AxisWindow::yAxis().

Referenced by createObjects(), and SpacSelector().

{
  TRACE;
  AutocorrFactory autocorrFactory(_autocorr->rings());
  autocorrFactory.setX(_autocorr->curves());
  autocorrFactory.linkX(_autocorr->curves());
  int ringCount=_autocorr->rings()->count();
  int omegaCount=autocorrFactory.x()->count();

  double smin=1.0/options->vmax->text().toDouble();
  double smax=1.0/options->vmin->text().toDouble();
  if(smin>=smax || smin<=0.0 || smax<=0.0) {
    return;
  }
  int nCells=options->nCells->value();
  // Get grids ready
  IrregularGrid2D grid(omegaCount,nCells);
  for(int i=0;i<omegaCount;i++)
    grid.setX(i, autocorrFactory.x()->at(i));
  grid.setLinear(YAxis,smin,smax);
  grid.init(0.0);
  IrregularGrid2D ringGrid;
  AutocorrDispersion eng;
  // Uncoupled inversion of all points
  for(int ir=0;ir<ringCount;ir++) {
    eng.setRing(_autocorr->ring(ir));
    ringGrid.init(omegaCount,nCells,0.0);
    QList<ModalCurve> ringCurves=_autocorr->ringCurves(ir);
    ModalCurve& curve=ringCurves.first();
    for(int iw=0;iw<omegaCount;iw++) {
      double x=autocorrFactory.x()->at(iw);
      FactoryPoint p=curve.at(x);
      if(p.isValid() && fabs(p.y())>0.025) {
        double omega=2*M_PI*autocorrFactory.x()->at(iw);
        QVector<double> solutions=eng.dispersion(p, omega*smin, omega*smax);
        for(int i=0; i<solutions.count() && i<_maxSolutionCount; i++) {
          double s=solutions.at(i);
          int is=grid.indexOfY(s);
          //printf("sol @ ring %i, %lf Hz %lf --> cell %i\n", ir, autocorrFactory.x()->at(iw), 1/solutions.at(i), is);
          if(s>smin && s<smax && is>-1 && is<grid.ny()) {
            if(ringGrid.value(iw,is)==0) *ringGrid.valuePointer(iw,is)=1;
          }
        }
      }
    }
    grid += ringGrid;
  }
  // Ajust palette
  int maxCount=(int)grid.maximumValue();
  ColorPalette pal=_gridLayer->palette();
  pal.defaultColors(maxCount+2);
  pal.setColor(0, Qt::white);
  pal.setVLinear(0.5,maxCount+0.5);
  _gridLayer->setPalette(pal);
  // Set grid values
  _gridLayer->setGrid (grid);
  _gridLayer->graph()->yAxis()->setRange(smin*0.95,smax*1.05);
  _gridLayer->graph()->deepUpdate();
}
void SpacSelector::inverseAt ( ) [slot]

References QGpCoreTools::Curve< pointType >::append(), QGpCoreTools::Curve< pointType >::at(), SciFigs::AbstractLine::clear(), QGpCoreTools::Curve< pointType >::clear(), QGpCoreWave::AutocorrCurves::curves(), SciFigs::GraphContent::deepUpdate(), QGpCoreWave::AutocorrDispersion::dispersion(), QGpCoreTools::Curve< pointType >::first(), SciFigs::GraphContentLayer::graph(), SciFigs::AxisWindow::graphContent(), QGpCoreWave::ModalCurve::indexOf(), SciFigs::LineLayer::line(), options, QGpCoreWave::AutocorrCurves::ring(), QGpCoreWave::AutocorrCurves::ringCurves(), QGpCoreWave::AutocorrCurves::rings(), QGpCoreWave::AutocorrDispersion::setRing(), QGpCoreTools::StatisticalValue< numberType >::setStddev(), QGpCoreWave::ModalFactory::setX(), TRACE, w, and QGpCoreTools::StatisticalPoint< numberType >::x().

Referenced by radiusScroll_valueChanged(), and SpacSelector().

{
  TRACE;
  AutocorrFactory autocorrFactory(_autocorr->rings());
  autocorrFactory.setX(_autocorr->curves());
  autocorrFactory.linkX(_autocorr->curves());
  int ringCount=_autocorr->rings()->count();
  int omegaCount=autocorrFactory.x()->count();

  double smin=1.0/options->vmax->value();
  double smax=1.0/options->vmin->value();
  if(smin>smax) return;
  int iRing=options->radiusScroll->value();
  if(iRing>ringCount-1) return;
  int iFreq=options->frequencyScroll->value();
  if(iFreq>omegaCount-1) return;
  LineLayer * plot=_spacLayers[iRing];
  AxisWindow * w=plot->graph();
  LayerLocker ll(plot);
  QList<ModalCurve> ringCurves=_autocorr->ringCurves(iRing);
  ModalCurve& curve=ringCurves.first();
  int index=curve.indexOf(iFreq); // iFreq is considered as a factory index, hence it returns -1
                                    // if iFreq does not exist for that curve
  AutocorrDispersion eng;
  if(index>-1) {
    FactoryPoint p=curve.at(index);
    p.setStddev(0.0);
    plot->line(2)->clear();
    static_cast<ModalLine *>(plot->line(2))->curve().append(p);
    // Inversion itself
    eng.setRing(_autocorr->ring(iRing));
    double omega=2*M_PI*autocorrFactory.x()->at(iFreq);
    QVector<double> solutions=eng.dispersion(p, omega*smin, omega*smax);
    // Plot solutions
    LayerLocker ll(_limitsSolutionsLayer);
    Curve<Point2D>& invRes=limitsSolutionsCurve(0);
    invRes.clear();
    for(int i=0; i<solutions.count() && i<_maxSolutionCount; i++) {
      //printf("sol @ ring %i, %lf Hz %lf\n", iRing, autocorrFactory.x()->at(iFreq), 1/solutions.at(i));
      invRes.append(Point2D( p.x(), solutions.at(i)) );
    }
    _gridLayer->graph()->graphContent()->deepUpdate();
    w->graphContent()->deepUpdate();
  }
}

References inverseAt(), QGpCoreWave::AutocorrRing::maxRadius(), QGpCoreWave::AutocorrRing::minRadius(), options, QGpCoreWave::AutocorrCurves::ring(), QGpCoreWave::AutocorrCurves::rings(), and TRACE.

Referenced by createObjects(), and SpacSelector().

{
  TRACE;
  int iRadius=options->radiusScroll->value();
  if(iRadius>(int)_autocorr->rings()->count()-1) return;
  // Remove marker from last ring plot
  _spacLayers[_lastCurRing]->line(2)->clear();
  _spacLayers[_lastCurRing]->graphContent()->deepUpdate();
  options->radiusMin->setText(QString::number(_autocorr->ring(iRadius).minRadius()));
  options->radiusMax->setText(QString::number(_autocorr->ring(iRadius).maxRadius()));
  _lastCurRing=iRadius;
  inverseAt();
}
void SpacSelector::saveSelection ( ) [slot]

References DinverDCCore::TargetList::autocorrTarget(), fileName, MSG_ID, selectSamples(), DinverDCCore::AutocorrTarget::setCurves(), QGpCoreTools::tr(), TRACE, and QGpCoreTools::XMLHeader::xml_saveFile().

Referenced by SpacSelector().

{
  TRACE;
  if(!_selAutocorr) selectSamples();
  if(!_selAutocorr) {
    Message::warning(MSG_ID,tr("Searching dispersion limits"),
                         tr("You must pick 2 curves to define the dispersion\n"
                         "limits and to select samples."), Message::cancel());
    return;
  }
  QString fileName=Message::getSaveFileName(tr("Save SPAC selection"),
                                                  tr("Dinver targets (*.target)"));
  if(fileName.length()==0) return;
  TargetList tl;
  tl.autocorrTarget().setCurves( *_selAutocorr);
  XMLVirtualPlugin plugin(&tl, "DispersionCurve");
  XMLDinverHeader hdr(&plugin);
  hdr.xml_saveFile(fileName);
}
void SpacSelector::selectSamples ( ) [slot]

References QGpCoreWave::AutocorrCurves::addCurve(), QGpCoreWave::ModalCurve::addLog(), QGpCoreWave::AutocorrCurves::addRing(), QGpCoreTools::Curve< pointType >::append(), QGpCoreTools::Curve< pointType >::at(), SciFigs::CurveBrowser::count(), SciFigs::CurveBrowser::currentLayer(), curves, QGpCoreWave::AutocorrCurves::curves(), SciFigs::GraphContent::deepUpdate(), QGpCoreWave::AutocorrDispersion::dispersion(), QGpCoreTools::Curve< pointType >::first(), QGpCoreTools::Function, SciFigs::GraphContentLayer::graph(), SciFigs::AxisWindow::graphContent(), QGpCoreWave::ModalCurve::indexOf(), QGpCoreTools::Interpole, SciFigs::AbstractLine::isVisible(), QGpCoreTools::Curve< pointType >::last(), SciFigs::LineLayer::line(), QGpCoreTools::log(), MSG_ID, options, QGpCoreTools::Curve< pointType >::resample(), QGpCoreWave::AutocorrCurves::ring(), QGpCoreWave::AutocorrCurves::ringCurves(), QGpCoreWave::AutocorrCurves::rings(), QGpCoreTools::Curve< pointType >::setFunction(), QGpCoreWave::AutocorrDispersion::setRing(), QGpCoreTools::Curve< pointType >::setValid(), QGpCoreWave::ModalFactory::setX(), str, QGpCoreTools::tr(), TRACE, w, QGpCoreTools::StatisticalPoint< numberType >::x(), and QGpCoreTools::RealStatisticalPoint::y().

Referenced by saveSelection(), and SpacSelector().

{
  TRACE;
  AutocorrFactory autocorrFactory(_autocorr->rings());
  autocorrFactory.setX(_autocorr->curves());
  autocorrFactory.linkX(_autocorr->curves());
  int ringCount=_autocorr->rings()->count();
  int omegaCount=autocorrFactory.x()->count();

  double kmin=options->kmin->value();
  double kmax=options->kmax->value();
  if(kmin>kmax) {
    Message::warning(MSG_ID, tr("Selecting samples"),
                      tr("kmin is greater than kmax."),
                      Message::cancel());
    return;
  }
  if(kmin<1e-5) {
    Message::warning(MSG_ID, tr("Selecting samples"),
                      tr("kmin is less than 1e-5."),
                      Message::cancel());
    return;
  }
  double smin=1.0/options->vmax->value();
  double smax=1.0/options->vmin->value();
  if(smin>smax) {
    Message::warning(MSG_ID, tr("Selecting samples"),
                      tr("Min velocity is greater than max velocity."),
                      Message::cancel());
    return;
  }
  int nCells=options->nCells->value();
  int nCurves=curves->count();
  // Check that only two curve are visible
  const QVector<double>& freq=*autocorrFactory.x();
  ModalCurve limits[2];
  int nLimits=0;
  for(int i=0;i<nCurves;i++) {
    if(curves->currentLayer()->line(i)->isVisible()) {
      if(nLimits<2) {
        ModalCurve& f=static_cast<ModalLine *>(curves->currentLayer()->line(i))->curve();
        // Extrapole to cover the whole frequency range
        if(f.at(0).x()>freq[0]) {
          f.append(FactoryPoint( freq[0], f.at(0).y()) );
          f.setFunction();
        }
        if(f.last().x()<freq.last()) {
          f.append(FactoryPoint( freq.last(), f.last().y()) );
          f.setFunction();
        }
        limits[nLimits]=f;
        nLimits++;
      } else {
        Message::warning(MSG_ID, tr("Selecting samples"),
                         tr("More than 2 curves are visible, only the first two are taken to define the slowness "
                            "range. Other are ignored."), Message::ok());
        break;
      }
    }
  }
  if(nLimits<2) {
        Message::warning(MSG_ID, tr("Selecting samples"),
                         tr("Less than 2 curves are visible, cannot define the slowness range. Pick at least two curves to define "
                            "the minimum and maximum range for dispersion curves."),
                         Message::cancel());
    return;
  }
  limits[0].resample(freq, Function | Interpole);
  limits[1].resample(freq, Function | Interpole);
  Curve<FactoryPoint>& minS=limits[0];
  Curve<FactoryPoint>& maxS=limits[1];
  // Make sure that minS is always less than maxS
  int iw;
  for(iw=0;iw<omegaCount;iw++) {
    if(minS[iw].y()>maxS[iw].y()) {
      double tmp=maxS[iw].y();
      maxS[iw].setY(minS[iw].y());
      minS[iw].setY(tmp);
    }
  }
  if(_selAutocorr) delete _selAutocorr;
  _selAutocorr=new AutocorrCurves;
  AutocorrDispersion eng;
  for(int ir=0; ir<ringCount; ir++ ) {
    const AutocorrRing& ring=_autocorr->ring(ir);
    eng.setRing(ring);
    _selAutocorr->addRing(ring);
    LineLayer * plot=_spacLayers[ir];
    AxisWindow * w=plot->graph();
    LayerLocker ll(plot);
    ModalCurve& selCurve=static_cast<ModalLine *>(plot->line(1))->curve();
    selCurve.setValid(false);
    QList<ModalCurve> curves=_autocorr->ringCurves(ir);
    ModalCurve& curve=curves.first();
    for(int iw=0;iw<omegaCount;iw++) {
      int index=curve.indexOf(iw);
      if(index>-1) {
        const FactoryPoint& p=curve.at(index);
        double omega=2*M_PI*autocorrFactory.x()->at(iw);
        QVector<double> solutions=eng.dispersion(p, omega*smin, omega*smax);
        for(int i=0; i<solutions.count() && i<_maxSolutionCount; i++) {
          double s=solutions.at(i);
          //printf("sol @ ring %i, %lf Hz %lf\n", ir, autocorrFactory.x()->at(iw), 1/s);
          if(s>minS[iw].y() && s<maxS[iw].y() &&
              s>smin && s<smax &&
              omega*s>kmin && omega*s<kmax) {
            selCurve[index].setValid(true);
            break;
          }
        }
      }
    }
    QString log=tr("---------------------------------------------\n"
                     "Samples selected using spac2disp\n\n"
                     "Wave number: [ %1 , %2 ] (rad/m)\n"
                     "Velocity: [ %3 , %4 ] (m/s)\n"
                     "Number of slowness cells: %5\n"
                     "Dispersion curve searched between:\n");
    log=log.arg(kmin).arg(kmax).arg(1.0/smax).arg(1.0/smin).arg(nCells);
    QString str("%1 Hz\t%2 m/s\t%3 m/s\n");
    for(int iw=0;iw<omegaCount;iw++)
      log+=str.arg(freq[iw]).arg(minS[iw].y()).arg(maxS[iw].y());
    selCurve.addLog(log);
    _selAutocorr->addCurve(selCurve);
    w->graphContent()->deepUpdate();
  }
  //curves->curvesChanged();
}
void SpacSelector::setK ( ) [slot]

References QGpCoreTools::Curve< pointType >::count(), SciFigs::GraphContent::deepUpdate(), SciFigs::GraphContentLayer::graph(), SciFigs::AxisWindow::graphContent(), options, and TRACE.

Referenced by createObjects(), and SpacSelector().

{
  TRACE;
  double kmin=options->kmin->value();
  double kmax=options->kmax->value();
  LayerLocker ll(_limitsSolutionsLayer);
  double invWLmin=kmin/(2*M_PI);
  double invWLmax=kmax/(2*M_PI);
  Curve<Point2D>& resol=limitsSolutionsCurve(1);
  Curve<Point2D>& aliasing=limitsSolutionsCurve(2);
  for(int i=0;i<resol.count();i++) {
    resol[i].setY(invWLmin/resol[i].x());
    aliasing[i].setY(invWLmax/aliasing[i].x());
  }
  _gridLayer->graph()->graphContent()->deepUpdate();
}
void SpacSelector::setMaximumSolutionCount ( int  c) [inline]

Referenced by main().

{_maxSolutionCount=c;}

Member Data Documentation

Referenced by selectSamples(), and SpacSelector().


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