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
This commit is contained in:
Jørgen Herje 2023-02-13 09:59:29 +01:00 committed by GitHub
parent b3a56a9353
commit 2e6268ff0a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 257 additions and 45 deletions

View File

@ -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<RimHistogramCalculator> histogramCalculator;
histogramCalculator.reset( new RimHistogramCalculator );
histogramCalculator->setNumBins( static_cast<size_t>( m_numHistogramBins() ) );
RigHistogramData histogramData;

View File

@ -67,9 +67,18 @@ void caf::AppEnum<RimHistogramCalculator::StatisticsCellRangeType>::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 );

View File

@ -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<RigStatisticsDataCache> m_visibleCellStatistics;
size_t m_numBins;
};

View File

@ -43,6 +43,7 @@
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QCategoryAxis>
#include <QtCharts/QLegendMarker>
#include <QtCharts/QLineSeries>
#include <QtCharts/QValueAxis>
@ -60,7 +61,7 @@ void caf::AppEnum<RimStatisticsPlot::HistogramFrequencyType>::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<RimStatisticsPlot::GraphType>::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<caf::PdmUiLineEditorAttribute*>( 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<caf::PdmOptionItemInfo> RimStatisticsPlot::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions )
{
QList<caf::PdmOptionItemInfo> 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<std::pair<QString, double>> 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<QLegendMarker*> 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() );
}

View File

@ -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<caf::PdmOptionItemInfo> 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<int> m_precision;
caf::PdmField<caf::AppEnum<RiaNumberFormat::NumberFormatType>> m_tickNumberFormat;
caf::PdmField<caf::AppEnum<GraphType>> m_graphType;
caf::PdmField<caf::FontTools::RelativeSizeEnum> m_axisValueFontSize;
caf::PdmField<caf::FontTools::RelativeSizeEnum> m_axisTitleFontSize;
};

View File

@ -3524,3 +3524,11 @@ void RigCaseCellResultsData::copyResultsMetaDataFromMainCase( RigEclipseCaseData
cellResultsStorage->createPlaceholderResultEntries();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RigCaseCellResultsData::setStatisticsDataCacheNumBins( const RigEclipseResultAddress& resultAddress, size_t numBins )
{
this->statistics( resultAddress )->setNumBins( numBins );
}

View File

@ -145,6 +145,8 @@ public:
RiaDefines::PorosityModelType poroModel,
std::vector<RimEclipseCase*> destinationCases );
void setStatisticsDataCacheNumBins( const RigEclipseResultAddress& resultAddress, size_t numBins );
private:
size_t findOrLoadKnownScalarResult( const RigEclipseResultAddress& resVarAddr );
size_t findOrLoadKnownScalarResultByResultTypeOrder( const RigEclipseResultAddress& resVarAddr,

View File

@ -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 );
}

View File

@ -79,6 +79,7 @@ public:
const std::vector<int>& uniqueCellScalarValues( const RigFlowDiagResultAddress& resVarAddr );
const std::vector<int>& uniqueCellScalarValues( const RigFlowDiagResultAddress& resVarAddr, int timeStepIndex );
void mobileVolumeWeightedMean( const RigFlowDiagResultAddress& resVarAddr, int timeStepIndex, double* mean );
void mobileVolumeWeightedMean( const RigFlowDiagResultAddress& resVarAddr, double* mean );
std::pair<double, double> 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<double>* findOrCalculateResult( const RigFlowDiagResultAddress& resVarAddr, size_t timeStepIndex );
void calculateNativeResultsIfNotPreviouslyAttempted( size_t timeStepIndex,

View File

@ -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 );

View File

@ -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<int> m_uniqueValues;
};
StatisticsValues m_statsAllTimesteps;
std::vector<StatisticsValues> m_statsPrTs;
StatisticsValues m_statsAllTimesteps;
std::vector<StatisticsValues> m_statsPrTs;
cvf::ref<RigStatisticsCalculator> m_statisticsCalculator;
size_t m_numBins;
};