#4155 Ensemble Statistics Curves : Add option to include partial curves when computing statistics

This commit is contained in:
Magne Sjaastad 2019-11-26 15:02:52 +01:00
parent 6264eb49c8
commit 6969c2f299
5 changed files with 35 additions and 12 deletions

View File

@ -1055,7 +1055,7 @@ void RimEnsembleCurveSet::updateStatisticsCurves( const std::vector<RimSummaryCa
else else
statCases = group->allSummaryCases(); statCases = group->allSummaryCases();
} }
m_ensembleStatCase->calculate( statCases ); m_ensembleStatCase->calculate( statCases, m_statistics->includeIncompleteCurves() );
} }
RimSummaryPlot* plot = nullptr; RimSummaryPlot* plot = nullptr;

View File

@ -43,6 +43,8 @@ RimEnsembleStatistics::RimEnsembleStatistics()
CAF_PDM_InitField( &m_showP90Curve, "ShowP90Curve", true, "P10", "", "", "" ); // Yes, P10 CAF_PDM_InitField( &m_showP90Curve, "ShowP90Curve", true, "P10", "", "", "" ); // Yes, P10
CAF_PDM_InitField( &m_showMeanCurve, "ShowMeanCurve", true, "Mean", "", "", "" ); CAF_PDM_InitField( &m_showMeanCurve, "ShowMeanCurve", true, "Mean", "", "", "" );
CAF_PDM_InitField( &m_showCurveLabels, "ShowCurveLabels", true, "Show Curve Labels", "", "", "" ); 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_warningLabel, "WarningLabel", QString( "Warning: Ensemble time range mismatch" ), "", "", "", "" );
CAF_PDM_InitField( &m_color, "Color", cvf::Color3f( cvf::Color3::BLACK ), "Color", "", "", "" ); 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 || if ( changedField == &m_active || changedField == &m_basedOnFilteredCases || changedField == &m_showP10Curve ||
changedField == &m_showP50Curve || changedField == &m_showP90Curve || changedField == &m_showMeanCurve || 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(); auto curveSet = parentCurveSet();
if ( !curveSet ) return; if ( !curveSet ) return;
@ -129,6 +131,7 @@ void RimEnsembleStatistics::defineUiOrdering( QString uiConfigName, caf::PdmUiOr
uiOrdering.add( &m_active ); uiOrdering.add( &m_active );
uiOrdering.add( &m_hideEnsembleCurves ); uiOrdering.add( &m_hideEnsembleCurves );
uiOrdering.add( &m_basedOnFilteredCases ); uiOrdering.add( &m_basedOnFilteredCases );
uiOrdering.add( &m_includeIncompleteCurves );
uiOrdering.add( &m_showCurveLabels ); uiOrdering.add( &m_showCurveLabels );
uiOrdering.add( &m_color ); uiOrdering.add( &m_color );

View File

@ -72,6 +72,11 @@ public:
return m_color; return m_color;
} }
bool includeIncompleteCurves() const
{
return m_includeIncompleteCurves;
}
void disableP10Curve( bool disable ); void disableP10Curve( bool disable );
void disableP50Curve( bool disable ); void disableP50Curve( bool disable );
void disableP90Curve( bool disable ); void disableP90Curve( bool disable );
@ -93,6 +98,7 @@ private:
caf::PdmField<bool> m_showP90Curve; caf::PdmField<bool> m_showP90Curve;
caf::PdmField<bool> m_showMeanCurve; caf::PdmField<bool> m_showMeanCurve;
caf::PdmField<bool> m_showCurveLabels; caf::PdmField<bool> m_showCurveLabels;
caf::PdmField<bool> m_includeIncompleteCurves;
caf::PdmField<QString> m_warningLabel; caf::PdmField<QString> m_warningLabel;

View File

