All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Slots | Public Member Functions | Protected Slots | Protected Member Functions | Protected Attributes
DinverDCGui::DCModelViewer Class Reference

#include <DCModelViewer.h>

Inheritance diagram for DinverDCGui::DCModelViewer:
DinverDCGui::AutocorrViewer DinverDCGui::DispersionViewer DinverDCGui::EllipticityViewer DinverDCGui::GroundModelViewer DinverDCGui::MagnetoTelluricViewer DinverDCGui::RefractionViewer DinverDCGui::RefractionVpViewer DinverDCGui::RefractionVsViewer

List of all members.

Public Slots

void setLimits ()
void showSelectedModels (int id, const QVector< int > *indexes)

Public Member Functions

 DCModelViewer (QWidget *parent=0)
void initGraphs (int nGraphs)
void loadModels ()
int modelCount () const
void rejectModels (DCModelViewer *w, const QVector< int > *indexes)
void selectModels (QString reportFileName, double maxMisfit)
void selectModels (DCModelViewer *w, const QVector< int > *indexes)
virtual void setFrequencyAxis (bool)
virtual void setMode (const Mode &)
virtual void setModeIndex (int)
virtual void setTarget (TargetList *tl)
GraphicSheetsheet ()
 ~DCModelViewer ()

Protected Slots

virtual void showTarget (bool isVisible)

Protected Member Functions

void addActions ()
QMenu * addMenu (QString title)
TextEditaddText (int ig, QString text)
virtual bool hasCurves (DCReportBlock &dcBlock)=0
virtual void report2plot (DCReportBlock &dcBlock, Point2D **points, const DCModelInfo &info)=0
virtual void setGlobalLimits (const Rect &)
virtual void setLimits (int i, const Rect &r)=0
virtual void setSampleCount (DCModelInfo *info, DCReportBlock &dcBlock)=0
virtual void setTitles (int i)=0
virtual AbstractLinetargetReferenceLine () const =0

Protected Attributes

QVBoxLayout * _childLayout
XYValueLines ** _curveLayers
AxisWindow ** _graphs
QMenuBar * _menuBar
double * _misfits
QList< DCModelInfo * > _models
int _nGraphs
ColorPaletteWidget_palette
int ** _pCounts
GraphicSheet _sheet
LineLayer ** _targetLayers

Constructor & Destructor Documentation

DinverDCGui::DCModelViewer::DCModelViewer ( QWidget *  parent = 0)

References _curveLayers, _graphs, _misfits, _models, _nGraphs, _pCounts, _targetLayers, DinverCore::dinverCore, DinverCore::DinverCoreObject::removeWindow(), SciFigs::XYColorLines::setPointCount(), SciFigs::XYValueLines::setValues(), and TRACE.

{
  TRACE;
  for(int i=0;i<_nGraphs;i++) {
    // Reset the plot widgets before deleting the data vectors
    // If one layer is still being painted while deleting this
    // objects, make sure to stop painting and to prevent other
    // painting to occur.
    _curveLayers[i]->setPointCount(0, 0, 0);
    _curveLayers[i]->setValues(0);
    delete [] _pCounts[i];
  }
  delete [] _misfits;
  delete [] _curveLayers;
  delete [] _targetLayers;
  delete [] _graphs;
  delete [] _pCounts;

  for(QList<DCModelInfo *>::iterator  it=_models.begin();it!=_models.end();++it) {
    DCModelInfo::removeReference(*it);
  }
  if(dinverCore)
    dinverCore->removeWindow(this);
}

Member Function Documentation

References _sheet, SciFigs::GraphicSheet::addEditActions(), SciFigs::GraphicSheet::addFileActions(), SciFigs::GraphicSheet::addFormatActions(), SciFigs::GraphicSheet::addInsertActions(), addMenu(), setLimits(), QGpCoreTools::tr(), and TRACE.

Referenced by DCModelViewer().

