All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Slots | Signals | Public Member Functions
ArrayGui::ArrayResponse Class Reference

#include <ArrayResponse.h>

Inheritance diagram for ArrayGui::ArrayResponse:
SciFigs::GraphicSheetMenu

List of all members.

Public Slots

void setAzimuth (double azimuth)
void setKmax (double kmax)
void setKmin (double kmin)

Signals

void kmaxChanged (double kmin)
void kminChanged (double kmin)

Public Member Functions

 ArrayResponse (QWidget *parent=0, Qt::WFlags fl=0)
void createObjects (bool showDispersion)
double kmax () const
double kmin () const
void setArray (const QVector< Point2D > &p)
void setFrequencySampling (SamplingParameters &fparam)
 ~ArrayResponse ()

Constructor & Destructor Documentation

ArrayGui::ArrayResponse::ArrayResponse ( QWidget *  parent = 0,
Qt::WFlags  fl = 0 
)

References SciFigs::GraphicSheetMenu::_childLayout, SciFigs::ColorPaletteWidget::defaultColors(), setAzimuth(), setKmax(), setKmin(), SciFigs::GraphicObject::setObjectName(), and TRACE.

                                                          :
    GraphicSheetMenu(parent, fl),
    waveNum(this),
    _palette(0)
{
  TRACE;
  setAttribute(Qt::WA_DeleteOnClose);
  _palette.defaultColors(20);
  _palette.setObjectName( "Palette" );
  Settings::getSize(this, "ArrayResponse");
  _childLayout->addWidget(&waveNum);
  connect(waveNum.kminSpin, SIGNAL(valueChanged(double)),
           this, SLOT(setKmin( double)));
  connect(waveNum.kmaxSpin, SIGNAL(valueChanged(double)),
           this, SLOT(setKmax( double)));
  connect(waveNum.azimuthSpin, SIGNAL(valueChanged(double)),
           this, SLOT(setAzimuth( double) ));

  _kmin=0.0;
  _kmaxSolver=0;
  _kmaxTouched=false;

  _gridLayer=0;
  _circleLayer=0;
  _directionLayer=0;
  _crossGrayLayer=0;
  _midHeightLayer=0;
  _crossBlackLayer=0;
  _dispLimitLayer=0;
}

References ArrayCore::KmaxSolver::terminate(), and TRACE.

{
  TRACE;
  if(_kmaxSolver) {
    _kmaxSolver->terminate();
    delete _kmaxSolver;
  }
}

Member Function Documentation

void ArrayGui::ArrayResponse::createObjects ( bool  showDispersion)

References SciFigs::GraphicSheetMenu::_sheet, QGpGuiWave::DispersionLimitLayer::addArrayLimits(), SciFigs::GraphicSheetMenu::addGraph(), SciFigs::LineLayer::addLine(), SciFigs::GraphicSheet::addObject(), SciFigs::GraphicSheetMenu::addText(), QGpCoreTools::Curve< pointType >::append(), kmaxChanged(), kminChanged(), SciFigs::ColorPaletteWidget::palette(), SciFigs::CircleViewer::resize(), SciFigs::LiveGridLayer::setAutoAdjustPalette(), SciFigs::GraphContentLayer::setEditable(), SciFigs::GraphicSheetMenu::setFrequencyTitles(), SciFigs::GraphicSheetMenu::setGraphGeometry(), SciFigs::XUniqueYColorLines::setLineWeight(), SciFigs::ColorPaletteWidget::setOrientation(), SciFigs::GridPlot::setPalette(), SciFigs::AbstractLine::setPen(), SciFigs::GraphicObject::setPrintHeight(), SciFigs::GraphicObject::setPrintWidth(), SciFigs::GraphicObject::setPrintXAnchor(), SciFigs::GraphicObject::setPrintYAnchor(), SciFigs::Axis::setRange(), SciFigs::LineLayer::setReferenceLine(), SciFigs::LiveGridLayer::setSampling(), SciFigs::Axis::setSizeInfo(), SciFigs::Axis::setSizeType(), SciFigs::AbstractLine::setSymbol(), SciFigs::ColorPaletteWidget::setTitle(), SciFigs::Axis::setTitle(), SciFigs::Axis::setTitleInversedScale(), SciFigs::ColorPaletteWidget::setVLinear(), QGpCoreTools::tr(), TRACE, SciFigs::AxisWindow::updateExternalGeometry(), SciFigs::AxisWindow::updateGeometry(), SciFigs::AxisWindow::xAxis(), and SciFigs::AxisWindow::yAxis().

