From 07d1a3c669b56ef7b7857f7259a06515ff8e595f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Herje?= <82032112+jorgenherje@users.noreply.github.com> Date: Mon, 13 Feb 2023 09:59:29 +0100 Subject: [PATCH] Improve Grid Statistics Plot UI (#9831) - Set default frequency enum to relative frequency [%] - Set current view selected in filter by 3D view visibility by default - Add labels for statistics data - Add UI to change number of bins in histogram - Add control of font size of axis values and axis titles --- .../RimGridStatisticsPlot.cpp | 14 +- .../RimHistogramCalculator.cpp | 50 +++++- .../ProjectDataModel/RimHistogramCalculator.h | 3 + .../ProjectDataModel/RimStatisticsPlot.cpp | 159 ++++++++++++++---- .../ProjectDataModel/RimStatisticsPlot.h | 11 ++ .../RigCaseCellResultsData.cpp | 8 + .../RigCaseCellResultsData.h | 2 + .../ReservoirDataModel/RigFlowDiagResults.cpp | 16 ++ .../ReservoirDataModel/RigFlowDiagResults.h | 3 + .../RigStatisticsDataCache.cpp | 27 ++- .../RigStatisticsDataCache.h | 9 +- 11 files changed, 257 insertions(+), 45 deletions(-) diff --git a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp index a4baaa3d60..76e9cd48e0 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp @@ -96,6 +96,14 @@ void RimGridStatisticsPlot::setDefaults() m_property->setResultType( RiaDefines::ResultCatType::STATIC_NATIVE ); m_property->setResultVariable( "PORO" ); + + if ( eclipseCase && !eclipseCase->reservoirViews.children().empty() ) + { + m_cellFilterView.setValue( eclipseCase->reservoirViews.children().front() ); + } + + m_numHistogramBins = 15; + m_tickNumberFormat = RiaNumberFormat::NumberFormatType::FIXED; } } } @@ -157,10 +165,9 @@ void RimGridStatisticsPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOr m_property->uiOrdering( uiConfigName, *propertyGroup ); } - bool showNumHistogramBins = false; + const bool showNumHistogramBins = true; RimStatisticsPlot::uiOrderingForHistogram( uiConfigName, uiOrdering, showNumHistogramBins ); - - uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); + RimStatisticsPlot::uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); uiOrdering.skipRemainingFields( true ); } @@ -240,6 +247,7 @@ RigHistogramData RimGridStatisticsPlot::createStatisticsData() const { std::unique_ptr histogramCalculator; histogramCalculator.reset( new RimHistogramCalculator ); + histogramCalculator->setNumBins( static_cast( m_numHistogramBins() ) ); RigHistogramData histogramData; diff --git a/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp b/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp index c20d387540..06cd01cda2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp @@ -67,9 +67,18 @@ void caf::AppEnum::setUp() //-------------------------------------------------------------------------------------------------- RimHistogramCalculator::RimHistogramCalculator() : m_isVisCellStatUpToDate( false ) + , m_numBins( RigStatisticsDataCache::defaultNumBins() ) { } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimHistogramCalculator::setNumBins( size_t numBins ) +{ + m_numBins = numBins; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -173,14 +182,14 @@ RigHistogramData RimHistogramCalculator::histogramData( RimEclipseView* if ( eclResultDefinition->isFlowDiagOrInjectionFlooding() ) { - // All timesteps is ignored - if ( timeRange == StatisticsTimeRangeType::CURRENT_TIMESTEP || timeRange == StatisticsTimeRangeType::ALL_TIMESTEPS ) + if ( timeRange == StatisticsTimeRangeType::CURRENT_TIMESTEP ) { if ( cellRange == StatisticsCellRangeType::ALL_CELLS ) { RigFlowDiagResults* fldResults = eclResultDefinition->flowDiagSolution()->flowDiagResults(); RigFlowDiagResultAddress resAddr = eclResultDefinition->flowDiagResAddress(); + fldResults->setStatisticsDataCacheNumBins( resAddr, m_numBins ); fldResults->minMaxScalarValues( resAddr, timeStep, &histData.min, &histData.max ); fldResults->p10p90ScalarValues( resAddr, timeStep, &histData.p10, &histData.p90 ); fldResults->meanScalarValue( resAddr, timeStep, &histData.mean ); @@ -195,6 +204,7 @@ RigHistogramData RimHistogramCalculator::histogramData( RimEclipseView* updateVisCellStatsIfNeeded( eclipseView, eclResultDefinition ); + m_visibleCellStatistics->setNumBins( m_numBins ); m_visibleCellStatistics->meanCellScalarValues( timeStep, histData.mean ); m_visibleCellStatistics->minMaxCellScalarValues( timeStep, histData.min, histData.max ); m_visibleCellStatistics->p10p90CellScalarValues( timeStep, histData.p10, histData.p90 ); @@ -204,6 +214,38 @@ RigHistogramData RimHistogramCalculator::histogramData( RimEclipseView* histData.histogram = m_visibleCellStatistics->cellScalarValuesHistogram( timeStep ); } } + else if ( timeRange == StatisticsTimeRangeType::ALL_TIMESTEPS ) + { + if ( cellRange == StatisticsCellRangeType::ALL_CELLS ) + { + RigFlowDiagResults* fldResults = eclResultDefinition->flowDiagSolution()->flowDiagResults(); + RigFlowDiagResultAddress resAddr = eclResultDefinition->flowDiagResAddress(); + + fldResults->setStatisticsDataCacheNumBins( resAddr, m_numBins ); + fldResults->minMaxScalarValues( resAddr, &histData.min, &histData.max ); + fldResults->p10p90ScalarValues( resAddr, &histData.p10, &histData.p90 ); + fldResults->meanScalarValue( resAddr, &histData.mean ); + fldResults->sumScalarValue( resAddr, &histData.sum ); + fldResults->mobileVolumeWeightedMean( resAddr, &histData.weightedMean ); + + histData.histogram = fldResults->scalarValuesHistogram( resAddr ); + } + else if ( cellRange == StatisticsCellRangeType::VISIBLE_CELLS ) + { + CVF_ASSERT( eclipseView ); + + updateVisCellStatsIfNeeded( eclipseView, eclResultDefinition ); + + m_visibleCellStatistics->setNumBins( m_numBins ); + m_visibleCellStatistics->meanCellScalarValues( histData.mean ); + m_visibleCellStatistics->minMaxCellScalarValues( histData.min, histData.max ); + m_visibleCellStatistics->p10p90CellScalarValues( histData.p10, histData.p90 ); + m_visibleCellStatistics->sumCellScalarValues( histData.sum ); + m_visibleCellStatistics->mobileVolumeWeightedMean( histData.weightedMean ); + + histData.histogram = m_visibleCellStatistics->cellScalarValuesHistogram(); + } + } } else if ( cellRange == StatisticsCellRangeType::ALL_CELLS ) { @@ -211,6 +253,7 @@ RigHistogramData RimHistogramCalculator::histogramData( RimEclipseView* RigCaseCellResultsData* cellResults = eclResultDefinition->currentGridCellResults(); if ( timeRange == StatisticsTimeRangeType::ALL_TIMESTEPS ) { + cellResults->setStatisticsDataCacheNumBins( eclResAddr, m_numBins ); cellResults->minMaxCellScalarValues( eclResAddr, histData.min, histData.max ); cellResults->p10p90CellScalarValues( eclResAddr, histData.p10, histData.p90 ); cellResults->meanCellScalarValues( eclResAddr, histData.mean ); @@ -220,6 +263,7 @@ RigHistogramData RimHistogramCalculator::histogramData( RimEclipseView* } else if ( timeRange == StatisticsTimeRangeType::CURRENT_TIMESTEP ) { + cellResults->setStatisticsDataCacheNumBins( eclResAddr, m_numBins ); cellResults->minMaxCellScalarValues( eclResAddr, timeStep, histData.min, histData.max ); cellResults->p10p90CellScalarValues( eclResAddr, timeStep, histData.p10, histData.p90 ); cellResults->meanCellScalarValues( eclResAddr, timeStep, histData.mean ); @@ -235,6 +279,7 @@ RigHistogramData RimHistogramCalculator::histogramData( RimEclipseView* if ( timeRange == StatisticsTimeRangeType::ALL_TIMESTEPS ) { // TODO: Only valid if we have no dynamic property filter + m_visibleCellStatistics->setNumBins( m_numBins ); m_visibleCellStatistics->meanCellScalarValues( histData.mean ); m_visibleCellStatistics->minMaxCellScalarValues( histData.min, histData.max ); m_visibleCellStatistics->p10p90CellScalarValues( histData.p10, histData.p90 ); @@ -245,6 +290,7 @@ RigHistogramData RimHistogramCalculator::histogramData( RimEclipseView* } else if ( timeRange == StatisticsTimeRangeType::CURRENT_TIMESTEP ) { + m_visibleCellStatistics->setNumBins( m_numBins ); m_visibleCellStatistics->meanCellScalarValues( timeStep, histData.mean ); m_visibleCellStatistics->minMaxCellScalarValues( timeStep, histData.min, histData.max ); m_visibleCellStatistics->p10p90CellScalarValues( timeStep, histData.p10, histData.p90 ); diff --git a/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.h b/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.h index 2195a9f9bc..e523b26166 100644 --- a/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.h +++ b/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.h @@ -53,6 +53,8 @@ public: RimHistogramCalculator(); + void setNumBins( size_t numBins ); + RigHistogramData histogramData( RimEclipseContourMapView* contourMap ); RigHistogramData histogramData( RimGeoMechContourMapView* contourMap ); RigHistogramData @@ -78,4 +80,5 @@ private: bool m_isVisCellStatUpToDate; cvf::ref m_visibleCellStatistics; + size_t m_numBins; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp index 298d90f73c..fc260b5ff6 100644 --- a/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -60,7 +61,7 @@ void caf::AppEnum::setUp() addItem( RimStatisticsPlot::HistogramFrequencyType::RELATIVE_FREQUENCY_PERCENT, "RELATIVE_FREQUENCY_PERCENT", "Relative Frequency [%]" ); - setDefault( RimStatisticsPlot::HistogramFrequencyType::ABSOLUTE_FREQUENCY ); + setDefault( RimStatisticsPlot::HistogramFrequencyType::RELATIVE_FREQUENCY_PERCENT ); } template <> void caf::AppEnum::setUp() @@ -107,6 +108,11 @@ RimStatisticsPlot::RimStatisticsPlot() CAF_PDM_InitFieldNoDefault( &m_graphType, "GraphType", "Graph Type" ); + CAF_PDM_InitFieldNoDefault( &m_axisValueFontSize, "AxisValueFontSize", "Axis Value Font Size" ); + CAF_PDM_InitFieldNoDefault( &m_axisTitleFontSize, "AxisTitleFontSize", "Axis Title Font Size" ); + m_axisValueFontSize = caf::FontTools::RelativeSize::Small; + m_axisTitleFontSize = caf::FontTools::RelativeSize::Medium; + m_plotLegendsHorizontal.uiCapability()->setUiHidden( true ); setDeletable( true ); @@ -152,6 +158,22 @@ void RimStatisticsPlot::zoomAll() { } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimStatisticsPlot::axisTitleFontSize() const +{ + return caf::FontTools::absolutePointSize( RiaPreferences::current()->defaultPlotFontSize(), m_axisTitleFontSize() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimStatisticsPlot::axisValueFontSize() const +{ + return caf::FontTools::absolutePointSize( RiaPreferences::current()->defaultPlotFontSize(), m_axisValueFontSize() ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -186,6 +208,23 @@ void RimStatisticsPlot::deleteViewWidget() cleanupBeforeClose(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStatisticsPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + RimPlotWindow::fieldChangedByUi( changedField, oldValue, newValue ); + + if ( changedField == &m_axisTitleFontSize || changedField == &m_axisValueFontSize ) + { + updateLayout(); + } + + updateConnectedEditors(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -236,8 +275,8 @@ void RimStatisticsPlot::defineEditorAttribute( const caf::PdmFieldHandle* field, caf::PdmUiLineEditorAttribute* lineEditorAttr = dynamic_cast( attribute ); if ( field == &m_numHistogramBins && lineEditorAttr != nullptr ) { - // Limit histogram bins to something resonable - QIntValidator* validator = new QIntValidator( 20, 1000, nullptr ); + // Limit histogram bins to positive value + QIntValidator* validator = new QIntValidator( 2, 10000, nullptr ); lineEditorAttr->validator = validator; } @@ -249,6 +288,23 @@ void RimStatisticsPlot::defineEditorAttribute( const caf::PdmFieldHandle* field, } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimStatisticsPlot::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) +{ + QList options = RimPlotWindow::calculateValueOptions( fieldNeedingOptions ); + + if ( !options.empty() ) return options; + + if ( fieldNeedingOptions == &m_axisTitleFontSize || fieldNeedingOptions == &m_axisValueFontSize ) + { + options = caf::FontTools::relativeSizeValueOptions( RiaPreferences::current()->defaultPlotFontSize() ); + } + + return options; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -264,6 +320,20 @@ void RimStatisticsPlot::uiOrderingForHistogram( QString uiConfigName, caf::PdmUi histogramGroup->add( &m_tickNumberFormat ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStatisticsPlot::uiOrderingForLegendsAndFonts( QString uiConfigName, + caf::PdmUiOrdering& uiOrdering, + bool showLegendPosition ) +{ + RimPlotWindow::uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering, showLegendPosition ); + + auto* fontGroup = uiOrdering.findGroup( "Fonts" ); + fontGroup->add( &m_axisTitleFontSize ); + fontGroup->add( &m_axisValueFontSize ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -351,46 +421,73 @@ void RimStatisticsPlot::updatePlots() axisY->setTitleText( createYAxisTitle() ); chart->addAxis( axisY, Qt::AlignLeft ); - if ( !std::isinf( histogramData.p10 ) ) + // Scaling to match font sizes in Qwt + const double fontScalingToMatchQwt = 1.5; + + // Create vertical lines for statistics data + std::vector> statisticsData = { { "P90", histogramData.p90 }, + { "Mean", histogramData.mean }, + { "P10", histogramData.p10 } }; + + for ( const auto& [name, value] : statisticsData ) { - QLineSeries* p10series = new QLineSeries(); - chart->addSeries( p10series ); - p10series->setName( "P10" ); - p10series->append( histogramData.p10, minValue ); - p10series->append( histogramData.p10, maxValue ); - p10series->attachAxis( axisX ); - p10series->attachAxis( axisY ); + if ( std::isinf( value ) ) continue; + + QLineSeries* series = new QLineSeries(); + chart->addSeries( series ); + series->append( value, minValue ); + series->append( value, maxValue ); + series->attachAxis( axisX ); + series->attachAxis( axisY ); + series->setName( QString( "%1 (%2)" ).arg( name ).arg( value ) ); + + // Dummy point for label at top of vertical statistics value line + QLineSeries* labelSeries = new QLineSeries(); + chart->addSeries( labelSeries ); + labelSeries->append( value, maxValue ); + labelSeries->attachAxis( axisX ); + labelSeries->attachAxis( axisY ); + labelSeries->setPointLabelsVisible( true ); + labelSeries->setPointLabelsClipping( false ); + labelSeries->setPointLabelsFormat( QString( "%1 - @xPoint" ).arg( name ) ); + + // Set font of label equal axis value font + QFont labelFont = QFont(); + labelFont.setPixelSize( fontScalingToMatchQwt * axisValueFontSize() ); + labelSeries->setPointLabelsFont( labelFont ); + + // Remove legend for dummy point + QList labelMarker = chart->legend()->markers( labelSeries ); + if ( !labelMarker.empty() ) labelMarker.back()->setVisible( false ); } - if ( !std::isinf( histogramData.p90 ) ) - { - QLineSeries* p90series = new QLineSeries(); - chart->addSeries( p90series ); - p90series->setName( "P90" ); - p90series->append( histogramData.p90, minValue ); - p90series->append( histogramData.p90, maxValue ); - p90series->attachAxis( axisX ); - p90series->attachAxis( axisY ); - } + // Set axis value font + QFont axisYValueFont = axisY->labelsFont(); + axisYValueFont.setPixelSize( fontScalingToMatchQwt * axisValueFontSize() ); + axisY->setLabelsFont( axisYValueFont ); + QFont axisXValueFont = axisX->labelsFont(); + axisXValueFont.setPixelSize( fontScalingToMatchQwt * axisValueFontSize() ); + axisX->setLabelsFont( axisXValueFont ); - QLineSeries* meanSeries = new QLineSeries(); - chart->addSeries( meanSeries ); - meanSeries->setName( "Mean" ); - meanSeries->append( histogramData.mean, minValue ); - meanSeries->append( histogramData.mean, maxValue ); - meanSeries->attachAxis( axisX ); - meanSeries->attachAxis( axisY ); + // Set axis title font + QFont axisYTitleFont = axisY->titleFont(); + axisYTitleFont.setPixelSize( fontScalingToMatchQwt * axisTitleFontSize() ); + axisY->setTitleFont( axisYTitleFont ); + QFont axisXTitleFont = axisX->titleFont(); + axisXTitleFont.setPixelSize( fontScalingToMatchQwt * axisTitleFontSize() ); + axisX->setTitleFont( axisXTitleFont ); - // Set font sizes + // Set plot title font QFont titleFont = chart->titleFont(); - titleFont.setPixelSize( titleFontSize() ); + titleFont.setPixelSize( fontScalingToMatchQwt * titleFontSize() ); chart->setTitleFont( titleFont ); + // Set legend font QLegend* legend = chart->legend(); if ( legend ) { QFont legendFont = legend->font(); - legendFont.setPixelSize( legendFontSize() ); + legendFont.setPixelSize( fontScalingToMatchQwt * legendFontSize() ); legend->setFont( legendFont ); legend->setVisible( legendsVisible() ); } diff --git a/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h b/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h index 5dc44b7a37..62a513662a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h @@ -66,17 +66,25 @@ public: void zoomAll() override; + int axisTitleFontSize() const; + int axisValueFontSize() const; + protected: QImage snapshotWindowContent() override; QWidget* createViewWidget( QWidget* mainWindowParent ) override; void deleteViewWidget() override; + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; + void uiOrderingForHistogram( QString uiConfigName, caf::PdmUiOrdering& uiOrdering, bool showHistogramBins ); + void uiOrderingForLegendsAndFonts( QString uiConfigName, caf::PdmUiOrdering& uiOrdering, bool showLegendPosition = false ); void onLoadDataAndUpdate() override; void updatePlots(); @@ -108,4 +116,7 @@ protected: caf::PdmField m_precision; caf::PdmField> m_tickNumberFormat; caf::PdmField> m_graphType; + + caf::PdmField m_axisValueFontSize; + caf::PdmField m_axisTitleFontSize; }; diff --git a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp index 526a015c2d..2576bb3e56 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp @@ -3524,3 +3524,11 @@ void RigCaseCellResultsData::copyResultsMetaDataFromMainCase( RigEclipseCaseData cellResultsStorage->createPlaceholderResultEntries(); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigCaseCellResultsData::setStatisticsDataCacheNumBins( const RigEclipseResultAddress& resultAddress, size_t numBins ) +{ + this->statistics( resultAddress )->setNumBins( numBins ); +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.h b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.h index 0f48ff3d83..993b565937 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.h +++ b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.h @@ -145,6 +145,8 @@ public: RiaDefines::PorosityModelType poroModel, std::vector destinationCases ); + void setStatisticsDataCacheNumBins( const RigEclipseResultAddress& resultAddress, size_t numBins ); + private: size_t findOrLoadKnownScalarResult( const RigEclipseResultAddress& resVarAddr ); size_t findOrLoadKnownScalarResultByResultTypeOrder( const RigEclipseResultAddress& resVarAddr, diff --git a/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.cpp b/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.cpp index 8a0eff29d8..12c7b47c5c 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.cpp @@ -718,6 +718,14 @@ void RigFlowDiagResults::mobileVolumeWeightedMean( const RigFlowDiagResultAddres this->statistics( resVarAddr )->mobileVolumeWeightedMean( timeStepIndex, *mean ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFlowDiagResults::mobileVolumeWeightedMean( const RigFlowDiagResultAddress& resVarAddr, double* mean ) +{ + this->statistics( resVarAddr )->mobileVolumeWeightedMean( *mean ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -960,3 +968,11 @@ RimFlowDiagSolution* RigFlowDiagResults::flowDiagSolution() return m_flowDiagSolution; } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFlowDiagResults::setStatisticsDataCacheNumBins( const RigFlowDiagResultAddress& resVarAddr, size_t numBins ) +{ + this->statistics( resVarAddr )->setNumBins( numBins ); +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.h b/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.h index 1a7a357e60..809ac8d8ee 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.h +++ b/ApplicationLibCode/ReservoirDataModel/RigFlowDiagResults.h @@ -79,6 +79,7 @@ public: const std::vector& uniqueCellScalarValues( const RigFlowDiagResultAddress& resVarAddr ); const std::vector& uniqueCellScalarValues( const RigFlowDiagResultAddress& resVarAddr, int timeStepIndex ); void mobileVolumeWeightedMean( const RigFlowDiagResultAddress& resVarAddr, int timeStepIndex, double* mean ); + void mobileVolumeWeightedMean( const RigFlowDiagResultAddress& resVarAddr, double* mean ); std::pair injectorProducerPairFluxes( const std::string& injTracername, const std::string& prodTracerName, @@ -100,6 +101,8 @@ public: RimFlowDiagSolution* flowDiagSolution(); + void setStatisticsDataCacheNumBins( const RigFlowDiagResultAddress& resVarAddr, size_t numBins ); + private: const std::vector* findOrCalculateResult( const RigFlowDiagResultAddress& resVarAddr, size_t timeStepIndex ); void calculateNativeResultsIfNotPreviouslyAttempted( size_t timeStepIndex, diff --git a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.cpp b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.cpp index 4176d50a6c..db11735353 100644 --- a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.cpp +++ b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.cpp @@ -29,6 +29,7 @@ //-------------------------------------------------------------------------------------------------- RigStatisticsDataCache::RigStatisticsDataCache( RigStatisticsCalculator* statisticsCalculator ) : m_statisticsCalculator( statisticsCalculator ) + , m_numBins( RigStatisticsDataCache::defaultNumBins() ) { CVF_ASSERT( m_statisticsCalculator.notNull() ); @@ -44,6 +45,22 @@ void RigStatisticsDataCache::clearAllStatistics() m_statsPrTs.clear(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RigStatisticsDataCache::defaultNumBins() +{ + return 100; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigStatisticsDataCache::setNumBins( size_t numBins ) +{ + m_numBins = numBins; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -369,14 +386,13 @@ void RigStatisticsDataCache::p10p90CellScalarValues( size_t timeStepIndex, doubl //-------------------------------------------------------------------------------------------------- void RigStatisticsDataCache::computeHistogramStatisticsIfNeeded() { - if ( m_statsAllTimesteps.m_histogram.size() == 0 ) + if ( m_statsAllTimesteps.m_histogram.size() != m_numBins ) { double min; double max; - size_t nBins = 100; this->minMaxCellScalarValues( min, max ); - RigHistogramCalculator histCalc( min, max, nBins, &m_statsAllTimesteps.m_histogram ); + RigHistogramCalculator histCalc( min, max, m_numBins, &m_statsAllTimesteps.m_histogram ); m_statisticsCalculator->addDataToHistogramCalculator( histCalc ); @@ -390,14 +406,13 @@ void RigStatisticsDataCache::computeHistogramStatisticsIfNeeded() //-------------------------------------------------------------------------------------------------- void RigStatisticsDataCache::computeHistogramStatisticsIfNeeded( size_t timeStepIndex ) { - if ( m_statsPrTs[timeStepIndex].m_histogram.size() == 0 ) + if ( m_statsPrTs[timeStepIndex].m_histogram.size() != m_numBins ) { double min; double max; - size_t nBins = 100; this->minMaxCellScalarValues( timeStepIndex, min, max ); - RigHistogramCalculator histCalc( min, max, nBins, &m_statsPrTs[timeStepIndex].m_histogram ); + RigHistogramCalculator histCalc( min, max, m_numBins, &m_statsPrTs[timeStepIndex].m_histogram ); m_statisticsCalculator->addDataToHistogramCalculator( timeStepIndex, histCalc ); diff --git a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.h b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.h index 7ca6f844e5..16715736dd 100644 --- a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.h +++ b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.h @@ -36,6 +36,9 @@ public: void clearAllStatistics(); + static size_t defaultNumBins(); + void setNumBins( size_t numBins ); + void minMaxCellScalarValues( double& min, double& max ); void minMaxCellScalarValues( size_t timeStepIndex, double& min, double& max ); @@ -114,8 +117,8 @@ private: std::vector m_uniqueValues; }; - StatisticsValues m_statsAllTimesteps; - std::vector m_statsPrTs; - + StatisticsValues m_statsAllTimesteps; + std::vector m_statsPrTs; cvf::ref m_statisticsCalculator; + size_t m_numBins; };