Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

#include "RimGridStatisticsHistogramDataSource.h"

#include "RiaResultNames.h"

#include "Histogram/RimHistogramPlot.h"
#include "RimEclipseCase.h"
#include "RimEclipseCellColors.h"
Expand Down Expand Up @@ -212,13 +214,21 @@ RimHistogramDataSource::HistogramResult RimGridStatisticsHistogramDataSource::co
//--------------------------------------------------------------------------------------------------
RigHistogramData RimGridStatisticsHistogramDataSource::createStatisticsData() const
{
std::unique_ptr<RimHistogramCalculator> histogramCalculator = std::make_unique<RimHistogramCalculator>();
histogramCalculator->setNumBins( static_cast<size_t>( m_numBins() ) );
RimHistogramCalculator histogramCalculator;
histogramCalculator.setNumBins( static_cast<size_t>( m_numBins() ) );

std::optional<std::pair<double, double>> customBinRange;
if ( useUserDefinedBinRange() ) customBinRange = std::make_pair( m_binRangeMin(), m_binRangeMax() );
histogramCalculator->setBinningParameters( binningMode(), outOfRangeHandling(), customBinRange );
histogramCalculator.setBinningParameters( binningMode(), outOfRangeHandling(), customBinRange );

return statisticsData( histogramCalculator );
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RigHistogramData RimGridStatisticsHistogramDataSource::statisticsData( RimHistogramCalculator& histogramCalculator ) const
{
RimHistogramCalculator::StatisticsCellRangeType cellRange = RimHistogramCalculator::StatisticsCellRangeType::ALL_CELLS;

RimHistogramCalculator::StatisticsTimeRangeType timeRange = RimHistogramCalculator::StatisticsTimeRangeType::ALL_TIMESTEPS;
Expand All @@ -234,15 +244,30 @@ RigHistogramData RimGridStatisticsHistogramDataSource::createStatisticsData() co
// Filter by visible cells of the view
cellRange = RimHistogramCalculator::StatisticsCellRangeType::VISIBLE_CELLS;
RimEclipseView* eclipseView = dynamic_cast<RimEclipseView*>( m_cellFilterView.value() );
return histogramCalculator->histogramData( eclipseView, m_property.value(), cellRange, timeRange, timeStep );
return histogramCalculator.histogramData( eclipseView, m_property.value(), cellRange, timeRange, timeStep );
}
else
{
RimEclipseView* eclipseView = nullptr;
return histogramCalculator->histogramData( eclipseView, m_property.value(), cellRange, timeRange, timeStep );
return histogramCalculator.histogramData( eclipseView, m_property.value(), cellRange, timeRange, timeStep );
}
}