{
  TRACE;
  QAction * a;
  QMenu * m;

  // File menu
  m=addMenu(tr( "&File" ));
  _sheet.addFileActions(m, 0);

  a=new QAction(tr( "&Close" ), this);
  connect(a, SIGNAL(triggered()), this, SLOT(close()) );
  m->addAction(a);

  // Edit menu
  m=addMenu(tr( "&Edit" ));
  _sheet.addEditActions(m, 0);

  // Insert menu
  m=addMenu(tr( "&Insert" ));
  _sheet.addInsertActions(m, 0);

  // Format menu
  m=addMenu(tr( "&Format" ));
  _sheet.addFormatActions(m);

  m->addSeparator();

  a=new QAction(tr( "Set &limits" ), this);
  a->setStatusTip(tr( "Adjust limits of plots automatically" ));
  connect(a, SIGNAL(triggered()), this, SLOT(setLimits()) );
  m->addAction(a);
}
QMenu * DinverDCGui::DCModelViewer::addMenu ( QString  title) [protected]
TextEdit * DinverDCGui::DCModelViewer::addText ( int  ig,
QString  text 
) [protected]
virtual bool DinverDCGui::DCModelViewer::hasCurves ( DCReportBlock dcBlock) [protected, pure virtual]

References _curveLayers, _graphs, _nGraphs, _palette, _pCounts, _sheet, _targetLayers, SciFigs::GraphicSheet::addObject(), SciFigs::GraphContentLayer::addTrackingAction(), SciFigs::GraphicSheet::autoResizeContent(), SciFigs::ColorPaletteWidget::palette(), SciFigs::GraphicObject::setObjectName(), SciFigs::XYValueLines::setPalette(), SciFigs::GraphicObject::setPrintAnchor(), SciFigs::GraphicObject::setPrintHeight(), SciFigs::GraphicObject::setPrintWidth(), SciFigs::LineLayer::setReferenceLine(), setTitles(), SciFigs::GraphicSheet::showObject(), showSelectedModels(), targetReferenceLine(), QGpCoreTools::tr(), TRACE, SciFigs::AxisWindow::updateInternalGeometry(), and w.

Referenced by main().

{
  TRACE;
  AxisWindow * w;

  _nGraphs=nGraphs;
  _graphs=new AxisWindow * [_nGraphs];
  _curveLayers=new XYValueLines * [_nGraphs];
  _targetLayers=new LineLayer * [_nGraphs];
  _pCounts=new int * [_nGraphs];
  for(int i=0;i<_nGraphs;i++) _pCounts[i]=0;

  for(int i=0;i<_nGraphs;i++) {
    // initialize Vp graph
    w=new AxisWindow;
    w->setObjectName(QString("Graph%1").arg(i));
    _sheet.addObject(w);
    _graphs[i]=w;
    _curveLayers[i]=new XYValueLines(w, false);
    _curveLayers[i]->setObjectName("invesionCurves");
    _curveLayers[i]->setPalette(_palette->palette());
        _curveLayers[i]->addTrackingAction(tr("Select models"), 0, tr("Select models to create a new plot."));
        _curveLayers[i]->addTrackingAction(tr("Discard models"), 1, tr("Discard models to create a new plot."));
    connect(_curveLayers[i], SIGNAL(dataSelected( int, const QVector<int>* )), this, SLOT(showSelectedModels( int, const QVector<int>* )) );
    setTitles(i);
    // Connect palettes in both ways
    connect(_curveLayers[i], SIGNAL(paletteChanged(ColorPalette)), _palette, SLOT(setPalette(const ColorPalette&)));
    connect(_palette, SIGNAL(changed(ColorPalette)), _curveLayers[i], SLOT(setPalette(const ColorPalette&)));
    _targetLayers[i]=new LineLayer(w);
    _targetLayers[i]->setReferenceLine(targetReferenceLine());
    if(_targetLayers[i]) _targetLayers[i]->setObjectName("target");
    w->setPrintAnchor(Point2D( 0.5+i*6.0, 1.0) );
    w->setPrintWidth(6.0);
    w->setPrintHeight(8.0);
    w->updateInternalGeometry();
    _sheet.showObject(w);
  }
  _sheet.autoResizeContent();
}

