diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp index 33599139e6..3443f74f4d 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp @@ -948,6 +948,49 @@ RiaSummaryAddressAnalyzer* RimSummaryCaseCollection::addressAnalyzer() return m_analyzer.get(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCaseCollection::computeMinMax( const RifEclipseSummaryAddress& address ) +{ + if ( m_minMaxValues.count( address ) > 0 ) return; + + double minimumValue( std::numeric_limits::infinity() ); + double maximumValue( -std::numeric_limits::infinity() ); + + std::vector values; + for ( auto s : m_cases() ) + { + if ( !s->summaryReader() ) continue; + + s->summaryReader()->values( address, &values ); + const auto [min, max] = std::minmax_element( begin( values ), end( values ) ); + + minimumValue = std::min( *min, minimumValue ); + maximumValue = std::max( *max, maximumValue ); + } + + setMinMax( address, minimumValue, maximumValue ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCaseCollection::setMinMax( const RifEclipseSummaryAddress& address, double min, double max ) +{ + m_minMaxValues[address] = std::pair( min, max ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair RimSummaryCaseCollection::minMax( const RifEclipseSummaryAddress& address ) +{ + computeMinMax( address ); + + return m_minMaxValues[address]; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h index be50d153fa..56457714b5 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h @@ -114,6 +114,10 @@ public: RiaSummaryAddressAnalyzer* addressAnalyzer(); + void computeMinMax( const RifEclipseSummaryAddress& address ); + void setMinMax( const RifEclipseSummaryAddress& address, double min, double max ); + std::pair minMax( const RifEclipseSummaryAddress& address ); + private: RigEnsembleParameter createEnsembleParameter( const QString& paramName ) const; static void sortByBinnedVariation( std::vector& parameterVector ); @@ -152,4 +156,6 @@ private: mutable std::vector m_cachedSortedEnsembleParameters; std::unique_ptr m_analyzer; + + std::map> m_minMaxValues; }; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp index 3ae1635ac1..85f7a0d086 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp @@ -1007,7 +1007,27 @@ void RimSummaryMultiPlot::computeAggregatedAxisRange() { if ( curveSet->axisY() == axis->plotAxisType() ) { - auto [minimum, maximum] = curveSet->minimumAndMaximumValues(); + double minimum( std::numeric_limits::infinity() ); + double maximum( -std::numeric_limits::infinity() ); + + auto curves = curveSet->curves(); + if ( !curves.empty() ) + { + // TODO: Use analyzer as input to addressesForCurve instead of curve + + auto curve = curves.front(); + + std::vector addresses = + addressesForCurve( curve, m_axisRangeAggregation() ); + + for ( auto adr : addresses ) + { + auto [min, max] = curveSet->summaryCaseCollection()->minMax( adr ); + + minimum = std::min( min, minimum ); + maximum = std::max( max, maximum ); + } + } if ( axisRanges.count( axis->plotAxisType() ) == 0 ) {