//--------------------------------------------------------------------------------------------------
/// The range of the data selected for the histogram: the statistics are computed without custom
/// binning, where min and max always are the data range.
//--------------------------------------------------------------------------------------------------
std::optional<std::pair<double, double>> RimGridStatisticsHistogramDataSource::dataRange() const
{
RimHistogramCalculator histogramCalculator;
RigHistogramData histogramData = statisticsData( histogramCalculator );

if ( !RigStatisticsTools::isValidNumber( histogramData.min ) || !RigStatisticsTools::isValidNumber( histogramData.max ) )
return std::nullopt;

return std::make_pair( histogramData.min, histogramData.max );
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -277,6 +302,19 @@ std::string RimGridStatisticsHistogramDataSource::name() const
return nameTags.join( ", " ).toStdString();
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<QString> RimGridStatisticsHistogramDataSource::filterDescriptions() const
{
std::vector<QString> descriptions;
if ( m_cellFilterView() ) descriptions.push_back( "Filter: Visible cells in 3D view" );

auto baseDescriptions = RimHistogramDataSource::filterDescriptions();
descriptions.insert( descriptions.end(), baseDescriptions.begin(), baseDescriptions.end() );
return descriptions;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand All @@ -287,6 +325,10 @@ void RimGridStatisticsHistogramDataSource ::initAfterRead()
{
m_property->setEclipseCase( eclipseCase );
}

// A binning mode stored in the project file is a user choice: only property changes made after
// the project was loaded should enable logarithmic binning.
m_previousResultVariable = m_property->resultVariable();
}

//--------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -327,9 +369,37 @@ void RimGridStatisticsHistogramDataSource::cellFilterViewUpdated()
//--------------------------------------------------------------------------------------------------
void RimGridStatisticsHistogramDataSource::loadDataAndUpdate()
{
updateBinningOnPropertyChange();

dataSourceChanged.send();
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RigHistogramCalculator::BinningMode RimGridStatisticsHistogramDataSource::binningModeForResult( const QString& resultVariable )
{
return RiaResultNames::isLogarithmicResult( resultVariable ) ? RigHistogramCalculator::BinningMode::LOGARITHMIC
: RigHistogramCalculator::BinningMode::LINEAR;
}

//--------------------------------------------------------------------------------------------------
/// The binning follows the selected property: logarithmic results are best viewed with logarithmic
/// binning, others with linear binning, and a user-defined bin range set up for one result does not
/// apply to the value range of another. Only an actual property change updates the binning: the
/// user stays in control of the settings afterwards.
//--------------------------------------------------------------------------------------------------
void RimGridStatisticsHistogramDataSource::updateBinningOnPropertyChange()
{
const QString resultVariable = m_property()->resultVariable();
if ( resultVariable != m_previousResultVariable )
{
setBinningMode( binningModeForResult( resultVariable ) );
resetBinRange();
m_previousResultVariable = resultVariable;
}
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand All @@ -345,5 +415,7 @@ void RimGridStatisticsHistogramDataSource::setPropertiesFromView( RimEclipseView
const RimEclipseResultDefinition* resDef = dynamic_cast<const RimEclipseResultDefinition*>( view->cellResult() );
if ( resDef ) m_property->simpleCopy( resDef );

updateBinningOnPropertyChange();

dataSourceChanged.send();
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class RimCase;
class RimGridView;
class RimEclipseResultDefinition;
class RimEclipseView;
class RimHistogramCalculator;

//==================================================================================================
///
Expand All @@ -54,6 +55,8 @@ class RimGridStatisticsHistogramDataSource : public RimHistogramDataSource

std::string name() const override;

std::vector<QString> filterDescriptions() const override;

void setDefaults() override;

void cellFilterViewUpdated();
Expand All @@ -62,18 +65,28 @@ class RimGridStatisticsHistogramDataSource : public RimHistogramDataSource

void setPropertiesFromView( RimEclipseView* view );

static RigHistogramCalculator::BinningMode binningModeForResult( const QString& resultVariable );

std::optional<std::pair<double, double>> dataRange() const override;

protected:
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
void initAfterRead() override;

RigHistogramData createStatisticsData() const;
RigHistogramData statisticsData( RimHistogramCalculator& histogramCalculator ) const;

void updateBinningOnPropertyChange();

caf::PdmPtrField<RimCase*> m_case;
caf::PdmField<int> m_timeStep;
caf::PdmPtrField<RimGridView*> m_cellFilterView;
caf::PdmChildField<RimEclipseResultDefinition*> m_property;
caf::PdmField<int> m_numBins;
caf::PdmField<bool> m_cumulative;

private:
QString m_previousResultVariable;
};
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ void RimHistogramCurve::setDataSource( RimHistogramDataSource* dataSource )
m_dataSource->uiCapability()->setUiTreeHidden( true );
m_dataSource->dataSourceChanged.connect( this, &RimHistogramCurve::onDataSourceChanged );
m_dataSource->cumulativeChanged.connect( this, &RimHistogramCurve::onCumulativeChanged );
m_dataSource->logarithmicBinningEnabled.connect( this, &RimHistogramCurve::onLogarithmicBinningEnabled );
m_dataSource->binningModeChanged.connect( this, &RimHistogramCurve::onBinningModeChanged );
}
}

Expand Down Expand Up @@ -606,16 +606,16 @@ void RimHistogramCurve::onCumulativeChanged( const caf::SignalEmitter* emitter )
}

//--------------------------------------------------------------------------------------------------
/// Logarithmic bins are best viewed on a logarithmic axis: enable it once when logarithmic binning
/// is selected. The user stays in control of the axis setting afterwards.
/// Bins are best viewed on a matching axis: select a logarithmic axis for logarithmic binning and a
/// linear axis for linear binning. The user stays in control of the axis setting afterwards.
//--------------------------------------------------------------------------------------------------
void RimHistogramCurve::onLogarithmicBinningEnabled( const caf::SignalEmitter* emitter )
void RimHistogramCurve::onBinningModeChanged( const caf::SignalEmitter* emitter, RigHistogramCalculator::BinningMode binningMode )
{
auto plot = firstAncestorOrThisOfType<RimHistogramPlot>();
if ( !plot ) return;

auto axisProperties = dynamic_cast<RimPlotAxisProperties*>( plot->axisPropertiesForPlotAxis( axisX() ) );
if ( axisProperties ) axisProperties->setLogarithmicScaleEnabled( true );
if ( axisProperties ) axisProperties->setLogarithmicScaleEnabled( binningMode == RigHistogramCalculator::BinningMode::LOGARITHMIC );
Comment thread
kriben marked this conversation as resolved.
}

//--------------------------------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