References _curveLayers, _misfits, _models, _nGraphs, _pCounts, _sheet, SciFigs::GraphicSheet::deepUpdate(), hasCurves(), iModel, DinverDCCore::DCModelInfo::indexInReport(), SciFigs::GraphContentLayer::lockDelayPainting(), SciFigs::XYColorLines::points(), DinverDCCore::DCReportBlock::readProfiles(), DinverDCCore::DCModelInfo::report(), report2plot(), DinverDCCore::DCModelInfo::sampleCount(), setLimits(), DinverDCCore::DCModelInfo::setOffset(), SciFigs::XYColorLines::setPointCount(), SciFigs::XYValueLines::setValues(), DinverCore::ReportReader::stream(), TRACE, SciFigs::GraphContentLayer::unlock(), and DinverCore::ReportReader::userBlockVersion().

Referenced by main(), DinverDCGui::ViewerParam::reject(), and DinverDCGui::ViewerParam::select().

{
  TRACE;
  // Set curve offset for each model
  qSort(_models.begin(),_models.end(), DCModelInfo::misfitLessThan);
  int nModels=_models.count();
  int offsets[_nGraphs];
  for(int i=0;i<_nGraphs;i++) offsets[i]=0;
  for(int iModel=0;iModel<nModels;iModel++) {
    DCModelInfo& info=*_models[iModel];
    for(int i=0;i<_nGraphs;i++) {
      info.setOffset(i, offsets[i]);
      offsets[i]+=info.sampleCount(i);
    }
  }
  // Initialize the count vectors for the five plots
  for(int i=0;i<_nGraphs;i++) {
    if(offsets[i]>0) {
      delete _pCounts[i];
      _pCounts[i]=new int[ nModels ];
      for(int iModel=0;iModel<nModels;iModel++) {
        _pCounts[i][iModel]=_models[iModel]->sampleCount(i);
      }
    }
  }
  // Set misfit values in plots
  delete [] _misfits;
  _misfits=new double [ nModels ];
  for(int iModel=0;iModel<nModels;iModel++) {
    _misfits[iModel]=_models[iModel]->misfit();
  }
  // Lock plots
  for(int i=0;i<_nGraphs;i++) {
    _curveLayers[i]->setValues(_misfits);
    _curveLayers[i]->lockDelayPainting();
  }
  // Set plots
  Point2D * points[_nGraphs];
  for(int i=0;i<_nGraphs;i++) {
    XYValueLines * curveLayer=_curveLayers[i];
    if(offsets[i]>0)
      curveLayer->setPointCount(offsets[i], nModels, _pCounts[i]);
    else
      curveLayer->setPointCount(0, 0, 0);
    points[i]=curveLayer->points();
  }
  // Load points into vectors
  qSort(_models.begin(),_models.end(), DCModelInfo::loadLessThan);
  for(int iModel=0;iModel<nModels;iModel++) {
    DCModelInfo& info=*_models[iModel];
    ReportReader& report=*info.report();
    int version=report.userBlockVersion(info.indexInReport(), "DISP");
    if(version>=0) {
      DCReportBlock dcBlock(report.stream());
      dcBlock.readProfiles(version);
      if(hasCurves(dcBlock)) report2plot(dcBlock, points, info);
    }
  }
  // unlock plots
  for(int i=0;i<_nGraphs;i++) {
    _curveLayers[i]->unlock();
  }
  // Force redrawing
  setLimits();
  _sheet.deepUpdate();
  // Cleanup model info: save space for offset and number of samples
  for(QList<DCModelInfo *>::iterator  it=_models.begin();it!=_models.end();++it) {
    (*it)->setCurveCount(0);
  }
}
void DinverDCGui::DCModelViewer::rejectModels ( DCModelViewer w,
const QVector< int > *  indexes 
)

References _models, _nGraphs, QGpCoreTools::SharedObject::addReference(), hasCurves(), DinverDCCore::DCModelInfo::indexInReport(), modelCount(), DinverDCCore::DCReportBlock::readProfiles(), DinverDCCore::DCModelInfo::report(), DinverDCCore::DCModelInfo::setCurveCount(), setSampleCount(), DinverCore::ReportReader::stream(), TRACE, and DinverCore::ReportReader::userBlockVersion().

