#6201 Select parameters that go into matrix plot

This commit is contained in:
Gaute Lindkvist 2020-07-27 14:56:32 +02:00
parent a9b6c1bd7b
commit ad59f79dea
7 changed files with 119 additions and 35 deletions

View File

@ -285,6 +285,23 @@ std::set<EnsembleParameter> RimAbstractCorrelationPlot::ensembleParameters()
return ensembleParms;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::set<EnsembleParameter> RimAbstractCorrelationPlot::variationSortedEnsembleParameters()
{
std::set<EnsembleParameter> ensembleParms;
RiaSummaryCurveDefinitionAnalyser* analyserOfSelectedCurveDefs = getOrCreateSelectedCurveDefAnalyser();
for ( RimSummaryCaseCollection* ensemble : analyserOfSelectedCurveDefs->m_ensembles )
{
std::vector<EnsembleParameter> parameters = ensemble->variationSortedEnsembleParameters();
ensembleParms.insert( parameters.begin(), parameters.end() );
}
return ensembleParms;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -73,6 +73,7 @@ protected:
std::set<RifEclipseSummaryAddress> addresses();
std::set<EnsembleParameter> ensembleParameters();
std::set<EnsembleParameter> variationSortedEnsembleParameters();
EnsembleParameter ensembleParameter( const QString& ensembleParameterName );
// RimViewWindow overrides

View File

@ -41,6 +41,7 @@
#include "cafPdmUiComboBoxEditor.h"
#include "cafPdmUiTreeOrdering.h"
#include "cafPdmUiTreeSelectionEditor.h"
#include "cvfScalarMapper.h"
@ -164,6 +165,10 @@ RimCorrelationMatrixPlot::RimCorrelationMatrixPlot()
CAF_PDM_InitField( &m_showOnlyTopNCorrelations, "ShowOnlyTopNCorrelations", false, "Show Only Top Correlations", "", "", "" );
CAF_PDM_InitField( &m_topNFilterCount, "TopNFilterCount", (size_t)15, "Number rows/columns", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendConfig", "", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_selectedParametersList, "SelectedParameters", "Select Parameters", "", "", "" );
m_selectedParametersList.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP );
m_selectedParametersList.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() );
m_legendConfig = new RimRegularLegendConfig();
m_legendConfig->setAutomaticRanges( -1.0, 1.0, -1.0, 1.0 );
m_legendConfig->setColorLegend( RimRegularLegendConfig::mapToColorLegend( RimRegularLegendConfig::CORRELATION ) );
@ -214,6 +219,22 @@ RimRegularLegendConfig* RimCorrelationMatrixPlot::legendConfig()
return m_legendConfig();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimCorrelationMatrixPlot::selectAllParameters()
{
m_selectedParametersList.v().clear();
std::set<EnsembleParameter> params = variationSortedEnsembleParameters();
for ( auto param : params )
{
if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION )
{
m_selectedParametersList.v().push_back( param.name );
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -224,11 +245,16 @@ void RimCorrelationMatrixPlot::fieldChangedByUi( const caf::PdmFieldHandle* chan
RimAbstractCorrelationPlot::fieldChangedByUi( changedField, oldValue, newValue );
if ( changedField == &m_correlationFactor || changedField == &m_showAbsoluteValues ||
changedField == &m_sortByValues || changedField == &m_sortByAbsoluteValues ||
changedField == &m_showOnlyTopNCorrelations || changedField == &m_topNFilterCount )
changedField == &m_showOnlyTopNCorrelations || changedField == &m_topNFilterCount ||
changedField == &m_excludeParametersWithoutVariation || changedField == &m_selectedParametersList )
{
this->updateLegend();
this->loadDataAndUpdate();
this->updateConnectedEditors();
if ( changedField == &m_excludeParametersWithoutVariation )
{
selectAllParameters();
}
updateLegend();
loadDataAndUpdate();
updateConnectedEditors();
}
}
@ -240,6 +266,7 @@ void RimCorrelationMatrixPlot::defineUiOrdering( QString uiConfigName, caf::PdmU
caf::PdmUiGroup* correlationGroup = uiOrdering.addNewGroup( "Correlation Factor Settings" );
correlationGroup->add( &m_correlationFactor );
correlationGroup->add( &m_excludeParametersWithoutVariation );
correlationGroup->add( &m_selectedParametersList );
correlationGroup->add( &m_showAbsoluteValues );
correlationGroup->add( &m_sortByValues );
if ( !m_showAbsoluteValues() && m_sortByValues() != Sorting::NO_SORTING )
@ -290,6 +317,17 @@ QList<caf::PdmOptionItemInfo>
QList<caf::PdmOptionItemInfo> options =
RimAbstractCorrelationPlot::calculateValueOptions( fieldNeedingOptions, useOptionsOnly );
if ( fieldNeedingOptions == &m_selectedParametersList )
{
std::set<EnsembleParameter> params = variationSortedEnsembleParameters();
for ( auto param : params )
{
if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION )
{
options.push_back( caf::PdmOptionItemInfo( param.uiName(), param.name ) );
}
}
}
return options;
}
@ -439,26 +477,32 @@ void RimCorrelationMatrixPlot::createMatrix()
std::vector<CorrelationMatrixColumn> correlationMatrixColumns;
for ( EnsembleParameter parameter : ensembleParameters() )
for ( QString paramName : m_selectedParametersList() )
{
if ( parameter.isNumeric() && parameter.isValid() &&
( !m_excludeParametersWithoutVariation || parameter.normalizedStdDeviation() > 1.0e-5 ) )
EnsembleParameter parameter;
bool anyValidResults = false;
std::vector<double> correlations;
std::vector<RiaSummaryCurveDefinition> selectedCurveDefs;
for ( auto curveDef : curveDefs )
{
bool anyValidResults = false;
std::vector<double> correlations;
std::vector<RiaSummaryCurveDefinition> selectedCurveDefs;
auto ensemble = curveDef.ensemble();
auto address = curveDef.summaryAddress();
for ( auto curveDef : curveDefs )
if ( ensemble )
{
double correlation = std::numeric_limits<double>::infinity();
std::vector<double> caseValuesAtTimestep;
std::vector<double> parameterValues;
auto ensemble = curveDef.ensemble();
auto address = curveDef.summaryAddress();
if ( ensemble )
if ( !parameter.isValid() )
{
std::vector<double> caseValuesAtTimestep;
std::vector<double> parameterValues;
parameter = ensemble->ensembleParameter( paramName );
}
if ( parameter.isValid() )
{
double correlation = std::numeric_limits<double>::infinity();
for ( size_t caseIdx = 0u; caseIdx < ensemble->allSummaryCases().size(); ++caseIdx )
{
@ -508,15 +552,15 @@ void RimCorrelationMatrixPlot::createMatrix()
if ( m_showAbsoluteValues() ) correlation = std::abs( correlation );
anyValidResults = true;
}
correlations.push_back( correlation );
selectedCurveDefs.push_back( curveDef );
}
correlations.push_back( correlation );
selectedCurveDefs.push_back( curveDef );
}
if ( anyValidResults )
{
correlationMatrixColumns.push_back( CorrelationMatrixColumn( parameter, correlations, selectedCurveDefs ) );
}
}
if ( anyValidResults )
{
correlationMatrixColumns.push_back( CorrelationMatrixColumn( parameter, correlations, selectedCurveDefs ) );
}
}
eraseInvalidEntries( correlationMatrixColumns );

