From c5ac85953b8c34c1cef39baf17faf36a61a9562a Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 29 Mar 2021 15:45:53 +0200 Subject: [PATCH] #7524 Correlation plot filter --- .../RimAbstractCorrelationPlot.cpp | 200 +++++++++++++++++- .../RimAbstractCorrelationPlot.h | 40 ++-- .../RimCorrelationMatrixPlot.cpp | 16 +- .../RimCorrelationMatrixPlot.h | 3 +- .../CorrelationPlots/RimCorrelationPlot.cpp | 12 +- .../CorrelationPlots/RimCorrelationPlot.h | 1 - .../RimCorrelationReportPlot.cpp | 32 +-- .../RimCorrelationReportPlot.h | 1 - .../RimParameterResultCrossPlot.cpp | 11 +- .../Summary/RimEnsembleCurveSet.cpp | 4 + .../Summary/RimEnsembleCurveSet.h | 5 +- .../Summary/RimSummaryCaseCollection.cpp | 9 +- .../Summary/RimSummaryCaseCollection.h | 8 +- 13 files changed, 274 insertions(+), 68 deletions(-) diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp index f6769aca7f..ed158996b7 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp @@ -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 +// 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& 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 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 { 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 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 RimAbstractCorrelationPlot::allAvailableTimeSteps() std::vector RimAbstractCorrelationPlot::curveDefinitions() const { std::vector curveDefs; - for ( auto dataEntry : m_analysisPlotDataSelection ) + for ( auto dataEntry : m_dataSources ) { curveDefs.push_back( dataEntry->curveDefinition() ); } @@ -309,7 +390,7 @@ std::set RimAbstractCorrelationPlot::addresses() { std::set addresses; - for ( auto dataEntry : m_analysisPlotDataSelection ) + for ( auto dataEntry : m_dataSources ) { addresses.insert( dataEntry->summaryAddress() ); } @@ -326,6 +407,65 @@ std::set RimAbstractCorrelationPlot::ensembles() return analyserOfSelectedCurveDefs->m_ensembles; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::set RimAbstractCorrelationPlot::filterEnsembleCases( RimSummaryCaseCollection* ensemble ) const +{ + std::set setOfCases; + + if ( ensemble ) + { + std::vector 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(); +} diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h index 01060cc114..374e0a203c 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h @@ -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 #include #include @@ -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& curveDefinitions ); void setTimeStep( std::time_t timeStep ); std::set ensembles(); - RiuQwtPlotWidget* viewer() override; - void detachAllCurves() override; - QDateTime timeStep() const; - QString timeStepString() const; + + // Get summary cases filtered by attached ensemble parameter filter + std::set 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 m_analyserOfSelectedCurveDefs; @@ -125,9 +141,6 @@ protected: bool m_selectMultipleVectors; - // Fields - caf::PdmChildArrayField m_analysisPlotDataSelection; - caf::PdmField m_selectedVarsUiField; caf::PdmField m_pushButtonSelectSummaryAddress; caf::PdmField m_timeStepFilter; @@ -141,5 +154,8 @@ protected: caf::PdmField m_axisValueFontSize; private: - RiaSummaryCurveDefinitionAnalyser* getOrCreateSelectedCurveDefAnalyser(); + caf::PdmChildArrayField m_dataSources; + caf::PdmField m_useCaseFilter; + caf::PdmPtrField m_curveSetForFiltering; + caf::PdmField m_editCaseFilter; }; diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp index d6fe4ef4fb..aabe3b0e46 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp @@ -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 activeCases = filterEnsembleCases( ensemble ); + std::vector caseValuesAtTimestep; std::vector 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 values; diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.h b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.h index d4de9db7d4..1c4a68dba0 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.h +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.h @@ -18,7 +18,8 @@ #pragma once -#include "RimCorrelationPlot.h" +#include "RimAbstractCorrelationPlot.h" + #include "cafAppEnum.h" #include diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp index c874cbb92c..6191e0df83 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp @@ -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 activeCases = filterEnsembleCases( ensemble ); + std::vector> correlations = - ensemble->parameterCorrelations( address, selectedTimestep, m_selectedParametersList() ); + ensemble->parameterCorrelations( address, selectedTimestep, m_selectedParametersList(), activeCases ); for ( auto parameterCorrPair : correlations ) { diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.h b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.h index c89805bc2d..bee98e0569 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.h +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.h @@ -21,7 +21,6 @@ #include "RiaSummaryCurveDefinition.h" // use of caf::Signal requires this include #include "RimAbstractCorrelationPlot.h" -#include "RimSummaryCaseCollection.h" #include "cafAppEnum.h" diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationReportPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationReportPlot.cpp index b1bbc50f09..63a5c1bc50 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationReportPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationReportPlot.cpp @@ -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(); } diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationReportPlot.h b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationReportPlot.h index 9f08d25762..04a98b5155 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationReportPlot.h +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationReportPlot.h @@ -17,7 +17,6 @@ ///////////////////////////////////////////////////////////////////////////////// #pragma once -#include "RimCorrelationPlot.h" #include "RimPlotWindow.h" #include "cafPdmChildField.h" diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp index f207d1c698..be24609ae9 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp @@ -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 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; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index 41291dc8e3..8de9d566fe 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -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(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h index a5a1748fdb..780cef25d4 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h @@ -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(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp index d573ade53b..9dbac1f867 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp @@ -541,9 +541,10 @@ time_t timeDiff( time_t lhs, time_t rhs ) /// //-------------------------------------------------------------------------------------------------- std::vector> - RimSummaryCaseCollection::parameterCorrelations( const RifEclipseSummaryAddress& address, - time_t timeStep, - const std::vector& selectedParameters ) const + RimSummaryCaseCollection::parameterCorrelations( const RifEclipseSummaryAddress& address, + time_t timeStep, + const std::vector& selectedParameters, + const std::set& selectedCases ) const { auto parameters = variationSortedEnsembleParameters( true ); @@ -568,6 +569,8 @@ std::vector> RifSummaryReaderInterface* reader = summaryCase->summaryReader(); if ( !reader ) continue; + if ( !selectedCases.empty() && selectedCases.count( summaryCase ) == 0 ) continue; + if ( !summaryCase->caseRealizationParameters() ) continue; std::vector values; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h index 5ba578cabb..935d90ca86 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h @@ -123,9 +123,11 @@ public: std::vector> correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address, time_t selectedTimeStep ) const; std::vector> - parameterCorrelations( const RifEclipseSummaryAddress& address, - time_t selectedTimeStep, - const std::vector& selectedParameters = {} ) const; + parameterCorrelations( const RifEclipseSummaryAddress& address, + time_t selectedTimeStep, + const std::vector& selectedParameters = {}, + const std::set& selectedCases = {} ) const; + std::vector> parameterCorrelationsAllTimeSteps( const RifEclipseSummaryAddress& address, const std::vector& selectedParameters = {} ) const;