Referenced by DinverDCGui::ViewerParam::reject().

{
  TRACE;
  QSet<int> rejectLookup;
  int n=indexes->count();
  for (int i=0;i<n;i++) {
    rejectLookup.insert(indexes->at(i));
  }
  // Make sure models are properly ordered (plotting index)
  qSort(w->_models.begin(),w->_models.end(), DCModelInfo::misfitLessThan);
  n=w->modelCount();
  for (int i=0; i<n; i++) {
    if (!rejectLookup.contains(i)) {
      DCModelInfo& info = *w->_models.at(i);
      ReportReader& report=*info.report();
      int version=report.userBlockVersion(info.indexInReport(), "DISP");
      if(version>=0) {
        DCReportBlock dcBlock(report.stream());
        dcBlock.readProfiles(version);
        if(hasCurves(dcBlock)) {
          info.setCurveCount(_nGraphs);
          setSampleCount(&info, dcBlock);
          info.addReference();
          _models << &info;
        }
      }
    }
  }
}
virtual void DinverDCGui::DCModelViewer::report2plot ( DCReportBlock dcBlock,
Point2D **  points,
const DCModelInfo info 
) [protected, pure virtual]
void DinverDCGui::DCModelViewer::selectModels ( QString  reportFileName,
double  maxMisfit 
)

References _models, _nGraphs, QGpCoreTools::SharedObject::addReference(), hasCurves(), iModel, misfit(), DinverCore::ReportReader::misfit(), DinverCore::ReportReader::nModels(), DinverCore::ReportReader::open(), DinverDCCore::DCModelInfo::setCurveCount(), DinverDCCore::DCModelInfo::setIndexInReport(), DinverDCCore::DCModelInfo::setMisfit(), DinverDCCore::DCModelInfo::setReport(), setSampleCount(), DinverCore::ReportReader::stream(), DinverCore::ReportReader::synchronize(), TRACE, and DinverCore::ReportReader::userBlockVersion().

Referenced by main(), and DinverDCGui::ViewerParam::select().

{
  TRACE;
  ReportReader * report=new ReportReader(reportFileName);
  if(!report->open()) {
    delete report;
    return;
  }
  maxMisfit*=1.0+1e-15;
  report->synchronize(); // make sure that report is synchronized on disk
  int nModels=report->nModels();
  // Fill in ReportModelInfo structure (counting of samples)
  int initialNModels=_models.count();
  DCReportBlock dcBlock(report->stream());
  for(int iModel=0;iModel<nModels;iModel++) {
    double misfit=report->misfit(iModel);
    if(misfit<maxMisfit) {
      // Read user block to get the number of samples
      int version=report->userBlockVersion("DISP");
      if(version>=0) {
        dcBlock.readProfiles(version);
        if(hasCurves(dcBlock)) {
          DCModelInfo * info=new DCModelInfo;
          info->setCurveCount(_nGraphs);
          setSampleCount(info, dcBlock);
          info->setReport(report);
          info->setIndexInReport(iModel);
          info->setMisfit(misfit);
          info->addReference();
          _models << info;
        }
      }
    }
  }
  if(_models.count()==initialNModels) { /* Means that no model were added with a reference to this report
                                            Hence the report won't be deleted automatically upon deletion of model infos */
    delete report;
  }
}
void DinverDCGui::DCModelViewer::selectModels ( DCModelViewer w,
const QVector< int > *  indexes 
)

References _models, _nGraphs, QGpCoreTools::SharedObject::addReference(), hasCurves(), DinverDCCore::DCModelInfo::indexInReport(), DinverDCCore::DCReportBlock::readProfiles(), DinverDCCore::DCModelInfo::report(), DinverDCCore::DCModelInfo::setCurveCount(), setSampleCount(), DinverCore::ReportReader::stream(), TRACE, and DinverCore::ReportReader::userBlockVersion().