View File

@ -57,6 +57,7 @@ public:
bool showAbsoluteValues() const;
bool sortByAbsoluteValues() const;
RimRegularLegendConfig* legendConfig();
void selectAllParameters();
signals:
void matrixCellSelected( const EnsembleParameter&, const RiaSummaryCurveDefinition& );
@ -90,6 +91,7 @@ private:
caf::PdmField<bool> m_excludeParametersWithoutVariation;
caf::PdmField<bool> m_showOnlyTopNCorrelations;
caf::PdmField<size_t> m_topNFilterCount;
caf::PdmField<std::vector<QString>> m_selectedParametersList;
caf::PdmChildField<RimRegularLegendConfig*> m_legendConfig;

View File

@ -71,6 +71,7 @@ RimCorrelationMatrixPlot* RimCorrelationPlotCollection::createCorrelationMatrixP
RimCorrelationMatrixPlot* plot = new RimCorrelationMatrixPlot();
plot->setAsPlotMdiWindow();
if ( defaultToFirstEnsembleField ) applyFirstEnsembleFieldAddressesToPlot( plot );
plot->selectAllParameters();
m_correlationPlots.push_back( plot );
@ -99,7 +100,7 @@ RimCorrelationReportPlot*
RimCorrelationReportPlot* report = new RimCorrelationReportPlot;
report->setAsPlotMdiWindow();
if ( defaultToFirstEnsembleFopt ) applyFirstEnsembleFieldAddressesToReport( report, "FOPT" );
report->matrixPlot()->selectAllParameters();
m_correlationReports.push_back( report );
return report;
}