@ -117,12 +117,16 @@ const RimEnsembleCurveSet* RimEnsembleStatisticsCase::curveSet() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleStatisticsCase::calculate( const std::vector<RimSummaryCase*>& sumCases ) void RimEnsembleStatisticsCase::calculate( const std::vector<RimSummaryCase*>& sumCases, bool includeIncompleteCurves )
{ {
auto inputAddress = m_curveSet->summaryAddress(); auto inputAddress = m_curveSet->summaryAddress();
if ( m_statisticsReader && inputAddress.isValid() ) if ( m_statisticsReader && inputAddress.isValid() )
{ {
calculate( validSummaryCases( sumCases, inputAddress ), inputAddress ); const std::vector<RimSummaryCase*>& validCases = validSummaryCases( sumCases,
inputAddress,
includeIncompleteCurves );
calculate( validCases, inputAddress, includeIncompleteCurves );
} }
} }
@ -130,7 +134,8 @@ void RimEnsembleStatisticsCase::calculate( const std::vector<RimSummaryCase*>& s
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleStatisticsCase::calculate( const std::vector<RimSummaryCase*> sumCases, void RimEnsembleStatisticsCase::calculate( const std::vector<RimSummaryCase*> sumCases,
const RifEclipseSummaryAddress& inputAddress ) const RifEclipseSummaryAddress& inputAddress,
bool includeIncompleteCurves )
{ {
std::vector<time_t> allTimeSteps; std::vector<time_t> allTimeSteps;
std::vector<std::vector<double>> caseAndTimeStepValues; std::vector<std::vector<double>> caseAndTimeStepValues;
@ -147,7 +152,7 @@ void RimEnsembleStatisticsCase::calculate( const std::vector<RimSummaryCase*> su
std::vector<double> values; std::vector<double> values;
reader->values( inputAddress, &values ); reader->values( inputAddress, &values );
if ( timeSteps.size() != values.size() ) continue; if ( !includeIncompleteCurves && timeSteps.size() != values.size() ) continue;
RiaTimeHistoryCurveResampler resampler; RiaTimeHistoryCurveResampler resampler;
resampler.setCurveData( values, timeSteps ); resampler.setCurveData( values, timeSteps );
@ -216,7 +221,8 @@ void RimEnsembleStatisticsCase::clearData()
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::vector<RimSummaryCase*> RimEnsembleStatisticsCase::validSummaryCases( const std::vector<RimSummaryCase*> allSumCases, std::vector<RimSummaryCase*> RimEnsembleStatisticsCase::validSummaryCases( const std::vector<RimSummaryCase*> allSumCases,
const RifEclipseSummaryAddress& inputAddress ) const RifEclipseSummaryAddress& inputAddress,
bool includeIncompleteCurves )
{ {
std::vector<RimSummaryCase*> validCases; std::vector<RimSummaryCase*> validCases;
std::vector<std::tuple<RimSummaryCase*, time_t, time_t>> times; std::vector<std::tuple<RimSummaryCase*, time_t, time_t>> times;
@ -248,8 +254,13 @@ std::vector<RimSummaryCase*> RimEnsembleStatisticsCase::validSummaryCases( const
time_t firstTimeStep = std::get<1>( item ); time_t firstTimeStep = std::get<1>( item );
time_t lastTimeStep = std::get<2>( 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 ); validCases.push_back( sumCase );
} }
} }

View File

@ -65,14 +65,17 @@ public:
const RimEnsembleCurveSet* curveSet() const; const RimEnsembleCurveSet* curveSet() const;
void calculate( const std::vector<RimSummaryCase*>& sumCases ); void calculate( const std::vector<RimSummaryCase*>& sumCases, bool includeIncompleteCurves );
RiaEclipseUnitTools::UnitSystem unitSystem() const; RiaEclipseUnitTools::UnitSystem unitSystem() const;
private: private:
void calculate( const std::vector<RimSummaryCase*> sumCases, const RifEclipseSummaryAddress& inputAddress ); void calculate( const std::vector<RimSummaryCase*> sumCases,
void clearData(); const RifEclipseSummaryAddress& inputAddress,
bool includeIncompleteCurves );
void clearData();
std::vector<RimSummaryCase*> validSummaryCases( const std::vector<RimSummaryCase*> allSumCases, std::vector<RimSummaryCase*> validSummaryCases( const std::vector<RimSummaryCase*> allSumCases,
const RifEclipseSummaryAddress& inputAddress ); const RifEclipseSummaryAddress& inputAddress,
bool includeIncompleteCurves );
private: private:
std::unique_ptr<RifEnsembleStatisticsReader> m_statisticsReader; std::unique_ptr<RifEnsembleStatisticsReader> m_statisticsReader;