#7524 Correlation plot filter

This commit is contained in:
Magne Sjaastad 2021-03-29 15:45:53 +02:00 committed by GitHub
parent 5d45a8cec9
commit c5ac85953b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 274 additions and 68 deletions

View File

@ -1,3 +1,21 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2020 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RimAbstractCorrelationPlot.h"
#include "RiaPreferences.h"
@ -7,18 +25,22 @@
#include "RifSummaryReaderInterface.h"
#include "RimAnalysisPlotDataEntry.h"
#include "RimEnsembleCurveFilter.h"
#include "RimEnsembleCurveFilterCollection.h"
#include "RimEnsembleCurveSet.h"
#include "RimProject.h"
#include "RimSummaryAddress.h"
#include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h"
#include "RiuPlotMainWindowTools.h"
#include "RiuQwtPlotWidget.h"
#include "RiuSummaryVectorSelectionDialog.h"
#include "cafPdmUiComboBoxEditor.h"
#include "cafPdmUiLineEditor.h"
#include "cafPdmUiPushButtonEditor.h"
#include "cafPdmUiToolButtonEditor.h"
CAF_PDM_ABSTRACT_SOURCE_INIT( RimAbstractCorrelationPlot, "AbstractCorrelationPlot" );
@ -36,9 +58,9 @@ RimAbstractCorrelationPlot::RimAbstractCorrelationPlot()
m_selectedVarsUiField.uiCapability()->setUiReadOnly( true );
m_selectedVarsUiField.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() );
CAF_PDM_InitFieldNoDefault( &m_analysisPlotDataSelection, "AnalysisPlotData", "", "", "", "" );
m_analysisPlotDataSelection.uiCapability()->setUiTreeChildrenHidden( true );
m_analysisPlotDataSelection.uiCapability()->setUiTreeHidden( true );
CAF_PDM_InitFieldNoDefault( &m_dataSources, "AnalysisPlotData", "", "", "", "" );
m_dataSources.uiCapability()->setUiTreeChildrenHidden( true );
m_dataSources.uiCapability()->setUiTreeHidden( true );
CAF_PDM_InitFieldNoDefault( &m_pushButtonSelectSummaryAddress, "SelectAddress", "", "", "", "" );
caf::PdmUiPushButtonEditor::configureEditorForField( &m_pushButtonSelectSummaryAddress );
@ -61,6 +83,12 @@ RimAbstractCorrelationPlot::RimAbstractCorrelationPlot()
m_axisValueFontSize = caf::FontTools::RelativeSize::XSmall;
m_legendFontSize = caf::FontTools::RelativeSize::XSmall;
CAF_PDM_InitField( &m_useCaseFilter, "UseCaseFilter", false, "Use Ensemble Filter", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_curveSetForFiltering, "CurveSetForFiltering", " Ensemble Filter", "", "", "" );
CAF_PDM_InitField( &m_editCaseFilter, "EditCaseFilter", false, "Edit", "", "", "" );
m_editCaseFilter.uiCapability()->setUiEditorTypeName( caf::PdmUiToolButtonEditor::uiEditorTypeName() );
m_editCaseFilter.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
}
//--------------------------------------------------------------------------------------------------
@ -75,12 +103,12 @@ RimAbstractCorrelationPlot::~RimAbstractCorrelationPlot()
//--------------------------------------------------------------------------------------------------
void RimAbstractCorrelationPlot::setCurveDefinitions( const std::vector<RiaSummaryCurveDefinition>& curveDefinitions )
{
m_analysisPlotDataSelection.deleteAllChildObjects();
m_dataSources.deleteAllChildObjects();
for ( auto curveDef : curveDefinitions )
{
auto dataEntry = new RimAnalysisPlotDataEntry();
dataEntry->setFromCurveDefinition( curveDef );
m_analysisPlotDataSelection.push_back( dataEntry );
m_dataSources.push_back( dataEntry );
}
connectAllCaseSignals();
@ -125,12 +153,12 @@ void RimAbstractCorrelationPlot::fieldChangedByUi( const caf::PdmFieldHandle* ch
if ( !curveSelection.empty() )
{
std::vector<RiaSummaryCurveDefinition> summaryVectorDefinitions = dlg.curveSelection();
m_analysisPlotDataSelection.deleteAllChildObjects();
m_dataSources.deleteAllChildObjects();
for ( const RiaSummaryCurveDefinition& vectorDef : summaryVectorDefinitions )
{
auto plotEntry = new RimAnalysisPlotDataEntry();
plotEntry->setFromCurveDefinition( vectorDef );
m_analysisPlotDataSelection.push_back( plotEntry );
m_dataSources.push_back( plotEntry );
}
connectAllCaseSignals();
this->loadDataAndUpdate();
@ -170,6 +198,31 @@ void RimAbstractCorrelationPlot::fieldChangedByUi( const caf::PdmFieldHandle* ch
this->updateConnectedEditors();
}
else if ( changedField == &m_curveSetForFiltering )
{
connectCurveFilterSignals();
this->loadDataAndUpdate();
}
else if ( changedField == &m_useCaseFilter )
{
this->loadDataAndUpdate();
}
else if ( changedField == &m_editCaseFilter )
{
m_editCaseFilter = false;
if ( m_curveSetForFiltering != nullptr )
{
auto filterColl = m_curveSetForFiltering->filterCollection();
auto activeFilters = filterColl->filters();
auto firstFilter = activeFilters.empty() ? nullptr : activeFilters.front();
if ( firstFilter )
{
RiuPlotMainWindowTools::selectAsCurrentItem( firstFilter );
}
}
}
}
//--------------------------------------------------------------------------------------------------
@ -253,6 +306,34 @@ QList<caf::PdmOptionItemInfo>
{
options = caf::FontTools::relativeSizeValueOptions( RiaPreferences::current()->defaultPlotFontSize() );
}
else if ( fieldNeedingOptions == &m_curveSetForFiltering )
{
RimSummaryCaseCollection* ensemble = nullptr;
for ( auto e : m_dataSources )
{
auto ens = e->ensemble();
if ( ens )
{
ensemble = ens;
}
}
options.push_back( caf::PdmOptionItemInfo( "None", nullptr ) );
if ( ensemble )
{
std::vector<RimEnsembleCurveSet*> referringObjects;
ensemble->objectsWithReferringPtrFieldsOfType( referringObjects );
for ( auto object : referringObjects )
{
auto nameFiled = object->name();
options.push_back( caf::PdmOptionItemInfo( nameFiled, object ) );
}
}
}
return options;
}
@ -279,7 +360,7 @@ std::set<time_t> RimAbstractCorrelationPlot::allAvailableTimeSteps()
std::vector<RiaSummaryCurveDefinition> RimAbstractCorrelationPlot::curveDefinitions() const
{
std::vector<RiaSummaryCurveDefinition> curveDefs;
for ( auto dataEntry : m_analysisPlotDataSelection )
for ( auto dataEntry : m_dataSources )
{
curveDefs.push_back( dataEntry->curveDefinition() );
}
@ -309,7 +390,7 @@ std::set<RifEclipseSummaryAddress> RimAbstractCorrelationPlot::addresses()
{
std::set<RifEclipseSummaryAddress> addresses;
for ( auto dataEntry : m_analysisPlotDataSelection )
for ( auto dataEntry : m_dataSources )
{
addresses.insert( dataEntry->summaryAddress() );
}
@ -326,6 +407,65 @@ std::set<RimSummaryCaseCollection*> RimAbstractCorrelationPlot::ensembles()
return analyserOfSelectedCurveDefs->m_ensembles;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::set<RimSummaryCase*> RimAbstractCorrelationPlot::filterEnsembleCases( RimSummaryCaseCollection* ensemble ) const
{
std::set<RimSummaryCase*> setOfCases;
if ( ensemble )
{
std::vector<RimSummaryCase*> summaryCasesVector;
if ( m_useCaseFilter() && m_curveSetForFiltering() && m_curveSetForFiltering->summaryCaseCollection() == ensemble )
{
summaryCasesVector = m_curveSetForFiltering->filterEnsembleCases( ensemble->allSummaryCases() );
}
else
{
summaryCasesVector = ensemble->allSummaryCases();
}
setOfCases.insert( summaryCasesVector.begin(), summaryCasesVector.end() );
}
return setOfCases;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimAbstractCorrelationPlot::isCaseFilterEnabled() const
{
return m_useCaseFilter();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimAbstractCorrelationPlot::enableCaseFilter( bool enable )
{
m_useCaseFilter = enable;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEnsembleCurveSet* RimAbstractCorrelationPlot::caseFilterDataSource() const
{
return m_curveSetForFiltering();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimAbstractCorrelationPlot::setCaseFilterDataSource( RimEnsembleCurveSet* ensemble )
{
m_curveSetForFiltering = ensemble;
connectCurveFilterSignals();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -596,6 +736,27 @@ QString RimAbstractCorrelationPlot::completeAddressText()
void RimAbstractCorrelationPlot::initAfterRead()
{
connectAllCaseSignals();
connectCurveFilterSignals();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimAbstractCorrelationPlot::appendDataSourceFields( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{
caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Summary Vector" );
m_selectedVarsUiField = selectedQuantitiesText();
curveDataGroup->add( &m_selectedVarsUiField );
curveDataGroup->add( &m_pushButtonSelectSummaryAddress, { false, 1, 0 } );
curveDataGroup->add( &m_timeStepFilter );
curveDataGroup->add( &m_timeStep );
curveDataGroup->add( &m_useCaseFilter );
curveDataGroup->add( &m_curveSetForFiltering );
m_curveSetForFiltering.uiCapability()->setUiHidden( !m_useCaseFilter() );
curveDataGroup->add( &m_editCaseFilter, { false, 1, 0 } );
m_editCaseFilter.uiCapability()->setUiHidden( !m_useCaseFilter() );
}
//--------------------------------------------------------------------------------------------------
@ -612,7 +773,7 @@ void RimAbstractCorrelationPlot::onCaseRemoved( const SignalEmitter* emitter, Ri
//--------------------------------------------------------------------------------------------------
void RimAbstractCorrelationPlot::connectAllCaseSignals()
{
for ( auto dataEntry : m_analysisPlotDataSelection )
for ( auto dataEntry : m_dataSources )
{
if ( dataEntry->ensemble() )
{
@ -620,3 +781,22 @@ void RimAbstractCorrelationPlot::connectAllCaseSignals()
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimAbstractCorrelationPlot::connectCurveFilterSignals()
{
if ( m_curveSetForFiltering() )
{
m_curveSetForFiltering()->filterChanged.connect( this, &RimAbstractCorrelationPlot::onFilterSourceChanged );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimAbstractCorrelationPlot::onFilterSourceChanged( const caf::SignalEmitter* emitter )
{
if ( m_useCaseFilter() ) loadDataAndUpdate();
}

View File

@ -17,15 +17,12 @@
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RifEclipseSummaryAddress.h"
#include "RifEclipseSummaryAddressQMetaType.h"
#include "RimPlot.h"
#include "RimSummaryCaseCollection.h"
#include "RimTimeStepFilter.h"
#include "cafPdmPtrField.h"
#include <QDateTime>
#include <QString>
#include <ctime>
@ -34,6 +31,11 @@ class RiaSummaryCurveDefinition;
class RiaSummaryCurveDefinitionAnalyser;
class RimAnalysisPlotDataEntry;
class RimSummaryAddress;
class RimEnsembleCurveSet;
class RimSummaryCaseCollection;
class RimSummaryCase;
class EnsembleParameter;
class RifEclipseSummaryAddress;
class RimAbstractCorrelationPlot : public RimPlot
{
@ -51,10 +53,18 @@ public:
void setCurveDefinitions( const std::vector<RiaSummaryCurveDefinition>& curveDefinitions );
void setTimeStep( std::time_t timeStep );
std::set<RimSummaryCaseCollection*> ensembles();
RiuQwtPlotWidget* viewer() override;
void detachAllCurves() override;
QDateTime timeStep() const;
QString timeStepString() const;
// Get summary cases filtered by attached ensemble parameter filter
std::set<RimSummaryCase*> filterEnsembleCases( RimSummaryCaseCollection* ensemble ) const;
bool isCaseFilterEnabled() const;
void enableCaseFilter( bool enable );
RimEnsembleCurveSet* caseFilterDataSource() const;
void setCaseFilterDataSource( RimEnsembleCurveSet* ensemble );
RiuQwtPlotWidget* viewer() override;
void detachAllCurves() override;
QDateTime timeStep() const;
QString timeStepString() const;
int labelFontSize() const;
int axisTitleFontSize() const;
@ -115,9 +125,15 @@ protected:
void initAfterRead() final;
void appendDataSourceFields( QString uiConfigName, caf::PdmUiOrdering& uiOrdering );
private:
void onCaseRemoved( const SignalEmitter* emitter, RimSummaryCase* summaryCase );
void connectAllCaseSignals();
void connectCurveFilterSignals();
void onFilterSourceChanged( const caf::SignalEmitter* emitter );
RiaSummaryCurveDefinitionAnalyser* getOrCreateSelectedCurveDefAnalyser();
protected:
std::unique_ptr<RiaSummaryCurveDefinitionAnalyser> m_analyserOfSelectedCurveDefs;
@ -125,9 +141,6 @@ protected:
bool m_selectMultipleVectors;
// Fields
caf::PdmChildArrayField<RimAnalysisPlotDataEntry*> m_analysisPlotDataSelection;
caf::PdmField<QString> m_selectedVarsUiField;
caf::PdmField<bool> m_pushButtonSelectSummaryAddress;
caf::PdmField<TimeStepFilterEnum> m_timeStepFilter;
@ -141,5 +154,8 @@ protected:
caf::PdmField<caf::FontTools::RelativeSizeEnum> m_axisValueFontSize;
private:
RiaSummaryCurveDefinitionAnalyser* getOrCreateSelectedCurveDefAnalyser();
caf::PdmChildArrayField<RimAnalysisPlotDataEntry*> m_dataSources;
caf::PdmField<bool> m_useCaseFilter;
caf::PdmPtrField<RimEnsembleCurveSet*> m_curveSetForFiltering;
caf::PdmField<bool> m_editCaseFilter;
};

View File

@ -314,13 +314,7 @@ void RimCorrelationMatrixPlot::defineUiOrdering( QString uiConfigName, caf::PdmU
}
}
caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Summary Vector" );
m_selectedVarsUiField = selectedQuantitiesText();
curveDataGroup->add( &m_selectedVarsUiField );
curveDataGroup->add( &m_pushButtonSelectSummaryAddress, { false, 1, 0 } );
curveDataGroup->add( &m_timeStepFilter );
curveDataGroup->add( &m_timeStep );
appendDataSourceFields( uiConfigName, uiOrdering );
if ( uiConfigName != "report" )
{
@ -522,6 +516,8 @@ void RimCorrelationMatrixPlot::createMatrix()
if ( ensemble )
{
std::set<RimSummaryCase*> activeCases = filterEnsembleCases( ensemble );
std::vector<double> caseValuesAtTimestep;
std::vector<double> parameterValues;
@ -533,8 +529,10 @@ void RimCorrelationMatrixPlot::createMatrix()
for ( size_t caseIdx = 0u; caseIdx < ensemble->allSummaryCases().size(); ++caseIdx )
{
auto summaryCase = ensemble->allSummaryCases()[caseIdx];
RifSummaryReaderInterface* reader = summaryCase->summaryReader();
auto summaryCase = ensemble->allSummaryCases()[caseIdx];
if ( activeCases.count( summaryCase ) == 0 ) continue;
RifSummaryReaderInterface* reader = summaryCase->summaryReader();
if ( reader )
{
std::vector<double> values;

View File

@ -18,7 +18,8 @@
#pragma once
#include "RimCorrelationPlot.h"
#include "RimAbstractCorrelationPlot.h"
#include "cafAppEnum.h"
#include <QDateTime>

View File

@ -130,12 +130,7 @@ void RimCorrelationPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrder
correlationGroup->add( &m_topNFilterCount );
}
caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Summary Vector" );
curveDataGroup->add( &m_selectedVarsUiField );
curveDataGroup->add( &m_pushButtonSelectSummaryAddress, { false, 1, 0 } );
curveDataGroup->add( &m_timeStepFilter );
curveDataGroup->add( &m_timeStep );
appendDataSourceFields( uiConfigName, uiOrdering );
caf::PdmUiGroup* plotGroup = uiOrdering.addNewGroup( "Plot Settings" );
plotGroup->add( &m_showPlotTitle );
@ -190,7 +185,6 @@ void RimCorrelationPlot::onLoadDataAndUpdate()
RiuGroupedBarChartBuilder chartBuilder;
// buildTestPlot( chartBuilder );
addDataToChartBuilder( chartBuilder );
chartBuilder.addBarChartToPlot( m_plotWidget,
@ -246,8 +240,10 @@ void RimCorrelationPlot::addDataToChartBuilder( RiuGroupedBarChartBuilder& chart
auto ensemble = *ensembles().begin();
auto address = *addresses().begin();
std::set<RimSummaryCase*> activeCases = filterEnsembleCases( ensemble );
std::vector<std::pair<EnsembleParameter, double>> correlations =
ensemble->parameterCorrelations( address, selectedTimestep, m_selectedParametersList() );
ensemble->parameterCorrelations( address, selectedTimestep, m_selectedParametersList(), activeCases );
for ( auto parameterCorrPair : correlations )
{

View File

@ -21,7 +21,6 @@
#include "RiaSummaryCurveDefinition.h" // use of caf::Signal requires this include
#include "RimAbstractCorrelationPlot.h"
#include "RimSummaryCaseCollection.h"
#include "cafAppEnum.h"

View File

@ -296,38 +296,46 @@ void RimCorrelationReportPlot::deleteViewWidget()
void RimCorrelationReportPlot::onLoadDataAndUpdate()
{
updateMdiWindowVisibility();
if ( m_showWindow )
{
auto timeStep = m_correlationMatrixPlot->timeStep().toSecsSinceEpoch();
bool showOnlyTopNCorrelations = m_correlationMatrixPlot->showTopNCorrelations();
int topNFilterCount = m_correlationMatrixPlot->topNFilterCount();
m_correlationPlot->setTimeStep( timeStep );
m_correlationPlot->setShowOnlyTopNCorrelations( showOnlyTopNCorrelations );
m_correlationPlot->setTopNFilterCount( topNFilterCount );
m_parameterResultCrossPlot->setTimeStep( timeStep );
m_correlationMatrixPlot->setLabelFontSize( m_labelFontSize() );
m_correlationMatrixPlot->setAxisTitleFontSize( m_axisTitleFontSize() );
m_correlationMatrixPlot->setAxisValueFontSize( m_axisValueFontSize() );
auto timeStep = m_correlationMatrixPlot->timeStep().toSecsSinceEpoch();
bool showOnlyTopNCorrelations = m_correlationMatrixPlot->showTopNCorrelations();
int topNFilterCount = m_correlationMatrixPlot->topNFilterCount();
bool useCaseFilter = m_correlationMatrixPlot->isCaseFilterEnabled();
auto caseFilterDataSource = m_correlationMatrixPlot->caseFilterDataSource();
m_correlationPlot->setTimeStep( timeStep );
m_correlationPlot->setShowOnlyTopNCorrelations( showOnlyTopNCorrelations );
m_correlationPlot->setTopNFilterCount( topNFilterCount );
m_correlationPlot->enableCaseFilter( useCaseFilter );
m_correlationPlot->setCaseFilterDataSource( caseFilterDataSource );
m_correlationPlot->setLabelFontSize( m_labelFontSize() );
m_correlationPlot->setAxisTitleFontSize( m_axisTitleFontSize() );
m_correlationPlot->setAxisValueFontSize( m_axisValueFontSize() );
m_correlationPlot->setShowAbsoluteValues( m_correlationMatrixPlot->showAbsoluteValues() );
m_correlationPlot->setSortByAbsoluteValues( m_correlationMatrixPlot->sortByAbsoluteValues() );
m_parameterResultCrossPlot->setTimeStep( timeStep );
m_parameterResultCrossPlot->enableCaseFilter( useCaseFilter );
m_parameterResultCrossPlot->setCaseFilterDataSource( caseFilterDataSource );
m_parameterResultCrossPlot->setLabelFontSize( m_labelFontSize() );
m_parameterResultCrossPlot->setLegendFontSize( m_legendFontSize() );
m_parameterResultCrossPlot->setAxisTitleFontSize( m_axisTitleFontSize() );
m_parameterResultCrossPlot->setAxisValueFontSize( m_axisValueFontSize() );
m_correlationPlot->setShowAbsoluteValues( m_correlationMatrixPlot->showAbsoluteValues() );
m_correlationPlot->setSortByAbsoluteValues( m_correlationMatrixPlot->sortByAbsoluteValues() );
m_correlationMatrixPlot->loadDataAndUpdate();
m_correlationPlot->loadDataAndUpdate();
m_parameterResultCrossPlot->loadDataAndUpdate();
m_viewer->setPlotTitle( m_plotWindowTitle() );
}
updateLayout();
}

View File

@ -17,7 +17,6 @@
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RimCorrelationPlot.h"
#include "RimPlotWindow.h"
#include "cafPdmChildField.h"

View File

@ -115,13 +115,7 @@ void RimParameterResultCrossPlot::fieldChangedByUi( const caf::PdmFieldHandle* c
//--------------------------------------------------------------------------------------------------
void RimParameterResultCrossPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{
m_selectedVarsUiField = selectedQuantitiesText();
caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Summary Vector" );
curveDataGroup->add( &m_selectedVarsUiField );
curveDataGroup->add( &m_pushButtonSelectSummaryAddress, { false, 1, 0 } );
curveDataGroup->add( &m_timeStepFilter );
curveDataGroup->add( &m_timeStep );
appendDataSourceFields( uiConfigName, uiOrdering );
caf::PdmUiGroup* crossPlotGroup = uiOrdering.addNewGroup( "Cross Plot Parameters" );
crossPlotGroup->add( &m_ensembleParameter );
@ -256,9 +250,12 @@ void RimParameterResultCrossPlot::createPoints()
QStringList caseNames = caseNamesOfValidEnsembleCases( ensemble );
QString commonCaseRoot = RiaTextStringTools::commonRoot( caseNames );
std::set<RimSummaryCase*> activeCases = filterEnsembleCases( ensemble );
for ( size_t caseIdx = 0u; caseIdx < ensemble->allSummaryCases().size(); ++caseIdx )
{
auto summaryCase = ensemble->allSummaryCases()[caseIdx];
if ( activeCases.count( summaryCase ) == 0 ) continue;
RifSummaryReaderInterface* reader = summaryCase->summaryReader();
if ( !reader ) continue;

View File

@ -98,6 +98,8 @@ CAF_PDM_SOURCE_INIT( RimEnsembleCurveSet, "RimEnsembleCurveSet" );
///
//--------------------------------------------------------------------------------------------------
RimEnsembleCurveSet::RimEnsembleCurveSet()
: filterChanged( this )
{
CAF_PDM_InitObject( "Ensemble Curve Set", ":/EnsembleCurveSet16x16.png", "", "" );
@ -577,6 +579,8 @@ void RimEnsembleCurveSet::updateAllCurves()
updateEnsembleCurves( filteredCases );
updateStatisticsCurves( m_statistics->basedOnFilteredCases() ? filteredCases : allCases );
}
filterChanged.send();
}
//--------------------------------------------------------------------------------------------------

View File

@ -82,6 +82,10 @@ public:
RimEnsembleCurveSet();
~RimEnsembleCurveSet() override;
caf::Signal<> filterChanged;
QString name() const;
bool isCurvesVisible();
void setColor( cvf::Color3f color );
@ -173,7 +177,6 @@ private:
void updateQwtPlotAxis();
QString name() const;
QString createAutoName() const;
void updateLegendMappingMode();

View File

@ -541,9 +541,10 @@ time_t timeDiff( time_t lhs, time_t rhs )
///
//--------------------------------------------------------------------------------------------------
std::vector<std::pair<EnsembleParameter, double>>
RimSummaryCaseCollection::parameterCorrelations( const RifEclipseSummaryAddress& address,
time_t timeStep,
const std::vector<QString>& selectedParameters ) const
RimSummaryCaseCollection::parameterCorrelations( const RifEclipseSummaryAddress& address,
time_t timeStep,
const std::vector<QString>& selectedParameters,
const std::set<RimSummaryCase*>& selectedCases ) const
{
auto parameters = variationSortedEnsembleParameters( true );
@ -568,6 +569,8 @@ std::vector<std::pair<EnsembleParameter, double>>
RifSummaryReaderInterface* reader = summaryCase->summaryReader();
if ( !reader ) continue;
if ( !selectedCases.empty() && selectedCases.count( summaryCase ) == 0 ) continue;
if ( !summaryCase->caseRealizationParameters() ) continue;
std::vector<double> values;

View File

@ -123,9 +123,11 @@ public:
std::vector<std::pair<EnsembleParameter, double>>
correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address, time_t selectedTimeStep ) const;
std::vector<std::pair<EnsembleParameter, double>>
parameterCorrelations( const RifEclipseSummaryAddress& address,
time_t selectedTimeStep,
const std::vector<QString>& selectedParameters = {} ) const;
parameterCorrelations( const RifEclipseSummaryAddress& address,
time_t selectedTimeStep,
const std::vector<QString>& selectedParameters = {},
const std::set<RimSummaryCase*>& selectedCases = {} ) const;
std::vector<std::pair<EnsembleParameter, double>>
parameterCorrelationsAllTimeSteps( const RifEclipseSummaryAddress& address,
const std::vector<QString>& selectedParameters = {} ) const;