View File

@ -104,14 +104,19 @@ bool EnsembleParameter::operator<( const EnsembleParameter& other ) const
//--------------------------------------------------------------------------------------------------
void RimSummaryCaseCollection::sortByBinnedVariation( std::vector<EnsembleParameter>& parameterVector )
{
double minStdDev = std::numeric_limits<double>::infinity();
double maxStdDev = 0.0;
const double eps = 1.0e-8;
double minStdDev = std::numeric_limits<double>::infinity();
double maxStdDev = 0.0;
for ( const auto& paramPair : parameterVector )
{
minStdDev = std::min( minStdDev, paramPair.normalizedStdDeviation() );
maxStdDev = std::max( maxStdDev, paramPair.normalizedStdDeviation() );
double stdDev = paramPair.normalizedStdDeviation();
if ( stdDev > eps )
{
minStdDev = std::min( minStdDev, stdDev );
maxStdDev = std::max( maxStdDev, stdDev );
}
}
if ( ( maxStdDev - minStdDev ) < 1.0e-8 )
if ( ( maxStdDev - minStdDev ) <= eps )
{
return;
}
@ -119,6 +124,7 @@ void RimSummaryCaseCollection::sortByBinnedVariation( std::vector<EnsembleParame
double delta = ( maxStdDev - minStdDev ) / EnsembleParameter::NR_OF_VARIATION_BINS;
std::vector<double> bins;
bins.push_back( eps );
for ( int i = 0; i < EnsembleParameter::NR_OF_VARIATION_BINS - 1; ++i )
{
bins.push_back( minStdDev + ( i + 1 ) * delta );
@ -126,7 +132,7 @@ void RimSummaryCaseCollection::sortByBinnedVariation( std::vector<EnsembleParame
for ( EnsembleParameter& nameParamPair : parameterVector )
{
int binNumber = 0;
int binNumber = -1;
for ( double bin : bins )
{
if ( nameParamPair.normalizedStdDeviation() >= bin )
@ -157,9 +163,14 @@ QString EnsembleParameter::uiName() const
{
switch ( variationBin )
{
case NO_VARIATION:
variationString = QString( " (No variation)" );
break;
case LOW_VARIATION:
variationString = QString( " (Low variation)" );
break;
case MEDIUM_VARIATION:
variationString = QString( " (Medium variation)" );
break;
case HIGH_VARIATION:
variationString = QString( " (High variation)" );
@ -421,8 +432,11 @@ RifReaderRftInterface* RimSummaryCaseCollection::rftStatisticsReader()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std::vector<EnsembleParameter>& RimSummaryCaseCollection::variationSortedEnsembleParameters() const
const std::vector<EnsembleParameter>&
RimSummaryCaseCollection::variationSortedEnsembleParameters( bool excludeNoVariation ) const
{
const double eps = 1.0e-8;
if ( m_cachedSortedEnsembleParameters.size() ) return m_cachedSortedEnsembleParameters;
std::set<QString> paramSet;
@ -441,7 +455,11 @@ const std::vector<EnsembleParameter>& RimSummaryCaseCollection::variationSortedE
m_cachedSortedEnsembleParameters.reserve( paramSet.size() );
for ( const QString& parameterName : paramSet )
{
m_cachedSortedEnsembleParameters.push_back( this->createEnsembleParameter( parameterName ) );
auto ensembleParameter = this->createEnsembleParameter( parameterName );
if ( !excludeNoVariation || ensembleParameter.normalizedStdDeviation() > eps )
{
m_cachedSortedEnsembleParameters.push_back( ensembleParameter );
}
}
RimSummaryCaseCollection::sortByBinnedVariation( m_cachedSortedEnsembleParameters );

View File

@ -51,7 +51,8 @@ public:
};
enum Bins
{
LOW_VARIATION,
NO_VARIATION = -1,
LOW_VARIATION = 0,
MEDIUM_VARIATION,
HIGH_VARIATION,
NR_OF_VARIATION_BINS
@ -109,7 +110,7 @@ public:
void setEnsembleId( int ensembleId );
int ensembleId() const;
const std::vector<EnsembleParameter>& variationSortedEnsembleParameters() const;
const std::vector<EnsembleParameter>& variationSortedEnsembleParameters( bool excludeNoVariation = false ) const;
std::vector<EnsembleParameter> alphabeticEnsembleParameters() const;
EnsembleParameter ensembleParameter( const QString& paramName ) const;