{
  TRACE;
  AxisWindow * w;

  // Color palette
  _palette.setPrintXAnchor(9.5);
  _palette.setPrintYAnchor(0.5);
  _palette.setOrientation(Axis::West);
  _palette.setPrintWidth(1.7);
  _palette.setPrintHeight(8.0);
  _palette.setTitle(tr("Array transfer function"));
  _sheet.addObject(&_palette);

  // Wavenumber map
  w=addGraph();
  w->xAxis()->setTitle(tr("Wave number X (rad/m)"));
  w->xAxis()->setTitleInversedScale(tr("Wave length X/(2*pi) (m/rad)"));
  w->yAxis()->setTitle(tr("Wave number Y (rad/m)"));
  w->yAxis()->setTitleInversedScale(tr("Wave length Y/(2*pi) (m/rad)"));
  w->xAxis()->setSizeType(Axis::AxisSize);
  w->xAxis()->setSizeInfo(7);
  w->setPrintXAnchor(0.5);
  w->yAxis()->setSizeType(Axis::AxisSize);
  w->yAxis()->setSizeInfo(7);
  w->setPrintYAnchor(0.5);
  w->updateExternalGeometry();
  w->updateGeometry();
  _gridLayer=new LiveGridLayer(w);
  _gridLayer->setObjectName("theoretical FK map");
  _gridLayer->setSampling(3);
  _gridLayer->setPalette(_palette.palette());
  _gridLayer->setAutoAdjustPalette(false);
  connect(_gridLayer, SIGNAL(paletteChanged(ColorPalette)), &_palette, SLOT(setPalette(const ColorPalette&)));
  connect(&_palette, SIGNAL(changed(ColorPalette)), _gridLayer, SLOT(setPalette(const ColorPalette&)));
  _circleLayer=new CircleViewer(w);
  _circleLayer->setObjectName( "FK limits" );
  _circleLayer->resize(2);
  _directionLayer=new LineLayer(w);
  _directionLayer->setObjectName( "Azimuth" );
  _directionLayer->setEditable(false);
  PlotLine2D * line;
  line=new PlotLine2D;
  line->setPen(Pen( Qt::black, 0.6, Qt::SolidLine));
  line->setSymbol(Symbol());
  _directionLayer->setReferenceLine(line);
  static_cast<PlotLine2D *>(_directionLayer->addLine())->curve().resize(2);
  static_cast<PlotLine2D *>(_directionLayer->addLine())->curve().resize(2);
  _palette.setVLinear(0.0, 1.0);

  // Wavenumber map cross section
  w=addGraph();
  w->xAxis()->setTitle(tr("Wave number (rad/m)"));
  w->xAxis()->setTitleInversedScale(tr("Wave length/(2*pi) (m/rad)"));
  w->yAxis()->setTitle(tr("Array Transfer function"));
  w->yAxis()->setTitleInversedScale(tr("1/Array Transfer function"));
  setGraphGeometry(w, 0.5, 9.0, 9.0, 6.0);
  _crossGrayLayer=new XUniqueYColorLines(w);
  _crossGrayLayer->setObjectName( "Cross background" );
  _crossGrayLayer->setLineWeight(0.025);
  _crossBlackLayer=new LineLayer(w);
  _crossBlackLayer->setObjectName( "Cross current" );
  line=new PlotLine2D;
  line->setPen(Pen( Qt::black, 0.6, Qt::SolidLine) );
  line->setSymbol(Symbol());
  _crossBlackLayer->setReferenceLine(line);
  _crossBlackLayer->addLine();
  _crossBlackLayer->addLine();
  _midHeightLayer=new LineLayer(w);
  _midHeightLayer->setEditable(false);
  line=new PlotLine2D;
  line->setPen(Pen( Qt::black, 0.4, Qt::SolidLine) );
  line->setSymbol(Symbol());
  _midHeightLayer->setReferenceLine(line);
  Curve<Point2D>& limitLine=static_cast<PlotLine2D *>(_midHeightLayer->addLine())->curve();
  limitLine.append(Point2D(-1e99,0.5));
  limitLine.append(Point2D(1e99,0.5));
  w->yAxis()->setRange(0.0, 1.0);

  if(showDispersion) {
    // Frequency-Velocity plot
    w=addGraph();
    setFrequencyTitles(w, tr("Slowness (s/m)"), tr("Velocity (m/s)"), Number::Fixed);
    setGraphGeometry(w, 10.0, 9.0, 9.0, 6.0);
    _dispLimitLayer=new DispersionLimitLayer(w);
    _dispLimitLayer->setObjectName( "FK dispersion limits" );
    _dispLimitLayer->addArrayLimits();
    connect(this, SIGNAL(kminChanged(double)), _dispLimitLayer, SLOT(setArrayKmin(double)));
    connect(this, SIGNAL(kmaxChanged(double)), _dispLimitLayer, SLOT(setArrayKmax(double)));
    w->yAxis()->setRange(0.0, 0.01);
  } else {
    _dispLimitLayer=0;
  }

  // Comments
  _comments=addText(11.5, 0.5, 5.0, 5.0);
}