{
  TRACE;
  // Make sure models are properly ordered (plotting index)
  qSort(w->_models.begin(),w->_models.end(), DCModelInfo::misfitLessThan);
  int n=indexes->count();
  for(int i=0;i<n;i++) {
    DCModelInfo& info=*w->_models.at(indexes->at(i));
    ReportReader& report=*info.report();
    int version=report.userBlockVersion(info.indexInReport(), "DISP");
    if(version>=0) {
      DCReportBlock dcBlock(report.stream());
      dcBlock.readProfiles(version);
      if(hasCurves(dcBlock)) {
        info.setCurveCount(_nGraphs);
        setSampleCount(&info, dcBlock);
        info.addReference();
        _models << &info;
      }
    }
  }
}
virtual void DinverDCGui::DCModelViewer::setFrequencyAxis ( bool  ) [inline, virtual]

Referenced by main().

{}
virtual void DinverDCGui::DCModelViewer::setGlobalLimits ( const Rect ) [inline, protected, virtual]

Reimplemented in DinverDCGui::GroundModelViewer.

Referenced by setLimits().

{}

References _curveLayers, _nGraphs, _palette, _sheet, QGpCoreTools::Rect::add(), SciFigs::XYColorLines::boundingRect(), SciFigs::GraphicSheet::deepUpdate(), setGlobalLimits(), SciFigs::ColorPaletteWidget::setScaleType(), SciFigs::ColorPaletteWidget::setVLinear(), SciFigs::ColorPaletteWidget::setVLog(), TRACE, and SciFigs::XYValueLines::valueRange().

Referenced by addActions(), DinverDCGui::GroundModelViewer::GroundModelViewer(), and loadModels().

{
  TRACE;
  double minMisfit=1e99;
  double maxMisfit=-1e99;
  Rect rmax;
  for(int i=0;i<_nGraphs;i++) {
    XYValueLines * curveLayer=_curveLayers[i];
    curveLayer->valueRange(minMisfit, maxMisfit);
    Rect r=curveLayer->boundingRect();
    if(i==0) rmax=r; else rmax.add(r);
    setLimits(i,r);
  }
  setGlobalLimits(rmax);
  // Adjust palette to effective misfit value range
  if(minMisfit > 0.0) {
    _palette->setVLog(minMisfit, 0.5 * (minMisfit + maxMisfit) );
    _palette->setScaleType(Scale::Log);
  } else _palette->setVLinear(minMisfit, 0.5 * (minMisfit + maxMisfit) );

  _sheet.deepUpdate();
}
virtual void DinverDCGui::DCModelViewer::setLimits ( int  i,
const Rect r 
) [protected, pure virtual]
virtual void DinverDCGui::DCModelViewer::setMode ( const Mode ) [inline, virtual]

Reimplemented in DinverDCGui::AutocorrViewer, and DinverDCGui::DispersionViewer.

Referenced by main().

{}
virtual void DinverDCGui::DCModelViewer::setModeIndex ( int  ) [inline, virtual]
{}
virtual void DinverDCGui::DCModelViewer::setSampleCount ( DCModelInfo info,
DCReportBlock dcBlock 
) [protected, pure virtual]
virtual void DinverDCGui::DCModelViewer::setTitles ( int  i) [protected, pure virtual]

Referenced by main().

{return &_sheet;}
void DinverDCGui::DCModelViewer::showSelectedModels ( int  id,
const QVector< int > *  indexes 
) [slot]

indexes refers to the curve index

References DinverDCGui::ViewerParam::reject(), DinverDCGui::ViewerParam::select(), and TRACE.

Referenced by initGraphs().

{
  TRACE;
  ViewerParam * d=new ViewerParam(QApplication::activeWindow());
  if(id==0)
    d->select(this, indexes);
  else
    d->reject(this, indexes);
  delete d;
}
void DinverDCGui::DCModelViewer::showTarget ( bool  isVisible) [protected, virtual, slot]
virtual AbstractLine* DinverDCGui::DCModelViewer::targetReferenceLine ( ) const [protected, pure virtual]

Member Data Documentation

QVBoxLayout* DinverDCGui::DCModelViewer::_childLayout [protected]

Referenced by DCModelViewer().

QMenuBar* DinverDCGui::DCModelViewer::_menuBar [protected]

Referenced by addMenu(), and DCModelViewer().


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