#pragma once

#include "RigStatisticsMath.h"

#include "RiuPlotAnnotationTool.h"
#include "cafPdmChildField.h"
#include "cafPdmField.h"
Expand Down Expand Up @@ -86,7 +88,7 @@ class RimHistogramCurve : public RimStackablePlotCurve

void onDataSourceChanged( const caf::SignalEmitter* emitter );
void onCumulativeChanged( const caf::SignalEmitter* emitter );
void onLogarithmicBinningEnabled( const caf::SignalEmitter* emitter );
void onBinningModeChanged( const caf::SignalEmitter* emitter, RigHistogramCalculator::BinningMode binningMode );

void updateCumulativeCurve();
void connectReferencedDataSourceSignals();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ void RimHistogramCurveCollection::loadDataAndUpdate( bool updateParentPlot )
{
auto parentPlot = firstAncestorOrThisOfTypeAsserted<RimHistogramPlot>();
parentPlot->updateAll();
parentPlot->updatePlotInfoLabel();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ void caf::AppEnum<RigHistogramCalculator::OutOfRangeHandling>::setUp()
RimHistogramDataSource::RimHistogramDataSource()
: dataSourceChanged( this )
, cumulativeChanged( this )
, logarithmicBinningEnabled( this )
, binningModeChanged( this )
{
CAF_PDM_InitObject( "Histogram Data Source", );

Expand Down Expand Up @@ -90,14 +90,75 @@ void RimHistogramDataSource::setShowCumulativeCurve( bool showCumulativeCurve )
{
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimHistogramDataSource::setBinningMode( RigHistogramCalculator::BinningMode binningMode )
{
m_binningMode = binningMode;
binningModeChanged.send( binningMode );
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimHistogramDataSource::resetBinRange()
{
m_binRangeMode = BinRangeMode::AUTOMATIC;
m_binRangeMin = m_binRangeMin.defaultValue();
m_binRangeMax = m_binRangeMax.defaultValue();
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::optional<std::pair<double, double>> RimHistogramDataSource::dataRange() const
{
return std::nullopt;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<QString> RimHistogramDataSource::filterDescriptions() const
{
if ( useUserDefinedBinRange() ) return { userDefinedRangeFilterText( m_binRangeMin(), m_binRangeMax() ) };

return {};
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimHistogramDataSource::userDefinedRangeFilterText( double min, double max )
{
return QString( "Filter: User defined x-range [%1..%2]" ).arg( min ).arg( max );
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimHistogramDataSource::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue )
{
if ( changedField == &m_binningMode && m_binningMode() == RigHistogramCalculator::BinningMode::LOGARITHMIC )
if ( changedField == &m_binningMode )
{
logarithmicBinningEnabled.send();
binningModeChanged.send( m_binningMode() );
}

// Stale cutoffs are of no use when the user returns to a user-defined range later
if ( changedField == &m_binRangeMode && m_binRangeMode() == BinRangeMode::AUTOMATIC )
{
resetBinRange();
}

// Start a user-defined range at the data range: the default [0..1] could exclude most values
if ( changedField == &m_binRangeMode && m_binRangeMode() == BinRangeMode::USER_DEFINED )
{
if ( auto range = dataRange() )
{
m_binRangeMin = range->first;
m_binRangeMax = range->second;
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,12 @@
#include "cafPdmObject.h"
#include "cafSignal.h"

#include <QString>

#include <limits>
#include <optional>
#include <utility>
#include <vector>

//==================================================================================================
///
Expand Down Expand Up @@ -64,9 +68,9 @@ class RimHistogramDataSource : public caf::PdmObject
RimHistogramDataSource();
~RimHistogramDataSource() override;

caf::Signal<> dataSourceChanged;
caf::Signal<> cumulativeChanged;
caf::Signal<> logarithmicBinningEnabled;
caf::Signal<> dataSourceChanged;
caf::Signal<> cumulativeChanged;
caf::Signal<RigHistogramCalculator::BinningMode> binningModeChanged;

virtual std::string unitNameX() const = 0;
virtual std::string unitNameY() const = 0;
Expand All @@ -77,6 +81,14 @@ class RimHistogramDataSource : public caf::PdmObject
virtual bool showCumulativeCurve() const;
virtual void setShowCumulativeCurve( bool showCumulativeCurve );

void setBinningMode( RigHistogramCalculator::BinningMode binningMode );
void resetBinRange();

virtual std::optional<std::pair<double, double>> dataRange() const;

virtual std::vector<QString> filterDescriptions() const;
static QString userDefinedRangeFilterText( double min, double max );

virtual void setDefaults() = 0;

virtual std::string name() const = 0;
Expand Down
Loading
Loading