Referenced by setAzimuth().

{
  return waveNum.kmaxSpin->value();
}
void ArrayGui::ArrayResponse::kmaxChanged ( double  kmin) [signal]

Referenced by createObjects(), and setKmax().

{
  return waveNum.kminSpin->value();
}
void ArrayGui::ArrayResponse::kminChanged ( double  kmin) [signal]

Referenced by createObjects(), and setKmin().

References ArrayCore::KminSolver::calculate(), ArrayCore::KmaxSolver::calculate(), SciFigs::XUniqueYColorLines::clear(), SciFigs::AbstractLine::clear(), SciFigs::LineLayer::line(), SciFigs::GraphContentLayer::lockDelayPainting(), setAzimuth(), SciFigs::LiveGridLayer::setFunction(), setKmin(), SciFigs::TextEdit::setText(), ArrayCore::KmaxSolver::terminate(), QGpCoreTools::tr(), TRACE, SciFigs::GraphContentLayer::unlock(), and SciFigs::TextEdit::update().

{
  TRACE;
  if(_kmaxSolver) {
    _kmaxSolver->terminate();
    _kmaxSolver->deleteLater();
    _kmaxSolver=0;
  }

  _kmaxTouched=false;

  _gridLayer->lockDelayPainting(); // required before touching the stations
  _stations=p;
  _gridLayer->setFunction(new TheoreticalFK(_stations));
  shiftStations();
  _gridLayer->unlock();

  _crossBlackLayer->lockDelayPainting();
  _crossBlackLayer->line(0)->clear();
  _crossBlackLayer->line(1)->clear();
  _crossBlackLayer->unlock();
  _crossGrayLayer->lockDelayPainting();
  _crossGrayLayer->clear();
  _crossGrayLayer->unlock();

  KminSolver kminSolver(_stations);
  bool ok=true;
  _kmin=kminSolver.calculate(ok);
  if(ok && _kmin>0.0) {
    _kmaxSolver=new KmaxSolver(_stations, _kmin);
    connect(&_kmaxTimer, SIGNAL(timeout()), this, SLOT(setTemporaryKmax()));
    connect(_kmaxSolver, SIGNAL(finished()), this, SLOT(setComputedKmax()));
    _kmaxSolver->calculate();
    _kmaxTimer.start(1000);
  } else {
    _comments->setText(tr("Error computing kmin (linear array?)"));
    _comments->update();
  }
  setAzimuth(waveNum.azimuthSpin->value());
  waveNum.kminSpin->setValue(_kmin);
  setKmin(_kmin);
}
void ArrayGui::ArrayResponse::setAzimuth ( double  azimuth) [slot]

