mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#7561 Ensemble Fracture Statistics: Select subset of statistics to compute.
This commit is contained in:
parent
d9cf453c1a
commit
7f35fb23c4
@ -36,6 +36,7 @@
|
|||||||
#include "cafAppEnum.h"
|
#include "cafAppEnum.h"
|
||||||
#include "cafPdmUiTextEditor.h"
|
#include "cafPdmUiTextEditor.h"
|
||||||
#include "cafPdmUiToolButtonEditor.h"
|
#include "cafPdmUiToolButtonEditor.h"
|
||||||
|
#include "cafPdmUiTreeSelectionEditor.h"
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
@ -76,13 +77,20 @@ RimEnsembleFractureStatistics::RimEnsembleFractureStatistics()
|
|||||||
m_filePathsTable.uiCapability()->setUiReadOnly( true );
|
m_filePathsTable.uiCapability()->setUiReadOnly( true );
|
||||||
m_filePathsTable.xmlCapability()->disableIO();
|
m_filePathsTable.xmlCapability()->disableIO();
|
||||||
|
|
||||||
|
CAF_PDM_InitField( &m_numSamplesX, "NumberOfSamplesX", 100, "X", "", "", "" );
|
||||||
|
CAF_PDM_InitField( &m_numSamplesY, "NumberOfSamplesY", 200, "Y", "", "", "" );
|
||||||
|
|
||||||
|
std::vector<caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>> defaultStatisticsTypes = {
|
||||||
|
caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>( RimEnsembleFractureStatistics::StatisticsType::MEAN ) };
|
||||||
|
|
||||||
|
CAF_PDM_InitField( &m_selectedStatisticsType, "SelectedStatisticsType", defaultStatisticsTypes, "Statistics Type", "", "", "" );
|
||||||
|
m_selectedStatisticsType.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() );
|
||||||
|
m_selectedStatisticsType.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP );
|
||||||
|
|
||||||
CAF_PDM_InitFieldNoDefault( &m_computeStatistics, "ComputeStatistics", "Compute", "", "", "" );
|
CAF_PDM_InitFieldNoDefault( &m_computeStatistics, "ComputeStatistics", "Compute", "", "", "" );
|
||||||
m_computeStatistics.uiCapability()->setUiEditorTypeName( caf::PdmUiToolButtonEditor::uiEditorTypeName() );
|
m_computeStatistics.uiCapability()->setUiEditorTypeName( caf::PdmUiToolButtonEditor::uiEditorTypeName() );
|
||||||
m_computeStatistics.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
|
m_computeStatistics.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
|
||||||
|
|
||||||
CAF_PDM_InitField( &m_numSamplesX, "NumberOfSamplesX", 100, "X", "", "", "" );
|
|
||||||
CAF_PDM_InitField( &m_numSamplesY, "NumberOfSamplesY", 200, "Y", "", "", "" );
|
|
||||||
|
|
||||||
setDeletable( true );
|
setDeletable( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,6 +124,29 @@ QString RimEnsembleFractureStatistics::generateFilePathsTable()
|
|||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
QList<caf::PdmOptionItemInfo>
|
||||||
|
RimEnsembleFractureStatistics::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
|
||||||
|
bool* useOptionsOnly )
|
||||||
|
{
|
||||||
|
QList<caf::PdmOptionItemInfo> options;
|
||||||
|
if ( fieldNeedingOptions == &m_selectedStatisticsType )
|
||||||
|
{
|
||||||
|
for ( size_t i = 0; i < caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>::size(); ++i )
|
||||||
|
{
|
||||||
|
caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType> t =
|
||||||
|
caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>::fromIndex( i );
|
||||||
|
t.uiText();
|
||||||
|
|
||||||
|
options.push_back( caf::PdmOptionItemInfo( t.uiText(), t.value() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -132,6 +163,16 @@ void RimEnsembleFractureStatistics::defineEditorAttribute( const caf::PdmFieldHa
|
|||||||
myAttr->textMode = caf::PdmUiTextEditorAttribute::HTML;
|
myAttr->textMode = caf::PdmUiTextEditorAttribute::HTML;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ( field == &m_selectedStatisticsType )
|
||||||
|
{
|
||||||
|
caf::PdmUiTreeSelectionEditorAttribute* attrib = dynamic_cast<caf::PdmUiTreeSelectionEditorAttribute*>( attribute );
|
||||||
|
if ( attrib )
|
||||||
|
{
|
||||||
|
attrib->showTextFilter = false;
|
||||||
|
attrib->showToggleAllCheckbox = false;
|
||||||
|
attrib->singleSelectionMode = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -171,6 +212,8 @@ std::vector<QString> RimEnsembleFractureStatistics::computeStatistics()
|
|||||||
|
|
||||||
std::map<std::pair<RimEnsembleFractureStatistics::StatisticsType, QString>, std::shared_ptr<RigSlice2D>> statisticsGridsAll;
|
std::map<std::pair<RimEnsembleFractureStatistics::StatisticsType, QString>, std::shared_ptr<RigSlice2D>> statisticsGridsAll;
|
||||||
|
|
||||||
|
auto selectedStatistics = m_selectedStatisticsType.value();
|
||||||
|
|
||||||
// TODO: take from an incoming xml?
|
// TODO: take from an incoming xml?
|
||||||
double timeStep = 1.0;
|
double timeStep = 1.0;
|
||||||
|
|
||||||
@ -223,7 +266,7 @@ std::vector<QString> RimEnsembleFractureStatistics::computeStatistics()
|
|||||||
sampleAllGrids( fractureGrids, samples, minX, minY, numSamplesX, numSamplesY, sampleDistanceX, sampleDistanceY );
|
sampleAllGrids( fractureGrids, samples, minX, minY, numSamplesX, numSamplesY, sampleDistanceX, sampleDistanceY );
|
||||||
|
|
||||||
std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>> statisticsGrids;
|
std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>> statisticsGrids;
|
||||||
generateStatisticsGrids( samples, numSamplesX, numSamplesY, statisticsGrids );
|
generateStatisticsGrids( samples, numSamplesX, numSamplesY, statisticsGrids, selectedStatistics );
|
||||||
|
|
||||||
for ( auto [statType, slice] : statisticsGrids )
|
for ( auto [statType, slice] : statisticsGrids )
|
||||||
{
|
{
|
||||||
@ -243,10 +286,8 @@ std::vector<QString> RimEnsembleFractureStatistics::computeStatistics()
|
|||||||
outputDirectory.mkpath( outputDirectoryPath );
|
outputDirectory.mkpath( outputDirectoryPath );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( size_t i = 0; i < caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>::size(); ++i )
|
for ( auto t : selectedStatistics )
|
||||||
{
|
{
|
||||||
caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType> t =
|
|
||||||
caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>::fromIndex( i );
|
|
||||||
QString text = t.text();
|
QString text = t.text();
|
||||||
|
|
||||||
// Get the all the properties for this statistics type
|
// Get the all the properties for this statistics type
|
||||||
@ -504,44 +545,77 @@ void RimEnsembleFractureStatistics::generateStatisticsGrids(
|
|||||||
const std::vector<std::vector<double>>& samples,
|
const std::vector<std::vector<double>>& samples,
|
||||||
int numSamplesX,
|
int numSamplesX,
|
||||||
int numSamplesY,
|
int numSamplesY,
|
||||||
std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>>& statisticsGrids )
|
std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>>& statisticsGrids,
|
||||||
|
const std::vector<caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>>& statisticsTypes )
|
||||||
{
|
{
|
||||||
for ( size_t i = 0; i < caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>::size(); ++i )
|
for ( auto t : statisticsTypes )
|
||||||
{
|
{
|
||||||
std::shared_ptr<RigSlice2D> grid = std::make_shared<RigSlice2D>( numSamplesX, numSamplesY );
|
std::shared_ptr<RigSlice2D> grid = std::make_shared<RigSlice2D>( numSamplesX, numSamplesY );
|
||||||
|
statisticsGrids[t.value()] = grid;
|
||||||
caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType> t =
|
|
||||||
caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>::fromIndex( i );
|
|
||||||
statisticsGrids[t.value()] = grid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto isCalculationEnabled = []( StatisticsType t, auto statisticsTypes ) {
|
||||||
|
return std::find( statisticsTypes.begin(), statisticsTypes.end(), t ) != statisticsTypes.end();
|
||||||
|
};
|
||||||
|
|
||||||
|
bool calculateMin = isCalculationEnabled( StatisticsType::MIN, statisticsTypes );
|
||||||
|
bool calculateMax = isCalculationEnabled( StatisticsType::MAX, statisticsTypes );
|
||||||
|
bool calculateMean = isCalculationEnabled( StatisticsType::MEAN, statisticsTypes );
|
||||||
|
bool calculateP10 = isCalculationEnabled( StatisticsType::P10, statisticsTypes );
|
||||||
|
bool calculateP50 = isCalculationEnabled( StatisticsType::P50, statisticsTypes );
|
||||||
|
bool calculateP90 = isCalculationEnabled( StatisticsType::P90, statisticsTypes );
|
||||||
|
bool calculateOccurrence = isCalculationEnabled( StatisticsType::OCCURRENCE, statisticsTypes );
|
||||||
|
|
||||||
for ( int y = 0; y < numSamplesY; y++ )
|
for ( int y = 0; y < numSamplesY; y++ )
|
||||||
{
|
{
|
||||||
for ( int x = 0; x < numSamplesX; x++ )
|
for ( int x = 0; x < numSamplesX; x++ )
|
||||||
{
|
{
|
||||||
size_t idx = y * numSamplesX + x;
|
size_t idx = y * numSamplesX + x;
|
||||||
double min;
|
|
||||||
double max;
|
|
||||||
double sum;
|
|
||||||
double range;
|
|
||||||
double mean;
|
|
||||||
double dev;
|
|
||||||
RigStatisticsMath::calculateBasicStatistics( samples[idx], &min, &max, &sum, &range, &mean, &dev );
|
|
||||||
|
|
||||||
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::MEAN]->setValue( x, y, mean );
|
if ( calculateMin || calculateMax || calculateMean )
|
||||||
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::MIN]->setValue( x, y, min );
|
{
|
||||||
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::MAX]->setValue( x, y, max );
|
double min;
|
||||||
|
double max;
|
||||||
|
double sum;
|
||||||
|
double range;
|
||||||
|
double mean;
|
||||||
|
double dev;
|
||||||
|
RigStatisticsMath::calculateBasicStatistics( samples[idx], &min, &max, &sum, &range, &mean, &dev );
|
||||||
|
|
||||||
double p10;
|
if ( calculateMean )
|
||||||
double p50;
|
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::MEAN]->setValue( x, y, mean );
|
||||||
double p90;
|
|
||||||
RigStatisticsMath::calculateStatisticsCurves( samples[idx], &p10, &p50, &p90, &mean );
|
|
||||||
|
|
||||||
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P10]->setValue( x, y, p10 );
|
if ( calculateMin )
|
||||||
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P50]->setValue( x, y, p50 );
|
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::MIN]->setValue( x, y, min );
|
||||||
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P90]->setValue( x, y, p90 );
|
|
||||||
|
|
||||||
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::OCCURRENCE]->setValue( x, y, samples[idx].size() );
|
if ( calculateMax )
|
||||||
|
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::MAX]->setValue( x, y, max );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( calculateP10 || calculateP50 || calculateP90 )
|
||||||
|
{
|
||||||
|
double p10;
|
||||||
|
double p50;
|
||||||
|
double p90;
|
||||||
|
double mean;
|
||||||
|
RigStatisticsMath::calculateStatisticsCurves( samples[idx], &p10, &p50, &p90, &mean );
|
||||||
|
|
||||||
|
if ( calculateP10 )
|
||||||
|
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P10]->setValue( x, y, p10 );
|
||||||
|
|
||||||
|
if ( calculateP50 )
|
||||||
|
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P50]->setValue( x, y, p50 );
|
||||||
|
|
||||||
|
if ( calculateP90 )
|
||||||
|
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P90]->setValue( x, y, p90 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( calculateOccurrence )
|
||||||
|
{
|
||||||
|
statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::OCCURRENCE]->setValue( x,
|
||||||
|
y,
|
||||||
|
samples[idx].size() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,9 @@ protected:
|
|||||||
caf::PdmUiEditorAttribute* attribute ) override;
|
caf::PdmUiEditorAttribute* attribute ) override;
|
||||||
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
||||||
|
|
||||||
|
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
|
||||||
|
bool* useOptionsOnly ) override;
|
||||||
|
|
||||||
QString generateFilePathsTable();
|
QString generateFilePathsTable();
|
||||||
|
|
||||||
std::vector<QString> computeStatistics();
|
std::vector<QString> computeStatistics();
|
||||||
@ -90,7 +93,8 @@ protected:
|
|||||||
const std::vector<std::vector<double>>& samples,
|
const std::vector<std::vector<double>>& samples,
|
||||||
int numSamplesX,
|
int numSamplesX,
|
||||||
int numSamplesY,
|
int numSamplesY,
|
||||||
std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>>& statisticsGrids );
|
std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>>& statisticsGrids,
|
||||||
|
const std::vector<caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>>& statisticsTypes );
|
||||||
|
|
||||||
static bool writeStatisticsToCsv( const QString& filePath, const RigSlice2D& samples );
|
static bool writeStatisticsToCsv( const QString& filePath, const RigSlice2D& samples );
|
||||||
|
|
||||||
@ -99,4 +103,6 @@ protected:
|
|||||||
caf::PdmField<bool> m_computeStatistics;
|
caf::PdmField<bool> m_computeStatistics;
|
||||||
caf::PdmField<int> m_numSamplesX;
|
caf::PdmField<int> m_numSamplesX;
|
||||||
caf::PdmField<int> m_numSamplesY;
|
caf::PdmField<int> m_numSamplesY;
|
||||||
|
|
||||||
|
caf::PdmField<std::vector<caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>>> m_selectedStatisticsType;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user