mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
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:
parent
b3a56a9353
commit
2e6268ff0a
@ -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;
|
||||
|
||||
|
@ -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 );
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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() );
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -3524,3 +3524,11 @@ void RigCaseCellResultsData::copyResultsMetaDataFromMainCase( RigEclipseCaseData
|
||||
cellResultsStorage->createPlaceholderResultEntries();
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RigCaseCellResultsData::setStatisticsDataCacheNumBins( const RigEclipseResultAddress& resultAddress, size_t numBins )
|
||||
{
|
||||
this->statistics( resultAddress )->setNumBins( numBins );
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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 );
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user