#3077 Ensemble statistics. Option to base stat calc on filtered cases or all cases

This commit is contained in:
Bjørn Erik Jensen 2018-06-29 12:34:56 +02:00
parent 0c1c454cdc
commit bcf7938427
6 changed files with 58 additions and 44 deletions

View File

@ -427,8 +427,19 @@ EnsembleParameter::Type RimEnsembleCurveSet::currentEnsembleParameterType() cons
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleCurveSet::updateAllCurves() void RimEnsembleCurveSet::updateAllCurves()
{ {
updateEnsembleCurves(); RimSummaryCaseCollection* group = m_yValuesSummaryGroup();
updateStatisticsCurves(true); RimSummaryAddress* addr = m_yValuesCurveVariable();
if (group && addr->address().category() != RifEclipseSummaryAddress::SUMMARY_INVALID)
{
std::vector<RimSummaryCase*> allCases = group->allSummaryCases();
std::vector<RimSummaryCase*> filteredCases = filterEnsembleCases(allCases);
m_isCurveSetFiltered = filteredCases.size() < allCases.size();
updateEnsembleCurves(filteredCases);
updateStatisticsCurves(m_statistics->basedOnFilteredCases() ? filteredCases : allCases);
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -561,14 +572,16 @@ void RimEnsembleCurveSet::defineUiOrdering(QString uiConfigName, caf::PdmUiOrder
{ {
{ {
QString curveDataGroupName = "Summary Vector"; QString curveDataGroupName = "Summary Vector";
caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroupWithKeyword(curveDataGroupName, "Summary Vector Y"); //caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroupWithKeyword(curveDataGroupName, "Summary Vector Y");
caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup("Summary Vector Y");
curveDataGroup->add(&m_yValuesSummaryGroup); curveDataGroup->add(&m_yValuesSummaryGroup);
curveDataGroup->add(&m_yValuesSelectedVariableDisplayField); curveDataGroup->add(&m_yValuesSelectedVariableDisplayField);
curveDataGroup->add(&m_plotAxis); curveDataGroup->add(&m_plotAxis);
curveDataGroup->add(&m_yPushButtonSelectSummaryAddress); curveDataGroup->add(&m_yPushButtonSelectSummaryAddress);
QString curveVarSelectionGroupName = "Vector Selection Filter Y"; QString curveVarSelectionGroupName = "Vector Selection Filter Y";
caf::PdmUiGroup* curveVarSelectionGroup = curveDataGroup->addNewGroupWithKeyword("Vector Selection Filter", curveVarSelectionGroupName); //caf::PdmUiGroup* curveVarSelectionGroup = curveDataGroup->addNewGroupWithKeyword("Vector Selection Filter", curveVarSelectionGroupName);
caf::PdmUiGroup* curveVarSelectionGroup = curveDataGroup->addNewGroup(curveVarSelectionGroupName);
curveVarSelectionGroup->setCollapsedByDefault(true); curveVarSelectionGroup->setCollapsedByDefault(true);
m_yValuesSummaryFilter->uiOrdering(uiConfigName, *curveVarSelectionGroup); m_yValuesSummaryFilter->uiOrdering(uiConfigName, *curveVarSelectionGroup);
curveVarSelectionGroup->add(&m_yValuesUiFilterResultSelection); curveVarSelectionGroup->add(&m_yValuesUiFilterResultSelection);
@ -902,7 +915,7 @@ void RimEnsembleCurveSet::updateQwtPlotAxis()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleCurveSet::updateEnsembleCurves() void RimEnsembleCurveSet::updateEnsembleCurves(const std::vector<RimSummaryCase*>& sumCases)
{ {
RimSummaryPlot* plot = nullptr; RimSummaryPlot* plot = nullptr;
firstAncestorOrThisOfType(plot); firstAncestorOrThisOfType(plot);
@ -912,14 +925,12 @@ void RimEnsembleCurveSet::updateEnsembleCurves()
m_qwtPlotCurveForLegendText->detach(); m_qwtPlotCurveForLegendText->detach();
deleteStatisticsCurves(); deleteStatisticsCurves();
RimSummaryCaseCollection* group = m_yValuesSummaryGroup();
RimSummaryAddress* addr = m_yValuesCurveVariable(); RimSummaryAddress* addr = m_yValuesCurveVariable();
if (group && plot && addr->address().category() != RifEclipseSummaryAddress::SUMMARY_INVALID) if (plot && addr->address().category() != RifEclipseSummaryAddress::SUMMARY_INVALID)
{ {
if(m_showCurves) if(m_showCurves)
{ {
const auto filteredCases = filterEnsembleCases(group); for (auto& sumCase : sumCases)
for (auto& sumCase : filteredCases)
{ {
RimSummaryCurve* curve = new RimSummaryCurve(); RimSummaryCurve* curve = new RimSummaryCurve();
curve->setSummaryCaseY(sumCase); curve->setSummaryCaseY(sumCase);
@ -939,8 +950,6 @@ void RimEnsembleCurveSet::updateEnsembleCurves()
m_yValuesSummaryFilter->updateFromAddress(addr->address()); m_yValuesSummaryFilter->updateFromAddress(addr->address());
if (plot->qwtPlot()) m_qwtPlotCurveForLegendText->attach(plot->qwtPlot()); if (plot->qwtPlot()) m_qwtPlotCurveForLegendText->attach(plot->qwtPlot());
m_isCurveSetFiltered = filteredCases.size() < group->allSummaryCases().size();
} }
RimSummaryPlot* plot; RimSummaryPlot* plot;
@ -959,7 +968,7 @@ void RimEnsembleCurveSet::updateEnsembleCurves()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleCurveSet::updateStatisticsCurves(bool calculate = true) void RimEnsembleCurveSet::updateStatisticsCurves(const std::vector<RimSummaryCase*>& sumCases)
{ {
using SAddr = RifEclipseSummaryAddress; using SAddr = RifEclipseSummaryAddress;
@ -968,10 +977,15 @@ void RimEnsembleCurveSet::updateStatisticsCurves(bool calculate = true)
if (m_disableStatisticCurves || !group || addr->address().category() == RifEclipseSummaryAddress::SUMMARY_INVALID) return; if (m_disableStatisticCurves || !group || addr->address().category() == RifEclipseSummaryAddress::SUMMARY_INVALID) return;
if (calculate)
{
// Calculate // Calculate
m_ensembleStatCase->calculate(); {
std::vector<RimSummaryCase*> statCases = sumCases;
if (statCases.empty())
{
if (m_statistics->basedOnFilteredCases()) statCases = filterEnsembleCases(group->allSummaryCases());
else statCases = group->allSummaryCases();
}
m_ensembleStatCase->calculate(statCases);
} }
RimSummaryPlot* plot = nullptr; RimSummaryPlot* plot = nullptr;
@ -1027,6 +1041,14 @@ void RimEnsembleCurveSet::updateStatisticsCurves(bool calculate = true)
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEnsembleCurveSet::updateStatisticsCurves()
{
updateStatisticsCurves(std::vector<RimSummaryCase*>());
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -1091,18 +1113,15 @@ std::vector<QString> RimEnsembleCurveSet::ensembleParameterNames() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::vector<RimSummaryCase*> RimEnsembleCurveSet::filterEnsembleCases(const RimSummaryCaseCollection* ensemble) std::vector<RimSummaryCase*> RimEnsembleCurveSet::filterEnsembleCases(const std::vector<RimSummaryCase*>& sumCases)
{ {
if (!ensemble) return std::vector<RimSummaryCase*>(); auto filteredCases = sumCases;
auto sumCases = ensemble->allSummaryCases();
for (auto& filter : m_curveFilters->filters()) for (auto& filter : m_curveFilters->filters())
{ {
sumCases = filter->applyFilter(sumCases); filteredCases = filter->applyFilter(filteredCases);
} }
return filteredCases;
return sumCases;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -98,15 +98,15 @@ public:
EnsembleParameter::Type currentEnsembleParameterType() const; EnsembleParameter::Type currentEnsembleParameterType() const;
void updateAllCurves(); void updateAllCurves();
void updateEnsembleCurves(); void updateStatisticsCurves();
void updateStatisticsCurves(bool calculate);
RimEnsembleCurveSet* clone() const; RimEnsembleCurveSet* clone() const;
void showCurves(bool show); void showCurves(bool show);
void updateAllTextInPlot(); void updateAllTextInPlot();
std::vector<QString> ensembleParameterNames() const; std::vector<QString> ensembleParameterNames() const;
std::vector<RimSummaryCase*> filterEnsembleCases(const RimSummaryCaseCollection* ensemble); std::vector<RimSummaryCase*> filterEnsembleCases(const std::vector<RimSummaryCase*>& sumCases);
void disableStatisticCurves(); void disableStatisticCurves();
bool isFiltered() const; bool isFiltered() const;
@ -115,6 +115,9 @@ public:
bool hasP90Data() const; bool hasP90Data() const;
private: private:
void updateEnsembleCurves(const std::vector<RimSummaryCase*>& sumCases);
void updateStatisticsCurves(const std::vector<RimSummaryCase*>& sumCases);
caf::PdmFieldHandle* userDescriptionField() override; caf::PdmFieldHandle* userDescriptionField() override;
caf::PdmFieldHandle* objectToggleField(); caf::PdmFieldHandle* objectToggleField();
virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) override; virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) override;

View File

@ -38,6 +38,7 @@ RimEnsembleStatistics::RimEnsembleStatistics()
CAF_PDM_InitObject("Ensemble Curve Filter", ":/EnsembleCurveSet16x16.png", "", ""); CAF_PDM_InitObject("Ensemble Curve Filter", ":/EnsembleCurveSet16x16.png", "", "");
CAF_PDM_InitField(&m_active, "Active", true, "Show statistics curves", "", "", ""); CAF_PDM_InitField(&m_active, "Active", true, "Show statistics curves", "", "", "");
CAF_PDM_InitField(&m_basedOnFilteredCases, "BasedOnFilteredCases", false, "Based on Filtered Cases", "", "", "");
CAF_PDM_InitField(&m_showP10Curve, "ShowP10Curve", true, "P90", "", "", ""); // Yes, P90 CAF_PDM_InitField(&m_showP10Curve, "ShowP10Curve", true, "P90", "", "", ""); // Yes, P90
CAF_PDM_InitField(&m_showP50Curve, "ShowP50Curve", true, "P50", "", "", ""); CAF_PDM_InitField(&m_showP50Curve, "ShowP50Curve", true, "P50", "", "", "");
CAF_PDM_InitField(&m_showP90Curve, "ShowP90Curve", true, "P10", "", "", ""); // Yes, P10 CAF_PDM_InitField(&m_showP90Curve, "ShowP90Curve", true, "P10", "", "", ""); // Yes, P10
@ -86,23 +87,13 @@ void RimEnsembleStatistics::disableMeanCurve(bool disable)
m_showMeanCurve.uiCapability()->setUiReadOnly(disable); m_showMeanCurve.uiCapability()->setUiReadOnly(disable);
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QList<caf::PdmOptionItemInfo> RimEnsembleStatistics::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly)
{
QList<caf::PdmOptionItemInfo> options;
return options;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleStatistics::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) void RimEnsembleStatistics::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue)
{ {
if (changedField == &m_active || if (changedField == &m_active ||
changedField == &m_basedOnFilteredCases ||
changedField == &m_showP10Curve || changedField == &m_showP10Curve ||
changedField == &m_showP50Curve || changedField == &m_showP50Curve ||
changedField == &m_showP90Curve || changedField == &m_showP90Curve ||
@ -113,7 +104,7 @@ void RimEnsembleStatistics::fieldChangedByUi(const caf::PdmFieldHandle* changedF
auto curveSet = parentCurveSet(); auto curveSet = parentCurveSet();
if (!curveSet) return; if (!curveSet) return;
curveSet->updateStatisticsCurves(false); curveSet->updateStatisticsCurves();
if (changedField == &m_active) curveSet->updateConnectedEditors(); if (changedField == &m_active) curveSet->updateConnectedEditors();
} }
@ -127,6 +118,7 @@ void RimEnsembleStatistics::defineUiOrdering(QString uiConfigName, caf::PdmUiOrd
auto curveSet = parentCurveSet(); auto curveSet = parentCurveSet();
uiOrdering.add(&m_active); uiOrdering.add(&m_active);
uiOrdering.add(&m_basedOnFilteredCases);
uiOrdering.add(&m_showCurveLabels); uiOrdering.add(&m_showCurveLabels);
uiOrdering.add(&m_color); uiOrdering.add(&m_color);

View File

@ -41,6 +41,7 @@ public:
RimEnsembleStatistics(); RimEnsembleStatistics();
bool isActive() const; bool isActive() const;
bool basedOnFilteredCases() const { return m_basedOnFilteredCases; }
bool showP10Curve() const { return m_showP10Curve; } bool showP10Curve() const { return m_showP10Curve; }
bool showP50Curve() const { return m_showP50Curve; } bool showP50Curve() const { return m_showP50Curve; }
bool showP90Curve() const { return m_showP90Curve; } bool showP90Curve() const { return m_showP90Curve; }
@ -53,7 +54,6 @@ public:
void disableP90Curve(bool disable); void disableP90Curve(bool disable);
void disableMeanCurve(bool disable); void disableMeanCurve(bool disable);
virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) override;
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
@ -61,6 +61,7 @@ private:
RimEnsembleCurveSet* parentCurveSet() const; RimEnsembleCurveSet* parentCurveSet() const;
caf::PdmField<bool> m_active; caf::PdmField<bool> m_active;
caf::PdmField<bool> m_basedOnFilteredCases;
caf::PdmField<bool> m_showP10Curve; caf::PdmField<bool> m_showP10Curve;
caf::PdmField<bool> m_showP50Curve; caf::PdmField<bool> m_showP50Curve;
caf::PdmField<bool> m_showP90Curve; caf::PdmField<bool> m_showP90Curve;

View File

@ -118,13 +118,12 @@ const RimEnsembleCurveSet* RimEnsembleStatisticsCase::curveSet() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleStatisticsCase::calculate() void RimEnsembleStatisticsCase::calculate(const std::vector<RimSummaryCase*>& sumCases)
{ {
auto inputAddress = m_curveSet->summaryAddress(); auto inputAddress = m_curveSet->summaryAddress();
auto ensemble = m_curveSet->summaryCaseCollection(); if (m_statisticsReader && inputAddress.isValid())
if (m_statisticsReader && ensemble && inputAddress.isValid())
{ {
calculate(validSummaryCases(ensemble->allSummaryCases(), inputAddress), inputAddress); calculate(validSummaryCases(sumCases, inputAddress), inputAddress);
} }
} }
@ -211,7 +210,7 @@ std::vector<RimSummaryCase*> RimEnsembleStatisticsCase::validSummaryCases(const
const auto& reader = sumCase->summaryReader(); const auto& reader = sumCase->summaryReader();
if (reader) if (reader)
{ {
std::vector<time_t> timeSteps = reader->timeSteps(inputAddress); const std::vector<time_t>& timeSteps = reader->timeSteps(inputAddress);
if (!timeSteps.empty()) if (!timeSteps.empty())
{ {
time_t firstTimeStep = timeSteps.front(); time_t firstTimeStep = timeSteps.front();

View File

@ -53,7 +53,7 @@ public:
const RimEnsembleCurveSet* curveSet() const; const RimEnsembleCurveSet* curveSet() const;
void calculate(); void calculate(const std::vector<RimSummaryCase*>& sumCases);
private: private:
void calculate(const std::vector<RimSummaryCase*> sumCases, const RifEclipseSummaryAddress& inputAddress); void calculate(const std::vector<RimSummaryCase*> sumCases, const RifEclipseSummaryAddress& inputAddress);