From e292b8a297c90adf1cf65a899fc6596b4bec5b4f Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Mon, 21 Sep 2020 15:56:04 +0200 Subject: [PATCH] Better defaults for Correlation Cross Plots and shorten legend entries --- .../RimAbstractCorrelationPlot.h | 8 ++--- .../RimCorrelationPlotCollection.cpp | 29 +++++++++++++++-- .../RimParameterResultCrossPlot.cpp | 20 ++++++++++-- ApplicationCode/ProjectDataModel/RimPlot.cpp | 10 ------ ApplicationCode/ProjectDataModel/RimPlot.h | 8 ++++- .../Summary/RimEnsembleCurveSet.cpp | 8 +---- .../Summary/RimSummaryCaseCollection.cpp | 31 +++++++++++++++++++ .../Summary/RimSummaryCaseCollection.h | 4 +++ 8 files changed, 92 insertions(+), 26 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h index c075afa7cb..074a718b10 100644 --- a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h +++ b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h @@ -60,9 +60,10 @@ public: int axisTitleFontSize() const; int axisValueFontSize() const; - void setLabelFontSize( caf::FontTools::RelativeSize fontSize ); - void setAxisTitleFontSize( caf::FontTools::RelativeSize fontSize ); - void setAxisValueFontSize( caf::FontTools::RelativeSize fontSize ); + void setLabelFontSize( caf::FontTools::RelativeSize fontSize ); + void setAxisTitleFontSize( caf::FontTools::RelativeSize fontSize ); + void setAxisValueFontSize( caf::FontTools::RelativeSize fontSize ); + std::set allAvailableTimeSteps(); protected: // Overridden PDM methods @@ -76,7 +77,6 @@ protected: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; - std::set allAvailableTimeSteps(); RiaSummaryCurveDefinitionAnalyser* getOrCreateSelectedCurveDefAnalyser(); std::set addresses(); diff --git a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp index b69b26600d..1fa89ab0db 100644 --- a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp @@ -270,16 +270,26 @@ void RimCorrelationPlotCollection::applyEnsembleFieldAndTimeStepToPlot( RimAbstr { std::set allAddresses = ensemble->ensembleSummaryAddresses(); std::vector curveDefs; + std::vector highestCorrelationParameters; for ( auto address : allAddresses ) { auto it = std::find( quantityNames.begin(), quantityNames.end(), QString::fromStdString( address.uiText() ) ); if ( it != quantityNames.end() || quantityNames.empty() ) { curveDefs.push_back( RiaSummaryCurveDefinition( ensemble, address ) ); + auto correlationSortedEnsembleParameters = + ensemble->correlationSortedEnsembleParameters( address, timeStep ); + highestCorrelationParameters.push_back( correlationSortedEnsembleParameters.front().first.name ); } } plot->setCurveDefinitions( curveDefs ); plot->setTimeStep( timeStep ); + + auto crossPlot = dynamic_cast( plot ); + if ( crossPlot && !highestCorrelationParameters.empty() ) + { + crossPlot->setEnsembleParameter( highestCorrelationParameters.front() ); + } } } @@ -317,7 +327,17 @@ void RimCorrelationPlotCollection::applyFirstEnsembleFieldAddressesToReport( Rim plot->matrixPlot()->setCurveDefinitions( curveDefsMatrix ); plot->correlationPlot()->setCurveDefinitions( curveDefsTornadoAndCrossPlot ); plot->crossPlot()->setCurveDefinitions( curveDefsTornadoAndCrossPlot ); - plot->crossPlot()->setEnsembleParameter( ensembles.front()->variationSortedEnsembleParameters().front().name ); + + time_t timeStep = *( plot->matrixPlot()->allAvailableTimeSteps().rbegin() ); + auto correlationSortedEnsembleParameters = + ensembles.front()->correlationSortedEnsembleParameters( curveDefsTornadoAndCrossPlot.front().summaryAddress(), + timeStep ); + if ( !correlationSortedEnsembleParameters.empty() ) + { + QString crossPlotEnsembleParameterName = correlationSortedEnsembleParameters.front().first.name; + plot->crossPlot()->setEnsembleParameter( crossPlotEnsembleParameterName ); + } + plot->matrixPlot()->setTimeStep( timeStep ); } } @@ -351,12 +371,17 @@ void RimCorrelationPlotCollection::applyEnsembleFieldAndTimeStepToReport( RimCor curveDefsTornadoAndCrossPlot.push_back( RiaSummaryCurveDefinition( ensemble, address ) ); } } + plot->matrixPlot()->setCurveDefinitions( curveDefsMatrix ); plot->matrixPlot()->setTimeStep( timeStep ); plot->correlationPlot()->setCurveDefinitions( curveDefsTornadoAndCrossPlot ); plot->correlationPlot()->setTimeStep( timeStep ); plot->crossPlot()->setCurveDefinitions( curveDefsTornadoAndCrossPlot ); plot->crossPlot()->setTimeStep( timeStep ); - plot->crossPlot()->setEnsembleParameter( ensemble->variationSortedEnsembleParameters().front().name ); + + auto correlationSortedEnsembleParameters = + ensemble->correlationSortedEnsembleParameters( curveDefsTornadoAndCrossPlot.front().summaryAddress(), timeStep ); + QString crossPlotEnsembleParameterName = correlationSortedEnsembleParameters.front().first.name; + plot->crossPlot()->setEnsembleParameter( crossPlotEnsembleParameterName ); } } diff --git a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp index 9bad9a16a8..9bf225057b 100644 --- a/ApplicationCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp +++ b/ApplicationCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp @@ -22,6 +22,8 @@ #include "RiaPreferences.h" #include "RiaQDateTimeTools.h" #include "RiaStatisticsTools.h" +#include "RiaTextStringTools.h" + #include "RiuPlotMainWindowTools.h" #include "RiuSummaryQwtPlot.h" #include "RiuSummaryVectorSelectionDialog.h" @@ -30,6 +32,7 @@ #include "RimDerivedSummaryCase.h" #include "RimEnsembleCurveSet.h" +#include "RimMultiPlot.h" #include "RimPlotAxisProperties.h" #include "RimPlotAxisPropertiesInterface.h" #include "RimPlotDataFilterCollection.h" @@ -166,7 +169,7 @@ void RimParameterResultCrossPlot::onLoadDataAndUpdate() if ( m_plotWidget && m_analyserOfSelectedCurveDefs ) { createPoints(); - if ( m_showPlotLegends && !isSubPlot() ) + if ( m_showPlotLegends && !isSubPlot() ) { QwtLegend* legend = new QwtLegend( m_plotWidget ); m_plotWidget->insertLegend( legend, QwtPlot::RightLegend ); @@ -231,6 +234,19 @@ void RimParameterResultCrossPlot::createPoints() EnsembleParameter parameter = ensembleParameter( m_ensembleParameter ); if ( !( parameter.isNumeric() && parameter.isValid() ) ) return; + QStringList caseNames; + for ( size_t caseIdx = 0u; caseIdx < ensemble->allSummaryCases().size(); ++caseIdx ) + { + auto summaryCase = ensemble->allSummaryCases()[caseIdx]; + + RifSummaryReaderInterface* reader = summaryCase->summaryReader(); + if ( !reader ) continue; + + if ( !summaryCase->caseRealizationParameters() ) continue; + caseNames.push_back( summaryCase->displayCaseName() ); + } + QString commonCaseRoot = RiaTextStringTools::findCommonRoot( caseNames ); + for ( size_t caseIdx = 0u; caseIdx < ensemble->allSummaryCases().size(); ++caseIdx ) { auto summaryCase = ensemble->allSummaryCases()[caseIdx]; @@ -281,7 +297,7 @@ void RimParameterResultCrossPlot::createPoints() plotCurve->setSymbol( symbol ); QStringList curveName; if ( showEnsembleName ) curveName += ensemble->name(); - curveName += summaryCase->displayCaseName(); + curveName += summaryCase->displayCaseName().replace( commonCaseRoot, "" ); if ( showAddressName ) curveName += QString::fromStdString( address.uiText() ); plotCurve->setTitle( curveName.join( " - " ) ); diff --git a/ApplicationCode/ProjectDataModel/RimPlot.cpp b/ApplicationCode/ProjectDataModel/RimPlot.cpp index 13290b4681..592a07b5b5 100644 --- a/ApplicationCode/ProjectDataModel/RimPlot.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlot.cpp @@ -282,13 +282,3 @@ void RimPlot::onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, { loadDataAndUpdate(); } - -//-------------------------------------------------------------------------------------------------- -/// Is this inside another plot window? -//-------------------------------------------------------------------------------------------------- -bool RimPlot::isSubPlot() const -{ - RimPlotWindow* parentPlotWindow = nullptr; - firstAncestorOfType( parentPlotWindow ); - return parentPlotWindow != nullptr; -} diff --git a/ApplicationCode/ProjectDataModel/RimPlot.h b/ApplicationCode/ProjectDataModel/RimPlot.h index f0fccf83fd..42284056e7 100644 --- a/ApplicationCode/ProjectDataModel/RimPlot.h +++ b/ApplicationCode/ProjectDataModel/RimPlot.h @@ -91,7 +91,13 @@ public: void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, std::vector& referringObjects ) override; - bool isSubPlot() const; + template + bool isSubPlot() const + { + PlotWindowType* parentPlotWindow = nullptr; + firstAncestorOfType( parentPlotWindow ); + return parentPlotWindow != nullptr; + } protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index d8e3c6d397..8d36d3e44f 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -1131,13 +1131,7 @@ std::vector> RimEnsembleCurveSet::correlati RimSummaryCaseCollection* ensemble = m_yValuesSummaryCaseCollection; if ( ensemble ) { - auto parameters = ensemble->parameterCorrelationsAllTimeSteps( summaryAddress() ); - std::sort( parameters.begin(), - parameters.end(), - []( const std::pair& lhs, const std::pair& rhs ) { - return std::abs( lhs.second ) > std::abs( rhs.second ); - } ); - return parameters; + return ensemble->correlationSortedEnsembleParameters( summaryAddress() ); } else { diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp index 66988341d7..eeed689513 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp @@ -473,6 +473,37 @@ const std::vector& return m_cachedSortedEnsembleParameters; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector> + RimSummaryCaseCollection::correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address ) const +{ + auto parameters = parameterCorrelationsAllTimeSteps( address ); + std::sort( parameters.begin(), + parameters.end(), + []( const std::pair& lhs, const std::pair& rhs ) { + return std::abs( lhs.second ) > std::abs( rhs.second ); + } ); + return parameters; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector> + RimSummaryCaseCollection::correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address, + time_t selectedTimeStep ) const +{ + auto parameters = parameterCorrelations( address, selectedTimeStep ); + std::sort( parameters.begin(), + parameters.end(), + []( const std::pair& lhs, const std::pair& rhs ) { + return std::abs( lhs.second ) > std::abs( rhs.second ); + } ); + return parameters; +} + time_t timeDiff( time_t lhs, time_t rhs ) { if ( lhs >= rhs ) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h index 9792b31e74..cb54e20dd3 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h @@ -115,6 +115,10 @@ public: int ensembleId() const; const std::vector& variationSortedEnsembleParameters( bool excludeNoVariation = false ) const; + std::vector> + correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address ) const; + std::vector> + correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address, time_t selectedTimeStep ) const; std::vector> parameterCorrelations( const RifEclipseSummaryAddress& address, time_t selectedTimeStep,