References QGpCoreWave::TheoreticalLinearFK::angle(), QGpCoreTools::Curve< pointType >::append(), QGpCoreTools::Curve< pointType >::clear(), QGpCoreTools::Angle::cos(), SciFigs::GraphContentLayer::deepUpdate(), kmax(), SciFigs::LineLayer::line(), SciFigs::LineLayer::resetLineProperties(), QGpCoreWave::TheoreticalLinearFK::setAzimuth(), QGpCoreTools::Angle::sin(), TRACE, and QGpCoreWave::TheoreticalLinearFK::value().

Referenced by ArrayResponse(), setArray(), setKmax(), and setKmin().

{
  TRACE;
  LayerLocker lla(_directionLayer);
  Curve<Point2D>& azLine1=static_cast<PlotLine2D *>(_directionLayer->line(0) )->curve();
  Curve<Point2D>& azLine2=static_cast<PlotLine2D *>(_directionLayer->line(1) )->curve();

  double kminHalf=0.5 * waveNum.kminSpin->value();
  double kmax=waveNum.kmaxSpin->value();

  KminSolver kSolver(_stations);
  kSolver.setAzimuth(azimuth);
  azLine1[ 0 ].setX(kminHalf * kSolver.angle().cos());
  azLine1[ 0 ].setY(kminHalf * kSolver.angle().sin());
  azLine1[ 1 ].setX(kmax * kSolver.angle().cos());
  azLine1[ 1 ].setY(kmax * kSolver.angle().sin());
  azLine2[ 0 ].setX( -kminHalf * kSolver.angle().cos());
  azLine2[ 0 ].setY( -kminHalf * kSolver.angle().sin());
  azLine2[ 1 ].setX( -kmax * kSolver.angle().cos());
  azLine2[ 1 ].setY( -kmax * kSolver.angle().sin());

  // A cross section across grid is slower than a complete recomputation==>as for scan, create a specific layer
  Curve<Point2D>& crossCurve1=static_cast<PlotLine2D *>(_crossBlackLayer->line(0) )->curve();
  Curve<Point2D>& crossCurve2=static_cast<PlotLine2D *>(_crossBlackLayer->line(1) )->curve();

  LayerLocker llc(_crossBlackLayer);
  crossCurve1.clear();
  crossCurve2.clear();

  double dk=0.005*(kmax-kminHalf);
  for(double k=-kmax; k < -kminHalf; k+=dk) {
    crossCurve1.append(Point(k, kSolver.value(k)));
  }
  crossCurve1.append(Point(-kminHalf, kSolver.value( -kminHalf) ));
  for(double k=kminHalf; k < kmax; k+=dk) {
    crossCurve2.append(Point(k, kSolver.value(k)));
  }
  crossCurve2.append(Point(kmax, kSolver.value(kmax) ));

  _crossBlackLayer->resetLineProperties();
  _crossBlackLayer->deepUpdate();
  _directionLayer->deepUpdate();
}
void ArrayGui::ArrayResponse::setKmax ( double  kmax) [slot]

References SciFigs::GraphContentLayer::deepUpdate(), kmaxChanged(), SciFigs::CircleViewer::set(), setAzimuth(), and TRACE.

Referenced by ArrayResponse().

{
  TRACE;
  _kmaxTouched=true;
  _circleLayer->set(1, 0, 0, kmax, kmax, 0.0, Qt::black);
  _circleLayer->deepUpdate();
  emit kmaxChanged(kmax);
  setAzimuth(waveNum.azimuthSpin->value());
}
void ArrayGui::ArrayResponse::setKmin ( double  kmin) [slot]

References SciFigs::GraphContentLayer::deepUpdate(), kminChanged(), SciFigs::CircleViewer::set(), setAzimuth(), and TRACE.

Referenced by ArrayResponse(), and setArray().

{
  TRACE;
  _circleLayer->set(0, 0, 0, 0.5*kmin, 0.5*kmin, 0.0, Qt::black);
  _circleLayer->deepUpdate();
  emit kminChanged(kmin);
  setAzimuth(waveNum.azimuthSpin->value());
}

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