#3060 Resampled plot export. Prepare for resampling during summary plot export

This commit is contained in:
Bjørn Erik Jensen 2018-06-19 15:39:27 +02:00
parent 16725b2376
commit 7e6943aa96
4 changed files with 134 additions and 127 deletions

View File

@ -33,6 +33,7 @@ class DateTimeSpan;
//================================================================================================== //==================================================================================================
enum class DateTimePeriod enum class DateTimePeriod
{ {
NONE = -1,
DECADE, DECADE,
YEAR, YEAR,
HALFYEAR, HALFYEAR,

View File

@ -34,7 +34,6 @@
// return QString("%1.%2.%3 %4:%5:%6").arg(y).arg(m).arg(d).arg(h).arg(mm).arg(s); // return QString("%1.%2.%3 %4:%5:%6").arg(y).arg(m).arg(d).arg(h).arg(mm).arg(s);
//} //}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -185,7 +184,7 @@ void RiaTimeHistoryCurveResampler::clearData()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaTimeHistoryCurveResampler::computeResampledTimeSteps(DateTimePeriod period) void RiaTimeHistoryCurveResampler::computeResampledTimeSteps(DateTimePeriod period)
{ {
CVF_ASSERT(m_originalValues.second.size() > 0); CVF_ASSERT(period != DateTimePeriod::NONE && m_originalValues.second.size() > 0);
auto firstOriginalTimeStep = QDT::fromTime_t(m_originalValues.second.front()); auto firstOriginalTimeStep = QDT::fromTime_t(m_originalValues.second.front());
auto lastOriginalTimeStep = QDT::fromTime_t(m_originalValues.second.back()); auto lastOriginalTimeStep = QDT::fromTime_t(m_originalValues.second.back());

View File

@ -20,6 +20,7 @@
#include "RiaApplication.h" #include "RiaApplication.h"
#include "RiaSummaryCurveAnalyzer.h" #include "RiaSummaryCurveAnalyzer.h"
#include "RiaTimeHistoryCurveResampler.h"
#include "SummaryPlotCommands/RicSummaryCurveCreator.h" #include "SummaryPlotCommands/RicSummaryCurveCreator.h"
@ -61,6 +62,25 @@
CAF_PDM_SOURCE_INIT(RimSummaryPlot, "SummaryPlot"); CAF_PDM_SOURCE_INIT(RimSummaryPlot, "SummaryPlot");
//--------------------------------------------------------------------------------------------------
/// Internal data
//--------------------------------------------------------------------------------------------------
struct CurveData
{
QString name;
RifEclipseSummaryAddress address;
std::vector<double> values;
};
//--------------------------------------------------------------------------------------------------
/// Internal functions
//--------------------------------------------------------------------------------------------------
void prepareCaseCurvesForExport(DateTimePeriod period,
const std::vector<time_t> &timeSteps, const std::vector<CurveData>& curveData,
std::vector<time_t>* resampledTimeSteps, std::vector<CurveData>* resampledValues);
void appendToExportData(QString& out, const std::vector<time_t>& timeSteps, const std::vector<CurveData>& curveData);
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -243,100 +263,69 @@ QWidget* RimSummaryPlot::viewWidget()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QString RimSummaryPlot::asciiDataForPlotExport() const QString RimSummaryPlot::asciiDataForPlotExport(DateTimePeriod resamplingPeriod) const
{ {
QString out; QString out;
RiaTimeHistoryCurveResampler resampler;
out += description(); out += description();
// Summary curves
{ {
std::vector<RimSummaryCurve*> curves; std::vector<RimSummaryCurve*> curves;
this->descendantsIncludingThisOfType(curves); this->descendantsIncludingThisOfType(curves);
std::vector<QString> caseNames; std::vector<QString> caseNames;
std::vector<std::vector<time_t> > timeSteps; std::vector<std::vector<time_t> > timeSteps;
std::vector<std::vector<CurveData>> allCurveData;
std::vector<std::vector<std::vector<double> > > allCurveData; // Vector containing cases - curves
std::vector<std::vector<QString > > allCurveNames;
//Vectors containing cases - curves - data points/curve name
for (RimSummaryCurve* curve : curves) for (RimSummaryCurve* curve : curves)
{ {
if (!curve->isCurveVisible()) continue; if (!curve->isCurveVisible()) continue;
QString curveCaseName = curve->summaryCaseY()->caseName(); QString curveCaseName = curve->summaryCaseY()->caseName();
size_t casePosInList = cvf::UNDEFINED_SIZE_T; size_t casePosInList = cvf::UNDEFINED_SIZE_T;
for (size_t i = 0; i < caseNames.size(); i++) for (size_t i = 0; i < caseNames.size(); i++)
{ {
if (curveCaseName == caseNames[i]) casePosInList = i; if (curveCaseName == caseNames[i]) casePosInList = i;
} }
CurveData curveData = { curve->curveName(), curve->summaryAddressY(), curve->valuesY() };
if (casePosInList == cvf::UNDEFINED_SIZE_T) if (casePosInList == cvf::UNDEFINED_SIZE_T)
{ {
caseNames.push_back(curveCaseName); caseNames.push_back(curveCaseName);
timeSteps.push_back(curve->timeStepsY());
std::vector<time_t> curveTimeSteps = curve->timeStepsY(); allCurveData.push_back(std::vector<CurveData>({ curveData }));
timeSteps.push_back(curveTimeSteps);
std::vector<std::vector<double> > curveDataForCase;
std::vector<double> curveYData = curve->valuesY();
curveDataForCase.push_back(curveYData);
allCurveData.push_back(curveDataForCase);
std::vector<QString> curveNamesForCase;
curveNamesForCase.push_back(curve->curveName());
allCurveNames.push_back(curveNamesForCase);
} }
else else
{ {
std::vector<double> curveYData = curve->valuesY(); allCurveData[casePosInList].push_back(curveData);
allCurveData[casePosInList].push_back(curveYData);
QString curveName = curve->curveName();
allCurveNames[casePosInList].push_back(curveName);
} }
} }
for (size_t i = 0; i < timeSteps.size(); i++) //cases for (size_t i = 0; i < timeSteps.size(); i++) //cases
{ {
// Data for export
std::vector<time_t> expTimeSteps;
std::vector<CurveData> expCurveData;
out += "\n\n"; out += "\n\n";
out += "Case: " + caseNames[i]; out += "Case: " + caseNames[i];
out += "\n"; out += "\n";
for (size_t j = 0; j < timeSteps[i].size(); j++) //time steps & data points prepareCaseCurvesForExport(resamplingPeriod, timeSteps[i], allCurveData[i], &expTimeSteps, &expCurveData);
{ appendToExportData(out, expTimeSteps, expCurveData);
if (j == 0)
{
out += "Date and time";
for (size_t k = 0; k < allCurveNames[i].size(); k++) // curves
{
out += "\t" + (allCurveNames[i][k]);
}
}
out += "\n";
out += QDateTime::fromTime_t(timeSteps[i][j]).toUTC().toString("yyyy-MM-dd hh:mm:ss ");
for (size_t k = 0; k < allCurveData[i].size(); k++) // curves
{
QString valueText;
if (j < allCurveData[i][k].size())
{
valueText = QString::number(allCurveData[i][k][j], 'g', 6);
}
out += "\t" + valueText;
}
}
} }
} }
// Time history curves (from grid)
{ {
std::vector<QString> caseNames; std::vector<QString> caseNames;
std::vector<std::vector<time_t> > timeSteps; std::vector<std::vector<time_t> > timeSteps;
std::vector<std::vector<CurveData>> allCurveData;
std::vector<std::vector<std::vector<double> > > allCurveData; // Vector containing cases - curves
std::vector<std::vector<QString > > allCurveNames;
//Vectors containing cases - curves - data points/curve name
for (RimGridTimeHistoryCurve* curve : m_gridTimeHistoryCurves) for (RimGridTimeHistoryCurve* curve : m_gridTimeHistoryCurves)
{ {
@ -349,65 +338,40 @@ QString RimSummaryPlot::asciiDataForPlotExport() const
if (curveCaseName == caseNames[i]) casePosInList = i; if (curveCaseName == caseNames[i]) casePosInList = i;
} }
CurveData curveData = { curve->curveName(), RifEclipseSummaryAddress(), curve->yValues() };
if (casePosInList == cvf::UNDEFINED_SIZE_T) if (casePosInList == cvf::UNDEFINED_SIZE_T)
{ {
caseNames.push_back(curveCaseName); caseNames.push_back(curveCaseName);
timeSteps.push_back(curve->timeStepValues());
std::vector<time_t> curveTimeSteps = curve->timeStepValues(); allCurveData.push_back(std::vector<CurveData>({ curveData }));
timeSteps.push_back(curveTimeSteps);
std::vector<std::vector<double> > curveDataForCase;
std::vector<double> curveYData = curve->yValues();
curveDataForCase.push_back(curveYData);
allCurveData.push_back(curveDataForCase);
std::vector<QString> curveNamesForCase;
curveNamesForCase.push_back(curve->curveName());
allCurveNames.push_back(curveNamesForCase);
} }
else else
{ {
std::vector<double> curveYData = curve->yValues(); allCurveData[casePosInList].push_back(curveData);
allCurveData[casePosInList].push_back(curveYData);
QString curveName = curve->curveName();
allCurveNames[casePosInList].push_back(curveName);
} }
} }
for (size_t i = 0; i < timeSteps.size(); i++) //cases for (size_t i = 0; i < timeSteps.size(); i++) //cases
{ {
// Data for export
std::vector<time_t> expTimeSteps;
std::vector<CurveData> expCurveData;
out += "\n\n"; out += "\n\n";
out += "Case: " + caseNames[i]; out += "Case: " + caseNames[i];
out += "\n"; out += "\n";
for (size_t j = 0; j < timeSteps[i].size(); j++) //time steps & data points prepareCaseCurvesForExport(resamplingPeriod, timeSteps[i], allCurveData[i], &expTimeSteps, &expCurveData);
{ appendToExportData(out, expTimeSteps, expCurveData);
if (j == 0)
{
out += "Date and time";
for (size_t k = 0; k < allCurveNames[i].size(); k++) // curves
{
out += "\t" + (allCurveNames[i][k]);
}
}
out += "\n";
out += QDateTime::fromTime_t(timeSteps[i][j]).toUTC().toString("yyyy-MM-dd hh:mm:ss ");
for (size_t k = 0; k < allCurveData[i].size(); k++) // curves
{
out += "\t" + QString::number(allCurveData[i][k][j], 'g', 6);
}
}
} }
} }
// Pasted observed data
{ {
std::vector<std::vector<time_t> > timeSteps; std::vector<std::vector<time_t> > timeSteps;
std::vector<std::vector<CurveData>> allCurveData;
std::vector<std::vector<std::vector<double> > > allCurveData; // Vector containing cases - curves
std::vector<std::vector<QString > > allCurveNames;
//Vectors containing cases - curves - data points/curve name
for (RimAsciiDataCurve* curve : m_asciiDataCurves) for (RimAsciiDataCurve* curve : m_asciiDataCurves)
{ {
@ -415,52 +379,29 @@ QString RimSummaryPlot::asciiDataForPlotExport() const
size_t casePosInList = cvf::UNDEFINED_SIZE_T; size_t casePosInList = cvf::UNDEFINED_SIZE_T;
CurveData curveData = { curve->curveName(), RifEclipseSummaryAddress(), curve->yValues() };
if (casePosInList == cvf::UNDEFINED_SIZE_T) if (casePosInList == cvf::UNDEFINED_SIZE_T)
{ {
std::vector<time_t> curveTimeSteps = curve->timeSteps(); timeSteps.push_back(curve->timeSteps());
timeSteps.push_back(curveTimeSteps); allCurveData.push_back(std::vector<CurveData>({ curveData }));
std::vector<std::vector<double> > curveDataForCase;
std::vector<double> curveYData = curve->yValues();
curveDataForCase.push_back(curveYData);
allCurveData.push_back(curveDataForCase);
std::vector<QString> curveNamesForCase;
curveNamesForCase.push_back(curve->curveName());
allCurveNames.push_back(curveNamesForCase);
} }
else else
{ {
std::vector<double> curveYData = curve->yValues(); allCurveData[casePosInList].push_back(curveData);
allCurveData[casePosInList].push_back(curveYData);
QString curveName = curve->curveName();
allCurveNames[casePosInList].push_back(curveName);
} }
} }
for (size_t i = 0; i < timeSteps.size(); i++) //cases for (size_t i = 0; i < timeSteps.size(); i++) //cases
{ {
// Data for export
std::vector<time_t> expTimeSteps;
std::vector<CurveData> expCurveData;
out += "\n\n"; out += "\n\n";
for (size_t j = 0; j < timeSteps[i].size(); j++) //time steps & data points prepareCaseCurvesForExport(resamplingPeriod, timeSteps[i], allCurveData[i], &expTimeSteps, &expCurveData);
{ appendToExportData(out, expTimeSteps, expCurveData);
if (j == 0)
{
out += "Date and time";
for (size_t k = 0; k < allCurveNames[i].size(); k++) // curves
{
out += "\t" + (allCurveNames[i][k]);
}
}
out += "\n";
out += QDateTime::fromTime_t(timeSteps[i][j]).toUTC().toString("yyyy-MM-dd hh:mm:ss ");
for (size_t k = 0; k < allCurveData[i].size(); k++) // curves
{
out += "\t" + QString::number(allCurveData[i][k][j], 'g', 6);
}
}
} }
} }
@ -1695,3 +1636,68 @@ void RimSummaryPlot::defineEditorAttribute(const caf::PdmFieldHandle* field, QSt
} }
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void prepareCaseCurvesForExport(DateTimePeriod period,
const std::vector<time_t> &timeSteps, const std::vector<CurveData>& curveData,
std::vector<time_t>* resampledTimeSteps, std::vector<CurveData>* resampledCurveData)
{
RiaTimeHistoryCurveResampler resampler;
resampledTimeSteps->clear();
resampledCurveData->clear();
if (period != DateTimePeriod::NONE)
{
for (auto& curveDataItem : curveData)
{
resampler.setCurveData(curveDataItem.values, timeSteps);
if (curveDataItem.address.hasAccumulatedData()) resampler.resampleAndComputePeriodEndValues(period);
else resampler.resampleAndComputeWeightedMeanValues(period);
auto cd = curveDataItem;
cd.values = resampler.resampledValues();
resampledCurveData->push_back(cd);
}
*resampledTimeSteps = resampler.resampledTimeSteps();
}
else
{
*resampledTimeSteps = timeSteps;
*resampledCurveData = curveData;
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void appendToExportData(QString& out, const std::vector<time_t>& timeSteps, const std::vector<CurveData>& curveData)
{
for (size_t j = 0; j < timeSteps.size(); j++) //time steps & data points
{
if (j == 0)
{
out += "Date and time";
for (size_t k = 0; k < curveData.size(); k++) // curves
{
out += "\t" + (curveData[k].name);
}
}
out += "\n";
out += QDateTime::fromTime_t(timeSteps[j]).toUTC().toString("yyyy-MM-dd hh:mm:ss ");
for (size_t k = 0; k < curveData.size(); k++) // curves
{
QString valueText;
if (j < curveData[k].values.size())
{
valueText = QString::number(curveData[k].values[j], 'g', 6);
}
out += "\t" + valueText;
}
}
}

View File

@ -22,6 +22,7 @@
#include "cafPdmChildArrayField.h" #include "cafPdmChildArrayField.h"
#include "RiaDefines.h" #include "RiaDefines.h"
#include "RiaQDateTimeTools.h"
#include "RifEclipseSummaryAddress.h" #include "RifEclipseSummaryAddress.h"
@ -102,7 +103,7 @@ public:
virtual QWidget* viewWidget() override; virtual QWidget* viewWidget() override;
QString asciiDataForPlotExport() const; QString asciiDataForPlotExport(DateTimePeriod resamplingPeriod = DateTimePeriod::NONE) const;
std::vector<RimSummaryCurve*> summaryAndEnsembleCurves() const; std::vector<RimSummaryCurve*> summaryAndEnsembleCurves() const;
std::vector<RimSummaryCurve*> summaryCurves() const; std::vector<RimSummaryCurve*> summaryCurves() const;