From 8b221c26ab09b94c0f180785b5c01e5f6ef2fe1b Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 12 Nov 2024 15:55:10 +0100 Subject: [PATCH] Discard display of delta curves if data is missing Add a flag used to control if missing data from either of the ensembles will return no data, or use zero if data is missing. --- .../Summary/RimDeltaSummaryCase.cpp | 22 +++++++++++++++++++ .../Summary/RimDeltaSummaryEnsemble.cpp | 20 ++++++++++++++++- .../Summary/RimDeltaSummaryEnsemble.h | 3 +++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryCase.cpp index d33da6fedb..c12178cb21 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryCase.cpp @@ -22,6 +22,7 @@ #include "RiaLogging.h" #include "RiaQDateTimeTools.h" +#include "RimDeltaSummaryEnsemble.h" #include "RimProject.h" #include "RimSummaryEnsemble.h" #include "RimSummaryPlot.h" @@ -93,6 +94,27 @@ std::pair> RimDeltaSummaryCase::values( const RifEclip { if ( !resultAddress.isValid() ) return { false, {} }; + if ( auto deltaEnsemble = firstAncestorOfType() ) + { + if ( deltaEnsemble->discardSummaryAddressOnlyPresentInOneCase() ) + { + RifSummaryReaderInterface* reader1 = m_summaryCase1 ? m_summaryCase1->summaryReader() : nullptr; + RifSummaryReaderInterface* reader2 = m_summaryCase2 ? m_summaryCase2->summaryReader() : nullptr; + + if ( !reader1 || !reader2 ) return { false, {} }; + + if ( !reader1->hasAddress( resultAddress ) || !reader2->hasAddress( resultAddress ) ) + { + QString txt = "Summary vector " + QString::fromStdString( resultAddress.toEclipseTextAddress() ) + + " is only present in one of the source ensembles, no values are calculated for this vector."; + + RiaLogging::warning( txt ); + + return { false, {} }; + } + } + } + if ( needsCalculation( resultAddress ) ) { calculate( resultAddress ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.cpp index f0d146759a..dfb83d6108 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.cpp @@ -28,6 +28,7 @@ #include "RifSummaryReaderInterface.h" +#include "cafPdmUiCheckBoxEditor.h" #include "cafPdmUiPushButtonEditor.h" #include "cafPdmUiTreeSelectionEditor.h" @@ -73,6 +74,13 @@ RimDeltaSummaryEnsemble::RimDeltaSummaryEnsemble() m_caseCount.uiCapability()->setUiReadOnly( true ); CAF_PDM_InitField( &m_matchOnParameters, "MatchOnParameters", false, "Match On Parameters" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_matchOnParameters ); + + CAF_PDM_InitField( &m_discardAddressPresentInOneSourceCase, + "DiscardAddressPresentInOneSourceCase", + false, + "Discard Vectors if Missing in One of the Source Ensembles" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_discardAddressPresentInOneSourceCase ); CAF_PDM_InitFieldNoDefault( &m_useFixedTimeStep, "UseFixedTimeStep", "Use Fixed Time Step" ); CAF_PDM_InitField( &m_fixedTimeStepIndex, "FixedTimeStepIndex", 0, "Time Step" ); @@ -195,6 +203,14 @@ void RimDeltaSummaryEnsemble::createDerivedEnsembleCases() deleteCasesNoInUse(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimDeltaSummaryEnsemble::discardSummaryAddressOnlyPresentInOneCase() const +{ + return m_discardAddressPresentInOneSourceCase(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -290,7 +306,6 @@ void RimDeltaSummaryEnsemble::defineUiOrdering( QString uiConfigName, caf::PdmUi uiOrdering.add( &m_operator ); uiOrdering.add( &m_ensemble2 ); uiOrdering.add( &m_swapEnsemblesButton ); - uiOrdering.add( &m_matchOnParameters ); uiOrdering.add( &m_useFixedTimeStep ); if ( m_useFixedTimeStep() != RimDeltaSummaryEnsemble::FixedTimeStepMode::FIXED_TIME_STEP_NONE ) @@ -298,6 +313,9 @@ void RimDeltaSummaryEnsemble::defineUiOrdering( QString uiConfigName, caf::PdmUi uiOrdering.add( &m_fixedTimeStepIndex ); } + uiOrdering.add( &m_matchOnParameters ); + uiOrdering.add( &m_discardAddressPresentInOneSourceCase ); + uiOrdering.skipRemainingFields( true ); updateAutoName(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.h b/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.h index ba118b31aa..20c1e92547 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimDeltaSummaryEnsemble.h @@ -62,6 +62,8 @@ public: void createDerivedEnsembleCases(); + bool discardSummaryAddressOnlyPresentInOneCase() const; + private: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; @@ -91,6 +93,7 @@ private: caf::PdmField m_swapEnsemblesButton; caf::PdmField m_caseCount; caf::PdmField m_matchOnParameters; + caf::PdmField m_discardAddressPresentInOneSourceCase; caf::PdmField> m_useFixedTimeStep; caf::PdmField m_fixedTimeStepIndex;