From 4f4c48635b0d1c1bb6e97ad2043785b67f3618f5 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 27 Nov 2019 09:57:17 +0100 Subject: [PATCH] Merge pull request #5099 from OPM/improve-ensemble-statistics Improve ensemble statistics --- .../Summary/RimEnsembleCurveSet.cpp | 2 +- .../Summary/RimEnsembleStatistics.cpp | 5 ++- .../Summary/RimEnsembleStatistics.h | 6 +++ .../Summary/RimEnsembleStatisticsCase.cpp | 44 +++++++++++++------ .../Summary/RimEnsembleStatisticsCase.h | 11 +++-- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index bee72a7a5a..81faa8ffaa 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -1055,7 +1055,7 @@ void RimEnsembleCurveSet::updateStatisticsCurves( const std::vectorallSummaryCases(); } - m_ensembleStatCase->calculate( statCases ); + m_ensembleStatCase->calculate( statCases, m_statistics->includeIncompleteCurves() ); } RimSummaryPlot* plot = nullptr; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp index 85664b4d98..43fb09566e 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp @@ -43,6 +43,8 @@ RimEnsembleStatistics::RimEnsembleStatistics() CAF_PDM_InitField( &m_showP90Curve, "ShowP90Curve", true, "P10", "", "", "" ); // Yes, P10 CAF_PDM_InitField( &m_showMeanCurve, "ShowMeanCurve", true, "Mean", "", "", "" ); CAF_PDM_InitField( &m_showCurveLabels, "ShowCurveLabels", true, "Show Curve Labels", "", "", "" ); + CAF_PDM_InitField( &m_includeIncompleteCurves, "IncludeIncompleteCurves", false, "Include Incomplete Curves", "", "", "" ); + CAF_PDM_InitField( &m_warningLabel, "WarningLabel", QString( "Warning: Ensemble time range mismatch" ), "", "", "", "" ); CAF_PDM_InitField( &m_color, "Color", cvf::Color3f( cvf::Color3::BLACK ), "Color", "", "", "" ); @@ -100,7 +102,7 @@ void RimEnsembleStatistics::fieldChangedByUi( const caf::PdmFieldHandle* changed { if ( changedField == &m_active || changedField == &m_basedOnFilteredCases || changedField == &m_showP10Curve || changedField == &m_showP50Curve || changedField == &m_showP90Curve || changedField == &m_showMeanCurve || - changedField == &m_showCurveLabels || changedField == &m_color ) + changedField == &m_showCurveLabels || changedField == &m_color || changedField == &m_includeIncompleteCurves ) { auto curveSet = parentCurveSet(); if ( !curveSet ) return; @@ -129,6 +131,7 @@ void RimEnsembleStatistics::defineUiOrdering( QString uiConfigName, caf::PdmUiOr uiOrdering.add( &m_active ); uiOrdering.add( &m_hideEnsembleCurves ); uiOrdering.add( &m_basedOnFilteredCases ); + uiOrdering.add( &m_includeIncompleteCurves ); uiOrdering.add( &m_showCurveLabels ); uiOrdering.add( &m_color ); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.h b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.h index c373e2a063..9a20dd769a 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.h @@ -72,6 +72,11 @@ public: return m_color; } + bool includeIncompleteCurves() const + { + return m_includeIncompleteCurves; + } + void disableP10Curve( bool disable ); void disableP50Curve( bool disable ); void disableP90Curve( bool disable ); @@ -93,6 +98,7 @@ private: caf::PdmField m_showP90Curve; caf::PdmField m_showMeanCurve; caf::PdmField m_showCurveLabels; + caf::PdmField m_includeIncompleteCurves; caf::PdmField m_warningLabel; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp index a73ae26d7d..b246bca8fd 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp @@ -117,12 +117,16 @@ const RimEnsembleCurveSet* RimEnsembleStatisticsCase::curveSet() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimEnsembleStatisticsCase::calculate( const std::vector& sumCases ) +void RimEnsembleStatisticsCase::calculate( const std::vector& sumCases, bool includeIncompleteCurves ) { auto inputAddress = m_curveSet->summaryAddress(); if ( m_statisticsReader && inputAddress.isValid() ) { - calculate( validSummaryCases( sumCases, inputAddress ), inputAddress ); + const std::vector& validCases = validSummaryCases( sumCases, + inputAddress, + includeIncompleteCurves ); + + calculate( validCases, inputAddress, includeIncompleteCurves ); } } @@ -130,24 +134,27 @@ void RimEnsembleStatisticsCase::calculate( const std::vector& s /// //-------------------------------------------------------------------------------------------------- void RimEnsembleStatisticsCase::calculate( const std::vector sumCases, - const RifEclipseSummaryAddress& inputAddress ) + const RifEclipseSummaryAddress& inputAddress, + bool includeIncompleteCurves ) { std::vector allTimeSteps; - std::vector> allValues; + std::vector> caseAndTimeStepValues; if ( !inputAddress.isValid() ) return; - allValues.reserve( sumCases.size() ); + caseAndTimeStepValues.reserve( sumCases.size() ); for ( const auto& sumCase : sumCases ) { const auto& reader = sumCase->summaryReader(); if ( reader ) { - std::vector timeSteps = reader->timeSteps( inputAddress ); - std::vector values; + const std::vector& timeSteps = reader->timeSteps( inputAddress ); + std::vector values; reader->values( inputAddress, &values ); - if ( timeSteps.size() != values.size() ) continue; + if ( values.empty() ) continue; + + if ( !includeIncompleteCurves && timeSteps.size() != values.size() ) continue; RiaTimeHistoryCurveResampler resampler; resampler.setCurveData( values, timeSteps ); @@ -157,7 +164,7 @@ void RimEnsembleStatisticsCase::calculate( const std::vector su resampler.resampleAndComputeWeightedMeanValues( DateTimePeriod::DAY ); if ( allTimeSteps.empty() ) allTimeSteps = resampler.resampledTimeSteps(); - allValues.push_back( + caseAndTimeStepValues.push_back( std::vector( resampler.resampledValues().begin(), resampler.resampledValues().end() ) ); } } @@ -165,14 +172,17 @@ void RimEnsembleStatisticsCase::calculate( const std::vector su clearData(); m_timeSteps = allTimeSteps; - for ( int t = 0; t < (int)allTimeSteps.size(); t++ ) + for ( size_t timeStepIndex = 0; timeStepIndex < allTimeSteps.size(); timeStepIndex++ ) { std::vector valuesAtTimeStep; valuesAtTimeStep.reserve( sumCases.size() ); - for ( int c = 0; c < (int)sumCases.size(); c++ ) + for ( const std::vector& caseValues : caseAndTimeStepValues ) { - valuesAtTimeStep.push_back( allValues[c][t] ); + if ( timeStepIndex < caseValues.size() ) + { + valuesAtTimeStep.push_back( caseValues[timeStepIndex] ); + } } double p10, p50, p90, mean; @@ -213,7 +223,8 @@ void RimEnsembleStatisticsCase::clearData() /// //-------------------------------------------------------------------------------------------------- std::vector RimEnsembleStatisticsCase::validSummaryCases( const std::vector allSumCases, - const RifEclipseSummaryAddress& inputAddress ) + const RifEclipseSummaryAddress& inputAddress, + bool includeIncompleteCurves ) { std::vector validCases; std::vector> times; @@ -245,8 +256,13 @@ std::vector RimEnsembleStatisticsCase::validSummaryCases( const time_t firstTimeStep = std::get<1>( item ); time_t lastTimeStep = std::get<2>( item ); - if ( firstTimeStep == minTimeStep && lastTimeStep == maxTimeStep ) + if ( firstTimeStep == minTimeStep ) { + if ( !includeIncompleteCurves && lastTimeStep != maxTimeStep ) + { + continue; + } + validCases.push_back( sumCase ); } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.h b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.h index 3e3ebf54a1..348de9f3f4 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.h @@ -65,14 +65,17 @@ public: const RimEnsembleCurveSet* curveSet() const; - void calculate( const std::vector& sumCases ); + void calculate( const std::vector& sumCases, bool includeIncompleteCurves ); RiaEclipseUnitTools::UnitSystem unitSystem() const; private: - void calculate( const std::vector sumCases, const RifEclipseSummaryAddress& inputAddress ); - void clearData(); + void calculate( const std::vector sumCases, + const RifEclipseSummaryAddress& inputAddress, + bool includeIncompleteCurves ); + void clearData(); std::vector validSummaryCases( const std::vector allSumCases, - const RifEclipseSummaryAddress& inputAddress ); + const RifEclipseSummaryAddress& inputAddress, + bool includeIncompleteCurves ); private: std::unique_ptr m_statisticsReader;