From f31aecf50701d6797b0ac4e92e561c060044350b Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Mon, 31 May 2021 11:00:23 +0200 Subject: [PATCH] Refactor: extract EnsembleParameter into separate file. --- .../AnalysisPlots/RimAnalysisPlot.cpp | 16 +- .../AnalysisPlots/RimAnalysisPlot.h | 6 +- .../AnalysisPlots/RimPlotDataFilterItem.cpp | 14 +- .../AnalysisPlots/RimPlotDataFilterItem.h | 4 +- .../RimAbstractCorrelationPlot.cpp | 20 +-- .../RimAbstractCorrelationPlot.h | 8 +- .../RimCorrelationMatrixPlot.cpp | 12 +- .../CorrelationPlots/RimCorrelationPlot.cpp | 10 +- .../RimParameterResultCrossPlot.cpp | 4 +- .../Flow/RimWellRftEnsembleCurveSet.cpp | 4 +- .../Flow/RimWellRftEnsembleCurveSet.h | 8 +- .../Summary/RimEnsembleCurveFilter.cpp | 6 +- .../Summary/RimEnsembleCurveFilter.h | 6 +- .../Summary/RimEnsembleCurveSet.cpp | 16 +- .../Summary/RimEnsembleCurveSet.h | 16 +- .../RimEnsembleCurveSetColorManager.cpp | 6 +- .../Summary/RimEnsembleCurveSetColorManager.h | 6 +- .../Summary/RimSummaryCaseCollection.cpp | 152 ++++-------------- .../Summary/RimSummaryCaseCollection.h | 73 ++------- .../ReservoirDataModel/CMakeLists_files.cmake | 2 + .../RigEnsembleParameter.cpp | 108 +++++++++++++ .../ReservoirDataModel/RigEnsembleParameter.h | 74 +++++++++ .../RimSummaryCaseCollection-Test.cpp | 19 +-- .../UserInterface/RiuSummaryQwtPlot.cpp | 6 +- 24 files changed, 331 insertions(+), 265 deletions(-) create mode 100644 ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.cpp create mode 100644 ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.h diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp index 12b7521859..65048e9f08 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp @@ -250,9 +250,9 @@ std::set RimAnalysisPlot::unfilteredAddresses() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RimAnalysisPlot::ensembleParameters() +std::set RimAnalysisPlot::ensembleParameters() { - std::set ensembleParms; + std::set ensembleParms; RiaSummaryCurveDefinitionAnalyser* analyserOfSelectedCurveDefs = getOrCreateSelectedCurveDefAnalyser(); @@ -268,7 +268,7 @@ std::set RimAnalysisPlot::ensembleParameters() for ( RimSummaryCaseCollection* ensemble : ensembles ) { - std::vector parameters = ensemble->variationSortedEnsembleParameters(); + std::vector parameters = ensemble->variationSortedEnsembleParameters(); ensembleParms.insert( parameters.begin(), parameters.end() ); } @@ -278,15 +278,15 @@ std::set RimAnalysisPlot::ensembleParameters() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimAnalysisPlot::ensembleParameter( const QString& ensembleParameterName ) +RigEnsembleParameter RimAnalysisPlot::ensembleParameter( const QString& ensembleParameterName ) { - std::set ensembleParms = ensembleParameters(); - for ( const EnsembleParameter& eParam : ensembleParms ) + std::set ensembleParms = ensembleParameters(); + for ( const RigEnsembleParameter& eParam : ensembleParms ) { if ( eParam.name == ensembleParameterName ) return eParam; } - return EnsembleParameter(); + return RigEnsembleParameter(); } //-------------------------------------------------------------------------------------------------- @@ -1095,7 +1095,7 @@ void RimAnalysisPlot::applyFilter( const RimPlotDataFilterItem* filter, { sumItemsToKeep = ( *filteredSummaryItems ); // Not filtering items - EnsembleParameter eParam = this->ensembleParameter( filter->ensembleParameterName() ); + RigEnsembleParameter eParam = this->ensembleParameter( filter->ensembleParameterName() ); for ( auto sumCase : ( *filteredSumCases ) ) { diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h index 0803d91d08..31cdff91d5 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h @@ -23,6 +23,8 @@ #include "RimSummaryCaseCollection.h" #include "RimTimeStepFilter.h" +#include "RigEnsembleParameter.h" + #include "cafPdmPtrField.h" #include @@ -81,8 +83,8 @@ public: void setTimeSteps( const std::vector& timeSteps ); std::set unfilteredAddresses(); - std::set ensembleParameters(); - EnsembleParameter ensembleParameter( const QString& ensembleParameterName ); + std::set ensembleParameters(); + RigEnsembleParameter ensembleParameter( const QString& ensembleParameterName ); void maxMinValueFromAddress( const RifEclipseSummaryAddress& address, RimPlotDataFilterItem::TimeStepSourceType timeStepSourceType, diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.cpp b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.cpp index 05c8babb82..2b7d382f7b 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.cpp +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.cpp @@ -298,8 +298,8 @@ QList { if ( m_filterTarget() == ENSEMBLE_CASE ) { - std::set ensembleParams = parentPlot->ensembleParameters(); - for ( const EnsembleParameter& ensParam : ensembleParams ) + std::set ensembleParams = parentPlot->ensembleParameters(); + for ( const RigEnsembleParameter& ensParam : ensembleParams ) { options.push_back( caf::PdmOptionItemInfo( ensParam.uiName(), ensParam.name ) ); } @@ -307,7 +307,7 @@ QList } else if ( fieldNeedingOptions == &m_ensembleParameterValueCategories ) { - EnsembleParameter eParm = selectedEnsembleParameter(); + RigEnsembleParameter eParm = selectedEnsembleParameter(); if ( eParm.isText() ) { for ( const auto& val : eParm.values ) @@ -359,7 +359,7 @@ void RimPlotDataFilterItem::defineUiOrdering( QString uiConfigName, caf::PdmUiOr } } - EnsembleParameter eParm; + RigEnsembleParameter eParm; if ( m_filterTarget() == ENSEMBLE_CASE ) { eParm = selectedEnsembleParameter(); @@ -430,14 +430,14 @@ void RimPlotDataFilterItem::updateMaxMinAndDefaultValues( bool forceDefault ) { if ( !selectedEnsembleParameter().isValid() ) { - std::set ensembleParams = parentPlot->ensembleParameters(); + std::set ensembleParams = parentPlot->ensembleParameters(); if ( !ensembleParams.empty() ) { m_filterEnsembleParameter = ensembleParams.begin()->name; } } - EnsembleParameter eParam = selectedEnsembleParameter(); + RigEnsembleParameter eParam = selectedEnsembleParameter(); if ( eParam.isValid() && eParam.isNumeric() ) { if ( RiaCurveDataTools::isValidValue( eParam.minValue, false ) ) @@ -475,7 +475,7 @@ void RimPlotDataFilterItem::updateMaxMinAndDefaultValues( bool forceDefault ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimPlotDataFilterItem::selectedEnsembleParameter() const +RigEnsembleParameter RimPlotDataFilterItem::selectedEnsembleParameter() const { RimAnalysisPlot* parentPlot; this->firstAncestorOrThisOfTypeAsserted( parentPlot ); diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.h b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.h index ed4fecbeb9..a145ebf03a 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.h +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.h @@ -26,7 +26,7 @@ #include "RifEclipseSummaryAddress.h" #include "RifEclipseSummaryAddressQMetaType.h" -#include "RimSummaryCaseCollection.h" +#include "RigEnsembleParameter.h" #include @@ -116,7 +116,7 @@ private: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; - EnsembleParameter selectedEnsembleParameter() const; + RigEnsembleParameter selectedEnsembleParameter() const; caf::PdmField m_isActive; diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp index ed158996b7..fa23d13bbd 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp @@ -469,15 +469,15 @@ void RimAbstractCorrelationPlot::setCaseFilterDataSource( RimEnsembleCurveSet* e //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RimAbstractCorrelationPlot::ensembleParameters() +std::set RimAbstractCorrelationPlot::ensembleParameters() { - std::set ensembleParms; + std::set ensembleParms; RiaSummaryCurveDefinitionAnalyser* analyserOfSelectedCurveDefs = getOrCreateSelectedCurveDefAnalyser(); for ( RimSummaryCaseCollection* ensemble : analyserOfSelectedCurveDefs->m_ensembles ) { - std::vector parameters = ensemble->alphabeticEnsembleParameters(); + std::vector parameters = ensemble->alphabeticEnsembleParameters(); ensembleParms.insert( parameters.begin(), parameters.end() ); } return ensembleParms; @@ -486,15 +486,15 @@ std::set RimAbstractCorrelationPlot::ensembleParameters() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RimAbstractCorrelationPlot::variationSortedEnsembleParameters() +std::set RimAbstractCorrelationPlot::variationSortedEnsembleParameters() { - std::set ensembleParms; + std::set ensembleParms; RiaSummaryCurveDefinitionAnalyser* analyserOfSelectedCurveDefs = getOrCreateSelectedCurveDefAnalyser(); for ( RimSummaryCaseCollection* ensemble : analyserOfSelectedCurveDefs->m_ensembles ) { - std::vector parameters = ensemble->variationSortedEnsembleParameters(); + std::vector parameters = ensemble->variationSortedEnsembleParameters(); ensembleParms.insert( parameters.begin(), parameters.end() ); } return ensembleParms; @@ -503,15 +503,15 @@ std::set RimAbstractCorrelationPlot::variationSortedEnsembleP //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimAbstractCorrelationPlot::ensembleParameter( const QString& ensembleParameterName ) +RigEnsembleParameter RimAbstractCorrelationPlot::ensembleParameter( const QString& ensembleParameterName ) { - std::set ensembleParms = ensembleParameters(); - for ( const EnsembleParameter& eParam : ensembleParms ) + std::set ensembleParms = ensembleParameters(); + for ( const RigEnsembleParameter& eParam : ensembleParms ) { if ( eParam.name == ensembleParameterName ) return eParam; } - return EnsembleParameter(); + return RigEnsembleParameter(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h index 374e0a203c..665ac9920e 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h @@ -34,7 +34,7 @@ class RimSummaryAddress; class RimEnsembleCurveSet; class RimSummaryCaseCollection; class RimSummaryCase; -class EnsembleParameter; +class RigEnsembleParameter; class RifEclipseSummaryAddress; class RimAbstractCorrelationPlot : public RimPlot @@ -88,9 +88,9 @@ protected: bool* useOptionsOnly ) override; std::set addresses(); - std::set ensembleParameters(); - std::set variationSortedEnsembleParameters(); - EnsembleParameter ensembleParameter( const QString& ensembleParameterName ); + std::set ensembleParameters(); + std::set variationSortedEnsembleParameters(); + RigEnsembleParameter ensembleParameter( const QString& ensembleParameterName ); // RimViewWindow overrides QWidget* viewWidget() override; diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp index 642e7fb418..54ced906b9 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp @@ -30,6 +30,8 @@ #include "RifSummaryReaderInterface.h" +#include "RigEnsembleParameter.h" + #include "RimDerivedSummaryCase.h" #include "RimEnsembleCurveSet.h" #include "RimPlotAxisProperties.h" @@ -221,10 +223,10 @@ RimRegularLegendConfig* RimCorrelationMatrixPlot::legendConfig() void RimCorrelationMatrixPlot::selectAllParameters() { m_selectedParametersList.v().clear(); - std::set params = variationSortedEnsembleParameters(); + std::set params = variationSortedEnsembleParameters(); for ( auto param : params ) { - if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION ) + if ( !m_excludeParametersWithoutVariation() || param.variationBin > RigEnsembleParameter::NO_VARIATION ) { m_selectedParametersList.v().push_back( param.name ); } @@ -347,10 +349,10 @@ QList if ( fieldNeedingOptions == &m_selectedParametersList ) { - std::set params = variationSortedEnsembleParameters(); + std::set params = variationSortedEnsembleParameters(); for ( auto param : params ) { - if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION ) + if ( !m_excludeParametersWithoutVariation() || param.variationBin > RigEnsembleParameter::NO_VARIATION ) { options.push_back( caf::PdmOptionItemInfo( param.uiName(), param.name ) ); } @@ -522,7 +524,7 @@ void RimCorrelationMatrixPlot::createMatrix() std::vector caseValuesAtTimestep; std::vector parameterValues; - EnsembleParameter parameter = ensemble->ensembleParameter( paramName ); + RigEnsembleParameter parameter = ensemble->ensembleParameter( paramName ); if ( parameter.isValid() ) { diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp index 6191e0df83..bc7ab92030 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp @@ -156,10 +156,10 @@ QList RimCorrelationPlot::calculateValueOptions( const c if ( fieldNeedingOptions == &m_selectedParametersList ) { - std::set params = variationSortedEnsembleParameters(); + std::set params = variationSortedEnsembleParameters(); for ( auto param : params ) { - if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION ) + if ( !m_excludeParametersWithoutVariation() || param.variationBin > RigEnsembleParameter::NO_VARIATION ) { options.push_back( caf::PdmOptionItemInfo( param.uiName(), param.name ) ); } @@ -242,7 +242,7 @@ void RimCorrelationPlot::addDataToChartBuilder( RiuGroupedBarChartBuilder& chart std::set activeCases = filterEnsembleCases( ensemble ); - std::vector> correlations = + std::vector> correlations = ensemble->parameterCorrelations( address, selectedTimestep, m_selectedParametersList(), activeCases ); for ( auto parameterCorrPair : correlations ) @@ -332,10 +332,10 @@ void RimCorrelationPlot::setSortByAbsoluteValues( bool sortByAbsoluteValues ) void RimCorrelationPlot::selectAllParameters() { m_selectedParametersList.v().clear(); - std::set params = variationSortedEnsembleParameters(); + std::set params = variationSortedEnsembleParameters(); for ( auto param : params ) { - if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION ) + if ( !m_excludeParametersWithoutVariation() || param.variationBin > RigEnsembleParameter::NO_VARIATION ) { m_selectedParametersList.v().push_back( param.name ); } diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp index be24609ae9..f557be7172 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp @@ -26,6 +26,8 @@ #include "RifSummaryReaderInterface.h" +#include "RigEnsembleParameter.h" + #include "RimDerivedSummaryCase.h" #include "RimEnsembleCurveSet.h" #include "RimMultiPlot.h" @@ -244,7 +246,7 @@ void RimParameterResultCrossPlot::createPoints() int addressIdx = 0; for ( auto address : addresses() ) { - EnsembleParameter parameter = ensembleParameter( m_ensembleParameter ); + RigEnsembleParameter parameter = ensembleParameter( m_ensembleParameter ); if ( !( parameter.isNumeric() && parameter.isValid() ) ) return; QStringList caseNames = caseNamesOfValidEnsembleCases( ensemble ); diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp index 45c84bed98..6a66cdb702 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp @@ -159,7 +159,7 @@ RimRegularLegendConfig* RimWellRftEnsembleCurveSet::legendConfig() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter::Type RimWellRftEnsembleCurveSet::currentEnsembleParameterType() const +RigEnsembleParameter::Type RimWellRftEnsembleCurveSet::currentEnsembleParameterType() const { if ( m_ensembleColorMode() == ColorMode::BY_ENSEMBLE_PARAM ) { @@ -172,7 +172,7 @@ EnsembleParameter::Type RimWellRftEnsembleCurveSet::currentEnsembleParameterType return eParam.type; } } - return EnsembleParameter::TYPE_NONE; + return RigEnsembleParameter::TYPE_NONE; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h index 0ccf87b507..b50f2a7136 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h @@ -21,6 +21,8 @@ #include "RimEnsembleCurveSetColorManager.h" #include "RimSummaryCaseCollection.h" +#include "RigEnsembleParameter.h" + #include "cafPdmChildField.h" #include "cafPdmObject.h" #include "cafPdmProxyValueField.h" @@ -51,9 +53,9 @@ public: cvf::Color3f caseColor( const RimSummaryCase* summaryCase ) const; QString currentEnsembleParameter() const; - void setEnsembleParameter( const QString& parameterName ); - RimRegularLegendConfig* legendConfig(); - EnsembleParameter::Type currentEnsembleParameterType() const; + void setEnsembleParameter( const QString& parameterName ); + RimRegularLegendConfig* legendConfig(); + RigEnsembleParameter::Type currentEnsembleParameterType() const; protected: void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp index 3b0ebed67b..6aa56b9618 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp @@ -279,7 +279,7 @@ QList { auto curveSet = parentCurveSet(); auto ensemble = curveSet ? curveSet->summaryCaseCollection() : nullptr; - auto eParam = ensemble ? ensemble->ensembleParameter( m_ensembleParameterName ) : EnsembleParameter(); + auto eParam = ensemble ? ensemble->ensembleParameter( m_ensembleParameterName ) : RigEnsembleParameter(); if ( eParam.isText() ) { @@ -734,9 +734,9 @@ void RimEnsembleCurveFilter::updateMaxMinAndDefaultValues( bool forceDefault ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimEnsembleCurveFilter::selectedEnsembleParameter() const +RigEnsembleParameter RimEnsembleCurveFilter::selectedEnsembleParameter() const { auto curveSet = parentCurveSet(); auto ensemble = curveSet ? curveSet->summaryCaseCollection() : nullptr; - return ensemble ? ensemble->ensembleParameter( m_ensembleParameterName ) : EnsembleParameter(); + return ensemble ? ensemble->ensembleParameter( m_ensembleParameterName ) : RigEnsembleParameter(); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.h index 6547150e03..7ef9186092 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.h @@ -30,7 +30,7 @@ #include "cafPdmProxyValueField.h" #include "cafPdmPtrField.h" -class EnsembleParameter; +class RigEnsembleParameter; class RimEnsembleCurveSet; class RimSummaryCase; class RimSummaryAddress; @@ -80,8 +80,8 @@ public: std::vector applyFilter( const std::vector& allSumCases ); - void loadDataAndUpdate(); - EnsembleParameter selectedEnsembleParameter() const; + void loadDataAndUpdate(); + RigEnsembleParameter selectedEnsembleParameter() const; RimEnsembleCurveSet* parentCurveSet() const; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index 921af0d5c0..9903030f5a 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -549,7 +549,7 @@ void RimEnsembleCurveSet::setEnsembleParameter( const QString& parameterName ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter::Type RimEnsembleCurveSet::currentEnsembleParameterType() const +RigEnsembleParameter::Type RimEnsembleCurveSet::currentEnsembleParameterType() const { if ( m_colorMode() == ColorMode::BY_ENSEMBLE_PARAM ) { @@ -562,7 +562,7 @@ EnsembleParameter::Type RimEnsembleCurveSet::currentEnsembleParameterType() cons return eParam.type; } } - return EnsembleParameter::TYPE_NONE; + return RigEnsembleParameter::TYPE_NONE; } //-------------------------------------------------------------------------------------------------- @@ -1838,7 +1838,7 @@ void RimEnsembleCurveSet::updateAllTextInPlot() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimEnsembleCurveSet::variationSortedEnsembleParameters() const +std::vector RimEnsembleCurveSet::variationSortedEnsembleParameters() const { RimSummaryCaseCollection* ensemble = m_yValuesSummaryCaseCollection; if ( ensemble ) @@ -1847,14 +1847,14 @@ std::vector RimEnsembleCurveSet::variationSortedEnsembleParam } else { - return std::vector(); + return std::vector(); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> RimEnsembleCurveSet::correlationSortedEnsembleParameters() const +std::vector> RimEnsembleCurveSet::correlationSortedEnsembleParameters() const { RimSummaryCaseCollection* ensemble = m_yValuesSummaryCaseCollection; if ( ensemble ) @@ -1863,7 +1863,7 @@ std::vector> RimEnsembleCurveSet::correlati } else { - return std::vector>(); + return std::vector>(); } } @@ -2014,12 +2014,12 @@ void RimEnsembleCurveSet::updateLegendMappingMode() { switch ( currentEnsembleParameterType() ) { - case EnsembleParameter::TYPE_TEXT: + case RigEnsembleParameter::TYPE_TEXT: if ( m_legendConfig->mappingMode() != RimRegularLegendConfig::MappingType::CATEGORY_INTEGER ) m_legendConfig->setMappingMode( RimRegularLegendConfig::MappingType::CATEGORY_INTEGER ); break; - case EnsembleParameter::TYPE_NUMERIC: + case RigEnsembleParameter::TYPE_NUMERIC: if ( m_legendConfig->mappingMode() == RimRegularLegendConfig::MappingType::CATEGORY_INTEGER ) m_legendConfig->setMappingMode( RimRegularLegendConfig::MappingType::LINEAR_CONTINUOUS ); break; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h index c61b89b3d7..471510f6f0 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h @@ -32,6 +32,8 @@ #include "RimSummaryCaseCollection.h" #include "RimTimeStepFilter.h" +#include "RigEnsembleParameter.h" + #include "cafAppEnum.h" #include "cafPdmChildArrayField.h" #include "cafPdmChildField.h" @@ -114,10 +116,10 @@ public: RimEnsembleCurveFilterCollection* filterCollection() const; - ColorMode colorMode() const; - void setColorMode( ColorMode mode ); - void setEnsembleParameter( const QString& parameterName ); - EnsembleParameter::Type currentEnsembleParameterType() const; + ColorMode colorMode() const; + void setColorMode( ColorMode mode ); + void setEnsembleParameter( const QString& parameterName ); + RigEnsembleParameter::Type currentEnsembleParameterType() const; RimRegularLegendConfig* legendConfig(); @@ -132,10 +134,10 @@ public: RimEnsembleCurveSet* clone() const; void showCurves( bool show ); - void updateAllTextInPlot(); - std::vector variationSortedEnsembleParameters() const; + void updateAllTextInPlot(); + std::vector variationSortedEnsembleParameters() const; - std::vector> correlationSortedEnsembleParameters() const; + std::vector> correlationSortedEnsembleParameters() const; std::vector filterEnsembleCases( const std::vector& sumCases ); void disableStatisticCurves(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp index 9dd25882e9..e53dffe9bc 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp @@ -95,8 +95,8 @@ RimRegularLegendConfig::ColorRangesType RimEnsembleCurveSetColorManager::cycledE //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimEnsembleCurveSetColorManager::initializeLegendConfig( RimRegularLegendConfig* legendConfig, - const EnsembleParameter& ensembleParam ) +void RimEnsembleCurveSetColorManager::initializeLegendConfig( RimRegularLegendConfig* legendConfig, + const RigEnsembleParameter& ensembleParam ) { if ( ensembleParam.isText() ) { @@ -170,7 +170,7 @@ void RimEnsembleCurveSetColorManager::initializeLegendConfig( RimRegularLegendCo //-------------------------------------------------------------------------------------------------- cvf::Color3f RimEnsembleCurveSetColorManager::caseColor( const RimRegularLegendConfig* legendConfig, const RimSummaryCase* summaryCase, - const EnsembleParameter& ensembleParam ) + const RigEnsembleParameter& ensembleParam ) { if ( ensembleParam.isText() ) { diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h index 57f7bd07ac..72af9ff935 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h @@ -23,6 +23,8 @@ #include "RimRegularLegendConfig.h" #include "RimSummaryCaseCollection.h" +#include "RigEnsembleParameter.h" + #include "cafPdmPointer.h" #include @@ -58,7 +60,7 @@ public: return m_ensembleColorRanges.find( colorRange ) != m_ensembleColorRanges.end(); } - static void initializeLegendConfig( RimRegularLegendConfig* legendConfig, const EnsembleParameter& parameter ); + static void initializeLegendConfig( RimRegularLegendConfig* legendConfig, const RigEnsembleParameter& parameter ); static void initializeLegendConfig( RimRegularLegendConfig* legendConfig, RimObjectiveFunction* objectiveFunction, const std::vector& summaryCases, @@ -70,7 +72,7 @@ public: static cvf::Color3f caseColor( const RimRegularLegendConfig* legendConfig, const RimSummaryCase* summaryCase, - const EnsembleParameter& parameter ); + const RigEnsembleParameter& parameter ); static cvf::Color3f caseColor( const RimRegularLegendConfig* legendConfig, RimSummaryCase* summaryCase, diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp index 29f2622d93..74b414842d 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp @@ -49,64 +49,7 @@ CAF_PDM_SOURCE_INIT( RimSummaryCaseCollection, "SummaryCaseSubCollection" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -double EnsembleParameter::stdDeviation() const -{ - double N = static_cast( values.size() ); - if ( N > 1 && isNumeric() ) - { - double sumValues = 0.0; - double sumValuesSquared = 0.0; - for ( const QVariant& variant : values ) - { - double value = variant.toDouble(); - sumValues += value; - sumValuesSquared += value * value; - } - - return std::sqrt( ( N * sumValuesSquared - sumValues * sumValues ) / ( N * ( N - 1.0 ) ) ); - } - return 0.0; -} - -//-------------------------------------------------------------------------------------------------- -/// Standard deviation normalized by max absolute value of min/max values. -/// Produces values between 0.0 and sqrt(2.0). -//-------------------------------------------------------------------------------------------------- -double EnsembleParameter::normalizedStdDeviation() const -{ - const double eps = 1.0e-4; - - double maxAbs = std::max( std::fabs( maxValue ), std::fabs( minValue ) ); - if ( maxAbs < eps ) - { - return 0.0; - } - - double normalisedStdDev = stdDeviation() / maxAbs; - if ( normalisedStdDev < eps ) - { - return 0.0; - } - return normalisedStdDev; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool EnsembleParameter::operator<( const EnsembleParameter& other ) const -{ - if ( this->variationBin != other.variationBin ) - { - return this->variationBin > other.variationBin; // Larger first - } - - return this->name < other.name; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryCaseCollection::sortByBinnedVariation( std::vector& parameterVector ) +void RimSummaryCaseCollection::sortByBinnedVariation( std::vector& parameterVector ) { double minStdDev = std::numeric_limits::infinity(); double maxStdDev = 0.0; @@ -124,16 +67,16 @@ void RimSummaryCaseCollection::sortByBinnedVariation( std::vector bins; bins.push_back( 0.0 ); - for ( int i = 0; i < EnsembleParameter::NR_OF_VARIATION_BINS - 1; ++i ) + for ( int i = 0; i < RigEnsembleParameter::NR_OF_VARIATION_BINS - 1; ++i ) { bins.push_back( minStdDev + ( i + 1 ) * delta ); } - for ( EnsembleParameter& nameParamPair : parameterVector ) + for ( RigEnsembleParameter& nameParamPair : parameterVector ) { int binNumber = -1; for ( double bin : bins ) @@ -150,40 +93,11 @@ void RimSummaryCaseCollection::sortByBinnedVariation( std::vector rhs.variationBin; } ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString EnsembleParameter::uiName() const -{ - QString stem = name; - QString variationString; - if ( isNumeric() ) - { - 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)" ); - break; - } - } - - return QString( "%1%2" ).arg( stem ).arg( variationString ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -448,7 +362,7 @@ RifReaderRftInterface* RimSummaryCaseCollection::rftStatisticsReader() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimSummaryCaseCollection::variationSortedEnsembleParameters( bool excludeNoVariation ) const +std::vector RimSummaryCaseCollection::variationSortedEnsembleParameters( bool excludeNoVariation ) const { if ( m_cachedSortedEnsembleParameters.empty() ) { @@ -480,8 +394,8 @@ std::vector RimSummaryCaseCollection::variationSortedEnsemble } else { - const double epsilon = 1e-9; - std::vector parametersWithVariation; + const double epsilon = 1e-9; + std::vector parametersWithVariation; for ( const auto& p : m_cachedSortedEnsembleParameters ) { if ( std::abs( p.normalizedStdDeviation() ) > epsilon ) @@ -496,13 +410,13 @@ std::vector RimSummaryCaseCollection::variationSortedEnsemble //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> +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 ) { + []( const std::pair& lhs, const std::pair& rhs ) { return std::abs( lhs.second ) > std::abs( rhs.second ); } ); return parameters; @@ -511,14 +425,14 @@ std::vector> //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> +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 ) { + []( const std::pair& lhs, const std::pair& rhs ) { return std::abs( lhs.second ) > std::abs( rhs.second ); } ); return parameters; @@ -536,7 +450,7 @@ time_t timeDiff( time_t lhs, time_t rhs ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> +std::vector> RimSummaryCaseCollection::parameterCorrelations( const RifEclipseSummaryAddress& address, time_t timeStep, const std::vector& selectedParameters, @@ -548,7 +462,7 @@ std::vector> { parameters.erase( std::remove_if( parameters.begin(), parameters.end(), - [&selectedParameters]( const EnsembleParameter& parameter ) { + [&selectedParameters]( const RigEnsembleParameter& parameter ) { return std::find( selectedParameters.begin(), selectedParameters.end(), parameter.name ) == selectedParameters.end(); @@ -556,8 +470,8 @@ std::vector> parameters.end() ); } - std::vector caseValuesAtTimestep; - std::map> parameterValues; + std::vector caseValuesAtTimestep; + std::map> parameterValues; for ( size_t caseIdx = 0u; caseIdx < m_cases.size(); ++caseIdx ) { @@ -600,7 +514,7 @@ std::vector> } } - std::vector> correlationResults; + std::vector> correlationResults; for ( auto parameterValuesPair : parameterValues ) { double correlation = 0.0; @@ -614,7 +528,7 @@ std::vector> //-------------------------------------------------------------------------------------------------- /// Returns a vector of the parameters and the average absolute values of correlations per time step //-------------------------------------------------------------------------------------------------- -std::vector> +std::vector> RimSummaryCaseCollection::parameterCorrelationsAllTimeSteps( const RifEclipseSummaryAddress& address, const std::vector& selectedParameters ) const { @@ -625,11 +539,11 @@ std::vector> std::vector timeStepsVector( timeSteps.begin(), timeSteps.end() ); size_t stride = std::max( (size_t)1, timeStepsVector.size() / maxTimeStepCount ); - std::vector>> correlationsForChosenTimeSteps; + std::vector>> correlationsForChosenTimeSteps; for ( size_t i = stride; i < timeStepsVector.size(); i += stride ) { - std::vector> correlationsForTimeStep = + std::vector> correlationsForTimeStep = parameterCorrelations( address, timeStepsVector[i], selectedParameters ); correlationsForChosenTimeSteps.push_back( correlationsForTimeStep ); } @@ -652,7 +566,7 @@ std::vector> //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimSummaryCaseCollection::alphabeticEnsembleParameters() const +std::vector RimSummaryCaseCollection::alphabeticEnsembleParameters() const { std::set paramSet; for ( RimSummaryCase* rimCase : this->allSummaryCases() ) @@ -667,7 +581,7 @@ std::vector RimSummaryCaseCollection::alphabeticEnsembleParam } } - std::vector sortedEnsembleParameters; + std::vector sortedEnsembleParameters; sortedEnsembleParameters.reserve( paramSet.size() ); for ( const QString& parameterName : paramSet ) { @@ -679,23 +593,23 @@ std::vector RimSummaryCaseCollection::alphabeticEnsembleParam //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimSummaryCaseCollection::ensembleParameter( const QString& paramName ) const +RigEnsembleParameter RimSummaryCaseCollection::ensembleParameter( const QString& paramName ) const { - if ( !isEnsemble() || paramName.isEmpty() ) return EnsembleParameter(); + if ( !isEnsemble() || paramName.isEmpty() ) return RigEnsembleParameter(); - const std::vector& ensembleParams = variationSortedEnsembleParameters(); + const std::vector& ensembleParams = variationSortedEnsembleParameters(); - for ( const EnsembleParameter& ensParam : ensembleParams ) + for ( const RigEnsembleParameter& ensParam : ensembleParams ) { if ( ensParam.name == paramName ) return ensParam; } - return EnsembleParameter(); + return RigEnsembleParameter(); } -EnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QString& paramName ) const +RigEnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QString& paramName ) const { - EnsembleParameter eParam; + RigEnsembleParameter eParam; eParam.name = paramName; size_t numericValuesCount = 0; @@ -734,11 +648,11 @@ EnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QStri if ( numericValuesCount && !textValuesCount ) { - eParam.type = EnsembleParameter::TYPE_NUMERIC; + eParam.type = RigEnsembleParameter::TYPE_NUMERIC; } else if ( textValuesCount && !numericValuesCount ) { - eParam.type = EnsembleParameter::TYPE_TEXT; + eParam.type = RigEnsembleParameter::TYPE_TEXT; } if ( numericValuesCount && textValuesCount ) { @@ -753,7 +667,7 @@ EnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QStri val.setValue( std::numeric_limits::infinity() ); } } - eParam.type = EnsembleParameter::TYPE_NUMERIC; + eParam.type = RigEnsembleParameter::TYPE_NUMERIC; } else { @@ -765,7 +679,7 @@ EnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QStri val.setValue( QString::number( val.value() ) ); } } - eParam.type = EnsembleParameter::TYPE_TEXT; + eParam.type = RigEnsembleParameter::TYPE_TEXT; eParam.minValue = std::numeric_limits::infinity(); eParam.maxValue = -std::numeric_limits::infinity(); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h index 360e128eed..d5c389cfcc 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h @@ -23,6 +23,8 @@ #include "RifEclipseSummaryAddress.h" #include "RifReaderEnsembleStatisticsRft.h" +#include "RigEnsembleParameter.h" + #include "RimObjectiveFunction.h" #include "cafPdmChildArrayField.h" @@ -39,53 +41,6 @@ class RifReaderRftInterface; class RifReaderEnsembleStatisticsRft; class RimSummaryCase; -//================================================================================================== -/// -//================================================================================================== -class EnsembleParameter -{ -public: - enum Type - { - TYPE_NONE, - TYPE_NUMERIC, - TYPE_TEXT - }; - enum Bins - { - NO_VARIATION = -1, - LOW_VARIATION = 0, - MEDIUM_VARIATION, - HIGH_VARIATION, - NR_OF_VARIATION_BINS - }; - QString uiName() const; - QString name; - Type type; - std::vector values; - double minValue; - double maxValue; - int variationBin; - - EnsembleParameter() - : type( TYPE_NONE ) - , minValue( std::numeric_limits::infinity() ) - , maxValue( -std::numeric_limits::infinity() ) - , variationBin( static_cast( MEDIUM_VARIATION ) ) - { - } - - bool isValid() const { return !name.isEmpty() && type != TYPE_NONE; } - bool isNumeric() const { return type == TYPE_NUMERIC; } - bool isText() const { return type == TYPE_TEXT; } - double normalizedStdDeviation() const; - - bool operator<( const EnsembleParameter& other ) const; - -private: - double stdDeviation() const; -}; - //================================================================================================== /// //================================================================================================== @@ -117,26 +72,26 @@ public: int ensembleId() const; bool hasEnsembleParameters() const; - std::vector variationSortedEnsembleParameters( bool excludeNoVariation = false ) const; - std::vector> + std::vector variationSortedEnsembleParameters( bool excludeNoVariation = false ) const; + std::vector> correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address ) const; - std::vector> + std::vector> correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address, time_t selectedTimeStep ) const; - std::vector> + std::vector> parameterCorrelations( const RifEclipseSummaryAddress& address, time_t selectedTimeStep, const std::vector& selectedParameters = {}, const std::set& selectedCases = {} ) const; - std::vector> + std::vector> parameterCorrelationsAllTimeSteps( const RifEclipseSummaryAddress& address, const std::vector& selectedParameters = {} ) const; - std::vector alphabeticEnsembleParameters() const; + std::vector alphabeticEnsembleParameters() const; - EnsembleParameter ensembleParameter( const QString& paramName ) const; - void calculateEnsembleParametersIntersectionHash(); - void clearEnsembleParametersHashes(); + RigEnsembleParameter ensembleParameter( const QString& paramName ) const; + void calculateEnsembleParametersIntersectionHash(); + void clearEnsembleParametersHashes(); void loadDataAndUpdate(); @@ -146,8 +101,8 @@ public: RiaDefines::EclipseUnitSystem unitSystem() const; private: - EnsembleParameter createEnsembleParameter( const QString& paramName ) const; - static void sortByBinnedVariation( std::vector& parameterVector ); + RigEnsembleParameter createEnsembleParameter( const QString& paramName ) const; + static void sortByBinnedVariation( std::vector& parameterVector ); friend class RimSummaryCaseCollection_TESTER; caf::PdmFieldHandle* userDescriptionField() override; @@ -177,5 +132,5 @@ private: size_t m_commonAddressCount; // if different address count among cases, set to 0 - mutable std::vector m_cachedSortedEnsembleParameters; + mutable std::vector m_cachedSortedEnsembleParameters; }; diff --git a/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake b/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake index 1b23d6c9ca..f7b11636ff 100644 --- a/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake +++ b/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake @@ -88,6 +88,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RigTracerPoint.h ${CMAKE_CURRENT_LIST_DIR}/RigTracer.h ${CMAKE_CURRENT_LIST_DIR}/RigStimPlanModelTools.h ${CMAKE_CURRENT_LIST_DIR}/RigSlice2D.h +${CMAKE_CURRENT_LIST_DIR}/RigEnsembleParameter.h ) @@ -173,6 +174,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RigTracerPoint.cpp ${CMAKE_CURRENT_LIST_DIR}/RigTracer.cpp ${CMAKE_CURRENT_LIST_DIR}/RigStimPlanModelTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RigSlice2D.cpp +${CMAKE_CURRENT_LIST_DIR}/RigEnsembleParameter.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.cpp b/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.cpp new file mode 100644 index 0000000000..ade8d3bcfc --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.cpp @@ -0,0 +1,108 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2017- Statoil 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 "RigEnsembleParameter.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigEnsembleParameter::stdDeviation() const +{ + double N = static_cast( values.size() ); + if ( N > 1 && isNumeric() ) + { + double sumValues = 0.0; + double sumValuesSquared = 0.0; + for ( const QVariant& variant : values ) + { + double value = variant.toDouble(); + sumValues += value; + sumValuesSquared += value * value; + } + + return std::sqrt( ( N * sumValuesSquared - sumValues * sumValues ) / ( N * ( N - 1.0 ) ) ); + } + return 0.0; +} + +//-------------------------------------------------------------------------------------------------- +/// Standard deviation normalized by max absolute value of min/max values. +/// Produces values between 0.0 and sqrt(2.0). +//-------------------------------------------------------------------------------------------------- +double RigEnsembleParameter::normalizedStdDeviation() const +{ + const double eps = 1.0e-4; + + double maxAbs = std::max( std::fabs( maxValue ), std::fabs( minValue ) ); + if ( maxAbs < eps ) + { + return 0.0; + } + + double normalisedStdDev = stdDeviation() / maxAbs; + if ( normalisedStdDev < eps ) + { + return 0.0; + } + return normalisedStdDev; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigEnsembleParameter::operator<( const RigEnsembleParameter& other ) const +{ + if ( this->variationBin != other.variationBin ) + { + return this->variationBin > other.variationBin; // Larger first + } + + return this->name < other.name; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RigEnsembleParameter::uiName() const +{ + QString stem = name; + QString variationString; + if ( isNumeric() ) + { + 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)" ); + break; + } + } + + return QString( "%1%2" ).arg( stem ).arg( variationString ); +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.h b/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.h new file mode 100644 index 0000000000..ac847bb8b5 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2016- Statoil 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. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaDefines.h" + +#include +#include + +#include +#include + +//================================================================================================== +/// +//================================================================================================== +class RigEnsembleParameter +{ +public: + enum Type + { + TYPE_NONE, + TYPE_NUMERIC, + TYPE_TEXT + }; + enum Bins + { + NO_VARIATION = -1, + LOW_VARIATION = 0, + MEDIUM_VARIATION, + HIGH_VARIATION, + NR_OF_VARIATION_BINS + }; + QString uiName() const; + QString name; + Type type; + std::vector values; + double minValue; + double maxValue; + int variationBin; + + RigEnsembleParameter() + : type( TYPE_NONE ) + , minValue( std::numeric_limits::infinity() ) + , maxValue( -std::numeric_limits::infinity() ) + , variationBin( static_cast( MEDIUM_VARIATION ) ) + { + } + + bool isValid() const { return !name.isEmpty() && type != TYPE_NONE; } + bool isNumeric() const { return type == TYPE_NUMERIC; } + bool isText() const { return type == TYPE_TEXT; } + double normalizedStdDeviation() const; + + bool operator<( const RigEnsembleParameter& other ) const; + +private: + double stdDeviation() const; +}; diff --git a/ApplicationLibCode/UnitTests/RimSummaryCaseCollection-Test.cpp b/ApplicationLibCode/UnitTests/RimSummaryCaseCollection-Test.cpp index 500ae627eb..798c6f164a 100644 --- a/ApplicationLibCode/UnitTests/RimSummaryCaseCollection-Test.cpp +++ b/ApplicationLibCode/UnitTests/RimSummaryCaseCollection-Test.cpp @@ -1,5 +1,6 @@ #include "gtest/gtest.h" +#include "RigEnsembleParameter.h" #include "RimSummaryCaseCollection.h" #include @@ -12,7 +13,7 @@ public: static void test1(); }; -TEST( RimSummaryCaseCollection, EnsembleParameter ) +TEST( RimSummaryCaseCollection, RigEnsembleParameter ) { RimSummaryCaseCollection_TESTER::test1(); } @@ -26,11 +27,11 @@ void RimSummaryCaseCollection_TESTER::test1() std::uniform_int_distribution countDistribution( 1u, 1000u ); size_t N = 1000; - std::vector parameters; + std::vector parameters; for ( size_t i = 0; i < N; ++i ) { - EnsembleParameter param; - param.type = EnsembleParameter::TYPE_NUMERIC; + RigEnsembleParameter param; + param.type = RigEnsembleParameter::TYPE_NUMERIC; size_t valueCount = countDistribution( gen ); @@ -77,18 +78,18 @@ void RimSummaryCaseCollection_TESTER::test1() size_t currentSize = parameters.size(); EXPECT_EQ( previousSize, currentSize ); - int currentVariation = (int)EnsembleParameter::HIGH_VARIATION; - for ( const EnsembleParameter& nameParamPair : parameters ) + int currentVariation = (int)RigEnsembleParameter::HIGH_VARIATION; + for ( const RigEnsembleParameter& nameParamPair : parameters ) { if ( nameParamPair.normalizedStdDeviation() == 0.0 ) { - EXPECT_EQ( nameParamPair.variationBin, (int)EnsembleParameter::NO_VARIATION ); + EXPECT_EQ( nameParamPair.variationBin, (int)RigEnsembleParameter::NO_VARIATION ); } else { - EXPECT_GE( nameParamPair.variationBin, (int)EnsembleParameter::LOW_VARIATION ); + EXPECT_GE( nameParamPair.variationBin, (int)RigEnsembleParameter::LOW_VARIATION ); } - EXPECT_LE( nameParamPair.variationBin, (int)EnsembleParameter::HIGH_VARIATION ); + EXPECT_LE( nameParamPair.variationBin, (int)RigEnsembleParameter::HIGH_VARIATION ); EXPECT_LE( nameParamPair.variationBin, currentVariation ); currentVariation = nameParamPair.variationBin; } diff --git a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp index 1736a39996..2036c1f7ac 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp @@ -318,12 +318,12 @@ void RiuSummaryQwtPlot::contextMenuEvent( QContextMenuEvent* event ) { menuBuilder.subMenuStart( "Cross Plots", *caf::IconProvider( ":/CorrelationCrossPlot16x16.png" ).icon() ); - std::vector> ensembleParameters = + std::vector> ensembleParameters = ensemble->parameterCorrelations( clickedEnsembleCurveSet->summaryAddress(), timeStep ); std::sort( ensembleParameters.begin(), ensembleParameters.end(), - []( const std::pair& lhs, - const std::pair& rhs ) { + []( const std::pair& lhs, + const std::pair& rhs ) { return std::fabs( lhs.second ) > std::fabs( rhs.second ); } );