Files

271 lines
11 KiB
C++
Raw Permalink Normal View History

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2021 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
2024-10-21 14:40:25 +02:00
#include "Summary/RiaSummaryStringTools.h"
#include "RiaLogging.h"
2021-12-23 09:30:36 +01:00
#include "RiaStdStringTools.h"
2022-03-11 13:24:01 +01:00
#include "RiaTextStringTools.h"
2024-10-21 14:40:25 +02:00
#include "Summary/RiaSummaryTools.h"
2021-12-23 09:30:36 +01:00
#include "RifEclipseSummaryAddress.h"
2021-12-23 09:30:36 +01:00
#include "RifReaderEclipseSummary.h"
#include "RifSummaryReaderInterface.h"
2021-12-23 09:30:36 +01:00
#include "RimMainPlotCollection.h"
#include "RimSummaryCase.h"
2021-12-23 09:30:36 +01:00
#include "RimSummaryCaseMainCollection.h"
#include "RimSummaryEnsemble.h"
2021-12-23 09:30:36 +01:00
#include "SummaryPlotCommands/RicSummaryPlotFeatureImpl.h"
#include <QRegularExpression>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiaSummaryStringTools::splitAddressFiltersInGridAndSummary( RimSummaryCase* summaryCase,
const QStringList& addressFilters,
QStringList* summaryAddressFilters,
QStringList* gridResultAddressFilters )
{
2025-08-16 15:20:55 +02:00
if ( summaryCase && summaryCase->summaryReader() )
{
const std::set<RifEclipseSummaryAddress>& addrs = summaryCase->summaryReader()->allResultAddresses();
QRegularExpression gridAddressPattern( "^[A-Z]+:[0-9]+,[0-9]+,[0-9]+$" );
for ( int filterIdx = 0; filterIdx < addressFilters.size(); ++filterIdx )
{
const QString& address = addressFilters[filterIdx];
if ( hasFilterAnyMatch( address, addrs ) )
{
summaryAddressFilters->push_back( address );
}
else
{
if ( gridAddressPattern.match( address ).hasMatch() )
{
gridResultAddressFilters->push_back( address );
}
else
{
RiaLogging::warning( "No summary or restart vectors matched \"" + address + "\"" );
}
}
}
}
}
2021-12-23 09:30:36 +01:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::pair<QStringList, QStringList> RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( const QString& filter )
{
auto words = RiaSummaryStringTools::splitIntoWords( filter );
auto [summaryCases, ensembles] = RiaSummaryStringTools::allDataSourcesInProject();
auto dataSourceNames = RiaSummaryStringTools::dataSourceNames( summaryCases, ensembles );
QStringList addressFilters;
QStringList dataSourceFilters;
RiaSummaryStringTools::splitUsingDataSourceNames( words, dataSourceNames, addressFilters, dataSourceFilters );
// If no filter on data source is specified, use wildcard to match all
if ( dataSourceFilters.empty() ) dataSourceFilters.push_back( "*" );
return { addressFilters, dataSourceFilters };
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2023-02-26 10:48:40 +01:00
bool RiaSummaryStringTools::hasFilterAnyMatch( const QString& curveFilter, const std::set<RifEclipseSummaryAddress>& summaryAddresses )
{
for ( const auto& addr : summaryAddresses )
{
if ( addr.isUiTextMatchingFilterText( curveFilter ) ) return true;
}
return false;
}
//--------------------------------------------------------------------------------------------------
/// Sort filters into curve and data source filters
//--------------------------------------------------------------------------------------------------
2021-12-23 09:30:36 +01:00
void RiaSummaryStringTools::splitUsingDataSourceNames( const QStringList& filters,
const QStringList& dataSourceNames,
QStringList& addressFilters,
QStringList& dataSourceFilters )
{
for ( const auto& s : filters )
{
// Strip off realization filter from ensemble search string
QString pureDataSourceCandidate = s.left( s.indexOf( ':' ) );
bool foundDataSource = false;
2024-10-28 13:09:18 +01:00
QString regexPattern = QRegularExpression::wildcardToRegularExpression( pureDataSourceCandidate );
QRegularExpression searcher( regexPattern, QRegularExpression::CaseInsensitiveOption );
for ( const auto& ds : dataSourceNames )
{
2024-10-28 13:09:18 +01:00
if ( !foundDataSource && searcher.match( ds ).hasMatch() )
{
dataSourceFilters.push_back( s );
foundDataSource = true;
}
}
if ( !foundDataSource )
{
addressFilters.push_back( s );
}
}
}
2021-12-23 09:30:36 +01:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::pair<std::vector<RimSummaryCase*>, std::vector<RimSummaryEnsemble*>> RiaSummaryStringTools::allDataSourcesInProject()
2021-12-23 09:30:36 +01:00
{
auto sumCaseMainColl = RiaSummaryTools::summaryCaseMainCollection();
if ( !sumCaseMainColl ) return { {}, {} };
2021-12-23 09:30:36 +01:00
auto summaryCases = sumCaseMainColl->topLevelSummaryCases();
auto ensembles = sumCaseMainColl->summaryEnsembles();
2021-12-23 09:30:36 +01:00
return { summaryCases, ensembles };
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::pair<std::vector<RimSummaryCase*>, std::vector<RimSummaryEnsemble*>>
2021-12-23 09:30:36 +01:00
RiaSummaryStringTools::dataSourcesMatchingFilters( const QStringList& dataSourceFilters )
{
std::vector<RimSummaryCase*> matchingSummaryCases;
std::vector<RimSummaryEnsemble*> matchingEnsembles;
2021-12-23 09:30:36 +01:00
auto [allSummaryCases, allEnsembles] = allDataSourcesInProject();
for ( const auto& dsFilter : dataSourceFilters )
{
2024-10-28 13:09:18 +01:00
QString searchString = dsFilter.left( dsFilter.indexOf( ':' ) );
QString regexPattern = QRegularExpression::wildcardToRegularExpression( searchString );
QRegularExpression searcher( regexPattern, QRegularExpression::CaseInsensitiveOption );
2021-12-23 09:30:36 +01:00
for ( const auto& ensemble : allEnsembles )
{
auto ensembleName = ensemble->name();
2024-10-28 13:09:18 +01:00
if ( searcher.match( ensembleName ).hasMatch() )
2021-12-23 09:30:36 +01:00
{
if ( searchString == dsFilter )
{
// Match on ensemble name without realization filter
matchingEnsembles.push_back( ensemble );
}
else
{
// Match on subset of realisations in ensemble
2024-10-28 13:09:18 +01:00
QString realizationSearchString = dsFilter.right( dsFilter.size() - dsFilter.indexOf( ':' ) - 1 );
QString regexPattern = QRegularExpression::wildcardToRegularExpression( realizationSearchString );
QRegularExpression realizationSearcher( regexPattern, QRegularExpression::CaseInsensitiveOption );
2021-12-23 09:30:36 +01:00
for ( const auto& summaryCase : ensemble->allSummaryCases() )
{
auto realizationName = summaryCase->displayCaseName();
2024-10-28 13:09:18 +01:00
if ( realizationSearcher.match( realizationName ).hasMatch() )
2021-12-23 09:30:36 +01:00
{
matchingSummaryCases.push_back( summaryCase );
}
}
}
}
}
for ( const auto& summaryCase : allSummaryCases )
{
auto summaryCaseName = summaryCase->displayCaseName();
2024-10-28 13:09:18 +01:00
if ( searcher.match( summaryCaseName ).hasMatch() )
2021-12-23 09:30:36 +01:00
{
matchingSummaryCases.push_back( summaryCase );
}
}
}
return { matchingSummaryCases, matchingEnsembles };
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QStringList RiaSummaryStringTools::splitIntoWords( const QString& text )
{
2024-10-28 13:09:18 +01:00
return RiaTextStringTools::splitSkipEmptyParts( text );
2021-12-23 09:30:36 +01:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QStringList RiaSummaryStringTools::dataSourceNames( const std::vector<RimSummaryCase*>& summaryCases,
const std::vector<RimSummaryEnsemble*>& ensembles )
2021-12-23 09:30:36 +01:00
{
QStringList names;
for ( const auto& summaryCase : summaryCases )
{
names.push_back( summaryCase->displayCaseName() );
}
for ( const auto& ensemble : ensembles )
{
names.push_back( ensemble->name() );
}
return names;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2023-04-13 07:05:53 +02:00
std::set<RifEclipseSummaryAddress> RiaSummaryStringTools::computeFilteredAddresses( const QStringList& textFilters,
2023-02-26 10:48:40 +01:00
const std::set<RifEclipseSummaryAddress>& sourceAddresses,
bool includeDiffCurves )
2021-12-23 09:30:36 +01:00
{
std::set<RifEclipseSummaryAddress> addresses;
std::vector<bool> usedFilters;
RicSummaryPlotFeatureImpl::insertFilteredAddressesInSet( textFilters, sourceAddresses, &addresses, &usedFilters );
if ( includeDiffCurves ) return addresses;
const auto diffText = RifEclipseSummaryAddressDefines::differenceIdentifier();
2021-12-23 09:30:36 +01:00
std::set<RifEclipseSummaryAddress> addressesWithoutDiffVectors;
for ( const auto& adr : addresses )
{
2022-05-06 16:34:37 +02:00
if ( RiaStdStringTools::endsWith( adr.vectorName(), diffText ) ) continue;
2021-12-23 09:30:36 +01:00
addressesWithoutDiffVectors.insert( adr );
}
return addressesWithoutDiffVectors;
}